Merge pull request #143 from shawnfeldman/master

menu not selecting item when browser refreshed
diff --git a/portal/bower.json b/portal/bower.json
index ca9692d..b6aac35 100644
--- a/portal/bower.json
+++ b/portal/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "usergrid-portal",
-  "version": "2.0.9",
+  "version": "2.0.10",
   "ignore": [
     ".jshintrc",
     "**/*.txt",
diff --git a/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js b/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js
index 92bc7c8..908a0b5 100644
--- a/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js
+++ b/portal/dist/usergrid-portal/js/libs/usergrid-libs.min.js
@@ -17,7 +17,7 @@
   under the License.
   */
 
- /*! usergrid@2.0.9  */
+ /*! usergrid@2.0.10  */
 !function(e,t){function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function it(){return!0}function ot(){return!1}function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){for(var n,r=0;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}function tn(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;i--;)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){for(var n,r,i,o=[],a=0,s=e.length;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}var o={},a=e===jn;return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);for(;"*"===l[0];)l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){for(var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a)for(;o>i&&(r=t.apply(e[i],n),r!==!1);i++);else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a)for(;o>i&&(r=t.call(e[i],i,e[i]),r!==!1);i++);else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call(" ")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else for(;n[o]!==t;)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()}),r=b(o);var _={};b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;!function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})}(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){for(var r;(r=b.inArray(t,u,r))>-1;)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var s,u,l,t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}};if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}}),b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};for("string"!=typeof e&&(n=e,e=t),e=e||"fx";s--;)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){for(o=0;i=t[o++];)0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return this.each(b.isFunction(e)?function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var o,a=0,s=b(this),u=t,l=e.match(w)||[];o=l[a++];)u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o);else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];return arguments.length?(i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))})):o?(r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)):void 0}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;return e&&3!==u&&8!==u&&2!==u?typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t)):void 0},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)for(;n=o[i++];)r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;return e&&3!==s&&8!==s&&2!==s?(a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]):void 0},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)
 }}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){for(r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;l--;)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){for(t=(t||"").match(w)||[""],l=t.length;l--;)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){for(p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;o--;)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}for(d=0;(l=h[d++])&&!n.isPropagationStopped();)n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=b.event.handlers.call(this,e,l),n=0;(o=s[n++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,a=0;(i=o.handlers[a++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];for(s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;t--;)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;u--;)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);for(s=e,u=[],l=i.preFilter;s;){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){for(;t=t[i];)if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){for(;t=t[i];)if((1===t.nodeType||o)&&e(t,n,s))return!0}else for(;t=t[i];)if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r)for(l=mt(y,d),r(l,[],s,u),c=l.length;c--;)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p));if(o){if(i||e){if(i){for(l=[],c=y.length;c--;)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}for(c=y.length;c--;)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){for(var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r&&!i.relative[e[r].type];r++);return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){for(g=0;m=e[g++];)if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){for(g=0;m=t[g++];)m(x,y,u,c);if(s){if(v>0)for(;b--;)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}function xt(e,t,n){for(var r=0,i=t.length;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}for(o=U.needsContext.test(e)?0:a.length;o--&&(u=a[o],!i.relative[l=u.type]);)if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}return s(e,p)(r,t,d,n,V.test(e)),n}function Tt(){}var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){for(var t,n=[];t=this[e++];)n.push(t);return n}}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);for(r=e;r=r.parentNode;)s.unshift(r);for(r=t;r=r.parentNode;)l.unshift(r);for(;s[i]===l[i];)i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));for(;i--;)e.splice(n[i],1)}return e},o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];p=++d&&p&&p[g]||(f=d=0)||h.pop();)if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else for(;(p=++d&&p&&p[g]||(f=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==y:1!==p.nodeType)||!++f||(v&&((p[x]||(p[x]={}))[e]=[N,f]),p!==t)););return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){for(var i,o=r(e,t),a=o.length;a--;)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){for(var r=0>n?n+t:n;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){for(t||(t=ft(e)),n=t.length;n--;)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o},i.pseudos.nth=i.pseudos.eq,i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n.ownerDocument&&n!==t&&11!==n.nodeType;){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack,b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)
 }}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(b.isFunction(e)?function(t){b(this).wrapInner(e.call(this,t))}:function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=0;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&b.cleanData(Ot(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}}),b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){for(var n,r=0,i=[],o=b(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}}),b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){for(var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){for(s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];i--;)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody)for(o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;i--;)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l);for(b.merge(d,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));for(s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;o=d[h++];)if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n))for(i=0;o=s[i++];)kt.test(o.type||"")&&n.push(o);return s=null,f},cleanData:function(e,t){for(var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u}),b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")},b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[],b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c)for(c={};t=Tn.exec(a);)c[t[1].toLowerCase()]=t[2];t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}}),b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}}),b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;return s?(n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o):void 0},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var p,f,i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={};u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||o.documentElement;e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position");)e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}}),b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})}(window),void 0===jQuery.migrateMute&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("<input/>",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;
diff --git a/portal/dist/usergrid-portal/js/usergrid-dev.min.js b/portal/dist/usergrid-portal/js/usergrid-dev.min.js
index eabd5b5..04fc149 100644
--- a/portal/dist/usergrid-portal/js/usergrid-dev.min.js
+++ b/portal/dist/usergrid-portal/js/usergrid-dev.min.js
@@ -17,7 +17,7 @@
   under the License.
   */
 
- /*! usergrid@2.0.9  */
+ /*! usergrid@2.0.10  */
 (function(exports, global) {
     global["true"] = exports;
     "use strict";
@@ -3622,7 +3622,7 @@
                     }
                 }
                 var bound = false;
-                scope.$watch("menuItems");
+                setTimeout(setupMenuState, 500);
                 scope.$on("$routeChangeSuccess", function() {
                     setTimeout(function() {
                         setupMenuState();
diff --git a/portal/dist/usergrid-portal/js/usergrid.min.js b/portal/dist/usergrid-portal/js/usergrid.min.js
index f73e2ec..30ea334 100644
--- a/portal/dist/usergrid-portal/js/usergrid.min.js
+++ b/portal/dist/usergrid-portal/js/usergrid.min.js
@@ -17,9 +17,9 @@
   under the License.
   */
 
- /*! usergrid@2.0.9  */
+ /*! usergrid@2.0.10  */
 !function(exports,global){function renderChart(chartsDefaults,chartdata){var newSettings={};$.extend(!0,newSettings,chartsDefaults,chartdata);new Highcharts.Chart(newSettings)}function menuBindClick(scope,lElement,cevent,menuContext){var currentSelection=angular.element(cevent.srcElement).parent(),previousSelection=scope[menuContext];previousSelection!==currentSelection&&(previousSelection&&angular.element(previousSelection).removeClass("active"),scope[menuContext]=currentSelection,scope.$apply(function(){currentSelection.addClass("active")}))}global["true"]=exports;var polyfills=function(window,Object){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}(),Object.defineProperty(Object.prototype,"clone",{enumerable:!1,writable:!0,value:function(){var i,newObj=this instanceof Array?[]:{};for(i in this)"clone"!==i&&(newObj[i]=this[i]&&"object"==typeof this[i]?this[i].clone():this[i]);return newObj}}),Object.defineProperty(Object.prototype,"stringifyJSON",{enumerable:!1,writable:!0,value:function(){return JSON.stringify(this,null,"	")}})};polyfills(window,Object);var global=global||this,AppServices=AppServices||{};global.AppServices=global.AppServices||AppServices,AppServices.Constants=angular.module("appservices.constants",[]),AppServices.Services=angular.module("appservices.services",[]),AppServices.Controllers=angular.module("appservices.controllers",[]),AppServices.Filters=angular.module("appservices.filters",[]),AppServices.Directives=angular.module("appservices.directives",[]),AppServices.Performance=angular.module("appservices.performance",[]),AppServices.MAX=angular.module("appservices.max",[]),angular.module("appservices",["ngRoute","ngResource","ngSanitize","ui.bootstrap","angulartics","angulartics.google.analytics","appservices.filters","appservices.services","appservices.directives","appservices.constants","appservices.controllers","appservices.max","angular-intro"]).config(["$routeProvider","$locationProvider","$sceDelegateProvider","$analyticsProvider","$httpProvider",function($routeProvider,$locationProvider,$sceDelegateProvider,$analyticsProvider,$httpProvider){$routeProvider.when("/org-overview",{templateUrl:"org-overview/org-overview.html",controller:"OrgOverviewCtrl"}).when("/login",{templateUrl:"login/login.html",controller:"LoginCtrl"}).when("/login/loading",{templateUrl:"login/loading.html",controller:"LoginCtrl"}).when("/app-overview/summary",{templateUrl:"app-overview/app-overview.html",controller:"AppOverviewCtrl"}).when("/getting-started/setup",{templateUrl:"app-overview/getting-started.html",controller:"GettingStartedCtrl"}).when("/forgot-password",{templateUrl:"login/forgot-password.html",controller:"ForgotPasswordCtrl"}).when("/register",{templateUrl:"login/register.html",controller:"RegisterCtrl"}).when("/users",{templateUrl:"users/users.html",controller:"UsersCtrl"}).when("/users/profile",{templateUrl:"users/users-profile.html",controller:"UsersProfileCtrl"}).when("/users/groups",{templateUrl:"users/users-groups.html",controller:"UsersGroupsCtrl"}).when("/users/activities",{templateUrl:"users/users-activities.html",controller:"UsersActivitiesCtrl"}).when("/users/feed",{templateUrl:"users/users-feed.html",controller:"UsersFeedCtrl"}).when("/users/graph",{templateUrl:"users/users-graph.html",controller:"UsersGraphCtrl"}).when("/users/roles",{templateUrl:"users/users-roles.html",controller:"UsersRolesCtrl"}).when("/groups",{templateUrl:"groups/groups.html",controller:"GroupsCtrl"}).when("/groups/details",{templateUrl:"groups/groups-details.html",controller:"GroupsDetailsCtrl"}).when("/groups/members",{templateUrl:"groups/groups-members.html",controller:"GroupsMembersCtrl"}).when("/groups/activities",{templateUrl:"groups/groups-activities.html",controller:"GroupsActivitiesCtrl"}).when("/groups/roles",{templateUrl:"groups/groups-roles.html",controller:"GroupsRolesCtrl"}).when("/roles",{templateUrl:"roles/roles.html",controller:"RolesCtrl"}).when("/roles/settings",{templateUrl:"roles/roles-settings.html",controller:"RolesSettingsCtrl"}).when("/roles/users",{templateUrl:"roles/roles-users.html",controller:"RolesUsersCtrl"}).when("/roles/groups",{templateUrl:"roles/roles-groups.html",controller:"RolesGroupsCtrl"}).when("/data",{templateUrl:"data/data.html",controller:"DataCtrl"}).when("/data/entity",{templateUrl:"data/entity.html",controller:"EntityCtrl"}).when("/data/shell",{templateUrl:"data/shell.html",controller:"ShellCtrl"}).when("/profile/organizations",{templateUrl:"profile/organizations.html",controller:"OrgCtrl"}).when("/profile/profile",{templateUrl:"profile/profile.html",controller:"ProfileCtrl"}).when("/profile",{templateUrl:"profile/account.html",controller:"AccountCtrl"}).when("/activities",{templateUrl:"activities/activities.html",controller:"ActivitiesCtrl"}).when("/shell",{templateUrl:"shell/shell.html",controller:"ShellCtrl"}).when("/logout",{templateUrl:"login/logout.html",controller:"LogoutCtrl"}).otherwise({redirectTo:"/org-overview"}),$locationProvider.html5Mode(!1).hashPrefix("!"),$sceDelegateProvider.resourceUrlWhitelist(["self","http://apigee-internal-prod.jupiter.apigee.net/**","http://apigee-internal-prod.mars.apigee.net/**","https://appservices.apigee.com/**","https://api.usergrid.com/**"]),$analyticsProvider.virtualPageviews(!1),$analyticsProvider.firstPageview(!1),$httpProvider.defaults.useXDomain=!0}]),AppServices.Controllers.controller("ActivitiesCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope){$scope.$on("app-activities-received",function(evt,data){$scope.activities=data,$scope.$apply()}),$scope.$on("app-activities-error",function(){$rootScope.$broadcast("alert","error","Application failed to retreive activities data.")}),ug.getActivities()}]),AppServices.Controllers.controller("AppOverviewCtrl",["ug","charts","$scope","$rootScope","$log",function(ug,charts,$scope,$rootScope,$log){var createGradient=function(color1,color2){var perShapeGradient={x1:0,y1:0,x2:0,y2:1};return{linearGradient:perShapeGradient,stops:[[0,color1],[1,color2]]}};$scope.appOverview={},$scope.collections=[],$scope.graph="",$scope.$on("top-collections-received",function(event,collections){var dataDescription={bar1:{labels:["Total"],dataAttr:["title","count"],colors:[createGradient("rgba(36,151,212,0.6)","rgba(119,198,240,0.6)")],borderColor:"#1b97d1"}};$scope.collections=collections;var arr=[];for(var i in collections)collections.hasOwnProperty(i)&&arr.push(collections[i]);$scope.appOverview={},$rootScope.chartTemplate?($scope.appOverview.chart=angular.copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()):ug.httpGet(null,"js/charts/highcharts.json").then(function(success){$rootScope.chartTemplate=success,$scope.appOverview.chart=angular.copy($rootScope.chartTemplate.pareto),$scope.appOverview.chart=charts.convertParetoChart(arr,$scope.appOverview.chart,dataDescription.bar1,"1h","NOW"),$scope.applyScope()},function(fail){$log.error("Problem getting chart template",fail)})}),$scope.$on("app-initialized",function(){ug.getTopCollections()}),$rootScope.activeUI&&ug.getTopCollections()}]),AppServices.Controllers.controller("GettingStartedCtrl",["ug","$scope","$rootScope","$location","$timeout","$anchorScroll",function(ug,$scope,$rootScope,$location,$timeout,$anchorScroll){$scope.collections=[],$scope.graph="",$scope.clientID="",$scope.clientSecret="";$scope.regenerateCredentialsDialog=function(modalId){$scope.orgAPICredentials={client_id:"regenerating...",client_secret:"regenerating..."},ug.regenerateAppCredentials(),$scope.hideModal(modalId)},$scope.$on("app-creds-updated",function(event,credentials){credentials?($scope.clientID=credentials.client_id,$scope.clientSecret=credentials.client_secret,$scope.$$phase||$scope.$apply()):setTimeout(function(){ug.getAppCredentials()},5e3)}),ug.getAppCredentials(),$scope.contentTitle,$scope.showSDKDetail=function(name){var introContainer=document.getElementById("intro-container");if("nocontent"===name)return introContainer.style.height="0",!0;introContainer.style.opacity=.1,introContainer.style.height="0";var timeout=0;$scope.contentTitle&&(timeout=500),$timeout(function(){introContainer.style.height="1000px",introContainer.style.opacity=1},timeout),$scope.optionName=name,$scope.contentTitle=name,$scope.sdkLink="http://apigee.com/docs/content/"+name+"-sdk-redirect",$scope.docsLink="http://apigee.com/docs/app-services/content/installing-apigee-sdk-"+name,$scope.getIncludeURL=function(){return"app-overview/doc-includes/"+$scope.optionName+".html"}},$scope.scrollToElement=function(elem){return $location.hash(elem),$anchorScroll(),!1}}]),AppServices.Controllers.controller("ChartCtrl",["$scope","$location",function(){}]),AppServices.Directives.directive("chart",function(){return{restrict:"E",scope:{chartdata:"=chartdata"},template:"<div></div>",replace:!0,controller:function(){},link:function(scope,element,attrs){scope.$watch("chartdata",function(chartdata){if(chartdata){var chartsDefaults={chart:{renderTo:element[0],type:attrs.type||null,height:attrs.height||null,width:attrs.width||null,reflow:!0,animation:!1,zoomType:"x"}};if("pie"===attrs.type&&(chartsDefaults.chart.margin=[0,0,0,0],chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.spacingTop=0,chartsDefaults.chart.spacingBottom=0,attrs.titleimage&&(chartdata.title.text='<img src="'+attrs.titleimage+'">'),attrs.titleicon&&(chartdata.title.text='<i class="pictogram '+attrs.titleiconclass+'">'+attrs.titleicon+"</i>"),attrs.titlecolor&&(chartdata.title.style.color=attrs.titlecolor),attrs.titleimagetop&&(chartdata.title.style.marginTop=attrs.titleimagetop),attrs.titleimageleft&&(chartdata.title.style.marginLeft=attrs.titleimageleft)),"line"===attrs.type&&(chartsDefaults.chart.marginTop=30,chartsDefaults.chart.spacingTop=50),"column"===attrs.type&&(chartsDefaults.chart.marginBottom=80),"area"===attrs.type&&(chartsDefaults.chart.spacingLeft=0,chartsDefaults.chart.spacingRight=0,chartsDefaults.chart.marginLeft=0,chartsDefaults.chart.marginRight=0),Highcharts.setOptions({global:{useUTC:!1},chart:{style:{fontFamily:"marquette-light, Helvetica, Arial, sans-serif"}}}),"line"===attrs.type){var xAxis1=chartdata.xAxis[0];xAxis1.labels.formatter||(xAxis1.labels.formatter=new Function(attrs.xaxislabel)),xAxis1.labels.step||(xAxis1.labels.step=attrs.xaxisstep)}chartdata.tooltip&&"string"==typeof chartdata.tooltip.formatter&&(chartdata.tooltip.formatter=new Function(chartdata.tooltip.formatter)),renderChart(chartsDefaults,chartdata)}},!0)}}}),AppServices.Services.factory("charts",function(){function sortJsonArrayByProperty(objArray,prop){if(arguments.length<2)throw new Error("sortJsonArrayByProp requires 2 arguments");var direct=arguments.length>2?arguments[2]:1;if(objArray&&objArray.constructor===Array){var propPath=prop.constructor===Array?prop:prop.split(".");objArray.sort(function(a,b){for(var p in propPath)a[propPath[p]]&&b[propPath[p]]&&(a=a[propPath[p]],b=b[propPath[p]]);return a=a.match(/^\d+$/)?+a:a,b=b.match(/^\d+$/)?+b:b,b>a?-1*direct:a>b?1*direct:0})}}var lineChart,areaChart,paretoChart,pieChart,xaxis,seriesIndex;return{convertLineChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)lineChart.series[localCounter].data.push("undefined"==typeof dp?[i,0]:[i,dp[dataAttrs[j]]]),detailedView||localCounter++}lineChart=chartTemplate,"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(lineChart=chartTemplate,seriesIndex=0,lineChart.series=[],label=""),xaxis=lineChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,lineChart.series[l]={},lineChart.series[l].data=[],lineChart.series[l].name=chartData[l].chartGroupName,lineChart.series[l].yAxis=0,lineChart.series[l].type="line",lineChart.series[l].color=dataDescription.colors[i],lineChart.series[l].dashStyle="solid",lineChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;lineChart.series[i]={},lineChart.series[i].data=[],lineChart.series[i].name=label+dataDescription.labels[steadyCounter],lineChart.series[i].yAxis=yAxisIndex,lineChart.series[i].type="line",lineChart.series[i].color=dataDescription.colors[i],lineChart.series[i].dashStyle="solid",lineChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return lineChart},convertAreaChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function plotData(counter,dPLength,dataPoints,dataAttrs,detailedView){for(var i=0;dPLength>i;i++)for(var dp=dataPoints[i],localCounter=counter,j=0;j<dataAttrs.length;j++)areaChart.series[localCounter].data.push("undefined"==typeof dp?0:dp[dataAttrs[j]]),detailedView||localCounter++}areaChart=angular.copy(areaChart),"undefined"==typeof chartData[0]&&(chartData[0]={},chartData[0].datapoints=[]);var label,dataPoints=chartData[0].datapoints,dPLength=dataPoints.length;"YESTERDAY"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Yesterday "):"LAST_WEEK"===currentCompare?(seriesIndex=dataDescription.dataAttr.length,label="Last Week "):(areaChart=chartTemplate,seriesIndex=0,areaChart.series=[],label=""),xaxis=areaChart.xAxis[0],xaxis.categories=[],settings.xaxisformat&&(xaxis.labels.formatter=new Function(settings.xaxisformat)),settings.step&&(xaxis.labels.step=settings.step);for(var i=0;dPLength>i;i++){var dp=dataPoints[i];xaxis.categories.push(dp.timestamp)}if(chartData.length>1)for(var l=0;l<chartData.length;l++)chartData[l].chartGroupName&&(dataPoints=chartData[l].datapoints,areaChart.series[l]={},areaChart.series[l].data=[],areaChart.series[l].fillColor=dataDescription.areaColors[l],areaChart.series[l].name=chartData[l].chartGroupName,areaChart.series[l].yAxis=0,areaChart.series[l].type="area",areaChart.series[l].pointInterval=1,areaChart.series[l].color=dataDescription.colors[l],areaChart.series[l].dashStyle="solid",areaChart.series[l].yAxis.title.text=dataDescription.yAxisLabels,plotData(l,dPLength,dataPoints,dataDescription.detailDataAttr,!0));else{for(var steadyCounter=0,i=seriesIndex;i<dataDescription.dataAttr.length+(seriesIndex>0?seriesIndex:0);i++){var yAxisIndex=dataDescription.multiAxis?steadyCounter:0;areaChart.series[i]={},areaChart.series[i].data=[],areaChart.series[i].fillColor=dataDescription.areaColors[i],areaChart.series[i].name=label+dataDescription.labels[steadyCounter],areaChart.series[i].yAxis=yAxisIndex,areaChart.series[i].type="area",areaChart.series[i].pointInterval=1,areaChart.series[i].color=dataDescription.colors[i],areaChart.series[i].dashStyle="solid",areaChart.yAxis[yAxisIndex].title.text=dataDescription.yAxisLabels[dataDescription.yAxisLabels>1?steadyCounter:0],steadyCounter++}plotData(seriesIndex,dPLength,dataPoints,dataDescription.dataAttr,!1)}return areaChart},convertParetoChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){function getPreviousData(){for(var i=0;i<chartTemplate.series[0].data.length;i++)allParetoOptions.push(chartTemplate.xAxis.categories[i])}function createStackedBar(dataDescription,paretoChart){paretoChart.plotOptions={series:{shadow:!1,borderColor:dataDescription.borderColor,borderWidth:1},column:{stacking:"normal",dataLabels:{enabled:!0,color:Highcharts.theme&&Highcharts.theme.dataLabelsColor||"white"}}};var start=dataDescription.dataAttr[1].length,steadyCounter=0;compare&&(paretoChart.legend.enabled=!0);for(var f=seriesIndex;start+seriesIndex>f;f++)paretoChart.series[f]||(paretoChart.series[f]={data:[]}),paretoChart.series[f].data.push(bar[dataDescription.dataAttr[1][steadyCounter]]),paretoChart.series[f].name=""!==label?label+" "+dataDescription.labels[steadyCounter]:dataDescription.labels[steadyCounter],paretoChart.series[f].color=dataDescription.colors[f],paretoChart.series[f].stack=label,steadyCounter++}paretoChart=chartTemplate,"undefined"==typeof chartData&&(chartData=[]);var label,cdLength=chartData.length,compare=!1,allParetoOptions=[],stackedBar=!1;if(seriesIndex=0,"object"==typeof dataDescription.dataAttr[1]&&(stackedBar=!0),"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),getPreviousData()):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!0,stackedBar&&(seriesIndex=dataDescription.dataAttr[1].length),seriesIndex=getPreviousData()):(compare=!1,label="",paretoChart.xAxis.categories=[],paretoChart.series=[],paretoChart.series[0]={},paretoChart.series[0].data=[],paretoChart.legend.enabled=!1),paretoChart.plotOptions.series.borderColor=dataDescription.borderColor,compare&&!stackedBar){paretoChart.series[1]={},paretoChart.series[1].data=[];for(var i=0;i<allParetoOptions.length;i++)paretoChart.series[1].data.push(0);paretoChart.legend.enabled=!0}for(var i=0;cdLength>i;i++){var bar=chartData[i];if(compare){var newLabel=bar[dataDescription.dataAttr[0]],newValue=bar[dataDescription.dataAttr[1]],previousIndex=allParetoOptions.indexOf(newLabel);previousIndex>-1&&("object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[1].data[previousIndex]=newValue,paretoChart.series[1].name=""!==label?label+" "+dataDescription.labels[0]:dataDescription.labels[0],paretoChart.series[1].color=dataDescription.colors[1]))}else paretoChart.xAxis.categories.push(bar[dataDescription.dataAttr[0]]),"object"==typeof dataDescription.dataAttr[1]?createStackedBar(dataDescription,paretoChart,paretoChart.series.length):(paretoChart.series[0].data.push(bar[dataDescription.dataAttr[1]]),paretoChart.series[0].name=dataDescription.labels[0],paretoChart.series[0].color=dataDescription.colors[0])}return paretoChart},convertPieChart:function(chartData,chartTemplate,dataDescription,settings,currentCompare){var label,cdLength=chartData.length,compare=!1;pieChart=chartTemplate,"YESTERDAY"===currentCompare?(label="Yesterday ",compare=!1):"LAST_WEEK"===currentCompare?(label="Last Week ",compare=!1):(compare=!1,pieChart.series[0].data=[],pieChart.series[0].dataLabels&&"string"==typeof pieChart.series[0].dataLabels.formatter&&(pieChart.series[0].dataLabels.formatter=new Function(pieChart.series[0].dataLabels.formatter))),pieChart.plotOptions.pie.borderColor=dataDescription.borderColor,compare&&(pieChart.series[1].data=[],pieChart.series[1].dataLabels&&"string"==typeof pieChart.series[1].dataLabels.formatter&&(pieChart.series[1].dataLabels.formatter=new Function(pieChart.series[1].dataLabels.formatter)));for(var tempArray=[],i=0;cdLength>i;i++){var pie=chartData[i];tempArray.push({name:pie[dataDescription.dataAttr[0]],y:pie[dataDescription.dataAttr[1]],color:""})}sortJsonArrayByProperty(tempArray,"name");for(var i=0;i<tempArray.length;i++)tempArray[i].color=dataDescription.colors[i];return compare?pieChart.series[1].data=tempArray:pieChart.series[0].data=tempArray,pieChart}}}),$(".sessions-bar").sparkline([3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,4,3,5,6,3,4,5,6,7,8,1],{type:"bar",barColor:"#c5c5c5",width:"800px",height:100,barWidth:12,barSpacing:"1px"}),AppServices.Controllers.controller("DataCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope){var init=function(){$scope.verb="GET",$scope.display="",$scope.queryBodyDetail={},$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.entitySelected={},$scope.newCollection={},$rootScope.queryCollection={},$scope.data={},$scope.data.queryPath="",$scope.data.queryBody='{ "name":"value" }',$scope.data.searchString="",$scope.data.queryLimit=""},runQuery=function(verb){$scope.loading=!0;var queryPath=$scope.removeFirstSlash($scope.data.queryPath||""),searchString=$scope.data.searchString||"",queryLimit=$scope.data.queryLimit||"",body=JSON.parse($scope.data.queryBody||"{}");"POST"==verb&&$scope.validateJson(!0)?ug.runDataPOSTQuery(queryPath,body):"PUT"==verb&&$scope.validateJson(!0)?ug.runDataPutQuery(queryPath,searchString,queryLimit,body):"DELETE"==verb?ug.runDataDeleteQuery(queryPath,searchString,queryLimit):ug.runDataQuery(queryPath,searchString,queryLimit)};$scope.$on("top-collections-received",function(event,collectionList){$scope.loading=!1;var ignoredCollections=["events"];ignoredCollections.forEach(function(ignoredCollection){collectionList.hasOwnProperty(ignoredCollection)&&delete collectionList[ignoredCollection]}),$scope.collectionList=collectionList,$scope.queryBoxesSelected=!1,$scope.queryPath||$scope.loadCollection("/"+collectionList[Object.keys(collectionList).sort()[0]].name),$scope.applyScope()}),$scope.$on("error-running-query",function(){$scope.loading=!1,runQuery("GET"),$scope.applyScope()}),$scope.$on("entity-deleted",function(){$scope.deleteLoading=!1,$rootScope.$broadcast("alert","success","Entities deleted sucessfully"),$scope.queryBoxesSelected=!1,$scope.checkNextPrev(),$scope.applyScope()}),$scope.$on("entity-deleted-error",function(){$scope.deleteLoading=!1,runQuery("GET"),$scope.applyScope()}),$scope.$on("collection-created",function(){$scope.newCollection.name=""}),$scope.$on("query-received",function(event,collection){$scope.loading=!1,$rootScope.queryCollection=collection,ug.getIndexes($scope.data.queryPath),$scope.setDisplayType(),$scope.checkNextPrev(),$scope.applyScope(),$scope.queryBoxesSelected=!1}),$scope.$on("indexes-received",function(event,indexes){}),$scope.$on("app-changed",function(){init()}),$scope.setDisplayType=function(){$scope.display="generic"},$scope.deleteEntitiesDialog=function(modalId){$scope.deleteLoading=!1,$scope.deleteEntities($rootScope.queryCollection,"entity-deleted","error deleting entity"),$scope.hideModal(modalId)},$scope.newCollectionDialog=function(modalId){$scope.newCollection.name?(ug.createCollection($scope.newCollection.name),ug.getTopCollections(),$rootScope.$broadcast("alert","success","Collection created successfully."),$scope.hideModal(modalId)):$rootScope.$broadcast("alert","error","You must specify a collection name.")},$scope.addToPath=function(uuid){$scope.data.queryPath="/"+$rootScope.queryCollection._type+"/"+uuid},$scope.removeFromPath=function(){$scope.data.queryPath="/"+$rootScope.queryCollection._type},$scope.isDeep=function(item){return"[object Object]"===Object.prototype.toString.call(item)},$scope.loadCollection=function(type){$scope.data.queryPath="/"+type.substring(1,type.length),$scope.data.searchString="",$scope.data.queryLimit="",$scope.data.body='{ "name":"value" }',$scope.selectGET(),$scope.applyScope(),$scope.run()},$scope.selectGET=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="GET"},$scope.selectPOST=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="none",$scope.queryStringDisplay="none",$scope.verb="POST"},$scope.selectPUT=function(){$scope.queryBodyDisplay="block",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="PUT"},$scope.selectDELETE=function(){$scope.queryBodyDisplay="none",$scope.queryLimitDisplay="block",$scope.queryStringDisplay="block",$scope.verb="DELETE"},$scope.validateJson=function(skipMessage){var queryBody=$scope.data.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),!skipMessage&&$rootScope.$broadcast("alert","success","JSON is valid"),$scope.data.queryBody=queryBody,!0},$scope.saveEntity=function(entity){if(!$scope.validateJson())return!1;var queryBody=entity._json;queryBody=JSON.parse(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",entity._data.type),$rootScope.selectedEntity.set("uuid",entity._data.uuid),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})},$scope.run=function(){$rootScope.queryCollection="";var verb=$scope.verb;runQuery(verb)},$scope.hasProperty=function(prop){var retval=!1;return"undefined"!=typeof $rootScope.queryCollection._list&&angular.forEach($rootScope.queryCollection._list,function(value){retval||value._data[prop]&&(retval=!0)}),retval},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$rootScope.queryCollection.hasPreviousPage()&&($scope.previous_display="default"),$rootScope.queryCollection.hasNextPage()&&($scope.next_display="default")},$scope.selectEntity=function(uuid,addToPath){$rootScope.selectedEntity=$rootScope.queryCollection.getEntityByUUID(uuid),addToPath?$scope.addToPath(uuid):$scope.removeFromPath()},$scope.getJSONView=function(entity){var tempjson=entity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2)},$scope.getPrevious=function(){$rootScope.queryCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of data"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$rootScope.queryCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of data"),$scope.checkNextPrev(),$scope.applyScope()})},init(),$rootScope.queryCollection=$rootScope.queryCollection||{},$rootScope.selectedEntity={},$rootScope.queryCollection&&$rootScope.queryCollection._type&&($scope.loadCollection($rootScope.queryCollection._type),$scope.setDisplayType()),ug.getTopCollections(),$scope.resetNextPrev()}]),AppServices.Controllers.controller("EntityCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){if(!$rootScope.selectedEntity)return void $location.path("/data");$scope.entityUUID=$rootScope.selectedEntity.get("uuid"),$scope.entityType=$rootScope.selectedEntity.get("type");var tempjson=$rootScope.selectedEntity.get(),queryBody=JSON.stringify(tempjson,null,2);queryBody=JSON.parse(queryBody),delete queryBody.metadata,delete queryBody.uuid,delete queryBody.created,delete queryBody.modified,delete queryBody.type,$scope.queryBody=JSON.stringify(queryBody,null,2),$scope.validateJson=function(){var queryBody=$scope.queryBody;try{queryBody=JSON.parse(queryBody)}catch(e){return $rootScope.$broadcast("alert","error","JSON is not valid"),!1}return queryBody=JSON.stringify(queryBody,null,2),$rootScope.$broadcast("alert","success","JSON is valid"),$scope.queryBody=queryBody,!0},$scope.saveEntity=function(){if(!$scope.validateJson())return!1;var queryBody=$scope.queryBody;queryBody=JSON.parse(queryBody),$rootScope.selectedEntity.set(),$rootScope.selectedEntity.set(queryBody),$rootScope.selectedEntity.set("type",$scope.entityType),$rootScope.selectedEntity.set("uuid",$scope.entityUUID),$rootScope.selectedEntity.save(function(err,data){err?$rootScope.$broadcast("alert","error","error: "+data.error_description):$rootScope.$broadcast("alert","success","entity saved")})}}]),AppServices.Directives.directive("balloon",["$window","$timeout",function($window,$timeout){return{restrict:"ECA",scope:"=",template:'<div class="baloon {{direction}}" ng-transclude></div>',replace:!0,transclude:!0,link:function(scope,lElement,attrs){scope.direction=attrs.direction;var runScroll=!0,windowEl=angular.element($window);windowEl.on("scroll",function(){runScroll&&(lElement.addClass("fade-out"),$timeout(function(){lElement.addClass("hide")},1e3),runScroll=!1)})}}}]),AppServices.Directives.directive("bsmodal",["$rootScope",function($rootScope){return{restrict:"ECA",scope:{title:"@title",buttonid:"=buttonid",footertext:"=footertext",closelabel:"=closelabel"},transclude:!0,templateUrl:"dialogs/modal.html",replace:!0,link:function(scope,lElement,attrs,parentCtrl){scope.title=attrs.title,scope.footertext=attrs.footertext,scope.closelabel=attrs.closelabel,scope.close=attrs.close,scope.extrabutton=attrs.extrabutton,scope.extrabuttonlabel=attrs.extrabuttonlabel,scope.buttonId=attrs.buttonid,scope.closeDelegate=function(attr){scope.$parent[attr](attrs.id,scope)},scope.extraDelegate=function(attr){scope.dialogForm.$valid?(console.log(parentCtrl),scope.$parent[attr](attrs.id)):$rootScope.$broadcast("alert","error","Please check your form input and resubmit.")}}}}]),AppServices.Controllers.controller("AlertCtrl",["$scope","$rootScope","$timeout",function($scope,$rootScope,$timeout){$scope.alertDisplay="none",$scope.alerts=[],$scope.$on("alert",function(event,type,message,permanent){$scope.addAlert(type,message,permanent)}),$scope.$on("clear-alerts",function(){$scope.alerts=[]}),$scope.addAlert=function(type,message,permanent){$scope.alertDisplay="block",$scope.alerts.push({type:type,msg:message}),$scope.applyScope(),permanent||$timeout(function(){$scope.alerts.shift()},5e3)},$scope.closeAlert=function(index){$scope.alerts.splice(index,1)}}]),AppServices.Directives.directive("alerti",["$rootScope","$timeout",function($rootScope,$timeout){return{restrict:"ECA",scope:{type:"=type",closeable:"@closeable",index:"&index"},template:'<div class="alert" ng-class="type && \'alert-\' + type">    <button ng-show="closeable" type="button" class="close" ng-click="closeAlert(index)">&times;</button>    <i ng-if="type === \'warning\'" class="pictogram pull-left" style="font-size:3em;line-height:0.4">&#128165;</i>    <i ng-if="type === \'info\'" class="pictogram pull-left">&#8505;</i>    <i ng-if="type === \'error\'" class="pictogram pull-left">&#9889;</i>    <i ng-if="type === \'success\'" class="pictogram pull-left">&#128077;</i><div ng-transclude></div></div>',replace:!0,transclude:!0,link:function(scope,lElement,attrs){$timeout(function(){lElement.addClass("fade-out")},4e3),lElement.click(function(){attrs.index&&scope.$parent.closeAlert(attrs.index)}),setTimeout(function(){lElement.addClass("alert-animate")},10)}}}]),AppServices.Directives.directive("appswitcher",["$rootScope",function(){return{restrict:"ECA",scope:"=",templateUrl:"global/appswitcher-template.html",replace:!0,transclude:!0,link:function(){function globalNavDetail(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#globalNavDetailApiPlatform").addClass(classNameOpen)}var classNameOpen="open";$("ul.nav li.dropdownContainingSubmenu").hover(function(){$(this).addClass(classNameOpen)},function(){$(this).removeClass(classNameOpen)}),$("#globalNav > a").mouseover(globalNavDetail),$("#globalNavDetail").mouseover(globalNavDetail),$("#globalNavSubmenuContainer ul li").mouseover(function(){$("#globalNavDetail > div").removeClass(classNameOpen),$("#"+this.getAttribute("data-globalNavDetail")).addClass(classNameOpen)
 })}}}]),AppServices.Services.factory("help",function($rootScope,$http,$location,$analytics){$rootScope.help={},$rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1,$rootScope.help.clicked=!1,$rootScope.help.showHelpButtons=!1,$rootScope.help.introjs_shouldLaunch=!1,$rootScope.help.showTabsId="invisible",$rootScope.help.showJsonId="invisible";var helpStartTime,introjs_step,getHelpJson=function(path){return $http.get("https://s3.amazonaws.com/sdk.apigee.com/portal_help"+path+"/helpJson.json")},getHelpStatus=function(helpType){var status;return"tour"==helpType?(status=localStorage.getItem("ftu_tour"),localStorage.setItem("ftu_tour","false")):"tooltips"==helpType&&(status=localStorage.getItem("ftu_tooltips"),localStorage.setItem("ftu_tooltips","false")),status};$rootScope.help.sendTooltipGA=function(tooltipName){$analytics.eventTrack("tooltip - "+$rootScope.currentPath,{category:"App Services",label:tooltipName})},$rootScope.help.toggleTooltips=function(){0==$rootScope.help.helpTooltipsEnabled?($rootScope.help.helpButtonStatus="Disable Help",$rootScope.help.helpTooltipsEnabled=!0,$rootScope.$broadcast("tooltips-enabled"),showHelpModal("tooltips")):($rootScope.help.helpButtonStatus="Enable Help",$rootScope.help.helpTooltipsEnabled=!1,$rootScope.$broadcast("tooltips-disabled"))},$rootScope.$on("users-received",function(event,users){users._list.length>0?($rootScope.help.showTabsId="intro-information-tabs",$rootScope.help.showJsonId="intro-json-object"):($rootScope.help.showTabsId="invisible",$rootScope.help.showJsonId="invisible")}),$rootScope.$on("groups-received",function(event,groups){groups._list.length>0?($rootScope.help.showTabsId="intro-information-tabs",$rootScope.help.showJsonId="intro-json-object"):($rootScope.help.showTabsId="invisible",$rootScope.help.showJsonId="invisible")}),$rootScope.$on("$routeChangeSuccess",function(event,current){var path=current.$$route?current.$$route.originalPath:null;"/org-overview"===path||path&&path.indexOf("/performance")>=0||"/users"===path||"/groups"===path||"/roles"===path||"/data"===path?($rootScope.help.showHelpButtons=!0,getHelpJson(path).success(function(json){var helpJson=json;setHelpStrings(helpJson),showHelpModal("tour")})):$rootScope.help.showHelpButtons=!1});var showHelpModal=function(helpType){var shouldHelp=location.search.indexOf("noHelp")<=0;"tour"!=helpType||getHelpStatus(helpType)?"tooltips"!=helpType||getHelpStatus(helpType)||shouldHelp&&$rootScope.showModal("tooltips"):shouldHelp&&$rootScope.showModal("introjs")},setHelpStrings=function(helpJson){$rootScope.help.IntroOptions.steps=helpJson.introjs,angular.forEach(helpJson.tooltip,function(value,binding){$rootScope[binding]=value}),$rootScope.help.tooltip=helpJson.tooltip,$rootScope.$broadcast("helpJsonLoaded")};$rootScope.help.IntroOptions={steps:[],showStepNumbers:!1,exitOnOverlayClick:!0,exitOnEsc:!0,nextLabel:"Next",prevLabel:"Back",skipLabel:"Exit",doneLabel:"Done"},$rootScope.help.introjs_StartEvent=function(){helpStartTime=Date.now(),introjs_step=1},$rootScope.help.introjs_ExitEvent=function(){var introjs_time=Math.round((Date.now()-helpStartTime)/1e3);$analytics.eventTrack("introjs timing - "+$rootScope.currentPath,{category:"App Services",label:introjs_time+"s"}),$analytics.eventTrack("introjs exit - "+$rootScope.currentPath,{category:"App Services",label:"step"+introjs_step})},$rootScope.help.introjs_CompleteEvent=function(){switch($rootScope.currentPath){case"/performance/app-usage":introjs_PageTransitionEvent("/performance/errors-crashes");break;case"/performance/errors-crashes":introjs_PageTransitionEvent("/performance/api-perf");break;case"/users":introjs_PageTransitionEvent("/groups");break;case"/groups":introjs_PageTransitionEvent("/roles")}};var introjs_PageTransitionEvent=function(url){$location.url(url),$rootScope.help.introjs_shouldLaunch=!0,$rootScope.$apply()};$rootScope.help.introjs_ChangeEvent=function(){introjs_step++}}),AppServices.Directives.directive("insecureBanner",["$rootScope","ug",function($rootScope,ug){return{restrict:"E",transclude:!0,templateUrl:"global/insecure-banner.html",link:function(scope){scope.securityWarning=!1,scope.$on("roles-received",function(evt,roles){scope.securityWarning=!1,roles&&roles._list&&roles._list.forEach(function(roleHolder){var role=roleHolder._data;"GUEST"===role.name.toUpperCase()&&roleHolder.getPermissions(function(err){err||roleHolder.permissions&&roleHolder.permissions.forEach(function(permission){permission.path.indexOf("/**")>=0&&(scope.securityWarning=!0,scope.applyScope())})})})});var initialized=!1;scope.$on("app-initialized",function(){!initialized&&ug.getRoles(),initialized=!0}),scope.$on("app-changed",function(){scope.securityWarning=!1,ug.getRoles()})}}}]),AppServices.Constants.constant("configuration",{ITEMS_URL:"global/temp.json"}),AppServices.Controllers.controller("PageCtrl",["ug","help","utility","$scope","$rootScope","$location","$routeParams","$q","$route","$log","$analytics","$sce",function(ug,help,utility,$scope,$rootScope,$location,$routeParams,$q,$route,$log,$analytics,$sce){var initScopeVariables=function(){for(var menuItems=Usergrid.options.menuItems,i=0;i<menuItems.length;i++)if(menuItems[i].pic=$sce.trustAsHtml(menuItems[i].pic),menuItems[i].items)for(var j=0;j<menuItems[i].items.length;j++)menuItems[i].items[j].pic=$sce.trustAsHtml(menuItems[i].items[j].pic);$scope.menuItems=Usergrid.options.menuItems,$scope.loadingText="Loading...",$scope.use_sso=!1,$scope.newApp={name:""},$scope.getPerm="",$scope.postPerm="",$scope.putPerm="",$scope.deletePerm="",$scope.usersTypeaheadValues=[],$scope.groupsTypeaheadValues=[],$scope.rolesTypeaheadValues=[],$rootScope.sdkActive=!1,$rootScope.demoData=!1,$scope.queryStringApplied=!1,$rootScope.autoUpdateTimer=Usergrid.config?Usergrid.config.autoUpdateTimer:61,$rootScope.requiresDeveloperKey=Usergrid.config?Usergrid.config.client.requiresDeveloperKey:!1,$rootScope.loaded=$rootScope.activeUI=!1;for(var key in Usergrid.regex)$scope[key]=Usergrid.regex[key];$scope.options=Usergrid.options;var getQuery=function(){for(var m,result={},queryString=location.search.slice(1),re=/([^&=]+)=([^&]*)/g;m=re.exec(queryString);)result[decodeURIComponent(m[1])]=decodeURIComponent(m[2]);return result};$scope.queryString=getQuery()};initScopeVariables(),$rootScope.urls=function(){var urls=ug.getUrls($scope.queryString);return $scope.apiUrl=urls.apiUrl,$scope.use_sso=urls.use_sso,urls},$rootScope.gotoPage=function(path){$location.path(path)};var notRegistration=function(){return"/forgot-password"!==$location.path()&&"/register"!==$location.path()},verifyUser=function(){"/login"!==$location.path().slice(0,"/login".length)&&($rootScope.currentPath=$location.path()),$routeParams.access_token&&$routeParams.admin_email&&$routeParams.uuid&&(ug.set("token",$routeParams.access_token),ug.set("email",$routeParams.admin_email),ug.set("uuid",$routeParams.uuid),$location.search("access_token",null),$location.search("admin_email",null),$location.search("uuid",null)),ug.checkAuthentication(!0)};$scope.profile=function(){$scope.use_sso?window.location=$rootScope.urls().PROFILE_URL+"?callback="+encodeURIComponent($location.absUrl()):$location.path("/profile")},$rootScope.showModal=function(id){$("#"+id).modal("show")},$rootScope.hideModal=function(id){$("#"+id).modal("hide")},$scope.deleteEntities=function(collection,successBroadcast,errorMessage){collection.resetEntityPointer();for(var entitiesToDelete=[];collection.hasNextEntity();){var entity=collection.getNextEntity(),checked=entity.checked;checked&&entitiesToDelete.push(entity)}for(var count=0,success=!1,i=0;i<entitiesToDelete.length;i++){var entity=entitiesToDelete[i];collection.destroyEntity(entity,function(err){count++,err?($rootScope.$broadcast("alert","error",errorMessage),$rootScope.$broadcast(successBroadcast+"-error",err)):success=!0,count===entitiesToDelete.length&&(success&&$rootScope.$broadcast(successBroadcast),$scope.applyScope())})}},$scope.selectAllEntities=function(list,that,varName,setValue){varName=varName||"master";var val=that[varName];void 0==setValue&&(setValue=!0),setValue&&(that[varName]=val=!val),list.forEach(function(entitiy){entitiy.checked=val})},$scope.createPermission=function(type,entity,path,permissions){"/"!=path.charAt(0)&&(path="/"+path);var ops="",s="";permissions.getPerm&&(ops="get",s=","),permissions.postPerm&&(ops=ops+s+"post",s=","),permissions.putPerm&&(ops=ops+s+"put",s=","),permissions.deletePerm&&(ops=ops+s+"delete",s=",");var permission=ops+":"+path;return permission},$scope.formatDate=function(date){return new Date(date).toUTCString()},$scope.clearCheckbox=function(id){$("#"+id).attr("checked")&&$("#"+id).click()},$scope.removeFirstSlash=function(path){return 0===path.indexOf("/")?path.substring(1,path.length):path},$scope.applyScope=function(cb){return cb="function"==typeof cb?cb:function(){},this.$$phase?void cb():this.$apply(cb)},$scope.valueSelected=function(list){return list&&list.some(function(item){return item.checked})},$scope.sendHelp=function(modalId){ug.jsonpRaw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$scope.hideModal(modalId)},$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.$$phase||$scope.$apply()}),$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.$$phase||$scope.$apply()}),$scope.$on("roles-typeahead-received",function(event,roles){$scope.rolesTypeaheadValues=roles,$scope.$$phase||$scope.$apply()}),$scope.$on("checkAuthentication-success",function(){sessionStorage.setItem("authenticateAttempts",0),$scope.loaded=!0,$rootScope.activeUI=!0,$scope.applyScope(),$scope.queryStringApplied||($scope.queryStringApplied=!0,setTimeout(function(){$scope.queryString.org&&$rootScope.$broadcast("change-org",$scope.queryString.org)},1e3)),$rootScope.$broadcast("app-initialized")}),$scope.$on("checkAuthentication-error",function(args,err,missingData,email){if($scope.loaded=!0,err&&!$scope.use_sso&&notRegistration())ug.logout(),$location.path("/login"),$scope.applyScope();else if(missingData&&notRegistration()){if(!email&&$scope.use_sso)return void(window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]));ug.reAuthenticate(email)}}),$scope.$on("reAuthenticate-success",function(args,err,data,user,organizations,applications){sessionStorage.setItem("authenticateAttempts",0),$rootScope.$broadcast("loginSuccesful",user,organizations,applications),$rootScope.$emit("loginSuccesful",user,organizations,applications),$rootScope.$broadcast("checkAuthentication-success"),$scope.applyScope(function(){$scope.deferredLogin.resolve(),$location.path("/org-overview")})});var authenticateAttempts=parseInt(sessionStorage.getItem("authenticateAttempts")||0);$scope.$on("reAuthenticate-error",function(){if($scope.use_sso){if(authenticateAttempts++>5)return void $rootScope.$broadcast("alert","error","There is an issue with authentication. Please contact support.");console.error("Failed to login via sso "+authenticateAttempts),sessionStorage.setItem("authenticateAttempts",authenticateAttempts),window.location=$rootScope.urls().LOGIN_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0])}else notRegistration()&&(ug.logout(),$location.path("/login"),$scope.applyScope())}),$scope.$on("loginSuccessful",function(){$rootScope.activeUI=!0}),$scope.$on("app-changed",function(args,oldVal,newVal,preventReload){newVal===oldVal||preventReload||$route.reload()}),$scope.$on("org-changed",function(){ug.getApplications(),$route.reload()}),$scope.$on("app-settings-received",function(){}),$scope.$on("request-times-slow",function(){$rootScope.$broadcast("alert","info","We are experiencing performance issues on our server.  Please click Get Help for support if this continues.")});var lastPage="";$scope.$on("$routeChangeSuccess",function(){verifyUser(),$scope.showDemoBar="/performance"===$location.path().slice(0,"/performance".length),$scope.showDemoBar||($rootScope.demoData=!1),setTimeout(function(){lastPage=""},50);var path=window.location.pathname.replace("index-debug.html","");""===lastPage&&$analytics.pageTrack((path+$location.path()).replace("//","/")),lastPage=$location.path()}),$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.hasApplications=Object.keys(applications).length>0}),ug.getAppSettings(),$rootScope.startFirstTimeUser=function(){$rootScope.hideModal("introjs"),$rootScope.help.introjs_StartEvent(),$scope.startHelp()},$scope.$on("helpJsonLoaded",function(){1==$rootScope.help.introjs_shouldLaunch&&($rootScope.help.introjs_StartEvent(),$scope.startHelp(),$rootScope.help.introjs_shouldLaunch=!1)})}]),AppServices.Directives.directive("pageTitle",["$rootScope","ug",function($rootScope){return{restrict:"E",transclude:!0,templateUrl:"global/page-title.html",link:function(scope,lElement,attrs){scope.title=attrs.title,scope.icon=attrs.icon,scope.showHelp=function(){$("#need-help").modal("show")},scope.sendHelp=function(){data.jsonp_raw("apigeeuihelpemail","",{useremail:$rootScope.userEmail}).then(function(){$rootScope.$broadcast("alert","success","Email sent. Our team will be in touch with you shortly.")},function(){$rootScope.$broadcast("alert","error","Problem Sending Email. Try sending an email to mobile@apigee.com.")}),$("#need-help").modal("hide")}}}}]),AppServices.Services.factory("ug",function(configuration,$rootScope,utility,$q,$http,$resource,$log,$analytics,$location){function reportError(data,config){try{$analytics.eventTrack("error",{category:"App Services",label:data+":"+config.url+":"+(sessionStorage.apigee_uuid||"na")})}catch(e){console.log(e)}}var requestTimes=[],running=!1,currentRequests={},getAccessToken=function(){return sessionStorage.getItem("accessToken")};return{get:function(prop,isObject){return isObject?this.client().getObject(prop):this.client().get(prop)},set:function(prop,value){this.client().set(prop,value)},getUrls:function(qs){var host=$location.host(),BASE_URL="",DATA_URL="",use_sso=!1;switch(!0){case"appservices.apigee.com"===host&&location.pathname.indexOf("/dit")>=0:BASE_URL="https://accounts.jupiter.apigee.net",DATA_URL="https://apigee-internal-prod.jupiter.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host&&location.pathname.indexOf("/mars")>=0:BASE_URL="https://accounts.mars.apigee.net",DATA_URL="https://apigee-internal-prod.mars.apigee.net",use_sso=!0;break;case"appservices.apigee.com"===host:DATA_URL=Usergrid.overrideUrl;break;case"apigee.com"===host:BASE_URL="https://accounts.apigee.com",DATA_URL="https://api.usergrid.com",use_sso=!0;break;case"usergrid.dev"===host:DATA_URL="https://api.usergrid.com";break;default:DATA_URL=Usergrid.overrideUrl}return DATA_URL=qs.api_url||DATA_URL,DATA_URL=DATA_URL.lastIndexOf("/")===DATA_URL.length-1?DATA_URL.substring(0,DATA_URL.length-1):DATA_URL,{DATA_URL:DATA_URL,LOGIN_URL:BASE_URL+"/accounts/sign_in",PROFILE_URL:BASE_URL+"/accounts/my_account",LOGOUT_URL:BASE_URL+"/accounts/sign_out",apiUrl:DATA_URL,use_sso:use_sso}},orgLogin:function(username,password){var self=this;this.client().set("email",username),this.client().set("token",null),this.client().orgLogin(username,password,function(err,data,user,organizations,applications){err?$rootScope.$broadcast("loginFailed",err,data):self.initializeCurrentUser(function(){$rootScope.$broadcast("loginSuccesful",user,organizations,applications)})})},checkAuthentication:function(force){var ug=this,client=ug.client(),initialize=function(){ug.initializeCurrentUser(function(){$rootScope.userEmail=client.get("email"),$rootScope.organizations=client.getObject("organizations"),$rootScope.applications=client.getObject("applications"),$rootScope.currentOrg=client.get("orgName"),$rootScope.currentApp=client.get("appName");var key,size=0;for(key in $rootScope.applications)$rootScope.applications.hasOwnProperty(key)&&size++;$rootScope.$broadcast("checkAuthentication-success",client.getObject("organizations"),client.getObject("applications"),client.get("orgName"),client.get("appName"),client.get("email"))})},isAuthenticated=function(){var authenticated=null!==client.get("token")&&null!==client.get("organizations");return authenticated&&initialize(),authenticated};if(!isAuthenticated()||force){if(!client.get("token"))return $rootScope.$broadcast("checkAuthentication-error","no token",{},client.get("email"));this.client().reAuthenticateLite(function(err){var missingData=err||!client.get("orgName")||!client.get("appName")||!client.getObject("organizations")||!client.getObject("applications"),email=client.get("email");err||missingData?$rootScope.$broadcast("checkAuthentication-error",err,missingData,email):initialize()})}},reAuthenticate:function(email,eventOveride){var ug=this;this.client().reAuthenticate(email,function(err,data,user,organizations,applications){err||($rootScope.currentUser=user),err||($rootScope.userEmail=user.get("email"),$rootScope.organizations=organizations,$rootScope.applications=applications,$rootScope.currentOrg=ug.get("orgName"),$rootScope.currentApp=ug.get("appName"),$rootScope.currentUser=user._data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email)),$rootScope.$broadcast((eventOveride||"reAuthenticate")+"-"+(err?"error":"success"),err,data,user,organizations,applications)})},logoutCallback:function(){$rootScope.$broadcast("userNotAuthenticated")},logout:function(){$rootScope.activeUI=!1,$rootScope.userEmail="user@apigee.com",$rootScope.organizations={noOrg:{name:"No Orgs Found"}},$rootScope.applications={noApp:{name:"No Apps Found"}},$rootScope.currentOrg="No Org Found",$rootScope.currentApp="No App Found",sessionStorage.setItem("accessToken",null),sessionStorage.setItem("userUUID",null),sessionStorage.setItem("userEmail",null),this.client().logout(),this._client=null},client:function(){var options={buildCurl:!0,logging:!0};return Usergrid.options&&Usergrid.options.client&&(options.keys=Usergrid.options.client),this._client=this._client||new Usergrid.Client(options,$rootScope.urls().DATA_URL),this._client},setClientProperty:function(key,value){this.client().set(key,value)},getTopCollections:function(){var options={method:"GET",endpoint:""};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting collections");else{var collections=data.entities[0].metadata.collections;$rootScope.$broadcast("top-collections-received",collections)}})},createCollection:function(collectionName){var collections={};collections[collectionName]={};var metadata={metadata:{collections:collections}},options={method:"PUT",body:metadata,endpoint:""};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error creating collection"):$rootScope.$broadcast("collection-created",collections)})},getApplications:function(){this.client().getApplications(function(err,applications){err?applications&&console.error(applications):$rootScope.$broadcast("applications-received",applications)})},getAdministrators:function(){this.client().getAdministrators(function(err,administrators){err&&$rootScope.$broadcast("alert","error","error getting administrators"),$rootScope.$broadcast("administrators-received",administrators)})},createApplication:function(appName){this.client().createApplication(appName,function(err,applications){err?$rootScope.$broadcast("alert","error","error creating application"):($rootScope.$broadcast("applications-created",applications,appName),$rootScope.$broadcast("applications-received",applications))})},createAdministrator:function(adminName){this.client().createAdministrator(adminName,function(err,administrators){err&&$rootScope.$broadcast("alert","error","error creating administrator"),$rootScope.$broadcast("administrators-received",administrators)})},getFeed:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/feed",mQuery:!0};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting feed");else{var feedData=data.entities,feed=[],i=0;for(i=0;i<feedData.length;i++){var date=new Date(feedData[i].created).toUTCString(),title=feedData[i].title,n=title.indexOf(">");title=title.substring(n+1,title.length),n=title.indexOf(">"),title=title.substring(n+1,title.length),feedData[i].actor&&(title=feedData[i].actor.displayName+" "+title),feed.push({date:date,title:title})}0===i&&feed.push({date:"",title:"No Activities found."}),$rootScope.$broadcast("feed-received",feed)}})},createGroup:function(path,title){var options={path:path,title:title},self=this;this.groupsCollection.addEntity(options,function(err){err?$rootScope.$broadcast("groups-create-error",err):($rootScope.$broadcast("groups-create-success",self.groupsCollection),$rootScope.$broadcast("groups-received",self.groupsCollection))})},createRole:function(name,title){var options={name:name,title:title},self=this;this.rolesCollection.addEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error creating role"):$rootScope.$broadcast("roles-received",self.rolesCollection)})},createUser:function(username,name,email,password){var options={username:username,name:name,email:email,password:password},self=this;this.usersCollection.addEntity(options,function(err,data){err?"string"==typeof data?$rootScope.$broadcast("alert","error","error: "+data):$rootScope.$broadcast("alert","error","error creating user. the email address might already exist."):($rootScope.$broadcast("users-create-success",self.usersCollection),$rootScope.$broadcast("users-received",self.usersCollection))})},getCollection:function(type,path,orderBy,query,limit){var options={type:path,qs:{}};query&&(options.qs.ql=query),options.qs.ql=options.qs.ql?options.qs.ql+" order by "+(orderBy||"created desc"):" order by "+(orderBy||"created desc"),limit&&(options.qs.limit=limit),this.client().createCollection(options,function(err,collection,data){err?$rootScope.$broadcast("alert","error","error getting "+collection._type+": "+data.error_description):$rootScope.$broadcast(type+"-received",collection),$rootScope.$$phase||$rootScope.$apply()})},runDataQuery:function(queryPath,searchString,queryLimit){this.getCollection("query",queryPath,null,searchString,queryLimit)},runDataPOSTQuery:function(queryPath,body){var self=this,options={method:"POST",endpoint:queryPath,body:body};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description),$rootScope.$broadcast("error-running-query",data);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataPutQuery:function(queryPath,searchString,queryLimit,body){var self=this,options={method:"PUT",endpoint:queryPath,body:body};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},runDataDeleteQuery:function(queryPath,searchString,queryLimit){var self=this,options={method:"DELETE",endpoint:queryPath};searchString&&(options.qs.ql=searchString),queryLimit&&(options.qs.queryLimit=queryLimit),this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error: "+data.error_description);else{var queryPath=data.path;self.getCollection("query",queryPath,null,"order by modified DESC",null)}})},getUsers:function(){this.getCollection("users","users","username");var self=this;$rootScope.$on("users-received",function(evt,users){self.usersCollection=users})},getGroups:function(){this.getCollection("groups","groups","title");var self=this;$rootScope.$on("groups-received",function(event,roles){self.groupsCollection=roles})},getRoles:function(){this.getCollection("roles","roles","name");var self=this;$rootScope.$on("roles-received",function(event,roles){self.rolesCollection=roles})},getNotifiers:function(){var query="",limit="100",self=this;this.getCollection("notifiers","notifiers","created",query,limit),$rootScope.$on("notifiers-received",function(event,notifiers){self.notifiersCollection=notifiers})},getNotificationHistory:function(type){var query=null;type&&(query="select * where state = '"+type+"'"),this.getCollection("notifications","notifications","created desc",query);var self=this;$rootScope.$on("notifications-received",function(event,notifications){self.notificationCollection=notifications})},getNotificationReceipts:function(uuid){this.getCollection("receipts","notifications/"+uuid+"/receipts");var self=this;$rootScope.$on("receipts-received",function(event,receipts){self.receiptsCollection=receipts})},getIndexes:function(path){var options={method:"GET",endpoint:path.split("/").concat("indexes").filter(function(bit){return bit&&bit.length}).join("/")};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem getting indexes: "+data.error):$rootScope.$broadcast("indexes-received",data.data)})},sendNotification:function(path,body){var options={method:"POST",endpoint:path,body:body};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Problem creating notification: "+data.error):$rootScope.$broadcast("send-notification-complete")})},getRolesUsers:function(username){var options={type:"roles/users/"+username,qs:{ql:"order by username"}};this.client().createCollection(options,function(err,users){err?$rootScope.$broadcast("alert","error","error getting users"):$rootScope.$broadcast("users-received",users)})},getTypeAheadData:function(type,searchString,searchBy,orderBy){var search="",qs={limit:100};searchString&&(search="select * where "+searchBy+" = '"+searchString+"'"),orderBy&&(search=search+" order by "+orderBy),search&&(qs.ql=search);var options={method:"GET",endpoint:type,qs:qs};this.client().request(options,function(err,data){if(err)$rootScope.$broadcast("alert","error","error getting "+type);else{var entities=data.entities;$rootScope.$broadcast(type+"-typeahead-received",entities)}})},getUsersTypeAhead:function(searchString){this.getTypeAheadData("users",searchString,"username","username")},getGroupsTypeAhead:function(searchString){this.getTypeAheadData("groups",searchString,"path","path")},getRolesTypeAhead:function(searchString){this.getTypeAheadData("roles",searchString,"name","name")},getGroupsForUser:function(user){var options={type:"users/"+user+"/groups"};this.client().createCollection(options,function(err,groups){err?$rootScope.$broadcast("alert","error","error getting groups"):$rootScope.$broadcast("user-groups-received",groups)})},addUserToGroup:function(user,group){var options={type:"users/"+user+"/groups/"+group};this.client().createEntity(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to group"):$rootScope.$broadcast("user-added-to-group-received")})},addUserToRole:function(user,role){var options={method:"POST",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding user to role"):$rootScope.$broadcast("role-update-received")})},addGroupToRole:function(group,role){var options={method:"POST",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding group to role"):$rootScope.$broadcast("role-update-received")})},followUser:function(user){var username=$rootScope.selectedUser.get("uuid"),options={method:"POST",endpoint:"users/"+username+"/following/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error following user"):$rootScope.$broadcast("follow-user-received")})},newPermission:function(permission,type,entity){var options={method:"POST",endpoint:type+"/"+entity+"/permissions",body:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error adding permission"):$rootScope.$broadcast("permission-update-received")})},newUserPermission:function(permission,username){this.newPermission(permission,"users",username)},newGroupPermission:function(permission,path){this.newPermission(permission,"groups",path)},newRolePermission:function(permission,name){this.newPermission(permission,"roles",name)},deletePermission:function(permission,type,entity){var options={method:"DELETE",endpoint:type+"/"+entity+"/permissions",qs:{permission:permission}};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting permission"):$rootScope.$broadcast("permission-update-received")})},deleteUserPermission:function(permission,user){this.deletePermission(permission,"users",user)},deleteGroupPermission:function(permission,group){this.deletePermission(permission,"groups",group)},deleteRolePermission:function(permission,rolename){this.deletePermission(permission,"roles",rolename)},removeUserFromRole:function(user,role){var options={method:"DELETE",endpoint:"roles/"+role+"/users/"+user};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing user from role"):$rootScope.$broadcast("role-update-received")})},removeUserFromGroup:function(group,role){var options={method:"DELETE",endpoint:"roles/"+role+"/groups/"+group};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error removing role from the group"):$rootScope.$broadcast("role-update-received")})},createAndroidNotifier:function(name,APIkey){var options={method:"POST",endpoint:"notifiers",body:{apiKey:APIkey,name:name,provider:"google"}};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error","error creating notifier ")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},createAppleNotifier:function(file,name,environment,certificatePassword){var provider="apple",formData=new FormData;formData.append("p12Certificate",file),formData.append("name",name),formData.append("provider",provider),formData.append("environment",environment),formData.append("certificatePassword",certificatePassword||"");var options={method:"POST",endpoint:"notifiers",formData:formData};this.client().request(options,function(err,data){err?(console.error(data),$rootScope.$broadcast("alert","error",data.error_description||"error creating notifier")):($rootScope.$broadcast("alert","success","New notifier created successfully."),$rootScope.$broadcast("notifier-update"))})},deleteNotifier:function(name){var options={method:"DELETE",endpoint:"notifiers/"+name};this.client().request(options,function(err){err?$rootScope.$broadcast("alert","error","error deleting notifier"):$rootScope.$broadcast("notifier-update")})},initializeCurrentUser:function(callback){if(callback=callback||function(){},$rootScope.currentUser&&!$rootScope.currentUser.reset)return callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized","");var options={method:"GET",endpoint:"management/users/"+this.client().get("email"),mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("alert","error","Error getting user info"):($rootScope.currentUser=data.data,$rootScope.currentUser.profileImg=utility.get_gravatar($rootScope.currentUser.email),$rootScope.userEmail=$rootScope.currentUser.email,callback($rootScope.currentUser),$rootScope.$broadcast("current-user-initialized",$rootScope.currentUser))})},updateUser:function(user){var body=$rootScope.currentUser;
-body.username=user.username,body.name=user.name,body.email=user.email;var options={method:"PUT",endpoint:"management/users/"+user.uuid+"/",mQuery:!0,body:body},self=this;this.client().request(options,function(err,data){return self.client().set("email",user.email),self.client().set("username",user.username),err?$rootScope.$broadcast("user-update-error",data):($rootScope.currentUser.reset=!0,void self.initializeCurrentUser(function(){$rootScope.$broadcast("user-update-success",$rootScope.currentUser)}))})},resetUserPassword:function(user){var pwdata={};pwdata.oldpassword=user.oldPassword,pwdata.newpassword=user.newPassword,pwdata.username=user.username;var options={method:"PUT",endpoint:"users/"+pwdata.uuid+"/",body:pwdata};this.client().request(options,function(err){return err?$rootScope.$broadcast("alert","error","Error resetting password"):($rootScope.currentUser.oldPassword="",$rootScope.currentUser.newPassword="",void $rootScope.$broadcast("user-reset-password-success",$rootScope.currentUser))})},getOrgCredentials:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("org-creds-updated",data.credentials)})},regenerateOrgCredentials:function(){var options={method:"POST",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("org-creds-updated",data.credentials))})},getAppCredentials:function(){var options={method:"GET",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("app-creds-updated",data.credentials)})},regenerateAppCredentials:function(){var options={method:"POST",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("app-creds-updated",data.credentials))})},signUpUser:function(orgName,userName,name,email,password){var formData={organization:orgName,username:userName,name:name,email:email,password:password},options={method:"POST",endpoint:"management/organizations",body:formData,mQuery:!0},client=this.client();client.request(options,function(err,data){err?$rootScope.$broadcast("register-error",data):$rootScope.$broadcast("register-success",data)})},resendActivationLink:function(id){var options={method:"GET",endpoint:"management/users/"+id+"/reactivate",mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("resend-activate-error",data):$rootScope.$broadcast("resend-activate-success",data)})},getAppSettings:function(){$rootScope.$broadcast("app-settings-received",{})},getActivities:function(){this.client().request({method:"GET",endpoint:"activities",qs:{limit:200}},function(err,data){if(err)return $rootScope.$broadcast("app-activities-error",data);var entities=data.entities;entities.forEach(function(entity){entity.actor.picture?(entity.actor.picture=entity.actor.picture.replace(/^http:\/\/www.gravatar/i,"https://secure.gravatar"),entity.actor.picture=~entity.actor.picture.indexOf("http")?entity.actor.picture:"https://apigee.com/usergrid/img/user_profile.png"):entity.actor.picture=window.location.protocol+"//"+window.location.host+window.location.pathname+"img/user_profile.png"}),$rootScope.$broadcast("app-activities-received",data.entities)})},getEntityActivities:function(entity,isFeed){var route=isFeed?"feed":"activities",endpoint=entity.get("type")+"/"+entity.get("uuid")+"/"+route,options={method:"GET",endpoint:endpoint,qs:{limit:200}};this.client().request(options,function(err,data){err&&$rootScope.$broadcast(entity.get("type")+"-"+route+"-error",data),data.entities.forEach(function(entityInstance){entityInstance.createdDate=new Date(entityInstance.created).toUTCString()}),$rootScope.$broadcast(entity.get("type")+"-"+route+"-received",data.entities)})},addUserActivity:function(user,content){var options={actor:{displayName:user.get("username"),uuid:user.get("uuid"),username:user.get("username")},verb:"post",content:content};this.client().createUserActivity(user.get("username"),options,function(err,activity){err?$rootScope.$broadcast("user-activity-add-error",err):$rootScope.$broadcast("user-activity-add-success",activity)})},runShellQuery:function(method,path,payload){var path=path.replace(/^\//,""),options={method:method,endpoint:path};payload&&(options.body=payload),this.client().request(options,function(err,data){err?$rootScope.$broadcast("shell-error",data):$rootScope.$broadcast("shell-success",data)})},addOrganization:function(user,orgName){var options={method:"POST",endpoint:"management/users/"+user.uuid+"/organizations",body:{organization:orgName},mQuery:!0},client=this.client();client.request(options,function(err,data){err?$rootScope.$broadcast("user-add-org-error",data):$rootScope.$broadcast("user-add-org-success",$rootScope.organizations)})},leaveOrganization:function(user,org){var options={method:"DELETE",endpoint:"management/users/"+user.uuid+"/organizations/"+org.uuid,mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("user-leave-org-error",data):(delete $rootScope.organizations[org.name],$rootScope.$broadcast("user-leave-org-success",$rootScope.organizations))})},httpGet:function(id,url){var deferred;return deferred=$q.defer(),$http.get(url||configuration.ITEMS_URL).success(function(data){var result;id?angular.forEach(data,function(obj){obj.id===id&&(result=obj)}):result=data,deferred.resolve(result)}).error(function(data,status,headers,config){$log.error(data,status,headers,config),reportError(data,config),deferred.reject(data)}),deferred.promise},jsonp:function(objectType,criteriaId,params,successCallback){params||(params={}),params.demoApp=$rootScope.demoData,params.access_token=getAccessToken(),params.callback="JSON_CALLBACK";var uri=$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/apm/"+objectType+"/"+criteriaId;return this.jsonpRaw(objectType,criteriaId,params,uri,successCallback)},jsonpSimple:function(objectType,appId,params){var uri=$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/apm/"+objectType+"/"+appId;return this.jsonpRaw(objectType,appId,params,uri)},calculateAverageRequestTimes:function(){if(!running){var self=this;running=!0,setTimeout(function(){running=!1;var length=requestTimes.length<10?requestTimes.length:10,sum=requestTimes.slice(0,length).reduce(function(a,b){return a+b}),avg=sum/length;self.averageRequestTimes=avg/1e3,self.averageRequestTimes>5&&$rootScope.$broadcast("request-times-slow",self.averageRequestTimes)},3e3)}},jsonpRaw:function(objectType,appId,params,uri,successCallback){"function"!=typeof successCallback&&(successCallback=null),uri=uri||$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/"+objectType,params||(params={});var start=(new Date).getTime(),self=this;params.access_token=getAccessToken(),params.callback="JSON_CALLBACK";var deferred=$q.defer(),diff=function(){currentRequests[uri]--,requestTimes.splice(0,0,(new Date).getTime()-start),self.calculateAverageRequestTimes()};successCallback&&$rootScope.$broadcast("ajax_loading",objectType);var reqCount=currentRequests[uri]||0;return self.averageRequestTimes>5&&reqCount>1?(setTimeout(function(){deferred.reject(new Error("query in progress"))},50),deferred):(currentRequests[uri]=(currentRequests[uri]||0)+1,$http.jsonp(uri,{params:params}).success(function(data,status,headers,config){diff(),successCallback&&(successCallback(data,status,headers,config),$rootScope.$broadcast("ajax_finished",objectType)),deferred.resolve(data)}).error(function(data,status,headers,config){diff(),$log.error("ERROR: Could not get jsonp data. "+uri),reportError(data,config),deferred.reject(data)}),deferred.promise)},resource:function(params,isArray){return $resource($rootScope.urls().DATA_URL+"/:orgname/:appname/:username/:endpoint",{},{get:{method:"JSONP",isArray:isArray,params:params},login:{method:"GET",url:$rootScope.urls().DATA_URL+"/management/token",isArray:!1,params:params},save:{url:$rootScope.urls().DATA_URL+"/"+params.orgname+"/"+params.appname,method:"PUT",isArray:!1,params:params}})},httpPost:function(url,callback,payload,headers){var accessToken=getAccessToken();payload?payload.access_token=accessToken:payload={access_token:accessToken},headers||(headers={Bearer:accessToken}),$http({method:"POST",url:url,data:payload,headers:headers}).success(function(data){callback(data)}).error(function(data,status,headers,config){reportError(data,config),callback(data)})}}}),AppServices.Directives.directive("ngFocus",["$parse",function($parse){return function(scope,element,attr){var fn=$parse(attr.ngFocus);element.bind("focus",function(event){scope.$apply(function(){fn(scope,{$event:event})})})}}]),AppServices.Directives.directive("ngBlur",["$parse",function($parse){return function(scope,element,attr){var fn=$parse(attr.ngBlur);element.bind("blur",function(event){scope.$apply(function(){fn(scope,{$event:event})})})}}]),AppServices.Services.factory("utility",function(){return{keys:function(o){var a=[];for(var propertyName in o)a.push(propertyName);return a},get_gravatar:function(email,size){try{var size=size||50;return email.length?"https://secure.gravatar.com/avatar/"+MD5(email)+"?s="+size:"https://apigee.com/usergrid/img/user_profile.png"}catch(e){return"https://apigee.com/usergrid/img/user_profile.png"}},get_qs_params:function(){var queryParams={};if(window.location.search)for(var params=window.location.search.slice(1).split("&"),i=0;i<params.length;i++){var tmp=params[i].split("=");queryParams[tmp[0]]=unescape(tmp[1])}return queryParams},safeApply:function(fn){var phase=this.$root.$$phase;"$apply"==phase||"$digest"==phase?fn&&"function"==typeof fn&&fn():this.$apply(fn)}}}),AppServices.Directives.directive("ugValidate",["$rootScope",function(){return{scope:!0,restrict:"A",require:"ng-model",replace:!0,link:function(scope,element,attrs,ctrl){var validate=function(){var id=element.attr("id"),validator=id+"-validator",title=element.attr("title");if(title=title&&title.length?title:"Please enter data",$("#"+validator).remove(),ctrl.$valid)element.removeClass("has-error"),$("#"+validator).remove();else{var validatorElem='<div id="'+validator+'"><span  class="validator-error-message">'+title+"</span></div>";$("#"+id).after(validatorElem),element.addClass("has-error")}},firing=!1;element.bind("blur",function(){validate(scope,element,attrs,ctrl)}).bind("input",function(){firing||(firing=!0,setTimeout(function(){validate(scope,element,attrs,ctrl),firing=!1},500))})}}}]),AppServices.Controllers.controller("GroupsActivitiesCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.activitiesSelected="active",$rootScope.selectedGroup?($rootScope.selectedGroup.activities=[],void $rootScope.selectedGroup.getActivities(function(err){err||$rootScope.$$phase||$rootScope.$apply()})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope,$location,$route){$scope.groupsCollection={},$rootScope.selectedGroup={},$scope.previous_display="none",$scope.next_display="none",$scope.hasGroups=!1,$scope.newGroup={path:"",title:""},ug.getGroups(),$scope.currentGroupsPage={},$scope.selectGroupPage=function(route){$scope.currentGroupsPage.template=$route.routes[route].templateUrl,$scope.currentGroupsPage.route=route},$scope.newGroupDialog=function(modalId){$scope.newGroup.path&&$scope.newGroup.title?(ug.createGroup($scope.removeFirstSlash($scope.newGroup.path),$scope.newGroup.title),$scope.hideModal(modalId),$scope.newGroup={path:"",title:""}):$rootScope.$broadcast("alert","error","Missing required information.")},$scope.deleteGroupsDialog=function(modalId){$scope.deleteEntities($scope.groupsCollection,"group-deleted","error deleting group"),$scope.hideModal(modalId),$scope.newGroup={path:"",title:""}},$scope.$on("group-deleted",function(){$rootScope.$broadcast("alert","success","Group deleted successfully.")}),$scope.$on("group-deleted-error",function(){ug.getGroups()}),$scope.$on("groups-create-success",function(){$rootScope.$broadcast("alert","success","Group created successfully.")}),$scope.$on("groups-create-error",function(){$rootScope.$broadcast("alert","error","Error creating group. Make sure you don't have spaces in the path.")}),$scope.$on("groups-received",function(event,groups){$scope.groupBoxesSelected=!1,$scope.groupsCollection=groups,$scope.newGroup.path="",$scope.newGroup.title="",!(groups._list.length>0)||$rootScope.selectedGroup._data&&groups._list.some(function(group){return $rootScope.selectedGroup._data.uuid===group._data.uuid})||$scope.selectGroup(groups._list[0]._data.uuid),$scope.hasGroups=groups._list.length>0,$scope.received=!0,$scope.checkNextPrev(),$scope.applyScope()}),$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.groupsCollection.hasPreviousPage()&&($scope.previous_display="block"),$scope.groupsCollection.hasNextPage()&&($scope.next_display="block")},$scope.selectGroup=function(uuid){$rootScope.selectedGroup=$scope.groupsCollection.getEntityByUUID(uuid),$scope.currentGroupsPage.template="groups/groups-details.html",$scope.currentGroupsPage.route="/groups/details",$rootScope.$broadcast("group-selection-changed",$rootScope.selectedGroup)},$scope.getPrevious=function(){$scope.groupsCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$scope.groupsCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.$on("group-deleted",function(){$route.reload(),$scope.master=""})}]),AppServices.Controllers.controller("GroupsDetailsCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){var selectedGroup=$rootScope.selectedGroup.clone();return $scope.detailsSelected="active",$scope.json=selectedGroup._json||selectedGroup._data.stringifyJSON(),$scope.group=selectedGroup._data,$scope.group.path=0!=$scope.group.path.indexOf("/")?"/"+$scope.group.path:$scope.group.path,$scope.group.title=$scope.group.title,$rootScope.selectedGroup?($scope.$on("group-selection-changed",function(evt,selectedGroup){$scope.group.path=0!=selectedGroup._data.path.indexOf("/")?"/"+selectedGroup._data.path:selectedGroup._data.path,$scope.group.title=selectedGroup._data.title,$scope.detailsSelected="active",$scope.json=selectedGroup._json||selectedGroup._data.stringifyJSON()}),void($rootScope.saveSelectedGroup=function(){$rootScope.selectedGroup._data.title=$scope.group.title,$rootScope.selectedGroup._data.path=$scope.removeFirstSlash($scope.group.path),$rootScope.selectedGroup.save(function(err){err?$rootScope.$broadcast("alert","error","error saving group"):$rootScope.$broadcast("alert","success","group saved")})})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsMembersCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.membersSelected="active",$scope.previous_display="none",$scope.next_display="none",$scope.user="",$scope.master="",$scope.hasMembers=!1,ug.getUsersTypeAhead(),$scope.usersTypeaheadValues=[],$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.applyScope()}),$scope.addGroupToUserDialog=function(modalId){if($scope.user){var path=$rootScope.selectedGroup.get("path");ug.addUserToGroup($scope.user.uuid,path),$scope.user="",$scope.hideModal(modalId)}else $rootScope.$broadcast("alert","error","Please select a user.")},$scope.removeUsersFromGroupDialog=function(modalId){$scope.deleteEntities($scope.groupsCollection.users,"group-update-received","Error removing user from group"),$scope.hideModal(modalId)},$scope.get=function(){if($rootScope.selectedGroup.get){var options={type:"groups/"+$rootScope.selectedGroup.get("path")+"/users"};$scope.groupsCollection.addCollection("users",options,function(err){$scope.groupMembersSelected=!1,err?$rootScope.$broadcast("alert","error","error getting users for group"):($scope.hasMembers=$scope.groupsCollection.users._list.length>0,$scope.checkNextPrev(),$scope.applyScope())})}},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.groupsCollection.users.hasPreviousPage()&&($scope.previous_display="block"),$scope.groupsCollection.users.hasNextPage()&&($scope.next_display="block")},$rootScope.selectedGroup?($scope.get(),$scope.getPrevious=function(){$scope.groupsCollection.users.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of users"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$scope.getNext=function(){$scope.groupsCollection.users.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of users"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$scope.$on("group-update-received",function(){$scope.get()}),void $scope.$on("user-added-to-group-received",function(){$scope.get()})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsRolesCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.rolesSelected="active",$scope.roles_previous_display="none",$scope.roles_next_display="none",$scope.name="",$scope.master="",$scope.hasRoles=!1,$scope.hasPermissions=!1,$scope.permissions={},$scope.addGroupToRoleDialog=function(modalId){if($scope.name){var path=$rootScope.selectedGroup.get("path");ug.addGroupToRole(path,$scope.name),$scope.hideModal(modalId),$scope.name=""}else $rootScope.$broadcast("alert","error","You must specify a role name.")},$scope.leaveRoleDialog=function(modalId){for(var path=$rootScope.selectedGroup.get("path"),roles=$scope.groupsCollection.roles._list,i=0;i<roles.length;i++)roles[i].checked&&ug.removeUserFromGroup(path,roles[i]._data.name);$scope.hideModal(modalId)},$scope.addGroupPermissionDialog=function(modalId){if($scope.permissions.path){var permission=$scope.createPermission(null,null,$scope.removeFirstSlash($scope.permissions.path),$scope.permissions),path=$rootScope.selectedGroup.get("path");ug.newGroupPermission(permission,path),$scope.hideModal(modalId),$scope.permissions&&($scope.permissions={})}else $rootScope.$broadcast("alert","error","You must specify a name for the permission.")},$scope.deleteGroupPermissionDialog=function(modalId){for(var path=$rootScope.selectedGroup.get("path"),permissions=$rootScope.selectedGroup.permissions,i=0;i<permissions.length;i++)permissions[i].checked&&ug.deleteGroupPermission(permissions[i].perm,path);$scope.hideModal(modalId)},$scope.resetNextPrev=function(){$scope.roles_previous_display="none",$scope.roles_next_display="none",$scope.permissions_previous_display="none",$scope.permissions_next_display="none"},$scope.resetNextPrev(),$scope.checkNextPrevRoles=function(){$scope.resetNextPrev(),$scope.groupsCollection.roles.hasPreviousPage()&&($scope.roles_previous_display="block"),$scope.groupsCollection.roles.hasNextPage()&&($scope.roles_next_display="block")},$scope.checkNextPrevPermissions=function(){$scope.groupsCollection.permissions.hasPreviousPage()&&($scope.permissions_previous_display="block"),$scope.groupsCollection.permissions.hasNextPage()&&($scope.permissions_next_display="block")},$scope.getRoles=function(){var path=$rootScope.selectedGroup.get("path"),options={type:"groups/"+path+"/roles"};$scope.groupsCollection.addCollection("roles",options,function(err){$scope.groupRoleSelected=!1,err?$rootScope.$broadcast("alert","error","error getting roles for group"):($scope.hasRoles=$scope.groupsCollection.roles._list.length>0,$scope.checkNextPrevRoles(),$scope.applyScope())})},$scope.getPermissions=function(){$rootScope.selectedGroup.permissions=[],$rootScope.selectedGroup.getPermissions(function(err){$scope.groupPermissionsSelected=!1,$scope.hasPermissions=$scope.selectedGroup.permissions.length,err||$scope.applyScope()})},$scope.getPreviousRoles=function(){$scope.groupsCollection.roles.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of roles"),$scope.checkNextPrevRoles(),$scope.applyScope()})},$scope.getNextRoles=function(){$scope.groupsCollection.roles.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of roles"),$scope.checkNextPrevRoles(),$scope.applyScope()})},$scope.getPreviousPermissions=function(){$scope.groupsCollection.permissions.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of permissions"),$scope.checkNextPrevPermissions(),$scope.applyScope()})},$scope.getNextPermissions=function(){$scope.groupsCollection.permissions.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of permissions"),$scope.checkNextPrevPermissions(),$scope.applyScope()})},$scope.$on("role-update-received",function(){$scope.getRoles()}),$scope.$on("permission-update-received",function(){$scope.getPermissions()}),$scope.$on("groups-received",function(evt,data){$scope.groupsCollection=data,$scope.getRoles(),$scope.getPermissions()}),$rootScope.selectedGroup?(ug.getRolesTypeAhead(),void ug.getGroups()):void $location.path("/groups")}]),AppServices.Controllers.controller("ForgotPasswordCtrl",["ug","$scope","$rootScope","$location","$sce","utility",function(ug,$scope,$rootScope,$location,$sce){$rootScope.activeUI&&$location.path("/"),$scope.forgotPWiframeURL=$sce.trustAsResourceUrl($scope.apiUrl+"/management/users/resetpw")}]),AppServices.Controllers.controller("LoginCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){$scope.loading=!1,$scope.login={},$scope.activation={},$scope.requiresDeveloperKey=$scope.options.client.requiresDeveloperKey||!1,!$scope.requiresDeveloperKey&&$scope.options.client.apiKey&&ug.setClientProperty("developerkey",$scope.options.client.apiKey),$rootScope.gotoForgotPasswordPage=function(){$location.path("/forgot-password")},$rootScope.gotoSignUp=function(){$location.path("/register")},$scope.login=function(){var username=$scope.login.username,password=$scope.login.password;$scope.loginMessage="",$scope.loading=!0,$scope.requiresDeveloperKey&&ug.setClientProperty("developerkey",$scope.login.developerkey),ug.orgLogin(username,password)},$scope.$on("loginFailed",function(){$scope.loading=!1,ug.setClientProperty("developerkey",null),$scope.loginMessage="Error: the username / password combination was not valid",$scope.applyScope()}),$scope.logout=function(){ug.logout(),ug.setClientProperty("developerkey",null),$scope.use_sso?window.location=$rootScope.urls().LOGOUT_URL+"?redirect=no&callback="+encodeURIComponent($location.absUrl().split("?")[0]):($location.path("/login"),$scope.applyScope())},$rootScope.$on("userNotAuthenticated",function(){"/forgot-password"!==$location.path()&&($location.path("/login"),$scope.logout()),$scope.applyScope()}),$scope.$on("loginSuccesful",function(){$scope.loading=!1,$scope.login={},$location.path("/login"===$rootScope.currentPath||"/login/loading"===$rootScope.currentPath||"undefined"==typeof $rootScope.currentPath?"/org-overview":$rootScope.currentPath),$scope.applyScope()}),$scope.resendActivationLink=function(modalId){var id=$scope.activation.id;ug.resendActivationLink(id),$scope.activation={},$scope.hideModal(modalId)},$scope.$on("resend-activate-success",function(){$scope.activationId="",$scope.$apply(),$rootScope.$broadcast("alert","success","Activation link sent successfully.")}),$scope.$on("resend-activate-error",function(){$rootScope.$broadcast("alert","error","Activation link failed to send.")})}]),AppServices.Controllers.controller("LogoutCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){ug.logout(),$scope.use_sso?window.location=$rootScope.urls().LOGOUT_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]):($location.path("/login"),$scope.applyScope())}]),AppServices.Controllers.controller("RegisterCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){$rootScope.activeUI&&$location.path("/");var init=function(){$scope.registeredUser={}};init(),$scope.cancel=function(){$location.path("/")},$scope.register=function(){var user=$scope.registeredUser.clone();user.password===user.confirmPassword?ug.signUpUser(user.orgName,user.userName,user.name,user.email,user.password):$rootScope.$broadcast("alert","error","Passwords do not match."+name)},$scope.$on("register-error",function(event,data){$scope.signUpSuccess=!1,$rootScope.$broadcast("alert","error","Error registering: "+(data&&data.error_description?data.error_description:name))}),$scope.$on("register-success",function(){$scope.registeredUser={},$scope.signUpSuccess=!0,init(),$scope.$apply()})}]),AppServices.Directives.directive("menu",["$location","$rootScope","$log",function($location,$rootScope,$log){return{link:function(scope,lElement,attrs){function setActiveElement(ele,locationPath,$rootScope,isParentClick){if(ele){ele.removeClass("active");var menuItem,parentMenuItem,newActiveElement=ele.parent().find('a[href*="#!'+locationPath+'"]');if(0===newActiveElement.length)parentMenuItem=ele;else{menuItem=newActiveElement.parent(),menuItem.hasClass("option")?parentMenuItem=menuItem[0]:1===menuItem.size()?(parentMenuItem=newActiveElement.parent().parent().parent(),parentMenuItem.addClass("active")):(parentMenuItem=menuItem[0],menuItem=menuItem[1]);try{var menuItemCompare=parentMenuItem[0]||parentMenuItem;ele[0]!==menuItemCompare&&isParentClick&&ele.find("ul")[0]&&(ele.find("ul")[0].style.height=0);var subMenuSizer=angular.element(parentMenuItem).find(".nav-list")[0];if(subMenuSizer){var heightChecker,clientHeight=subMenuSizer.getAttribute("data-height"),heightCounter=1;clientHeight||heightChecker?(menuItem.addClass("active"),subMenuSizer.style.height=clientHeight+"px"):heightChecker=setInterval(function(){var tempHeight=subMenuSizer.getAttribute("data-height")||subMenuSizer.clientHeight;heightCounter=subMenuSizer.clientHeight,0===heightCounter&&(heightCounter=1),"string"==typeof tempHeight&&(tempHeight=parseInt(tempHeight,10)),tempHeight>0&&heightCounter===tempHeight&&(subMenuSizer.setAttribute("data-height",tempHeight),menuItem.addClass("active"),subMenuSizer.style.height=tempHeight+"px",clearInterval(heightChecker)),heightCounter=tempHeight},20),$rootScope.menuExecute=!0}else menuItem.addClass("active")}catch(e){$log.error("Problem calculating size of menu",e)}}return{menuitem:menuItem,parentMenuItem:parentMenuItem}}}function setupMenuState(){if(menuContext=attrs.menu,parentMenuItems=lElement.find("li.option"),0!==lElement.find("li.option.active").length&&($rootScope[menuContext+"Parent"]=lElement.find("li.option.active")),activeParentElement=$rootScope[menuContext+"Parent"]||null,activeParentElement&&(activeParentElement=angular.element(activeParentElement)),menuItems=lElement.find("li.option li"),locationPath=$location.path(),activeParentElement&&(activeMenuElement=angular.element(activeParentElement),activeMenuElement=activeMenuElement.find("li.active"),activeMenuElement.removeClass("active"),activeParentElement.find("a")[0])){subMenuContext=activeParentElement.find("a")[0].href.split("#!")[1];var tempMenuContext=subMenuContext.split("/");subMenuContext="/"+tempMenuContext[1],tempMenuContext.length>2&&(subMenuContext+="/"+tempMenuContext[2])}var activeElements;""!==locationPath&&-1===locationPath.indexOf(subMenuContext)?(activeElements=setActiveElement(activeParentElement,locationPath,scope),activeElements&&($rootScope[menuContext+"Parent"]=activeElements.parentMenuItem,$rootScope[menuContext+"Menu"]=activeElements.menuitem)):setActiveElement(activeParentElement,subMenuContext,scope)}var menuContext,parentMenuItems,activeParentElement,menuItems,activeMenuElement,locationPath,subMenuContext,bound=!1;scope.$watch("menuItems"),scope.$on("$routeChangeSuccess",function(){setTimeout(function(){setupMenuState(),bound||(bound=!0,parentMenuItems.bind("click",function(cevent){var previousParentSelection=angular.element($rootScope[menuContext+"Parent"]),targetPath=angular.element(cevent.currentTarget).find("> a")[0].href.split("#!")[1];previousParentSelection.find(".nav > li").removeClass("active");var activeElements=setActiveElement(previousParentSelection,targetPath,scope,!0);$rootScope[menuContext+"Parent"]=activeElements.parentMenuItem,$rootScope[menuContext+"Menu"]=activeElements.menuitem,scope.$broadcast("menu-selection")}),menuItems.bind("click",function(cevent){var previousMenuSelection=$rootScope[menuContext+"Menu"],targetElement=cevent.currentTarget;previousMenuSelection!==targetElement&&(previousMenuSelection?angular.element(previousMenuSelection).removeClass("active"):activeMenuElement.removeClass("active"),scope.$apply(function(){angular.element($rootScope[menuContext]).addClass("active")}),$rootScope[menuContext+"Menu"]=targetElement,angular.element($rootScope[menuContext+"Parent"]).find("a")[0].setAttribute("href",angular.element(cevent.currentTarget).find("a")[0].href))}))},500)})}}}]),AppServices.Directives.directive("timeFilter",["$location","$routeParams","$rootScope",function($location,$routeParams,$rootScope){return{restrict:"A",transclude:!0,template:'<li ng-repeat="time in timeFilters" class="filterItem"><a ng-click="changeTimeFilter(time)">{{time.label}}</a></li>',link:function(scope,lElement,attrs){var menuContext=attrs.filter;scope.changeTimeFilter=function(newTime){$rootScope.selectedtimefilter=newTime,$routeParams.timeFilter=newTime.value},lElement.bind("click",function(cevent){menuBindClick(scope,lElement,cevent,menuContext)})}}}]),AppServices.Directives.directive("chartFilter",["$location","$routeParams","$rootScope",function($location,$routeParams,$rootScope){return{restrict:"ACE",scope:"=",template:'<li ng-repeat="chart in chartCriteriaOptions" class="filterItem"><a ng-click="changeChart(chart)">{{chart.chartName}}</a></li>',link:function(scope,lElement,attrs){var menuContext=attrs.filter;scope.changeChart=function(newChart){$rootScope.selectedChartCriteria=newChart,$routeParams.currentCompare="NOW",$routeParams[newChart.type+"ChartFilter"]=newChart.chartCriteriaId},lElement.bind("click",function(cevent){menuBindClick(scope,lElement,cevent,menuContext)})}}}]),AppServices.Directives.directive("orgMenu",["$location","$routeParams","$rootScope","ug",function($location,$routeParams,$rootScope,ug){return{restrict:"ACE",scope:"=",replace:!0,templateUrl:"menus/orgMenu.html",link:function(scope){scope.orgChange=function(orgName){var oldOrg=ug.get("orgName");ug.set("orgName",orgName),$rootScope.currentOrg=orgName,$location.path("/org-overview"),$rootScope.$broadcast("org-changed",oldOrg,orgName)},scope.$on("change-org",function(args,org){scope.orgChange(org)})}}}]),AppServices.Directives.directive("appMenu",["$location","$routeParams","$rootScope","ug",function($location,$routeParams,$rootScope,ug){return{restrict:"ACE",scope:"=",replace:!0,templateUrl:"menus/appMenu.html",link:function(scope){scope.myApp={};
+body.username=user.username,body.name=user.name,body.email=user.email;var options={method:"PUT",endpoint:"management/users/"+user.uuid+"/",mQuery:!0,body:body},self=this;this.client().request(options,function(err,data){return self.client().set("email",user.email),self.client().set("username",user.username),err?$rootScope.$broadcast("user-update-error",data):($rootScope.currentUser.reset=!0,void self.initializeCurrentUser(function(){$rootScope.$broadcast("user-update-success",$rootScope.currentUser)}))})},resetUserPassword:function(user){var pwdata={};pwdata.oldpassword=user.oldPassword,pwdata.newpassword=user.newPassword,pwdata.username=user.username;var options={method:"PUT",endpoint:"users/"+pwdata.uuid+"/",body:pwdata};this.client().request(options,function(err){return err?$rootScope.$broadcast("alert","error","Error resetting password"):($rootScope.currentUser.oldPassword="",$rootScope.currentUser.newPassword="",void $rootScope.$broadcast("user-reset-password-success",$rootScope.currentUser))})},getOrgCredentials:function(){var options={method:"GET",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("org-creds-updated",data.credentials)})},regenerateOrgCredentials:function(){var options={method:"POST",endpoint:"management/organizations/"+this.client().get("orgName")+"/credentials",mQuery:!0};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("org-creds-updated",data.credentials))})},getAppCredentials:function(){var options={method:"GET",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error getting credentials"):$rootScope.$broadcast("app-creds-updated",data.credentials)})},regenerateAppCredentials:function(){var options={method:"POST",endpoint:"credentials"};this.client().request(options,function(err,data){err&&data.credentials?$rootScope.$broadcast("alert","error","Error regenerating credentials"):($rootScope.$broadcast("alert","success","Regeneration of credentials complete."),$rootScope.$broadcast("app-creds-updated",data.credentials))})},signUpUser:function(orgName,userName,name,email,password){var formData={organization:orgName,username:userName,name:name,email:email,password:password},options={method:"POST",endpoint:"management/organizations",body:formData,mQuery:!0},client=this.client();client.request(options,function(err,data){err?$rootScope.$broadcast("register-error",data):$rootScope.$broadcast("register-success",data)})},resendActivationLink:function(id){var options={method:"GET",endpoint:"management/users/"+id+"/reactivate",mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("resend-activate-error",data):$rootScope.$broadcast("resend-activate-success",data)})},getAppSettings:function(){$rootScope.$broadcast("app-settings-received",{})},getActivities:function(){this.client().request({method:"GET",endpoint:"activities",qs:{limit:200}},function(err,data){if(err)return $rootScope.$broadcast("app-activities-error",data);var entities=data.entities;entities.forEach(function(entity){entity.actor.picture?(entity.actor.picture=entity.actor.picture.replace(/^http:\/\/www.gravatar/i,"https://secure.gravatar"),entity.actor.picture=~entity.actor.picture.indexOf("http")?entity.actor.picture:"https://apigee.com/usergrid/img/user_profile.png"):entity.actor.picture=window.location.protocol+"//"+window.location.host+window.location.pathname+"img/user_profile.png"}),$rootScope.$broadcast("app-activities-received",data.entities)})},getEntityActivities:function(entity,isFeed){var route=isFeed?"feed":"activities",endpoint=entity.get("type")+"/"+entity.get("uuid")+"/"+route,options={method:"GET",endpoint:endpoint,qs:{limit:200}};this.client().request(options,function(err,data){err&&$rootScope.$broadcast(entity.get("type")+"-"+route+"-error",data),data.entities.forEach(function(entityInstance){entityInstance.createdDate=new Date(entityInstance.created).toUTCString()}),$rootScope.$broadcast(entity.get("type")+"-"+route+"-received",data.entities)})},addUserActivity:function(user,content){var options={actor:{displayName:user.get("username"),uuid:user.get("uuid"),username:user.get("username")},verb:"post",content:content};this.client().createUserActivity(user.get("username"),options,function(err,activity){err?$rootScope.$broadcast("user-activity-add-error",err):$rootScope.$broadcast("user-activity-add-success",activity)})},runShellQuery:function(method,path,payload){var path=path.replace(/^\//,""),options={method:method,endpoint:path};payload&&(options.body=payload),this.client().request(options,function(err,data){err?$rootScope.$broadcast("shell-error",data):$rootScope.$broadcast("shell-success",data)})},addOrganization:function(user,orgName){var options={method:"POST",endpoint:"management/users/"+user.uuid+"/organizations",body:{organization:orgName},mQuery:!0},client=this.client();client.request(options,function(err,data){err?$rootScope.$broadcast("user-add-org-error",data):$rootScope.$broadcast("user-add-org-success",$rootScope.organizations)})},leaveOrganization:function(user,org){var options={method:"DELETE",endpoint:"management/users/"+user.uuid+"/organizations/"+org.uuid,mQuery:!0};this.client().request(options,function(err,data){err?$rootScope.$broadcast("user-leave-org-error",data):(delete $rootScope.organizations[org.name],$rootScope.$broadcast("user-leave-org-success",$rootScope.organizations))})},httpGet:function(id,url){var deferred;return deferred=$q.defer(),$http.get(url||configuration.ITEMS_URL).success(function(data){var result;id?angular.forEach(data,function(obj){obj.id===id&&(result=obj)}):result=data,deferred.resolve(result)}).error(function(data,status,headers,config){$log.error(data,status,headers,config),reportError(data,config),deferred.reject(data)}),deferred.promise},jsonp:function(objectType,criteriaId,params,successCallback){params||(params={}),params.demoApp=$rootScope.demoData,params.access_token=getAccessToken(),params.callback="JSON_CALLBACK";var uri=$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/apm/"+objectType+"/"+criteriaId;return this.jsonpRaw(objectType,criteriaId,params,uri,successCallback)},jsonpSimple:function(objectType,appId,params){var uri=$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/apm/"+objectType+"/"+appId;return this.jsonpRaw(objectType,appId,params,uri)},calculateAverageRequestTimes:function(){if(!running){var self=this;running=!0,setTimeout(function(){running=!1;var length=requestTimes.length<10?requestTimes.length:10,sum=requestTimes.slice(0,length).reduce(function(a,b){return a+b}),avg=sum/length;self.averageRequestTimes=avg/1e3,self.averageRequestTimes>5&&$rootScope.$broadcast("request-times-slow",self.averageRequestTimes)},3e3)}},jsonpRaw:function(objectType,appId,params,uri,successCallback){"function"!=typeof successCallback&&(successCallback=null),uri=uri||$rootScope.urls().DATA_URL+"/"+$rootScope.currentOrg+"/"+$rootScope.currentApp+"/"+objectType,params||(params={});var start=(new Date).getTime(),self=this;params.access_token=getAccessToken(),params.callback="JSON_CALLBACK";var deferred=$q.defer(),diff=function(){currentRequests[uri]--,requestTimes.splice(0,0,(new Date).getTime()-start),self.calculateAverageRequestTimes()};successCallback&&$rootScope.$broadcast("ajax_loading",objectType);var reqCount=currentRequests[uri]||0;return self.averageRequestTimes>5&&reqCount>1?(setTimeout(function(){deferred.reject(new Error("query in progress"))},50),deferred):(currentRequests[uri]=(currentRequests[uri]||0)+1,$http.jsonp(uri,{params:params}).success(function(data,status,headers,config){diff(),successCallback&&(successCallback(data,status,headers,config),$rootScope.$broadcast("ajax_finished",objectType)),deferred.resolve(data)}).error(function(data,status,headers,config){diff(),$log.error("ERROR: Could not get jsonp data. "+uri),reportError(data,config),deferred.reject(data)}),deferred.promise)},resource:function(params,isArray){return $resource($rootScope.urls().DATA_URL+"/:orgname/:appname/:username/:endpoint",{},{get:{method:"JSONP",isArray:isArray,params:params},login:{method:"GET",url:$rootScope.urls().DATA_URL+"/management/token",isArray:!1,params:params},save:{url:$rootScope.urls().DATA_URL+"/"+params.orgname+"/"+params.appname,method:"PUT",isArray:!1,params:params}})},httpPost:function(url,callback,payload,headers){var accessToken=getAccessToken();payload?payload.access_token=accessToken:payload={access_token:accessToken},headers||(headers={Bearer:accessToken}),$http({method:"POST",url:url,data:payload,headers:headers}).success(function(data){callback(data)}).error(function(data,status,headers,config){reportError(data,config),callback(data)})}}}),AppServices.Directives.directive("ngFocus",["$parse",function($parse){return function(scope,element,attr){var fn=$parse(attr.ngFocus);element.bind("focus",function(event){scope.$apply(function(){fn(scope,{$event:event})})})}}]),AppServices.Directives.directive("ngBlur",["$parse",function($parse){return function(scope,element,attr){var fn=$parse(attr.ngBlur);element.bind("blur",function(event){scope.$apply(function(){fn(scope,{$event:event})})})}}]),AppServices.Services.factory("utility",function(){return{keys:function(o){var a=[];for(var propertyName in o)a.push(propertyName);return a},get_gravatar:function(email,size){try{var size=size||50;return email.length?"https://secure.gravatar.com/avatar/"+MD5(email)+"?s="+size:"https://apigee.com/usergrid/img/user_profile.png"}catch(e){return"https://apigee.com/usergrid/img/user_profile.png"}},get_qs_params:function(){var queryParams={};if(window.location.search)for(var params=window.location.search.slice(1).split("&"),i=0;i<params.length;i++){var tmp=params[i].split("=");queryParams[tmp[0]]=unescape(tmp[1])}return queryParams},safeApply:function(fn){var phase=this.$root.$$phase;"$apply"==phase||"$digest"==phase?fn&&"function"==typeof fn&&fn():this.$apply(fn)}}}),AppServices.Directives.directive("ugValidate",["$rootScope",function(){return{scope:!0,restrict:"A",require:"ng-model",replace:!0,link:function(scope,element,attrs,ctrl){var validate=function(){var id=element.attr("id"),validator=id+"-validator",title=element.attr("title");if(title=title&&title.length?title:"Please enter data",$("#"+validator).remove(),ctrl.$valid)element.removeClass("has-error"),$("#"+validator).remove();else{var validatorElem='<div id="'+validator+'"><span  class="validator-error-message">'+title+"</span></div>";$("#"+id).after(validatorElem),element.addClass("has-error")}},firing=!1;element.bind("blur",function(){validate(scope,element,attrs,ctrl)}).bind("input",function(){firing||(firing=!0,setTimeout(function(){validate(scope,element,attrs,ctrl),firing=!1},500))})}}}]),AppServices.Controllers.controller("GroupsActivitiesCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.activitiesSelected="active",$rootScope.selectedGroup?($rootScope.selectedGroup.activities=[],void $rootScope.selectedGroup.getActivities(function(err){err||$rootScope.$$phase||$rootScope.$apply()})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope,$location,$route){$scope.groupsCollection={},$rootScope.selectedGroup={},$scope.previous_display="none",$scope.next_display="none",$scope.hasGroups=!1,$scope.newGroup={path:"",title:""},ug.getGroups(),$scope.currentGroupsPage={},$scope.selectGroupPage=function(route){$scope.currentGroupsPage.template=$route.routes[route].templateUrl,$scope.currentGroupsPage.route=route},$scope.newGroupDialog=function(modalId){$scope.newGroup.path&&$scope.newGroup.title?(ug.createGroup($scope.removeFirstSlash($scope.newGroup.path),$scope.newGroup.title),$scope.hideModal(modalId),$scope.newGroup={path:"",title:""}):$rootScope.$broadcast("alert","error","Missing required information.")},$scope.deleteGroupsDialog=function(modalId){$scope.deleteEntities($scope.groupsCollection,"group-deleted","error deleting group"),$scope.hideModal(modalId),$scope.newGroup={path:"",title:""}},$scope.$on("group-deleted",function(){$rootScope.$broadcast("alert","success","Group deleted successfully.")}),$scope.$on("group-deleted-error",function(){ug.getGroups()}),$scope.$on("groups-create-success",function(){$rootScope.$broadcast("alert","success","Group created successfully.")}),$scope.$on("groups-create-error",function(){$rootScope.$broadcast("alert","error","Error creating group. Make sure you don't have spaces in the path.")}),$scope.$on("groups-received",function(event,groups){$scope.groupBoxesSelected=!1,$scope.groupsCollection=groups,$scope.newGroup.path="",$scope.newGroup.title="",!(groups._list.length>0)||$rootScope.selectedGroup._data&&groups._list.some(function(group){return $rootScope.selectedGroup._data.uuid===group._data.uuid})||$scope.selectGroup(groups._list[0]._data.uuid),$scope.hasGroups=groups._list.length>0,$scope.received=!0,$scope.checkNextPrev(),$scope.applyScope()}),$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.groupsCollection.hasPreviousPage()&&($scope.previous_display="block"),$scope.groupsCollection.hasNextPage()&&($scope.next_display="block")},$scope.selectGroup=function(uuid){$rootScope.selectedGroup=$scope.groupsCollection.getEntityByUUID(uuid),$scope.currentGroupsPage.template="groups/groups-details.html",$scope.currentGroupsPage.route="/groups/details",$rootScope.$broadcast("group-selection-changed",$rootScope.selectedGroup)},$scope.getPrevious=function(){$scope.groupsCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$scope.groupsCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.$on("group-deleted",function(){$route.reload(),$scope.master=""})}]),AppServices.Controllers.controller("GroupsDetailsCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){var selectedGroup=$rootScope.selectedGroup.clone();return $scope.detailsSelected="active",$scope.json=selectedGroup._json||selectedGroup._data.stringifyJSON(),$scope.group=selectedGroup._data,$scope.group.path=0!=$scope.group.path.indexOf("/")?"/"+$scope.group.path:$scope.group.path,$scope.group.title=$scope.group.title,$rootScope.selectedGroup?($scope.$on("group-selection-changed",function(evt,selectedGroup){$scope.group.path=0!=selectedGroup._data.path.indexOf("/")?"/"+selectedGroup._data.path:selectedGroup._data.path,$scope.group.title=selectedGroup._data.title,$scope.detailsSelected="active",$scope.json=selectedGroup._json||selectedGroup._data.stringifyJSON()}),void($rootScope.saveSelectedGroup=function(){$rootScope.selectedGroup._data.title=$scope.group.title,$rootScope.selectedGroup._data.path=$scope.removeFirstSlash($scope.group.path),$rootScope.selectedGroup.save(function(err){err?$rootScope.$broadcast("alert","error","error saving group"):$rootScope.$broadcast("alert","success","group saved")})})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsMembersCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.membersSelected="active",$scope.previous_display="none",$scope.next_display="none",$scope.user="",$scope.master="",$scope.hasMembers=!1,ug.getUsersTypeAhead(),$scope.usersTypeaheadValues=[],$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.applyScope()}),$scope.addGroupToUserDialog=function(modalId){if($scope.user){var path=$rootScope.selectedGroup.get("path");ug.addUserToGroup($scope.user.uuid,path),$scope.user="",$scope.hideModal(modalId)}else $rootScope.$broadcast("alert","error","Please select a user.")},$scope.removeUsersFromGroupDialog=function(modalId){$scope.deleteEntities($scope.groupsCollection.users,"group-update-received","Error removing user from group"),$scope.hideModal(modalId)},$scope.get=function(){if($rootScope.selectedGroup.get){var options={type:"groups/"+$rootScope.selectedGroup.get("path")+"/users"};$scope.groupsCollection.addCollection("users",options,function(err){$scope.groupMembersSelected=!1,err?$rootScope.$broadcast("alert","error","error getting users for group"):($scope.hasMembers=$scope.groupsCollection.users._list.length>0,$scope.checkNextPrev(),$scope.applyScope())})}},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.groupsCollection.users.hasPreviousPage()&&($scope.previous_display="block"),$scope.groupsCollection.users.hasNextPage()&&($scope.next_display="block")},$rootScope.selectedGroup?($scope.get(),$scope.getPrevious=function(){$scope.groupsCollection.users.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of users"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$scope.getNext=function(){$scope.groupsCollection.users.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of users"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$scope.$on("group-update-received",function(){$scope.get()}),void $scope.$on("user-added-to-group-received",function(){$scope.get()})):void $location.path("/groups")}]),AppServices.Controllers.controller("GroupsRolesCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.rolesSelected="active",$scope.roles_previous_display="none",$scope.roles_next_display="none",$scope.name="",$scope.master="",$scope.hasRoles=!1,$scope.hasPermissions=!1,$scope.permissions={},$scope.addGroupToRoleDialog=function(modalId){if($scope.name){var path=$rootScope.selectedGroup.get("path");ug.addGroupToRole(path,$scope.name),$scope.hideModal(modalId),$scope.name=""}else $rootScope.$broadcast("alert","error","You must specify a role name.")},$scope.leaveRoleDialog=function(modalId){for(var path=$rootScope.selectedGroup.get("path"),roles=$scope.groupsCollection.roles._list,i=0;i<roles.length;i++)roles[i].checked&&ug.removeUserFromGroup(path,roles[i]._data.name);$scope.hideModal(modalId)},$scope.addGroupPermissionDialog=function(modalId){if($scope.permissions.path){var permission=$scope.createPermission(null,null,$scope.removeFirstSlash($scope.permissions.path),$scope.permissions),path=$rootScope.selectedGroup.get("path");ug.newGroupPermission(permission,path),$scope.hideModal(modalId),$scope.permissions&&($scope.permissions={})}else $rootScope.$broadcast("alert","error","You must specify a name for the permission.")},$scope.deleteGroupPermissionDialog=function(modalId){for(var path=$rootScope.selectedGroup.get("path"),permissions=$rootScope.selectedGroup.permissions,i=0;i<permissions.length;i++)permissions[i].checked&&ug.deleteGroupPermission(permissions[i].perm,path);$scope.hideModal(modalId)},$scope.resetNextPrev=function(){$scope.roles_previous_display="none",$scope.roles_next_display="none",$scope.permissions_previous_display="none",$scope.permissions_next_display="none"},$scope.resetNextPrev(),$scope.checkNextPrevRoles=function(){$scope.resetNextPrev(),$scope.groupsCollection.roles.hasPreviousPage()&&($scope.roles_previous_display="block"),$scope.groupsCollection.roles.hasNextPage()&&($scope.roles_next_display="block")},$scope.checkNextPrevPermissions=function(){$scope.groupsCollection.permissions.hasPreviousPage()&&($scope.permissions_previous_display="block"),$scope.groupsCollection.permissions.hasNextPage()&&($scope.permissions_next_display="block")},$scope.getRoles=function(){var path=$rootScope.selectedGroup.get("path"),options={type:"groups/"+path+"/roles"};$scope.groupsCollection.addCollection("roles",options,function(err){$scope.groupRoleSelected=!1,err?$rootScope.$broadcast("alert","error","error getting roles for group"):($scope.hasRoles=$scope.groupsCollection.roles._list.length>0,$scope.checkNextPrevRoles(),$scope.applyScope())})},$scope.getPermissions=function(){$rootScope.selectedGroup.permissions=[],$rootScope.selectedGroup.getPermissions(function(err){$scope.groupPermissionsSelected=!1,$scope.hasPermissions=$scope.selectedGroup.permissions.length,err||$scope.applyScope()})},$scope.getPreviousRoles=function(){$scope.groupsCollection.roles.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of roles"),$scope.checkNextPrevRoles(),$scope.applyScope()})},$scope.getNextRoles=function(){$scope.groupsCollection.roles.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of roles"),$scope.checkNextPrevRoles(),$scope.applyScope()})},$scope.getPreviousPermissions=function(){$scope.groupsCollection.permissions.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of permissions"),$scope.checkNextPrevPermissions(),$scope.applyScope()})},$scope.getNextPermissions=function(){$scope.groupsCollection.permissions.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of permissions"),$scope.checkNextPrevPermissions(),$scope.applyScope()})},$scope.$on("role-update-received",function(){$scope.getRoles()}),$scope.$on("permission-update-received",function(){$scope.getPermissions()}),$scope.$on("groups-received",function(evt,data){$scope.groupsCollection=data,$scope.getRoles(),$scope.getPermissions()}),$rootScope.selectedGroup?(ug.getRolesTypeAhead(),void ug.getGroups()):void $location.path("/groups")}]),AppServices.Controllers.controller("ForgotPasswordCtrl",["ug","$scope","$rootScope","$location","$sce","utility",function(ug,$scope,$rootScope,$location,$sce){$rootScope.activeUI&&$location.path("/"),$scope.forgotPWiframeURL=$sce.trustAsResourceUrl($scope.apiUrl+"/management/users/resetpw")}]),AppServices.Controllers.controller("LoginCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){$scope.loading=!1,$scope.login={},$scope.activation={},$scope.requiresDeveloperKey=$scope.options.client.requiresDeveloperKey||!1,!$scope.requiresDeveloperKey&&$scope.options.client.apiKey&&ug.setClientProperty("developerkey",$scope.options.client.apiKey),$rootScope.gotoForgotPasswordPage=function(){$location.path("/forgot-password")},$rootScope.gotoSignUp=function(){$location.path("/register")},$scope.login=function(){var username=$scope.login.username,password=$scope.login.password;$scope.loginMessage="",$scope.loading=!0,$scope.requiresDeveloperKey&&ug.setClientProperty("developerkey",$scope.login.developerkey),ug.orgLogin(username,password)},$scope.$on("loginFailed",function(){$scope.loading=!1,ug.setClientProperty("developerkey",null),$scope.loginMessage="Error: the username / password combination was not valid",$scope.applyScope()}),$scope.logout=function(){ug.logout(),ug.setClientProperty("developerkey",null),$scope.use_sso?window.location=$rootScope.urls().LOGOUT_URL+"?redirect=no&callback="+encodeURIComponent($location.absUrl().split("?")[0]):($location.path("/login"),$scope.applyScope())},$rootScope.$on("userNotAuthenticated",function(){"/forgot-password"!==$location.path()&&($location.path("/login"),$scope.logout()),$scope.applyScope()}),$scope.$on("loginSuccesful",function(){$scope.loading=!1,$scope.login={},$location.path("/login"===$rootScope.currentPath||"/login/loading"===$rootScope.currentPath||"undefined"==typeof $rootScope.currentPath?"/org-overview":$rootScope.currentPath),$scope.applyScope()}),$scope.resendActivationLink=function(modalId){var id=$scope.activation.id;ug.resendActivationLink(id),$scope.activation={},$scope.hideModal(modalId)},$scope.$on("resend-activate-success",function(){$scope.activationId="",$scope.$apply(),$rootScope.$broadcast("alert","success","Activation link sent successfully.")}),$scope.$on("resend-activate-error",function(){$rootScope.$broadcast("alert","error","Activation link failed to send.")})}]),AppServices.Controllers.controller("LogoutCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){ug.logout(),$scope.use_sso?window.location=$rootScope.urls().LOGOUT_URL+"?callback="+encodeURIComponent($location.absUrl().split("?")[0]):($location.path("/login"),$scope.applyScope())}]),AppServices.Controllers.controller("RegisterCtrl",["ug","$scope","$rootScope","$routeParams","$location","utility",function(ug,$scope,$rootScope,$routeParams,$location){$rootScope.activeUI&&$location.path("/");var init=function(){$scope.registeredUser={}};init(),$scope.cancel=function(){$location.path("/")},$scope.register=function(){var user=$scope.registeredUser.clone();user.password===user.confirmPassword?ug.signUpUser(user.orgName,user.userName,user.name,user.email,user.password):$rootScope.$broadcast("alert","error","Passwords do not match."+name)},$scope.$on("register-error",function(event,data){$scope.signUpSuccess=!1,$rootScope.$broadcast("alert","error","Error registering: "+(data&&data.error_description?data.error_description:name))}),$scope.$on("register-success",function(){$scope.registeredUser={},$scope.signUpSuccess=!0,init(),$scope.$apply()})}]),AppServices.Directives.directive("menu",["$location","$rootScope","$log",function($location,$rootScope,$log){return{link:function(scope,lElement,attrs){function setActiveElement(ele,locationPath,$rootScope,isParentClick){if(ele){ele.removeClass("active");var menuItem,parentMenuItem,newActiveElement=ele.parent().find('a[href*="#!'+locationPath+'"]');if(0===newActiveElement.length)parentMenuItem=ele;else{menuItem=newActiveElement.parent(),menuItem.hasClass("option")?parentMenuItem=menuItem[0]:1===menuItem.size()?(parentMenuItem=newActiveElement.parent().parent().parent(),parentMenuItem.addClass("active")):(parentMenuItem=menuItem[0],menuItem=menuItem[1]);try{var menuItemCompare=parentMenuItem[0]||parentMenuItem;ele[0]!==menuItemCompare&&isParentClick&&ele.find("ul")[0]&&(ele.find("ul")[0].style.height=0);var subMenuSizer=angular.element(parentMenuItem).find(".nav-list")[0];if(subMenuSizer){var heightChecker,clientHeight=subMenuSizer.getAttribute("data-height"),heightCounter=1;clientHeight||heightChecker?(menuItem.addClass("active"),subMenuSizer.style.height=clientHeight+"px"):heightChecker=setInterval(function(){var tempHeight=subMenuSizer.getAttribute("data-height")||subMenuSizer.clientHeight;heightCounter=subMenuSizer.clientHeight,0===heightCounter&&(heightCounter=1),"string"==typeof tempHeight&&(tempHeight=parseInt(tempHeight,10)),tempHeight>0&&heightCounter===tempHeight&&(subMenuSizer.setAttribute("data-height",tempHeight),menuItem.addClass("active"),subMenuSizer.style.height=tempHeight+"px",clearInterval(heightChecker)),heightCounter=tempHeight},20),$rootScope.menuExecute=!0}else menuItem.addClass("active")}catch(e){$log.error("Problem calculating size of menu",e)}}return{menuitem:menuItem,parentMenuItem:parentMenuItem}}}function setupMenuState(){if(menuContext=attrs.menu,parentMenuItems=lElement.find("li.option"),0!==lElement.find("li.option.active").length&&($rootScope[menuContext+"Parent"]=lElement.find("li.option.active")),activeParentElement=$rootScope[menuContext+"Parent"]||null,activeParentElement&&(activeParentElement=angular.element(activeParentElement)),menuItems=lElement.find("li.option li"),locationPath=$location.path(),activeParentElement&&(activeMenuElement=angular.element(activeParentElement),activeMenuElement=activeMenuElement.find("li.active"),activeMenuElement.removeClass("active"),activeParentElement.find("a")[0])){subMenuContext=activeParentElement.find("a")[0].href.split("#!")[1];var tempMenuContext=subMenuContext.split("/");subMenuContext="/"+tempMenuContext[1],tempMenuContext.length>2&&(subMenuContext+="/"+tempMenuContext[2])}var activeElements;""!==locationPath&&-1===locationPath.indexOf(subMenuContext)?(activeElements=setActiveElement(activeParentElement,locationPath,scope),activeElements&&($rootScope[menuContext+"Parent"]=activeElements.parentMenuItem,$rootScope[menuContext+"Menu"]=activeElements.menuitem)):setActiveElement(activeParentElement,subMenuContext,scope)}var menuContext,parentMenuItems,activeParentElement,menuItems,activeMenuElement,locationPath,subMenuContext,bound=!1;setTimeout(setupMenuState,500),scope.$on("$routeChangeSuccess",function(){setTimeout(function(){setupMenuState(),bound||(bound=!0,parentMenuItems.bind("click",function(cevent){var previousParentSelection=angular.element($rootScope[menuContext+"Parent"]),targetPath=angular.element(cevent.currentTarget).find("> a")[0].href.split("#!")[1];previousParentSelection.find(".nav > li").removeClass("active");var activeElements=setActiveElement(previousParentSelection,targetPath,scope,!0);$rootScope[menuContext+"Parent"]=activeElements.parentMenuItem,$rootScope[menuContext+"Menu"]=activeElements.menuitem,scope.$broadcast("menu-selection")}),menuItems.bind("click",function(cevent){var previousMenuSelection=$rootScope[menuContext+"Menu"],targetElement=cevent.currentTarget;previousMenuSelection!==targetElement&&(previousMenuSelection?angular.element(previousMenuSelection).removeClass("active"):activeMenuElement.removeClass("active"),scope.$apply(function(){angular.element($rootScope[menuContext]).addClass("active")}),$rootScope[menuContext+"Menu"]=targetElement,angular.element($rootScope[menuContext+"Parent"]).find("a")[0].setAttribute("href",angular.element(cevent.currentTarget).find("a")[0].href))}))},500)})}}}]),AppServices.Directives.directive("timeFilter",["$location","$routeParams","$rootScope",function($location,$routeParams,$rootScope){return{restrict:"A",transclude:!0,template:'<li ng-repeat="time in timeFilters" class="filterItem"><a ng-click="changeTimeFilter(time)">{{time.label}}</a></li>',link:function(scope,lElement,attrs){var menuContext=attrs.filter;scope.changeTimeFilter=function(newTime){$rootScope.selectedtimefilter=newTime,$routeParams.timeFilter=newTime.value},lElement.bind("click",function(cevent){menuBindClick(scope,lElement,cevent,menuContext)})}}}]),AppServices.Directives.directive("chartFilter",["$location","$routeParams","$rootScope",function($location,$routeParams,$rootScope){return{restrict:"ACE",scope:"=",template:'<li ng-repeat="chart in chartCriteriaOptions" class="filterItem"><a ng-click="changeChart(chart)">{{chart.chartName}}</a></li>',link:function(scope,lElement,attrs){var menuContext=attrs.filter;scope.changeChart=function(newChart){$rootScope.selectedChartCriteria=newChart,$routeParams.currentCompare="NOW",$routeParams[newChart.type+"ChartFilter"]=newChart.chartCriteriaId},lElement.bind("click",function(cevent){menuBindClick(scope,lElement,cevent,menuContext)})}}}]),AppServices.Directives.directive("orgMenu",["$location","$routeParams","$rootScope","ug",function($location,$routeParams,$rootScope,ug){return{restrict:"ACE",scope:"=",replace:!0,templateUrl:"menus/orgMenu.html",link:function(scope){scope.orgChange=function(orgName){var oldOrg=ug.get("orgName");ug.set("orgName",orgName),$rootScope.currentOrg=orgName,$location.path("/org-overview"),$rootScope.$broadcast("org-changed",oldOrg,orgName)},scope.$on("change-org",function(args,org){scope.orgChange(org)})}}}]),AppServices.Directives.directive("appMenu",["$location","$routeParams","$rootScope","ug",function($location,$routeParams,$rootScope,ug){return{restrict:"ACE",scope:"=",replace:!0,templateUrl:"menus/appMenu.html",link:function(scope){scope.myApp={};
 var bindApplications=function(applications){scope.applications=applications;var key,size=0;for(key in applications)applications.hasOwnProperty(key)&&size++;scope.hasApplications=Object.keys(applications).length>0,scope.myApp.currentApp||($rootScope.currentApp=scope.myApp.currentApp=ug.get("appName"));var hasApplications=Object.keys(applications).length>0;applications[scope.myApp.currentApp]||($rootScope.currentApp=scope.myApp.currentApp=hasApplications?applications[Object.keys(applications)[0]].name:""),setTimeout(function(){scope.hasApplications?scope.hideModal("newApplication"):scope.showModal("newApplication")},1e3)};scope.appChange=function(newApp){var oldApp=scope.myApp.currentApp;ug.set("appName",newApp),$rootScope.currentApp=scope.myApp.currentApp=newApp,$rootScope.$broadcast("app-changed",oldApp,newApp)},scope.$on("app-initialized",function(){bindApplications(scope.applications),scope.applyScope()}),scope.$on("applications-received",function(event,applications){bindApplications(applications),scope.applyScope()}),scope.$on("applications-created",function(evt,applications,name){$rootScope.$broadcast("alert","info",'New application "'+scope.newApp.name+'" created!'),scope.appChange(name),$location.path("/getting-started/setup"),scope.newApp.name=""}),scope.newApplicationDialog=function(modalId){var createNewApp=function(){var found=!1;if(scope.applications)for(var app in scope.applications)if(app===scope.newApp.name.toLowerCase()){found=!0;break}return scope.newApp.name&&!found?ug.createApplication(scope.newApp.name):$rootScope.$broadcast("alert","error",found?"Application already exists.":"You must specify a name."),found};scope.hasCreateApplicationError=createNewApp(),scope.hasCreateApplicationError||scope.applyScope(),scope.hideModal(modalId)},scope.applications&&bindApplications(scope.applications)}}}]),AppServices.Controllers.controller("OrgOverviewCtrl",["ug","help","$scope","$rootScope","$routeParams","$location",function(ug,help,$scope,$rootScope){var init=function(oldOrg){var orgName=$scope.currentOrg,orgUUID="";return orgName&&$scope.organizations[orgName]?(orgUUID=$scope.organizations[orgName].uuid,$scope.currentOrganization={name:orgName,uuid:orgUUID},$scope.applications=[{name:"...",uuid:"..."}],$scope.orgAdministrators=[],$scope.activities=[],$scope.orgAPICredentials={client_id:"...",client_secret:"..."},$scope.admin={},$scope.newApp={},ug.getApplications(),ug.getOrgCredentials(),ug.getAdministrators(),void ug.getFeed()):(console.error("Your current user is not authenticated for this organization."),void setTimeout(function(){$rootScope.$broadcast("change-org",oldOrg||$scope.organizations[Object.keys($scope.organizations)[0]].name)},1e3))};$scope.$on("org-changed",function(args,oldOrg){init(oldOrg)}),$scope.$on("app-initialized",function(){init()}),$scope.regenerateCredentialsDialog=function(modalId){$scope.orgAPICredentials={client_id:"regenerating...",client_secret:"regenerating..."},ug.regenerateOrgCredentials(),$scope.hideModal(modalId)},$scope.newAdministratorDialog=function(modalId){$scope.admin.email?(ug.createAdministrator($scope.admin.email),$scope.hideModal(modalId),$rootScope.$broadcast("alert","success","Administrator created successfully.")):$rootScope.$broadcast("alert","error","You must specify an email address.")},$scope.$on("applications-received",function(event,applications){$scope.applications=applications,$scope.applyScope()}),$scope.$on("administrators-received",function(event,administrators){$scope.orgAdministrators=administrators,$scope.applyScope()}),$scope.$on("org-creds-updated",function(event,credentials){$scope.orgAPICredentials=credentials,$scope.applyScope()}),$scope.$on("feed-received",function(event,feed){$scope.activities=feed,$scope.applyScope()}),$scope.activeUI&&init()}]),AppServices.Controllers.controller("AccountCtrl",["$scope","$rootScope","ug","utility","$route",function($scope,$rootScope,ug,utility,$route){$scope.currentAccountPage={};var route=$scope.use_sso?"/profile/organizations":"/profile/profile";$scope.currentAccountPage.template=$route.routes[route].templateUrl,$scope.currentAccountPage.route=route,$scope.applyScope(),$scope.selectAccountPage=function(route){$scope.currentAccountPage.template=$route.routes[route].templateUrl,$scope.currentAccountPage.route=route}}]),AppServices.Controllers.controller("OrgCtrl",["$scope","$rootScope","ug","utility",function($scope,$rootScope,ug){$scope.org={},$scope.currentOrgPage={};var createOrgsArray=function(){var orgs=[];for(var org in $scope.organizations)orgs.push($scope.organizations[org]);$scope.orgs=orgs,$scope.selectOrganization(orgs[0])};$scope.selectOrganization=function(org){org.usersArray=[];for(var user in org.users)org.usersArray.push(org.users[user]);org.applicationsArray=[];for(var app in org.applications)org.applicationsArray.push({name:app.replace(org.name+"/",""),uuid:org.applications[app]});return $scope.selectedOrg=org,$scope.applyScope(),!1},$scope.addOrganization=function(modalId){$scope.hideModal(modalId),ug.addOrganization($rootScope.currentUser,$scope.org.name)},$scope.$on("user-add-org-success",function(){$scope.org={},$scope.applyScope(),ug.reAuthenticate($rootScope.userEmail,"org-reauthenticate"),$rootScope.$broadcast("alert","success","successfully added the new organization.")}),$scope.$on("user-add-org-error",function(){$rootScope.$broadcast("alert","error","An error occurred attempting to add the organization.")}),$scope.$on("org-reauthenticate-success",function(){createOrgsArray(),$scope.applyScope()}),$scope.doesOrgHaveUsers=function(org){var test=org.usersArray.length>1;return test},$scope.leaveOrganization=function(org){ug.leaveOrganization($rootScope.currentUser,org)},$scope.$on("user-leave-org-success",function(){ug.reAuthenticate($rootScope.userEmail,"org-reauthenticate"),$rootScope.$broadcast("alert","success","User has left the selected organization(s).")}),$scope.$on("user-leave-org-error",function(){$rootScope.$broadcast("alert","error","An error occurred attempting to leave the selected organization(s).")}),createOrgsArray()}]),AppServices.Controllers.controller("ProfileCtrl",["$scope","$rootScope","ug","utility",function($scope,$rootScope,ug){$scope.loading=!1,$scope.saveUserInfo=function(){$scope.loading=!0,ug.updateUser($scope.user)},$scope.$on("user-update-error",function(){$scope.loading=!1,$rootScope.$broadcast("alert","error","Error updating user info")}),$scope.$on("user-update-success",function(){$scope.loading=!1,$rootScope.$broadcast("alert","success","Profile information updated successfully!"),$scope.user.oldPassword&&"undefined"!=$scope.user.newPassword&&ug.resetUserPassword($scope.user)}),$scope.$on("user-reset-password-success",function(){$rootScope.$broadcast("alert","success","Password updated successfully!"),$scope.user=$rootScope.currentUser.clone()}),$scope.$on("app-initialized",function(){$scope.user=$rootScope.currentUser.clone()}),$rootScope.activeUI&&($scope.user=$rootScope.currentUser.clone(),$scope.applyScope())}]),AppServices.Controllers.controller("RolesCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope,$location,$route){$scope.rolesCollection={},$rootScope.selectedRole={},$scope.previous_display="none",$scope.next_display="none",$scope.roles_check_all="",$scope.rolename="",$scope.hasRoles=!1,$scope.newrole={},$scope.currentRolesPage={},$scope.selectRolePage=function(route){$scope.currentRolesPage.template=$route.routes[route].templateUrl,$scope.currentRolesPage.route=route},ug.getRoles(),$scope.newRoleDialog=function(modalId){$scope.newRole.name?(ug.createRole($scope.newRole.name,$scope.newRole.title),$rootScope.$broadcast("alert","success","Role created successfully."),$scope.hideModal(modalId),$scope.newRole={}):$rootScope.$broadcast("alert","error","You must specify a role name.")},$scope.deleteRoleDialog=function(modalId){$scope.deleteEntities($scope.rolesCollection,"role-deleted","error deleting role"),$scope.hideModal(modalId)},$scope.$on("role-deleted",function(){$rootScope.$broadcast("alert","success","Role deleted successfully."),$scope.master="",$scope.newRole={}}),$scope.$on("role-deleted-error",function(){ug.getRoles()}),$scope.$on("roles-received",function(event,roles){$scope.rolesSelected=!1,$scope.rolesCollection=roles,$scope.newRole={},roles._list.length>0&&($scope.hasRoles=!0,$scope.selectRole(roles._list[0]._data.uuid)),$scope.checkNextPrev(),$scope.applyScope()}),$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.rolesCollection.hasPreviousPage()&&($scope.previous_display="block"),$scope.rolesCollection.hasNextPage()&&($scope.next_display="block")},$scope.selectRole=function(uuid){$rootScope.selectedRole=$scope.rolesCollection.getEntityByUUID(uuid),$scope.currentRolesPage.template="roles/roles-settings.html",$scope.currentRolesPage.route="/roles/settings",$rootScope.$broadcast("role-selection-changed",$rootScope.selectedRole)},$scope.getPrevious=function(){$scope.rolesCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of roles"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$scope.rolesCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of roles"),$scope.checkNextPrev(),$scope.applyScope()})}}]),AppServices.Controllers.controller("RolesGroupsCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.groupsSelected="active",$scope.previous_display="none",$scope.next_display="none",$scope.path="",$scope.hasGroups=!1,ug.getGroupsTypeAhead(),$scope.groupsTypeaheadValues=[],$scope.$on("groups-typeahead-received",function(event,groups){$scope.groupsTypeaheadValues=groups,$scope.applyScope()}),$scope.addRoleToGroupDialog=function(modalId){if($scope.path){var name=$rootScope.selectedRole._data.uuid;ug.addGroupToRole($scope.path,name),$scope.hideModal(modalId),$scope.path="",$scope.title=""}else $rootScope.$broadcast("alert","error","You must specify a group.")},$scope.setRoleModal=function(group){$scope.path=group.path,$scope.title=group.title},$scope.removeGroupFromRoleDialog=function(modalId){for(var roleName=$rootScope.selectedRole._data.uuid,groups=$scope.rolesCollection.groups._list,i=0;i<groups.length;i++)groups[i].checked&&ug.removeUserFromGroup(groups[i]._data.path,roleName);$scope.hideModal(modalId)},$scope.get=function(){var options={type:"roles/"+$rootScope.selectedRole._data.name+"/groups",qs:{ql:"order by title"}};$scope.rolesCollection.addCollection("groups",options,function(err){$scope.roleGroupsSelected=!1,err?$rootScope.$broadcast("alert","error","error getting groups for role"):($scope.hasGroups=$scope.rolesCollection.groups._list.length,$scope.checkNextPrev(),$scope.applyScope())})},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.rolesCollection.groups.hasPreviousPage()&&($scope.previous_display="block"),$scope.rolesCollection.groups.hasNextPage()&&($scope.next_display="block")},$rootScope.selectedRole?($scope.get(),$scope.getPrevious=function(){$scope.rolesCollection.groups.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$scope.rolesCollection.groups.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of groups"),$scope.checkNextPrev(),$scope.applyScope()})},void $scope.$on("role-update-received",function(){$scope.get()})):void $location.path("/roles")}]),AppServices.Controllers.controller("RolesSettingsCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){$scope.settingsSelected="active",$scope.hasSettings=!1;var init=function(){return $rootScope.selectedRole?($scope.permissions={},$scope.permissions.path="",$scope.permissions&&($scope.permissions.getPerm=!1,$scope.permissions.postPerm=!1,$scope.permissions.putPerm=!1,$scope.permissions.deletePerm=!1),$scope.role=$rootScope.selectedRole.clone(),$scope.getPermissions(),$scope.applyScope(),void 0):void $location.path("/roles")};$scope.$on("role-selection-changed",function(){init()}),$scope.$on("permission-update-received",function(){$scope.getPermissions()}),$scope.$on("role-selection-changed",function(){$scope.getPermissions()}),$scope.addRolePermissionDialog=function(modalId){if($scope.permissions.path){var permission=$scope.createPermission(null,null,$scope.permissions.path,$scope.permissions),name=$scope.role._data.name;ug.newRolePermission(permission,name),$scope.hideModal(modalId),init()}else $rootScope.$broadcast("alert","error","You must specify a name for the permission.")},$scope.deleteRolePermissionDialog=function(modalId){for(var name=$scope.role._data.name,permissions=$scope.role.permissions,i=0;i<permissions.length;i++)permissions[i].checked&&ug.deleteRolePermission(permissions[i].perm,name);$scope.hideModal(modalId)},$scope.getPermissions=function(){$rootScope.selectedRole.getPermissions(function(err,data){$scope.role.permissions=$rootScope.selectedRole.permissions.clone(),$scope.permissionsSelected=!1,err?$rootScope.$broadcast("alert","error","error getting permissions"):($scope.hasSettings=data.data.length,$scope.applyScope())})},$scope.updateInactivity=function(){$rootScope.selectedRole._data.inactivity=$scope.role._data.inactivity,$rootScope.selectedRole.save(function(err){err?$rootScope.$broadcast("alert","error","error saving inactivity value"):($rootScope.$broadcast("alert","success","inactivity value was updated"),init())})},init()}]),AppServices.Controllers.controller("RolesUsersCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.usersSelected="active",$scope.previous_display="none",$scope.next_display="none",$scope.user={},$scope.master="",$scope.hasUsers=!1,ug.getUsersTypeAhead(),$scope.usersTypeaheadValues=[],$scope.$on("users-typeahead-received",function(event,users){$scope.usersTypeaheadValues=users,$scope.applyScope()}),$scope.addRoleToUserDialog=function(modalId){if($scope.user.uuid){var roleName=$rootScope.selectedRole._data.uuid;ug.addUserToRole($scope.user.uuid,roleName),$scope.hideModal(modalId),$scope.user=null}else $rootScope.$broadcast("alert","error","You must specify a user.")},$scope.removeUsersFromGroupDialog=function(modalId){for(var roleName=$rootScope.selectedRole._data.uuid,users=$scope.rolesCollection.users._list,i=0;i<users.length;i++)users[i].checked&&ug.removeUserFromRole(users[i]._data.uuid,roleName);$scope.hideModal(modalId)},$scope.get=function(){var options={type:"roles/"+$rootScope.selectedRole._data.name+"/users"};$scope.rolesCollection.addCollection("users",options,function(err){$scope.roleUsersSelected=!1,err?$rootScope.$broadcast("alert","error","error getting users for role"):($scope.hasUsers=$scope.rolesCollection.users._list.length,$scope.checkNextPrev(),$scope.applyScope())})},$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.rolesCollection.users.hasPreviousPage()&&($scope.previous_display="block"),$scope.rolesCollection.users.hasNextPage()&&($scope.next_display="block")},$rootScope.selectedRole?($scope.get(),$scope.getPrevious=function(){$scope.rolesCollection.users.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of users"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$scope.rolesCollection.users.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of users"),$scope.checkNextPrev(),$scope.applyScope()})},void $scope.$on("role-update-received",function(){$scope.get()})):void $location.path("/roles")}]),AppServices.Controllers.controller("ShellCtrl",["ug","$scope","$log","$sce",function(ug,$scope,$log,$sce){function encodePathString(path,returnParams){for(var i=0,segments=new Array,payload=null;i<path.length;){var c=path.charAt(i);if("{"!=c)if("/"!=c){if(" "==c){i++;for(var payload_start=i;i<path.length;)c=path.charAt(i),i++;if(i>payload_start){var json=path.substring(payload_start,i).trim();payload=JSON.parse(json)}break}i++}else{i++;for(var segment_start=i;i<path.length&&(c=path.charAt(i)," "!=c&&"/"!=c&&"{"!=c);)i++;if(i>segment_start){var segment=path.substring(segment_start,i);segments.push(segment)}}else{var bracket_start=i;i++;for(var bracket_count=1;i<path.length&&bracket_count>0;)c=path.charAt(i),"{"==c?bracket_count++:"}"==c&&bracket_count--,i++;if(i>bracket_start){var segment=path.substring(bracket_start,i);segments.push(JSON.parse(segment))}}}var newPath="";for(i=0;i<segments.length;i++){var segment=segments[i];if("string"==typeof segment)newPath+="/"+segment;else{if(i==segments.length-1){if(returnParams)return{path:newPath,params:segment,payload:payload};newPath+="?"}else newPath+=";";newPath+=encodeParams(segment)}}return returnParams?{path:newPath,params:null,payload:payload}:newPath}function encodeParams(params){var tail=[];if(params instanceof Array)for(i in params){var item=params[i];item instanceof Array&&item.length>1&&tail.push(item[0]+"="+encodeURIComponent(item[1]))}else for(var key in params)if(params.hasOwnProperty(key)){var value=params[key];if(value instanceof Array)for(i in value){var item=value[i];tail.push(key+"="+encodeURIComponent(item))}else tail.push(key+"="+encodeURIComponent(value))}return tail.join("&")}$scope.shell={input:"",output:""},$scope.submitCommand=function(){$scope.shell.input&&$scope.shell.input.length&&handleShellCommand($scope.shell.input)};var handleShellCommand=function(s){var path="",params="",shouldScroll=!1,hasMatchLength=function(expression){var res=s.match(expression);return res&&res.length>0};try{switch(!0){case hasMatchLength(/^\s*\//):path=encodePathString(s),printLnToShell(path),ug.runShellQuery("GET",path,null);break;case hasMatchLength(/^\s*get\s*\//i):path=encodePathString(s.substring(4)),printLnToShell(path),ug.runShellQuery("GET",path,null);break;case hasMatchLength(/^\s*put\s*\//i):params=encodePathString(s.substring(4),!0),printLnToShell(params.path),ug.runShellQuery("PUT",params.path,params.payload);break;case hasMatchLength(/^\s*post\s*\//i):params=encodePathString(s.substring(5),!0),printLnToShell(params.path),ug.runShellQuery("POST",params.path,params.payload);break;case hasMatchLength(/^\s*delete\s*\//i):path=encodePathString(s.substring(7)),printLnToShell(path),ug.runShellQuery("DELETE",path,null);break;case hasMatchLength(/^\s*clear|cls\s*/i):$scope.shell.output="",shouldScroll=!0;break;case hasMatchLength(/(^\s*help\s*|\?{1,2})/i):shouldScroll=!0,printLnToShell("/&lt;path&gt; - API get request"),printLnToShell("get /&lt;path&gt; - API get request"),printLnToShell("put /&lt;path&gt; {&lt;json&gt;} - API put request"),printLnToShell("post /&lt;path&gt; {&lt;json&gt;} - API post request"),printLnToShell("delete /&lt;path&gt; - API delete request"),printLnToShell("cls, clear - clear the screen"),printLnToShell("help - show this help");break;case""===s:shouldScroll=!0,printLnToShell("ok");break;default:shouldScroll=!0,printLnToShell("<strong>syntax error!</strong>")}}catch(e){$log.error(e),printLnToShell("<strong>syntax error!</strong>")}shouldScroll&&scroll()},printLnToShell=function(s){s||(s="&nbsp;"),$scope.shell.outputhidden=s;var html='<div class="shell-output-line"><div class="shell-output-line-content">'+s+"</div></div>";html+=" ";var trustedHtml=$sce.trustAsHtml(html);$scope.shell.output+=trustedHtml.toString()};$scope.$on("shell-success",function(evt,data){printLnToShell(JSON.stringify(data,null,"  ")),scroll()}),$scope.$on("shell-error",function(evt,data){printLnToShell(JSON.stringify(data,null,"  ")),scroll()});var scroll=function(){$scope.shell.output+="<hr />",$scope.applyScope(),setTimeout(function(){var myshell=$("#shell-output");myshell.animate({scrollTop:myshell[0].scrollHeight},800)},200)}}]),angular.module("appservices").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("activities/activities.html",'<section class="row-fluid">\n  <div class="span12">\n    <div class="page-filters">\n      <h1 class="title" class="pull-left"><i class="pictogram title">&#128241;</i> Activities</h1>\n    </div>\n  </div>\n\n</section>\n<section class="row-fluid">\n  <div class="span12 tab-content">\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>Date</td>\n        <td></td>\n        <td>User</td>\n        <td>Content</td>\n        <td>Verb</td>\n        <td>UUID</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="activity in activities">\n        <td>{{formatDate(activity.created)}}</td>\n        <td class="gravatar20"> <img ng-src="{{activity.actor.picture}}"/>\n        </td>\n        <td>{{activity.actor.displayName}}</td>\n        <td>{{activity.content}}</td>\n        <td>{{activity.verb}}</td>\n        <td>{{activity.uuid}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n</section>'),$templateCache.put("app-overview/app-overview.html",'<div class="app-overview-content" >\n  <section class="row-fluid">\n\n      <page-title title=" Summary" icon="&#128241;"></page-title>\n  <section class="row-fluid">\n      <h2 class="title" id="app-overview-title">{{currentApp}}</h2>\n  </section>\n  <section class="row-fluid">\n\n    <div class="span6">\n      <chart id="appOverview"\n             chartdata="appOverview.chart"\n             type="column"></chart>\n    </div>\n\n    <div class="span6">\n      <table class="table table-striped">\n        <tr class="table-header">\n          <td>Path</td>\n          <td>Title</td>\n        </tr>\n        <tr class="zebraRows" ng-repeat="(k,v) in collections">\n          <td>{{v.title}}</td>\n          <td>{{v.count}}</td>\n        </tr>\n      </table>\n    </div>\n\n  </section>\n</div>'),$templateCache.put("app-overview/doc-includes/android.html",'<h2>1. Integrate the SDK into your project</h2>\n<p>You can integrate Apigee features into your app by including the SDK in your project.&nbsp;&nbsp;You can do one of the following:</p>\n\n<ul class="nav nav-tabs" id="myTab">\n	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n</ul>\n\n<div class="tab-content">\n	<div class="tab-pane active" id="existing_project">\n		<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n		<p>If you\'ve already got&nbsp;an Android&nbsp;project, you can integrate the&nbsp;Apigee&nbsp;SDK into your project as you normally would:</p>\n		<div id="collapse">\n			<a href="#jar_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>			\n		</div>\n		<div id="jar_collapse" class="collapse">\n			<p>Add <code>apigee-android-&lt;version&gt;.jar</code> to your class path by doing the following:</p>\n	\n			<h3>Android 4.0 (or later) projects</h3>\n			<p>Copy the jar file into the <code>/libs</code> folder in your project.</p>\n			\n			<h3>Android 3.0 (or earlier) projects</h3>\n			<ol>\n				<li>In the&nbsp;Eclipse <strong>Package Explorer</strong>, select your application\'s project folder.</li>\n				<li>Click the&nbsp;<strong>File &gt; Properties</strong>&nbsp;menu.</li>\n				<li>In the <strong>Java Build Path</strong> section, click the <strong>Libraries</strong> tab, click <strong>Add External JARs</strong>.</li>\n				<li>Browse to <code>apigee-android-&lt;version&gt;.jar</code>, then click&nbsp;<strong>Open</strong>.</li>\n				<li>Order the <code>apigee-android-&lt;version&gt;.jar</code> at the top of the class path:\n					<ol>\n						<li>In the Eclipse <strong>Package Explorer</strong>, select your application\'s project folder.</li>\n						<li>Click the&nbsp;<strong>File &gt; Properties</strong> menu.</li>\n						<li>In the properties dialog, in the&nbsp;<strong>Java Build Path</strong> section,&nbsp;click&nbsp;the <strong>Order and Export</strong>&nbsp;tab.</li>\n						<li>\n							<p><strong>IMPORTANT:</strong> Select the checkbox for <code>apigee-android-&lt;version&gt;.jar</code>, then click the <strong>Top</strong>&nbsp;button.</p>\n						</li>\n					</ol>\n				</li>\n			</ol>\n			<div class="warning">\n				<h3>Applications using Ant</h3>\n				<p>If you are using Ant to build your application, you must also copy <code>apigee-android-&lt;version&gt;.jar</code> to the <code>/libs</code> folder in your application.</p>\n			</div>\n		</div>\n	</div>\n	<div class="tab-pane" id="new_project">\n		<a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n		<p>If you don\'t have a&nbsp;project yet, you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n		<ul>\n			<li>Locate the project template in the expanded SDK. It should be at the following location:\n				<pre>&lt;sdk_root&gt;/new-project-template</pre>\n			</li>\n		</ul>\n	</div>\n</div>\n<h2>2. Update permissions in AndroidManifest.xml</h2>\n<p>Add the following Internet permissions to your application\'s <code>AndroidManifest.xml</code> file if they have not already been added. Note that with the exception of INTERNET, enabling all other permissions are optional.</p>\n<pre>\n&lt;uses-permission android:name="android.permission.INTERNET" /&gt;\n&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;\n&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;\n&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;\n&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;\n</pre>\n<h2>3. Initialize the SDK</h2>\n<p>To initialize the App Services SDK, you must instantiate the <code>ApigeeClient</code> class. There are multiple ways to handle this step, but we recommend that you do the following:</p>\n<ol>\n	<li>Subclass the <code>Application</code> class, and add an instance variable for the <code>ApigeeClient</code> to it, along with getter and setter methods.\n		<pre>\npublic class YourApplication extends Application\n{\n        \n        private ApigeeClient apigeeClient;\n        \n        public YourApplication()\n        {\n                this.apigeeClient = null;\n        }\n        \n        public ApigeeClient getApigeeClient()\n        {\n                return this.apigeeClient;\n        }\n        \n        public void setApigeeClient(ApigeeClient apigeeClient)\n        {\n                this.apigeeClient = apigeeClient;\n        }\n}			\n		</pre>\n	</li>\n	<li>Declare the <code>Application</code> subclass in your <code>AndroidManifest.xml</code>. For example:\n		<pre>\n&lt;application&gt;\n    android:allowBackup="true"\n    android:icon="@drawable/ic_launcher"\n    android:label="@string/app_name"\n    android:name=".YourApplication"\n	…\n&lt;/application&gt;			\n		</pre>\n	</li>\n	<li>Instantiate the <code>ApigeeClient</code> class in the <code>onCreate</code> method of your first <code>Activity</code> class:\n		<pre>\nimport com.apigee.sdk.ApigeeClient;\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);		\n	\n	String ORGNAME = "{{currentOrg}}";\n	String APPNAME = "{{currentApp}}";\n	\n	ApigeeClient apigeeClient = new ApigeeClient(ORGNAME,APPNAME,this.getBaseContext());\n\n	// hold onto the ApigeeClient instance in our application object.\n	YourApplication yourApp = (YourApplication) getApplication;\n	yourApp.setApigeeClient(apigeeClient);			\n}\n		</pre>\n		<p>This will make the instance of <code>ApigeeClient</code> available to your <code>Application</code> class.</p>\n	</li>\n</ol>\n<h2>4. Import additional SDK classes</h2>\n<p>The following classes will enable you to call common SDK methods:</p>\n<pre>\nimport com.apigee.sdk.data.client.DataClient; //App Services data methods\nimport com.apigee.sdk.apm.android.MonitoringClient; //App Monitoring methods\nimport com.apigee.sdk.data.client.callbacks.ApiResponseCallback; //API response handling\nimport com.apigee.sdk.data.client.response.ApiResponse; //API response object\n</pre>\n		\n<h2>5. Verify SDK installation</h2>\n\n<p>Once initialized, App Services will also automatically instantiate the <code>MonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n<p>To verify that the SDK has been properly initialized, run your app, then go to \'Monitoring\' > \'App Usage\' in the <a href="https://www.apigee.com/usergrid">App Services admin portal</a> to verify that data is being sent.</p>\n<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n\n<h2>Installation complete! Try these next steps</h2>\n<ul>\n	<li>\n		<h3><strong>Call additional SDK methods in your code</strong></h3>\n		<p>The <code>DataClient</code> and <code>MonitoringClient</code> classes are also automatically instantiated for you, and accessible with the following accessors:</p>\n		<ul>\n			<li>\n				<pre>DataClient dataClient = apigeeClient.getDataClient();</pre>\n				<p>Use this object to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</p>\n			</li>\n			<li>\n				<pre>MonitoringClient monitoringClient = apigeeClient.getMonitoringClient();</pre>\n				<p>Use this object to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</p>\n			</li>\n		</ul>\n	</li>	\n	<li>	\n		<h3><strong>Add App Services features to your app</strong></h3>\n		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n		<ul>\n			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n			<li><strong>App Monitoring</strong>: When you initialize the App Services SDK, a suite of valuable, <a href="http://apigee.com/docs/node/13190">customizable</a> application monitoring features are automatically enabled that deliver the data you need to fine tune performance, analyze issues, and improve user experience.\n				<ul>\n					<li><strong><a href="http://apigee.com/docs/node/13176">App Usage Monitoring</a></strong>: Visit the <a href="https://apigee.com/usergrid">App Services admin portal</a> to view usage data for your app, including data on device models, platforms and OS versions running your app.</li>				\n					<li><strong><a href="http://apigee.com/docs/node/12861">API Performance Monitoring</a></strong>: Network performance is key to a solid user experience. In the <a href="https://apigee.com/usergrid">App Services admin portal</a> you can view key metrics, including response time, number of requests and raw API request logs.</li>	\n					<li><strong><a href="http://apigee.com/docs/node/13177">Error &amp; Crash Monitoring</a></strong>: Get alerted to any errors or crashes, then view them in the <a href="https://apigee.com/usergrid">App Services admin portal</a>, where you can also analyze raw error and crash logs.</li>\n				</ul>		\n			</li>\n			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n		</ul>\n	</li>\n	<li>	\n		<h3><strong>Check out the sample apps</strong></h3>\n		<p>The SDK includes samples that illustrate Apigee&nbsp;features. You\'ll find the samples in the following location in your SDK download:</p>\n		<pre>\napigee-android-sdk-&lt;version&gt;\n	...\n	/samples\n		</pre>\n		<div id="collapse">\n			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n		</div>\n		<div id="samples_collapse" class="collapse">\n			<p>The samples include the following:</p>\n			<table class="table">\n				<thead>\n					<tr>\n						<th scope="col">Sample</th>\n						<th scope="col">Description</th>\n					</tr>\n				</thead>\n				<tbody>\n					<tr>\n						<td>books</td>\n						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n					</tr>\n					<tr>\n						<td>messagee</td>\n						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n					</tr>\n					<tr>\n						<td>push</td>\n						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n					</tr>\n				</tbody>\n			</table>\n		</div>\n	</li>\n</ul>\n'),$templateCache.put("app-overview/doc-includes/ios.html",'<h2>1. Integrate ApigeeiOSSDK.framework</h2>\n<a class="jumplink" name="add_the_sdk_to_an_existing_project"></a>\n<ul class="nav nav-tabs" id="myTab">\n	<li class="active"><a data-toggle="tab" href="#existing_project">Existing project</a></li>\n	<li><a data-toggle="tab" href="#new_project">New project</a></li>\n</ul>\n<div class="tab-content">\n	<div class="tab-pane active" id="existing_project">\n		<p>If you\'ve already got&nbsp;an Xcode iOS project, add it into your project as you normally would.</p>\n		<div id="collapse"><a class="btn" data-toggle="collapse" href="#framework_collapse">Details</a></div>\n		<div class="collapse" id="framework_collapse">\n			<ol>\n				<li>\n					<p>Locate the SDK framework file so you can add it to your project. For example, you\'ll find the file at the following path:</p>\n					<pre>\n&lt;sdk_root&gt;/bin/ApigeeiOSSDK.framework</pre>\n				</li>\n				<li>In the <strong>Project Navigator</strong>, click on your project file, and then the <strong>Build Phases</strong> tab. Expand <strong>Link Binary With Libraries</strong>.</li>\n				<li>Link the Apigee iOS SDK into your project.\n					<ul>\n						<li>Drag ApigeeiOSSDK.framework into the Frameworks group created by Xcode.</li>\n					</ul>\n					<p>OR</p>\n					<ol>\n						<li>At the bottom of the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button. Then click&nbsp;<strong>Add Other</strong>.</li>\n						<li>Navigate to the directory that contains ApigeeiOSSDK.framework, and choose the ApigeeiOSSDK.framework folder.</li>\n					</ol>\n				</li>\n			</ol>\n		</div>\n	</div>\n	<div class="tab-pane" id="new_project"><a class="jumplink" name="create_a_new_project_based_on_the_SDK"></a>\n		<p>If you\'re starting with a clean slate (you don\'t have a&nbsp;project yet), you can begin by using the project template included with the SDK. The template includes support for SDK features.</p>\n		<ol>\n			<li>\n				<p>Locate the project template in the expanded SDK. It should be at the following location:</p>\n				<pre>\n&lt;sdk_root&gt;/new-project-template</pre>\n			</li>\n			<li>In the project template directory, open the project file:&nbsp;Apigee App Services iOS Template.xcodeproj.</li>\n			<li>Get acquainted with the template by looking at its readme file.</li>\n		</ol>\n	</div>\n</div>\n<h2>2. Add required iOS frameworks</h2>\n<p>Ensure that the following iOS frameworks are part of your project. To add them, under the <strong>Link Binary With Libraries</strong> group, click the <strong>+</strong> button, type the name of the framework you want to add, select the framework found by Xcode, then click <strong>Add</strong>.</p>\n<ul>\n	<li>QuartzCore.framework</li>\n	<li>CoreLocation.framework</li>\n	<li>CoreTelephony.framework&nbsp;</li>\n	<li>Security.framework</li>\n	<li>SystemConfiguration.framework</li>\n	<li>UIKit.framework</li>\n</ul>\n<h2>3. Update \'Other Linker Flags\'</h2>\n<p>In the <strong>Build Settings</strong> panel, add the following under <strong>Other Linker Flags</strong>:</p>\n<pre>\n-ObjC -all_load</pre>\n<p>Confirm that flags are set for both <strong>DEBUG</strong> and <strong>RELEASE</strong>.</p>\n<h2>4. Initialize the SDK</h2>\n<p>The <em>ApigeeClient</em> class initializes the App Services SDK. To do this you will need your organization name and application name, which are available in the <em>Getting Started</em> tab of the <a href="https://www.apigee.com/usergrid/">App Service admin portal</a>, under <strong>Mobile SDK Keys</strong>.</p>\n<ol>\n	<li>Import the SDK\n		<p>Add the following to your source code to import the SDK:</p>\n		<pre>\n#import &lt;ApigeeiOSSDK/Apigee.h&gt;</pre>\n	</li>\n	<li>\n		<p>Declare the following properties in <code>AppDelegate.h</code>:</p>\n		<pre>\n@property (strong, nonatomic) ApigeeClient *apigeeClient; \n@property (strong, nonatomic) ApigeeMonitoringClient *monitoringClient;\n@property (strong, nonatomic) ApigeeDataClient *dataClient;	\n		</pre>\n	</li>\n	<li>\n		<p>Instantiate the <code>ApigeeClient</code> class inside the <code>didFinishLaunching</code> method of <code>AppDelegate.m</code>:</p>\n		<pre>\n//Replace \'AppDelegate\' with the name of your app delegate class to instantiate it\nAppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\n\n//Sepcify your App Services organization and application names\nNSString *orgName = @"{{currentOrg}}";\nNSString *appName = @"{{currentApp}}";\n\n//Instantiate ApigeeClient to initialize the SDK\nappDelegate.apigeeClient = [[ApigeeClient alloc]\n                            initWithOrganizationId:orgName\n                            applicationId:appName];\n                            \n//Retrieve instances of ApigeeClient.monitoringClient and ApigeeClient.dataClient\nself.monitoringClient = [appDelegate.apigeeClient monitoringClient]; \nself.dataClient = [appDelegate.apigeeClient dataClient]; \n		</pre>\n	</li>\n</ol>\n\n<h2>5. Verify SDK installation</h2>\n\n<p>Once initialized, App Services will also automatically instantiate the <code>ApigeeMonitoringClient</code> class and begin logging usage, crash and error metrics for your app.</p>\n\n<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>\'Monitoring\' > \'App Usage\'</strong> in the <a href="https://www.apigee.com/usergrid">App Services admin portal</a> to verify that data is being sent.</p>\n<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n\n<h2>Installation complete! Try these next steps</h2>\n<ul>	\n	<li>\n		<h3><strong>Call additional SDK methods in your code</strong></h3>\n		<p>Create an instance of the AppDelegate class, then use <code>appDelegate.dataClient</code> or <code>appDelegate.monitoringClient</code> to call SDK methods:</p>\n		<div id="collapse"><a class="btn" data-toggle="collapse" href="#client_collapse">Details</a></div>\n		<div class="collapse" id="client_collapse">\n			<ul>\n				<li><code>appDelegate.dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n				<li><code>appDelegate.monitoringClient</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n			</ul>\n			<h3>Example</h3>\n			<p>For example, you could create a new entity with the following:</p>\n			<pre>\nAppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];\nApigeeClientResponse *response = [appDelegate.dataClient createEntity:entity];\n			</pre>\n		</div>\n\n	</li>\n	<li>\n		<h3><strong>Add App Services features to your app</strong></h3>\n		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n		<ul>\n			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Target users or return result sets based on user location to keep your app highly-relevant.</li>\n			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement user registration, as well as OAuth 2.0-compliant login and authentication.</li>\n		</ul>\n	</li>\n	<li>\n		<h3><strong>Check out the sample apps</strong></h3>\n		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. To get a sample app running, open its project file, then follow the steps described in the section, <a target="_blank" href="http://apigee.com/docs/app-services/content/installing-apigee-sdk-ios">Add the SDK to an existing project</a>.</p>\n		<p>You\'ll find the samples in the following location in your SDK download:</p>\n		<pre>\napigee-ios-sdk-&lt;version&gt;\n    ...\n    /samples\n		</pre>\n		<div id="collapse"><a class="btn" data-toggle="collapse" href="#samples_collapse">Details</a></div>\n		<div class="collapse" id="samples_collapse">\n			<p>The samples include the following:</p>\n			<table class="table">\n				<thead>\n					<tr>\n						<th scope="col">Sample</th>\n						<th scope="col">Description</th>\n					</tr>\n				</thead>\n				<tbody>\n					<tr>\n						<td>books</td>\n						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n					</tr>\n					<tr>\n						<td>messagee</td>\n						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n					</tr>\n					<tr>\n						<td>push</td>\n						<td>An app that uses the push feature to send notifications to the devices of users who have subscribed for them.</td>\n					</tr>\n				</tbody>\n			</table>\n		</div>\n		<p>&nbsp;</p>\n	</li>\n</ul>\n'),$templateCache.put("app-overview/doc-includes/javascript.html",'<h2>1. Import the SDK into your HTML</h2>\n<p>To enable support for Apigee-related functions in your HTML, you\'ll need to&nbsp;include <code>apigee.js</code> in your app. To do this, add the following to the <code>head</code> block of your HTML:</p>\n<pre>\n&lt;script type="text/javascript" src="path/to/js/sdk/apigee.js"&gt;&lt;/script&gt;\n</pre>\n<h2>2. Instantiate Apigee.Client</h2>\n<p>Apigee.Client initializes the App Services SDK, and gives you access to all of the App Services SDK methods.</p>\n<p>You will need to pass a JSON object with the UUID or name for your App Services organization and application when you instantiate it.</p>\n<pre>\n//Apigee account credentials, available in the App Services admin portal \nvar client_creds = {\n        orgName:\'{{currentOrg}}\',\n        appName:\'{{currentApp}}\'\n    }\n\n//Initializes the SDK. Also instantiates Apigee.MonitoringClient\nvar dataClient = new Apigee.Client(client_creds);  \n</pre>\n\n<h2>3. Verify SDK installation</h2>\n\n<p>Once initialized, App Services will also automatically instantiate <code>Apigee.MonitoringClient</code> and begin logging usage, crash and error metrics for your app.</p>\n\n<p>To verify that the SDK has been properly initialized, run your app, then go to <strong>\'Monitoring\' > \'App Usage\'</strong> in the <a href="https://www.apigee.com/usergrid">App Services admin portal</a> to verify that data is being sent.</p>\n<p><img src="img/verify.png" alt="screenshot of data in admin portal"/></p>\n<div class="warning">It may take up to two minutes for data to appear in the admin portal after you run your app.</div>\n\n<h2>Installation complete! Try these next steps</h2>\n<ul>\n	<li>	\n		<h3><strong>Call additional SDK methods in your code</strong></h3>\n		<p>Use <code>dataClient</code> or <code>dataClient.monitor</code> to call SDK methods:</p>\n		<div id="collapse">\n			<a href="#client_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n		</div>\n		<div id="client_collapse" class="collapse">\n			<ul>\n				<li><code>dataClient</code>: Used to access the data methods of the App Services SDK, including those for push notifications, data store, and geolocation.</li>\n				<li><code>dataClient.monitor</code>: Used to access the app configuration and monitoring methods of the App Services SDK, including advanced logging, and A/B testing.</li>\n			</ul>\n		</div>\n	</li>	\n	<li>\n		<h3><strong>Add App Services features to your app</strong></h3>\n		<p>With App Services you can quickly add valuable features to your mobile or web app, including push notifications, a custom data store, geolocation and more. Check out these links to get started with a few of our most popular features:</p>\n		<ul>\n			<li><strong><a href="http://apigee.com/docs/node/8410">Push notifications</a></strong>: Send offers, alerts and other messages directly to user devices to dramatically increase engagement. With App Services you can send 10 million push notification per month for free!</li>\n			<li><strong><a href="http://apigee.com/docs/node/410">Geolocation</a></strong>: Keep your app highly-relevant by targeting users or returning result sets based on user location.</li>\n			<li><strong><a href="http://apigee.com/docs/node/10152">Data storage</a></strong>: Store all your application data on our high-availability infrastructure, and never worry about dealing with a database ever again.</li>\n			<li><strong><a href="http://apigee.com/docs/node/376">User management and authentication</a></strong>: Every app needs users. Use App Services to easily implement registration, login and OAuth 2.0-compliant authentication.</li>\n		</ul>\n	</li>\n	<li>\n		<h3><strong>Check out the sample apps</strong></h3>\n		<p>The SDK includes samples that illustrate Apigee&nbsp;features. To look at them, open the .xcodeproj file for each in Xcode. You\'ll find the samples in the following location in your SDK download:</p>\n		<pre>\napigee-javascript-sdk-master\n    ...\n    /samples		\n		</pre>\n		<div id="collapse">\n			<a href="#samples_collapse" class="btn" data-toggle="collapse"><i class="icon-white icon-chevron-down"></i> Details</a>\n		</div>\n		<div id="samples_collapse" class="collapse">\n			<p>The samples include the following:</p>\n			<table class="table">\n				<thead>\n					<tr>\n						<th scope="col">Sample</th>\n						<th scope="col">Description</th>\n					</tr>\n				</thead>\n				<tbody>\n					<tr>\n						<td>booksSample.html</td>\n						<td>An app for storing a list of books that shows Apigee database operations such as reading, creating, and deleting.</td>\n					</tr>\n					<tr>\n						<td>messagee</td>\n						<td>An app for sending and receiving messages that shows Apigee database operations (reading, creating).</td>\n					</tr>\n					<tr>\n						<td>monitoringSample.html</td>\n						<td>Shows basic configuration and initialization of the HTML5 app monitoring functionality. Works in browser, PhoneGap, Appcelerator, and Trigger.io.</td>\n					</tr>\n					<tr>\n						<td>readmeSample.html</td>\n						<td>A simple app for reading data from an Apigee database.</td>\n					</tr>\n				</tbody>\n			</table>\n		</div>	\n	</li>				\n</ul>\n'),$templateCache.put("app-overview/doc-includes/net.html",""),$templateCache.put("app-overview/doc-includes/node.html",""),$templateCache.put("app-overview/doc-includes/ruby.html",""),$templateCache.put("app-overview/getting-started.html",'<div class="setup-sdk-content" >\n\n  <bsmodal id="regenerateCredentials"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="regenerateCredentialsDialog"\n           extrabuttonlabel="Yes"\n           ng-cloak>\n    Are you sure you want to regenerate the credentials?\n  </bsmodal>\n\n    <page-title icon="&#128640;" title="Getting Started"></page-title>\n\n  <section class="row-fluid">\n\n\n\n\n    <div class="span8">\n\n      <h2 class="title">Install the SDK for app {{currentApp}}</h2>\n      <p>Click on a platform icon below to view SDK installation instructions for that platform.</p>\n      <ul class="inline unstyled">\n        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-large-ios"></i></a></li>-->\n        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-large-android"></i></a></li>-->\n        <!--<li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#javascript"><i class="sdk-icon-large-js"></i></a></li>-->\n\n\n        <li ng-click="showSDKDetail(\'ios\')"\n            analytics-on="click"\n            analytics-label="App Services"\n            analytics-category="Getting Started"\n            analytics-event="iOS SDK"><i class="sdk-icon-large-ios"></i></li>\n        <li ng-click="showSDKDetail(\'android\')"\n            analytics-on="click"\n            analytics-label="App Services"\n            analytics-category="Getting Started"\n            analytics-event="Android SDK"><i class="sdk-icon-large-android"></i></li>\n        <li ng-click="showSDKDetail(\'javascript\')"\n            analytics-on="click"\n            analytics-label="App Services"\n            analytics-category="Getting Started"\n            analytics-event="JS SDK"><i class="sdk-icon-large-js"></i></li>\n        <li><a target="_blank"\n               ng-click="showSDKDetail(\'nocontent\')"\n               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#nodejs"\n               analytics-on="click"\n               analytics-label="App Services"\n               analytics-category="Getting Started"\n               analytics-event="Node SDK"><i class="sdk-icon-large-node"></i></a></li>\n        <li><a target="_blank"\n               ng-click="showSDKDetail(\'nocontent\')"\n               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ruby"\n               analytics-on="click"\n               analytics-label="App Services"\n               analytics-category="Getting Started"\n               analytics-event="Ruby SDK"><i class="sdk-icon-large-ruby"></i></a></li>\n        <li><a target="_blank"\n               ng-click="showSDKDetail(\'nocontent\')"\n               href="http://apigee.com/docs/usergrid/content/sdks-and-examples#c"\n               analytics-on="click"\n               analytics-label="App Services"\n               analytics-category="Getting Started"\n               analytics-event="DotNet SDK"><i class="sdk-icon-large-net"></i></a></li>\n       </ul>\n\n      <section id="intro-container" class="row-fluid intro-container">\n\n        <div class="sdk-intro">\n        </div>\n\n        <div class="sdk-intro-content">\n\n          <a class="btn normal white pull-right" ng-href="{{sdkLink}}" target="_blank">\n            Download SDK\n          </a>\n          <a class="btn normal white pull-right" ng-href="{{docsLink}}" target="_blank">\n            More Docs\n          </a>\n          <h3 class="title"><i class="pictogram">&#128213;</i>{{contentTitle}}</h3>\n\n          <div ng-include="getIncludeURL()"></div>\n        </div>\n\n      </section>\n    </div>\n\n    <div class="span4 keys-creds">\n      <h2 class="title">Mobile sdk keys</h2>\n      <p>For mobile SDK initialization.</p>\n      <dl class="app-creds">\n        <dt>Org Name</dt>\n        <dd>{{currentOrg}}</dd>\n        <dt>App Name</dt>\n        <dd>{{currentApp}}</dd>\n      </dl>\n      <h2 class="title">Server app credentials</h2>\n      <p>For authenticating from a server side app (i.e. Ruby, .NET, etc.)</p>\n      <dl class="app-creds">\n        <dt>Client ID</dt>\n        <dd>{{clientID}}</dd>\n        <dt>Client Secret</dt>\n        <dd>{{clientSecret}}</dd>\n        <dt>\n           &nbsp;\n        </dt>\n        <dd>&nbsp;</dd>\n\n        <dt>\n          <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">Regenerate</a>\n        </dt>\n        <dd></dd>\n      </dl>\n\n    </div>\n\n  </section>\n</div>'),$templateCache.put("data/data.html",'<div class="content-page">\n\n  <bsmodal id="newCollection"\n           title="Create new collection"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="newCollectionDialog"\n           extrabuttonlabel="Create"\n           buttonid="collection"\n           ng-cloak>\n    <fieldset>\n      <div class="control-group">\n        <label for="new-collection-name">Collection Name:</label>\n        <div class="controls">\n          <input type="text" ug-validate required ng-pattern="collectionNameRegex" ng-attr-title="{{collectionNameRegexDescription}}" ng-model="$parent.newCollection.name" name="collection" id="new-collection-name" class="input-xlarge"/>\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n    </fieldset>\n  </bsmodal>\n\n  <div id="intro-page">    \n    <page-title title=" Collections" icon="&#128254;"></page-title>\n  </div>\n\n  <section class="row-fluid">\n    <div id="intro-list" class="span3 user-col">\n      <a class="btn btn-primary" id="new-collection-link" ng-click="showModal(\'newCollection\')">New Collection</a>\n      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data new collection\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_new_collection}}" tooltip-placement="right">(?)</a>\n        <ul  class="user-list">\n          <li ng-class="queryCollection._type === entity.name ? \'selected\' : \'\'" ng-repeat="entity in collectionList" ng-click="loadCollection(\'/\'+entity.name);">\n            <a id="collection-{{entity.name}}-link" href="javaScript:void(0)">/{{entity.name}} </a>\n          </li>\n        </ul>\n\n  </div>\n\n    <div class="span9 tab-content">\n      <div class="content-page">\n        <form id="intro-collection-query" name="dataForm" ng-submit="run();">\n        <fieldset>\n          <div class="control-group">\n            <div class="" data-toggle="buttons-radio">\n              <!--a class="btn" id="button-query-back">&#9664; Back</a-->\n              <!--Added disabled class to change the way button looks but their functionality is as usual -->\n              <label class="control-label" style="display:none"><strong>Method</strong> <a id="query-method-help" href="#" class="help-link">get help</a></label>\n              <input type="radio" id="create-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPOST();" ng-checked="verb==\'POST\'"> CREATE &nbsp; &nbsp;\n              <input type="radio" id="read-rb" name="query-action" style="margin-top: -2px;" ng-click="selectGET();" ng-checked="verb==\'GET\'"> READ &nbsp; &nbsp;\n              <input type="radio" id="update-rb" name="query-action" style="margin-top: -2px;" ng-click="selectPUT();" ng-checked="verb==\'PUT\'"> UPDATE &nbsp; &nbsp;\n                <input type="radio" id="delete-rb" name="query-action" style="margin-top: -2px;" ng-click="selectDELETE();" ng-checked="verb==\'DELETE\'"> DELETE             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query verbs\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_verb_buttons}}" tooltip-placement="right">(?)</a>\n            </div>\n          </div>\n\n          <div class="control-group">\n            <strong>Path </strong>\n            <div class="controls">\n              <input ng-model="data.queryPath" type="text" ug-validate id="pathDataQuery" ng-attr-title="{{pathRegexDescription}}" ng-pattern="pathRegex" class="span6" autocomplete="off" placeholder="ex: /users" required/>\n              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query path\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_path_box}}" tooltip-placement="right">(?)</a>\n            </div>\n          </div>\n          <div class="control-group">\n            <a id="back-to-collection" class="outside-link" style="display:none">Back to collection</a>\n          </div>\n          <div class="control-group">\n            <strong>Query</strong>\n            <div class="controls">\n              <input ng-model="data.searchString" type="text" class="span6" autocomplete="off" placeholder="ex: select * where name=\'fred\'"/>\n              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data query string\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_query_box}}" tooltip-placement="right">(?)</a>\n              <div style="display:none">\n                <a class="btn dropdown-toggle " data-toggle="dropdown">\n                  <span id="query-collections-caret" class="caret"></span>\n                </a>\n                <ul id="query-collections-indexes-list" class="dropdown-menu ">\n                </ul>\n              </div>\n            </div>\n          </div>\n\n\n          <div class="control-group" ng-show="verb==\'GET\' || verb==\'DELETE\'">\n            <label class="control-label" for="query-limit"><strong>Limit</strong>\n              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data limit\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_limit}}" tooltip-placement="right">(?)</a><a id="query-limit-help" href="#" ng-show="false" class="help-link">get help</a></label>\n            <div class="controls">\n              <div class="input-append">\n                <input ng-model="data.queryLimit" type="text" class="span5" id="query-limit" placeholder="ex: 10">\n              </div>\n            </div>\n          </div>\n\n          <div class="control-group" style="display:{{queryBodyDisplay}}">\n            <label class="control-label" for="query-source"><strong>JSON Body</strong>\n              <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data json body\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_json_body}}" tooltip-placement="right">(?)</a> <a id="query-json-help" href="#" ng-show="false" class="help-link">get help</a></label>\n            <div class="controls">\n            <textarea ng-model="data.queryBody" id="query-source" class="span6 pull-left" rows="4">\n      { "name":"value" }\n            </textarea>\n              <br>\n            <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n                <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data validate json\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_json_validate}}" tooltip-placement="right">(?)</a>\n            </div>\n          </div>\n          <div style="clear: both; height: 10px;"></div>\n          <div class="control-group">\n            <input type="submit" ng-disabled="!dataForm.$valid || loading" class="btn btn-primary" id="button-query"  value="{{loading ? loadingText : \'Run Query\'}}"/>\n            <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data run query\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_run_query}}" tooltip-placement="right">(?)</a>\n          </div>\n        </fieldset>\n       </form>\n        <div id="intro-entity-list">\n'+"          <div ng-include=\"display=='generic' ? 'data/display-generic.html' : ''\"></div>\n          <div ng-include=\"display=='users' ? 'data/display-users.html' : ''\"></div>\n          <div ng-include=\"display=='groups' ? 'data/display-groups.html' : ''\"></div>\n          <div ng-include=\"display=='roles' ? 'data/display-roles.html' : ''\"></div>\n        </div>\n\n      </div>\n\n      </div>\n    </section>\n\n</div>\n\n"),$templateCache.put("data/display-generic.html",'\n\n<bsmodal id="deleteEntities"\n         title="Are you sure you want to delete the entities(s)?"\n         close="hideModal"\n         closelabel="Cancel"\n         extrabutton="deleteEntitiesDialog"\n         extrabuttonlabel="Delete"\n         buttonid="del-entity"\n         ng-cloak>\n    <fieldset>\n        <div class="control-group">\n        </div>\n    </fieldset>\n</bsmodal>\n\n<span class="button-strip">\n  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data entities list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_entities_list}}" tooltip-placement="left">(?)</a>\n  <button class="btn btn-primary" ng-disabled="!valueSelected(queryCollection._list) || deleteLoading" ng-click="deleteEntitiesDialog()">{{deleteLoading ? loadingText : \'Delete Entity(s)\'}}</button>\n</span>\n<table class="table table-striped collection-list">\n  <thead>\n  <tr class="table-header">\n    <th><input type="checkbox" ng-show="queryCollection._list.length > 0" id="selectAllCheckbox" ng-model="queryBoxesSelected" ng-click="selectAllEntities(queryCollection._list,$parent,\'queryBoxesSelected\',true)"></th>\n    <th ng-if="hasProperty(\'name\')">Name</th>\n    <th>UUID</th>\n    <th></th>\n  </tr>\n  </thead>\n  <tbody ng-repeat="entity in queryCollection._list">\n  <tr class="zebraRows" >\n    <td>\n      <input\n        type="checkbox"\n        id="entity-{{entity._data.name}}-cb"\n        ng-value="entity._data.uuid"\n        ng-model="entity.checked"\n        >\n    </td>\n    <td ng-if="hasProperty(\'name\')">{{entity._data.name}}</td>\n    <td>{{entity._data.uuid}}</td>\n    <td><a href="javaScript:void(0)" ng-click="entitySelected[$index] = !entitySelected[$index]; selectEntity(entity._data.uuid, entitySelected[$index]);">{{entitySelected[$index] ? \'Hide\' : \'View\'}} Details</a></td>\n  </tr>\n  <tr ng-if="entitySelected[$index]">\n    <td colspan="5">\n\n\n      <h4 style="margin: 0 0 20px 0">Entity Detail</h4>\n\n\n      <ul class="formatted-json">\n        <li ng-repeat="(k,v) in entity._data track by $index">\n          <span class="key">{{k}} :</span>\n          <!--todo - doing manual recursion to get this out the door for launch, please fix-->\n          <span ng-switch on="isDeep(v)">\n            <ul ng-switch-when="true">\n              <li ng-repeat="(k2,v2) in v"><span class="key">{{k2}} :</span>\n\n                <span ng-switch on="isDeep(v2)">\n                  <ul ng-switch-when="true">\n                    <li ng-repeat="(k3,v3) in v2"><span class="key">{{k3}} :</span><span class="value">{{v3}}</span></li>\n                  </ul>\n                  <span ng-switch-when="false">\n                    <span class="value">{{v2}}</span>\n                  </span>\n                </span>\n              </li>\n            </ul>\n            <span ng-switch-when="false">\n              <span class="value">{{v}}</span>\n            </span>\n          </span>\n        </li>\n      </ul>\n\n    <div class="control-group">\n      <h4 style="margin: 20px 0 20px 0">Edit Entity <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'data edit entity\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_edit_entity}}" tooltip-placement="right">(?)</a></h4>\n      <div class="controls">\n        <textarea ng-model="entity._json" class="span12" rows="12"></textarea>\n        <br>\n        <a class="btn btn-primary toolbar pull-left" ng-click="validateJson();">Validate JSON</a><button type="button" class="btn btn-primary pull-right" id="button-query" ng-click="saveEntity(entity);">Save</button>\n      </div>\n    </div>\n  </td>\n  </tr>\n\n  <tr ng-show="queryCollection._list.length == 0">\n    <td colspan="4">No data found</td>\n  </tr>\n  </tbody>\n</table>\n<div style="padding: 10px 5px 10px 5px">\n  <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n  <button class="btn btn-primary toolbar" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n</div>\n\n'),$templateCache.put("data/display-groups.html",""),$templateCache.put("data/display-roles.html","roles---------------------------------"),$templateCache.put("data/display-users.html",'\n<table id="query-response-table" class="table">\n  <tbody>\n  <tr class="zebraRows users-row">\n    <td class="checkboxo">\n      <input type="checkbox" onclick="Usergrid.console.selectAllEntities(this);"></td>\n    <td class="gravatar50-td">&nbsp;</td>\n    <td class="user-details bold-header">Username</td>\n    <td class="user-details bold-header">Display Name</td>\n    <td class="user-details bold-header">UUID</td>\n    <td class="view-details">&nbsp;</td>\n  </tr>\n  <tr class="zebraRows users-row">\n    <td class="checkboxo">\n      <input class="listItem" type="checkbox" name="/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7" value="bf9a95da-d508-11e2-bf44-236d2eee13a7">\n    </td>\n    <td class="gravatar50-td">\n      <img src="http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e" class="gravatar50">\n    </td>\n    <td class="details">\n      <a onclick="Usergrid.console.getCollection(\'GET\', \'/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/\'+\'bf9a95da-d508-11e2-bf44-236d2eee13a7\'); $(\'#data-explorer\').show(); return false;" class="view-details">10</a>\n    </td>\n    <td class="details">      #"&gt;&lt;img src=x onerror=prompt(1);&gt;   </td>\n    <td class="details">     bf9a95da-d508-11e2-bf44-236d2eee13a7   </td>\n    <td class="view-details">\n      <a href="" onclick="$(\'#query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7\').toggle(); $(\'#data-explorer\').show(); return false;" class="view-details">Details</a>\n    </td>\n  </tr>\n  <tr id="query-row-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n    <td colspan="5">\n      <div>\n        <div style="padding-bottom: 10px;">\n          <button type="button" class="btn btn-small query-button active" id="button-query-show-row-JSON" onclick="Usergrid.console.activateQueryRowJSONButton(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">JSON</button>\n          <button type="button" class="btn btn-small query-button disabled" id="button-query-show-row-content" onclick="Usergrid.console.activateQueryRowContentButton();$(\'#query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7\').show(); $(\'#query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7\').hide(); return false;">Content</button>\n        </div>\n        <div id="query-row-JSON-bf9a95da-d508-11e2-bf44-236d2eee13a7">\n              <pre>{\n  "picture": "http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e",\n  "uuid": "bf9a95da-d508-11e2-bf44-236d2eee13a7",\n  "type": "user",\n  "name": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;",\n  "created": 1371224432557,\n  "modified": 1371851347024,\n  "username": "10",\n  "email": "fdsafdsa@ookfd.com",\n  "activated": "true",\n  "adr": {\n    "addr1": "",\n    "addr2": "",\n    "city": "",\n    "state": "",\n    "zip": "",\n    "country": ""\n  },\n  "metadata": {\n    "path": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7",\n    "sets": {\n      "rolenames": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames",\n      "permissions": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions"\n    },\n    "collections": {\n      "activities": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities",\n      "devices": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices",\n      "feed": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed",\n      "groups": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups",\n      "roles": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles",\n      "following": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following",\n      "followers": "/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers"\n    }\n  },\n  "title": "#"&gt;&lt;img src=x onerror=prompt(1);&gt;"\n}</pre>\n        </div>\n        <div id="query-row-content-bf9a95da-d508-11e2-bf44-236d2eee13a7" style="display:none">\n          <table>\n            <tbody>\n            <tr>\n              <td>picture</td>\n              <td>http://www.gravatar.com/avatar/01b37aa66496988ca780b3f515bc768e</td></tr><tr><td>uuid</td><td>bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td>type</td><td>user</td></tr><tr><td>name</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td></tr><tr><td>created</td><td>1371224432557</td></tr><tr><td>modified</td><td>1371851347024</td></tr><tr><td>username</td><td>10</td></tr><tr><td>email</td><td>fdsafdsa@ookfd.com</td></tr><tr><td>activated</td><td>true</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>addr1</td><td></td></tr><tr><td>addr2</td><td></td></tr><tr><td>city</td><td></td></tr><tr><td>state</td><td></td></tr><tr><td>zip</td><td></td></tr><tr><td>country</td><td></td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>path</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7</td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>rolenames</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/rolenames</td></tr><tr><td>permissions</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/permissions</td></tr></tbody></table></td></tr><tr><td></td><td style="padding: 0"><table><tbody><tr></tr><tr><td>activities</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/activities</td></tr><tr><td>devices</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/devices</td></tr><tr><td>feed</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/feed</td></tr><tr><td>groups</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/groups</td></tr><tr><td>roles</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/roles</td></tr><tr><td>following</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/following</td></tr><tr><td>followers</td><td>/users/8bb9a3fa-d508-11e2-875d-a59031a365e8/following/bf9a95da-d508-11e2-bf44-236d2eee13a7/followers</td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td>title</td><td>#&amp;quot;&amp;gt;&amp;lt;img src=x onerror=prompt(1);&amp;gt;</td>\n            </tr>\n            </tbody>\n          </table>\n        </div>\n      </div>\n    </td>\n  </tr>\n  </tbody>\n</table>'),$templateCache.put("data/entity.html",'<div class="content-page">\n\n  <h4>Entity Detail</h4>\n  <div class="well">\n    <a href="#!/data" class="outside-link"><< Back to collection</a>\n  </div>\n  <fieldset>\n    <div class="control-group">\n      <strong>Path </strong>\n      <div class="controls">\n        {{entityType}}/{{entityUUID}}\n      </div>\n    </div>\n\n    <div class="control-group">\n      <label class="control-label" for="query-source"><strong>JSON Body</strong></label>\n      <div class="controls">\n        <textarea ng-model="queryBody" class="span6 pull-left" rows="12">{{queryBody}}</textarea>\n        <br>\n        <a class="btn pull-left" ng-click="validateJson();">Validate JSON</a>\n      </div>\n    </div>\n    <div style="clear: both; height: 10px;"></div>\n    <div class="control-group">\n      <button type="button" class="btn btn-primary" id="button-query" ng-click="saveEntity();">Save</button>\n      <!--button type="button" class="btn btn-primary" id="button-query" ng-click="run();">Delete</button-->\n    </div>\n  </fieldset>\n\n</div>\n\n'),$templateCache.put("dialogs/modal.html",'    <div class="modal show fade" tabindex="-1" role="dialog" aria-hidden="true">\n        <form ng-submit="extraDelegate(extrabutton)" name="dialogForm" novalidate>\n\n        <div class="modal-header">\n            <h1 class="title">{{title}}</h1>\n        </div>\n\n        <div class="modal-body" ng-transclude></div>\n        <div class="modal-footer">\n            {{footertext}}\n            <input type="submit" class="btn" id="dialogButton-{{buttonId}}" ng-if="extrabutton" ng-disabled="!dialogForm.$valid" aria-hidden="true" ng-value="extrabuttonlabel"/>\n            <button class="btn cancel pull-left" data-dismiss="modal" aria-hidden="true"\n                    ng-click="closeDelegate(close)">{{closelabel}}\n            </button>\n        </div>\n        </form>    </div>\n'),$templateCache.put("global/appswitcher-template.html",'<li id="globalNav" class="dropdown dropdownContainingSubmenu active">\n  <a class="dropdown-toggle" data-toggle="dropdown">API Platform<b class="caret"></b></a>\n  <ul class="dropdown-menu pull-right">\n    <li id="globalNavSubmenuContainer">\n      <ul>\n        <li data-globalNavDetail="globalNavDetailApigeeHome"><a target="_blank" href="http://apigee.com">Apigee Home</a></li>\n        <li data-globalNavDetail="globalNavDetailAppServices" class="active"><a target="_blank" href="https://apigee.com/usergrid/">App Services</a></li>\n        <li data-globalNavDetail="globalNavDetailApiPlatform" ><a target="_blank" href="https://enterprise.apigee.com">API Platform</a></li>\n        <li data-globalNavDetail="globalNavDetailApiConsoles"><a target="_blank" href="http://apigee.com/providers">API Consoles</a></li>\n      </ul>\n    </li>\n    <li id="globalNavDetail">\n      <div id="globalNavDetailApigeeHome">\n        <div class="globalNavDetailApigeeLogo"></div>\n        <div class="globalNavDetailDescription">You need apps and apps need APIs. Apigee is the leading API platform for enterprises and developers.</div>\n      </div>\n      <div id="globalNavDetailAppServices">\n        <div class="globalNavDetailSubtitle">For App Developers</div>\n        <div class="globalNavDetailTitle">App Services</div>\n        <div class="globalNavDetailDescription">Build engaging applications, store data, manage application users, and more.</div>\n      </div>\n      <div id="globalNavDetailApiPlatform">\n        <div class="globalNavDetailSubtitle">For API Developers</div>\n        <div class="globalNavDetailTitle">API Platform</div>\n        <div class="globalNavDetailDescription">Create, configure, manage and analyze your APIs and resources.</div>\n      </div>\n      <div id="globalNavDetailApiConsoles">\n        <div class="globalNavDetailSubtitle">For API Developers</div>\n        <div class="globalNavDetailTitle">API Consoles</div>\n        <div class="globalNavDetailDescription">Explore over 100 APIs with the Apigee API Console, or create and embed your own API Console.</div>\n      </div>\n    </li>\n  </ul>\n</li>'),$templateCache.put("global/insecure-banner.html",'<div ng-if="securityWarning" ng-cloak class="demo-holder">\n    <div class="alert alert-demo alert-animate">\n        <div class="alert-text">\n            <i class="pictogram">&#9888;</i>Warning: This application has "sandbox" permissions and is not production ready. <a target="_blank" href="http://apigee.com/docs/app-services/content/securing-your-app">Please go to our security documentation to find out more.</a></span>\n        </div>\n    </div>\n</div>'),$templateCache.put("global/page-title.html",'<section class="row-fluid">\n    <div class="span12">\n        <div class="page-filters">\n            <h1 class="title pull-left" id="pageTitle"><i class="pictogram title" style="padding-right: 5px;">{{icon}}</i>{{title}} <a class="super-help" href="http://community.apigee.com/content/apigee-customer-support" target="_blank"  >(need help?)</a></h1>\n        </div>\n    </div>\n    <bsmodal id="need-help"\n             title="Need Help?"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="sendHelp"\n             extrabuttonlabel="Get Help"\n             ng-cloak>\n        <p>Do you want to contact support? Support will get in touch with you as soon as possible.</p>\n    </bsmodal>\n</section>\n\n'),$templateCache.put("groups/groups-activities.html",'<div class="content-page" ng-controller="GroupsActivitiesCtrl">\n\n  <br>\n  <div>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>Date</td>\n        <td>Content</td>\n        <td>Verb</td>\n        <td>UUID</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="activity in selectedGroup.activities">\n        <td>{{activity.createdDate}}</td>\n        <td>{{activity.content}}</td>\n        <td>{{activity.verb}}</td>\n        <td>{{activity.uuid}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n\n\n</div>'),$templateCache.put("groups/groups-details.html",'<div class="content-page" ng-controller="GroupsDetailsCtrl">\n\n  <div>\n      <form name="updateGroupDetailForm" ng-submit="saveSelectedGroup()" novalidate>\n          <div style="float: left; padding-right: 30px;">\n              <h4 class="ui-dform-legend">Group Information</h4>\n              <label for="group-title" class="ui-dform-label">Group Title</label>\n              <input type="text" id="group-title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required class="ui-dform-text" ng-model="group.title" ug-validate>\n                  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group title box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_title}}" tooltip-placement="right">(?)</a>\n              <br/>\n            <label for="group-path" class="ui-dform-label">Group Path</label>\n            <input type="text" id="group-path" required ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" class="ui-dform-text" ng-model="group.path" ug-validate>\n                <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_path}}" tooltip-placement="right">(?)</a>\n            <br/>\n          </div>\n          <br style="clear:both"/>\n\n          <div style="width:100%;float:left;padding: 20px 0">\n              <input type="submit" value="Save Group" style="margin-right: 15px;" ng-disabled="!updateGroupDetailForm.$valid" class="btn btn-primary" />\n          </div>\n\n          <div class="content-container">\n              <h4>JSON Group Object <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group json object\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_json_object}}" tooltip-placement="right">(?)</a></h4>\n              <pre id="{{help.showJsonId}}">{{json}}</pre>\n          </div>\n      </form>\n  </div>\n\n\n</div>'),$templateCache.put("groups/groups-members.html",'<div class="content-page" ng-controller="GroupsMembersCtrl">\n\n\n  <bsmodal id="removeFromGroup"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="removeUsersFromGroupDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to remove the users from the seleted group(s)?</p>\n  </bsmodal>\n\n  <bsmodal id="addGroupToUser"\n           title="Add user to group"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addGroupToUserDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <div class="btn-group">\n      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n        <span class="filter-label">{{$parent.user != \'\' ? $parent.user.username : \'Select a user...\'}}</span>\n        <span class="caret"></span>\n      </a>\n      <ul class="dropdown-menu">\n        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n      </ul>\n    </div>\n  </bsmodal>\n\n\n  <div class="button-strip">\n    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_users_add_user}}" tooltip-placement="left">(?)</a>\n    <button class="btn btn-primary"  ng-click="showModal(\'addGroupToUser\')">Add User to Group</button>\n    <button class="btn btn-primary" ng-disabled="!hasMembers || !valueSelected(groupsCollection.users._list)" ng-click="showModal(\'removeFromGroup\')">Remove User(s) from Group</button>\n  </div>\n  <table class="table table-striped">\n    <tr class="table-header">\n      <td style="width: 30px;"><input type="checkbox" ng-show="hasMembers" id="selectAllCheckbox" ng-model="groupMembersSelected" ng-click="selectAllEntities(groupsCollection.users._list,this,\'groupMembersSelected\')"></td>\n      <td style="width: 50px;"></td>\n      <td>Username</td>\n      <td>Display Name</td>\n    </tr>\n    <tr class="zebraRows" ng-repeat="user in groupsCollection.users._list">\n      <td>\n        <input\n          type="checkbox"\n          ng-model="user.checked"\n          >\n      </td>\n      <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n      <td>{{user.get(\'username\')}}</td>\n      <td>{{user.get(\'name\')}}</td>\n    </tr>\n  </table>\n  <div style="padding: 10px 5px 10px 5px">\n    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n  </div>\n</div>'),$templateCache.put("groups/groups-roles.html",'<div class="content-page" ng-controller="GroupsRolesCtrl">\n\n  <bsmodal id="addGroupToRole"\n           title="Add group to role"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addGroupToRoleDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <div class="btn-group">\n      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n        <span class="filter-label">{{$parent.name != \'\' ? $parent.name : \'Role name...\'}}</span>\n        <span class="caret"></span>\n      </a>\n      <ul class="dropdown-menu">\n        <li ng-repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n      </ul>\n    </div>\n  </bsmodal>\n\n  <bsmodal id="leaveRoleFromGroup"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="leaveRoleDialog"\n           extrabuttonlabel="Leave"\n           ng-cloak>\n    <p>Are you sure you want to remove the group from the role(s)?</p>\n  </bsmodal>\n\n\n  <div class="button-strip">\n    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles add role button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_add_leave_role}}" tooltip-placement="left">(?)</a>\n    <button class="btn btn-primary" ng-click="showModal(\'addGroupToRole\')">Add Role to Group</button>\n    <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(groupsCollection.roles._list)" ng-click="showModal(\'leaveRoleFromGroup\')">Remove Role(s) from Group</button>\n  </div>\n  <h4>Roles <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles roles list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_roles}}" tooltip-placement="top">(?)</a></h4>\n  <table class="table table-striped">\n    <tbody>\n    <tr class="table-header">\n      <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="groupsSelectAllCheckBox" ng-model="groupRoleSelected" ng-click="selectAllEntities(groupsCollection.roles._list,this,\'groupRoleSelected\')" ></td>\n      <td>Role Name</td>\n      <td>Role title</td>\n    </tr>\n    <tr class="zebraRows" ng-repeat="role in groupsCollection.roles._list">\n      <td>\n        <input\n          type="checkbox"\n          ng-model="role.checked"\n          >\n      </td>\n      <td>{{role._data.name}}</td>\n      <td>{{role._data.title}}</td>\n    </tr>\n    </tbody>\n  </table>\n  <div style="padding: 10px 5px 10px 5px">\n    <button class="btn btn-primary" ng-click="getPreviousRoles()" style="display:{{roles_previous_display}}">< Previous</button>\n    <button class="btn btn-primary" ng-click="getNextRoles()" style="display:{{roles_next_display}};float:right;">Next ></button>\n  </div>\n\n\n  <bsmodal id="deletePermission"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="deleteGroupPermissionDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to delete the permission(s)?</p>\n  </bsmodal>\n\n\n  <bsmodal id="addPermission"\n           title="New Permission"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addGroupPermissionDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="groupsrolespermissions" type="text" ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" required ug-validate  /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n    </div>\n  </bsmodal>\n\n\n  <div class="button-strip">\n    <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n    <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n    <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedGroup.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n  </div>\n  <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups roles permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_permissions}}" tooltip-placement="top">(?)</a>\n  </h4>\n  <table class="table table-striped">\n    <tbody>\n    <tr class="table-header">\n      <td style="width: 30px;"><input ng-show="hasPermissions" type="checkbox" id="permissionsSelectAllCheckBox" ng-model="groupPermissionsSelected" ng-click="selectAllEntities(selectedGroup.permissions,this,\'groupPermissionsSelected\')"  ></td>\n      <td>Path</td>\n      <td>GET</td>\n      <td>POST</td>\n      <td>PUT</td>\n      <td>DELETE</td>\n    </tr>\n    <tr class="zebraRows" ng-repeat="permission in selectedGroup.permissions">\n      <td>\n        <input\n          type="checkbox"\n          ng-model="permission.checked"\n          >\n      </td>\n      <td>{{permission.path}}</td>\n      <td>{{permission.operations.get}}</td>\n      <td>{{permission.operations.post}}</td>\n      <td>{{permission.operations.put}}</td>\n      <td>{{permission.operations.delete}}</td>\n    </tr>\n    </tbody>\n  </table>\n\n</div>'),$templateCache.put("groups/groups-tabs.html",'<div class="content-page">\n\n  <section class="row-fluid">\n\n    <div class="span12">\n      <div class="page-filters">\n        <h1 class="title" class="pull-left"><i class="pictogram title">&#128101;</i> Groups</h1>\n      </div>\n    </div>\n\n  </section>\n\n  <div id="user-panel" class="panel-buffer">\n    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'groups\')">Group List</a></li>\n      <li ng-class="detailsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/details\')">Details</a></li>\n      <li ng-class="membersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/members\')">Users</a></li>\n      <li ng-class="activitiesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/activities\')">Activities</a></li>\n      <li ng-class="rolesSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'groups/roles\')">Roles &amp; Permissions</a></li>\n    </ul>\n  </div>\n\n  <div style="float: left; margin-right: 10px;">\n    <div style="float: left;">\n      <div class="user-header-title"><strong>Group Path: </strong>{{selectedGroup.get(\'path\')}}</div>\n      <div class="user-header-title"><strong>Group Title: </strong>{{selectedGroup.get(\'title\')}}</div>\n    </div>\n  </div>\n</div>\n<br>\n<br>\n'),$templateCache.put("groups/groups.html",'<div class="content-page">\n\n  <div id="intro-page" >\n  <page-title title=" Groups" icon="&#128101;"></page-title>\n    \n  </div>\n  <bsmodal id="newGroup"\n           title="New Group"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="newGroupDialog"\n           extrabuttonlabel="Add"\n           ng-model="dialog"\n           ng-cloak>\n    <fieldset>\n      <div class="control-group">\n        <label for="title">Title</label>\n        <div class="controls">\n          <input type="text" id="title" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="newGroup.title"class="input-xlarge" ug-validate/>\n          <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group title box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_title}}" tooltip-placement="right">(?)</a>\n        </div>\n      </div>\n      <div class="control-group">\n        <label for="path">Path</label>\n        <div class="controls">\n          <input id="path" type="text" ng-attr-title="{{pathRegexDescription}}" placeholder="ex: /mydata" ng-pattern="pathRegex" required ng-model="newGroup.path" class="input-xlarge" ug-validate/>\n          <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_details_path}}" tooltip-placement="right">(?)</a>\n        </div>\n      </div>\n    </fieldset>\n  </bsmodal>\n\n  <bsmodal id="deleteGroup"\n           title="Delete Group"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="deleteGroupsDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to delete the group(s)?</p>\n  </bsmodal>\n\n\n  <section class="row-fluid">\n    <div id="intro-list" class="span3 user-col">\n      <div class="button-toolbar span12">\n        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasGroups" ng-click="selectAllEntities(groupsCollection._list,this,\'groupBoxesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n        <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasGroups || !valueSelected(groupsCollection._list)" ng-click="showModal(\'deleteGroup\')"><i class="pictogram">&#9749;</i></button>\n        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newGroup\')"><i class="pictogram">&#59136;</i></button>\n        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_add_remove_buttons}}" tooltip-placement="right">(?)</a>\n      </div>\n      <ul class="user-list">\n        <li ng-class="selectedGroup._data.uuid === group._data.uuid ? \'selected\' : \'\'" ng-repeat="group in groupsCollection._list" ng-click="selectGroup(group._data.uuid)">\n          <input\n              type="checkbox"\n              ng-value="group._data.uuid"\n              ng-checked="group.checked"\n              ng-model="group.checked"\n              >\n          <a href="javaScript:void(0)" >{{group.get(\'title\')}}</a>\n          <br/>\n          <span ng-if="group.get(\'path\')" class="label">Path:</span>/{{group.get(\'path\')}}\n        </li>\n      </ul>\n\n\n      <div style="padding: 10px 5px 10px 5px">\n        <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n        <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n      </div>\n    </div>\n\n    <div id="{{help.showTabsId}}" class="span9 tab-content" ng-show="selectedGroup.get" >\n      <div class="menu-toolbar">\n        <ul class="inline" >\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/details\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/details\')"><i class="pictogram">&#59170;</i>Details</a>\n             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups details tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_details_tab}}" tooltip-placement="right">(?)</a></div>\n          </li>\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/members\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/members\')"><i class="pictogram">&#128101;</i>Users</a>\n             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups users tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_users_tab}}" tooltip-placement="right">(?)</a></div>\n          </li>\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/activities\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/activities\')"><i class="pictogram">&#59194;</i>Activities</a>\n             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups activities tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_activities_tab}}" tooltip-placement="right">(?)</a></div>\n          </li>\n          <li class="tab" ng-class="currentGroupsPage.route === \'/groups/roles\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectGroupPage(\'/groups/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a>\n             <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'groups role tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_roles_tab}}" tooltip-placement="right">(?)</a></div>\n          </li>\n        </ul>\n      </div>\n      <span ng-include="currentGroupsPage.template"></span>\n\n  </section>\n</div>\n'),$templateCache.put("login/forgot-password.html",'<div class="login-content" ng-controller="ForgotPasswordCtrl">\n	<iframe class="container" ng-src="{{forgotPWiframeURL}}" id="forgot-password-frame" border="0" style="border:0;width:600px;height:620px;">\n	<p>Email Address: <input id="resetPasswordEmail" name="resetPasswordEmail" /></p>\n	<button class="btn btn-primary" ng-click="">Reset Password</button>\n</div>\n'),$templateCache.put("login/loading.html","\n\n<h1>Loading...</h1>"),$templateCache.put("login/login.html",'<div class="login-content">\r\n  <bsmodal id="sendActivationLink"\r\n           title="Resend Activation Link"\r\n           close="hideModal"\r\n           closelabel="Cancel"\r\n           extrabutton="resendActivationLink"\r\n           extrabuttonlabel="Send Activation"\r\n           ng-cloak>\r\n    <fieldset>\r\n      <p>Email to send to: <input type="email" required ng-model="$parent.activation.id" ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" name="activationId" id="user-activationId" class="input-xlarge"/></p>\r\n    </fieldset>\r\n  </bsmodal>\r\n  <div class="login-holder">\r\n  <form name="loginForm" id="login-form"  ng-submit="login()" class="form-horizontal" novalidate>\r\n    <h1 class="title">Enter your credentials</h1>\r\n    <div class="alert-error" id="loginError" ng-if="loginMessage">{{loginMessage}}</div>\r\n    <div class="control-group">\r\n      <label class="control-label" for="login-username">Email or Username:</label>\r\n      <div class="controls">\r\n        <input type="text" ng-model="login.username"  title="Please add a username or email."  class="" id="login-username" required ng-value="login.username" size="20" ug-validate>\r\n      </div>\r\n    </div>\r\n    <div class="control-group">\r\n      <label class="control-label" for="login-password">Password:</label>\r\n      <div class="controls">\r\n        <input type="password" ng-model="login.password"  required id="login-password" class="" ng-value="login.password" size="20" ug-validate>\r\n      </div>\r\n    </div>\r\n    <div class="control-group" ng-show="requiresDeveloperKey">\r\n      <label class="control-label" for="login-developerkey">Developer Key:</label>\r\n      <div class="controls">\r\n        <input type="text" ng-model="login.developerkey" id="login-developerkey" class="" ng-value="login.developerkey" size="20" ug-validate>\r\n      </div>\r\n    </div>\r\n    <div class="form-actions">\r\n      <div class="submit">\r\n        <input type="submit" name="button-login" id="button-login" ng-disabled="!loginForm.$valid || loading" value="{{loading ? loadingText : \'Log In\'}}" class="btn btn-primary pull-right">\r\n      </div>\r\n    </div>\r\n  </form>\r\n  </div>\r\n  <div class="extra-actions">\r\n    <div class="submit">\r\n      <a ng-click="gotoSignUp()"   name="button-signUp" id="button-signUp" value="Sign Up"\r\n         class="btn btn-primary pull-left">Register</a>\r\n    </div>\r\n    <div class="submit">\r\n      <a ng-click="gotoForgotPasswordPage()" name="button-forgot-password" id="button-forgot-password"\r\n         value="" class="btn btn-primary pull-left">Forgot Password?</a>\r\n    </div>\r\n    <a ng-click="showModal(\'sendActivationLink\')"  name="button-resend-activation" id="button-resend-activation"\r\n       value="" class="btn btn-primary pull-left">Resend Activation Link</a>\r\n  </div>\r\n  <div id="gtm" style="width: 450px;margin-top: 4em;" />\r\n</div>\r\n'),$templateCache.put("login/logout.html",'<div id="logut">Logging out...</div>'),$templateCache.put("login/register.html",'<div class="signUp-content">\n  <div class="signUp-holder">\n    <form name="signUpform" id="signUp-form" ng-submit="register()" class="form-horizontal" ng-show="!signUpSuccess" novalidate>\n      <h1 class="title">Register</h1>\n\n      <div class="alert" ng-if="loginMessage">{{loginMessage}}</div>\n      <div class="control-group">\n        <label class="control-label" for="register-orgName">Organization:</label>\n\n        <div class="controls">\n          <input type="text" ng-model="registeredUser.orgName" id="register-orgName" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" ug-validate  required class="" size="20">\n        </div>\n      </div>\n\n      <div class="control-group">\n        <label class="control-label" for="register-name">Name:</label>\n\n        <div class="controls">\n          <input type="text" ng-model="registeredUser.name" id="register-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ug-validate required class="" size="20">\n        </div>\n      </div>\n\n      <div class="control-group">\n        <label class="control-label" for="register-userName">Username:</label>\n\n        <div class="controls">\n          <input type="text" ng-model="registeredUser.userName" id="register-userName" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" ug-validate required class="" size="20">\n        </div>\n      </div>\n\n      <div class="control-group">\n        <label class="control-label" for="register-email">Email:</label>\n\n        <div class="controls">\n          <input type="email" ng-model="registeredUser.email" id="register-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  required class="" ug-validate size="20">\n        </div>\n      </div>\n\n\n      <div class="control-group">\n        <label class="control-label" for="register-password">Password:</label>\n\n        <div class="controls">\n          <input type="password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" ug-validate ng-model="registeredUser.password" id="register-password" required class=""\n                 size="20">\n        </div>\n      </div>\n      <div class="control-group">\n        <label class="control-label" for="register-confirmPassword">Re-enter Password:</label>\n\n        <div class="controls">\n          <input type="password" ng-model="registeredUser.confirmPassword" required id="register-confirmPassword" ug-validate class="" size="20">\n        </div>\n      </div>\n      <div class="form-actions">\n        <div class="submit">\n          <input type="submit" name="button-login" ng-disabled="!signUpform.$valid" id="button-login" value="Register"\n                 class="btn btn-primary pull-right">\n        </div>\n        <div class="submit">\n          <a ng-click="cancel()" type="submit" name="button-cancel" id="button-cancel"\n             class="btn btn-primary pull-right">Cancel</a>\n        </div>\n      </div>\n    </form>\n    <div class="console-section well thingy" ng-show="signUpSuccess">\n      <span class="title">We\'re holding a seat for you!</span>\n      <br><br>\n\n      <p>Thanks for signing up for a spot on our private beta. We will send you an email as soon as we\'re ready for\n        you!</p>\n\n      <p>In the mean time, you can stay up to date with App Services on our <a\n          href="https://groups.google.com/forum/?fromgroups#!forum/usergrid">GoogleGroup</a>.</p>\n\n      <p> <a href="#!/login">Back to login</a></p>\n    </div>\n  </div>\n\n</div>\n'),$templateCache.put("menu.html",'<ul class="nav nav-list" menu="sideMenu">\n    <li class="option {{item.active ? \'active\' : \'\'}}" ng-cloak="" ng-repeat="item in menuItems"><a data-ng-href="{{item.path}}"><i class="pictogram" ng-bind-html="item.pic"></i>{{item.title}}</a>\n        <ul class="nav nav-list" ng-if="item.items">\n            <li ng-repeat="subItem in item.items"><a data-ng-href="{{subItem.path}}"><i class="pictogram sub" ng-bind-html="subItem.pic"></i>{{subItem.title}}</a>\n            </li>\n        </ul>\n    </li>\n</ul>'),$templateCache.put("menus/appMenu.html",'<ul id="app-menu" class="nav top-nav span12">\n    <li class="span7">\n      <bsmodal id="newApplication"\n               title="Create New Application"\n               close="hideModal"\n               closelabel="Cancel"\n               extrabutton="newApplicationDialog"\n               extrabuttonlabel="Create"\n               buttonid="app"\n               ng-cloak>\n        <div ng-show="!hasApplications" class="modal-instructions" >You have no applications, please create one.</div>\n        <div  ng-show="hasCreateApplicationError" class="alert-error">Application already exists!</div>\n        <p>New application name: <input ng-model="$parent.newApp.name" id="app-name-input" ng-pattern="appNameRegex"  ng-attr-title="{{appNameRegexDescription}}" type="text" required ug-validate /></p>\n      </bsmodal>\n        <div class="btn-group">\n            <a class="btn dropdown-toggle top-selector app-selector" id="current-app-selector" data-toggle="dropdown">\n                <i class="pictogram">&#9881;</i> {{myApp.currentApp}}\n                <span class="caret"></span>\n            </a>\n            <ul class="dropdown-menu app-nav">\n                <li name="app-selector" ng-repeat="app in applications">\n                    <a id="app-{{app.name}}-link-id" ng-click="appChange(app.name)">{{app.name}}</a>\n                </li>\n            </ul>\n        </div>\n    </li>\n    <li class="span5">\n      <a ng-if="activeUI"\n         class="btn btn-create zero-out pull-right"\n         ng-click="showModal(\'newApplication\')"\n         analytics-on="click"\n         analytics-category="App Services"\n         analytics-label="Button"\n         analytics-event="Add New App"\n        >\n        <i class="pictogram">&#8862;</i>\n        Add New App\n      </a>\n    </li>\n</ul>'),$templateCache.put("menus/orgMenu.html",'<ul class="nav top-nav org-nav">\n  <li>\n<div class="btn-group ">\n    <a class="btn dropdown-toggle top-selector org-selector" id="current-org-selector" data-toggle="dropdown">\n        <i class="pictogram">&#128193</i> {{currentOrg}}<span class="caret"></span>\n        </a>\n    <ul class="dropdown-menu org-nav">\n          <li name="org-selector" ng-repeat="(k,v) in organizations">\n              <a id="org-{{v.name}}-selector" class="org-overview" ng-click="orgChange(v.name)"> {{v.name}}</a>\n            </li>\n         </ul>\n    </div>\n  </li></ul>'),$templateCache.put("org-overview/org-overview.html",'<div class="org-overview-content" ng-show="activeUI">\n\n  <page-title title=" Org Administration" icon="&#128362;"></page-title>\n\n  <section class="row-fluid">\n\n  <div class="span6">\n  	<bsmodal id="introjs"\n             title="Welcome to the API BaaS Admin Portal"\n             close="hideModal"\n             closelabel="Skip"\n             extrabutton="startFirstTimeUser"\n             extrabuttonlabel="Take the tour"\n             ng-cloak>\n      <p>To get started, click \'Take the tour\' for a full walkthrough of the admin portal, or click \'Skip\' to start working right away.</p>\n    </bsmodal>\n		<div id="intro-4-current-org">	\n	    <h2 class="title">Current Organization <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'current org\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_current_org}}" tooltip-placement="right">(?)</a></h2>\n	    <table class="table table-striped">\n	      <tr>\n	        <td id="org-overview-name">{{currentOrganization.name}}</td>\n	        <td style="text-align: right">{{currentOrganization.uuid}}</td>\n	      </tr>\n	    </table>\n		</div>\n\n    <bsmodal id="newApplication"\n             title="Create New Application"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="newApplicationDialog"\n             extrabuttonlabel="Create"\n             ng-cloak>\n      <p>New application name: <input ng-model="$parent.newApp.name"  ug-validate required type="text" ng-pattern="appNameRegex" ng-attr-title="{{appNameRegexDescription}}" /></p>\n    </bsmodal>\n		<div id="intro-5-applications">		\n	    <h2 class="title" > Applications <a class="help_tooltip" ng-show="help.helpTooltipsEnabled" ng-mouseover="help.sendTooltipGA(\'applications\')" href="#" ng-attr-tooltip="{{tooltip_applications}}" tooltip-placement="right">(?)</a>\n	      <div class="header-button btn-group pull-right">\n	        <a class="btn filter-selector" style="{{applicationsSize === 10 ? \'width:290px\':\'\'}}"  ng-click="showModal(\'newApplication\')">\n	          <span class="filter-label">Add New App</span>\n	        </a>\n	      </div>\n	    </h2>\n		\n	    <table class="table table-striped">\n	      <tr ng-repeat="application in applications">\n	        <td>{{application.name}}</td>\n	        <td style="text-align: right">{{application.uuid}}</td>\n	      </tr>\n	    </table>\n		</div>\n    <bsmodal id="regenerateCredentials"\n             title="Confirmation"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="regenerateCredentialsDialog"\n             extrabuttonlabel="Yes"\n             ng-cloak>\n      Are you sure you want to regenerate the credentials?\n    </bsmodal>\n		<div id="intro-6-org-api-creds">\n	    <h2 class="title" >Organization API Credentials <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'api org credentials\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_org_api_creds}}" tooltip-placement="right">(?)</a>\n	      <div class="header-button btn-group pull-right">\n	        <a class="btn filter-selector" ng-click="showModal(\'regenerateCredentials\')">\n	          <span class="filter-label">Regenerate Org Credentials</span>\n	        </a>\n	      </div>\n	    </h2>\n	\n	    <table class="table table-striped">\n	      <tr>\n	        <td >Client ID</td>\n	        <td style="text-align: right" >{{orgAPICredentials.client_id}}</td>\n	      </tr>\n	      <tr>\n	        <td>Client Secret</td>\n	        <td style="text-align: right">{{orgAPICredentials.client_secret}}</td>\n	      </tr>\n	    </table>\n		</div>\n    <bsmodal id="newAdministrator"\n             title="Create New Administrator"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="newAdministratorDialog"\n             extrabuttonlabel="Create"\n             ng-cloak>\n      <p>New administrator email: <input id="newAdminInput" ug-validate ng-model="$parent.admin.email" pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" required type="email" /></p>\n    </bsmodal>\n		<div id="intro-7-org-admins">\n	    <h2 class="title" >Organization Administrators <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'org admins\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_org_admins}}" tooltip-placement="right">(?)</a>\n	      <div class="header-button btn-group pull-right">\n	        <a class="btn filter-selector" ng-click="showModal(\'newAdministrator\')">\n	          <span class="filter-label">Add New Administrator</span>\n	        </a>\n	      </div>\n	    </h2>\n	\n	    <table class="table table-striped">\n	      <tr ng-repeat="administrator in orgAdministrators">\n	        <td><img style="width:30px;height:30px;" ng-src="{{administrator.image}}"> {{administrator.name}}</td>\n	        <td style="text-align: right">{{administrator.email}}</td>\n	      </tr>\n	    </table>\n			</div>\n  </div>\n\n  <div class="span6">\n  	<div id="intro-8-activities">\n	    <h2 class="title">Activities <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'activities\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities}}" tooltip-placement="right">(?)</a></h2>\n	    <table class="table table-striped">\n	      <tr ng-repeat="activity in activities">\n	        <td>{{activity.title}}</td>\n	        <td style="text-align: right">{{activity.date}}</td>\n	      </tr>\n	    </table>\n	</div>\n  </div>\n\n\n  </section>\n</div>'),$templateCache.put("profile/account.html",'<page-title title=" Account Settings" icon="&#59170"></page-title>\n\n<section class="row-fluid">\n  <div class="span12 tab-content">\n    <div class="menu-toolbar">\n      <ul class="inline">\n        <li class="tab" ng-show="!use_sso" ng-class="currentAccountPage.route === \'/profile/profile\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="profile-link" ng-click="selectAccountPage(\'/profile/profile\')"><i class="pictogram">&#59170;</i>Profile</a></li>\n        <li class="tab" ng-class="currentAccountPage.route === \'/profile/organizations\' ? \'selected\' : \'\'"><a class="btn btn-primary toolbar" id="account-link" ng-click="selectAccountPage(\'/profile/organizations\')"><i class="pictogram">&#128101;</i>Organizations</a></li>\n      </ul>\n    </div>\n    <span ng-include="currentAccountPage.template"></span>\n  </div>\n</section>'),$templateCache.put("profile/organizations.html",'<div class="content-page"   ng-controller="OrgCtrl">\n\n\n\n  <bsmodal id="newOrganization"\n           title="Create New Organization"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addOrganization"\n           extrabuttonlabel="Create"\n           ng-cloak>\n    <fieldset>\n\n      <div class="control-group">\n        <label for="new-user-orgname">Organization Name</label>\n\n        <div class="controls">\n          <input type="text" required title="Name" ug-validate ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" ng-model="$parent.org.name" name="name" id="new-user-orgname" class="input-xlarge"/>\n\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n\n    </fieldset>\n  </bsmodal>\n\n\n      <div class="row-fluid" >\n      <div class="span3 user-col ">\n\n        <div class="button-toolbar span12">\n\n          <button class="btn btn-primary toolbar" ng-click="showModal(\'newOrganization\')" ng-show="true"><i class="pictogram">&#59136;</i>\n          </button>\n        </div>\n        <ul class="user-list">\n          <li ng-class="selectedOrg.uuid === org.uuid ? \'selected\' : \'\'"\n              ng-repeat="org in orgs" ng-click=" selectOrganization(org)">\n\n            <a href="javaScript:void(0)">{{org.name}}</a>\n          </li>\n        </ul>\n      </div>\n      <div class="span9">\n        <div class="row-fluid" >\n          <h4>Organization Information</h4>\n          <div class="span11" ng-show="selectedOrg">\n            <label  class="ui-dform-label">Applications</label>\n            <table class="table table-striped">\n              <tr ng-repeat="app in selectedOrg.applicationsArray">\n                <td> {{app.name}}</td>\n                <td style="text-align: right">{{app.uuid}}</td>\n              </tr>\n            </table>\n            <br/>\n            <label  class="ui-dform-label">Users</label>\n            <table class="table table-striped">\n              <tr ng-repeat="user in selectedOrg.usersArray">\n                <td> {{user.name}}</td>\n                <td style="text-align: right">{{user.email}}</td>\n              </tr>\n            </table>\n            <form ng-submit="leaveOrganization(selectedOrg)">\n              <input type="submit" name="button-leave-org" id="button-leave-org" title="Can only leave if organization has more than 1 user." ng-disabled="!doesOrgHaveUsers(selectedOrg)" value="Leave Organization" class="btn btn-primary pull-right">\n            </form>\n          </div>\n        </div>\n\n      </div>\n        </div>\n</div>'),$templateCache.put("profile/profile.html",'<div class="content-page" ng-controller="ProfileCtrl">\n\n  <div id="account-panels">\n    <div class="panel-content">\n      <div class="console-section">\n        <div class="console-section-contents">\n          <form name="updateAccountForm" id="update-account-form" ng-submit="saveUserInfo()" class="form-horizontal">\n            <fieldset>\n              <div class="control-group">\n                <label id="update-account-id-label" class="control-label" for="update-account-id">UUID</label>\n                <div class="controls">\n                  <span id="update-account-id" class="monospace">{{user.uuid}}</span>\n                </div>\n              </div>\n              <div class="control-group">\n                <label class="control-label" for="update-account-username">Username </label>\n                <div class="controls">\n                  <input type="text" ug-validate name="update-account-username" required ng-pattern="usernameRegex" id="update-account-username" ng-attr-title="{{usernameRegexDescription}}"  class="span4" ng-model="user.username" size="20"/>\n                </div>\n              </div>\n              <div class="control-group">\n                <label class="control-label" for="update-account-name">Name </label>\n                <div class="controls">\n                  <input type="text" ug-validate name="update-account-name" id="update-account-name" ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" class="span4" ng-model="user.name" size="20"/>\n                </div>\n              </div>\n              <div class="control-group">\n                <label class="control-label" for="update-account-email"> Email</label>\n                <div class="controls">\n                  <input type="email" ug-validate required name="update-account-email" ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}"  id="update-account-email" class="span4" ng-model="user.email" size="20"/>\n                </div>\n              </div>\n              <div class="control-group">\n                <label class="control-label" for="update-account-picture-img">Picture <br />(from <a href="http://gravatar.com">gravatar.com</a>) </label>\n                <div class="controls">\n                  <img id="update-account-picture-img" ng-src="{{user.profileImg}}" width="50" />\n                </div>\n              </div>\n              <span class="help-block">Leave blank any of the following to keep the current password unchanged</span>\n              <br />\n              <div class="control-group">\n                <label class="control-label" for="old-account-password">Old Password</label>\n                <div class="controls">\n                  <input type="password" ug-validate name="old-account-password"  id="old-account-password" class="span4" ng-model="user.oldPassword" size="20"/>\n                </div>\n              </div>\n              <div class="control-group">\n                <label class="control-label" for="update-account-password">New Password</label>\n                <div class="controls">\n                  <input type="password"  ug-validate name="update-account-password" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" id="update-account-password" class="span4" ng-model="user.newPassword" size="20"/>\n                </div>\n              </div>\n              <div class="control-group" style="display:none">\n                <label class="control-label" for="update-account-password-repeat">Confirm New Password</label>\n                <div class="controls">\n                  <input type="password" ug-validate name="update-account-password-repeat" ng-pattern="passwordRegex" ng-attr-title="{{passwordRegexDescription}}" id="update-account-password-repeat" class="span4" ng-model="user.newPasswordConfirm" size="20"/>\n                </div>\n              </div>\n            </fieldset>\n            <div class="form-actions">\n              <input type="submit"  class="btn btn-primary"  name="button-update-account" ng-disabled="!updateAccountForm.$valid || loading" id="button-update-account" value="{{loading ? loadingText : \'Update\'}}"  class="btn btn-usergrid"/>\n            </div>\n          </form>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>'),$templateCache.put("roles/roles-groups.html",'<div class="content-page" ng-controller="RolesGroupsCtrl">\n\n\n  <bsmodal id="addRoleToGroup"\n           title="Add group to role"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addRoleToGroupDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <div class="btn-group">\n      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n        <span class="filter-label">{{$parent.path !== \'\' ? $parent.title : \'Select a group...\'}}</span>\n        <span class="caret"></span>\n      </a>\n      <ul class="dropdown-menu">\n        <li ng-repeat="group in $parent.groupsTypeaheadValues" class="filterItem"><a ng-click="setRoleModal(group)">{{group.title}}</a></li>\n      </ul>\n    </div>\n  </bsmodal>\n\n  <bsmodal id="removeGroupFromRole"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="removeGroupFromRoleDialog"\n           extrabuttonlabel="Leave"\n           ng-cloak>\n    <p>Are you sure you want to remove the group from the role(s)?</p>\n  </bsmodal>\n\n\n  <div class="users-section">\n    <div class="button-strip">\n      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'group add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_groups_add_group}}" tooltip-placement="left">(?)</a>\n        <button class="btn btn-primary" ng-click="showModal(\'addRoleToGroup\')">Add Group to Role</button>\n        <button class="btn btn-primary"  ng-disabled="!hasGroups || !valueSelected(rolesCollection.groups._list)" ng-click="showModal(\'removeGroupFromRole\')">Remove Group(s) from Role</button>\n    </div>\n    <table class="table table-striped">\n      <tr class="table-header">\n        <td style="width: 30px;"><input type="checkbox" ng-show="hasGroups" id="selectAllCheckBox" ng-model="roleGroupsSelected" ng-click="selectAllEntities(rolesCollection.groups._list,this,\'roleGroupsSelected\')"></td>\n        <td>Title</td>\n        <td>Path</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="group in rolesCollection.groups._list">\n        <td>\n          <input\n            type="checkbox"\n            ng-model="group.checked"\n            >\n        </td>\n        <td>{{group._data.title}}</td>\n        <td>{{group._data.path}}</td>\n      </tr>\n    </table>\n    <div style="padding: 10px 5px 10px 5px">\n      <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n      <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}" style="float:right;">Next ></button>\n    </div>\n  </div>\n</div>'),$templateCache.put("roles/roles-settings.html",'<div class="content-page" ng-controller="RolesSettingsCtrl">\n  <bsmodal id="deletePermission"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="deleteRolePermissionDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to delete the permission(s)?</p>\n  </bsmodal>\n\n\n  <bsmodal id="addPermission"\n           title="New Permission"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addRolePermissionDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" required ng-pattern="pathRegex" ng-attr-title="{{pathRegexDescription}}" ug-validate id="rolePermissionsPath"/> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission verbs\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n    </div>\n    <div class="control-group">\n      <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n    </div>\n  </bsmodal>\n\n  <div>\n    <h4>Inactivity <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles inactivity\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_inactivity}}" tooltip-placement="right">(?)</a></h4>\n    <div id="role-permissions">\n        <p>Integer only. 0 (zero) means no expiration.</p>\n\n        <form name="updateActivity" ng-submit="updateInactivity()" novalidate>\n            Seconds: <input style="margin: 0" type="number" required name="role-inactivity"\n                            id="role-inactivity-input" min="0" ng-model="role._data.inactivity" title="Please input a positive integer >= 0."  step = "any" ug-validate >\n            <input type="submit" class="btn btn-primary" ng-disabled="!updateActivity.$valid" value="Set"/>\n        </form>\n    </div>\n\n    <br/>\n    <div class="button-strip">\n      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles details add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n      <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n      <button class="btn btn-primary"  ng-disabled="!hasSettings || !valueSelected(role.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n    </div>\n\n    <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles settings permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_permissions}}" tooltip-placement="top">(?)</a></h4>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td style="width: 30px;"><input type="checkbox" ng-show="hasSettings" id="selectAllCheckBox" ng-model="permissionsSelected" ng-click="selectAllEntities(role.permissions,this,\'permissionsSelected\')" ></td>\n        <td>Path</td>\n        <td>GET</td>\n        <td>POST</td>\n        <td>PUT</td>\n        <td>DELETE</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="permission in role.permissions">\n        <td>\n          <input\n            type="checkbox"\n            ng-model="permission.checked"\n            >\n        </td>\n        <td>{{permission.path}}</td>\n        <td>{{permission.operations.get}}</td>\n        <td>{{permission.operations.post}}</td>\n        <td>{{permission.operations.put}}</td>\n        <td>{{permission.operations.delete}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n</div>'),$templateCache.put("roles/roles-tabs.html",'<div class="content-page">\n  <section class="row-fluid">\n\n    <div class="span12">\n      <div class="page-filters">\n        <h1 class="title" class="pull-left"><i class="pictogram title">&#59170;</i> Roles </h1>\n        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles page title\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_page_title}}" tooltip-placement="right">(?)</a>\n      </div>\n    </div>\n\n  </section>\n\n  <div id="user-panel" class="panel-buffer">\n    <ul id="user-panel-tab-bar" class="nav nav-tabs">\n      <li><a href="javaScript:void(0);" ng-click="gotoPage(\'roles\')">Roles List</a></li>\n      <li ng-class="settingsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/settings\')">Settings</a></li>\n      <li ng-class="usersSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/users\')">Users</a></li>\n      <li ng-class="groupsSelected"><a href="javaScript:void(0);" ng-click="gotoPage(\'roles/groups\')">Groups</a></li>\n    </ul>\n  </div>\n\n  <div style="float: left; margin-right: 10px;">\n    <div style="float: left;">\n      <div class="user-header-title"><strong>Role Name: </strong>{{selectedRole.name}}</div>\n      <div class="user-header-title"><strong>Role Title: </strong>{{selectedRole.title}}</div>\n    </div>\n  </div>\n\n</div>\n<br>\n<br>'),$templateCache.put("roles/roles-users.html",'<div class="content-page" ng-controller="RolesUsersCtrl">\n  <bsmodal id="removeFromRole"\n           title="Confirmation"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="removeUsersFromGroupDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to remove the users from the seleted role(s)?</p>\n  </bsmodal>\n\n  <bsmodal id="addRoleToUser"\n           title="Add user to role"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addRoleToUserDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <div class="btn-group">\n      <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n        <span class="filter-label">{{$parent.user.username ? $parent.user.username : \'Select a user...\'}}</span>\n        <span class="caret"></span>\n      </a>\n      <ul class="dropdown-menu">\n        <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n      </ul>\n    </div>\n  </bsmodal>\n\n  <div class="users-section">\n    <div class="button-strip">\n      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles add user button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_users_add_user}}" tooltip-placement="left">(?)</a>\n        <button class="btn btn-primary" ng-click="showModal(\'addRoleToUser\')">Add User to Role</button>\n        <button class="btn btn-primary"  ng-disabled="!hasUsers || !valueSelected(rolesCollection.users._list)" ng-click="showModal(\'removeFromRole\')">Remove User(s) from Role</button>\n    </div>\n    <table class="table table-striped">\n      <tr class="table-header">\n        <td style="width: 30px;"><input type="checkbox" ng-show="hasUsers" id="selectAllCheckBox" ng-model="roleUsersSelected" ng-click="selectAllEntities(rolesCollection.users._list,this,\'roleUsersSelected\')" ng-model="master"></td>\n        <td style="width: 50px;"></td>\n        <td>Username</td>\n        <td>Display Name</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="user in rolesCollection.users._list">\n        <td>\n          <input\n            type="checkbox"\n            ng-model="user.checked"\n            >\n        </td>\n        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n        <td>{{user._data.username}}</td>\n        <td>{{user._data.name}}</td>\n      </tr>\n    </table>\n    <div style="padding: 10px 5px 10px 5px">\n      <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n      <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n    </div>\n  </div>\n</div>'),$templateCache.put("roles/roles.html",'<div class="content-page">\n  <div id="intro-page" >\n    <page-title title=" Roles" icon="&#59170;"></page-title>\n  </div>\n\n  <bsmodal id="newRole"\n           title="New Role"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="newRoleDialog"\n           extrabuttonlabel="Create"\n           buttonid="roles"\n           ng-cloak>\n          <fieldset>\n            <div class="control-group">\n              <label for="new-role-roletitle">Title</label>\n              <div class="controls">\n                <input type="text" ng-pattern="titleRegex" ng-attr-title="{{titleRegexDescription}}" required ng-model="$parent.newRole.title" name="roletitle" id="new-role-roletitle" class="input-xlarge" ug-validate/>\n                <p class="help-block hide"></p>\n              </div>\n            </div>\n            <div class="control-group">\n              <label for="new-role-rolename">Role Name</label>\n              <div class="controls">\n                <input type="text" required ng-pattern="roleNameRegex" ng-attr-title="{{roleNameRegexDescription}}" ng-model="$parent.newRole.name" name="rolename" id="new-role-rolename" class="input-xlarge" ug-validate/>\n                <p class="help-block hide"></p>\n              </div>\n            </div>\n          </fieldset>\n  </bsmodal>\n\n  <bsmodal id="deleteRole"\n           title="Delete Role"\n           close="hideModal"\n           closelabel="Cancel"\n           buttonid="deleteroles"\n           extrabutton="deleteRoleDialog"\n           extrabuttonlabel="Delete"\n           ng-cloak>\n    <p>Are you sure you want to delete the role(s)?</p>\n  </bsmodal>\n\n  <section class="row-fluid">\n    <div id="intro-list" class="span3 user-col">\n\n      <div class="button-toolbar span12">\n        <a title="Select All" class="btn btn-primary select-all toolbar" ng-show="hasRoles" ng-click="selectAllEntities(rolesCollection._list,this,\'rolesSelected\',true)"> <i class="pictogram">&#8863;</i></a>\n        <button id="delete-role-btn" title="Delete" class="btn btn-primary toolbar"  ng-disabled="!hasRoles || !valueSelected(rolesCollection._list)" ng-click="showModal(\'deleteRole\')"><i class="pictogram">&#9749;</i></button>\n        <button id="add-role-btn" title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newRole\')"><i class="pictogram">&#59136;</i></button>\n        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add remove buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_remove_buttons}}" tooltip-placement="right">(?)</a>      </div>\n\n      <ul class="user-list">\n        <li ng-class="selectedRole._data.uuid === role._data.uuid ? \'selected\' : \'\'" ng-repeat="role in rolesCollection._list" ng-click="selectRole(role._data.uuid)">\n          <input\n              type="checkbox"\n              ng-value="role.get(\'uuid\')"\n              ng-checked="master"\n              ng-model="role.checked"\n              id="role-{{role.get(\'title\')}}-cb"\n              >\n          <a id="role-{{role.get(\'title\')}}-link">{{role.get(\'title\')}}</a>\n          <br/>\n          <span ng-if="role.get(\'name\')" class="label">Role Name:</span>{{role.get(\'name\')}}\n        </li>\n      </ul>\n\n\n\n  <div style="padding: 10px 5px 10px 5px">\n    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}};float:right;">Next ></button>\n  </div>\n\n    </div>\n    \n    <div id="intro-information-tabs" class="span9 tab-content" ng-show="hasRoles">\n      <div class="menu-toolbar">\n        <ul class="inline">\n          <li class="tab" ng-class="currentRolesPage.route === \'/roles/settings\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/settings\')"><i class="pictogram">&#59170;</i>Settings</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles settings tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_settings_tab}}" tooltip-placement="right">(?)</a></div></li>\n          <li class="tab" ng-class="currentRolesPage.route === \'/roles/users\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/users\')"><i class="pictogram">&#128101;</i>Users</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles users tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_users_tab}}" tooltip-placement="right">(?)</a></div></li>\n          <li class="tab" ng-class="currentRolesPage.route === \'/roles/groups\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectRolePage(\'/roles/groups\')"><i class="pictogram">&#59194;</i>Groups</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'roles groups tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_groups_tab}}" tooltip-placement="right">(?)</a></div></li>\n        </ul>\n      </div>\n      <span ng-include="currentRolesPage.template"></span>\n    </div>\n  </section>\n</div>'),$templateCache.put("shell/shell.html",'<page-title title=" Shell" icon="&#128241;"></page-title>\n\n<section class="row-fluid">\n  <div class="console-section-contents" id="shell-panel">\n    <div id="shell-input-div">\n      <p> Type "help" to view a list of the available commands.</p>\n      <hr>\n\n      <form name="shellForm" ng-submit="submitCommand()" >\n        <span>&nbsp;&gt;&gt; </span>\n        <input  type="text" id="shell-input"  ng-model="shell.input" autofocus="autofocus" required\n                  ng-form="shellForm">\n        <input style="display: none" type="submit" ng-form="shellForm" value="submit" ng-disabled="!shell.input"/>\n      </form>\n    </div>\n    <pre id="shell-output" class="prettyprint lang-js" style="overflow-x: auto; height: 400px;" ng-bind-html="shell.output">\n\n    </pre>\n    <div id="lastshelloutput" ng-bind-html="shell.outputhidden" style="visibility:hidden"></div>\n  </div>\n</section>\n'),$templateCache.put("users/users-activities.html",'<div class="content-page" ng-controller="UsersActivitiesCtrl" >\n\n  <bsmodal id="addActivityToUser"\n           title="Add activity to user"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="addActivityToUserDialog"\n           extrabuttonlabel="Add"\n           ng-cloak>\n    <p>Content: <input id="activityMessage" ng-model="$parent.newActivity.activityToAdd" required name="activityMessage" ug-validate /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add activity content\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_add_activity_content}}" tooltip-placement="right">(?)</a></p>\n  </bsmodal>\n\n\n  <div ng:include="\'users/users-tabs.html\'"></div>\n  <br>\n    <div class="button-strip"><a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add activity button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_add_activity}}" tooltip-placement="left">(?)</a> \n    <button class="btn btn-primary" ng-click="showModal(\'addActivityToUser\')">Add activity to user</button>\n  </div>\n  <div>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>Date</td>\n        <td>Content</td>\n        <td>Verb</td>\n        <td>UUID</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="activity in activities">\n        <td>{{activity.createdDate}}</td>\n        <td>{{activity.content}}</td>\n        <td>{{activity.verb}}</td>\n        <td>{{activity.uuid}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n\n\n</div>\n'),$templateCache.put("users/users-feed.html",'<div class="content-page" ng-controller="UsersFeedCtrl" >\n\n    <div ng:include="\'users/users-tabs.html\'"></div>\n    <br>\n    <div>\n        <table class="table table-striped">\n            <tbody>\n            <tr class="table-header">\n                <td>Date</td>\n                <td>User</td>\n                <td>Content</td>\n                <td>Verb</td>\n                <td>UUID</td>\n            </tr>\n            <tr class="zebraRows" ng-repeat="activity in activities">\n                <td>{{activity.createdDate}}</td>\n                <td>{{activity.actor.displayName}}</td>\n                <td>{{activity.content}}</td>\n                <td>{{activity.verb}}</td>\n                <td>{{activity.uuid}}</td>\n            </tr>\n            </tbody>\n        </table>\n    </div>\n\n\n</div>\n'),$templateCache.put("users/users-graph.html",'<div class="content-page" ng-controller="UsersGraphCtrl">\n\n  <div ng:include="\'users/users-tabs.html\'"></div>\n\n  <div>\n\n    <bsmodal id="followUser"\n             title="Follow User"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="followUserDialog"\n             extrabuttonlabel="Add"\n             ng-cloak>\n      <div class="btn-group">\n        <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n          <span class="filter-label">{{$parent.user != \'\' ? $parent.user.username : \'Select a user...\'}}</span>\n          <span class="caret"></span>\n        </a>\n        <ul class="dropdown-menu">\n          <li ng-repeat="user in $parent.usersTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.user = user">{{user.username}}</a></li>\n        </ul>\n      </div>\n    </bsmodal>\n\n\n    <div class="button-strip">\n      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users follow user\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_follow_user}}" tooltip-placement="left">(?)</a> \n      <button class="btn btn-primary" ng-click="showModal(\'followUser\')">Follow User</button>\n    </div>\n    <br>\n      <h4>Following <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users following list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_following}}" tooltip-placement="right">(?)</a></h4>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>Image</td>\n        <td>Username</td>\n        <td>Email</td>\n        <td>UUID</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="user in selectedUser.following">\n        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n        <td>{{user.username}}</td>\n        <td>{{user.email}}</td>\n        <td>{{user.uuid}}</td>\n      </tr>\n      </tbody>\n    </table>\n\n      <h4>Followers <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users followers list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_followers}}" tooltip-placement="right">(?)</a></h4>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>Image</td>\n        <td>Username</td>\n        <td>Email</td>\n        <td>UUID</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="user in selectedUser.followers">\n        <td><img style="width:30px;height:30px;" ng-src="{{user._portal_image_icon}}"></td>\n        <td>{{user.username}}</td>\n        <td>{{user.email}}</td>\n        <td>{{user.uuid}}</td>\n      </tr>\n      </tbody>\n    </table>\n\n  </div>\n</div>'),$templateCache.put("users/users-groups.html",'<div class="content-page" ng-controller="UsersGroupsCtrl">\n\n  <div ng:include="\'users/users-tabs.html\'"></div>\n\n  <div>\n\n    <bsmodal id="addUserToGroup"\n             title="Add user to group"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="addUserToGroupDialog"\n             extrabuttonlabel="Add"\n             ng-cloak>\n      <div class="btn-group">\n        <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n          <span class="filter-label">{{$parent.title && $parent.title !== \'\' ? $parent.title : \'Select a group...\'}}</span>\n          <span class="caret"></span>\n        </a>\n        <ul class="dropdown-menu">\n          <li ng-repeat="group in $parent.groupsTypeaheadValues" class="filterItem"><a ng-click="selectGroup(group)">{{group.title}}</a></li>\n        </ul>\n      </div>\n    </bsmodal>\n\n    <bsmodal id="leaveGroup"\n             title="Confirmation"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="leaveGroupDialog"\n             extrabuttonlabel="Leave"\n             ng-cloak>\n      <p>Are you sure you want to remove the user from the seleted group(s)?</p>\n    </bsmodal>\n\n    <div class="button-strip">\n      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add leave group buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_add_leave_buttons}}" tooltip-placement="left">(?)</a>\n      <button class="btn btn-primary" ng-click="showModal(\'addUserToGroup\')">Add to group</button>\n      <button class="btn btn-primary" ng-disabled="!hasGroups || !valueSelected(userGroupsCollection._list)" ng-click="showModal(\'leaveGroup\')">Leave group(s)</button>\n    </div>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td>\n          <input type="checkbox" ng-show="hasGroups" id="selectAllCheckBox" ng-model="userGroupsSelected" ng-click="selectAllEntities(userGroupsCollection._list,this,\'userGroupsSelected\')" >\n        </td>\n        <td>Group Name <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'add user group list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_group_name}}" tooltip-placement="top">(?)</a></td>\n        <td>Path</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="group in userGroupsCollection._list">\n        <td>\n          <input\n            type="checkbox"\n            ng-value="group.get(\'uuid\')"\n            ng-model="group.checked"\n            >\n        </td>\n        <td>{{group.get(\'title\')}}</td>\n        <td>{{group.get(\'path\')}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n  <div style="padding: 10px 5px 10px 5px">\n    <button class="btn btn-primary" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous</button>\n    <button class="btn btn-primary" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next ></button>\n  </div>\n\n</div>\n'),$templateCache.put("users/users-profile.html",'<div class="content-page" ng-controller="UsersProfileCtrl">\n\n  <div ng:include="\'users/users-tabs.html\'"></div>\n\n  <div class="row-fluid">\n\n  <form ng-submit="saveSelectedUser()" name="profileForm" novalidate>\n    <div class="span6">\n      <h4>User Information <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile information\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_information}}" tooltip-placement="top">(?)</a></h4>\n      <label for="ui-form-username" class="ui-dform-label">Username</label>\n      <input type="text" ug-validate required  name="ui-form-username" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}" id="ui-form-username" class="ui-dform-text" ng-model="user.username">\n      <br/>\n      <label for="ui-form-name" class="ui-dform-label">Full Name</label>\n      <input type="text" ug-validate ng-pattern="nameRegex" ng-attr-title="{{nameRegexDescription}}" required name="ui-form-name" id="ui-form-name" class="ui-dform-text" ng-model="user.name">\n      <br/>\n      <label for="ui-form-title" class="ui-dform-label">Title</label>\n      <input type="text" ug-validate name="ui-form-title" id="ui-form-title" class="ui-dform-text" ng-model="user.title">\n      <br/>\n      <label for="ui-form-url" class="ui-dform-label">Home Page</label>\n      <input type="url" ug-validate name="ui-form-url" id="ui-form-url" title="Please enter a valid url." class="ui-dform-text" ng-model="user.url">\n      <br/>\n      <label for="ui-form-email" class="ui-dform-label">Email</label>\n      <input type="email" ug-validate required name="ui-form-email" id="ui-form-email"  ng-pattern="emailRegex" ng-attr-title="{{emailRegexDescription}}" class="ui-dform-text" ng-model="user.email">\n      <br/>\n      <label for="ui-form-tel" class="ui-dform-label">Telephone</label>\n      <input type="tel" ug-validate name="ui-form-tel" id="ui-form-tel" class="ui-dform-text" ng-model="user.tel">\n      <br/>\n      <label for="ui-form-picture" class="ui-dform-label">Picture URL</label>\n      <input type="url" ug-validate name="ui-form-picture" id="ui-form-picture" title="Please enter a valid url." ng class="ui-dform-text" ng-model="user.picture">\n      <br/>\n      <label for="ui-form-bday" class="ui-dform-label">Birthday</label>\n      <input type="date" ug-validate name="ui-form-bday" id="ui-form-bday" class="ui-dform-text" ng-model="user.bday">\n      <br/>\n    </div>\n    <div class="span6">\n      <h4>Address</h4>\n      <label for="ui-form-addr1" class="ui-dform-label">Street 1</label>\n      <input type="text" ug-validate name="ui-form-addr1" id="ui-form-addr1" class="ui-dform-text" ng-model="user.adr.addr1">\n      <br/>\n      <label for="ui-form-addr2" class="ui-dform-label">Street 2</label>\n      <input type="text" ug-validate name="ui-form-addr2" id="ui-form-addr2" class="ui-dform-text" ng-model="user.adr.addr2">\n      <br/>\n      <label for="ui-form-city" class="ui-dform-label">City</label>\n      <input type="text" ug-validate name="ui-form-city" id="ui-form-city" class="ui-dform-text" ng-model="user.adr.city">\n      <br/>\n      <label for="ui-form-state" class="ui-dform-label">State</label>\n      <input type="text" ug-validate name="ui-form-state" id="ui-form-state"  ng-attr-title="{{stateRegexDescription}}" ng-pattern="stateRegex" class="ui-dform-text" ng-model="user.adr.state">\n      <br/>\n      <label for="ui-form-zip" class="ui-dform-label">Zip</label>\n      <input type="text" ug-validate name="ui-form-zip" ng-pattern="zipRegex" ng-attr-title="{{zipRegexDescription}}" id="ui-form-zip" class="ui-dform-text" ng-model="user.adr.zip">\n      <br/>\n      <label for="ui-form-country" class="ui-dform-label">Country</label>\n      <input type="text" ug-validate name="ui-form-country" ng-attr-title="{{countryRegexDescription}}" ng-pattern="countryRegex" id="ui-form-country" class="ui-dform-text" ng-model="user.adr.country">\n      <br/>\n    </div>\n\n      <div class="span6">\n        <input type="submit" class="btn btn-primary margin-35" ng-disabled="!profileForm.$valid"  value="Save User"/>\n      </div>\n\n\n    <div class="content-container">\n      <legend>JSON User Object <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile json\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_json}}" tooltip-placement="top">(?)</a></legend>\n      <pre id="{{help.showJsonId}}">{{user.json}}</pre>\n    </div>\n    </form>\n  </div>\n\n</div>\n'),$templateCache.put("users/users-roles.html",'<div class="content-page" ng-controller="UsersRolesCtrl">\n\n  <div ng:include="\'users/users-tabs.html\'"></div>\n\n  <div>\n\n    <bsmodal id="addRole"\n             title="Add user to role"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="addUserToRoleDialog"\n             extrabuttonlabel="Add"\n             ng-cloak>\n      <div class="btn-group">\n        <a class="btn dropdown-toggle filter-selector" data-toggle="dropdown">\n          <span class="filter-label">{{$parent.name != \'\' ? $parent.name : \'Select a Role...\'}}</span>\n          <span class="caret"></span>\n        </a>\n        <ul class="dropdown-menu">\n          <li ng-repeat="role in $parent.rolesTypeaheadValues" class="filterItem"><a ng-click="$parent.$parent.name = role.name">{{role.name}}</a></li>\n        </ul>\n      </div>\n    </bsmodal>\n\n    <bsmodal id="leaveRole"\n             title="Confirmation"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="leaveRoleDialog"\n             extrabuttonlabel="Leave"\n             ng-cloak>\n      <p>Are you sure you want to remove the user from the role(s)?</p>\n    </bsmodal>\n\n<div ng-controller="UsersRolesCtrl">\n\n<div class="button-strip">\n  <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add role button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_leave_role}}" tooltip-placement="left">(?)</a>\n      <button class="btn btn-primary" ng-click="showModal(\'addRole\')">Add Role</button>\n      <button class="btn btn-primary" ng-disabled="!hasRoles || !valueSelected(selectedUser.roles)" ng-click="showModal(\'leaveRole\')">Leave role(s)</button>\n    </div>\n    <br>\n      <h4>Roles <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles roles list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_roles}}" tooltip-placement="top">(?)</a></h4>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td style="width: 30px;"><input type="checkbox" ng-show="hasRoles" id="rolesSelectAllCheckBox" ng-model="usersRolesSelected" ng-click="selectAllEntities(selectedUser.roles,this,\'usersRolesSelected\',true)" ></td>\n        <td>Role Name</td>\n        <td>Role title</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="role in selectedUser.roles">\n        <td>\n          <input\n            type="checkbox"\n            ng-model="role.checked"\n            >\n        </td>\n        <td>{{role.name}}</td>\n        <td>{{role.title}}</td>\n      </tr>\n      </tbody>\n    </table>\n\n    <bsmodal id="deletePermission"\n             title="Confirmation"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="deletePermissionDialog"\n             extrabuttonlabel="Delete"\n             ng-cloak>\n      <p>Are you sure you want to delete the permission(s)?</p>\n    </bsmodal>\n\n    <bsmodal id="addPermission"\n             title="New Permission"\n             close="hideModal"\n             closelabel="Cancel"\n             extrabutton="addUserPermissionDialog"\n             extrabuttonlabel="Add"\n             ng-cloak>\n      <p>Path: <input ng-model="$parent.permissions.path" placeholder="ex: /mydata" id="usersRolePermissions" type="text" ng-pattern="pathRegex" required ug-validate ng-attr-title="{{pathRegexDescription}}" /> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission path box\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_path}}" tooltip-placement="right">(?)</a></p>\n      <div class="control-group">\n        <input type="checkbox" ng-model="$parent.permissions.getPerm"> GET <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles new permission verbs check boxes\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_new_permission_verbs}}" tooltip-placement="right">(?)</a>\n      </div>\n      <div class="control-group">\n        <input type="checkbox" ng-model="$parent.permissions.postPerm"> POST\n      </div>\n      <div class="control-group">\n        <input type="checkbox" ng-model="$parent.permissions.putPerm"> PUT\n      </div>\n      <div class="control-group">\n        <input type="checkbox" ng-model="$parent.permissions.deletePerm"> DELETE\n      </div>\n    </bsmodal>\n\n    <div class="button-strip">\n      <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles add permission button\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_add_delete_permission}}" tooltip-placement="left">(?)</a>\n      <button class="btn btn-primary" ng-click="showModal(\'addPermission\')">Add Permission</button>\n      <button class="btn btn-primary" ng-disabled="!hasPermissions || !valueSelected(selectedUser.permissions)" ng-click="showModal(\'deletePermission\')">Delete Permission(s)</button>\n    </div>\n    <br>\n      <h4>Permissions <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles permissions list\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_permissions}}" tooltip-placement="top">(?)</a></h4>\n    <table class="table table-striped">\n      <tbody>\n      <tr class="table-header">\n        <td style="width: 30px;"><input type="checkbox" ng-show="hasPermissions"  id="permissionsSelectAllCheckBox" ng-model="usersPermissionsSelected" ng-click="selectAllEntities(selectedUser.permissions,this,\'usersPermissionsSelected\',true)"  ></td>\n        <td>Path</td>\n        <td>GET</td>\n        <td>POST</td>\n        <td>PUT</td>\n        <td>DELETE</td>\n      </tr>\n      <tr class="zebraRows" ng-repeat="permission in selectedUser.permissions">\n        <td>\n          <input\n            type="checkbox"\n            ng-model="permission.checked"\n            >\n        </td>\n        <td>{{permission.path}}</td>\n        <td>{{permission.operations.get}}</td>\n        <td>{{permission.operations.post}}</td>\n        <td>{{permission.operations.put}}</td>\n        <td>{{permission.operations.delete}}</td>\n      </tr>\n      </tbody>\n    </table>\n  </div>\n </div>\n\n</div>\n'),$templateCache.put("users/users-tabs.html","\n\n\n"),$templateCache.put("users/users.html",'<div class="content-page">\n\n  <div id="intro-page">    \n    <page-title title=" Users" icon="&#128100;"></page-title>\n  </div>\n  <bsmodal id="newUser"\n           title="Create New User"\n           close="hideModal"\n           closelabel="Cancel"\n           buttonid="users"\n           extrabutton="newUserDialog"\n           extrabuttonlabel="Create"\n           ng-cloak>\n    <fieldset>\n      <div class="control-group">\n        <label for="new-user-username">Username</label>\n\n        <div class="controls">\n          <input type="text" required ng-model="$parent.newUser.newusername" ng-pattern="usernameRegex" ng-attr-title="{{usernameRegexDescription}}"  name="username" id="new-user-username" class="input-xlarge" ug-validate/>\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n      <div class="control-group">\n        <label for="new-user-fullname">Full name</label>\n\n        <div class="controls">\n          <input type="text" required  ng-attr-title="{{nameRegexDescription}}" ng-pattern="nameRegex" ng-model="$parent.newUser.name" name="name" id="new-user-fullname" class="input-xlarge" ug-validate/>\n\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n      <div class="control-group">\n        <label for="new-user-email">Email</label>\n\n        <div class="controls">\n          <input type="email" required  ng-model="$parent.newUser.email" pattern="emailRegex"   ng-attr-title="{{emailRegexDescription}}"  name="email" id="new-user-email" class="input-xlarge" ug-validate/>\n\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n      <div class="control-group">\n        <label for="new-user-password">Password</label>\n\n        <div class="controls">\n          <input type="password" required ng-pattern="passwordRegex"  ng-attr-title="{{passwordRegexDescription}}" ng-model="$parent.newUser.newpassword" name="password" id="new-user-password" ug-validate\n                 class="input-xlarge"/>\n\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n      <div class="control-group">\n        <label for="new-user-re-password">Confirm password</label>\n\n        <div class="controls">\n          <input type="password" required ng-pattern="passwordRegex"  ng-attr-title="{{passwordRegexDescription}}" ng-model="$parent.newUser.repassword" name="re-password" id="new-user-re-password" ug-validate\n                 class="input-xlarge"/>\n\n          <p class="help-block hide"></p>\n        </div>\n      </div>\n    </fieldset>\n  </bsmodal>\n\n  <bsmodal id="deleteUser"\n           title="Delete User"\n           close="hideModal"\n           closelabel="Cancel"\n           extrabutton="deleteUsersDialog"\n           extrabuttonlabel="Delete"\n           buttonid="deleteusers"\n           ng-cloak>\n    <p>Are you sure you want to delete the user(s)?</p>\n  </bsmodal>\n\n  <section class="row-fluid">\n    <div id="intro-list" class="span3 user-col">\n      \n      <div class="button-toolbar span12">\n          <a title="Select All" class="btn btn-primary toolbar select-all" ng-show="hasUsers" ng-click="selectAllEntities(usersCollection._list,this,\'usersSelected\',true)" ng-model="usersSelected"> <i class="pictogram">&#8863;</i></a>\n          <button title="Delete" class="btn btn-primary toolbar" ng-disabled="!hasUsers || !valueSelected(usersCollection._list)" ng-click="showModal(\'deleteUser\')" id="delete-user-button"><i class="pictogram">&#9749;</i></button>\n        <button title="Add" class="btn btn-primary toolbar" ng-click="showModal(\'newUser\')" id="new-user-button" ng-attr-id="new-user-button"><i class="pictogram">&#59136;</i></button>\n        <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users add remove buttons\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_users_add_remove_buttons}}" tooltip-placement="right">(?)</a>\n      </div>\n      <ul class="user-list">\n          <li ng-class="selectedUser._data.uuid === user._data.uuid ? \'selected\' : \'\'" ng-repeat="user in usersCollection._list" ng-click="selectUser(user._data.uuid)">\n            <input\n                type="checkbox"\n                id="user-{{user.get(\'username\')}}-checkbox"\n                ng-value="user.get(\'uuid\')"\n                ng-checked="master"\n                ng-model="user.checked"\n                >\n              <a href="javaScript:void(0)"  id="user-{{user.get(\'username\')}}-link" >{{user.get(\'username\')}}</a>\n              <span ng-if="user.name" class="label">Display Name:</span>{{user.name}}\n            </li>\n        </ul>\n        <div style="padding: 10px 5px 10px 5px">\n          <button class="btn btn-primary toolbar" ng-click="getPrevious()" style="display:{{previous_display}}">< Previous\n          </button>\n          <button class="btn btn-primary toolbar" ng-click="getNext()" style="display:{{next_display}}; float:right;">Next >\n          </button>\n        </div>\n      \n    </div>\n\n    <div id="{{help.showTabsId}}" class="span9 tab-content" ng-show="hasUsers">\n      <div class="menu-toolbar">\n        <ul class="inline">\n          <li class="tab" ng-class="currentUsersPage.route === \'/users/profile\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/profile\')"><i class="pictogram">&#59170;</i>Profile</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users profile tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_profile_tab}}" tooltip-placement="right">(?)</a></div></li>\n          <li class="tab" ng-class="currentUsersPage.route === \'/users/groups\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/groups\')"><i class="pictogram">&#128101;</i>Groups</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users groups tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_groups_tab}}" tooltip-placement="right">(?)</a></div></li>\n          <li class="tab" ng-class="currentUsersPage.route === \'/users/activities\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/activities\')"><i class="pictogram">&#59194;</i>Activities</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users activities tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_activities_tab}}" tooltip-placement="right">(?)</a></div></li>\n          <li class="tab" ng-class="currentUsersPage.route === \'/users/feed\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/feed\')"><i class="pictogram">&#128196;</i>Feed</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users feed tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_feed_tab}}" tooltip-placement="right">(?)</a></div></li>\n          <li class="tab" ng-class="currentUsersPage.route === \'/users/graph\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/graph\')"><i class="pictogram">&#9729;</i>Graph</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users graph tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_graph_tab}}" tooltip-placement="top">(?)</a></div></li>\n          <li class="tab" ng-class="currentUsersPage.route === \'/users/roles\' ? \'selected\' : \'\'"><div class="btn btn-primary toolbar" ><a class="btn-content" ng-click="selectUserPage(\'/users/roles\')"><i class="pictogram">&#127758;</i>Roles &amp; Permissions</a> <a class="help_tooltip" ng-mouseover="help.sendTooltipGA(\'users roles tab\')" ng-show="help.helpTooltipsEnabled" href="#" ng-attr-tooltip="{{tooltip_roles_tab}}" tooltip-placement="top">(?)</a></div></li>\n        </ul>\n      </div>\n      <span ng-include="currentUsersPage.template"></span>\n    </div>\n  </section>\n</div>')
 }]),AppServices.Controllers.controller("UsersActivitiesCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){$scope.activitiesSelected="active",$scope.activityToAdd="",$scope.activities=[],$scope.newActivity={};var getActivities=function(){ug.getEntityActivities($rootScope.selectedUser)};return $rootScope.selectedUser?(getActivities(),$scope.addActivityToUserDialog=function(modalId){ug.addUserActivity($rootScope.selectedUser,$scope.newActivity.activityToAdd),$scope.hideModal(modalId),$scope.newActivity={}},$scope.$on("user-activity-add-error",function(){$rootScope.$broadcast("alert","error","could not create activity")}),$scope.$on("user-activity-add-success",function(){$scope.newActivity.activityToAdd="",getActivities()}),$scope.$on("users-activities-error",function(){$rootScope.$broadcast("alert","error","could not create activity")}),void $scope.$on("users-activities-received",function(evt,entities){$scope.activities=entities,$scope.applyScope()})):void $location.path("/users")}]),AppServices.Controllers.controller("UsersCtrl",["ug","$scope","$rootScope","$location","$route",function(ug,$scope,$rootScope,$location,$route){$scope.newUser={},$scope.usersCollection={},$rootScope.selectedUser={},$scope.previous_display="none",$scope.next_display="none",$scope.hasUsers=!1,$scope.currentUsersPage={},$scope.selectUserPage=function(route){$scope.currentUsersPage.template=$route.routes[route].templateUrl,$scope.currentUsersPage.route=route,clearNewUserForm()},$scope.deleteUsersDialog=function(modalId){$scope.deleteEntities($scope.usersCollection,"user-deleted","error deleting user"),$scope.hideModal(modalId),clearNewUserForm()},$scope.$on("user-deleted-error",function(){ug.getUsers()});var clearNewUserForm=function(){$scope.newUser={}};$scope.newUserDialog=function(modalId){switch(!0){case $scope.newUser.newpassword!==$scope.newUser.repassword:$rootScope.$broadcast("alert","error","Passwords do not match.");break;default:ug.createUser($scope.newUser.newusername,$scope.newUser.name,$scope.newUser.email,$scope.newUser.newpassword),$scope.hideModal(modalId),clearNewUserForm()}},ug.getUsers(),$scope.$on("users-received",function(event,users){$scope.usersCollection=users,$scope.usersSelected=!1,$scope.hasUsers=users._list.length,users._list.length>0&&$scope.selectUser(users._list[0]._data.uuid),$scope.checkNextPrev(),$scope.applyScope()}),$scope.$on("users-create-success",function(){$rootScope.$broadcast("alert","success","User successfully created.")}),$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.usersCollection.hasPreviousPage()&&($scope.previous_display=""),$scope.usersCollection.hasNextPage()&&($scope.next_display="")},$scope.selectUser=function(uuid){$rootScope.selectedUser=$scope.usersCollection.getEntityByUUID(uuid),$scope.currentUsersPage.template="users/users-profile.html",$scope.currentUsersPage.route="/users/profile",$rootScope.$broadcast("user-selection-changed",$rootScope.selectedUser)},$scope.getPrevious=function(){$scope.usersCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of users"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.getNext=function(){$scope.usersCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of users"),$scope.checkNextPrev(),$scope.applyScope()})},$scope.$on("user-deleted",function(){$rootScope.$broadcast("alert","success","User deleted successfully."),ug.getUsers()})}]),AppServices.Controllers.controller("UsersFeedCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){$scope.activitiesSelected="active",$scope.activityToAdd="",$scope.activities=[],$scope.newActivity={};var getFeed=function(){ug.getEntityActivities($rootScope.selectedUser,!0)};return $rootScope.selectedUser?(getFeed(),$scope.$on("users-feed-error",function(){$rootScope.$broadcast("alert","error","could not create activity")}),void $scope.$on("users-feed-received",function(evt,entities){$scope.activities=entities,$scope.applyScope()})):void $location.path("/users")}]),AppServices.Controllers.controller("UsersGraphCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.graphSelected="active",$scope.user="",ug.getUsersTypeAhead(),$scope.followUserDialog=function(modalId){$scope.user?(ug.followUser($scope.user.uuid),$scope.hideModal(modalId)):$rootScope.$broadcast("alert","error","You must specify a user to follow.")},$rootScope.selectedUser?($rootScope.selectedUser.activities=[],$rootScope.selectedUser.getFollowing(function(err){err||$rootScope.$$phase||$rootScope.$apply()}),$rootScope.selectedUser.getFollowers(function(err){err||$rootScope.$$phase||$rootScope.$apply()}),$scope.$on("follow-user-received",function(){$rootScope.selectedUser.getFollowing(function(err){err||$rootScope.$$phase||$rootScope.$apply()})}),void 0):void $location.path("/users")}]),AppServices.Controllers.controller("UsersGroupsCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){$scope.userGroupsCollection={},$scope.groups_previous_display="none",$scope.groups_next_display="none",$scope.groups_check_all="",$scope.groupsSelected="active",$scope.title="",$scope.master="",$scope.hasGroups=!1;var init=function(){return $scope.name="",$rootScope.selectedUser?(ug.getGroupsForUser($rootScope.selectedUser.get("uuid")),void ug.getGroupsTypeAhead()):void $location.path("/users")};init(),$scope.addUserToGroupDialog=function(modalId){if($scope.path){var username=$rootScope.selectedUser.get("uuid");ug.addUserToGroup(username,$scope.path),$scope.hideModal(modalId),$scope.path="",$scope.title=""}else $rootScope.$broadcast("alert","error","You must specify a group.")},$scope.selectGroup=function(group){$scope.path=group.path,$scope.title=group.title},$scope.leaveGroupDialog=function(modalId){$scope.deleteEntities($scope.userGroupsCollection,"user-left-group","error removing user from group"),$scope.hideModal(modalId)},$scope.$on("user-groups-received",function(event,groups){$scope.userGroupsCollection=groups,$scope.userGroupsSelected=!1,$scope.hasGroups=groups._list.length,$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()}),$scope.resetNextPrev=function(){$scope.previous_display="none",$scope.next_display="none"},$scope.checkNextPrev=function(){$scope.resetNextPrev(),$scope.userGroupsCollection.hasPreviousPage()&&($scope.previous_display="block"),$scope.userGroupsCollection.hasNextPage()&&($scope.next_display="block")},$rootScope.getPrevious=function(){$scope.userGroupsCollection.getPreviousPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting previous page of groups"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$rootScope.getNext=function(){$scope.userGroupsCollection.getNextPage(function(err){err&&$rootScope.$broadcast("alert","error","error getting next page of groups"),$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply()})},$scope.$on("user-left-group",function(){$scope.checkNextPrev(),$scope.userGroupsSelected=!1,$rootScope.$$phase||$rootScope.$apply(),init()}),$scope.$on("user-added-to-group-received",function(){$scope.checkNextPrev(),$rootScope.$$phase||$rootScope.$apply(),init()})}]),AppServices.Controllers.controller("UsersProfileCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){return $scope.user=$rootScope.selectedUser._data.clone(),$scope.user.json=$scope.user.json||$scope.user.stringifyJSON(),$scope.profileSelected="active",$rootScope.selectedUser?($scope.$on("user-selection-changed",function(evt,selectedUser){$scope.user=selectedUser._data.clone(),$scope.user.json=$scope.user.json||selectedUser._data.stringifyJSON()}),void($scope.saveSelectedUser=function(){$rootScope.selectedUser.set($scope.user.clone()),$rootScope.selectedUser.save(function(err){err?$rootScope.$broadcast("alert","error","error saving user"):$rootScope.$broadcast("alert","success","user saved")})})):void $location.path("/users")}]),AppServices.Controllers.controller("UsersRolesCtrl",["ug","$scope","$rootScope","$location",function(ug,$scope,$rootScope,$location){$scope.rolesSelected="active",$scope.usersRolesSelected=!1,$scope.usersPermissionsSelected=!1,$scope.name="",$scope.master="",$scope.hasRoles=$scope.hasPermissions=!1,$scope.permissions={};var clearPermissions=function(){$scope.permissions&&($scope.permissions.path="",$scope.permissions.getPerm=!1,$scope.permissions.postPerm=!1,$scope.permissions.putPerm=!1,$scope.permissions.deletePerm=!1),$scope.applyScope()},clearRole=function(){$scope.name="",$scope.applyScope()};return ug.getRolesTypeAhead(),$scope.addUserToRoleDialog=function(modalId){if($scope.name){var username=$rootScope.selectedUser.get("uuid");ug.addUserToRole(username,$scope.name),$scope.hideModal(modalId)}else $rootScope.$broadcast("alert","error","You must specify a role.")},$scope.leaveRoleDialog=function(modalId){for(var username=$rootScope.selectedUser.get("uuid"),roles=$rootScope.selectedUser.roles,i=0;i<roles.length;i++)roles[i].checked&&ug.removeUserFromRole(username,roles[i].name);$scope.hideModal(modalId)},$scope.deletePermissionDialog=function(modalId){for(var username=$rootScope.selectedUser.get("uuid"),permissions=$rootScope.selectedUser.permissions,i=0;i<permissions.length;i++)permissions[i].checked&&ug.deleteUserPermission(permissions[i].perm,username);$scope.hideModal(modalId)},$scope.addUserPermissionDialog=function(modalId){if($scope.permissions.path){var permission=$scope.createPermission(null,null,$scope.removeFirstSlash($scope.permissions.path),$scope.permissions),username=$rootScope.selectedUser.get("uuid");ug.newUserPermission(permission,username),$scope.hideModal(modalId)}else $rootScope.$broadcast("alert","error","You must specify a name for the permission.")},$rootScope.selectedUser?($rootScope.selectedUser.permissions=[],$rootScope.selectedUser.roles=[],$rootScope.selectedUser.getPermissions(function(err,data){$scope.clearCheckbox("permissionsSelectAllCheckBox"),err||($scope.hasPermissions=data.data.length>0,$scope.applyScope())}),$rootScope.selectedUser.getRoles(function(err,data){err||($scope.hasRoles=data.entities.length>0,$scope.applyScope())}),$scope.$on("role-update-received",function(){$rootScope.selectedUser.getRoles(function(err,data){$scope.usersRolesSelected=!1,err||($scope.hasRoles=data.entities.length>0,clearRole(),$scope.applyScope())})}),$scope.$on("permission-update-received",function(){$rootScope.selectedUser.getPermissions(function(err,data){$scope.usersPermissionsSelected=!1,err||(clearPermissions(),$scope.hasPermissions=data.data.length>0,$scope.applyScope())})}),void 0):void $location.path("/users")}])}({},function(){return this}());
\ No newline at end of file
diff --git a/portal/js/menus/menu-directives.js b/portal/js/menus/menu-directives.js
index db87e8f..0c1f81e 100644
--- a/portal/js/menus/menu-directives.js
+++ b/portal/js/menus/menu-directives.js
@@ -186,7 +186,7 @@
         //see if the url location is the same as the default active parent element
         if (locationPath !== '' && locationPath.indexOf(subMenuContext) === -1) {
           activeElements = setActiveElement(activeParentElement, locationPath, scope);
-          if(activeElements){ 
+          if(activeElements){
             $rootScope[menuContext + 'Parent'] = activeElements.parentMenuItem;
             $rootScope[menuContext + 'Menu'] = activeElements.menuitem;
           }
@@ -196,7 +196,7 @@
 
       }
       var bound = false;
-      scope.$watch('menuItems')
+      setTimeout(setupMenuState,500);
       //need the listener here to detect location changes and keep the menu highlighted
       scope.$on('$routeChangeSuccess', function () {
         setTimeout(function(){
diff --git a/portal/package.json b/portal/package.json
index 6922a78..4d43f1f 100644
--- a/portal/package.json
+++ b/portal/package.json
@@ -1,6 +1,6 @@
 {
   "name": "usergrid",
-  "version": "2.0.9",
+  "version": "2.0.10",
   "packageName": "appsvc-ui",
   "description": "full usergrid portal",
   "main": "./scripts/web-server.js",