diff --git a/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.js b/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.js
index 217e16a..b69d626 100755
--- a/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.js
+++ b/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.js
@@ -671,5213 +671,6 @@
     };
 }]);
 
-/*!
- * VERSION: 1.7.3
- * DATE: 2014-01-14
- * UPDATES AND DOCS AT: http://www.greensock.com
- *
- * @license Copyright (c) 2008-2014, GreenSock. All rights reserved.
- * This work is subject to the terms at http://www.greensock.com/terms_of_use.html or for
- * Club GreenSock members, the software agreement that was issued with your membership.
- * 
- * @author: Jack Doyle, jack@greensock.com
- **/
-(window._gsQueue || (window._gsQueue = [])).push( function() {
-
-	"use strict";
-
-	var _doc = document.documentElement,
-		_window = window,
-		_max = function(element, axis) {
-			var dim = (axis === "x") ? "Width" : "Height",
-				scroll = "scroll" + dim,
-				client = "client" + dim,
-				body = document.body;
-			return (element === _window || element === _doc || element === body) ? Math.max(_doc[scroll], body[scroll]) - (_window["inner" + dim] || Math.max(_doc[client], body[client])) : element[scroll] - element["offset" + dim];
-		},
-
-		ScrollToPlugin = window._gsDefine.plugin({
-			propName: "scrollTo",
-			API: 2,
-			version:"1.7.3",
-
-			//called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
-			init: function(target, value, tween) {
-				this._wdw = (target === _window);
-				this._target = target;
-				this._tween = tween;
-				if (typeof(value) !== "object") {
-					value = {y:value}; //if we don't receive an object as the parameter, assume the user intends "y".
-				}
-				this._autoKill = (value.autoKill !== false);
-				this.x = this.xPrev = this.getX();
-				this.y = this.yPrev = this.getY();
-				if (value.x != null) {
-					this._addTween(this, "x", this.x, (value.x === "max") ? _max(target, "x") : value.x, "scrollTo_x", true);
-					this._overwriteProps.push("scrollTo_x");
-				} else {
-					this.skipX = true;
-				}
-				if (value.y != null) {
-					this._addTween(this, "y", this.y, (value.y === "max") ? _max(target, "y") : value.y, "scrollTo_y", true);
-					this._overwriteProps.push("scrollTo_y");
-				} else {
-					this.skipY = true;
-				}
-				return true;
-			},
-
-			//called each time the values should be updated, and the ratio gets passed as the only parameter (typically it's a value between 0 and 1, but it can exceed those when using an ease like Elastic.easeOut or Back.easeOut, etc.)
-			set: function(v) {
-				this._super.setRatio.call(this, v);
-
-				var x = (this._wdw || !this.skipX) ? this.getX() : this.xPrev,
-					y = (this._wdw || !this.skipY) ? this.getY() : this.yPrev,
-					yDif = y - this.yPrev,
-					xDif = x - this.xPrev;
-
-				if (this._autoKill) {
-					//note: iOS has a bug that throws off the scroll by several pixels, so we need to check if it's within 7 pixels of the previous one that we set instead of just looking for an exact match.
-					if (!this.skipX && (xDif > 7 || xDif < -7) && x < _max(this._target, "x")) {
-						this.skipX = true; //if the user scrolls separately, we should stop tweening!
-					}
-					if (!this.skipY && (yDif > 7 || yDif < -7) && y < _max(this._target, "y")) {
-						this.skipY = true; //if the user scrolls separately, we should stop tweening!
-					}
-					if (this.skipX && this.skipY) {
-						this._tween.kill();
-					}
-				}
-				if (this._wdw) {
-					_window.scrollTo((!this.skipX) ? this.x : x, (!this.skipY) ? this.y : y);
-				} else {
-					if (!this.skipY) {
-						this._target.scrollTop = this.y;
-					}
-					if (!this.skipX) {
-						this._target.scrollLeft = this.x;
-					}
-				}
-				this.xPrev = this.x;
-				this.yPrev = this.y;
-			}
-
-		}),
-		p = ScrollToPlugin.prototype;
-
-	ScrollToPlugin.max = _max;
-
-	p.getX = function() {
-		return (!this._wdw) ? this._target.scrollLeft : (_window.pageXOffset != null) ? _window.pageXOffset : (_doc.scrollLeft != null) ? _doc.scrollLeft : document.body.scrollLeft;
-	};
-
-	p.getY = function() {
-		return (!this._wdw) ? this._target.scrollTop : (_window.pageYOffset != null) ? _window.pageYOffset : (_doc.scrollTop != null) ? _doc.scrollTop : document.body.scrollTop;
-	};
-
-	p._kill = function(lookup) {
-		if (lookup.scrollTo_x) {
-			this.skipX = true;
-		}
-		if (lookup.scrollTo_y) {
-			this.skipY = true;
-		}
-		return this._super._kill.call(this, lookup);
-	};
-
-}); if (window._gsDefine) { window._gsQueue.pop()(); }
-/*!
- * VERSION: 1.12.1
- * DATE: 2014-06-26
- * UPDATES AND DOCS AT: http://www.greensock.com
- * 
- * Includes all of the following: TweenLite, TweenMax, TimelineLite, TimelineMax, EasePack, CSSPlugin, RoundPropsPlugin, BezierPlugin, AttrPlugin, DirectionalRotationPlugin
- *
- * @license Copyright (c) 2008-2014, GreenSock. All rights reserved.
- * This work is subject to the terms at http://www.greensock.com/terms_of_use.html or for
- * Club GreenSock members, the software agreement that was issued with your membership.
- * 
- * @author: Jack Doyle, jack@greensock.com
- **/
-
-(window._gsQueue || (window._gsQueue = [])).push( function() {
-
-	"use strict";
-
-	window._gsDefine("TweenMax", ["core.Animation","core.SimpleTimeline","TweenLite"], function(Animation, SimpleTimeline, TweenLite) {
-
-		var _slice = [].slice,
-			TweenMax = function(target, duration, vars) {
-				TweenLite.call(this, target, duration, vars);
-				this._cycle = 0;
-				this._yoyo = (this.vars.yoyo === true);
-				this._repeat = this.vars.repeat || 0;
-				this._repeatDelay = this.vars.repeatDelay || 0;
-				this._dirty = true; //ensures that if there is any repeat, the totalDuration will get recalculated to accurately report it.
-				this.render = TweenMax.prototype.render; //speed optimization (avoid prototype lookup on this "hot" method)
-			},
-			_tinyNum = 0.0000000001,
-			TweenLiteInternals = TweenLite._internals,
-			_isSelector = TweenLiteInternals.isSelector,
-			_isArray = TweenLiteInternals.isArray,
-			p = TweenMax.prototype = TweenLite.to({}, 0.1, {}),
-			_blankArray = [];
-
-		TweenMax.version = "1.12.1";
-		p.constructor = TweenMax;
-		p.kill()._gc = false;
-		TweenMax.killTweensOf = TweenMax.killDelayedCallsTo = TweenLite.killTweensOf;
-		TweenMax.getTweensOf = TweenLite.getTweensOf;
-		TweenMax.lagSmoothing = TweenLite.lagSmoothing;
-		TweenMax.ticker = TweenLite.ticker;
-		TweenMax.render = TweenLite.render;
-
-		p.invalidate = function() {
-			this._yoyo = (this.vars.yoyo === true);
-			this._repeat = this.vars.repeat || 0;
-			this._repeatDelay = this.vars.repeatDelay || 0;
-			this._uncache(true);
-			return TweenLite.prototype.invalidate.call(this);
-		};
-		
-		p.updateTo = function(vars, resetDuration) {
-			var curRatio = this.ratio, p;
-			if (resetDuration && this._startTime < this._timeline._time) {
-				this._startTime = this._timeline._time;
-				this._uncache(false);
-				if (this._gc) {
-					this._enabled(true, false);
-				} else {
-					this._timeline.insert(this, this._startTime - this._delay); //ensures that any necessary re-sequencing of Animations in the timeline occurs to make sure the rendering order is correct.
-				}
-			}
-			for (p in vars) {
-				this.vars[p] = vars[p];
-			}
-			if (this._initted) {
-				if (resetDuration) {
-					this._initted = false;
-				} else {
-					if (this._gc) {
-						this._enabled(true, false);
-					}
-					if (this._notifyPluginsOfEnabled && this._firstPT) {
-						TweenLite._onPluginEvent("_onDisable", this); //in case a plugin like MotionBlur must perform some cleanup tasks
-					}
-					if (this._time / this._duration > 0.998) { //if the tween has finished (or come extremely close to finishing), we just need to rewind it to 0 and then render it again at the end which forces it to re-initialize (parsing the new vars). We allow tweens that are close to finishing (but haven't quite finished) to work this way too because otherwise, the values are so small when determining where to project the starting values that binary math issues creep in and can make the tween appear to render incorrectly when run backwards. 
-						var prevTime = this._time;
-						this.render(0, true, false);
-						this._initted = false;
-						this.render(prevTime, true, false);
-					} else if (this._time > 0) {
-						this._initted = false;
-						this._init();
-						var inv = 1 / (1 - curRatio),
-							pt = this._firstPT, endValue;
-						while (pt) {
-							endValue = pt.s + pt.c; 
-							pt.c *= inv;
-							pt.s = endValue - pt.c;
-							pt = pt._next;
-						}
-					}
-				}
-			}
-			return this;
-		};
-				
-		p.render = function(time, suppressEvents, force) {
-			if (!this._initted) if (this._duration === 0 && this.vars.repeat) { //zero duration tweens that render immediately have render() called from TweenLite's constructor, before TweenMax's constructor has finished setting _repeat, _repeatDelay, and _yoyo which are critical in determining totalDuration() so we need to call invalidate() which is a low-kb way to get those set properly.
-				this.invalidate();
-			}
-			var totalDur = (!this._dirty) ? this._totalDuration : this.totalDuration(),
-				prevTime = this._time,
-				prevTotalTime = this._totalTime, 
-				prevCycle = this._cycle,
-				duration = this._duration,
-				prevRawPrevTime = this._rawPrevTime,
-				isComplete, callback, pt, cycleDuration, r, type, pow, rawPrevTime, i;
-			if (time >= totalDur) {
-				this._totalTime = totalDur;
-				this._cycle = this._repeat;
-				if (this._yoyo && (this._cycle & 1) !== 0) {
-					this._time = 0;
-					this.ratio = this._ease._calcEnd ? this._ease.getRatio(0) : 0;
-				} else {
-					this._time = duration;
-					this.ratio = this._ease._calcEnd ? this._ease.getRatio(1) : 1;
-				}
-				if (!this._reversed) {
-					isComplete = true;
-					callback = "onComplete";
-				}
-				if (duration === 0) if (this._initted || !this.vars.lazy || force) { //zero-duration tweens are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
-					if (this._startTime === this._timeline._duration) { //if a zero-duration tween is at the VERY end of a timeline and that timeline renders at its end, it will typically add a tiny bit of cushion to the render time to prevent rounding errors from getting in the way of tweens rendering their VERY end. If we then reverse() that timeline, the zero-duration tween will trigger its onReverseComplete even though technically the playhead didn't pass over it again. It's a very specific edge case we must accommodate.
-						time = 0;
-					}
-					if (time === 0 || prevRawPrevTime < 0 || prevRawPrevTime === _tinyNum) if (prevRawPrevTime !== time) {
-						force = true;
-						if (prevRawPrevTime > _tinyNum) {
-							callback = "onReverseComplete";
-						}
-					}
-					this._rawPrevTime = rawPrevTime = (!suppressEvents || time || prevRawPrevTime === time) ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
-				}
-				
-			} else if (time < 0.0000001) { //to work around occasional floating point math artifacts, round super small values to 0.
-				this._totalTime = this._time = this._cycle = 0;
-				this.ratio = this._ease._calcEnd ? this._ease.getRatio(0) : 0;
-				if (prevTotalTime !== 0 || (duration === 0 && prevRawPrevTime > 0 && prevRawPrevTime !== _tinyNum)) {
-					callback = "onReverseComplete";
-					isComplete = this._reversed;
-				}
-				if (time < 0) {
-					this._active = false;
-					if (duration === 0) if (this._initted || !this.vars.lazy || force) { //zero-duration tweens are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
-						if (prevRawPrevTime >= 0) {
-							force = true;
-						}
-						this._rawPrevTime = rawPrevTime = (!suppressEvents || time || prevRawPrevTime === time) ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
-					}
-				} else if (!this._initted) { //if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.
-					force = true;
-				}
-			} else {
-				this._totalTime = this._time = time;
-				
-				if (this._repeat !== 0) {
-					cycleDuration = duration + this._repeatDelay;
-					this._cycle = (this._totalTime / cycleDuration) >> 0; //originally _totalTime % cycleDuration but floating point errors caused problems, so I normalized it. (4 % 0.8 should be 0 but Flash reports it as 0.79999999!)
-					if (this._cycle !== 0) if (this._cycle === this._totalTime / cycleDuration) {
-						this._cycle--; //otherwise when rendered exactly at the end time, it will act as though it is repeating (at the beginning)
-					}
-					this._time = this._totalTime - (this._cycle * cycleDuration);
-					if (this._yoyo) if ((this._cycle & 1) !== 0) {
-						this._time = duration - this._time;
-					}
-					if (this._time > duration) {
-						this._time = duration;
-					} else if (this._time < 0) {
-						this._time = 0;
-					}
-				}
-
-				if (this._easeType) {
-					r = this._time / duration;
-					type = this._easeType;
-					pow = this._easePower;
-					if (type === 1 || (type === 3 && r >= 0.5)) {
-						r = 1 - r;
-					}
-					if (type === 3) {
-						r *= 2;
-					}
-					if (pow === 1) {
-						r *= r;
-					} else if (pow === 2) {
-						r *= r * r;
-					} else if (pow === 3) {
-						r *= r * r * r;
-					} else if (pow === 4) {
-						r *= r * r * r * r;
-					}
-
-					if (type === 1) {
-						this.ratio = 1 - r;
-					} else if (type === 2) {
-						this.ratio = r;
-					} else if (this._time / duration < 0.5) {
-						this.ratio = r / 2;
-					} else {
-						this.ratio = 1 - (r / 2);
-					}
-
-				} else {
-					this.ratio = this._ease.getRatio(this._time / duration);
-				}
-				
-			}
-				
-			if (prevTime === this._time && !force && prevCycle === this._cycle) {
-				if (prevTotalTime !== this._totalTime) if (this._onUpdate) if (!suppressEvents) { //so that onUpdate fires even during the repeatDelay - as long as the totalTime changed, we should trigger onUpdate.
-					this._onUpdate.apply(this.vars.onUpdateScope || this, this.vars.onUpdateParams || _blankArray);
-				}
-				return;
-			} else if (!this._initted) {
-				this._init();
-				if (!this._initted || this._gc) { //immediateRender tweens typically won't initialize until the playhead advances (_time is greater than 0) in order to ensure that overwriting occurs properly. Also, if all of the tweening properties have been overwritten (which would cause _gc to be true, as set in _init()), we shouldn't continue otherwise an onStart callback could be called for example.
-					return;
-				} else if (!force && this._firstPT && ((this.vars.lazy !== false && this._duration) || (this.vars.lazy && !this._duration))) { //we stick it in the queue for rendering at the very end of the tick - this is a performance optimization because browsers invalidate styles and force a recalculation if you read, write, and then read style data (so it's better to read/read/read/write/write/write than read/write/read/write/read/write). The down side, of course, is that usually you WANT things to render immediately because you may have code running right after that which depends on the change. Like imagine running TweenLite.set(...) and then immediately after that, creating a nother tween that animates the same property to another value; the starting values of that 2nd tween wouldn't be accurate if lazy is true.
-					this._time = prevTime;
-					this._totalTime = prevTotalTime;
-					this._rawPrevTime = prevRawPrevTime;
-					this._cycle = prevCycle;
-					TweenLiteInternals.lazyTweens.push(this);
-					this._lazy = time;
-					return;
-				}
-				//_ease is initially set to defaultEase, so now that init() has run, _ease is set properly and we need to recalculate the ratio. Overall this is faster than using conditional logic earlier in the method to avoid having to set ratio twice because we only init() once but renderTime() gets called VERY frequently.
-				if (this._time && !isComplete) {
-					this.ratio = this._ease.getRatio(this._time / duration);
-				} else if (isComplete && this._ease._calcEnd) {
-					this.ratio = this._ease.getRatio((this._time === 0) ? 0 : 1);
-				}
-			}
-			if (this._lazy !== false) {
-				this._lazy = false;
-			}
-
-			if (!this._active) if (!this._paused && this._time !== prevTime && time >= 0) {
-				this._active = true; //so that if the user renders a tween (as opposed to the timeline rendering it), the timeline is forced to re-render and align it with the proper time/frame on the next rendering cycle. Maybe the tween already finished but the user manually re-renders it as halfway done.
-			}
-			if (prevTotalTime === 0) {
-				if (this._initted === 2 && time > 0) {
-					//this.invalidate();
-					this._init(); //will just apply overwriting since _initted of (2) means it was a from() tween that had immediateRender:true
-				}
-				if (this._startAt) {
-					if (time >= 0) {
-						this._startAt.render(time, suppressEvents, force);
-					} else if (!callback) {
-						callback = "_dummyGS"; //if no callback is defined, use a dummy value just so that the condition at the end evaluates as true because _startAt should render AFTER the normal render loop when the time is negative. We could handle this in a more intuitive way, of course, but the render loop is the MOST important thing to optimize, so this technique allows us to avoid adding extra conditional logic in a high-frequency area.
-					}
-				}
-				if (this.vars.onStart) if (this._totalTime !== 0 || duration === 0) if (!suppressEvents) {
-					this.vars.onStart.apply(this.vars.onStartScope || this, this.vars.onStartParams || _blankArray);
-				}
-			}
-			
-			pt = this._firstPT;
-			while (pt) {
-				if (pt.f) {
-					pt.t[pt.p](pt.c * this.ratio + pt.s);
-				} else {
-					pt.t[pt.p] = pt.c * this.ratio + pt.s;
-				}
-				pt = pt._next;
-			}
-			
-			if (this._onUpdate) {
-				if (time < 0) if (this._startAt && this._startTime) { //if the tween is positioned at the VERY beginning (_startTime 0) of its parent timeline, it's illegal for the playhead to go back further, so we should not render the recorded startAt values.
-					this._startAt.render(time, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.
-				}
-				if (!suppressEvents) if (this._totalTime !== prevTotalTime || isComplete) {
-					this._onUpdate.apply(this.vars.onUpdateScope || this, this.vars.onUpdateParams || _blankArray);
-				}
-			}
-			if (this._cycle !== prevCycle) if (!suppressEvents) if (!this._gc) if (this.vars.onRepeat) {
-				this.vars.onRepeat.apply(this.vars.onRepeatScope || this, this.vars.onRepeatParams || _blankArray);
-			}
-			if (callback) if (!this._gc) { //check gc because there's a chance that kill() could be called in an onUpdate
-				if (time < 0 && this._startAt && !this._onUpdate && this._startTime) { //if the tween is positioned at the VERY beginning (_startTime 0) of its parent timeline, it's illegal for the playhead to go back further, so we should not render the recorded startAt values.
-					this._startAt.render(time, suppressEvents, force);
-				}
-				if (isComplete) {
-					if (this._timeline.autoRemoveChildren) {
-						this._enabled(false, false);
-					}
-					this._active = false;
-				}
-				if (!suppressEvents && this.vars[callback]) {
-					this.vars[callback].apply(this.vars[callback + "Scope"] || this, this.vars[callback + "Params"] || _blankArray);
-				}
-				if (duration === 0 && this._rawPrevTime === _tinyNum && rawPrevTime !== _tinyNum) { //the onComplete or onReverseComplete could trigger movement of the playhead and for zero-duration tweens (which must discern direction) that land directly back on their start time, we don't want to fire again on the next render. Think of several addPause()'s in a timeline that forces the playhead to a certain spot, but what if it's already paused and another tween is tweening the "time" of the timeline? Each time it moves [forward] past that spot, it would move back, and since suppressEvents is true, it'd reset _rawPrevTime to _tinyNum so that when it begins again, the callback would fire (so ultimately it could bounce back and forth during that tween). Again, this is a very uncommon scenario, but possible nonetheless.
-					this._rawPrevTime = 0;
-				}
-			}
-		};
-		
-//---- STATIC FUNCTIONS -----------------------------------------------------------------------------------------------------------
-		
-		TweenMax.to = function(target, duration, vars) {
-			return new TweenMax(target, duration, vars);
-		};
-		
-		TweenMax.from = function(target, duration, vars) {
-			vars.runBackwards = true;
-			vars.immediateRender = (vars.immediateRender != false);
-			return new TweenMax(target, duration, vars);
-		};
-		
-		TweenMax.fromTo = function(target, duration, fromVars, toVars) {
-			toVars.startAt = fromVars;
-			toVars.immediateRender = (toVars.immediateRender != false && fromVars.immediateRender != false);
-			return new TweenMax(target, duration, toVars);
-		};
-		
-		TweenMax.staggerTo = TweenMax.allTo = function(targets, duration, vars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
-			stagger = stagger || 0;
-			var delay = vars.delay || 0,
-				a = [],
-				finalComplete = function() {
-					if (vars.onComplete) {
-						vars.onComplete.apply(vars.onCompleteScope || this, arguments);
-					}
-					onCompleteAll.apply(onCompleteAllScope || this, onCompleteAllParams || _blankArray);
-				},
-				l, copy, i, p;
-			if (!_isArray(targets)) {
-				if (typeof(targets) === "string") {
-					targets = TweenLite.selector(targets) || targets;
-				}
-				if (_isSelector(targets)) {
-					targets = _slice.call(targets, 0);
-				}
-			}
-			l = targets.length;
-			for (i = 0; i < l; i++) {
-				copy = {};
-				for (p in vars) {
-					copy[p] = vars[p];
-				}
-				copy.delay = delay;
-				if (i === l - 1 && onCompleteAll) {
-					copy.onComplete = finalComplete;
-				}
-				a[i] = new TweenMax(targets[i], duration, copy);
-				delay += stagger;
-			}
-			return a;
-		};
-		
-		TweenMax.staggerFrom = TweenMax.allFrom = function(targets, duration, vars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
-			vars.runBackwards = true;
-			vars.immediateRender = (vars.immediateRender != false);
-			return TweenMax.staggerTo(targets, duration, vars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
-		};
-		
-		TweenMax.staggerFromTo = TweenMax.allFromTo = function(targets, duration, fromVars, toVars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
-			toVars.startAt = fromVars;
-			toVars.immediateRender = (toVars.immediateRender != false && fromVars.immediateRender != false);
-			return TweenMax.staggerTo(targets, duration, toVars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
-		};
-				
-		TweenMax.delayedCall = function(delay, callback, params, scope, useFrames) {
-			return new TweenMax(callback, 0, {delay:delay, onComplete:callback, onCompleteParams:params, onCompleteScope:scope, onReverseComplete:callback, onReverseCompleteParams:params, onReverseCompleteScope:scope, immediateRender:false, useFrames:useFrames, overwrite:0});
-		};
-		
-		TweenMax.set = function(target, vars) {
-			return new TweenMax(target, 0, vars);
-		};
-		
-		TweenMax.isTweening = function(target) {
-			return (TweenLite.getTweensOf(target, true).length > 0);
-		};
-		
-		var _getChildrenOf = function(timeline, includeTimelines) {
-				var a = [],
-					cnt = 0,
-					tween = timeline._first;
-				while (tween) {
-					if (tween instanceof TweenLite) {
-						a[cnt++] = tween;
-					} else {
-						if (includeTimelines) {
-							a[cnt++] = tween;
-						}
-						a = a.concat(_getChildrenOf(tween, includeTimelines));
-						cnt = a.length;
-					}
-					tween = tween._next;
-				}
-				return a;
-			}, 
-			getAllTweens = TweenMax.getAllTweens = function(includeTimelines) {
-				return _getChildrenOf(Animation._rootTimeline, includeTimelines).concat( _getChildrenOf(Animation._rootFramesTimeline, includeTimelines) );
-			};
-		
-		TweenMax.killAll = function(complete, tweens, delayedCalls, timelines) {
-			if (tweens == null) {
-				tweens = true;
-			}
-			if (delayedCalls == null) {
-				delayedCalls = true;
-			}
-			var a = getAllTweens((timelines != false)),
-				l = a.length,
-				allTrue = (tweens && delayedCalls && timelines),
-				isDC, tween, i;
-			for (i = 0; i < l; i++) {
-				tween = a[i];
-				if (allTrue || (tween instanceof SimpleTimeline) || ((isDC = (tween.target === tween.vars.onComplete)) && delayedCalls) || (tweens && !isDC)) {
-					if (complete) {
-						tween.totalTime(tween._reversed ? 0 : tween.totalDuration());
-					} else {
-						tween._enabled(false, false);
-					}
-				}
-			}
-		};
-		
-		TweenMax.killChildTweensOf = function(parent, complete) {
-			if (parent == null) {
-				return;
-			}
-			var tl = TweenLiteInternals.tweenLookup,
-				a, curParent, p, i, l;
-			if (typeof(parent) === "string") {
-				parent = TweenLite.selector(parent) || parent;
-			}
-			if (_isSelector(parent)) {
-				parent = _slice.call(parent, 0);
-			}
-			if (_isArray(parent)) {
-				i = parent.length;
-				while (--i > -1) {
-					TweenMax.killChildTweensOf(parent[i], complete);
-				}
-				return;
-			}
-			a = [];
-			for (p in tl) {
-				curParent = tl[p].target.parentNode;
-				while (curParent) {
-					if (curParent === parent) {
-						a = a.concat(tl[p].tweens);
-					}
-					curParent = curParent.parentNode;
-				}
-			}
-			l = a.length;
-			for (i = 0; i < l; i++) {
-				if (complete) {
-					a[i].totalTime(a[i].totalDuration());
-				}
-				a[i]._enabled(false, false);
-			}
-		};
-
-		var _changePause = function(pause, tweens, delayedCalls, timelines) {
-			tweens = (tweens !== false);
-			delayedCalls = (delayedCalls !== false);
-			timelines = (timelines !== false);
-			var a = getAllTweens(timelines),
-				allTrue = (tweens && delayedCalls && timelines),
-				i = a.length,
-				isDC, tween;
-			while (--i > -1) {
-				tween = a[i];
-				if (allTrue || (tween instanceof SimpleTimeline) || ((isDC = (tween.target === tween.vars.onComplete)) && delayedCalls) || (tweens && !isDC)) {
-					tween.paused(pause);
-				}
-			}
-		};
-		
-		TweenMax.pauseAll = function(tweens, delayedCalls, timelines) {
-			_changePause(true, tweens, delayedCalls, timelines);
-		};
-		
-		TweenMax.resumeAll = function(tweens, delayedCalls, timelines) {
-			_changePause(false, tweens, delayedCalls, timelines);
-		};
-
-		TweenMax.globalTimeScale = function(value) {
-			var tl = Animation._rootTimeline,
-				t = TweenLite.ticker.time;
-			if (!arguments.length) {
-				return tl._timeScale;
-			}
-			value = value || _tinyNum; //can't allow zero because it'll throw the math off
-			tl._startTime = t - ((t - tl._startTime) * tl._timeScale / value);
-			tl = Animation._rootFramesTimeline;
-			t = TweenLite.ticker.frame;
-			tl._startTime = t - ((t - tl._startTime) * tl._timeScale / value);
-			tl._timeScale = Animation._rootTimeline._timeScale = value;
-			return value;
-		};
-		
-	
-//---- GETTERS / SETTERS ----------------------------------------------------------------------------------------------------------
-		
-		p.progress = function(value) {
-			return (!arguments.length) ? this._time / this.duration() : this.totalTime( this.duration() * ((this._yoyo && (this._cycle & 1) !== 0) ? 1 - value : value) + (this._cycle * (this._duration + this._repeatDelay)), false);
-		};
-		
-		p.totalProgress = function(value) {
-			return (!arguments.length) ? this._totalTime / this.totalDuration() : this.totalTime( this.totalDuration() * value, false);
-		};
-		
-		p.time = function(value, suppressEvents) {
-			if (!arguments.length) {
-				return this._time;
-			}
-			if (this._dirty) {
-				this.totalDuration();
-			}
-			if (value > this._duration) {
-				value = this._duration;
-			}
-			if (this._yoyo && (this._cycle & 1) !== 0) {
-				value = (this._duration - value) + (this._cycle * (this._duration + this._repeatDelay));
-			} else if (this._repeat !== 0) {
-				value += this._cycle * (this._duration + this._repeatDelay);
-			}
-			return this.totalTime(value, suppressEvents);
-		};
-
-		p.duration = function(value) {
-			if (!arguments.length) {
-				return this._duration; //don't set _dirty = false because there could be repeats that haven't been factored into the _totalDuration yet. Otherwise, if you create a repeated TweenMax and then immediately check its duration(), it would cache the value and the totalDuration would not be correct, thus repeats wouldn't take effect.
-			}
-			return Animation.prototype.duration.call(this, value);
-		};
-
-		p.totalDuration = function(value) {
-			if (!arguments.length) {
-				if (this._dirty) {
-					//instead of Infinity, we use 999999999999 so that we can accommodate reverses
-					this._totalDuration = (this._repeat === -1) ? 999999999999 : this._duration * (this._repeat + 1) + (this._repeatDelay * this._repeat);
-					this._dirty = false;
-				}
-				return this._totalDuration;
-			}
-			return (this._repeat === -1) ? this : this.duration( (value - (this._repeat * this._repeatDelay)) / (this._repeat + 1) );
-		};
-		
-		p.repeat = function(value) {
-			if (!arguments.length) {
-				return this._repeat;
-			}
-			this._repeat = value;
-			return this._uncache(true);
-		};
-		
-		p.repeatDelay = function(value) {
-			if (!arguments.length) {
-				return this._repeatDelay;
-			}
-			this._repeatDelay = value;
-			return this._uncache(true);
-		};
-		
-		p.yoyo = function(value) {
-			if (!arguments.length) {
-				return this._yoyo;
-			}
-			this._yoyo = value;
-			return this;
-		};
-		
-		
-		return TweenMax;
-		
-	}, true);
-
-
-
-
-
-
-
-
-/*
- * ----------------------------------------------------------------
- * TimelineLite
- * ----------------------------------------------------------------
- */
-	window._gsDefine("TimelineLite", ["core.Animation","core.SimpleTimeline","TweenLite"], function(Animation, SimpleTimeline, TweenLite) {
-
-		var TimelineLite = function(vars) {
-				SimpleTimeline.call(this, vars);
-				this._labels = {};
-				this.autoRemoveChildren = (this.vars.autoRemoveChildren === true);
-				this.smoothChildTiming = (this.vars.smoothChildTiming === true);
-				this._sortChildren = true;
-				this._onUpdate = this.vars.onUpdate;
-				var v = this.vars,
-					val, p;
-				for (p in v) {
-					val = v[p];
-					if (_isArray(val)) if (val.join("").indexOf("{self}") !== -1) {
-						v[p] = this._swapSelfInParams(val);
-					}
-				}
-				if (_isArray(v.tweens)) {
-					this.add(v.tweens, 0, v.align, v.stagger);
-				}
-			},
-			_tinyNum = 0.0000000001,
-			_isSelector = TweenLite._internals.isSelector,
-			_isArray = TweenLite._internals.isArray,
-			_blankArray = [],
-			_globals = window._gsDefine.globals,
-			_copy = function(vars) {
-				var copy = {}, p;
-				for (p in vars) {
-					copy[p] = vars[p];
-				}
-				return copy;
-			},
-			_pauseCallback = function(tween, callback, params, scope) {
-				tween._timeline.pause(tween._startTime);
-				if (callback) {
-					callback.apply(scope || tween._timeline, params || _blankArray);
-				}
-			},
-			_slice = _blankArray.slice,
-			p = TimelineLite.prototype = new SimpleTimeline();
-
-		TimelineLite.version = "1.12.1";
-		p.constructor = TimelineLite;
-		p.kill()._gc = false;
-
-		p.to = function(target, duration, vars, position) {
-			var Engine = (vars.repeat && _globals.TweenMax) || TweenLite;
-			return duration ? this.add( new Engine(target, duration, vars), position) : this.set(target, vars, position);
-		};
-
-		p.from = function(target, duration, vars, position) {
-			return this.add( ((vars.repeat && _globals.TweenMax) || TweenLite).from(target, duration, vars), position);
-		};
-
-		p.fromTo = function(target, duration, fromVars, toVars, position) {
-			var Engine = (toVars.repeat && _globals.TweenMax) || TweenLite;
-			return duration ? this.add( Engine.fromTo(target, duration, fromVars, toVars), position) : this.set(target, toVars, position);
-		};
-
-		p.staggerTo = function(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
-			var tl = new TimelineLite({onComplete:onCompleteAll, onCompleteParams:onCompleteAllParams, onCompleteScope:onCompleteAllScope, smoothChildTiming:this.smoothChildTiming}),
-				i;
-			if (typeof(targets) === "string") {
-				targets = TweenLite.selector(targets) || targets;
-			}
-			if (_isSelector(targets)) { //senses if the targets object is a selector. If it is, we should translate it into an array.
-				targets = _slice.call(targets, 0);
-			}
-			stagger = stagger || 0;
-			for (i = 0; i < targets.length; i++) {
-				if (vars.startAt) {
-					vars.startAt = _copy(vars.startAt);
-				}
-				tl.to(targets[i], duration, _copy(vars), i * stagger);
-			}
-			return this.add(tl, position);
-		};
-
-		p.staggerFrom = function(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
-			vars.immediateRender = (vars.immediateRender != false);
-			vars.runBackwards = true;
-			return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
-		};
-
-		p.staggerFromTo = function(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
-			toVars.startAt = fromVars;
-			toVars.immediateRender = (toVars.immediateRender != false && fromVars.immediateRender != false);
-			return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
-		};
-
-		p.call = function(callback, params, scope, position) {
-			return this.add( TweenLite.delayedCall(0, callback, params, scope), position);
-		};
-
-		p.set = function(target, vars, position) {
-			position = this._parseTimeOrLabel(position, 0, true);
-			if (vars.immediateRender == null) {
-				vars.immediateRender = (position === this._time && !this._paused);
-			}
-			return this.add( new TweenLite(target, 0, vars), position);
-		};
-
-		TimelineLite.exportRoot = function(vars, ignoreDelayedCalls) {
-			vars = vars || {};
-			if (vars.smoothChildTiming == null) {
-				vars.smoothChildTiming = true;
-			}
-			var tl = new TimelineLite(vars),
-				root = tl._timeline,
-				tween, next;
-			if (ignoreDelayedCalls == null) {
-				ignoreDelayedCalls = true;
-			}
-			root._remove(tl, true);
-			tl._startTime = 0;
-			tl._rawPrevTime = tl._time = tl._totalTime = root._time;
-			tween = root._first;
-			while (tween) {
-				next = tween._next;
-				if (!ignoreDelayedCalls || !(tween instanceof TweenLite && tween.target === tween.vars.onComplete)) {
-					tl.add(tween, tween._startTime - tween._delay);
-				}
-				tween = next;
-			}
-			root.add(tl, 0);
-			return tl;
-		};
-
-		p.add = function(value, position, align, stagger) {
-			var curTime, l, i, child, tl, beforeRawTime;
-			if (typeof(position) !== "number") {
-				position = this._parseTimeOrLabel(position, 0, true, value);
-			}
-			if (!(value instanceof Animation)) {
-				if ((value instanceof Array) || (value && value.push && _isArray(value))) {
-					align = align || "normal";
-					stagger = stagger || 0;
-					curTime = position;
-					l = value.length;
-					for (i = 0; i < l; i++) {
-						if (_isArray(child = value[i])) {
-							child = new TimelineLite({tweens:child});
-						}
-						this.add(child, curTime);
-						if (typeof(child) !== "string" && typeof(child) !== "function") {
-							if (align === "sequence") {
-								curTime = child._startTime + (child.totalDuration() / child._timeScale);
-							} else if (align === "start") {
-								child._startTime -= child.delay();
-							}
-						}
-						curTime += stagger;
-					}
-					return this._uncache(true);
-				} else if (typeof(value) === "string") {
-					return this.addLabel(value, position);
-				} else if (typeof(value) === "function") {
-					value = TweenLite.delayedCall(0, value);
-				} else {
-					throw("Cannot add " + value + " into the timeline; it is not a tween, timeline, function, or string.");
-				}
-			}
-
-			SimpleTimeline.prototype.add.call(this, value, position);
-
-			//if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.
-			if (this._gc || this._time === this._duration) if (!this._paused) if (this._duration < this.duration()) {
-				//in case any of the ancestors had completed but should now be enabled...
-				tl = this;
-				beforeRawTime = (tl.rawTime() > value._startTime); //if the tween is placed on the timeline so that it starts BEFORE the current rawTime, we should align the playhead (move the timeline). This is because sometimes users will create a timeline, let it finish, and much later append a tween and expect it to run instead of jumping to its end state. While technically one could argue that it should jump to its end state, that's not what users intuitively expect.
-				while (tl._timeline) {
-					if (beforeRawTime && tl._timeline.smoothChildTiming) {
-						tl.totalTime(tl._totalTime, true); //moves the timeline (shifts its startTime) if necessary, and also enables it.
-					} else if (tl._gc) {
-						tl._enabled(true, false);
-					}
-					tl = tl._timeline;
-				}
-			}
-
-			return this;
-		};
-
-		p.remove = function(value) {
-			if (value instanceof Animation) {
-				return this._remove(value, false);
-			} else if (value instanceof Array || (value && value.push && _isArray(value))) {
-				var i = value.length;
-				while (--i > -1) {
-					this.remove(value[i]);
-				}
-				return this;
-			} else if (typeof(value) === "string") {
-				return this.removeLabel(value);
-			}
-			return this.kill(null, value);
-		};
-
-		p._remove = function(tween, skipDisable) {
-			SimpleTimeline.prototype._remove.call(this, tween, skipDisable);
-			var last = this._last;
-			if (!last) {
-				this._time = this._totalTime = this._duration = this._totalDuration = 0;
-			} else if (this._time > last._startTime + last._totalDuration / last._timeScale) {
-				this._time = this.duration();
-				this._totalTime = this._totalDuration;
-			}
-			return this;
-		};
-
-		p.append = function(value, offsetOrLabel) {
-			return this.add(value, this._parseTimeOrLabel(null, offsetOrLabel, true, value));
-		};
-
-		p.insert = p.insertMultiple = function(value, position, align, stagger) {
-			return this.add(value, position || 0, align, stagger);
-		};
-
-		p.appendMultiple = function(tweens, offsetOrLabel, align, stagger) {
-			return this.add(tweens, this._parseTimeOrLabel(null, offsetOrLabel, true, tweens), align, stagger);
-		};
-
-		p.addLabel = function(label, position) {
-			this._labels[label] = this._parseTimeOrLabel(position);
-			return this;
-		};
-
-		p.addPause = function(position, callback, params, scope) {
-			return this.call(_pauseCallback, ["{self}", callback, params, scope], this, position);
-		};
-
-		p.removeLabel = function(label) {
-			delete this._labels[label];
-			return this;
-		};
-
-		p.getLabelTime = function(label) {
-			return (this._labels[label] != null) ? this._labels[label] : -1;
-		};
-
-		p._parseTimeOrLabel = function(timeOrLabel, offsetOrLabel, appendIfAbsent, ignore) {
-			var i;
-			//if we're about to add a tween/timeline (or an array of them) that's already a child of this timeline, we should remove it first so that it doesn't contaminate the duration().
-			if (ignore instanceof Animation && ignore.timeline === this) {
-				this.remove(ignore);
-			} else if (ignore && ((ignore instanceof Array) || (ignore.push && _isArray(ignore)))) {
-				i = ignore.length;
-				while (--i > -1) {
-					if (ignore[i] instanceof Animation && ignore[i].timeline === this) {
-						this.remove(ignore[i]);
-					}
-				}
-			}
-			if (typeof(offsetOrLabel) === "string") {
-				return this._parseTimeOrLabel(offsetOrLabel, (appendIfAbsent && typeof(timeOrLabel) === "number" && this._labels[offsetOrLabel] == null) ? timeOrLabel - this.duration() : 0, appendIfAbsent);
-			}
-			offsetOrLabel = offsetOrLabel || 0;
-			if (typeof(timeOrLabel) === "string" && (isNaN(timeOrLabel) || this._labels[timeOrLabel] != null)) { //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).
-				i = timeOrLabel.indexOf("=");
-				if (i === -1) {
-					if (this._labels[timeOrLabel] == null) {
-						return appendIfAbsent ? (this._labels[timeOrLabel] = this.duration() + offsetOrLabel) : offsetOrLabel;
-					}
-					return this._labels[timeOrLabel] + offsetOrLabel;
-				}
-				offsetOrLabel = parseInt(timeOrLabel.charAt(i-1) + "1", 10) * Number(timeOrLabel.substr(i+1));
-				timeOrLabel = (i > 1) ? this._parseTimeOrLabel(timeOrLabel.substr(0, i-1), 0, appendIfAbsent) : this.duration();
-			} else if (timeOrLabel == null) {
-				timeOrLabel = this.duration();
-			}
-			return Number(timeOrLabel) + offsetOrLabel;
-		};
-
-		p.seek = function(position, suppressEvents) {
-			return this.totalTime((typeof(position) === "number") ? position : this._parseTimeOrLabel(position), (suppressEvents !== false));
-		};
-
-		p.stop = function() {
-			return this.paused(true);
-		};
-
-		p.gotoAndPlay = function(position, suppressEvents) {
-			return this.play(position, suppressEvents);
-		};
-
-		p.gotoAndStop = function(position, suppressEvents) {
-			return this.pause(position, suppressEvents);
-		};
-
-		p.render = function(time, suppressEvents, force) {
-			if (this._gc) {
-				this._enabled(true, false);
-			}
-			var totalDur = (!this._dirty) ? this._totalDuration : this.totalDuration(),
-				prevTime = this._time,
-				prevStart = this._startTime,
-				prevTimeScale = this._timeScale,
-				prevPaused = this._paused,
-				tween, isComplete, next, callback, internalForce;
-			if (time >= totalDur) {
-				this._totalTime = this._time = totalDur;
-				if (!this._reversed) if (!this._hasPausedChild()) {
-					isComplete = true;
-					callback = "onComplete";
-					if (this._duration === 0) if (time === 0 || this._rawPrevTime < 0 || this._rawPrevTime === _tinyNum) if (this._rawPrevTime !== time && this._first) {
-						internalForce = true;
-						if (this._rawPrevTime > _tinyNum) {
-							callback = "onReverseComplete";
-						}
-					}
-				}
-				this._rawPrevTime = (this._duration || !suppressEvents || time || this._rawPrevTime === time) ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
-				time = totalDur + 0.0001; //to avoid occasional floating point rounding errors - sometimes child tweens/timelines were not being fully completed (their progress might be 0.999999999999998 instead of 1 because when _time - tween._startTime is performed, floating point errors would return a value that was SLIGHTLY off). Try (999999999999.7 - 999999999999) * 1 = 0.699951171875 instead of 0.7.
-
-			} else if (time < 0.0000001) { //to work around occasional floating point math artifacts, round super small values to 0.
-				this._totalTime = this._time = 0;
-				if (prevTime !== 0 || (this._duration === 0 && this._rawPrevTime !== _tinyNum && (this._rawPrevTime > 0 || (time < 0 && this._rawPrevTime >= 0)))) {
-					callback = "onReverseComplete";
-					isComplete = this._reversed;
-				}
-				if (time < 0) {
-					this._active = false;
-					if (this._duration === 0) if (this._rawPrevTime >= 0 && this._first) { //zero-duration timelines are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
-						internalForce = true;
-					}
-					this._rawPrevTime = time;
-				} else {
-					this._rawPrevTime = (this._duration || !suppressEvents || time || this._rawPrevTime === time) ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
-
-					time = 0; //to avoid occasional floating point rounding errors (could cause problems especially with zero-duration tweens at the very beginning of the timeline)
-					if (!this._initted) {
-						internalForce = true;
-					}
-				}
-
-			} else {
-				this._totalTime = this._time = this._rawPrevTime = time;
-			}
-			if ((this._time === prevTime || !this._first) && !force && !internalForce) {
-				return;
-			} else if (!this._initted) {
-				this._initted = true;
-			}
-
-			if (!this._active) if (!this._paused && this._time !== prevTime && time > 0) {
-				this._active = true;  //so that if the user renders the timeline (as opposed to the parent timeline rendering it), it is forced to re-render and align it with the proper time/frame on the next rendering cycle. Maybe the timeline already finished but the user manually re-renders it as halfway done, for example.
-			}
-
-			if (prevTime === 0) if (this.vars.onStart) if (this._time !== 0) if (!suppressEvents) {
-				this.vars.onStart.apply(this.vars.onStartScope || this, this.vars.onStartParams || _blankArray);
-			}
-
-			if (this._time >= prevTime) {
-				tween = this._first;
-				while (tween) {
-					next = tween._next; //record it here because the value could change after rendering...
-					if (this._paused && !prevPaused) { //in case a tween pauses the timeline when rendering
-						break;
-					} else if (tween._active || (tween._startTime <= this._time && !tween._paused && !tween._gc)) {
-						if (!tween._reversed) {
-							tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
-						} else {
-							tween.render(((!tween._dirty) ? tween._totalDuration : tween.totalDuration()) - ((time - tween._startTime) * tween._timeScale), suppressEvents, force);
-						}
-					}
-					tween = next;
-				}
-			} else {
-				tween = this._last;
-				while (tween) {
-					next = tween._prev; //record it here because the value could change after rendering...
-					if (this._paused && !prevPaused) { //in case a tween pauses the timeline when rendering
-						break;
-					} else if (tween._active || (tween._startTime <= prevTime && !tween._paused && !tween._gc)) {
-						if (!tween._reversed) {
-							tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
-						} else {
-							tween.render(((!tween._dirty) ? tween._totalDuration : tween.totalDuration()) - ((time - tween._startTime) * tween._timeScale), suppressEvents, force);
-						}
-					}
-					tween = next;
-				}
-			}
-
-			if (this._onUpdate) if (!suppressEvents) {
-				this._onUpdate.apply(this.vars.onUpdateScope || this, this.vars.onUpdateParams || _blankArray);
-			}
-
-			if (callback) if (!this._gc) if (prevStart === this._startTime || prevTimeScale !== this._timeScale) if (this._time === 0 || totalDur >= this.totalDuration()) { //if one of the tweens that was rendered altered this timeline's startTime (like if an onComplete reversed the timeline), it probably isn't complete. If it is, don't worry, because whatever call altered the startTime would complete if it was necessary at the new time. The only exception is the timeScale property. Also check _gc because there's a chance that kill() could be called in an onUpdate
-				if (isComplete) {
-					if (this._timeline.autoRemoveChildren) {
-						this._enabled(false, false);
-					}
-					this._active = false;
-				}
-				if (!suppressEvents && this.vars[callback]) {
-					this.vars[callback].apply(this.vars[callback + "Scope"] || this, this.vars[callback + "Params"] || _blankArray);
-				}
-			}
-		};
-
-		p._hasPausedChild = function() {
-			var tween = this._first;
-			while (tween) {
-				if (tween._paused || ((tween instanceof TimelineLite) && tween._hasPausedChild())) {
-					return true;
-				}
-				tween = tween._next;
-			}
-			return false;
-		};
-
-		p.getChildren = function(nested, tweens, timelines, ignoreBeforeTime) {
-			ignoreBeforeTime = ignoreBeforeTime || -9999999999;
-			var a = [],
-				tween = this._first,
-				cnt = 0;
-			while (tween) {
-				if (tween._startTime < ignoreBeforeTime) {
-					//do nothing
-				} else if (tween instanceof TweenLite) {
-					if (tweens !== false) {
-						a[cnt++] = tween;
-					}
-				} else {
-					if (timelines !== false) {
-						a[cnt++] = tween;
-					}
-					if (nested !== false) {
-						a = a.concat(tween.getChildren(true, tweens, timelines));
-						cnt = a.length;
-					}
-				}
-				tween = tween._next;
-			}
-			return a;
-		};
-
-		p.getTweensOf = function(target, nested) {
-			var disabled = this._gc,
-				a = [],
-				cnt = 0,
-				tweens, i;
-			if (disabled) {
-				this._enabled(true, true); //getTweensOf() filters out disabled tweens, and we have to mark them as _gc = true when the timeline completes in order to allow clean garbage collection, so temporarily re-enable the timeline here.
-			}
-			tweens = TweenLite.getTweensOf(target);
-			i = tweens.length;
-			while (--i > -1) {
-				if (tweens[i].timeline === this || (nested && this._contains(tweens[i]))) {
-					a[cnt++] = tweens[i];
-				}
-			}
-			if (disabled) {
-				this._enabled(false, true);
-			}
-			return a;
-		};
-
-		p._contains = function(tween) {
-			var tl = tween.timeline;
-			while (tl) {
-				if (tl === this) {
-					return true;
-				}
-				tl = tl.timeline;
-			}
-			return false;
-		};
-
-		p.shiftChildren = function(amount, adjustLabels, ignoreBeforeTime) {
-			ignoreBeforeTime = ignoreBeforeTime || 0;
-			var tween = this._first,
-				labels = this._labels,
-				p;
-			while (tween) {
-				if (tween._startTime >= ignoreBeforeTime) {
-					tween._startTime += amount;
-				}
-				tween = tween._next;
-			}
-			if (adjustLabels) {
-				for (p in labels) {
-					if (labels[p] >= ignoreBeforeTime) {
-						labels[p] += amount;
-					}
-				}
-			}
-			return this._uncache(true);
-		};
-
-		p._kill = function(vars, target) {
-			if (!vars && !target) {
-				return this._enabled(false, false);
-			}
-			var tweens = (!target) ? this.getChildren(true, true, false) : this.getTweensOf(target),
-				i = tweens.length,
-				changed = false;
-			while (--i > -1) {
-				if (tweens[i]._kill(vars, target)) {
-					changed = true;
-				}
-			}
-			return changed;
-		};
-
-		p.clear = function(labels) {
-			var tweens = this.getChildren(false, true, true),
-				i = tweens.length;
-			this._time = this._totalTime = 0;
-			while (--i > -1) {
-				tweens[i]._enabled(false, false);
-			}
-			if (labels !== false) {
-				this._labels = {};
-			}
-			return this._uncache(true);
-		};
-
-		p.invalidate = function() {
-			var tween = this._first;
-			while (tween) {
-				tween.invalidate();
-				tween = tween._next;
-			}
-			return this;
-		};
-
-		p._enabled = function(enabled, ignoreTimeline) {
-			if (enabled === this._gc) {
-				var tween = this._first;
-				while (tween) {
-					tween._enabled(enabled, true);
-					tween = tween._next;
-				}
-			}
-			return SimpleTimeline.prototype._enabled.call(this, enabled, ignoreTimeline);
-		};
-
-		p.duration = function(value) {
-			if (!arguments.length) {
-				if (this._dirty) {
-					this.totalDuration(); //just triggers recalculation
-				}
-				return this._duration;
-			}
-			if (this.duration() !== 0 && value !== 0) {
-				this.timeScale(this._duration / value);
-			}
-			return this;
-		};
-
-		p.totalDuration = function(value) {
-			if (!arguments.length) {
-				if (this._dirty) {
-					var max = 0,
-						tween = this._last,
-						prevStart = 999999999999,
-						prev, end;
-					while (tween) {
-						prev = tween._prev; //record it here in case the tween changes position in the sequence...
-						if (tween._dirty) {
-							tween.totalDuration(); //could change the tween._startTime, so make sure the tween's cache is clean before analyzing it.
-						}
-						if (tween._startTime > prevStart && this._sortChildren && !tween._paused) { //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence
-							this.add(tween, tween._startTime - tween._delay);
-						} else {
-							prevStart = tween._startTime;
-						}
-						if (tween._startTime < 0 && !tween._paused) { //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.
-							max -= tween._startTime;
-							if (this._timeline.smoothChildTiming) {
-								this._startTime += tween._startTime / this._timeScale;
-							}
-							this.shiftChildren(-tween._startTime, false, -9999999999);
-							prevStart = 0;
-						}
-						end = tween._startTime + (tween._totalDuration / tween._timeScale);
-						if (end > max) {
-							max = end;
-						}
-						tween = prev;
-					}
-					this._duration = this._totalDuration = max;
-					this._dirty = false;
-				}
-				return this._totalDuration;
-			}
-			if (this.totalDuration() !== 0) if (value !== 0) {
-				this.timeScale(this._totalDuration / value);
-			}
-			return this;
-		};
-
-		p.usesFrames = function() {
-			var tl = this._timeline;
-			while (tl._timeline) {
-				tl = tl._timeline;
-			}
-			return (tl === Animation._rootFramesTimeline);
-		};
-
-		p.rawTime = function() {
-			return this._paused ? this._totalTime : (this._timeline.rawTime() - this._startTime) * this._timeScale;
-		};
-
-		return TimelineLite;
-
-	}, true);
-	
-
-
-
-
-
-
-
-	
-	
-	
-	
-	
-/*
- * ----------------------------------------------------------------
- * TimelineMax
- * ----------------------------------------------------------------
- */
-	window._gsDefine("TimelineMax", ["TimelineLite","TweenLite","easing.Ease"], function(TimelineLite, TweenLite, Ease) {
-
-		var TimelineMax = function(vars) {
-				TimelineLite.call(this, vars);
-				this._repeat = this.vars.repeat || 0;
-				this._repeatDelay = this.vars.repeatDelay || 0;
-				this._cycle = 0;
-				this._yoyo = (this.vars.yoyo === true);
-				this._dirty = true;
-			},
-			_tinyNum = 0.0000000001,
-			_blankArray = [],
-			_easeNone = new Ease(null, null, 1, 0),
-			p = TimelineMax.prototype = new TimelineLite();
-
-		p.constructor = TimelineMax;
-		p.kill()._gc = false;
-		TimelineMax.version = "1.12.1";
-
-		p.invalidate = function() {
-			this._yoyo = (this.vars.yoyo === true);
-			this._repeat = this.vars.repeat || 0;
-			this._repeatDelay = this.vars.repeatDelay || 0;
-			this._uncache(true);
-			return TimelineLite.prototype.invalidate.call(this);
-		};
-
-		p.addCallback = function(callback, position, params, scope) {
-			return this.add( TweenLite.delayedCall(0, callback, params, scope), position);
-		};
-
-		p.removeCallback = function(callback, position) {
-			if (callback) {
-				if (position == null) {
-					this._kill(null, callback);
-				} else {
-					var a = this.getTweensOf(callback, false),
-						i = a.length,
-						time = this._parseTimeOrLabel(position);
-					while (--i > -1) {
-						if (a[i]._startTime === time) {
-							a[i]._enabled(false, false);
-						}
-					}
-				}
-			}
-			return this;
-		};
-
-		p.tweenTo = function(position, vars) {
-			vars = vars || {};
-			var copy = {ease:_easeNone, overwrite:(vars.delay ? 2 : 1), useFrames:this.usesFrames(), immediateRender:false},//note: set overwrite to 1 (true/all) by default unless there's a delay so that we avoid a racing situation that could happen if, for example, an onmousemove creates the same tweenTo() over and over again.
-				duration, p, t;
-			for (p in vars) {
-				copy[p] = vars[p];
-			}
-			copy.time = this._parseTimeOrLabel(position);
-			duration = (Math.abs(Number(copy.time) - this._time) / this._timeScale) || 0.001;
-			t = new TweenLite(this, duration, copy);
-			copy.onStart = function() {
-				t.target.paused(true);
-				if (t.vars.time !== t.target.time() && duration === t.duration()) { //don't make the duration zero - if it's supposed to be zero, don't worry because it's already initting the tween and will complete immediately, effectively making the duration zero anyway. If we make duration zero, the tween won't run at all.
-					t.duration( Math.abs( t.vars.time - t.target.time()) / t.target._timeScale );
-				}
-				if (vars.onStart) { //in case the user had an onStart in the vars - we don't want to overwrite it.
-					vars.onStart.apply(vars.onStartScope || t, vars.onStartParams || _blankArray);
-				}
-			};
-			return t;
-		};
-
-		p.tweenFromTo = function(fromPosition, toPosition, vars) {
-			vars = vars || {};
-			fromPosition = this._parseTimeOrLabel(fromPosition);
-			vars.startAt = {onComplete:this.seek, onCompleteParams:[fromPosition], onCompleteScope:this};
-			vars.immediateRender = (vars.immediateRender !== false);
-			var t = this.tweenTo(toPosition, vars);
-			return t.duration((Math.abs( t.vars.time - fromPosition) / this._timeScale) || 0.001);
-		};
-
-		p.render = function(time, suppressEvents, force) {
-			if (this._gc) {
-				this._enabled(true, false);
-			}
-			var totalDur = (!this._dirty) ? this._totalDuration : this.totalDuration(),
-				dur = this._duration,
-				prevTime = this._time,
-				prevTotalTime = this._totalTime,
-				prevStart = this._startTime,
-				prevTimeScale = this._timeScale,
-				prevRawPrevTime = this._rawPrevTime,
-				prevPaused = this._paused,
-				prevCycle = this._cycle,
-				tween, isComplete, next, callback, internalForce, cycleDuration;
-			if (time >= totalDur) {
-				if (!this._locked) {
-					this._totalTime = totalDur;
-					this._cycle = this._repeat;
-				}
-				if (!this._reversed) if (!this._hasPausedChild()) {
-					isComplete = true;
-					callback = "onComplete";
-					if (this._duration === 0) if (time === 0 || prevRawPrevTime < 0 || prevRawPrevTime === _tinyNum) if (prevRawPrevTime !== time && this._first) {
-						internalForce = true;
-						if (prevRawPrevTime > _tinyNum) {
-							callback = "onReverseComplete";
-						}
-					}
-				}
-				this._rawPrevTime = (this._duration || !suppressEvents || time || this._rawPrevTime === time) ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
-				if (this._yoyo && (this._cycle & 1) !== 0) {
-					this._time = time = 0;
-				} else {
-					this._time = dur;
-					time = dur + 0.0001; //to avoid occasional floating point rounding errors - sometimes child tweens/timelines were not being fully completed (their progress might be 0.999999999999998 instead of 1 because when _time - tween._startTime is performed, floating point errors would return a value that was SLIGHTLY off). Try (999999999999.7 - 999999999999) * 1 = 0.699951171875 instead of 0.7. We cannot do less then 0.0001 because the same issue can occur when the duration is extremely large like 999999999999 in which case adding 0.00000001, for example, causes it to act like nothing was added.
-				}
-
-			} else if (time < 0.0000001) { //to work around occasional floating point math artifacts, round super small values to 0.
-				if (!this._locked) {
-					this._totalTime = this._cycle = 0;
-				}
-				this._time = 0;
-				if (prevTime !== 0 || (dur === 0 && prevRawPrevTime !== _tinyNum && (prevRawPrevTime > 0 || (time < 0 && prevRawPrevTime >= 0)) && !this._locked)) { //edge case for checking time < 0 && prevRawPrevTime >= 0: a zero-duration fromTo() tween inside a zero-duration timeline (yeah, very rare)
-					callback = "onReverseComplete";
-					isComplete = this._reversed;
-				}
-				if (time < 0) {
-					this._active = false;
-					if (dur === 0) if (prevRawPrevTime >= 0 && this._first) { //zero-duration timelines are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
-						internalForce = true;
-					}
-					this._rawPrevTime = time;
-				} else {
-					this._rawPrevTime = (dur || !suppressEvents || time || this._rawPrevTime === time) ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
-					time = 0; //to avoid occasional floating point rounding errors (could cause problems especially with zero-duration tweens at the very beginning of the timeline)
-					if (!this._initted) {
-						internalForce = true;
-					}
-				}
-
-			} else {
-				if (dur === 0 && prevRawPrevTime < 0) { //without this, zero-duration repeating timelines (like with a simple callback nested at the very beginning and a repeatDelay) wouldn't render the first time through.
-					internalForce = true;
-				}
-				this._time = this._rawPrevTime = time;
-				if (!this._locked) {
-					this._totalTime = time;
-					if (this._repeat !== 0) {
-						cycleDuration = dur + this._repeatDelay;
-						this._cycle = (this._totalTime / cycleDuration) >> 0; //originally _totalTime % cycleDuration but floating point errors caused problems, so I normalized it. (4 % 0.8 should be 0 but it gets reported as 0.79999999!)
-						if (this._cycle !== 0) if (this._cycle === this._totalTime / cycleDuration) {
-							this._cycle--; //otherwise when rendered exactly at the end time, it will act as though it is repeating (at the beginning)
-						}
-						this._time = this._totalTime - (this._cycle * cycleDuration);
-						if (this._yoyo) if ((this._cycle & 1) !== 0) {
-							this._time = dur - this._time;
-						}
-						if (this._time > dur) {
-							this._time = dur;
-							time = dur + 0.0001; //to avoid occasional floating point rounding error
-						} else if (this._time < 0) {
-							this._time = time = 0;
-						} else {
-							time = this._time;
-						}
-					}
-				}
-			}
-
-			if (this._cycle !== prevCycle) if (!this._locked) {
-				/*
-				make sure children at the end/beginning of the timeline are rendered properly. If, for example,
-				a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which
-				would get transated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there
-				could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So
-				we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must
-				ensure that zero-duration tweens at the very beginning or end of the TimelineMax work.
-				*/
-				var backwards = (this._yoyo && (prevCycle & 1) !== 0),
-					wrap = (backwards === (this._yoyo && (this._cycle & 1) !== 0)),
-					recTotalTime = this._totalTime,
-					recCycle = this._cycle,
-					recRawPrevTime = this._rawPrevTime,
-					recTime = this._time;
-
-				this._totalTime = prevCycle * dur;
-				if (this._cycle < prevCycle) {
-					backwards = !backwards;
-				} else {
-					this._totalTime += dur;
-				}
-				this._time = prevTime; //temporarily revert _time so that render() renders the children in the correct order. Without this, tweens won't rewind correctly. We could arhictect things in a "cleaner" way by splitting out the rendering queue into a separate method but for performance reasons, we kept it all inside this method.
-
-				this._rawPrevTime = (dur === 0) ? prevRawPrevTime - 0.0001 : prevRawPrevTime;
-				this._cycle = prevCycle;
-				this._locked = true; //prevents changes to totalTime and skips repeat/yoyo behavior when we recursively call render()
-				prevTime = (backwards) ? 0 : dur;
-				this.render(prevTime, suppressEvents, (dur === 0));
-				if (!suppressEvents) if (!this._gc) {
-					if (this.vars.onRepeat) {
-						this.vars.onRepeat.apply(this.vars.onRepeatScope || this, this.vars.onRepeatParams || _blankArray);
-					}
-				}
-				if (wrap) {
-					prevTime = (backwards) ? dur + 0.0001 : -0.0001;
-					this.render(prevTime, true, false);
-				}
-				this._locked = false;
-				if (this._paused && !prevPaused) { //if the render() triggered callback that paused this timeline, we should abort (very rare, but possible)
-					return;
-				}
-				this._time = recTime;
-				this._totalTime = recTotalTime;
-				this._cycle = recCycle;
-				this._rawPrevTime = recRawPrevTime;
-			}
-
-			if ((this._time === prevTime || !this._first) && !force && !internalForce) {
-				if (prevTotalTime !== this._totalTime) if (this._onUpdate) if (!suppressEvents) { //so that onUpdate fires even during the repeatDelay - as long as the totalTime changed, we should trigger onUpdate.
-					this._onUpdate.apply(this.vars.onUpdateScope || this, this.vars.onUpdateParams || _blankArray);
-				}
-				return;
-			} else if (!this._initted) {
-				this._initted = true;
-			}
-
-			if (!this._active) if (!this._paused && this._totalTime !== prevTotalTime && time > 0) {
-				this._active = true;  //so that if the user renders the timeline (as opposed to the parent timeline rendering it), it is forced to re-render and align it with the proper time/frame on the next rendering cycle. Maybe the timeline already finished but the user manually re-renders it as halfway done, for example.
-			}
-
-			if (prevTotalTime === 0) if (this.vars.onStart) if (this._totalTime !== 0) if (!suppressEvents) {
-				this.vars.onStart.apply(this.vars.onStartScope || this, this.vars.onStartParams || _blankArray);
-			}
-
-			if (this._time >= prevTime) {
-				tween = this._first;
-				while (tween) {
-					next = tween._next; //record it here because the value could change after rendering...
-					if (this._paused && !prevPaused) { //in case a tween pauses the timeline when rendering
-						break;
-					} else if (tween._active || (tween._startTime <= this._time && !tween._paused && !tween._gc)) {
-						if (!tween._reversed) {
-							tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
-						} else {
-							tween.render(((!tween._dirty) ? tween._totalDuration : tween.totalDuration()) - ((time - tween._startTime) * tween._timeScale), suppressEvents, force);
-						}
-
-					}
-					tween = next;
-				}
-			} else {
-				tween = this._last;
-				while (tween) {
-					next = tween._prev; //record it here because the value could change after rendering...
-					if (this._paused && !prevPaused) { //in case a tween pauses the timeline when rendering
-						break;
-					} else if (tween._active || (tween._startTime <= prevTime && !tween._paused && !tween._gc)) {
-						if (!tween._reversed) {
-							tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
-						} else {
-							tween.render(((!tween._dirty) ? tween._totalDuration : tween.totalDuration()) - ((time - tween._startTime) * tween._timeScale), suppressEvents, force);
-						}
-					}
-					tween = next;
-				}
-			}
-
-			if (this._onUpdate) if (!suppressEvents) {
-				this._onUpdate.apply(this.vars.onUpdateScope || this, this.vars.onUpdateParams || _blankArray);
-			}
-			if (callback) if (!this._locked) if (!this._gc) if (prevStart === this._startTime || prevTimeScale !== this._timeScale) if (this._time === 0 || totalDur >= this.totalDuration()) { //if one of the tweens that was rendered altered this timeline's startTime (like if an onComplete reversed the timeline), it probably isn't complete. If it is, don't worry, because whatever call altered the startTime would complete if it was necessary at the new time. The only exception is the timeScale property. Also check _gc because there's a chance that kill() could be called in an onUpdate
-				if (isComplete) {
-					if (this._timeline.autoRemoveChildren) {
-						this._enabled(false, false);
-					}
-					this._active = false;
-				}
-				if (!suppressEvents && this.vars[callback]) {
-					this.vars[callback].apply(this.vars[callback + "Scope"] || this, this.vars[callback + "Params"] || _blankArray);
-				}
-			}
-		};
-
-		p.getActive = function(nested, tweens, timelines) {
-			if (nested == null) {
-				nested = true;
-			}
-			if (tweens == null) {
-				tweens = true;
-			}
-			if (timelines == null) {
-				timelines = false;
-			}
-			var a = [],
-				all = this.getChildren(nested, tweens, timelines),
-				cnt = 0,
-				l = all.length,
-				i, tween;
-			for (i = 0; i < l; i++) {
-				tween = all[i];
-				if (tween.isActive()) {
-					a[cnt++] = tween;
-				}
-			}
-			return a;
-		};
-
-
-		p.getLabelAfter = function(time) {
-			if (!time) if (time !== 0) { //faster than isNan()
-				time = this._time;
-			}
-			var labels = this.getLabelsArray(),
-				l = labels.length,
-				i;
-			for (i = 0; i < l; i++) {
-				if (labels[i].time > time) {
-					return labels[i].name;
-				}
-			}
-			return null;
-		};
-
-		p.getLabelBefore = function(time) {
-			if (time == null) {
-				time = this._time;
-			}
-			var labels = this.getLabelsArray(),
-				i = labels.length;
-			while (--i > -1) {
-				if (labels[i].time < time) {
-					return labels[i].name;
-				}
-			}
-			return null;
-		};
-
-		p.getLabelsArray = function() {
-			var a = [],
-				cnt = 0,
-				p;
-			for (p in this._labels) {
-				a[cnt++] = {time:this._labels[p], name:p};
-			}
-			a.sort(function(a,b) {
-				return a.time - b.time;
-			});
-			return a;
-		};
-
-
-//---- GETTERS / SETTERS -------------------------------------------------------------------------------------------------------
-
-		p.progress = function(value) {
-			return (!arguments.length) ? this._time / this.duration() : this.totalTime( this.duration() * ((this._yoyo && (this._cycle & 1) !== 0) ? 1 - value : value) + (this._cycle * (this._duration + this._repeatDelay)), false);
-		};
-
-		p.totalProgress = function(value) {
-			return (!arguments.length) ? this._totalTime / this.totalDuration() : this.totalTime( this.totalDuration() * value, false);
-		};
-
-		p.totalDuration = function(value) {
-			if (!arguments.length) {
-				if (this._dirty) {
-					TimelineLite.prototype.totalDuration.call(this); //just forces refresh
-					//Instead of Infinity, we use 999999999999 so that we can accommodate reverses.
-					this._totalDuration = (this._repeat === -1) ? 999999999999 : this._duration * (this._repeat + 1) + (this._repeatDelay * this._repeat);
-				}
-				return this._totalDuration;
-			}
-			return (this._repeat === -1) ? this : this.duration( (value - (this._repeat * this._repeatDelay)) / (this._repeat + 1) );
-		};
-
-		p.time = function(value, suppressEvents) {
-			if (!arguments.length) {
-				return this._time;
-			}
-			if (this._dirty) {
-				this.totalDuration();
-			}
-			if (value > this._duration) {
-				value = this._duration;
-			}
-			if (this._yoyo && (this._cycle & 1) !== 0) {
-				value = (this._duration - value) + (this._cycle * (this._duration + this._repeatDelay));
-			} else if (this._repeat !== 0) {
-				value += this._cycle * (this._duration + this._repeatDelay);
-			}
-			return this.totalTime(value, suppressEvents);
-		};
-
-		p.repeat = function(value) {
-			if (!arguments.length) {
-				return this._repeat;
-			}
-			this._repeat = value;
-			return this._uncache(true);
-		};
-
-		p.repeatDelay = function(value) {
-			if (!arguments.length) {
-				return this._repeatDelay;
-			}
-			this._repeatDelay = value;
-			return this._uncache(true);
-		};
-
-		p.yoyo = function(value) {
-			if (!arguments.length) {
-				return this._yoyo;
-			}
-			this._yoyo = value;
-			return this;
-		};
-
-		p.currentLabel = function(value) {
-			if (!arguments.length) {
-				return this.getLabelBefore(this._time + 0.00000001);
-			}
-			return this.seek(value, true);
-		};
-
-		return TimelineMax;
-
-	}, true);
-	
-
-
-
-
-	
-	
-	
-	
-	
-	
-	
-/*
- * ----------------------------------------------------------------
- * BezierPlugin
- * ----------------------------------------------------------------
- */
-	(function() {
-
-		var _RAD2DEG = 180 / Math.PI,
-			_r1 = [],
-			_r2 = [],
-			_r3 = [],
-			_corProps = {},
-			Segment = function(a, b, c, d) {
-				this.a = a;
-				this.b = b;
-				this.c = c;
-				this.d = d;
-				this.da = d - a;
-				this.ca = c - a;
-				this.ba = b - a;
-			},
-			_correlate = ",x,y,z,left,top,right,bottom,marginTop,marginLeft,marginRight,marginBottom,paddingLeft,paddingTop,paddingRight,paddingBottom,backgroundPosition,backgroundPosition_y,",
-			cubicToQuadratic = function(a, b, c, d) {
-				var q1 = {a:a},
-					q2 = {},
-					q3 = {},
-					q4 = {c:d},
-					mab = (a + b) / 2,
-					mbc = (b + c) / 2,
-					mcd = (c + d) / 2,
-					mabc = (mab + mbc) / 2,
-					mbcd = (mbc + mcd) / 2,
-					m8 = (mbcd - mabc) / 8;
-				q1.b = mab + (a - mab) / 4;
-				q2.b = mabc + m8;
-				q1.c = q2.a = (q1.b + q2.b) / 2;
-				q2.c = q3.a = (mabc + mbcd) / 2;
-				q3.b = mbcd - m8;
-				q4.b = mcd + (d - mcd) / 4;
-				q3.c = q4.a = (q3.b + q4.b) / 2;
-				return [q1, q2, q3, q4];
-			},
-			_calculateControlPoints = function(a, curviness, quad, basic, correlate) {
-				var l = a.length - 1,
-					ii = 0,
-					cp1 = a[0].a,
-					i, p1, p2, p3, seg, m1, m2, mm, cp2, qb, r1, r2, tl;
-				for (i = 0; i < l; i++) {
-					seg = a[ii];
-					p1 = seg.a;
-					p2 = seg.d;
-					p3 = a[ii+1].d;
-
-					if (correlate) {
-						r1 = _r1[i];
-						r2 = _r2[i];
-						tl = ((r2 + r1) * curviness * 0.25) / (basic ? 0.5 : _r3[i] || 0.5);
-						m1 = p2 - (p2 - p1) * (basic ? curviness * 0.5 : (r1 !== 0 ? tl / r1 : 0));
-						m2 = p2 + (p3 - p2) * (basic ? curviness * 0.5 : (r2 !== 0 ? tl / r2 : 0));
-						mm = p2 - (m1 + (((m2 - m1) * ((r1 * 3 / (r1 + r2)) + 0.5) / 4) || 0));
-					} else {
-						m1 = p2 - (p2 - p1) * curviness * 0.5;
-						m2 = p2 + (p3 - p2) * curviness * 0.5;
-						mm = p2 - (m1 + m2) / 2;
-					}
-					m1 += mm;
-					m2 += mm;
-
-					seg.c = cp2 = m1;
-					if (i !== 0) {
-						seg.b = cp1;
-					} else {
-						seg.b = cp1 = seg.a + (seg.c - seg.a) * 0.6; //instead of placing b on a exactly, we move it inline with c so that if the user specifies an ease like Back.easeIn or Elastic.easeIn which goes BEYOND the beginning, it will do so smoothly.
-					}
-
-					seg.da = p2 - p1;
-					seg.ca = cp2 - p1;
-					seg.ba = cp1 - p1;
-
-					if (quad) {
-						qb = cubicToQuadratic(p1, cp1, cp2, p2);
-						a.splice(ii, 1, qb[0], qb[1], qb[2], qb[3]);
-						ii += 4;
-					} else {
-						ii++;
-					}
-
-					cp1 = m2;
-				}
-				seg = a[ii];
-				seg.b = cp1;
-				seg.c = cp1 + (seg.d - cp1) * 0.4; //instead of placing c on d exactly, we move it inline with b so that if the user specifies an ease like Back.easeOut or Elastic.easeOut which goes BEYOND the end, it will do so smoothly.
-				seg.da = seg.d - seg.a;
-				seg.ca = seg.c - seg.a;
-				seg.ba = cp1 - seg.a;
-				if (quad) {
-					qb = cubicToQuadratic(seg.a, cp1, seg.c, seg.d);
-					a.splice(ii, 1, qb[0], qb[1], qb[2], qb[3]);
-				}
-			},
-			_parseAnchors = function(values, p, correlate, prepend) {
-				var a = [],
-					l, i, p1, p2, p3, tmp;
-				if (prepend) {
-					values = [prepend].concat(values);
-					i = values.length;
-					while (--i > -1) {
-						if (typeof( (tmp = values[i][p]) ) === "string") if (tmp.charAt(1) === "=") {
-							values[i][p] = prepend[p] + Number(tmp.charAt(0) + tmp.substr(2)); //accommodate relative values. Do it inline instead of breaking it out into a function for speed reasons
-						}
-					}
-				}
-				l = values.length - 2;
-				if (l < 0) {
-					a[0] = new Segment(values[0][p], 0, 0, values[(l < -1) ? 0 : 1][p]);
-					return a;
-				}
-				for (i = 0; i < l; i++) {
-					p1 = values[i][p];
-					p2 = values[i+1][p];
-					a[i] = new Segment(p1, 0, 0, p2);
-					if (correlate) {
-						p3 = values[i+2][p];
-						_r1[i] = (_r1[i] || 0) + (p2 - p1) * (p2 - p1);
-						_r2[i] = (_r2[i] || 0) + (p3 - p2) * (p3 - p2);
-					}
-				}
-				a[i] = new Segment(values[i][p], 0, 0, values[i+1][p]);
-				return a;
-			},
-			bezierThrough = function(values, curviness, quadratic, basic, correlate, prepend) {
-				var obj = {},
-					props = [],
-					first = prepend || values[0],
-					i, p, a, j, r, l, seamless, last;
-				correlate = (typeof(correlate) === "string") ? ","+correlate+"," : _correlate;
-				if (curviness == null) {
-					curviness = 1;
-				}
-				for (p in values[0]) {
-					props.push(p);
-				}
-				//check to see if the last and first values are identical (well, within 0.05). If so, make seamless by appending the second element to the very end of the values array and the 2nd-to-last element to the very beginning (we'll remove those segments later)
-				if (values.length > 1) {
-					last = values[values.length - 1];
-					seamless = true;
-					i = props.length;
-					while (--i > -1) {
-						p = props[i];
-						if (Math.abs(first[p] - last[p]) > 0.05) { //build in a tolerance of +/-0.05 to accommodate rounding errors. For example, if you set an object's position to 4.945, Flash will make it 4.9
-							seamless = false;
-							break;
-						}
-					}
-					if (seamless) {
-						values = values.concat(); //duplicate the array to avoid contaminating the original which the user may be reusing for other tweens
-						if (prepend) {
-							values.unshift(prepend);
-						}
-						values.push(values[1]);
-						prepend = values[values.length - 3];
-					}
-				}
-				_r1.length = _r2.length = _r3.length = 0;
-				i = props.length;
-				while (--i > -1) {
-					p = props[i];
-					_corProps[p] = (correlate.indexOf(","+p+",") !== -1);
-					obj[p] = _parseAnchors(values, p, _corProps[p], prepend);
-				}
-				i = _r1.length;
-				while (--i > -1) {
-					_r1[i] = Math.sqrt(_r1[i]);
-					_r2[i] = Math.sqrt(_r2[i]);
-				}
-				if (!basic) {
-					i = props.length;
-					while (--i > -1) {
-						if (_corProps[p]) {
-							a = obj[props[i]];
-							l = a.length - 1;
-							for (j = 0; j < l; j++) {
-								r = a[j+1].da / _r2[j] + a[j].da / _r1[j];
-								_r3[j] = (_r3[j] || 0) + r * r;
-							}
-						}
-					}
-					i = _r3.length;
-					while (--i > -1) {
-						_r3[i] = Math.sqrt(_r3[i]);
-					}
-				}
-				i = props.length;
-				j = quadratic ? 4 : 1;
-				while (--i > -1) {
-					p = props[i];
-					a = obj[p];
-					_calculateControlPoints(a, curviness, quadratic, basic, _corProps[p]); //this method requires that _parseAnchors() and _setSegmentRatios() ran first so that _r1, _r2, and _r3 values are populated for all properties
-					if (seamless) {
-						a.splice(0, j);
-						a.splice(a.length - j, j);
-					}
-				}
-				return obj;
-			},
-			_parseBezierData = function(values, type, prepend) {
-				type = type || "soft";
-				var obj = {},
-					inc = (type === "cubic") ? 3 : 2,
-					soft = (type === "soft"),
-					props = [],
-					a, b, c, d, cur, i, j, l, p, cnt, tmp;
-				if (soft && prepend) {
-					values = [prepend].concat(values);
-				}
-				if (values == null || values.length < inc + 1) { throw "invalid Bezier data"; }
-				for (p in values[0]) {
-					props.push(p);
-				}
-				i = props.length;
-				while (--i > -1) {
-					p = props[i];
-					obj[p] = cur = [];
-					cnt = 0;
-					l = values.length;
-					for (j = 0; j < l; j++) {
-						a = (prepend == null) ? values[j][p] : (typeof( (tmp = values[j][p]) ) === "string" && tmp.charAt(1) === "=") ? prepend[p] + Number(tmp.charAt(0) + tmp.substr(2)) : Number(tmp);
-						if (soft) if (j > 1) if (j < l - 1) {
-							cur[cnt++] = (a + cur[cnt-2]) / 2;
-						}
-						cur[cnt++] = a;
-					}
-					l = cnt - inc + 1;
-					cnt = 0;
-					for (j = 0; j < l; j += inc) {
-						a = cur[j];
-						b = cur[j+1];
-						c = cur[j+2];
-						d = (inc === 2) ? 0 : cur[j+3];
-						cur[cnt++] = tmp = (inc === 3) ? new Segment(a, b, c, d) : new Segment(a, (2 * b + a) / 3, (2 * b + c) / 3, c);
-					}
-					cur.length = cnt;
-				}
-				return obj;
-			},
-			_addCubicLengths = function(a, steps, resolution) {
-				var inc = 1 / resolution,
-					j = a.length,
-					d, d1, s, da, ca, ba, p, i, inv, bez, index;
-				while (--j > -1) {
-					bez = a[j];
-					s = bez.a;
-					da = bez.d - s;
-					ca = bez.c - s;
-					ba = bez.b - s;
-					d = d1 = 0;
-					for (i = 1; i <= resolution; i++) {
-						p = inc * i;
-						inv = 1 - p;
-						d = d1 - (d1 = (p * p * da + 3 * inv * (p * ca + inv * ba)) * p);
-						index = j * resolution + i - 1;
-						steps[index] = (steps[index] || 0) + d * d;
-					}
-				}
-			},
-			_parseLengthData = function(obj, resolution) {
-				resolution = resolution >> 0 || 6;
-				var a = [],
-					lengths = [],
-					d = 0,
-					total = 0,
-					threshold = resolution - 1,
-					segments = [],
-					curLS = [], //current length segments array
-					p, i, l, index;
-				for (p in obj) {
-					_addCubicLengths(obj[p], a, resolution);
-				}
-				l = a.length;
-				for (i = 0; i < l; i++) {
-					d += Math.sqrt(a[i]);
-					index = i % resolution;
-					curLS[index] = d;
-					if (index === threshold) {
-						total += d;
-						index = (i / resolution) >> 0;
-						segments[index] = curLS;
-						lengths[index] = total;
-						d = 0;
-						curLS = [];
-					}
-				}
-				return {length:total, lengths:lengths, segments:segments};
-			},
-
-
-
-			BezierPlugin = window._gsDefine.plugin({
-					propName: "bezier",
-					priority: -1,
-					version: "1.3.2",
-					API: 2,
-					global:true,
-
-					//gets called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
-					init: function(target, vars, tween) {
-						this._target = target;
-						if (vars instanceof Array) {
-							vars = {values:vars};
-						}
-						this._func = {};
-						this._round = {};
-						this._props = [];
-						this._timeRes = (vars.timeResolution == null) ? 6 : parseInt(vars.timeResolution, 10);
-						var values = vars.values || [],
-							first = {},
-							second = values[0],
-							autoRotate = vars.autoRotate || tween.vars.orientToBezier,
-							p, isFunc, i, j, prepend;
-
-						this._autoRotate = autoRotate ? (autoRotate instanceof Array) ? autoRotate : [["x","y","rotation",((autoRotate === true) ? 0 : Number(autoRotate) || 0)]] : null;
-						for (p in second) {
-							this._props.push(p);
-						}
-
-						i = this._props.length;
-						while (--i > -1) {
-							p = this._props[i];
-
-							this._overwriteProps.push(p);
-							isFunc = this._func[p] = (typeof(target[p]) === "function");
-							first[p] = (!isFunc) ? parseFloat(target[p]) : target[ ((p.indexOf("set") || typeof(target["get" + p.substr(3)]) !== "function") ? p : "get" + p.substr(3)) ]();
-							if (!prepend) if (first[p] !== values[0][p]) {
-								prepend = first;
-							}
-						}
-						this._beziers = (vars.type !== "cubic" && vars.type !== "quadratic" && vars.type !== "soft") ? bezierThrough(values, isNaN(vars.curviness) ? 1 : vars.curviness, false, (vars.type === "thruBasic"), vars.correlate, prepend) : _parseBezierData(values, vars.type, first);
-						this._segCount = this._beziers[p].length;
-
-						if (this._timeRes) {
-							var ld = _parseLengthData(this._beziers, this._timeRes);
-							this._length = ld.length;
-							this._lengths = ld.lengths;
-							this._segments = ld.segments;
-							this._l1 = this._li = this._s1 = this._si = 0;
-							this._l2 = this._lengths[0];
-							this._curSeg = this._segments[0];
-							this._s2 = this._curSeg[0];
-							this._prec = 1 / this._curSeg.length;
-						}
-
-						if ((autoRotate = this._autoRotate)) {
-							this._initialRotations = [];
-							if (!(autoRotate[0] instanceof Array)) {
-								this._autoRotate = autoRotate = [autoRotate];
-							}
-							i = autoRotate.length;
-							while (--i > -1) {
-								for (j = 0; j < 3; j++) {
-									p = autoRotate[i][j];
-									this._func[p] = (typeof(target[p]) === "function") ? target[ ((p.indexOf("set") || typeof(target["get" + p.substr(3)]) !== "function") ? p : "get" + p.substr(3)) ] : false;
-								}
-								p = autoRotate[i][2];
-								this._initialRotations[i] = this._func[p] ? this._func[p].call(this._target) : this._target[p];
-							}
-						}
-						this._startRatio = tween.vars.runBackwards ? 1 : 0; //we determine the starting ratio when the tween inits which is always 0 unless the tween has runBackwards:true (indicating it's a from() tween) in which case it's 1.
-						return true;
-					},
-
-					//called each time the values should be updated, and the ratio gets passed as the only parameter (typically it's a value between 0 and 1, but it can exceed those when using an ease like Elastic.easeOut or Back.easeOut, etc.)
-					set: function(v) {
-						var segments = this._segCount,
-							func = this._func,
-							target = this._target,
-							notStart = (v !== this._startRatio),
-							curIndex, inv, i, p, b, t, val, l, lengths, curSeg;
-						if (!this._timeRes) {
-							curIndex = (v < 0) ? 0 : (v >= 1) ? segments - 1 : (segments * v) >> 0;
-							t = (v - (curIndex * (1 / segments))) * segments;
-						} else {
-							lengths = this._lengths;
-							curSeg = this._curSeg;
-							v *= this._length;
-							i = this._li;
-							//find the appropriate segment (if the currently cached one isn't correct)
-							if (v > this._l2 && i < segments - 1) {
-								l = segments - 1;
-								while (i < l && (this._l2 = lengths[++i]) <= v) {	}
-								this._l1 = lengths[i-1];
-								this._li = i;
-								this._curSeg = curSeg = this._segments[i];
-								this._s2 = curSeg[(this._s1 = this._si = 0)];
-							} else if (v < this._l1 && i > 0) {
-								while (i > 0 && (this._l1 = lengths[--i]) >= v) { }
-								if (i === 0 && v < this._l1) {
-									this._l1 = 0;
-								} else {
-									i++;
-								}
-								this._l2 = lengths[i];
-								this._li = i;
-								this._curSeg = curSeg = this._segments[i];
-								this._s1 = curSeg[(this._si = curSeg.length - 1) - 1] || 0;
-								this._s2 = curSeg[this._si];
-							}
-							curIndex = i;
-							//now find the appropriate sub-segment (we split it into the number of pieces that was defined by "precision" and measured each one)
-							v -= this._l1;
-							i = this._si;
-							if (v > this._s2 && i < curSeg.length - 1) {
-								l = curSeg.length - 1;
-								while (i < l && (this._s2 = curSeg[++i]) <= v) {	}
-								this._s1 = curSeg[i-1];
-								this._si = i;
-							} else if (v < this._s1 && i > 0) {
-								while (i > 0 && (this._s1 = curSeg[--i]) >= v) {	}
-								if (i === 0 && v < this._s1) {
-									this._s1 = 0;
-								} else {
-									i++;
-								}
-								this._s2 = curSeg[i];
-								this._si = i;
-							}
-							t = (i + (v - this._s1) / (this._s2 - this._s1)) * this._prec;
-						}
-						inv = 1 - t;
-
-						i = this._props.length;
-						while (--i > -1) {
-							p = this._props[i];
-							b = this._beziers[p][curIndex];
-							val = (t * t * b.da + 3 * inv * (t * b.ca + inv * b.ba)) * t + b.a;
-							if (this._round[p]) {
-								val = Math.round(val);
-							}
-							if (func[p]) {
-								target[p](val);
-							} else {
-								target[p] = val;
-							}
-						}
-
-						if (this._autoRotate) {
-							var ar = this._autoRotate,
-								b2, x1, y1, x2, y2, add, conv;
-							i = ar.length;
-							while (--i > -1) {
-								p = ar[i][2];
-								add = ar[i][3] || 0;
-								conv = (ar[i][4] === true) ? 1 : _RAD2DEG;
-								b = this._beziers[ar[i][0]];
-								b2 = this._beziers[ar[i][1]];
-
-								if (b && b2) { //in case one of the properties got overwritten.
-									b = b[curIndex];
-									b2 = b2[curIndex];
-
-									x1 = b.a + (b.b - b.a) * t;
-									x2 = b.b + (b.c - b.b) * t;
-									x1 += (x2 - x1) * t;
-									x2 += ((b.c + (b.d - b.c) * t) - x2) * t;
-
-									y1 = b2.a + (b2.b - b2.a) * t;
-									y2 = b2.b + (b2.c - b2.b) * t;
-									y1 += (y2 - y1) * t;
-									y2 += ((b2.c + (b2.d - b2.c) * t) - y2) * t;
-
-									val = notStart ? Math.atan2(y2 - y1, x2 - x1) * conv + add : this._initialRotations[i];
-
-									if (func[p]) {
-										target[p](val);
-									} else {
-										target[p] = val;
-									}
-								}
-							}
-						}
-					}
-			}),
-			p = BezierPlugin.prototype;
-
-
-		BezierPlugin.bezierThrough = bezierThrough;
-		BezierPlugin.cubicToQuadratic = cubicToQuadratic;
-		BezierPlugin._autoCSS = true; //indicates that this plugin can be inserted into the "css" object using the autoCSS feature of TweenLite
-		BezierPlugin.quadraticToCubic = function(a, b, c) {
-			return new Segment(a, (2 * b + a) / 3, (2 * b + c) / 3, c);
-		};
-
-		BezierPlugin._cssRegister = function() {
-			var CSSPlugin = window._gsDefine.globals.CSSPlugin;
-			if (!CSSPlugin) {
-				return;
-			}
-			var _internals = CSSPlugin._internals,
-				_parseToProxy = _internals._parseToProxy,
-				_setPluginRatio = _internals._setPluginRatio,
-				CSSPropTween = _internals.CSSPropTween;
-			_internals._registerComplexSpecialProp("bezier", {parser:function(t, e, prop, cssp, pt, plugin) {
-				if (e instanceof Array) {
-					e = {values:e};
-				}
-				plugin = new BezierPlugin();
-				var values = e.values,
-					l = values.length - 1,
-					pluginValues = [],
-					v = {},
-					i, p, data;
-				if (l < 0) {
-					return pt;
-				}
-				for (i = 0; i <= l; i++) {
-					data = _parseToProxy(t, values[i], cssp, pt, plugin, (l !== i));
-					pluginValues[i] = data.end;
-				}
-				for (p in e) {
-					v[p] = e[p]; //duplicate the vars object because we need to alter some things which would cause problems if the user plans to reuse the same vars object for another tween.
-				}
-				v.values = pluginValues;
-				pt = new CSSPropTween(t, "bezier", 0, 0, data.pt, 2);
-				pt.data = data;
-				pt.plugin = plugin;
-				pt.setRatio = _setPluginRatio;
-				if (v.autoRotate === 0) {
-					v.autoRotate = true;
-				}
-				if (v.autoRotate && !(v.autoRotate instanceof Array)) {
-					i = (v.autoRotate === true) ? 0 : Number(v.autoRotate);
-					v.autoRotate = (data.end.left != null) ? [["left","top","rotation",i,false]] : (data.end.x != null) ? [["x","y","rotation",i,false]] : false;
-				}
-				if (v.autoRotate) {
-					if (!cssp._transform) {
-						cssp._enableTransforms(false);
-					}
-					data.autoRotate = cssp._target._gsTransform;
-				}
-				plugin._onInitTween(data.proxy, v, cssp._tween);
-				return pt;
-			}});
-		};
-
-		p._roundProps = function(lookup, value) {
-			var op = this._overwriteProps,
-				i = op.length;
-			while (--i > -1) {
-				if (lookup[op[i]] || lookup.bezier || lookup.bezierThrough) {
-					this._round[op[i]] = value;
-				}
-			}
-		};
-
-		p._kill = function(lookup) {
-			var a = this._props,
-				p, i;
-			for (p in this._beziers) {
-				if (p in lookup) {
-					delete this._beziers[p];
-					delete this._func[p];
-					i = a.length;
-					while (--i > -1) {
-						if (a[i] === p) {
-							a.splice(i, 1);
-						}
-					}
-				}
-			}
-			return this._super._kill.call(this, lookup);
-		};
-
-	}());
-
-
-
-
-
-
-	
-	
-	
-	
-	
-	
-	
-	
-/*
- * ----------------------------------------------------------------
- * CSSPlugin
- * ----------------------------------------------------------------
- */
-	window._gsDefine("plugins.CSSPlugin", ["plugins.TweenPlugin","TweenLite"], function(TweenPlugin, TweenLite) {
-
-		/** @constructor **/
-		var CSSPlugin = function() {
-				TweenPlugin.call(this, "css");
-				this._overwriteProps.length = 0;
-				this.setRatio = CSSPlugin.prototype.setRatio; //speed optimization (avoid prototype lookup on this "hot" method)
-			},
-			_hasPriority, //turns true whenever a CSSPropTween instance is created that has a priority other than 0. This helps us discern whether or not we should spend the time organizing the linked list or not after a CSSPlugin's _onInitTween() method is called.
-			_suffixMap, //we set this in _onInitTween() each time as a way to have a persistent variable we can use in other methods like _parse() without having to pass it around as a parameter and we keep _parse() decoupled from a particular CSSPlugin instance
-			_cs, //computed style (we store this in a shared variable to conserve memory and make minification tighter
-			_overwriteProps, //alias to the currently instantiating CSSPlugin's _overwriteProps array. We use this closure in order to avoid having to pass a reference around from method to method and aid in minification.
-			_specialProps = {},
-			p = CSSPlugin.prototype = new TweenPlugin("css");
-
-		p.constructor = CSSPlugin;
-		CSSPlugin.version = "1.12.1";
-		CSSPlugin.API = 2;
-		CSSPlugin.defaultTransformPerspective = 0;
-		CSSPlugin.defaultSkewType = "compensated";
-		p = "px"; //we'll reuse the "p" variable to keep file size down
-		CSSPlugin.suffixMap = {top:p, right:p, bottom:p, left:p, width:p, height:p, fontSize:p, padding:p, margin:p, perspective:p, lineHeight:""};
-
-
-		var _numExp = /(?:\d|\-\d|\.\d|\-\.\d)+/g,
-			_relNumExp = /(?:\d|\-\d|\.\d|\-\.\d|\+=\d|\-=\d|\+=.\d|\-=\.\d)+/g,
-			_valuesExp = /(?:\+=|\-=|\-|\b)[\d\-\.]+[a-zA-Z0-9]*(?:%|\b)/gi, //finds all the values that begin with numbers or += or -= and then a number. Includes suffixes. We use this to split complex values apart like "1px 5px 20px rgb(255,102,51)"
-			_NaNExp = /[^\d\-\.]/g,
-			_suffixExp = /(?:\d|\-|\+|=|#|\.)*/g,
-			_opacityExp = /opacity *= *([^)]*)/i,
-			_opacityValExp = /opacity:([^;]*)/i,
-			_alphaFilterExp = /alpha\(opacity *=.+?\)/i,
-			_rgbhslExp = /^(rgb|hsl)/,
-			_capsExp = /([A-Z])/g,
-			_camelExp = /-([a-z])/gi,
-			_urlExp = /(^(?:url\(\"|url\())|(?:(\"\))$|\)$)/gi, //for pulling out urls from url(...) or url("...") strings (some browsers wrap urls in quotes, some don't when reporting things like backgroundImage)
-			_camelFunc = function(s, g) { return g.toUpperCase(); },
-			_horizExp = /(?:Left|Right|Width)/i,
-			_ieGetMatrixExp = /(M11|M12|M21|M22)=[\d\-\.e]+/gi,
-			_ieSetMatrixExp = /progid\:DXImageTransform\.Microsoft\.Matrix\(.+?\)/i,
-			_commasOutsideParenExp = /,(?=[^\)]*(?:\(|$))/gi, //finds any commas that are not within parenthesis
-			_DEG2RAD = Math.PI / 180,
-			_RAD2DEG = 180 / Math.PI,
-			_forcePT = {},
-			_doc = document,
-			_tempDiv = _doc.createElement("div"),
-			_tempImg = _doc.createElement("img"),
-			_internals = CSSPlugin._internals = {_specialProps:_specialProps}, //provides a hook to a few internal methods that we need to access from inside other plugins
-			_agent = navigator.userAgent,
-			_autoRound,
-			_reqSafariFix, //we won't apply the Safari transform fix until we actually come across a tween that affects a transform property (to maintain best performance).
-
-			_isSafari,
-			_isFirefox, //Firefox has a bug that causes 3D transformed elements to randomly disappear unless a repaint is forced after each update on each element.
-			_isSafariLT6, //Safari (and Android 4 which uses a flavor of Safari) has a bug that prevents changes to "top" and "left" properties from rendering properly if changed on the same frame as a transform UNLESS we set the element's WebkitBackfaceVisibility to hidden (weird, I know). Doing this for Android 3 and earlier seems to actually cause other problems, though (fun!)
-			_ieVers,
-			_supportsOpacity = (function() { //we set _isSafari, _ieVers, _isFirefox, and _supportsOpacity all in one function here to reduce file size slightly, especially in the minified version.
-				var i = _agent.indexOf("Android"),
-					d = _doc.createElement("div"), a;
-
-				_isSafari = (_agent.indexOf("Safari") !== -1 && _agent.indexOf("Chrome") === -1 && (i === -1 || Number(_agent.substr(i+8, 1)) > 3));
-				_isSafariLT6 = (_isSafari && (Number(_agent.substr(_agent.indexOf("Version/")+8, 1)) < 6));
-				_isFirefox = (_agent.indexOf("Firefox") !== -1);
-
-				if ((/MSIE ([0-9]{1,}[\.0-9]{0,})/).exec(_agent)) {
-					_ieVers = parseFloat( RegExp.$1 );
-				}
-
-				d.innerHTML = "<a style='top:1px;opacity:.55;'>a</a>";
-				a = d.getElementsByTagName("a")[0];
-				return a ? /^0.55/.test(a.style.opacity) : false;
-			}()),
-			_getIEOpacity = function(v) {
-				return (_opacityExp.test( ((typeof(v) === "string") ? v : (v.currentStyle ? v.currentStyle.filter : v.style.filter) || "") ) ? ( parseFloat( RegExp.$1 ) / 100 ) : 1);
-			},
-			_log = function(s) {//for logging messages, but in a way that won't throw errors in old versions of IE.
-				if (window.console) {
-					//console.log(s);
-				}
-			},
-			_prefixCSS = "", //the non-camelCase vendor prefix like "-o-", "-moz-", "-ms-", or "-webkit-"
-			_prefix = "", //camelCase vendor prefix like "O", "ms", "Webkit", or "Moz".
-
-			// @private feed in a camelCase property name like "transform" and it will check to see if it is valid as-is or if it needs a vendor prefix. It returns the corrected camelCase property name (i.e. "WebkitTransform" or "MozTransform" or "transform" or null if no such property is found, like if the browser is IE8 or before, "transform" won't be found at all)
-			_checkPropPrefix = function(p, e) {
-				e = e || _tempDiv;
-				var s = e.style,
-					a, i;
-				if (s[p] !== undefined) {
-					return p;
-				}
-				p = p.charAt(0).toUpperCase() + p.substr(1);
-				a = ["O","Moz","ms","Ms","Webkit"];
-				i = 5;
-				while (--i > -1 && s[a[i]+p] === undefined) { }
-				if (i >= 0) {
-					_prefix = (i === 3) ? "ms" : a[i];
-					_prefixCSS = "-" + _prefix.toLowerCase() + "-";
-					return _prefix + p;
-				}
-				return null;
-			},
-
-			_getComputedStyle = _doc.defaultView ? _doc.defaultView.getComputedStyle : function() {},
-
-			/**
-			 * @private Returns the css style for a particular property of an element. For example, to get whatever the current "left" css value for an element with an ID of "myElement", you could do:
-			 * var currentLeft = CSSPlugin.getStyle( document.getElementById("myElement"), "left");
-			 *
-			 * @param {!Object} t Target element whose style property you want to query
-			 * @param {!string} p Property name (like "left" or "top" or "marginTop", etc.)
-			 * @param {Object=} cs Computed style object. This just provides a way to speed processing if you're going to get several properties on the same element in quick succession - you can reuse the result of the getComputedStyle() call.
-			 * @param {boolean=} calc If true, the value will not be read directly from the element's "style" property (if it exists there), but instead the getComputedStyle() result will be used. This can be useful when you want to ensure that the browser itself is interpreting the value.
-			 * @param {string=} dflt Default value that should be returned in the place of null, "none", "auto" or "auto auto".
-			 * @return {?string} The current property value
-			 */
-			_getStyle = CSSPlugin.getStyle = function(t, p, cs, calc, dflt) {
-				var rv;
-				if (!_supportsOpacity) if (p === "opacity") { //several versions of IE don't use the standard "opacity" property - they use things like filter:alpha(opacity=50), so we parse that here.
-					return _getIEOpacity(t);
-				}
-				if (!calc && t.style[p]) {
-					rv = t.style[p];
-				} else if ((cs = cs || _getComputedStyle(t))) {
-					rv = cs[p] || cs.getPropertyValue(p) || cs.getPropertyValue(p.replace(_capsExp, "-$1").toLowerCase());
-				} else if (t.currentStyle) {
-					rv = t.currentStyle[p];
-				}
-				return (dflt != null && (!rv || rv === "none" || rv === "auto" || rv === "auto auto")) ? dflt : rv;
-			},
-
-			/**
-			 * @private Pass the target element, the property name, the numeric value, and the suffix (like "%", "em", "px", etc.) and it will spit back the equivalent pixel number.
-			 * @param {!Object} t Target element
-			 * @param {!string} p Property name (like "left", "top", "marginLeft", etc.)
-			 * @param {!number} v Value
-			 * @param {string=} sfx Suffix (like "px" or "%" or "em")
-			 * @param {boolean=} recurse If true, the call is a recursive one. In some browsers (like IE7/8), occasionally the value isn't accurately reported initially, but if we run the function again it will take effect.
-			 * @return {number} value in pixels
-			 */
-			_convertToPixels = _internals.convertToPixels = function(t, p, v, sfx, recurse) {
-				if (sfx === "px" || !sfx) { return v; }
-				if (sfx === "auto" || !v) { return 0; }
-				var horiz = _horizExp.test(p),
-					node = t,
-					style = _tempDiv.style,
-					neg = (v < 0),
-					pix, cache, time;
-				if (neg) {
-					v = -v;
-				}
-				if (sfx === "%" && p.indexOf("border") !== -1) {
-					pix = (v / 100) * (horiz ? t.clientWidth : t.clientHeight);
-				} else {
-					style.cssText = "border:0 solid red;position:" + _getStyle(t, "position") + ";line-height:0;";
-					if (sfx === "%" || !node.appendChild) {
-						node = t.parentNode || _doc.body;
-						cache = node._gsCache;
-						time = TweenLite.ticker.frame;
-						if (cache && horiz && cache.time === time) { //performance optimization: we record the width of elements along with the ticker frame so that we can quickly get it again on the same tick (seems relatively safe to assume it wouldn't change on the same tick)
-							return cache.width * v / 100;
-						}
-						style[(horiz ? "width" : "height")] = v + sfx;
-					} else {
-						style[(horiz ? "borderLeftWidth" : "borderTopWidth")] = v + sfx;
-					}
-					node.appendChild(_tempDiv);
-					pix = parseFloat(_tempDiv[(horiz ? "offsetWidth" : "offsetHeight")]);
-					node.removeChild(_tempDiv);
-					if (horiz && sfx === "%" && CSSPlugin.cacheWidths !== false) {
-						cache = node._gsCache = node._gsCache || {};
-						cache.time = time;
-						cache.width = pix / v * 100;
-					}
-					if (pix === 0 && !recurse) {
-						pix = _convertToPixels(t, p, v, sfx, true);
-					}
-				}
-				return neg ? -pix : pix;
-			},
-			_calculateOffset = _internals.calculateOffset = function(t, p, cs) { //for figuring out "top" or "left" in px when it's "auto". We need to factor in margin with the offsetLeft/offsetTop
-				if (_getStyle(t, "position", cs) !== "absolute") { return 0; }
-				var dim = ((p === "left") ? "Left" : "Top"),
-					v = _getStyle(t, "margin" + dim, cs);
-				return t["offset" + dim] - (_convertToPixels(t, p, parseFloat(v), v.replace(_suffixExp, "")) || 0);
-			},
-
-			// @private returns at object containing ALL of the style properties in camelCase and their associated values.
-			_getAllStyles = function(t, cs) {
-				var s = {},
-					i, tr;
-				if ((cs = cs || _getComputedStyle(t, null))) {
-					if ((i = cs.length)) {
-						while (--i > -1) {
-							s[cs[i].replace(_camelExp, _camelFunc)] = cs.getPropertyValue(cs[i]);
-						}
-					} else { //Opera behaves differently - cs.length is always 0, so we must do a for...in loop.
-						for (i in cs) {
-							s[i] = cs[i];
-						}
-					}
-				} else if ((cs = t.currentStyle || t.style)) {
-					for (i in cs) {
-						if (typeof(i) === "string" && s[i] === undefined) {
-							s[i.replace(_camelExp, _camelFunc)] = cs[i];
-						}
-					}
-				}
-				if (!_supportsOpacity) {
-					s.opacity = _getIEOpacity(t);
-				}
-				tr = _getTransform(t, cs, false);
-				s.rotation = tr.rotation;
-				s.skewX = tr.skewX;
-				s.scaleX = tr.scaleX;
-				s.scaleY = tr.scaleY;
-				s.x = tr.x;
-				s.y = tr.y;
-				if (_supports3D) {
-					s.z = tr.z;
-					s.rotationX = tr.rotationX;
-					s.rotationY = tr.rotationY;
-					s.scaleZ = tr.scaleZ;
-				}
-				if (s.filters) {
-					delete s.filters;
-				}
-				return s;
-			},
-
-			// @private analyzes two style objects (as returned by _getAllStyles()) and only looks for differences between them that contain tweenable values (like a number or color). It returns an object with a "difs" property which refers to an object containing only those isolated properties and values for tweening, and a "firstMPT" property which refers to the first MiniPropTween instance in a linked list that recorded all the starting values of the different properties so that we can revert to them at the end or beginning of the tween - we don't want the cascading to get messed up. The forceLookup parameter is an optional generic object with properties that should be forced into the results - this is necessary for className tweens that are overwriting others because imagine a scenario where a rollover/rollout adds/removes a class and the user swipes the mouse over the target SUPER fast, thus nothing actually changed yet and the subsequent comparison of the properties would indicate they match (especially when px rounding is taken into consideration), thus no tweening is necessary even though it SHOULD tween and remove those properties after the tween (otherwise the inline styles will contaminate things). See the className SpecialProp code for details.
-			_cssDif = function(t, s1, s2, vars, forceLookup) {
-				var difs = {},
-					style = t.style,
-					val, p, mpt;
-				for (p in s2) {
-					if (p !== "cssText") if (p !== "length") if (isNaN(p)) if (s1[p] !== (val = s2[p]) || (forceLookup && forceLookup[p])) if (p.indexOf("Origin") === -1) if (typeof(val) === "number" || typeof(val) === "string") {
-						difs[p] = (val === "auto" && (p === "left" || p === "top")) ? _calculateOffset(t, p) : ((val === "" || val === "auto" || val === "none") && typeof(s1[p]) === "string" && s1[p].replace(_NaNExp, "") !== "") ? 0 : val; //if the ending value is defaulting ("" or "auto"), we check the starting value and if it can be parsed into a number (a string which could have a suffix too, like 700px), then we swap in 0 for "" or "auto" so that things actually tween.
-						if (style[p] !== undefined) { //for className tweens, we must remember which properties already existed inline - the ones that didn't should be removed when the tween isn't in progress because they were only introduced to facilitate the transition between classes.
-							mpt = new MiniPropTween(style, p, style[p], mpt);
-						}
-					}
-				}
-				if (vars) {
-					for (p in vars) { //copy properties (except className)
-						if (p !== "className") {
-							difs[p] = vars[p];
-						}
-					}
-				}
-				return {difs:difs, firstMPT:mpt};
-			},
-			_dimensions = {width:["Left","Right"], height:["Top","Bottom"]},
-			_margins = ["marginLeft","marginRight","marginTop","marginBottom"],
-
-			/**
-			 * @private Gets the width or height of an element
-			 * @param {!Object} t Target element
-			 * @param {!string} p Property name ("width" or "height")
-			 * @param {Object=} cs Computed style object (if one exists). Just a speed optimization.
-			 * @return {number} Dimension (in pixels)
-			 */
-			_getDimension = function(t, p, cs) {
-				var v = parseFloat((p === "width") ? t.offsetWidth : t.offsetHeight),
-					a = _dimensions[p],
-					i = a.length;
-				cs = cs || _getComputedStyle(t, null);
-				while (--i > -1) {
-					v -= parseFloat( _getStyle(t, "padding" + a[i], cs, true) ) || 0;
-					v -= parseFloat( _getStyle(t, "border" + a[i] + "Width", cs, true) ) || 0;
-				}
-				return v;
-			},
-
-			// @private Parses position-related complex strings like "top left" or "50px 10px" or "70% 20%", etc. which are used for things like transformOrigin or backgroundPosition. Optionally decorates a supplied object (recObj) with the following properties: "ox" (offsetX), "oy" (offsetY), "oxp" (if true, "ox" is a percentage not a pixel value), and "oxy" (if true, "oy" is a percentage not a pixel value)
-			_parsePosition = function(v, recObj) {
-				if (v == null || v === "" || v === "auto" || v === "auto auto") { //note: Firefox uses "auto auto" as default whereas Chrome uses "auto".
-					v = "0 0";
-				}
-				var a = v.split(" "),
-					x = (v.indexOf("left") !== -1) ? "0%" : (v.indexOf("right") !== -1) ? "100%" : a[0],
-					y = (v.indexOf("top") !== -1) ? "0%" : (v.indexOf("bottom") !== -1) ? "100%" : a[1];
-				if (y == null) {
-					y = "0";
-				} else if (y === "center") {
-					y = "50%";
-				}
-				if (x === "center" || (isNaN(parseFloat(x)) && (x + "").indexOf("=") === -1)) { //remember, the user could flip-flop the values and say "bottom center" or "center bottom", etc. "center" is ambiguous because it could be used to describe horizontal or vertical, hence the isNaN(). If there's an "=" sign in the value, it's relative.
-					x = "50%";
-				}
-				if (recObj) {
-					recObj.oxp = (x.indexOf("%") !== -1);
-					recObj.oyp = (y.indexOf("%") !== -1);
-					recObj.oxr = (x.charAt(1) === "=");
-					recObj.oyr = (y.charAt(1) === "=");
-					recObj.ox = parseFloat(x.replace(_NaNExp, ""));
-					recObj.oy = parseFloat(y.replace(_NaNExp, ""));
-				}
-				return x + " " + y + ((a.length > 2) ? " " + a[2] : "");
-			},
-
-			/**
-			 * @private Takes an ending value (typically a string, but can be a number) and a starting value and returns the change between the two, looking for relative value indicators like += and -= and it also ignores suffixes (but make sure the ending value starts with a number or +=/-= and that the starting value is a NUMBER!)
-			 * @param {(number|string)} e End value which is typically a string, but could be a number
-			 * @param {(number|string)} b Beginning value which is typically a string but could be a number
-			 * @return {number} Amount of change between the beginning and ending values (relative values that have a "+=" or "-=" are recognized)
-			 */
-			_parseChange = function(e, b) {
-				return (typeof(e) === "string" && e.charAt(1) === "=") ? parseInt(e.charAt(0) + "1", 10) * parseFloat(e.substr(2)) : parseFloat(e) - parseFloat(b);
-			},
-
-			/**
-			 * @private Takes a value and a default number, checks if the value is relative, null, or numeric and spits back a normalized number accordingly. Primarily used in the _parseTransform() function.
-			 * @param {Object} v Value to be parsed
-			 * @param {!number} d Default value (which is also used for relative calculations if "+=" or "-=" is found in the first parameter)
-			 * @return {number} Parsed value
-			 */
-			_parseVal = function(v, d) {
-				return (v == null) ? d : (typeof(v) === "string" && v.charAt(1) === "=") ? parseInt(v.charAt(0) + "1", 10) * Number(v.substr(2)) + d : parseFloat(v);
-			},
-
-			/**
-			 * @private Translates strings like "40deg" or "40" or 40rad" or "+=40deg" or "270_short" or "-90_cw" or "+=45_ccw" to a numeric radian angle. Of course a starting/default value must be fed in too so that relative values can be calculated properly.
-			 * @param {Object} v Value to be parsed
-			 * @param {!number} d Default value (which is also used for relative calculations if "+=" or "-=" is found in the first parameter)
-			 * @param {string=} p property name for directionalEnd (optional - only used when the parsed value is directional ("_short", "_cw", or "_ccw" suffix). We need a way to store the uncompensated value so that at the end of the tween, we set it to exactly what was requested with no directional compensation). Property name would be "rotation", "rotationX", or "rotationY"
-			 * @param {Object=} directionalEnd An object that will store the raw end values for directional angles ("_short", "_cw", or "_ccw" suffix). We need a way to store the uncompensated value so that at the end of the tween, we set it to exactly what was requested with no directional compensation.
-			 * @return {number} parsed angle in radians
-			 */
-			_parseAngle = function(v, d, p, directionalEnd) {
-				var min = 0.000001,
-					cap, split, dif, result;
-				if (v == null) {
-					result = d;
-				} else if (typeof(v) === "number") {
-					result = v;
-				} else {
-					cap = 360;
-					split = v.split("_");
-					dif = Number(split[0].replace(_NaNExp, "")) * ((v.indexOf("rad") === -1) ? 1 : _RAD2DEG) - ((v.charAt(1) === "=") ? 0 : d);
-					if (split.length) {
-						if (directionalEnd) {
-							directionalEnd[p] = d + dif;
-						}
-						if (v.indexOf("short") !== -1) {
-							dif = dif % cap;
-							if (dif !== dif % (cap / 2)) {
-								dif = (dif < 0) ? dif + cap : dif - cap;
-							}
-						}
-						if (v.indexOf("_cw") !== -1 && dif < 0) {
-							dif = ((dif + cap * 9999999999) % cap) - ((dif / cap) | 0) * cap;
-						} else if (v.indexOf("ccw") !== -1 && dif > 0) {
-							dif = ((dif - cap * 9999999999) % cap) - ((dif / cap) | 0) * cap;
-						}
-					}
-					result = d + dif;
-				}
-				if (result < min && result > -min) {
-					result = 0;
-				}
-				return result;
-			},
-
-			_colorLookup = {aqua:[0,255,255],
-				lime:[0,255,0],
-				silver:[192,192,192],
-				black:[0,0,0],
-				maroon:[128,0,0],
-				teal:[0,128,128],
-				blue:[0,0,255],
-				navy:[0,0,128],
-				white:[255,255,255],
-				fuchsia:[255,0,255],
-				olive:[128,128,0],
-				yellow:[255,255,0],
-				orange:[255,165,0],
-				gray:[128,128,128],
-				purple:[128,0,128],
-				green:[0,128,0],
-				red:[255,0,0],
-				pink:[255,192,203],
-				cyan:[0,255,255],
-				transparent:[255,255,255,0]},
-
-			_hue = function(h, m1, m2) {
-				h = (h < 0) ? h + 1 : (h > 1) ? h - 1 : h;
-				return ((((h * 6 < 1) ? m1 + (m2 - m1) * h * 6 : (h < 0.5) ? m2 : (h * 3 < 2) ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * 255) + 0.5) | 0;
-			},
-
-			/**
-			 * @private Parses a color (like #9F0, #FF9900, or rgb(255,51,153)) into an array with 3 elements for red, green, and blue. Also handles rgba() values (splits into array of 4 elements of course)
-			 * @param {(string|number)} v The value the should be parsed which could be a string like #9F0 or rgb(255,102,51) or rgba(255,0,0,0.5) or it could be a number like 0xFF00CC or even a named color like red, blue, purple, etc.
-			 * @return {Array.<number>} An array containing red, green, and blue (and optionally alpha) in that order.
-			 */
-			_parseColor = function(v) {
-				var c1, c2, c3, h, s, l;
-				if (!v || v === "") {
-					return _colorLookup.black;
-				}
-				if (typeof(v) === "number") {
-					return [v >> 16, (v >> 8) & 255, v & 255];
-				}
-				if (v.charAt(v.length - 1) === ",") { //sometimes a trailing commma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.
-					v = v.substr(0, v.length - 1);
-				}
-				if (_colorLookup[v]) {
-					return _colorLookup[v];
-				}
-				if (v.charAt(0) === "#") {
-					if (v.length === 4) { //for shorthand like #9F0
-						c1 = v.charAt(1),
-						c2 = v.charAt(2),
-						c3 = v.charAt(3);
-						v = "#" + c1 + c1 + c2 + c2 + c3 + c3;
-					}
-					v = parseInt(v.substr(1), 16);
-					return [v >> 16, (v >> 8) & 255, v & 255];
-				}
-				if (v.substr(0, 3) === "hsl") {
-					v = v.match(_numExp);
-					h = (Number(v[0]) % 360) / 360;
-					s = Number(v[1]) / 100;
-					l = Number(v[2]) / 100;
-					c2 = (l <= 0.5) ? l * (s + 1) : l + s - l * s;
-					c1 = l * 2 - c2;
-					if (v.length > 3) {
-						v[3] = Number(v[3]);
-					}
-					v[0] = _hue(h + 1 / 3, c1, c2);
-					v[1] = _hue(h, c1, c2);
-					v[2] = _hue(h - 1 / 3, c1, c2);
-					return v;
-				}
-				v = v.match(_numExp) || _colorLookup.transparent;
-				v[0] = Number(v[0]);
-				v[1] = Number(v[1]);
-				v[2] = Number(v[2]);
-				if (v.length > 3) {
-					v[3] = Number(v[3]);
-				}
-				return v;
-			},
-			_colorExp = "(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#.+?\\b"; //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.
-
-		for (p in _colorLookup) {
-			_colorExp += "|" + p + "\\b";
-		}
-		_colorExp = new RegExp(_colorExp+")", "gi");
-
-		/**
-		 * @private Returns a formatter function that handles taking a string (or number in some cases) and returning a consistently formatted one in terms of delimiters, quantity of values, etc. For example, we may get boxShadow values defined as "0px red" or "0px 0px 10px rgb(255,0,0)" or "0px 0px 20px 20px #F00" and we need to ensure that what we get back is described with 4 numbers and a color. This allows us to feed it into the _parseComplex() method and split the values up appropriately. The neat thing about this _getFormatter() function is that the dflt defines a pattern as well as a default, so for example, _getFormatter("0px 0px 0px 0px #777", true) not only sets the default as 0px for all distances and #777 for the color, but also sets the pattern such that 4 numbers and a color will always get returned.
-		 * @param {!string} dflt The default value and pattern to follow. So "0px 0px 0px 0px #777" will ensure that 4 numbers and a color will always get returned.
-		 * @param {boolean=} clr If true, the values should be searched for color-related data. For example, boxShadow values typically contain a color whereas borderRadius don't.
-		 * @param {boolean=} collapsible If true, the value is a top/left/right/bottom style one that acts like margin or padding, where if only one value is received, it's used for all 4; if 2 are received, the first is duplicated for 3rd (bottom) and the 2nd is duplicated for the 4th spot (left), etc.
-		 * @return {Function} formatter function
-		 */
-		var _getFormatter = function(dflt, clr, collapsible, multi) {
-				if (dflt == null) {
-					return function(v) {return v;};
-				}
-				var dColor = clr ? (dflt.match(_colorExp) || [""])[0] : "",
-					dVals = dflt.split(dColor).join("").match(_valuesExp) || [],
-					pfx = dflt.substr(0, dflt.indexOf(dVals[0])),
-					sfx = (dflt.charAt(dflt.length - 1) === ")") ? ")" : "",
-					delim = (dflt.indexOf(" ") !== -1) ? " " : ",",
-					numVals = dVals.length,
-					dSfx = (numVals > 0) ? dVals[0].replace(_numExp, "") : "",
-					formatter;
-				if (!numVals) {
-					return function(v) {return v;};
-				}
-				if (clr) {
-					formatter = function(v) {
-						var color, vals, i, a;
-						if (typeof(v) === "number") {
-							v += dSfx;
-						} else if (multi && _commasOutsideParenExp.test(v)) {
-							a = v.replace(_commasOutsideParenExp, "|").split("|");
-							for (i = 0; i < a.length; i++) {
-								a[i] = formatter(a[i]);
-							}
-							return a.join(",");
-						}
-						color = (v.match(_colorExp) || [dColor])[0];
-						vals = v.split(color).join("").match(_valuesExp) || [];
-						i = vals.length;
-						if (numVals > i--) {
-							while (++i < numVals) {
-								vals[i] = collapsible ? vals[(((i - 1) / 2) | 0)] : dVals[i];
-							}
-						}
-						return pfx + vals.join(delim) + delim + color + sfx + (v.indexOf("inset") !== -1 ? " inset" : "");
-					};
-					return formatter;
-
-				}
-				formatter = function(v) {
-					var vals, a, i;
-					if (typeof(v) === "number") {
-						v += dSfx;
-					} else if (multi && _commasOutsideParenExp.test(v)) {
-						a = v.replace(_commasOutsideParenExp, "|").split("|");
-						for (i = 0; i < a.length; i++) {
-							a[i] = formatter(a[i]);
-						}
-						return a.join(",");
-					}
-					vals = v.match(_valuesExp) || [];
-					i = vals.length;
-					if (numVals > i--) {
-						while (++i < numVals) {
-							vals[i] = collapsible ? vals[(((i - 1) / 2) | 0)] : dVals[i];
-						}
-					}
-					return pfx + vals.join(delim) + sfx;
-				};
-				return formatter;
-			},
-
-			/**
-			 * @private returns a formatter function that's used for edge-related values like marginTop, marginLeft, paddingBottom, paddingRight, etc. Just pass a comma-delimited list of property names related to the edges.
-			 * @param {!string} props a comma-delimited list of property names in order from top to left, like "marginTop,marginRight,marginBottom,marginLeft"
-			 * @return {Function} a formatter function
-			 */
-			_getEdgeParser = function(props) {
-				props = props.split(",");
-				return function(t, e, p, cssp, pt, plugin, vars) {
-					var a = (e + "").split(" "),
-						i;
-					vars = {};
-					for (i = 0; i < 4; i++) {
-						vars[props[i]] = a[i] = a[i] || a[(((i - 1) / 2) >> 0)];
-					}
-					return cssp.parse(t, vars, pt, plugin);
-				};
-			},
-
-			// @private used when other plugins must tween values first, like BezierPlugin or ThrowPropsPlugin, etc. That plugin's setRatio() gets called first so that the values are updated, and then we loop through the MiniPropTweens  which handle copying the values into their appropriate slots so that they can then be applied correctly in the main CSSPlugin setRatio() method. Remember, we typically create a proxy object that has a bunch of uniquely-named properties that we feed to the sub-plugin and it does its magic normally, and then we must interpret those values and apply them to the css because often numbers must get combined/concatenated, suffixes added, etc. to work with css, like boxShadow could have 4 values plus a color.
-			_setPluginRatio = _internals._setPluginRatio = function(v) {
-				this.plugin.setRatio(v);
-				var d = this.data,
-					proxy = d.proxy,
-					mpt = d.firstMPT,
-					min = 0.000001,
-					val, pt, i, str;
-				while (mpt) {
-					val = proxy[mpt.v];
-					if (mpt.r) {
-						val = Math.round(val);
-					} else if (val < min && val > -min) {
-						val = 0;
-					}
-					mpt.t[mpt.p] = val;
-					mpt = mpt._next;
-				}
-				if (d.autoRotate) {
-					d.autoRotate.rotation = proxy.rotation;
-				}
-				//at the end, we must set the CSSPropTween's "e" (end) value dynamically here because that's what is used in the final setRatio() method.
-				if (v === 1) {
-					mpt = d.firstMPT;
-					while (mpt) {
-						pt = mpt.t;
-						if (!pt.type) {
-							pt.e = pt.s + pt.xs0;
-						} else if (pt.type === 1) {
-							str = pt.xs0 + pt.s + pt.xs1;
-							for (i = 1; i < pt.l; i++) {
-								str += pt["xn"+i] + pt["xs"+(i+1)];
-							}
-							pt.e = str;
-						}
-						mpt = mpt._next;
-					}
-				}
-			},
-
-			/**
-			 * @private @constructor Used by a few SpecialProps to hold important values for proxies. For example, _parseToProxy() creates a MiniPropTween instance for each property that must get tweened on the proxy, and we record the original property name as well as the unique one we create for the proxy, plus whether or not the value needs to be rounded plus the original value.
-			 * @param {!Object} t target object whose property we're tweening (often a CSSPropTween)
-			 * @param {!string} p property name
-			 * @param {(number|string|object)} v value
-			 * @param {MiniPropTween=} next next MiniPropTween in the linked list
-			 * @param {boolean=} r if true, the tweened value should be rounded to the nearest integer
-			 */
-			MiniPropTween = function(t, p, v, next, r) {
-				this.t = t;
-				this.p = p;
-				this.v = v;
-				this.r = r;
-				if (next) {
-					next._prev = this;
-					this._next = next;
-				}
-			},
-
-			/**
-			 * @private Most other plugins (like BezierPlugin and ThrowPropsPlugin and others) can only tween numeric values, but CSSPlugin must accommodate special values that have a bunch of extra data (like a suffix or strings between numeric values, etc.). For example, boxShadow has values like "10px 10px 20px 30px rgb(255,0,0)" which would utterly confuse other plugins. This method allows us to split that data apart and grab only the numeric data and attach it to uniquely-named properties of a generic proxy object ({}) so that we can feed that to virtually any plugin to have the numbers tweened. However, we must also keep track of which properties from the proxy go with which CSSPropTween values and instances. So we create a linked list of MiniPropTweens. Each one records a target (the original CSSPropTween), property (like "s" or "xn1" or "xn2") that we're tweening and the unique property name that was used for the proxy (like "boxShadow_xn1" and "boxShadow_xn2") and whether or not they need to be rounded. That way, in the _setPluginRatio() method we can simply copy the values over from the proxy to the CSSPropTween instance(s). Then, when the main CSSPlugin setRatio() method runs and applies the CSSPropTween values accordingly, they're updated nicely. So the external plugin tweens the numbers, _setPluginRatio() copies them over, and setRatio() acts normally, applying css-specific values to the element.
-			 * This method returns an object that has the following properties:
-			 *  - proxy: a generic object containing the starting values for all the properties that will be tweened by the external plugin.  This is what we feed to the external _onInitTween() as the target
-			 *  - end: a generic object containing the ending values for all the properties that will be tweened by the external plugin. This is what we feed to the external plugin's _onInitTween() as the destination values
-			 *  - firstMPT: the first MiniPropTween in the linked list
-			 *  - pt: the first CSSPropTween in the linked list that was created when parsing. If shallow is true, this linked list will NOT attach to the one passed into the _parseToProxy() as the "pt" (4th) parameter.
-			 * @param {!Object} t target object to be tweened
-			 * @param {!(Object|string)} vars the object containing the information about the tweening values (typically the end/destination values) that should be parsed
-			 * @param {!CSSPlugin} cssp The CSSPlugin instance
-			 * @param {CSSPropTween=} pt the next CSSPropTween in the linked list
-			 * @param {TweenPlugin=} plugin the external TweenPlugin instance that will be handling tweening the numeric values
-			 * @param {boolean=} shallow if true, the resulting linked list from the parse will NOT be attached to the CSSPropTween that was passed in as the "pt" (4th) parameter.
-			 * @return An object containing the following properties: proxy, end, firstMPT, and pt (see above for descriptions)
-			 */
-			_parseToProxy = _internals._parseToProxy = function(t, vars, cssp, pt, plugin, shallow) {
-				var bpt = pt,
-					start = {},
-					end = {},
-					transform = cssp._transform,
-					oldForce = _forcePT,
-					i, p, xp, mpt, firstPT;
-				cssp._transform = null;
-				_forcePT = vars;
-				pt = firstPT = cssp.parse(t, vars, pt, plugin);
-				_forcePT = oldForce;
-				//break off from the linked list so the new ones are isolated.
-				if (shallow) {
-					cssp._transform = transform;
-					if (bpt) {
-						bpt._prev = null;
-						if (bpt._prev) {
-							bpt._prev._next = null;
-						}
-					}
-				}
-				while (pt && pt !== bpt) {
-					if (pt.type <= 1) {
-						p = pt.p;
-						end[p] = pt.s + pt.c;
-						start[p] = pt.s;
-						if (!shallow) {
-							mpt = new MiniPropTween(pt, "s", p, mpt, pt.r);
-							pt.c = 0;
-						}
-						if (pt.type === 1) {
-							i = pt.l;
-							while (--i > 0) {
-								xp = "xn" + i;
-								p = pt.p + "_" + xp;
-								end[p] = pt.data[xp];
-								start[p] = pt[xp];
-								if (!shallow) {
-									mpt = new MiniPropTween(pt, xp, p, mpt, pt.rxp[xp]);
-								}
-							}
-						}
-					}
-					pt = pt._next;
-				}
-				return {proxy:start, end:end, firstMPT:mpt, pt:firstPT};
-			},
-
-
-
-			/**
-			 * @constructor Each property that is tweened has at least one CSSPropTween associated with it. These instances store important information like the target, property, starting value, amount of change, etc. They can also optionally have a number of "extra" strings and numeric values named xs1, xn1, xs2, xn2, xs3, xn3, etc. where "s" indicates string and "n" indicates number. These can be pieced together in a complex-value tween (type:1) that has alternating types of data like a string, number, string, number, etc. For example, boxShadow could be "5px 5px 8px rgb(102, 102, 51)". In that value, there are 6 numbers that may need to tween and then pieced back together into a string again with spaces, suffixes, etc. xs0 is special in that it stores the suffix for standard (type:0) tweens, -OR- the first string (prefix) in a complex-value (type:1) CSSPropTween -OR- it can be the non-tweening value in a type:-1 CSSPropTween. We do this to conserve memory.
-			 * CSSPropTweens have the following optional properties as well (not defined through the constructor):
-			 *  - l: Length in terms of the number of extra properties that the CSSPropTween has (default: 0). For example, for a boxShadow we may need to tween 5 numbers in which case l would be 5; Keep in mind that the start/end values for the first number that's tweened are always stored in the s and c properties to conserve memory. All additional values thereafter are stored in xn1, xn2, etc.
-			 *  - xfirst: The first instance of any sub-CSSPropTweens that are tweening properties of this instance. For example, we may split up a boxShadow tween so that there's a main CSSPropTween of type:1 that has various xs* and xn* values associated with the h-shadow, v-shadow, blur, color, etc. Then we spawn a CSSPropTween for each of those that has a higher priority and runs BEFORE the main CSSPropTween so that the values are all set by the time it needs to re-assemble them. The xfirst gives us an easy way to identify the first one in that chain which typically ends at the main one (because they're all prepende to the linked list)
-			 *  - plugin: The TweenPlugin instance that will handle the tweening of any complex values. For example, sometimes we don't want to use normal subtweens (like xfirst refers to) to tween the values - we might want ThrowPropsPlugin or BezierPlugin some other plugin to do the actual tweening, so we create a plugin instance and store a reference here. We need this reference so that if we get a request to round values or disable a tween, we can pass along that request.
-			 *  - data: Arbitrary data that needs to be stored with the CSSPropTween. Typically if we're going to have a plugin handle the tweening of a complex-value tween, we create a generic object that stores the END values that we're tweening to and the CSSPropTween's xs1, xs2, etc. have the starting values. We store that object as data. That way, we can simply pass that object to the plugin and use the CSSPropTween as the target.
-			 *  - setRatio: Only used for type:2 tweens that require custom functionality. In this case, we call the CSSPropTween's setRatio() method and pass the ratio each time the tween updates. This isn't quite as efficient as doing things directly in the CSSPlugin's setRatio() method, but it's very convenient and flexible.
-			 * @param {!Object} t Target object whose property will be tweened. Often a DOM element, but not always. It could be anything.
-			 * @param {string} p Property to tween (name). For example, to tween element.width, p would be "width".
-			 * @param {number} s Starting numeric value
-			 * @param {number} c Change in numeric value over the course of the entire tween. For example, if element.width starts at 5 and should end at 100, c would be 95.
-			 * @param {CSSPropTween=} next The next CSSPropTween in the linked list. If one is defined, we will define its _prev as the new instance, and the new instance's _next will be pointed at it.
-			 * @param {number=} type The type of CSSPropTween where -1 = a non-tweening value, 0 = a standard simple tween, 1 = a complex value (like one that has multiple numbers in a comma- or space-delimited string like border:"1px solid red"), and 2 = one that uses a custom setRatio function that does all of the work of applying the values on each update.
-			 * @param {string=} n Name of the property that should be used for overwriting purposes which is typically the same as p but not always. For example, we may need to create a subtween for the 2nd part of a "clip:rect(...)" tween in which case "p" might be xs1 but "n" is still "clip"
-			 * @param {boolean=} r If true, the value(s) should be rounded
-			 * @param {number=} pr Priority in the linked list order. Higher priority CSSPropTweens will be updated before lower priority ones. The default priority is 0.
-			 * @param {string=} b Beginning value. We store this to ensure that it is EXACTLY what it was when the tween began without any risk of interpretation issues.
-			 * @param {string=} e Ending value. We store this to ensure that it is EXACTLY what the user defined at the end of the tween without any risk of interpretation issues.
-			 */
-			CSSPropTween = _internals.CSSPropTween = function(t, p, s, c, next, type, n, r, pr, b, e) {
-				this.t = t; //target
-				this.p = p; //property
-				this.s = s; //starting value
-				this.c = c; //change value
-				this.n = n || p; //name that this CSSPropTween should be associated to (usually the same as p, but not always - n is what overwriting looks at)
-				if (!(t instanceof CSSPropTween)) {
-					_overwriteProps.push(this.n);
-				}
-				this.r = r; //round (boolean)
-				this.type = type || 0; //0 = normal tween, -1 = non-tweening (in which case xs0 will be applied to the target's property, like tp.t[tp.p] = tp.xs0), 1 = complex-value SpecialProp, 2 = custom setRatio() that does all the work
-				if (pr) {
-					this.pr = pr;
-					_hasPriority = true;
-				}
-				this.b = (b === undefined) ? s : b;
-				this.e = (e === undefined) ? s + c : e;
-				if (next) {
-					this._next = next;
-					next._prev = this;
-				}
-			},
-
-			/**
-			 * Takes a target, the beginning value and ending value (as strings) and parses them into a CSSPropTween (possibly with child CSSPropTweens) that accommodates multiple numbers, colors, comma-delimited values, etc. For example:
-			 * sp.parseComplex(element, "boxShadow", "5px 10px 20px rgb(255,102,51)", "0px 0px 0px red", true, "0px 0px 0px rgb(0,0,0,0)", pt);
-			 * It will walk through the beginning and ending values (which should be in the same format with the same number and type of values) and figure out which parts are numbers, what strings separate the numeric/tweenable values, and then create the CSSPropTweens accordingly. If a plugin is defined, no child CSSPropTweens will be created. Instead, the ending values will be stored in the "data" property of the returned CSSPropTween like: {s:-5, xn1:-10, xn2:-20, xn3:255, xn4:0, xn5:0} so that it can be fed to any other plugin and it'll be plain numeric tweens but the recomposition of the complex value will be handled inside CSSPlugin's setRatio().
-			 * If a setRatio is defined, the type of the CSSPropTween will be set to 2 and recomposition of the values will be the responsibility of that method.
-			 *
-			 * @param {!Object} t Target whose property will be tweened
-			 * @param {!string} p Property that will be tweened (its name, like "left" or "backgroundColor" or "boxShadow")
-			 * @param {string} b Beginning value
-			 * @param {string} e Ending value
-			 * @param {boolean} clrs If true, the value could contain a color value like "rgb(255,0,0)" or "#F00" or "red". The default is false, so no colors will be recognized (a performance optimization)
-			 * @param {(string|number|Object)} dflt The default beginning value that should be used if no valid beginning value is defined or if the number of values inside the complex beginning and ending values don't match
-			 * @param {?CSSPropTween} pt CSSPropTween instance that is the current head of the linked list (we'll prepend to this).
-			 * @param {number=} pr Priority in the linked list order. Higher priority properties will be updated before lower priority ones. The default priority is 0.
-			 * @param {TweenPlugin=} plugin If a plugin should handle the tweening of extra properties, pass the plugin instance here. If one is defined, then NO subtweens will be created for any extra properties (the properties will be created - just not additional CSSPropTween instances to tween them) because the plugin is expected to do so. However, the end values WILL be populated in the "data" property, like {s:100, xn1:50, xn2:300}
-			 * @param {function(number)=} setRatio If values should be set in a custom function instead of being pieced together in a type:1 (complex-value) CSSPropTween, define that custom function here.
-			 * @return {CSSPropTween} The first CSSPropTween in the linked list which includes the new one(s) added by the parseComplex() call.
-			 */
-			_parseComplex = CSSPlugin.parseComplex = function(t, p, b, e, clrs, dflt, pt, pr, plugin, setRatio) {
-				//DEBUG: _log("parseComplex: "+p+", b: "+b+", e: "+e);
-				b = b || dflt || "";
-				pt = new CSSPropTween(t, p, 0, 0, pt, (setRatio ? 2 : 1), null, false, pr, b, e);
-				e += ""; //ensures it's a string
-				var ba = b.split(", ").join(",").split(" "), //beginning array
-					ea = e.split(", ").join(",").split(" "), //ending array
-					l = ba.length,
-					autoRound = (_autoRound !== false),
-					i, xi, ni, bv, ev, bnums, enums, bn, rgba, temp, cv, str;
-				if (e.indexOf(",") !== -1 || b.indexOf(",") !== -1) {
-					ba = ba.join(" ").replace(_commasOutsideParenExp, ", ").split(" ");
-					ea = ea.join(" ").replace(_commasOutsideParenExp, ", ").split(" ");
-					l = ba.length;
-				}
-				if (l !== ea.length) {
-					//DEBUG: _log("mismatched formatting detected on " + p + " (" + b + " vs " + e + ")");
-					ba = (dflt || "").split(" ");
-					l = ba.length;
-				}
-				pt.plugin = plugin;
-				pt.setRatio = setRatio;
-				for (i = 0; i < l; i++) {
-					bv = ba[i];
-					ev = ea[i];
-					bn = parseFloat(bv);
-
-					//if the value begins with a number (most common). It's fine if it has a suffix like px
-					if (bn || bn === 0) {
-						pt.appendXtra("", bn, _parseChange(ev, bn), ev.replace(_relNumExp, ""), (autoRound && ev.indexOf("px") !== -1), true);
-
-					//if the value is a color
-					} else if (clrs && (bv.charAt(0) === "#" || _colorLookup[bv] || _rgbhslExp.test(bv))) {
-						str = ev.charAt(ev.length - 1) === "," ? ")," : ")"; //if there's a comma at the end, retain it.
-						bv = _parseColor(bv);
-						ev = _parseColor(ev);
-						rgba = (bv.length + ev.length > 6);
-						if (rgba && !_supportsOpacity && ev[3] === 0) { //older versions of IE don't support rgba(), so if the destination alpha is 0, just use "transparent" for the end color
-							pt["xs" + pt.l] += pt.l ? " transparent" : "transparent";
-							pt.e = pt.e.split(ea[i]).join("transparent");
-						} else {
-							if (!_supportsOpacity) { //old versions of IE don't support rgba().
-								rgba = false;
-							}
-							pt.appendXtra((rgba ? "rgba(" : "rgb("), bv[0], ev[0] - bv[0], ",", true, true)
-								.appendXtra("", bv[1], ev[1] - bv[1], ",", true)
-								.appendXtra("", bv[2], ev[2] - bv[2], (rgba ? "," : str), true);
-							if (rgba) {
-								bv = (bv.length < 4) ? 1 : bv[3];
-								pt.appendXtra("", bv, ((ev.length < 4) ? 1 : ev[3]) - bv, str, false);
-							}
-						}
-
-					} else {
-						bnums = bv.match(_numExp); //gets each group of numbers in the beginning value string and drops them into an array
-
-						//if no number is found, treat it as a non-tweening value and just append the string to the current xs.
-						if (!bnums) {
-							pt["xs" + pt.l] += pt.l ? " " + bv : bv;
-
-						//loop through all the numbers that are found and construct the extra values on the pt.
-						} else {
-							enums = ev.match(_relNumExp); //get each group of numbers in the end value string and drop them into an array. We allow relative values too, like +=50 or -=.5
-							if (!enums || enums.length !== bnums.length) {
-								//DEBUG: _log("mismatched formatting detected on " + p + " (" + b + " vs " + e + ")");
-								return pt;
-							}
-							ni = 0;
-							for (xi = 0; xi < bnums.length; xi++) {
-								cv = bnums[xi];
-								temp = bv.indexOf(cv, ni);
-								pt.appendXtra(bv.substr(ni, temp - ni), Number(cv), _parseChange(enums[xi], cv), "", (autoRound && bv.substr(temp + cv.length, 2) === "px"), (xi === 0));
-								ni = temp + cv.length;
-							}
-							pt["xs" + pt.l] += bv.substr(ni);
-						}
-					}
-				}
-				//if there are relative values ("+=" or "-=" prefix), we need to adjust the ending value to eliminate the prefixes and combine the values properly.
-				if (e.indexOf("=") !== -1) if (pt.data) {
-					str = pt.xs0 + pt.data.s;
-					for (i = 1; i < pt.l; i++) {
-						str += pt["xs" + i] + pt.data["xn" + i];
-					}
-					pt.e = str + pt["xs" + i];
-				}
-				if (!pt.l) {
-					pt.type = -1;
-					pt.xs0 = pt.e;
-				}
-				return pt.xfirst || pt;
-			},
-			i = 9;
-
-
-		p = CSSPropTween.prototype;
-		p.l = p.pr = 0; //length (number of extra properties like xn1, xn2, xn3, etc.
-		while (--i > 0) {
-			p["xn" + i] = 0;
-			p["xs" + i] = "";
-		}
-		p.xs0 = "";
-		p._next = p._prev = p.xfirst = p.data = p.plugin = p.setRatio = p.rxp = null;
-
-
-		/**
-		 * Appends and extra tweening value to a CSSPropTween and automatically manages any prefix and suffix strings. The first extra value is stored in the s and c of the main CSSPropTween instance, but thereafter any extras are stored in the xn1, xn2, xn3, etc. The prefixes and suffixes are stored in the xs0, xs1, xs2, etc. properties. For example, if I walk through a clip value like "rect(10px, 5px, 0px, 20px)", the values would be stored like this:
-		 * xs0:"rect(", s:10, xs1:"px, ", xn1:5, xs2:"px, ", xn2:0, xs3:"px, ", xn3:20, xn4:"px)"
-		 * And they'd all get joined together when the CSSPlugin renders (in the setRatio() method).
-		 * @param {string=} pfx Prefix (if any)
-		 * @param {!number} s Starting value
-		 * @param {!number} c Change in numeric value over the course of the entire tween. For example, if the start is 5 and the end is 100, the change would be 95.
-		 * @param {string=} sfx Suffix (if any)
-		 * @param {boolean=} r Round (if true).
-		 * @param {boolean=} pad If true, this extra value should be separated by the previous one by a space. If there is no previous extra and pad is true, it will automatically drop the space.
-		 * @return {CSSPropTween} returns itself so that multiple methods can be chained together.
-		 */
-		p.appendXtra = function(pfx, s, c, sfx, r, pad) {
-			var pt = this,
-				l = pt.l;
-			pt["xs" + l] += (pad && l) ? " " + pfx : pfx || "";
-			if (!c) if (l !== 0 && !pt.plugin) { //typically we'll combine non-changing values right into the xs to optimize performance, but we don't combine them when there's a plugin that will be tweening the values because it may depend on the values being split apart, like for a bezier, if a value doesn't change between the first and second iteration but then it does on the 3rd, we'll run into trouble because there's no xn slot for that value!
-				pt["xs" + l] += s + (sfx || "");
-				return pt;
-			}
-			pt.l++;
-			pt.type = pt.setRatio ? 2 : 1;
-			pt["xs" + pt.l] = sfx || "";
-			if (l > 0) {
-				pt.data["xn" + l] = s + c;
-				pt.rxp["xn" + l] = r; //round extra property (we need to tap into this in the _parseToProxy() method)
-				pt["xn" + l] = s;
-				if (!pt.plugin) {
-					pt.xfirst = new CSSPropTween(pt, "xn" + l, s, c, pt.xfirst || pt, 0, pt.n, r, pt.pr);
-					pt.xfirst.xs0 = 0; //just to ensure that the property stays numeric which helps modern browsers speed up processing. Remember, in the setRatio() method, we do pt.t[pt.p] = val + pt.xs0 so if pt.xs0 is "" (the default), it'll cast the end value as a string. When a property is a number sometimes and a string sometimes, it prevents the compiler from locking in the data type, slowing things down slightly.
-				}
-				return pt;
-			}
-			pt.data = {s:s + c};
-			pt.rxp = {};
-			pt.s = s;
-			pt.c = c;
-			pt.r = r;
-			return pt;
-		};
-
-		/**
-		 * @constructor A SpecialProp is basically a css property that needs to be treated in a non-standard way, like if it may contain a complex value like boxShadow:"5px 10px 15px rgb(255, 102, 51)" or if it is associated with another plugin like ThrowPropsPlugin or BezierPlugin. Every SpecialProp is associated with a particular property name like "boxShadow" or "throwProps" or "bezier" and it will intercept those values in the vars object that's passed to the CSSPlugin and handle them accordingly.
-		 * @param {!string} p Property name (like "boxShadow" or "throwProps")
-		 * @param {Object=} options An object containing any of the following configuration options:
-		 *                      - defaultValue: the default value
-		 *                      - parser: A function that should be called when the associated property name is found in the vars. This function should return a CSSPropTween instance and it should ensure that it is properly inserted into the linked list. It will receive 4 paramters: 1) The target, 2) The value defined in the vars, 3) The CSSPlugin instance (whose _firstPT should be used for the linked list), and 4) A computed style object if one was calculated (this is a speed optimization that allows retrieval of starting values quicker)
-		 *                      - formatter: a function that formats any value received for this special property (for example, boxShadow could take "5px 5px red" and format it to "5px 5px 0px 0px red" so that both the beginning and ending values have a common order and quantity of values.)
-		 *                      - prefix: if true, we'll determine whether or not this property requires a vendor prefix (like Webkit or Moz or ms or O)
-		 *                      - color: set this to true if the value for this SpecialProp may contain color-related values like rgb(), rgba(), etc.
-		 *                      - priority: priority in the linked list order. Higher priority SpecialProps will be updated before lower priority ones. The default priority is 0.
-		 *                      - multi: if true, the formatter should accommodate a comma-delimited list of values, like boxShadow could have multiple boxShadows listed out.
-		 *                      - collapsible: if true, the formatter should treat the value like it's a top/right/bottom/left value that could be collapsed, like "5px" would apply to all, "5px, 10px" would use 5px for top/bottom and 10px for right/left, etc.
-		 *                      - keyword: a special keyword that can [optionally] be found inside the value (like "inset" for boxShadow). This allows us to validate beginning/ending values to make sure they match (if the keyword is found in one, it'll be added to the other for consistency by default).
-		 */
-		var SpecialProp = function(p, options) {
-				options = options || {};
-				this.p = options.prefix ? _checkPropPrefix(p) || p : p;
-				_specialProps[p] = _specialProps[this.p] = this;
-				this.format = options.formatter || _getFormatter(options.defaultValue, options.color, options.collapsible, options.multi);
-				if (options.parser) {
-					this.parse = options.parser;
-				}
-				this.clrs = options.color;
-				this.multi = options.multi;
-				this.keyword = options.keyword;
-				this.dflt = options.defaultValue;
-				this.pr = options.priority || 0;
-			},
-
-			//shortcut for creating a new SpecialProp that can accept multiple properties as a comma-delimited list (helps minification). dflt can be an array for multiple values (we don't do a comma-delimited list because the default value may contain commas, like rect(0px,0px,0px,0px)). We attach this method to the SpecialProp class/object instead of using a private _createSpecialProp() method so that we can tap into it externally if necessary, like from another plugin.
-			_registerComplexSpecialProp = _internals._registerComplexSpecialProp = function(p, options, defaults) {
-				if (typeof(options) !== "object") {
-					options = {parser:defaults}; //to make backwards compatible with older versions of BezierPlugin and ThrowPropsPlugin
-				}
-				var a = p.split(","),
-					d = options.defaultValue,
-					i, temp;
-				defaults = defaults || [d];
-				for (i = 0; i < a.length; i++) {
-					options.prefix = (i === 0 && options.prefix);
-					options.defaultValue = defaults[i] || d;
-					temp = new SpecialProp(a[i], options);
-				}
-			},
-
-			//creates a placeholder special prop for a plugin so that the property gets caught the first time a tween of it is attempted, and at that time it makes the plugin register itself, thus taking over for all future tweens of that property. This allows us to not mandate that things load in a particular order and it also allows us to log() an error that informs the user when they attempt to tween an external plugin-related property without loading its .js file.
-			_registerPluginProp = function(p) {
-				if (!_specialProps[p]) {
-					var pluginName = p.charAt(0).toUpperCase() + p.substr(1) + "Plugin";
-					_registerComplexSpecialProp(p, {parser:function(t, e, p, cssp, pt, plugin, vars) {
-						var pluginClass = (window.GreenSockGlobals || window).com.greensock.plugins[pluginName];
-						if (!pluginClass) {
-							_log("Error: " + pluginName + " js file not loaded.");
-							return pt;
-						}
-						pluginClass._cssRegister();
-						return _specialProps[p].parse(t, e, p, cssp, pt, plugin, vars);
-					}});
-				}
-			};
-
-
-		p = SpecialProp.prototype;
-
-		/**
-		 * Alias for _parseComplex() that automatically plugs in certain values for this SpecialProp, like its property name, whether or not colors should be sensed, the default value, and priority. It also looks for any keyword that the SpecialProp defines (like "inset" for boxShadow) and ensures that the beginning and ending values have the same number of values for SpecialProps where multi is true (like boxShadow and textShadow can have a comma-delimited list)
-		 * @param {!Object} t target element
-		 * @param {(string|number|object)} b beginning value
-		 * @param {(string|number|object)} e ending (destination) value
-		 * @param {CSSPropTween=} pt next CSSPropTween in the linked list
-		 * @param {TweenPlugin=} plugin If another plugin will be tweening the complex value, that TweenPlugin instance goes here.
-		 * @param {function=} setRatio If a custom setRatio() method should be used to handle this complex value, that goes here.
-		 * @return {CSSPropTween=} First CSSPropTween in the linked list
-		 */
-		p.parseComplex = function(t, b, e, pt, plugin, setRatio) {
-			var kwd = this.keyword,
-				i, ba, ea, l, bi, ei;
-			//if this SpecialProp's value can contain a comma-delimited list of values (like boxShadow or textShadow), we must parse them in a special way, and look for a keyword (like "inset" for boxShadow) and ensure that the beginning and ending BOTH have it if the end defines it as such. We also must ensure that there are an equal number of values specified (we can't tween 1 boxShadow to 3 for example)
-			if (this.multi) if (_commasOutsideParenExp.test(e) || _commasOutsideParenExp.test(b)) {
-				ba = b.replace(_commasOutsideParenExp, "|").split("|");
-				ea = e.replace(_commasOutsideParenExp, "|").split("|");
-			} else if (kwd) {
-				ba = [b];
-				ea = [e];
-			}
-			if (ea) {
-				l = (ea.length > ba.length) ? ea.length : ba.length;
-				for (i = 0; i < l; i++) {
-					b = ba[i] = ba[i] || this.dflt;
-					e = ea[i] = ea[i] || this.dflt;
-					if (kwd) {
-						bi = b.indexOf(kwd);
-						ei = e.indexOf(kwd);
-						if (bi !== ei) {
-							e = (ei === -1) ? ea : ba;
-							e[i] += " " + kwd;
-						}
-					}
-				}
-				b = ba.join(", ");
-				e = ea.join(", ");
-			}
-			return _parseComplex(t, this.p, b, e, this.clrs, this.dflt, pt, this.pr, plugin, setRatio);
-		};
-
-		/**
-		 * Accepts a target and end value and spits back a CSSPropTween that has been inserted into the CSSPlugin's linked list and conforms with all the conventions we use internally, like type:-1, 0, 1, or 2, setting up any extra property tweens, priority, etc. For example, if we have a boxShadow SpecialProp and call:
-		 * this._firstPT = sp.parse(element, "5px 10px 20px rgb(2550,102,51)", "boxShadow", this);
-		 * It should figure out the starting value of the element's boxShadow, compare it to the provided end value and create all the necessary CSSPropTweens of the appropriate types to tween the boxShadow. The CSSPropTween that gets spit back should already be inserted into the linked list (the 4th parameter is the current head, so prepend to that).
-		 * @param {!Object} t Target object whose property is being tweened
-		 * @param {Object} e End value as provided in the vars object (typically a string, but not always - like a throwProps would be an object).
-		 * @param {!string} p Property name
-		 * @param {!CSSPlugin} cssp The CSSPlugin instance that should be associated with this tween.
-		 * @param {?CSSPropTween} pt The CSSPropTween that is the current head of the linked list (we'll prepend to it)
-		 * @param {TweenPlugin=} plugin If a plugin will be used to tween the parsed value, this is the plugin instance.
-		 * @param {Object=} vars Original vars object that contains the data for parsing.
-		 * @return {CSSPropTween} The first CSSPropTween in the linked list which includes the new one(s) added by the parse() call.
-		 */
-		p.parse = function(t, e, p, cssp, pt, plugin, vars) {
-			return this.parseComplex(t.style, this.format(_getStyle(t, this.p, _cs, false, this.dflt)), this.format(e), pt, plugin);
-		};
-
-		/**
-		 * Registers a special property that should be intercepted from any "css" objects defined in tweens. This allows you to handle them however you want without CSSPlugin doing it for you. The 2nd parameter should be a function that accepts 3 parameters:
-		 *  1) Target object whose property should be tweened (typically a DOM element)
-		 *  2) The end/destination value (could be a string, number, object, or whatever you want)
-		 *  3) The tween instance (you probably don't need to worry about this, but it can be useful for looking up information like the duration)
-		 *
-		 * Then, your function should return a function which will be called each time the tween gets rendered, passing a numeric "ratio" parameter to your function that indicates the change factor (usually between 0 and 1). For example:
-		 *
-		 * CSSPlugin.registerSpecialProp("myCustomProp", function(target, value, tween) {
-		 *      var start = target.style.width;
-		 *      return function(ratio) {
-		 *              target.style.width = (start + value * ratio) + "px";
-		 *              console.log("set width to " + target.style.width);
-		 *          }
-		 * }, 0);
-		 *
-		 * Then, when I do this tween, it will trigger my special property:
-		 *
-		 * TweenLite.to(element, 1, {css:{myCustomProp:100}});
-		 *
-		 * In the example, of course, we're just changing the width, but you can do anything you want.
-		 *
-		 * @param {!string} name Property name (or comma-delimited list of property names) that should be intercepted and handled by your function. For example, if I define "myCustomProp", then it would handle that portion of the following tween: TweenLite.to(element, 1, {css:{myCustomProp:100}})
-		 * @param {!function(Object, Object, Object, string):function(number)} onInitTween The function that will be called when a tween of this special property is performed. The function will receive 4 parameters: 1) Target object that should be tweened, 2) Value that was passed to the tween, 3) The tween instance itself (rarely used), and 4) The property name that's being tweened. Your function should return a function that should be called on every update of the tween. That function will receive a single parameter that is a "change factor" value (typically between 0 and 1) indicating the amount of change as a ratio. You can use this to determine how to set the values appropriately in your function.
-		 * @param {number=} priority Priority that helps the engine determine the order in which to set the properties (default: 0). Higher priority properties will be updated before lower priority ones.
-		 */
-		CSSPlugin.registerSpecialProp = function(name, onInitTween, priority) {
-			_registerComplexSpecialProp(name, {parser:function(t, e, p, cssp, pt, plugin, vars) {
-				var rv = new CSSPropTween(t, p, 0, 0, pt, 2, p, false, priority);
-				rv.plugin = plugin;
-				rv.setRatio = onInitTween(t, e, cssp._tween, p);
-				return rv;
-			}, priority:priority});
-		};
-
-
-
-
-
-
-
-
-		//transform-related methods and properties
-		var _transformProps = ("scaleX,scaleY,scaleZ,x,y,z,skewX,skewY,rotation,rotationX,rotationY,perspective").split(","),
-			_transformProp = _checkPropPrefix("transform"), //the Javascript (camelCase) transform property, like msTransform, WebkitTransform, MozTransform, or OTransform.
-			_transformPropCSS = _prefixCSS + "transform",
-			_transformOriginProp = _checkPropPrefix("transformOrigin"),
-			_supports3D = (_checkPropPrefix("perspective") !== null),
-			Transform = _internals.Transform = function() {
-				this.skewY = 0;
-			},
-
-			/**
-			 * Parses the transform values for an element, returning an object with x, y, z, scaleX, scaleY, scaleZ, rotation, rotationX, rotationY, skewX, and skewY properties. Note: by default (for performance reasons), all skewing is combined into skewX and rotation but skewY still has a place in the transform object so that we can record how much of the skew is attributed to skewX vs skewY. Remember, a skewY of 10 looks the same as a rotation of 10 and skewX of -10.
-			 * @param {!Object} t target element
-			 * @param {Object=} cs computed style object (optional)
-			 * @param {boolean=} rec if true, the transform values will be recorded to the target element's _gsTransform object, like target._gsTransform = {x:0, y:0, z:0, scaleX:1...}
-			 * @param {boolean=} parse if true, we'll ignore any _gsTransform values that already exist on the element, and force a reparsing of the css (calculated style)
-			 * @return {object} object containing all of the transform properties/values like {x:0, y:0, z:0, scaleX:1...}
-			 */
-			_getTransform = _internals.getTransform = function(t, cs, rec, parse) {
-				if (t._gsTransform && rec && !parse) {
-					return t._gsTransform; //if the element already has a _gsTransform, use that. Note: some browsers don't accurately return the calculated style for the transform (particularly for SVG), so it's almost always safest to just use the values we've already applied rather than re-parsing things.
-				}
-				var tm = rec ? t._gsTransform || new Transform() : new Transform(),
-					invX = (tm.scaleX < 0), //in order to interpret things properly, we need to know if the user applied a negative scaleX previously so that we can adjust the rotation and skewX accordingly. Otherwise, if we always interpret a flipped matrix as affecting scaleY and the user only wants to tween the scaleX on multiple sequential tweens, it would keep the negative scaleY without that being the user's intent.
-					min = 0.00002,
-					rnd = 100000,
-					minAngle = 179.99,
-					minPI = minAngle * _DEG2RAD,
-					zOrigin = _supports3D ? parseFloat(_getStyle(t, _transformOriginProp, cs, false, "0 0 0").split(" ")[2]) || tm.zOrigin  || 0 : 0,
-					s, m, i, n, dec, scaleX, scaleY, rotation, skewX, difX, difY, difR, difS;
-				if (_transformProp) {
-					s = _getStyle(t, _transformPropCSS, cs, true);
-				} else if (t.currentStyle) {
-					//for older versions of IE, we need to interpret the filter portion that is in the format: progid:DXImageTransform.Microsoft.Matrix(M11=6.123233995736766e-17, M12=-1, M21=1, M22=6.123233995736766e-17, sizingMethod='auto expand') Notice that we need to swap b and c compared to a normal matrix.
-					s = t.currentStyle.filter.match(_ieGetMatrixExp);
-					s = (s && s.length === 4) ? [s[0].substr(4), Number(s[2].substr(4)), Number(s[1].substr(4)), s[3].substr(4), (tm.x || 0), (tm.y || 0)].join(",") : "";
-				}
-				//split the matrix values out into an array (m for matrix)
-				m = (s || "").match(/(?:\-|\b)[\d\-\.e]+\b/gi) || [];
-				i = m.length;
-				while (--i > -1) {
-					n = Number(m[i]);
-					m[i] = (dec = n - (n |= 0)) ? ((dec * rnd + (dec < 0 ? -0.5 : 0.5)) | 0) / rnd + n : n; //convert strings to Numbers and round to 5 decimal places to avoid issues with tiny numbers. Roughly 20x faster than Number.toFixed(). We also must make sure to round before dividing so that values like 0.9999999999 become 1 to avoid glitches in browser rendering and interpretation of flipped/rotated 3D matrices. And don't just multiply the number by rnd, floor it, and then divide by rnd because the bitwise operations max out at a 32-bit signed integer, thus it could get clipped at a relatively low value (like 22,000.00000 for example).
-				}
-				if (m.length === 16) {
-
-					//we'll only look at these position-related 6 variables first because if x/y/z all match, it's relatively safe to assume we don't need to re-parse everything which risks losing important rotational information (like rotationX:180 plus rotationY:180 would look the same as rotation:180 - there's no way to know for sure which direction was taken based solely on the matrix3d() values)
-					var a13 = m[8], a23 = m[9], a33 = m[10],
-						a14 = m[12], a24 = m[13], a34 = m[14];
-
-					//we manually compensate for non-zero z component of transformOrigin to work around bugs in Safari
-					if (tm.zOrigin) {
-						a34 = -tm.zOrigin;
-						a14 = a13*a34-m[12];
-						a24 = a23*a34-m[13];
-						a34 = a33*a34+tm.zOrigin-m[14];
-					}
-
-					//only parse from the matrix if we MUST because not only is it usually unnecessary due to the fact that we store the values in the _gsTransform object, but also because it's impossible to accurately interpret rotationX, rotationY, rotationZ, scaleX, and scaleY if all are applied, so it's much better to rely on what we store. However, we must parse the first time that an object is tweened. We also assume that if the position has changed, the user must have done some styling changes outside of CSSPlugin, thus we force a parse in that scenario.
-					if (!rec || parse || tm.rotationX == null) {
-						var a11 = m[0], a21 = m[1], a31 = m[2], a41 = m[3],
-							a12 = m[4], a22 = m[5], a32 = m[6], a42 = m[7],
-							a43 = m[11],
-							angle = Math.atan2(a32, a33),
-							xFlip = (angle < -minPI || angle > minPI),
-							t1, t2, t3, cos, sin, yFlip, zFlip;
-						tm.rotationX = angle * _RAD2DEG;
-						//rotationX
-						if (angle) {
-							cos = Math.cos(-angle);
-							sin = Math.sin(-angle);
-							t1 = a12*cos+a13*sin;
-							t2 = a22*cos+a23*sin;
-							t3 = a32*cos+a33*sin;
-							a13 = a12*-sin+a13*cos;
-							a23 = a22*-sin+a23*cos;
-							a33 = a32*-sin+a33*cos;
-							a43 = a42*-sin+a43*cos;
-							a12 = t1;
-							a22 = t2;
-							a32 = t3;
-						}
-						//rotationY
-						angle = Math.atan2(a13, a11);
-						tm.rotationY = angle * _RAD2DEG;
-						if (angle) {
-							yFlip = (angle < -minPI || angle > minPI);
-							cos = Math.cos(-angle);
-							sin = Math.sin(-angle);
-							t1 = a11*cos-a13*sin;
-							t2 = a21*cos-a23*sin;
-							t3 = a31*cos-a33*sin;
-							a23 = a21*sin+a23*cos;
-							a33 = a31*sin+a33*cos;
-							a43 = a41*sin+a43*cos;
-							a11 = t1;
-							a21 = t2;
-							a31 = t3;
-						}
-						//rotationZ
-						angle = Math.atan2(a21, a22);
-						tm.rotation = angle * _RAD2DEG;
-						if (angle) {
-							zFlip = (angle < -minPI || angle > minPI);
-							cos = Math.cos(-angle);
-							sin = Math.sin(-angle);
-							a11 = a11*cos+a12*sin;
-							t2 = a21*cos+a22*sin;
-							a22 = a21*-sin+a22*cos;
-							a32 = a31*-sin+a32*cos;
-							a21 = t2;
-						}
-
-						if (zFlip && xFlip) {
-							tm.rotation = tm.rotationX = 0;
-						} else if (zFlip && yFlip) {
-							tm.rotation = tm.rotationY = 0;
-						} else if (yFlip && xFlip) {
-							tm.rotationY = tm.rotationX = 0;
-						}
-
-						tm.scaleX = ((Math.sqrt(a11 * a11 + a21 * a21) * rnd + 0.5) | 0) / rnd;
-						tm.scaleY = ((Math.sqrt(a22 * a22 + a23 * a23) * rnd + 0.5) | 0) / rnd;
-						tm.scaleZ = ((Math.sqrt(a32 * a32 + a33 * a33) * rnd + 0.5) | 0) / rnd;
-						tm.skewX = 0;
-						tm.perspective = a43 ? 1 / ((a43 < 0) ? -a43 : a43) : 0;
-						tm.x = a14;
-						tm.y = a24;
-						tm.z = a34;
-					}
-
-				} else if ((!_supports3D || parse || !m.length || tm.x !== m[4] || tm.y !== m[5] || (!tm.rotationX && !tm.rotationY)) && !(tm.x !== undefined && _getStyle(t, "display", cs) === "none")) { //sometimes a 6-element matrix is returned even when we performed 3D transforms, like if rotationX and rotationY are 180. In cases like this, we still need to honor the 3D transforms. If we just rely on the 2D info, it could affect how the data is interpreted, like scaleY might get set to -1 or rotation could get offset by 180 degrees. For example, do a TweenLite.to(element, 1, {css:{rotationX:180, rotationY:180}}) and then later, TweenLite.to(element, 1, {css:{rotationX:0}}) and without this conditional logic in place, it'd jump to a state of being unrotated when the 2nd tween starts. Then again, we need to honor the fact that the user COULD alter the transforms outside of CSSPlugin, like by manually applying new css, so we try to sense that by looking at x and y because if those changed, we know the changes were made outside CSSPlugin and we force a reinterpretation of the matrix values. Also, in Webkit browsers, if the element's "display" is "none", its calculated style value will always return empty, so if we've already recorded the values in the _gsTransform object, we'll just rely on those.
-					var k = (m.length >= 6),
-						a = k ? m[0] : 1,
-						b = m[1] || 0,
-						c = m[2] || 0,
-						d = k ? m[3] : 1;
-					tm.x = m[4] || 0;
-					tm.y = m[5] || 0;
-					scaleX = Math.sqrt(a * a + b * b);
-					scaleY = Math.sqrt(d * d + c * c);
-					rotation = (a || b) ? Math.atan2(b, a) * _RAD2DEG : tm.rotation || 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).
-					skewX = (c || d) ? Math.atan2(c, d) * _RAD2DEG + rotation : tm.skewX || 0;
-					difX = scaleX - Math.abs(tm.scaleX || 0);
-					difY = scaleY - Math.abs(tm.scaleY || 0);
-					if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {
-						if (invX) {
-							scaleX *= -1;
-							skewX += (rotation <= 0) ? 180 : -180;
-							rotation += (rotation <= 0) ? 180 : -180;
-						} else {
-							scaleY *= -1;
-							skewX += (skewX <= 0) ? 180 : -180;
-						}
-					}
-					difR = (rotation - tm.rotation) % 180; //note: matching ranges would be very small (+/-0.0001) or very close to 180.
-					difS = (skewX - tm.skewX) % 180;
-					//if there's already a recorded _gsTransform in place for the target, we should leave those values in place unless we know things changed for sure (beyond a super small amount). This gets around ambiguous interpretations, like if scaleX and scaleY are both -1, the matrix would be the same as if the rotation was 180 with normal scaleX/scaleY. If the user tweened to particular values, those must be prioritized to ensure animation is consistent.
-					if (tm.skewX === undefined || difX > min || difX < -min || difY > min || difY < -min || (difR > -minAngle && difR < minAngle && (difR * rnd) | 0 !== 0) || (difS > -minAngle && difS < minAngle && (difS * rnd) | 0 !== 0)) {
-						tm.scaleX = scaleX;
-						tm.scaleY = scaleY;
-						tm.rotation = rotation;
-						tm.skewX = skewX;
-					}
-					if (_supports3D) {
-						tm.rotationX = tm.rotationY = tm.z = 0;
-						tm.perspective = parseFloat(CSSPlugin.defaultTransformPerspective) || 0;
-						tm.scaleZ = 1;
-					}
-				}
-				tm.zOrigin = zOrigin;
-
-				//some browsers have a hard time with very small values like 2.4492935982947064e-16 (notice the "e-" towards the end) and would render the object slightly off. So we round to 0 in these cases. The conditional logic here is faster than calling Math.abs(). Also, browsers tend to render a SLIGHTLY rotated object in a fuzzy way, so we need to snap to exactly 0 when appropriate.
-				for (i in tm) {
-					if (tm[i] < min) if (tm[i] > -min) {
-						tm[i] = 0;
-					}
-				}
-				//DEBUG: _log("parsed rotation: "+(tm.rotationX)+", "+(tm.rotationY)+", "+(tm.rotation)+", scale: "+tm.scaleX+", "+tm.scaleY+", "+tm.scaleZ+", position: "+tm.x+", "+tm.y+", "+tm.z+", perspective: "+tm.perspective);
-				if (rec) {
-					t._gsTransform = tm; //record to the object's _gsTransform which we use so that tweens can control individual properties independently (we need all the properties to accurately recompose the matrix in the setRatio() method)
-				}
-				return tm;
-			},
-
-			//for setting 2D transforms in IE6, IE7, and IE8 (must use a "filter" to emulate the behavior of modern day browser transforms)
-			_setIETransformRatio = function(v) {
-				var t = this.data, //refers to the element's _gsTransform object
-					ang = -t.rotation * _DEG2RAD,
-					skew = ang + t.skewX * _DEG2RAD,
-					rnd = 100000,
-					a = ((Math.cos(ang) * t.scaleX * rnd) | 0) / rnd,
-					b = ((Math.sin(ang) * t.scaleX * rnd) | 0) / rnd,
-					c = ((Math.sin(skew) * -t.scaleY * rnd) | 0) / rnd,
-					d = ((Math.cos(skew) * t.scaleY * rnd) | 0) / rnd,
-					style = this.t.style,
-					cs = this.t.currentStyle,
-					filters, val;
-				if (!cs) {
-					return;
-				}
-				val = b; //just for swapping the variables an inverting them (reused "val" to avoid creating another variable in memory). IE's filter matrix uses a non-standard matrix configuration (angle goes the opposite way, and b and c are reversed and inverted)
-				b = -c;
-				c = -val;
-				filters = cs.filter;
-				style.filter = ""; //remove filters so that we can accurately measure offsetWidth/offsetHeight
-				var w = this.t.offsetWidth,
-					h = this.t.offsetHeight,
-					clip = (cs.position !== "absolute"),
-					m = "progid:DXImageTransform.Microsoft.Matrix(M11=" + a + ", M12=" + b + ", M21=" + c + ", M22=" + d,
-					ox = t.x,
-					oy = t.y,
-					dx, dy;
-
-				//if transformOrigin is being used, adjust the offset x and y
-				if (t.ox != null) {
-					dx = ((t.oxp) ? w * t.ox * 0.01 : t.ox) - w / 2;
-					dy = ((t.oyp) ? h * t.oy * 0.01 : t.oy) - h / 2;
-					ox += dx - (dx * a + dy * b);
-					oy += dy - (dx * c + dy * d);
-				}
-
-				if (!clip) {
-					m += ", sizingMethod='auto expand')";
-				} else {
-					dx = (w / 2);
-					dy = (h / 2);
-					//translate to ensure that transformations occur around the correct origin (default is center).
-					m += ", Dx=" + (dx - (dx * a + dy * b) + ox) + ", Dy=" + (dy - (dx * c + dy * d) + oy) + ")";
-				}
-				if (filters.indexOf("DXImageTransform.Microsoft.Matrix(") !== -1) {
-					style.filter = filters.replace(_ieSetMatrixExp, m);
-				} else {
-					style.filter = m + " " + filters; //we must always put the transform/matrix FIRST (before alpha(opacity=xx)) to avoid an IE bug that slices part of the object when rotation is applied with alpha.
-				}
-
-				//at the end or beginning of the tween, if the matrix is normal (1, 0, 0, 1) and opacity is 100 (or doesn't exist), remove the filter to improve browser performance.
-				if (v === 0 || v === 1) if (a === 1) if (b === 0) if (c === 0) if (d === 1) if (!clip || m.indexOf("Dx=0, Dy=0") !== -1) if (!_opacityExp.test(filters) || parseFloat(RegExp.$1) === 100) if (filters.indexOf("gradient(" && filters.indexOf("Alpha")) === -1) {
-					style.removeAttribute("filter");
-				}
-
-				//we must set the margins AFTER applying the filter in order to avoid some bugs in IE8 that could (in rare scenarios) cause them to be ignored intermittently (vibration).
-				if (!clip) {
-					var mult = (_ieVers < 8) ? 1 : -1, //in Internet Explorer 7 and before, the box model is broken, causing the browser to treat the width/height of the actual rotated filtered image as the width/height of the box itself, but Microsoft corrected that in IE8. We must use a negative offset in IE8 on the right/bottom
-						marg, prop, dif;
-					dx = t.ieOffsetX || 0;
-					dy = t.ieOffsetY || 0;
-					t.ieOffsetX = Math.round((w - ((a < 0 ? -a : a) * w + (b < 0 ? -b : b) * h)) / 2 + ox);
-					t.ieOffsetY = Math.round((h - ((d < 0 ? -d : d) * h + (c < 0 ? -c : c) * w)) / 2 + oy);
-					for (i = 0; i < 4; i++) {
-						prop = _margins[i];
-						marg = cs[prop];
-						//we need to get the current margin in case it is being tweened separately (we want to respect that tween's changes)
-						val = (marg.indexOf("px") !== -1) ? parseFloat(marg) : _convertToPixels(this.t, prop, parseFloat(marg), marg.replace(_suffixExp, "")) || 0;
-						if (val !== t[prop]) {
-							dif = (i < 2) ? -t.ieOffsetX : -t.ieOffsetY; //if another tween is controlling a margin, we cannot only apply the difference in the ieOffsets, so we essentially zero-out the dx and dy here in that case. We record the margin(s) later so that we can keep comparing them, making this code very flexible.
-						} else {
-							dif = (i < 2) ? dx - t.ieOffsetX : dy - t.ieOffsetY;
-						}
-						style[prop] = (t[prop] = Math.round( val - dif * ((i === 0 || i === 2) ? 1 : mult) )) + "px";
-					}
-				}
-			},
-
-			_set3DTransformRatio = _internals.set3DTransformRatio = function(v) {
-				var t = this.data, //refers to the element's _gsTransform object
-					style = this.t.style,
-					angle = t.rotation * _DEG2RAD,
-					sx = t.scaleX,
-					sy = t.scaleY,
-					sz = t.scaleZ,
-					perspective = t.perspective,
-					a11, a12, a13, a14,	a21, a22, a23, a24, a31, a32, a33, a34,	a41, a42, a43,
-					zOrigin, rnd, cos, sin, t1, t2, t3, t4;
-				if (v === 1 || v === 0) if (t.force3D === "auto") if (!t.rotationY && !t.rotationX && sz === 1 && !perspective && !t.z) { //on the final render (which could be 0 for a from tween), if there are no 3D aspects, render in 2D to free up memory and improve performance especially on mobile devices
-					_set2DTransformRatio.call(this, v);
-					return;
-				}
-				if (_isFirefox) {
-					var n = 0.0001;
-					if (sx < n && sx > -n) { //Firefox has a bug (at least in v25) that causes it to render the transparent part of 32-bit PNG images as black when displayed inside an iframe and the 3D scale is very small and doesn't change sufficiently enough between renders (like if you use a Power4.easeInOut to scale from 0 to 1 where the beginning values only change a tiny amount to begin the tween before accelerating). In this case, we force the scale to be 0.00002 instead which is visually the same but works around the Firefox issue.
-						sx = sz = 0.00002;
-					}
-					if (sy < n && sy > -n) {
-						sy = sz = 0.00002;
-					}
-					if (perspective && !t.z && !t.rotationX && !t.rotationY) { //Firefox has a bug that causes elements to have an odd super-thin, broken/dotted black border on elements that have a perspective set but aren't utilizing 3D space (no rotationX, rotationY, or z).
-						perspective = 0;
-					}
-				}
-				if (angle || t.skewX) {
-					cos = Math.cos(angle);
-					sin = Math.sin(angle);
-					a11 = cos;
-					a21 = sin;
-					if (t.skewX) {
-						angle -= t.skewX * _DEG2RAD;
-						cos = Math.cos(angle);
-						sin = Math.sin(angle);
-						if (t.skewType === "simple") { //by default, we compensate skewing on the other axis to make it look more natural, but you can set the skewType to "simple" to use the uncompensated skewing that CSS does
-							t1 = Math.tan(t.skewX * _DEG2RAD);
-							t1 = Math.sqrt(1 + t1 * t1);
-							cos *= t1;
-							sin *= t1;
-						}
-					}
-					a12 = -sin;
-					a22 = cos;
-
-				} else if (!t.rotationY && !t.rotationX && sz === 1 && !perspective) { //if we're only translating and/or 2D scaling, this is faster...
-					style[_transformProp] = "translate3d(" + t.x + "px," + t.y + "px," + t.z +"px)" + ((sx !== 1 || sy !== 1) ? " scale(" + sx + "," + sy + ")" : "");
-					return;
-				} else {
-					a11 = a22 = 1;
-					a12 = a21 = 0;
-				}
-				a33 = 1;
-				a13 = a14 = a23 = a24 = a31 = a32 = a34 = a41 = a42 = 0;
-				a43 = (perspective) ? -1 / perspective : 0;
-				zOrigin = t.zOrigin;
-				rnd = 100000;
-				angle = t.rotationY * _DEG2RAD;
-				if (angle) {
-					cos = Math.cos(angle);
-					sin = Math.sin(angle);
-					a31 = a33*-sin;
-					a41 = a43*-sin;
-					a13 = a11*sin;
-					a23 = a21*sin;
-					a33 *= cos;
-					a43 *= cos;
-					a11 *= cos;
-					a21 *= cos;
-				}
-				angle = t.rotationX * _DEG2RAD;
-				if (angle) {
-					cos = Math.cos(angle);
-					sin = Math.sin(angle);
-					t1 = a12*cos+a13*sin;
-					t2 = a22*cos+a23*sin;
-					t3 = a32*cos+a33*sin;
-					t4 = a42*cos+a43*sin;
-					a13 = a12*-sin+a13*cos;
-					a23 = a22*-sin+a23*cos;
-					a33 = a32*-sin+a33*cos;
-					a43 = a42*-sin+a43*cos;
-					a12 = t1;
-					a22 = t2;
-					a32 = t3;
-					a42 = t4;
-				}
-				if (sz !== 1) {
-					a13*=sz;
-					a23*=sz;
-					a33*=sz;
-					a43*=sz;
-				}
-				if (sy !== 1) {
-					a12*=sy;
-					a22*=sy;
-					a32*=sy;
-					a42*=sy;
-				}
-				if (sx !== 1) {
-					a11*=sx;
-					a21*=sx;
-					a31*=sx;
-					a41*=sx;
-				}
-				if (zOrigin) {
-					a34 -= zOrigin;
-					a14 = a13*a34;
-					a24 = a23*a34;
-					a34 = a33*a34+zOrigin;
-				}
-				//we round the x, y, and z slightly differently to allow even larger values.
-				a14 = (t1 = (a14 += t.x) - (a14 |= 0)) ? ((t1 * rnd + (t1 < 0 ? -0.5 : 0.5)) | 0) / rnd + a14 : a14;
-				a24 = (t1 = (a24 += t.y) - (a24 |= 0)) ? ((t1 * rnd + (t1 < 0 ? -0.5 : 0.5)) | 0) / rnd + a24 : a24;
-				a34 = (t1 = (a34 += t.z) - (a34 |= 0)) ? ((t1 * rnd + (t1 < 0 ? -0.5 : 0.5)) | 0) / rnd + a34 : a34;
-				style[_transformProp] = "matrix3d(" + [ (((a11 * rnd) | 0) / rnd), (((a21 * rnd) | 0) / rnd), (((a31 * rnd) | 0) / rnd), (((a41 * rnd) | 0) / rnd), (((a12 * rnd) | 0) / rnd), (((a22 * rnd) | 0) / rnd), (((a32 * rnd) | 0) / rnd), (((a42 * rnd) | 0) / rnd), (((a13 * rnd) | 0) / rnd), (((a23 * rnd) | 0) / rnd), (((a33 * rnd) | 0) / rnd), (((a43 * rnd) | 0) / rnd), a14, a24, a34, (perspective ? (1 + (-a34 / perspective)) : 1) ].join(",") + ")";
-			},
-
-			_set2DTransformRatio = _internals.set2DTransformRatio = function(v) {
-				var t = this.data, //refers to the element's _gsTransform object
-					targ = this.t,
-					style = targ.style,
-					ang, skew, rnd, sx, sy;
-				if (t.rotationX || t.rotationY || t.z || t.force3D === true || (t.force3D === "auto" && v !== 1 && v !== 0)) { //if a 3D tween begins while a 2D one is running, we need to kick the rendering over to the 3D method. For example, imagine a yoyo-ing, infinitely repeating scale tween running, and then the object gets rotated in 3D space with a different tween.
-					this.setRatio = _set3DTransformRatio;
-					_set3DTransformRatio.call(this, v);
-					return;
-				}
-				if (!t.rotation && !t.skewX) {
-					style[_transformProp] = "matrix(" + t.scaleX + ",0,0," + t.scaleY + "," + t.x + "," + t.y + ")";
-				} else {
-					ang = t.rotation * _DEG2RAD;
-					skew = ang - t.skewX * _DEG2RAD;
-					rnd = 100000;
-					sx = t.scaleX * rnd;
-					sy = t.scaleY * rnd;
-					//some browsers have a hard time with very small values like 2.4492935982947064e-16 (notice the "e-" towards the end) and would render the object slightly off. So we round to 5 decimal places.
-					style[_transformProp] = "matrix(" + (((Math.cos(ang) * sx) | 0) / rnd) + "," + (((Math.sin(ang) * sx) | 0) / rnd) + "," + (((Math.sin(skew) * -sy) | 0) / rnd) + "," + (((Math.cos(skew) * sy) | 0) / rnd) + "," + t.x + "," + t.y + ")";
-				}
-			};
-
-		_registerComplexSpecialProp("transform,scale,scaleX,scaleY,scaleZ,x,y,z,rotation,rotationX,rotationY,rotationZ,skewX,skewY,shortRotation,shortRotationX,shortRotationY,shortRotationZ,transformOrigin,transformPerspective,directionalRotation,parseTransform,force3D,skewType", {parser:function(t, e, p, cssp, pt, plugin, vars) {
-			if (cssp._transform) { return pt; } //only need to parse the transform once, and only if the browser supports it.
-			var m1 = cssp._transform = _getTransform(t, _cs, true, vars.parseTransform),
-				style = t.style,
-				min = 0.000001,
-				i = _transformProps.length,
-				v = vars,
-				endRotations = {},
-				m2, skewY, copy, orig, has3D, hasChange, dr;
-			if (typeof(v.transform) === "string" && _transformProp) { //for values like transform:"rotate(60deg) scale(0.5, 0.8)"
-				copy = _tempDiv.style; //don't use the original target because it might be SVG in which case some browsers don't report computed style correctly.
-				copy[_transformProp] = v.transform;
-				copy.display = "block"; //if display is "none", the browser often refuses to report the transform properties correctly.
-				copy.position = "absolute";
-				_doc.body.appendChild(_tempDiv);
-				m2 = _getTransform(_tempDiv, null, false);
-				_doc.body.removeChild(_tempDiv);
-			} else if (typeof(v) === "object") { //for values like scaleX, scaleY, rotation, x, y, skewX, and skewY or transform:{...} (object)
-				m2 = {scaleX:_parseVal((v.scaleX != null) ? v.scaleX : v.scale, m1.scaleX),
-					scaleY:_parseVal((v.scaleY != null) ? v.scaleY : v.scale, m1.scaleY),
-					scaleZ:_parseVal(v.scaleZ, m1.scaleZ),
-					x:_parseVal(v.x, m1.x),
-					y:_parseVal(v.y, m1.y),
-					z:_parseVal(v.z, m1.z),
-					perspective:_parseVal(v.transformPerspective, m1.perspective)};
-				dr = v.directionalRotation;
-				if (dr != null) {
-					if (typeof(dr) === "object") {
-						for (copy in dr) {
-							v[copy] = dr[copy];
-						}
-					} else {
-						v.rotation = dr;
-					}
-				}
-				m2.rotation = _parseAngle(("rotation" in v) ? v.rotation : ("shortRotation" in v) ? v.shortRotation + "_short" : ("rotationZ" in v) ? v.rotationZ : m1.rotation, m1.rotation, "rotation", endRotations);
-				if (_supports3D) {
-					m2.rotationX = _parseAngle(("rotationX" in v) ? v.rotationX : ("shortRotationX" in v) ? v.shortRotationX + "_short" : m1.rotationX || 0, m1.rotationX, "rotationX", endRotations);
-					m2.rotationY = _parseAngle(("rotationY" in v) ? v.rotationY : ("shortRotationY" in v) ? v.shortRotationY + "_short" : m1.rotationY || 0, m1.rotationY, "rotationY", endRotations);
-				}
-				m2.skewX = (v.skewX == null) ? m1.skewX : _parseAngle(v.skewX, m1.skewX);
-
-				//note: for performance reasons, we combine all skewing into the skewX and rotation values, ignoring skewY but we must still record it so that we can discern how much of the overall skew is attributed to skewX vs. skewY. Otherwise, if the skewY would always act relative (tween skewY to 10deg, for example, multiple times and if we always combine things into skewX, we can't remember that skewY was 10 from last time). Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of -10 degrees.
-				m2.skewY = (v.skewY == null) ? m1.skewY : _parseAngle(v.skewY, m1.skewY);
-				if ((skewY = m2.skewY - m1.skewY)) {
-					m2.skewX += skewY;
-					m2.rotation += skewY;
-				}
-			}
-
-			if (_supports3D && v.force3D != null) {
-				m1.force3D = v.force3D;
-				hasChange = true;
-			}
-
-			m1.skewType = v.skewType || m1.skewType || CSSPlugin.defaultSkewType;
-
-			has3D = (m1.force3D || m1.z || m1.rotationX || m1.rotationY || m2.z || m2.rotationX || m2.rotationY || m2.perspective);
-			if (!has3D && v.scale != null) {
-				m2.scaleZ = 1; //no need to tween scaleZ.
-			}
-
-			while (--i > -1) {
-				p = _transformProps[i];
-				orig = m2[p] - m1[p];
-				if (orig > min || orig < -min || _forcePT[p] != null) {
-					hasChange = true;
-					pt = new CSSPropTween(m1, p, m1[p], orig, pt);
-					if (p in endRotations) {
-						pt.e = endRotations[p]; //directional rotations typically have compensated values during the tween, but we need to make sure they end at exactly what the user requested
-					}
-					pt.xs0 = 0; //ensures the value stays numeric in setRatio()
-					pt.plugin = plugin;
-					cssp._overwriteProps.push(pt.n);
-				}
-			}
-
-			orig = v.transformOrigin;
-			if (orig || (_supports3D && has3D && m1.zOrigin)) { //if anything 3D is happening and there's a transformOrigin with a z component that's non-zero, we must ensure that the transformOrigin's z-component is set to 0 so that we can manually do those calculations to get around Safari bugs. Even if the user didn't specifically define a "transformOrigin" in this particular tween (maybe they did it via css directly).
-				if (_transformProp) {
-					hasChange = true;
-					p = _transformOriginProp;
-					orig = (orig || _getStyle(t, p, _cs, false, "50% 50%")) + ""; //cast as string to avoid errors
-					pt = new CSSPropTween(style, p, 0, 0, pt, -1, "transformOrigin");
-					pt.b = style[p];
-					pt.plugin = plugin;
-					if (_supports3D) {
-						copy = m1.zOrigin;
-						orig = orig.split(" ");
-						m1.zOrigin = ((orig.length > 2 && !(copy !== 0 && orig[2] === "0px")) ? parseFloat(orig[2]) : copy) || 0; //Safari doesn't handle the z part of transformOrigin correctly, so we'll manually handle it in the _set3DTransformRatio() method.
-						pt.xs0 = pt.e = orig[0] + " " + (orig[1] || "50%") + " 0px"; //we must define a z value of 0px specifically otherwise iOS 5 Safari will stick with the old one (if one was defined)!
-						pt = new CSSPropTween(m1, "zOrigin", 0, 0, pt, -1, pt.n); //we must create a CSSPropTween for the _gsTransform.zOrigin so that it gets reset properly at the beginning if the tween runs backward (as opposed to just setting m1.zOrigin here)
-						pt.b = copy;
-						pt.xs0 = pt.e = m1.zOrigin;
-					} else {
-						pt.xs0 = pt.e = orig;
-					}
-
-				//for older versions of IE (6-8), we need to manually calculate things inside the setRatio() function. We record origin x and y (ox and oy) and whether or not the values are percentages (oxp and oyp).
-				} else {
-					_parsePosition(orig + "", m1);
-				}
-			}
-
-			if (hasChange) {
-				cssp._transformType = (has3D || this._transformType === 3) ? 3 : 2; //quicker than calling cssp._enableTransforms();
-			}
-			return pt;
-		}, prefix:true});
-
-		_registerComplexSpecialProp("boxShadow", {defaultValue:"0px 0px 0px 0px #999", prefix:true, color:true, multi:true, keyword:"inset"});
-
-		_registerComplexSpecialProp("borderRadius", {defaultValue:"0px", parser:function(t, e, p, cssp, pt, plugin) {
-			e = this.format(e);
-			var props = ["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],
-				style = t.style,
-				ea1, i, es2, bs2, bs, es, bn, en, w, h, esfx, bsfx, rel, hn, vn, em;
-			w = parseFloat(t.offsetWidth);
-			h = parseFloat(t.offsetHeight);
-			ea1 = e.split(" ");
-			for (i = 0; i < props.length; i++) { //if we're dealing with percentages, we must convert things separately for the horizontal and vertical axis!
-				if (this.p.indexOf("border")) { //older browsers used a prefix
-					props[i] = _checkPropPrefix(props[i]);
-				}
-				bs = bs2 = _getStyle(t, props[i], _cs, false, "0px");
-				if (bs.indexOf(" ") !== -1) {
-					bs2 = bs.split(" ");
-					bs = bs2[0];
-					bs2 = bs2[1];
-				}
-				es = es2 = ea1[i];
-				bn = parseFloat(bs);
-				bsfx = bs.substr((bn + "").length);
-				rel = (es.charAt(1) === "=");
-				if (rel) {
-					en = parseInt(es.charAt(0)+"1", 10);
-					es = es.substr(2);
-					en *= parseFloat(es);
-					esfx = es.substr((en + "").length - (en < 0 ? 1 : 0)) || "";
-				} else {
-					en = parseFloat(es);
-					esfx = es.substr((en + "").length);
-				}
-				if (esfx === "") {
-					esfx = _suffixMap[p] || bsfx;
-				}
-				if (esfx !== bsfx) {
-					hn = _convertToPixels(t, "borderLeft", bn, bsfx); //horizontal number (we use a bogus "borderLeft" property just because the _convertToPixels() method searches for the keywords "Left", "Right", "Top", and "Bottom" to determine of it's a horizontal or vertical property, and we need "border" in the name so that it knows it should measure relative to the element itself, not its parent.
-					vn = _convertToPixels(t, "borderTop", bn, bsfx); //vertical number
-					if (esfx === "%") {
-						bs = (hn / w * 100) + "%";
-						bs2 = (vn / h * 100) + "%";
-					} else if (esfx === "em") {
-						em = _convertToPixels(t, "borderLeft", 1, "em");
-						bs = (hn / em) + "em";
-						bs2 = (vn / em) + "em";
-					} else {
-						bs = hn + "px";
-						bs2 = vn + "px";
-					}
-					if (rel) {
-						es = (parseFloat(bs) + en) + esfx;
-						es2 = (parseFloat(bs2) + en) + esfx;
-					}
-				}
-				pt = _parseComplex(style, props[i], bs + " " + bs2, es + " " + es2, false, "0px", pt);
-			}
-			return pt;
-		}, prefix:true, formatter:_getFormatter("0px 0px 0px 0px", false, true)});
-		_registerComplexSpecialProp("backgroundPosition", {defaultValue:"0 0", parser:function(t, e, p, cssp, pt, plugin) {
-			var bp = "background-position",
-				cs = (_cs || _getComputedStyle(t, null)),
-				bs = this.format( ((cs) ? _ieVers ? cs.getPropertyValue(bp + "-x") + " " + cs.getPropertyValue(bp + "-y") : cs.getPropertyValue(bp) : t.currentStyle.backgroundPositionX + " " + t.currentStyle.backgroundPositionY) || "0 0"), //Internet Explorer doesn't report background-position correctly - we must query background-position-x and background-position-y and combine them (even in IE10). Before IE9, we must do the same with the currentStyle object and use camelCase
-				es = this.format(e),
-				ba, ea, i, pct, overlap, src;
-			if ((bs.indexOf("%") !== -1) !== (es.indexOf("%") !== -1)) {
-				src = _getStyle(t, "backgroundImage").replace(_urlExp, "");
-				if (src && src !== "none") {
-					ba = bs.split(" ");
-					ea = es.split(" ");
-					_tempImg.setAttribute("src", src); //set the temp <img>'s src to the background-image so that we can measure its width/height
-					i = 2;
-					while (--i > -1) {
-						bs = ba[i];
-						pct = (bs.indexOf("%") !== -1);
-						if (pct !== (ea[i].indexOf("%") !== -1)) {
-							overlap = (i === 0) ? t.offsetWidth - _tempImg.width : t.offsetHeight - _tempImg.height;
-							ba[i] = pct ? (parseFloat(bs) / 100 * overlap) + "px" : (parseFloat(bs) / overlap * 100) + "%";
-						}
-					}
-					bs = ba.join(" ");
-				}
-			}
-			return this.parseComplex(t.style, bs, es, pt, plugin);
-		}, formatter:_parsePosition});
-		_registerComplexSpecialProp("backgroundSize", {defaultValue:"0 0", formatter:_parsePosition});
-		_registerComplexSpecialProp("perspective", {defaultValue:"0px", prefix:true});
-		_registerComplexSpecialProp("perspectiveOrigin", {defaultValue:"50% 50%", prefix:true});
-		_registerComplexSpecialProp("transformStyle", {prefix:true});
-		_registerComplexSpecialProp("backfaceVisibility", {prefix:true});
-		_registerComplexSpecialProp("userSelect", {prefix:true});
-		_registerComplexSpecialProp("margin", {parser:_getEdgeParser("marginTop,marginRight,marginBottom,marginLeft")});
-		_registerComplexSpecialProp("padding", {parser:_getEdgeParser("paddingTop,paddingRight,paddingBottom,paddingLeft")});
-		_registerComplexSpecialProp("clip", {defaultValue:"rect(0px,0px,0px,0px)", parser:function(t, e, p, cssp, pt, plugin){
-			var b, cs, delim;
-			if (_ieVers < 9) { //IE8 and earlier don't report a "clip" value in the currentStyle - instead, the values are split apart into clipTop, clipRight, clipBottom, and clipLeft. Also, in IE7 and earlier, the values inside rect() are space-delimited, not comma-delimited.
-				cs = t.currentStyle;
-				delim = _ieVers < 8 ? " " : ",";
-				b = "rect(" + cs.clipTop + delim + cs.clipRight + delim + cs.clipBottom + delim + cs.clipLeft + ")";
-				e = this.format(e).split(",").join(delim);
-			} else {
-				b = this.format(_getStyle(t, this.p, _cs, false, this.dflt));
-				e = this.format(e);
-			}
-			return this.parseComplex(t.style, b, e, pt, plugin);
-		}});
-		_registerComplexSpecialProp("textShadow", {defaultValue:"0px 0px 0px #999", color:true, multi:true});
-		_registerComplexSpecialProp("autoRound,strictUnits", {parser:function(t, e, p, cssp, pt) {return pt;}}); //just so that we can ignore these properties (not tween them)
-		_registerComplexSpecialProp("border", {defaultValue:"0px solid #000", parser:function(t, e, p, cssp, pt, plugin) {
-				return this.parseComplex(t.style, this.format(_getStyle(t, "borderTopWidth", _cs, false, "0px") + " " + _getStyle(t, "borderTopStyle", _cs, false, "solid") + " " + _getStyle(t, "borderTopColor", _cs, false, "#000")), this.format(e), pt, plugin);
-			}, color:true, formatter:function(v) {
-				var a = v.split(" ");
-				return a[0] + " " + (a[1] || "solid") + " " + (v.match(_colorExp) || ["#000"])[0];
-			}});
-		_registerComplexSpecialProp("borderWidth", {parser:_getEdgeParser("borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth")}); //Firefox doesn't pick up on borderWidth set in style sheets (only inline).
-		_registerComplexSpecialProp("float,cssFloat,styleFloat", {parser:function(t, e, p, cssp, pt, plugin) {
-			var s = t.style,
-				prop = ("cssFloat" in s) ? "cssFloat" : "styleFloat";
-			return new CSSPropTween(s, prop, 0, 0, pt, -1, p, false, 0, s[prop], e);
-		}});
-
-		//opacity-related
-		var _setIEOpacityRatio = function(v) {
-				var t = this.t, //refers to the element's style property
-					filters = t.filter || _getStyle(this.data, "filter"),
-					val = (this.s + this.c * v) | 0,
-					skip;
-				if (val === 100) { //for older versions of IE that need to use a filter to apply opacity, we should remove the filter if opacity hits 1 in order to improve performance, but make sure there isn't a transform (matrix) or gradient in the filters.
-					if (filters.indexOf("atrix(") === -1 && filters.indexOf("radient(") === -1 && filters.indexOf("oader(") === -1) {
-						t.removeAttribute("filter");
-						skip = (!_getStyle(this.data, "filter")); //if a class is applied that has an alpha filter, it will take effect (we don't want that), so re-apply our alpha filter in that case. We must first remove it and then check.
-					} else {
-						t.filter = filters.replace(_alphaFilterExp, "");
-						skip = true;
-					}
-				}
-				if (!skip) {
-					if (this.xn1) {
-						t.filter = filters = filters || ("alpha(opacity=" + val + ")"); //works around bug in IE7/8 that prevents changes to "visibility" from being applied properly if the filter is changed to a different alpha on the same frame.
-					}
-					if (filters.indexOf("pacity") === -1) { //only used if browser doesn't support the standard opacity style property (IE 7 and 8). We omit the "O" to avoid case-sensitivity issues
-						if (val !== 0 || !this.xn1) { //bugs in IE7/8 won't render the filter properly if opacity is ADDED on the same frame/render as "visibility" changes (this.xn1 is 1 if this tween is an "autoAlpha" tween)
-							t.filter = filters + " alpha(opacity=" + val + ")"; //we round the value because otherwise, bugs in IE7/8 can prevent "visibility" changes from being applied properly.
-						}
-					} else {
-						t.filter = filters.replace(_opacityExp, "opacity=" + val);
-					}
-				}
-			};
-		_registerComplexSpecialProp("opacity,alpha,autoAlpha", {defaultValue:"1", parser:function(t, e, p, cssp, pt, plugin) {
-			var b = parseFloat(_getStyle(t, "opacity", _cs, false, "1")),
-				style = t.style,
-				isAutoAlpha = (p === "autoAlpha");
-			if (typeof(e) === "string" && e.charAt(1) === "=") {
-				e = ((e.charAt(0) === "-") ? -1 : 1) * parseFloat(e.substr(2)) + b;
-			}
-			if (isAutoAlpha && b === 1 && _getStyle(t, "visibility", _cs) === "hidden" && e !== 0) { //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience)
-				b = 0;
-			}
-			if (_supportsOpacity) {
-				pt = new CSSPropTween(style, "opacity", b, e - b, pt);
-			} else {
-				pt = new CSSPropTween(style, "opacity", b * 100, (e - b) * 100, pt);
-				pt.xn1 = isAutoAlpha ? 1 : 0; //we need to record whether or not this is an autoAlpha so that in the setRatio(), we know to duplicate the setting of the alpha in order to work around a bug in IE7 and IE8 that prevents changes to "visibility" from taking effect if the filter is changed to a different alpha(opacity) at the same time. Setting it to the SAME value first, then the new value works around the IE7/8 bug.
-				style.zoom = 1; //helps correct an IE issue.
-				pt.type = 2;
-				pt.b = "alpha(opacity=" + pt.s + ")";
-				pt.e = "alpha(opacity=" + (pt.s + pt.c) + ")";
-				pt.data = t;
-				pt.plugin = plugin;
-				pt.setRatio = _setIEOpacityRatio;
-			}
-			if (isAutoAlpha) { //we have to create the "visibility" PropTween after the opacity one in the linked list so that they run in the order that works properly in IE8 and earlier
-				pt = new CSSPropTween(style, "visibility", 0, 0, pt, -1, null, false, 0, ((b !== 0) ? "inherit" : "hidden"), ((e === 0) ? "hidden" : "inherit"));
-				pt.xs0 = "inherit";
-				cssp._overwriteProps.push(pt.n);
-				cssp._overwriteProps.push(p);
-			}
-			return pt;
-		}});
-
-
-		var _removeProp = function(s, p) {
-				if (p) {
-					if (s.removeProperty) {
-						if (p.substr(0,2) === "ms") { //Microsoft browsers don't conform to the standard of capping the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example)
-							p = "M" + p.substr(1);
-						}
-						s.removeProperty(p.replace(_capsExp, "-$1").toLowerCase());
-					} else { //note: old versions of IE use "removeAttribute()" instead of "removeProperty()"
-						s.removeAttribute(p);
-					}
-				}
-			},
-			_setClassNameRatio = function(v) {
-				this.t._gsClassPT = this;
-				if (v === 1 || v === 0) {
-					this.t.setAttribute("class", (v === 0) ? this.b : this.e);
-					var mpt = this.data, //first MiniPropTween
-						s = this.t.style;
-					while (mpt) {
-						if (!mpt.v) {
-							_removeProp(s, mpt.p);
-						} else {
-							s[mpt.p] = mpt.v;
-						}
-						mpt = mpt._next;
-					}
-					if (v === 1 && this.t._gsClassPT === this) {
-						this.t._gsClassPT = null;
-					}
-				} else if (this.t.getAttribute("class") !== this.e) {
-					this.t.setAttribute("class", this.e);
-				}
-			};
-		_registerComplexSpecialProp("className", {parser:function(t, e, p, cssp, pt, plugin, vars) {
-			var b = t.getAttribute("class") || "", //don't use t.className because it doesn't work consistently on SVG elements; getAttribute("class") and setAttribute("class", value") is more reliable.
-				cssText = t.style.cssText,
-				difData, bs, cnpt, cnptLookup, mpt;
-			pt = cssp._classNamePT = new CSSPropTween(t, p, 0, 0, pt, 2);
-			pt.setRatio = _setClassNameRatio;
-			pt.pr = -11;
-			_hasPriority = true;
-			pt.b = b;
-			bs = _getAllStyles(t, _cs);
-			//if there's a className tween already operating on the target, force it to its end so that the necessary inline styles are removed and the class name is applied before we determine the end state (we don't want inline styles interfering that were there just for class-specific values)
-			cnpt = t._gsClassPT;
-			if (cnpt) {
-				cnptLookup = {};
-				mpt = cnpt.data; //first MiniPropTween which stores the inline styles - we need to force these so that the inline styles don't contaminate things. Otherwise, there's a small chance that a tween could start and the inline values match the destination values and they never get cleaned.
-				while (mpt) {
-					cnptLookup[mpt.p] = 1;
-					mpt = mpt._next;
-				}
-				cnpt.setRatio(1);
-			}
-			t._gsClassPT = pt;
-			pt.e = (e.charAt(1) !== "=") ? e : b.replace(new RegExp("\\s*\\b" + e.substr(2) + "\\b"), "") + ((e.charAt(0) === "+") ? " " + e.substr(2) : "");
-			if (cssp._tween._duration) { //if it's a zero-duration tween, there's no need to tween anything or parse the data. In fact, if we switch classes temporarily (which we must do for proper parsing) and the class has a transition applied, it could cause a quick flash to the end state and back again initially in some browsers.
-				t.setAttribute("class", pt.e);
-				difData = _cssDif(t, bs, _getAllStyles(t), vars, cnptLookup);
-				t.setAttribute("class", b);
-				pt.data = difData.firstMPT;
-				t.style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).
-				pt = pt.xfirst = cssp.parse(t, difData.difs, pt, plugin); //we record the CSSPropTween as the xfirst so that we can handle overwriting propertly (if "className" gets overwritten, we must kill all the properties associated with the className part of the tween, so we can loop through from xfirst to the pt itself)
-			}
-			return pt;
-		}});
-
-
-		var _setClearPropsRatio = function(v) {
-			if (v === 1 || v === 0) if (this.data._totalTime === this.data._totalDuration && this.data.data !== "isFromStart") { //this.data refers to the tween. Only clear at the END of the tween (remember, from() tweens make the ratio go from 1 to 0, so we can't just check that and if the tween is the zero-duration one that's created internally to render the starting values in a from() tween, ignore that because otherwise, for example, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in).
-				var s = this.t.style,
-					transformParse = _specialProps.transform.parse,
-					a, p, i, clearTransform;
-				if (this.e === "all") {
-					s.cssText = "";
-					clearTransform = true;
-				} else {
-					a = this.e.split(",");
-					i = a.length;
-					while (--i > -1) {
-						p = a[i];
-						if (_specialProps[p]) {
-							if (_specialProps[p].parse === transformParse) {
-								clearTransform = true;
-							} else {
-								p = (p === "transformOrigin") ? _transformOriginProp : _specialProps[p].p; //ensures that special properties use the proper browser-specific property name, like "scaleX" might be "-webkit-transform" or "boxShadow" might be "-moz-box-shadow"
-							}
-						}
-						_removeProp(s, p);
-					}
-				}
-				if (clearTransform) {
-					_removeProp(s, _transformProp);
-					if (this.t._gsTransform) {
-						delete this.t._gsTransform;
-					}
-				}
-
-			}
-		};
-		_registerComplexSpecialProp("clearProps", {parser:function(t, e, p, cssp, pt) {
-			pt = new CSSPropTween(t, p, 0, 0, pt, 2);
-			pt.setRatio = _setClearPropsRatio;
-			pt.e = e;
-			pt.pr = -10;
-			pt.data = cssp._tween;
-			_hasPriority = true;
-			return pt;
-		}});
-
-		p = "bezier,throwProps,physicsProps,physics2D".split(",");
-		i = p.length;
-		while (i--) {
-			_registerPluginProp(p[i]);
-		}
-
-
-
-
-
-
-
-
-		p = CSSPlugin.prototype;
-		p._firstPT = null;
-
-		//gets called when the tween renders for the first time. This kicks everything off, recording start/end values, etc.
-		p._onInitTween = function(target, vars, tween) {
-			if (!target.nodeType) { //css is only for dom elements
-				return false;
-			}
-			this._target = target;
-			this._tween = tween;
-			this._vars = vars;
-			_autoRound = vars.autoRound;
-			_hasPriority = false;
-			_suffixMap = vars.suffixMap || CSSPlugin.suffixMap;
-			_cs = _getComputedStyle(target, "");
-			_overwriteProps = this._overwriteProps;
-			var style = target.style,
-				v, pt, pt2, first, last, next, zIndex, tpt, threeD;
-			if (_reqSafariFix) if (style.zIndex === "") {
-				v = _getStyle(target, "zIndex", _cs);
-				if (v === "auto" || v === "") {
-					//corrects a bug in [non-Android] Safari that prevents it from repainting elements in their new positions if they don't have a zIndex set. We also can't just apply this inside _parseTransform() because anything that's moved in any way (like using "left" or "top" instead of transforms like "x" and "y") can be affected, so it is best to ensure that anything that's tweening has a z-index. Setting "WebkitPerspective" to a non-zero value worked too except that on iOS Safari things would flicker randomly. Plus zIndex is less memory-intensive.
-					this._addLazySet(style, "zIndex", 0);
-				}
-			}
-
-			if (typeof(vars) === "string") {
-				first = style.cssText;
-				v = _getAllStyles(target, _cs);
-				style.cssText = first + ";" + vars;
-				v = _cssDif(target, v, _getAllStyles(target)).difs;
-				if (!_supportsOpacity && _opacityValExp.test(vars)) {
-					v.opacity = parseFloat( RegExp.$1 );
-				}
-				vars = v;
-				style.cssText = first;
-			}
-			this._firstPT = pt = this.parse(target, vars, null);
-
-			if (this._transformType) {
-				threeD = (this._transformType === 3);
-				if (!_transformProp) {
-					style.zoom = 1; //helps correct an IE issue.
-				} else if (_isSafari) {
-					_reqSafariFix = true;
-					//if zIndex isn't set, iOS Safari doesn't repaint things correctly sometimes (seemingly at random).
-					if (style.zIndex === "") {
-						zIndex = _getStyle(target, "zIndex", _cs);
-						if (zIndex === "auto" || zIndex === "") {
-							this._addLazySet(style, "zIndex", 0);
-						}
-					}
-					//Setting WebkitBackfaceVisibility corrects 3 bugs:
-					// 1) [non-Android] Safari skips rendering changes to "top" and "left" that are made on the same frame/render as a transform update.
-					// 2) iOS Safari sometimes neglects to repaint elements in their new positions. Setting "WebkitPerspective" to a non-zero value worked too except that on iOS Safari things would flicker randomly.
-					// 3) Safari sometimes displayed odd artifacts when tweening the transform (or WebkitTransform) property, like ghosts of the edges of the element remained. Definitely a browser bug.
-					//Note: we allow the user to override the auto-setting by defining WebkitBackfaceVisibility in the vars of the tween.
-					if (_isSafariLT6) {
-						this._addLazySet(style, "WebkitBackfaceVisibility", this._vars.WebkitBackfaceVisibility || (threeD ? "visible" : "hidden"));
-					}
-				}
-				pt2 = pt;
-				while (pt2 && pt2._next) {
-					pt2 = pt2._next;
-				}
-				tpt = new CSSPropTween(target, "transform", 0, 0, null, 2);
-				this._linkCSSP(tpt, null, pt2);
-				tpt.setRatio = (threeD && _supports3D) ? _set3DTransformRatio : _transformProp ? _set2DTransformRatio : _setIETransformRatio;
-				tpt.data = this._transform || _getTransform(target, _cs, true);
-				_overwriteProps.pop(); //we don't want to force the overwrite of all "transform" tweens of the target - we only care about individual transform properties like scaleX, rotation, etc. The CSSPropTween constructor automatically adds the property to _overwriteProps which is why we need to pop() here.
-			}
-
-			if (_hasPriority) {
-				//reorders the linked list in order of pr (priority)
-				while (pt) {
-					next = pt._next;
-					pt2 = first;
-					while (pt2 && pt2.pr > pt.pr) {
-						pt2 = pt2._next;
-					}
-					if ((pt._prev = pt2 ? pt2._prev : last)) {
-						pt._prev._next = pt;
-					} else {
-						first = pt;
-					}
-					if ((pt._next = pt2)) {
-						pt2._prev = pt;
-					} else {
-						last = pt;
-					}
-					pt = next;
-				}
-				this._firstPT = first;
-			}
-			return true;
-		};
-
-
-		p.parse = function(target, vars, pt, plugin) {
-			var style = target.style,
-				p, sp, bn, en, bs, es, bsfx, esfx, isStr, rel;
-			for (p in vars) {
-				es = vars[p]; //ending value string
-				sp = _specialProps[p]; //SpecialProp lookup.
-				if (sp) {
-					pt = sp.parse(target, es, p, this, pt, plugin, vars);
-
-				} else {
-					bs = _getStyle(target, p, _cs) + "";
-					isStr = (typeof(es) === "string");
-					if (p === "color" || p === "fill" || p === "stroke" || p.indexOf("Color") !== -1 || (isStr && _rgbhslExp.test(es))) { //Opera uses background: to define color sometimes in addition to backgroundColor:
-						if (!isStr) {
-							es = _parseColor(es);
-							es = ((es.length > 3) ? "rgba(" : "rgb(") + es.join(",") + ")";
-						}
-						pt = _parseComplex(style, p, bs, es, true, "transparent", pt, 0, plugin);
-
-					} else if (isStr && (es.indexOf(" ") !== -1 || es.indexOf(",") !== -1)) {
-						pt = _parseComplex(style, p, bs, es, true, null, pt, 0, plugin);
-
-					} else {
-						bn = parseFloat(bs);
-						bsfx = (bn || bn === 0) ? bs.substr((bn + "").length) : ""; //remember, bs could be non-numeric like "normal" for fontWeight, so we should default to a blank suffix in that case.
-
-						if (bs === "" || bs === "auto") {
-							if (p === "width" || p === "height") {
-								bn = _getDimension(target, p, _cs);
-								bsfx = "px";
-							} else if (p === "left" || p === "top") {
-								bn = _calculateOffset(target, p, _cs);
-								bsfx = "px";
-							} else {
-								bn = (p !== "opacity") ? 0 : 1;
-								bsfx = "";
-							}
-						}
-
-						rel = (isStr && es.charAt(1) === "=");
-						if (rel) {
-							en = parseInt(es.charAt(0) + "1", 10);
-							es = es.substr(2);
-							en *= parseFloat(es);
-							esfx = es.replace(_suffixExp, "");
-						} else {
-							en = parseFloat(es);
-							esfx = isStr ? es.substr((en + "").length) || "" : "";
-						}
-
-						if (esfx === "") {
-							esfx = (p in _suffixMap) ? _suffixMap[p] : bsfx; //populate the end suffix, prioritizing the map, then if none is found, use the beginning suffix.
-						}
-
-						es = (en || en === 0) ? (rel ? en + bn : en) + esfx : vars[p]; //ensures that any += or -= prefixes are taken care of. Record the end value before normalizing the suffix because we always want to end the tween on exactly what they intended even if it doesn't match the beginning value's suffix.
-
-						//if the beginning/ending suffixes don't match, normalize them...
-						if (bsfx !== esfx) if (esfx !== "") if (en || en === 0) if (bn) { //note: if the beginning value (bn) is 0, we don't need to convert units!
-							bn = _convertToPixels(target, p, bn, bsfx);
-							if (esfx === "%") {
-								bn /= _convertToPixels(target, p, 100, "%") / 100;
-								if (vars.strictUnits !== true) { //some browsers report only "px" values instead of allowing "%" with getComputedStyle(), so we assume that if we're tweening to a %, we should start there too unless strictUnits:true is defined. This approach is particularly useful for responsive designs that use from() tweens.
-									bs = bn + "%";
-								}
-
-							} else if (esfx === "em") {
-								bn /= _convertToPixels(target, p, 1, "em");
-
-							//otherwise convert to pixels.
-							} else if (esfx !== "px") {
-								en = _convertToPixels(target, p, en, esfx);
-								esfx = "px"; //we don't use bsfx after this, so we don't need to set it to px too.
-							}
-							if (rel) if (en || en === 0) {
-								es = (en + bn) + esfx; //the changes we made affect relative calculations, so adjust the end value here.
-							}
-						}
-
-						if (rel) {
-							en += bn;
-						}
-
-						if ((bn || bn === 0) && (en || en === 0)) { //faster than isNaN(). Also, previously we required en !== bn but that doesn't really gain much performance and it prevents _parseToProxy() from working properly if beginning and ending values match but need to get tweened by an external plugin anyway. For example, a bezier tween where the target starts at left:0 and has these points: [{left:50},{left:0}] wouldn't work properly because when parsing the last point, it'd match the first (current) one and a non-tweening CSSPropTween would be recorded when we actually need a normal tween (type:0) so that things get updated during the tween properly.
-							pt = new CSSPropTween(style, p, bn, en - bn, pt, 0, p, (_autoRound !== false && (esfx === "px" || p === "zIndex")), 0, bs, es);
-							pt.xs0 = esfx;
-							//DEBUG: _log("tween "+p+" from "+pt.b+" ("+bn+esfx+") to "+pt.e+" with suffix: "+pt.xs0);
-						} else if (style[p] === undefined || !es && (es + "" === "NaN" || es == null)) {
-							_log("invalid " + p + " tween value: " + vars[p]);
-						} else {
-							pt = new CSSPropTween(style, p, en || bn || 0, 0, pt, -1, p, false, 0, bs, es);
-							pt.xs0 = (es === "none" && (p === "display" || p.indexOf("Style") !== -1)) ? bs : es; //intermediate value should typically be set immediately (end value) except for "display" or things like borderTopStyle, borderBottomStyle, etc. which should use the beginning value during the tween.
-							//DEBUG: _log("non-tweening value "+p+": "+pt.xs0);
-						}
-					}
-				}
-				if (plugin) if (pt && !pt.plugin) {
-					pt.plugin = plugin;
-				}
-			}
-			return pt;
-		};
-
-
-		//gets called every time the tween updates, passing the new ratio (typically a value between 0 and 1, but not always (for example, if an Elastic.easeOut is used, the value can jump above 1 mid-tween). It will always start and 0 and end at 1.
-		p.setRatio = function(v) {
-			var pt = this._firstPT,
-				min = 0.000001,
-				val, str, i;
-
-			//at the end of the tween, we set the values to exactly what we received in order to make sure non-tweening values (like "position" or "float" or whatever) are set and so that if the beginning/ending suffixes (units) didn't match and we normalized to px, the value that the user passed in is used here. We check to see if the tween is at its beginning in case it's a from() tween in which case the ratio will actually go from 1 to 0 over the course of the tween (backwards).
-			if (v === 1 && (this._tween._time === this._tween._duration || this._tween._time === 0)) {
-				while (pt) {
-					if (pt.type !== 2) {
-						pt.t[pt.p] = pt.e;
-					} else {
-						pt.setRatio(v);
-					}
-					pt = pt._next;
-				}
-
-			} else if (v || !(this._tween._time === this._tween._duration || this._tween._time === 0) || this._tween._rawPrevTime === -0.000001) {
-				while (pt) {
-					val = pt.c * v + pt.s;
-					if (pt.r) {
-						val = Math.round(val);
-					} else if (val < min) if (val > -min) {
-						val = 0;
-					}
-					if (!pt.type) {
-						pt.t[pt.p] = val + pt.xs0;
-					} else if (pt.type === 1) { //complex value (one that typically has multiple numbers inside a string, like "rect(5px,10px,20px,25px)"
-						i = pt.l;
-						if (i === 2) {
-							pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2;
-						} else if (i === 3) {
-							pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2 + pt.xn2 + pt.xs3;
-						} else if (i === 4) {
-							pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2 + pt.xn2 + pt.xs3 + pt.xn3 + pt.xs4;
-						} else if (i === 5) {
-							pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2 + pt.xn2 + pt.xs3 + pt.xn3 + pt.xs4 + pt.xn4 + pt.xs5;
-						} else {
-							str = pt.xs0 + val + pt.xs1;
-							for (i = 1; i < pt.l; i++) {
-								str += pt["xn"+i] + pt["xs"+(i+1)];
-							}
-							pt.t[pt.p] = str;
-						}
-
-					} else if (pt.type === -1) { //non-tweening value
-						pt.t[pt.p] = pt.xs0;
-
-					} else if (pt.setRatio) { //custom setRatio() for things like SpecialProps, external plugins, etc.
-						pt.setRatio(v);
-					}
-					pt = pt._next;
-				}
-
-			//if the tween is reversed all the way back to the beginning, we need to restore the original values which may have different units (like % instead of px or em or whatever).
-			} else {
-				while (pt) {
-					if (pt.type !== 2) {
-						pt.t[pt.p] = pt.b;
-					} else {
-						pt.setRatio(v);
-					}
-					pt = pt._next;
-				}
-			}
-		};
-
-		/**
-		 * @private
-		 * Forces rendering of the target's transforms (rotation, scale, etc.) whenever the CSSPlugin's setRatio() is called.
-		 * Basically, this tells the CSSPlugin to create a CSSPropTween (type 2) after instantiation that runs last in the linked
-		 * list and calls the appropriate (3D or 2D) rendering function. We separate this into its own method so that we can call
-		 * it from other plugins like BezierPlugin if, for example, it needs to apply an autoRotation and this CSSPlugin
-		 * doesn't have any transform-related properties of its own. You can call this method as many times as you
-		 * want and it won't create duplicate CSSPropTweens.
-		 *
-		 * @param {boolean} threeD if true, it should apply 3D tweens (otherwise, just 2D ones are fine and typically faster)
-		 */
-		p._enableTransforms = function(threeD) {
-			this._transformType = (threeD || this._transformType === 3) ? 3 : 2;
-			this._transform = this._transform || _getTransform(this._target, _cs, true); //ensures that the element has a _gsTransform property with the appropriate values.
-		};
-
-		var lazySet = function(v) {
-			this.t[this.p] = this.e;
-			this.data._linkCSSP(this, this._next, null, true); //we purposefully keep this._next even though it'd make sense to null it, but this is a performance optimization, as this happens during the while (pt) {} loop in setRatio() at the bottom of which it sets pt = pt._next, so if we null it, the linked list will be broken in that loop.
-		};
-		/** @private Gives us a way to set a value on the first render (and only the first render). **/
-		p._addLazySet = function(t, p, v) {
-			var pt = this._firstPT = new CSSPropTween(t, p, 0, 0, this._firstPT, 2);
-			pt.e = v;
-			pt.setRatio = lazySet;
-			pt.data = this;
-		};
-
-		/** @private **/
-		p._linkCSSP = function(pt, next, prev, remove) {
-			if (pt) {
-				if (next) {
-					next._prev = pt;
-				}
-				if (pt._next) {
-					pt._next._prev = pt._prev;
-				}
-				if (pt._prev) {
-					pt._prev._next = pt._next;
-				} else if (this._firstPT === pt) {
-					this._firstPT = pt._next;
-					remove = true; //just to prevent resetting this._firstPT 5 lines down in case pt._next is null. (optimized for speed)
-				}
-				if (prev) {
-					prev._next = pt;
-				} else if (!remove && this._firstPT === null) {
-					this._firstPT = pt;
-				}
-				pt._next = next;
-				pt._prev = prev;
-			}
-			return pt;
-		};
-
-		//we need to make sure that if alpha or autoAlpha is killed, opacity is too. And autoAlpha affects the "visibility" property.
-		p._kill = function(lookup) {
-			var copy = lookup,
-				pt, p, xfirst;
-			if (lookup.autoAlpha || lookup.alpha) {
-				copy = {};
-				for (p in lookup) { //copy the lookup so that we're not changing the original which may be passed elsewhere.
-					copy[p] = lookup[p];
-				}
-				copy.opacity = 1;
-				if (copy.autoAlpha) {
-					copy.visibility = 1;
-				}
-			}
-			if (lookup.className && (pt = this._classNamePT)) { //for className tweens, we need to kill any associated CSSPropTweens too; a linked list starts at the className's "xfirst".
-				xfirst = pt.xfirst;
-				if (xfirst && xfirst._prev) {
-					this._linkCSSP(xfirst._prev, pt._next, xfirst._prev._prev); //break off the prev
-				} else if (xfirst === this._firstPT) {
-					this._firstPT = pt._next;
-				}
-				if (pt._next) {
-					this._linkCSSP(pt._next, pt._next._next, xfirst._prev);
-				}
-				this._classNamePT = null;
-			}
-			return TweenPlugin.prototype._kill.call(this, copy);
-		};
-
-
-
-		//used by cascadeTo() for gathering all the style properties of each child element into an array for comparison.
-		var _getChildStyles = function(e, props, targets) {
-				var children, i, child, type;
-				if (e.slice) {
-					i = e.length;
-					while (--i > -1) {
-						_getChildStyles(e[i], props, targets);
-					}
-					return;
-				}
-				children = e.childNodes;
-				i = children.length;
-				while (--i > -1) {
-					child = children[i];
-					type = child.type;
-					if (child.style) {
-						props.push(_getAllStyles(child));
-						if (targets) {
-							targets.push(child);
-						}
-					}
-					if ((type === 1 || type === 9 || type === 11) && child.childNodes.length) {
-						_getChildStyles(child, props, targets);
-					}
-				}
-			};
-
-		/**
-		 * Typically only useful for className tweens that may affect child elements, this method creates a TweenLite
-		 * and then compares the style properties of all the target's child elements at the tween's start and end, and
-		 * if any are different, it also creates tweens for those and returns an array containing ALL of the resulting
-		 * tweens (so that you can easily add() them to a TimelineLite, for example). The reason this functionality is
-		 * wrapped into a separate static method of CSSPlugin instead of being integrated into all regular className tweens
-		 * is because it creates entirely new tweens that may have completely different targets than the original tween,
-		 * so if they were all lumped into the original tween instance, it would be inconsistent with the rest of the API
-		 * and it would create other problems. For example:
-		 *  - If I create a tween of elementA, that tween instance may suddenly change its target to include 50 other elements (unintuitive if I specifically defined the target I wanted)
-		 *  - We can't just create new independent tweens because otherwise, what happens if the original/parent tween is reversed or pause or dropped into a TimelineLite for tight control? You'd expect that tween's behavior to affect all the others.
-		 *  - Analyzing every style property of every child before and after the tween is an expensive operation when there are many children, so this behavior shouldn't be imposed on all className tweens by default, especially since it's probably rare that this extra functionality is needed.
-		 *
-		 * @param {Object} target object to be tweened
-		 * @param {number} Duration in seconds (or frames for frames-based tweens)
-		 * @param {Object} Object containing the end values, like {className:"newClass", ease:Linear.easeNone}
-		 * @return {Array} An array of TweenLite instances
-		 */
-		CSSPlugin.cascadeTo = function(target, duration, vars) {
-			var tween = TweenLite.to(target, duration, vars),
-				results = [tween],
-				b = [],
-				e = [],
-				targets = [],
-				_reservedProps = TweenLite._internals.reservedProps,
-				i, difs, p;
-			target = tween._targets || tween.target;
-			_getChildStyles(target, b, targets);
-			tween.render(duration, true);
-			_getChildStyles(target, e);
-			tween.render(0, true);
-			tween._enabled(true);
-			i = targets.length;
-			while (--i > -1) {
-				difs = _cssDif(targets[i], b[i], e[i]);
-				if (difs.firstMPT) {
-					difs = difs.difs;
-					for (p in vars) {
-						if (_reservedProps[p]) {
-							difs[p] = vars[p];
-						}
-					}
-					results.push( TweenLite.to(targets[i], duration, difs) );
-				}
-			}
-			return results;
-		};
-
-		TweenPlugin.activate([CSSPlugin]);
-		return CSSPlugin;
-
-	}, true);
-
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-/*
- * ----------------------------------------------------------------
- * RoundPropsPlugin
- * ----------------------------------------------------------------
- */
-	(function() {
-
-		var RoundPropsPlugin = window._gsDefine.plugin({
-				propName: "roundProps",
-				priority: -1,
-				API: 2,
-
-				//called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
-				init: function(target, value, tween) {
-					this._tween = tween;
-					return true;
-				}
-
-			}),
-			p = RoundPropsPlugin.prototype;
-
-		p._onInitAllProps = function() {
-			var tween = this._tween,
-				rp = (tween.vars.roundProps instanceof Array) ? tween.vars.roundProps : tween.vars.roundProps.split(","),
-				i = rp.length,
-				lookup = {},
-				rpt = tween._propLookup.roundProps,
-				prop, pt, next;
-			while (--i > -1) {
-				lookup[rp[i]] = 1;
-			}
-			i = rp.length;
-			while (--i > -1) {
-				prop = rp[i];
-				pt = tween._firstPT;
-				while (pt) {
-					next = pt._next; //record here, because it may get removed
-					if (pt.pg) {
-						pt.t._roundProps(lookup, true);
-					} else if (pt.n === prop) {
-						this._add(pt.t, prop, pt.s, pt.c);
-						//remove from linked list
-						if (next) {
-							next._prev = pt._prev;
-						}
-						if (pt._prev) {
-							pt._prev._next = next;
-						} else if (tween._firstPT === pt) {
-							tween._firstPT = next;
-						}
-						pt._next = pt._prev = null;
-						tween._propLookup[prop] = rpt;
-					}
-					pt = next;
-				}
-			}
-			return false;
-		};
-
-		p._add = function(target, p, s, c) {
-			this._addTween(target, p, s, s + c, p, true);
-			this._overwriteProps.push(p);
-		};
-
-	}());
-
-
-
-
-
-
-
-
-
-
-/*
- * ----------------------------------------------------------------
- * AttrPlugin
- * ----------------------------------------------------------------
- */
-	window._gsDefine.plugin({
-		propName: "attr",
-		API: 2,
-		version: "0.3.2",
-
-		//called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
-		init: function(target, value, tween) {
-			var p, start, end;
-			if (typeof(target.setAttribute) !== "function") {
-				return false;
-			}
-			this._target = target;
-			this._proxy = {};
-			this._start = {}; // we record start and end values exactly as they are in case they're strings (not numbers) - we need to be able to revert to them cleanly.
-			this._end = {};
-			for (p in value) {
-				this._start[p] = this._proxy[p] = start = target.getAttribute(p);
-				end = this._addTween(this._proxy, p, parseFloat(start), value[p], p);
-				this._end[p] = end ? end.s + end.c : value[p];
-				this._overwriteProps.push(p);
-			}
-			return true;
-		},
-
-		//called each time the values should be updated, and the ratio gets passed as the only parameter (typically it's a value between 0 and 1, but it can exceed those when using an ease like Elastic.easeOut or Back.easeOut, etc.)
-		set: function(ratio) {
-			this._super.setRatio.call(this, ratio);
-			var props = this._overwriteProps,
-				i = props.length,
-				lookup = (ratio === 1) ? this._end : ratio ? this._proxy : this._start,
-				p;
-			while (--i > -1) {
-				p = props[i];
-				this._target.setAttribute(p, lookup[p] + "");
-			}
-		}
-
-	});
-
-
-
-
-
-
-
-
-
-
-/*
- * ----------------------------------------------------------------
- * DirectionalRotationPlugin
- * ----------------------------------------------------------------
- */
-	window._gsDefine.plugin({
-		propName: "directionalRotation",
-		API: 2,
-		version: "0.2.0",
-
-		//called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
-		init: function(target, value, tween) {
-			if (typeof(value) !== "object") {
-				value = {rotation:value};
-			}
-			this.finals = {};
-			var cap = (value.useRadians === true) ? Math.PI * 2 : 360,
-				min = 0.000001,
-				p, v, start, end, dif, split;
-			for (p in value) {
-				if (p !== "useRadians") {
-					split = (value[p] + "").split("_");
-					v = split[0];
-					start = parseFloat( (typeof(target[p]) !== "function") ? target[p] : target[ ((p.indexOf("set") || typeof(target["get" + p.substr(3)]) !== "function") ? p : "get" + p.substr(3)) ]() );
-					end = this.finals[p] = (typeof(v) === "string" && v.charAt(1) === "=") ? start + parseInt(v.charAt(0) + "1", 10) * Number(v.substr(2)) : Number(v) || 0;
-					dif = end - start;
-					if (split.length) {
-						v = split.join("_");
-						if (v.indexOf("short") !== -1) {
-							dif = dif % cap;
-							if (dif !== dif % (cap / 2)) {
-								dif = (dif < 0) ? dif + cap : dif - cap;
-							}
-						}
-						if (v.indexOf("_cw") !== -1 && dif < 0) {
-							dif = ((dif + cap * 9999999999) % cap) - ((dif / cap) | 0) * cap;
-						} else if (v.indexOf("ccw") !== -1 && dif > 0) {
-							dif = ((dif - cap * 9999999999) % cap) - ((dif / cap) | 0) * cap;
-						}
-					}
-					if (dif > min || dif < -min) {
-						this._addTween(target, p, start, start + dif, p);
-						this._overwriteProps.push(p);
-					}
-				}
-			}
-			return true;
-		},
-
-		//called each time the values should be updated, and the ratio gets passed as the only parameter (typically it's a value between 0 and 1, but it can exceed those when using an ease like Elastic.easeOut or Back.easeOut, etc.)
-		set: function(ratio) {
-			var pt;
-			if (ratio !== 1) {
-				this._super.setRatio.call(this, ratio);
-			} else {
-				pt = this._firstPT;
-				while (pt) {
-					if (pt.f) {
-						pt.t[pt.p](this.finals[pt.p]);
-					} else {
-						pt.t[pt.p] = this.finals[pt.p];
-					}
-					pt = pt._next;
-				}
-			}
-		}
-
-	})._autoCSS = true;
-
-
-
-
-
-
-
-	
-	
-	
-	
-/*
- * ----------------------------------------------------------------
- * EasePack
- * ----------------------------------------------------------------
- */
-	window._gsDefine("easing.Back", ["easing.Ease"], function(Ease) {
-		
-		var w = (window.GreenSockGlobals || window),
-			gs = w.com.greensock,
-			_2PI = Math.PI * 2,
-			_HALF_PI = Math.PI / 2,
-			_class = gs._class,
-			_create = function(n, f) {
-				var C = _class("easing." + n, function(){}, true),
-					p = C.prototype = new Ease();
-				p.constructor = C;
-				p.getRatio = f;
-				return C;
-			},
-			_easeReg = Ease.register || function(){}, //put an empty function in place just as a safety measure in case someone loads an OLD version of TweenLite.js where Ease.register doesn't exist.
-			_wrap = function(name, EaseOut, EaseIn, EaseInOut, aliases) {
-				var C = _class("easing."+name, {
-					easeOut:new EaseOut(),
-					easeIn:new EaseIn(),
-					easeInOut:new EaseInOut()
-				}, true);
-				_easeReg(C, name);
-				return C;
-			},
-			EasePoint = function(time, value, next) {
-				this.t = time;
-				this.v = value;
-				if (next) {
-					this.next = next;
-					next.prev = this;
-					this.c = next.v - value;
-					this.gap = next.t - time;
-				}
-			},
-
-			//Back
-			_createBack = function(n, f) {
-				var C = _class("easing." + n, function(overshoot) {
-						this._p1 = (overshoot || overshoot === 0) ? overshoot : 1.70158;
-						this._p2 = this._p1 * 1.525;
-					}, true),
-					p = C.prototype = new Ease();
-				p.constructor = C;
-				p.getRatio = f;
-				p.config = function(overshoot) {
-					return new C(overshoot);
-				};
-				return C;
-			},
-
-			Back = _wrap("Back",
-				_createBack("BackOut", function(p) {
-					return ((p = p - 1) * p * ((this._p1 + 1) * p + this._p1) + 1);
-				}),
-				_createBack("BackIn", function(p) {
-					return p * p * ((this._p1 + 1) * p - this._p1);
-				}),
-				_createBack("BackInOut", function(p) {
-					return ((p *= 2) < 1) ? 0.5 * p * p * ((this._p2 + 1) * p - this._p2) : 0.5 * ((p -= 2) * p * ((this._p2 + 1) * p + this._p2) + 2);
-				})
-			),
-
-
-			//SlowMo
-			SlowMo = _class("easing.SlowMo", function(linearRatio, power, yoyoMode) {
-				power = (power || power === 0) ? power : 0.7;
-				if (linearRatio == null) {
-					linearRatio = 0.7;
-				} else if (linearRatio > 1) {
-					linearRatio = 1;
-				}
-				this._p = (linearRatio !== 1) ? power : 0;
-				this._p1 = (1 - linearRatio) / 2;
-				this._p2 = linearRatio;
-				this._p3 = this._p1 + this._p2;
-				this._calcEnd = (yoyoMode === true);
-			}, true),
-			p = SlowMo.prototype = new Ease(),
-			SteppedEase, RoughEase, _createElastic;
-
-		p.constructor = SlowMo;
-		p.getRatio = function(p) {
-			var r = p + (0.5 - p) * this._p;
-			if (p < this._p1) {
-				return this._calcEnd ? 1 - ((p = 1 - (p / this._p1)) * p) : r - ((p = 1 - (p / this._p1)) * p * p * p * r);
-			} else if (p > this._p3) {
-				return this._calcEnd ? 1 - (p = (p - this._p3) / this._p1) * p : r + ((p - r) * (p = (p - this._p3) / this._p1) * p * p * p);
-			}
-			return this._calcEnd ? 1 : r;
-		};
-		SlowMo.ease = new SlowMo(0.7, 0.7);
-
-		p.config = SlowMo.config = function(linearRatio, power, yoyoMode) {
-			return new SlowMo(linearRatio, power, yoyoMode);
-		};
-
-
-		//SteppedEase
-		SteppedEase = _class("easing.SteppedEase", function(steps) {
-				steps = steps || 1;
-				this._p1 = 1 / steps;
-				this._p2 = steps + 1;
-			}, true);
-		p = SteppedEase.prototype = new Ease();
-		p.constructor = SteppedEase;
-		p.getRatio = function(p) {
-			if (p < 0) {
-				p = 0;
-			} else if (p >= 1) {
-				p = 0.999999999;
-			}
-			return ((this._p2 * p) >> 0) * this._p1;
-		};
-		p.config = SteppedEase.config = function(steps) {
-			return new SteppedEase(steps);
-		};
-
-
-		//RoughEase
-		RoughEase = _class("easing.RoughEase", function(vars) {
-			vars = vars || {};
-			var taper = vars.taper || "none",
-				a = [],
-				cnt = 0,
-				points = (vars.points || 20) | 0,
-				i = points,
-				randomize = (vars.randomize !== false),
-				clamp = (vars.clamp === true),
-				template = (vars.template instanceof Ease) ? vars.template : null,
-				strength = (typeof(vars.strength) === "number") ? vars.strength * 0.4 : 0.4,
-				x, y, bump, invX, obj, pnt;
-			while (--i > -1) {
-				x = randomize ? Math.random() : (1 / points) * i;
-				y = template ? template.getRatio(x) : x;
-				if (taper === "none") {
-					bump = strength;
-				} else if (taper === "out") {
-					invX = 1 - x;
-					bump = invX * invX * strength;
-				} else if (taper === "in") {
-					bump = x * x * strength;
-				} else if (x < 0.5) {  //"both" (start)
-					invX = x * 2;
-					bump = invX * invX * 0.5 * strength;
-				} else {				//"both" (end)
-					invX = (1 - x) * 2;
-					bump = invX * invX * 0.5 * strength;
-				}
-				if (randomize) {
-					y += (Math.random() * bump) - (bump * 0.5);
-				} else if (i % 2) {
-					y += bump * 0.5;
-				} else {
-					y -= bump * 0.5;
-				}
-				if (clamp) {
-					if (y > 1) {
-						y = 1;
-					} else if (y < 0) {
-						y = 0;
-					}
-				}
-				a[cnt++] = {x:x, y:y};
-			}
-			a.sort(function(a, b) {
-				return a.x - b.x;
-			});
-
-			pnt = new EasePoint(1, 1, null);
-			i = points;
-			while (--i > -1) {
-				obj = a[i];
-				pnt = new EasePoint(obj.x, obj.y, pnt);
-			}
-
-			this._prev = new EasePoint(0, 0, (pnt.t !== 0) ? pnt : pnt.next);
-		}, true);
-		p = RoughEase.prototype = new Ease();
-		p.constructor = RoughEase;
-		p.getRatio = function(p) {
-			var pnt = this._prev;
-			if (p > pnt.t) {
-				while (pnt.next && p >= pnt.t) {
-					pnt = pnt.next;
-				}
-				pnt = pnt.prev;
-			} else {
-				while (pnt.prev && p <= pnt.t) {
-					pnt = pnt.prev;
-				}
-			}
-			this._prev = pnt;
-			return (pnt.v + ((p - pnt.t) / pnt.gap) * pnt.c);
-		};
-		p.config = function(vars) {
-			return new RoughEase(vars);
-		};
-		RoughEase.ease = new RoughEase();
-
-
-		//Bounce
-		_wrap("Bounce",
-			_create("BounceOut", function(p) {
-				if (p < 1 / 2.75) {
-					return 7.5625 * p * p;
-				} else if (p < 2 / 2.75) {
-					return 7.5625 * (p -= 1.5 / 2.75) * p + 0.75;
-				} else if (p < 2.5 / 2.75) {
-					return 7.5625 * (p -= 2.25 / 2.75) * p + 0.9375;
-				}
-				return 7.5625 * (p -= 2.625 / 2.75) * p + 0.984375;
-			}),
-			_create("BounceIn", function(p) {
-				if ((p = 1 - p) < 1 / 2.75) {
-					return 1 - (7.5625 * p * p);
-				} else if (p < 2 / 2.75) {
-					return 1 - (7.5625 * (p -= 1.5 / 2.75) * p + 0.75);
-				} else if (p < 2.5 / 2.75) {
-					return 1 - (7.5625 * (p -= 2.25 / 2.75) * p + 0.9375);
-				}
-				return 1 - (7.5625 * (p -= 2.625 / 2.75) * p + 0.984375);
-			}),
-			_create("BounceInOut", function(p) {
-				var invert = (p < 0.5);
-				if (invert) {
-					p = 1 - (p * 2);
-				} else {
-					p = (p * 2) - 1;
-				}
-				if (p < 1 / 2.75) {
-					p = 7.5625 * p * p;
-				} else if (p < 2 / 2.75) {
-					p = 7.5625 * (p -= 1.5 / 2.75) * p + 0.75;
-				} else if (p < 2.5 / 2.75) {
-					p = 7.5625 * (p -= 2.25 / 2.75) * p + 0.9375;
-				} else {
-					p = 7.5625 * (p -= 2.625 / 2.75) * p + 0.984375;
-				}
-				return invert ? (1 - p) * 0.5 : p * 0.5 + 0.5;
-			})
-		);
-
-
-		//CIRC
-		_wrap("Circ",
-			_create("CircOut", function(p) {
-				return Math.sqrt(1 - (p = p - 1) * p);
-			}),
-			_create("CircIn", function(p) {
-				return -(Math.sqrt(1 - (p * p)) - 1);
-			}),
-			_create("CircInOut", function(p) {
-				return ((p*=2) < 1) ? -0.5 * (Math.sqrt(1 - p * p) - 1) : 0.5 * (Math.sqrt(1 - (p -= 2) * p) + 1);
-			})
-		);
-
-
-		//Elastic
-		_createElastic = function(n, f, def) {
-			var C = _class("easing." + n, function(amplitude, period) {
-					this._p1 = amplitude || 1;
-					this._p2 = period || def;
-					this._p3 = this._p2 / _2PI * (Math.asin(1 / this._p1) || 0);
-				}, true),
-				p = C.prototype = new Ease();
-			p.constructor = C;
-			p.getRatio = f;
-			p.config = function(amplitude, period) {
-				return new C(amplitude, period);
-			};
-			return C;
-		};
-		_wrap("Elastic",
-			_createElastic("ElasticOut", function(p) {
-				return this._p1 * Math.pow(2, -10 * p) * Math.sin( (p - this._p3) * _2PI / this._p2 ) + 1;
-			}, 0.3),
-			_createElastic("ElasticIn", function(p) {
-				return -(this._p1 * Math.pow(2, 10 * (p -= 1)) * Math.sin( (p - this._p3) * _2PI / this._p2 ));
-			}, 0.3),
-			_createElastic("ElasticInOut", function(p) {
-				return ((p *= 2) < 1) ? -0.5 * (this._p1 * Math.pow(2, 10 * (p -= 1)) * Math.sin( (p - this._p3) * _2PI / this._p2)) : this._p1 * Math.pow(2, -10 *(p -= 1)) * Math.sin( (p - this._p3) * _2PI / this._p2 ) *0.5 + 1;
-			}, 0.45)
-		);
-
-
-		//Expo
-		_wrap("Expo",
-			_create("ExpoOut", function(p) {
-				return 1 - Math.pow(2, -10 * p);
-			}),
-			_create("ExpoIn", function(p) {
-				return Math.pow(2, 10 * (p - 1)) - 0.001;
-			}),
-			_create("ExpoInOut", function(p) {
-				return ((p *= 2) < 1) ? 0.5 * Math.pow(2, 10 * (p - 1)) : 0.5 * (2 - Math.pow(2, -10 * (p - 1)));
-			})
-		);
-
-
-		//Sine
-		_wrap("Sine",
-			_create("SineOut", function(p) {
-				return Math.sin(p * _HALF_PI);
-			}),
-			_create("SineIn", function(p) {
-				return -Math.cos(p * _HALF_PI) + 1;
-			}),
-			_create("SineInOut", function(p) {
-				return -0.5 * (Math.cos(Math.PI * p) - 1);
-			})
-		);
-
-		_class("easing.EaseLookup", {
-				find:function(s) {
-					return Ease.map[s];
-				}
-			}, true);
-
-		//register the non-standard eases
-		_easeReg(w.SlowMo, "SlowMo", "ease,");
-		_easeReg(RoughEase, "RoughEase", "ease,");
-		_easeReg(SteppedEase, "SteppedEase", "ease,");
-
-		return Back;
-		
-	}, true);
-
-
-}); 
-
-
-
-
-
-
-
-
-
-
 
 /*
  * ----------------------------------------------------------------
diff --git a/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.min.js b/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.min.js
index 66f52e4..cfed618 100755
--- a/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.min.js
+++ b/epsdk-app-onap/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.min.js
@@ -5,18 +5,13 @@
 * Date 11/23/2015
 */
 
-(function(angular, window){
-angular.module("att.abs",["att.abs.tpls","att.abs.utilities","att.abs.position","att.abs.transition","att.abs.accordion","att.abs.alert","att.abs.boardStrip","att.abs.breadCrumbs","att.abs.buttons","att.abs.checkbox","att.abs.colorselector","att.abs.datepicker","att.abs.devNotes","att.abs.dividerLines","att.abs.dragdrop","att.abs.drawer","att.abs.message","att.abs.formField","att.abs.hourpicker","att.abs.iconButtons","att.abs.links","att.abs.loading","att.abs.modal","att.abs.pagination","att.abs.paneSelector","att.abs.tooltip","att.abs.popOvers","att.abs.profileCard","att.abs.progressBars","att.abs.radio","att.abs.scrollbar","att.abs.search","att.abs.select","att.abs.slider","att.abs.splitButtonDropdown","att.abs.splitIconButton","att.abs.stepSlider","att.abs.steptracker","att.abs.table","att.abs.tableMessages","att.abs.tabs","att.abs.tagBadges","att.abs.textOverflow","att.abs.toggle","att.abs.treeview","att.abs.typeAhead","att.abs.verticalSteptracker","att.abs.videoControls"]),angular.module("att.abs.tpls",["app/scripts/ng_js_att_tpls/accordion/accordion.html","app/scripts/ng_js_att_tpls/accordion/accordion_alt.html","app/scripts/ng_js_att_tpls/accordion/attAccord.html","app/scripts/ng_js_att_tpls/accordion/attAccordBody.html","app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html","app/scripts/ng_js_att_tpls/alert/alert.html","app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html","app/scripts/ng_js_att_tpls/boardStrip/attBoard.html","app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html","app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html","app/scripts/ng_js_att_tpls/colorselector/colorselector.html","app/scripts/ng_js_att_tpls/datepicker/dateFilter.html","app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html","app/scripts/ng_js_att_tpls/datepicker/datepicker.html","app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html","app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html","app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html","app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html","app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html","app/scripts/ng_js_att_tpls/formField/creditCardImage.html","app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html","app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html","app/scripts/ng_js_att_tpls/links/readMore.html","app/scripts/ng_js_att_tpls/loading/loading.html","app/scripts/ng_js_att_tpls/modal/backdrop.html","app/scripts/ng_js_att_tpls/modal/tabbedItem.html","app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html","app/scripts/ng_js_att_tpls/modal/window.html","app/scripts/ng_js_att_tpls/pagination/pagination.html","app/scripts/ng_js_att_tpls/paneSelector/innerPane.html","app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html","app/scripts/ng_js_att_tpls/paneSelector/sidePane.html","app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html","app/scripts/ng_js_att_tpls/popOvers/popOvers.html","app/scripts/ng_js_att_tpls/profileCard/addUser.html","app/scripts/ng_js_att_tpls/profileCard/profileCard.html","app/scripts/ng_js_att_tpls/progressBars/progressBars.html","app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html","app/scripts/ng_js_att_tpls/search/search.html","app/scripts/ng_js_att_tpls/select/select.html","app/scripts/ng_js_att_tpls/select/textDropdown.html","app/scripts/ng_js_att_tpls/slider/maxContent.html","app/scripts/ng_js_att_tpls/slider/minContent.html","app/scripts/ng_js_att_tpls/slider/slider.html","app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html","app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html","app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html","app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html","app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html","app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html","app/scripts/ng_js_att_tpls/steptracker/step-tracker.html","app/scripts/ng_js_att_tpls/steptracker/step.html","app/scripts/ng_js_att_tpls/steptracker/timeline.html","app/scripts/ng_js_att_tpls/steptracker/timelineBar.html","app/scripts/ng_js_att_tpls/steptracker/timelineDot.html","app/scripts/ng_js_att_tpls/table/attTable.html","app/scripts/ng_js_att_tpls/table/attTableBody.html","app/scripts/ng_js_att_tpls/table/attTableHeader.html","app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html","app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html","app/scripts/ng_js_att_tpls/tabs/floatingTabs.html","app/scripts/ng_js_att_tpls/tabs/genericTabs.html","app/scripts/ng_js_att_tpls/tabs/menuTab.html","app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html","app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html","app/scripts/ng_js_att_tpls/tabs/submenuTab.html","app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html","app/scripts/ng_js_att_tpls/toggle/demoToggle.html","app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html","app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html","app/scripts/ng_js_att_tpls/videoControls/photoControls.html","app/scripts/ng_js_att_tpls/videoControls/videoControls.html"]),angular.module("att.abs.utilities",[]).filter("unsafe",["$sce",function(a){return function(b){return a.trustAsHtml(b)}}]).filter("highlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c,d){return c&&b?b.replace(new RegExp(a(c),"gi"),'<span class="'+d+'">$&</span>'):b}}).filter("attLimitTo",function(){return function(a,b,c){var d=[],e=b,f=c;return isNaN(f)&&(f=0),d=a&&!isNaN(e)?a.slice(f,f+e):a}}).filter("startsWith",function(){return"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(a){return 0===this.indexOf(a)}),function(a,b){if(void 0===b||""===b)return a;var c=[];return angular.forEach(a,function(a){a.title.toLowerCase().startsWith(b.toLowerCase())&&c.push(a)}),c}}).directive("attInputDeny",[function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){var e=null;c.$observe("attInputDeny",function(a){a&&(e=new RegExp(a,"g"))}),b.bind("input",function(){var b=d.$viewValue&&d.$viewValue.replace(e,"");b!==d.$viewValue&&(d.$setViewValue(b),d.$render(),a.$apply())})}}}]).directive("attAccessibilityClick",[function(){return{restrict:"A",link:function(a,b,c){var d=[];c.$observe("attAccessibilityClick",function(a){a&&(d=a.split(","))}),b.bind("keydown",function(a){var c=function(){var b=!1;return a.keyCode||(a.which?a.keyCode=a.which:a.charCode&&(a.keyCode=a.charCode)),a.keyCode&&d.indexOf(a.keyCode.toString())>-1&&(b=!0),b};d.length>0&&c()&&(b[0].click(),a.preventDefault())})}}}]).directive("attElementFocus",[function(){return{restrict:"A",link:function(a,b,c){a.$watch(c.attElementFocus,function(a){a&&b[0].focus()})}}}]).directive("focusOn",["$timeout",function(a){var b=function(a){if(!a.focusOn&&""!==a.focusOn)throw"FocusOnCondition missing attribute to evaluate"};return{restrict:"A",link:function(c,d,e){b(e),c.$watch(e.focusOn,function(b){b&&a(function(){d[0].focus()})})}}}]).constant("whenScrollEndsConstants",{threshold:100,width:0,height:0}).directive("whenScrollEnds",function(a,b){return{restrict:"A",link:function(c,d,e){var f=parseInt(e.threshold,10)||a.threshold;return e.axis&&""!==e.axis?void("x"===e.axis?(visibleWidth=parseInt(e.width,10)||a.width,d.css("width")&&(visibleWidth=d.css("width").split("px")[0]),d[0].addEventListener("scroll",function(){var a=d.prop("scrollWidth");void 0===a&&(a=1);var b=a-visibleWidth;b-d[0].scrollLeft<=f&&c.$apply(e.whenScrollEnds)})):"y"===e.axis&&(visibleHeight=parseInt(e.height,10)||a.height,d.css("width")&&(visibleHeight=d.css("height").split("px")[0]),d[0].addEventListener("scroll",function(){var a=d.prop("scrollHeight");void 0===a&&(a=1);var b=a-visibleHeight;b-d[0].scrollTop<=f&&c.$apply(e.whenScrollEnds)}))):void b.warn("axis attribute must be defined for whenScrollEnds.")}}}).directive("validImei",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){d.$parsers.unshift(function(b){if(b){if(a.valid=!1,isNaN(b)||15!==b.length)a.valid=!1;else{for(var c=0,e=[],f=0;15>f;f++)e[f]=parseInt(b.substring(f,f+1),10),f%2!==0&&(e[f]=parseInt(2*e[f],10)),e[f]>9&&(e[f]=parseInt(e[f]%10,10)+parseInt(e[f]/10,10)),c+=parseInt(e[f],10);c%10===0?a.valid=!0:a.valid=!1}d.$setValidity("invalidImei",a.valid)}return a.valid?b:void 0})}}}).directive("togglePassword",function(){return{restrict:"A",transclude:!1,link:function(a,b,c,d){b.bind("click",function(){var a=c.togglePassword;b[0].innerHTML="Show"===b[0].innerHTML?"Hide":"Show";var d=angular.element(document.querySelector("#"+a))[0].type;angular.element(document.querySelector("#"+a))[0].type="password"===d?"text":"password"})}}}).factory("events",function(){var a=function(a){a.stopPropagation?a.stopPropagation():a.returnValue=!1},b=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};return{stopPropagation:a,preventDefault:b}}).factory("$documentBind",["$document","$timeout",function(a,b){var c=function(c,d,e){e.$watch(c,function(c){b(function(){c?a.bind("click",d):a.unbind("click",d)})})},d=function(c,d,e,f,g,h){g?(h||(h=0),f.$watch(d,function(d,f){d!==f&&b(function(){d?a.bind(c,e):a.unbind(c,e)},h)})):f.$watch(d,function(b,d){b!==d&&(b?a.bind(c,e):a.unbind(c,e))})};return{click:c,event:d}}]).factory("DOMHelper",function(){function a(a){var b=angular.element(a),c=parseInt(b.attr("tabindex"),10)>=0?!0:!1,d=b[0].tagName.toUpperCase();return c||"A"===d||"INPUT"===d||"TEXTAREA"===d?!(b[0].disabled||b[0].readOnly):!1}function b(a){return 1==a.nodeType&&"SCRIPT"!=a.nodeName&&"STYLE"!=a.nodeName}function c(d){var d=d||document.getElementsByTagName("body")[0];if(b(d)&&a(d))return d;if(!d.hasChildNodes())return void 0;for(var e=d.firstChild;e;){var f=c(e);if(f)return f;e=e.nextSibling}}var d=function(a){var b=a;return a.hasOwnProperty("length")&&(b=a[0]),c(b)};return{firstTabableElement:d}}).factory("keymap",function(){return{KEY:{TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,COMMAND:91},MAP:{91:"COMMAND",8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSEBREAK",20:"CAPSLOCK",27:"ESC",32:"SPACE",33:"PAGE_UP",34:"PAGE_DOWN",35:"END",36:"HOME",37:"LEFT",38:"UP",39:"RIGHT",40:"DOWN",43:"+",44:"PRINTSCREEN",45:"INSERT",46:"DELETE",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUMLOCK",145:"SCROLLLOCK",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},isControl:function(a){var b=a.keyCode;switch(b){case this.KEY.COMMAND:case this.KEY.SHIFT:case this.KEY.CTRL:case this.KEY.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.keyCode?a.keyCode:a,a>=112&&123>=a},isVerticalMovement:function(a){return~[this.KEY.UP,this.KEY.DOWN].indexOf(a)},isHorizontalMovement:function(a){return~[this.KEY.LEFT,this.KEY.RIGHT,this.KEY.BACKSPACE,this.KEY.DELETE].indexOf(a)},isAllowedKey:function(a){return~[this.KEY.SPACE,this.KEY.ESC,this.KEY.ENTER].indexOf(a)||this.isHorizontalMovement(a)||this.isVerticalMovement(a)}}}).factory("keyMapAc",function(){return{keys:{32:" ",33:"!",34:'"',35:"#",36:"$",37:"%",38:"&",39:"'",40:"(",41:")",42:"*",43:"+",44:",",45:"-",46:".",47:"/",58:":",59:";",60:"<",61:"=",62:">",63:"?",64:"@",91:"[",92:"\\",93:"]",94:"^",95:"_",96:"`",123:"{",124:"|",125:"}",126:"~"},keyRange:{startNum:"48",endNum:"57",startSmallLetters:"97",endSmallLetters:"122",startCapitalLetters:"65",endCapitalLetters:"90"},allowedKeys:{TAB:8,BACKSPACE:9,DELETE:16}}}).factory("$attElementDetach",function(){var a=function(a){a&&a.parentNode&&a.parentNode.removeChild(a)};return a}).factory("$ieVersion",function(){var ie=null,loadIEVersion=function(){var isIE10=eval("/*@cc_on!@*/false")&&10===document.documentMode;if(isIE10)return 10;var v=3,div=document.createElement("div"),all=div.getElementsByTagName("i");do div.innerHTML="<!--[if gt IE "+ ++v+"]><i></i><![endif]-->";while(all[0]);return v>4?v:void 0};return function(){return null===ie&&(ie=loadIEVersion()),ie}}),function(){String.prototype.toSnakeCase=function(){return this.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})};var a=function(a,b){a=a||"",b=!isNaN(b)&&b||0;for(var c="",d=0;b>d;d++)c+=a;return c},b=function(b,c,d,e){return b=b||"",c=!isNaN(c)&&c||0,d=d||"",c>b.length?e?a(d,c-b.length)+b:b+a(d,c-b.length):b};String.prototype.lPad=function(a,c){return b(this,a,c,!0)},String.prototype.rPad=function(a,c){return b(this,a,c,!1)},Array.prototype.indexOf||(Array.prototype.indexOf=function(a){for(var b=0;b<this.length;b++)if(this[b]===a)return b;return-1})}(),angular.module("att.abs.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);return f!==a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft),{width:b.prop("offsetWidth"),height:b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:c.prop("offsetWidth"),height:c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].body.scrollTop||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].body.scrollLeft||a[0].documentElement.scrollLeft)}}}}]).factory("$isElement",[function(){var a=function(b,c,d){return b[0]===c[0]?!0:b[0]===d[0]?!1:a(b.parent()[0]&&b.parent()||c,c,d)};return a}]).directive("attPosition",["$position",function(a){return{restrict:"A",link:function(b,c,d){b.$watchCollection(function(){return a.position(c)},function(a){b[d.attPosition]=a})}}}]),(window._gsQueue||(window._gsQueue=[])).push(function(){"use strict";var a=document.documentElement,b=window,c=function(c,d){var e="x"===d?"Width":"Height",f="scroll"+e,g="client"+e,h=document.body;return c===b||c===a||c===h?Math.max(a[f],h[f])-(b["inner"+e]||Math.max(a[g],h[g])):c[f]-c["offset"+e]},d=window._gsDefine.plugin({propName:"scrollTo",API:2,version:"1.7.3",init:function(a,d,e){return this._wdw=a===b,this._target=a,this._tween=e,"object"!=typeof d&&(d={y:d}),this._autoKill=d.autoKill!==!1,this.x=this.xPrev=this.getX(),this.y=this.yPrev=this.getY(),null!=d.x?(this._addTween(this,"x",this.x,"max"===d.x?c(a,"x"):d.x,"scrollTo_x",!0),this._overwriteProps.push("scrollTo_x")):this.skipX=!0,null!=d.y?(this._addTween(this,"y",this.y,"max"===d.y?c(a,"y"):d.y,"scrollTo_y",!0),this._overwriteProps.push("scrollTo_y")):this.skipY=!0,!0},set:function(a){this._super.setRatio.call(this,a);var d=this._wdw||!this.skipX?this.getX():this.xPrev,e=this._wdw||!this.skipY?this.getY():this.yPrev,f=e-this.yPrev,g=d-this.xPrev;this._autoKill&&(!this.skipX&&(g>7||-7>g)&&d<c(this._target,"x")&&(this.skipX=!0),!this.skipY&&(f>7||-7>f)&&e<c(this._target,"y")&&(this.skipY=!0),this.skipX&&this.skipY&&this._tween.kill()),this._wdw?b.scrollTo(this.skipX?d:this.x,this.skipY?e:this.y):(this.skipY||(this._target.scrollTop=this.y),this.skipX||(this._target.scrollLeft=this.x)),this.xPrev=this.x,this.yPrev=this.y}}),e=d.prototype;d.max=c,e.getX=function(){return this._wdw?null!=b.pageXOffset?b.pageXOffset:null!=a.scrollLeft?a.scrollLeft:document.body.scrollLeft:this._target.scrollLeft},e.getY=function(){return this._wdw?null!=b.pageYOffset?b.pageYOffset:null!=a.scrollTop?a.scrollTop:document.body.scrollTop:this._target.scrollTop},e._kill=function(a){return a.scrollTo_x&&(this.skipX=!0),a.scrollTo_y&&(this.skipY=!0),this._super._kill.call(this,a)}}),window._gsDefine&&window._gsQueue.pop()(),(window._gsQueue||(window._gsQueue=[])).push(function(){"use strict";window._gsDefine("TweenMax",["core.Animation","core.SimpleTimeline","TweenLite"],function(a,b,c){var d=[].slice,e=function(a,b,d){c.call(this,a,b,d),this._cycle=0,this._yoyo=this.vars.yoyo===!0,this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._dirty=!0,this.render=e.prototype.render},f=1e-10,g=c._internals,h=g.isSelector,i=g.isArray,j=e.prototype=c.to({},.1,{}),k=[];e.version="1.12.1",j.constructor=e,j.kill()._gc=!1,e.killTweensOf=e.killDelayedCallsTo=c.killTweensOf,e.getTweensOf=c.getTweensOf,e.lagSmoothing=c.lagSmoothing,e.ticker=c.ticker,e.render=c.render,j.invalidate=function(){return this._yoyo=this.vars.yoyo===!0,this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._uncache(!0),c.prototype.invalidate.call(this)},j.updateTo=function(a,b){var d,e=this.ratio;b&&this._startTime<this._timeline._time&&(this._startTime=this._timeline._time,this._uncache(!1),this._gc?this._enabled(!0,!1):this._timeline.insert(this,this._startTime-this._delay));for(d in a)this.vars[d]=a[d];if(this._initted)if(b)this._initted=!1;else if(this._gc&&this._enabled(!0,!1),this._notifyPluginsOfEnabled&&this._firstPT&&c._onPluginEvent("_onDisable",this),this._time/this._duration>.998){var f=this._time;this.render(0,!0,!1),this._initted=!1,this.render(f,!0,!1)}else if(this._time>0){this._initted=!1,this._init();for(var g,h=1/(1-e),i=this._firstPT;i;)g=i.s+i.c,i.c*=h,i.s=g-i.c,i=i._next}return this},j.render=function(a,b,c){this._initted||0===this._duration&&this.vars.repeat&&this.invalidate();var d,e,h,i,j,l,m,n,o=this._dirty?this.totalDuration():this._totalDuration,p=this._time,q=this._totalTime,r=this._cycle,s=this._duration,t=this._rawPrevTime;if(a>=o?(this._totalTime=o,this._cycle=this._repeat,this._yoyo&&0!==(1&this._cycle)?(this._time=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0):(this._time=s,this.ratio=this._ease._calcEnd?this._ease.getRatio(1):1),this._reversed||(d=!0,e="onComplete"),0===s&&(this._initted||!this.vars.lazy||c)&&(this._startTime===this._timeline._duration&&(a=0),(0===a||0>t||t===f)&&t!==a&&(c=!0,t>f&&(e="onReverseComplete")),this._rawPrevTime=n=!b||a||t===a?a:f)):1e-7>a?(this._totalTime=this._time=this._cycle=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0,(0!==q||0===s&&t>0&&t!==f)&&(e="onReverseComplete",d=this._reversed),0>a?(this._active=!1,0===s&&(this._initted||!this.vars.lazy||c)&&(t>=0&&(c=!0),this._rawPrevTime=n=!b||a||t===a?a:f)):this._initted||(c=!0)):(this._totalTime=this._time=a,0!==this._repeat&&(i=s+this._repeatDelay,this._cycle=this._totalTime/i>>0,0!==this._cycle&&this._cycle===this._totalTime/i&&this._cycle--,this._time=this._totalTime-this._cycle*i,this._yoyo&&0!==(1&this._cycle)&&(this._time=s-this._time),this._time>s?this._time=s:this._time<0&&(this._time=0)),this._easeType?(j=this._time/s,l=this._easeType,m=this._easePower,(1===l||3===l&&j>=.5)&&(j=1-j),3===l&&(j*=2),1===m?j*=j:2===m?j*=j*j:3===m?j*=j*j*j:4===m&&(j*=j*j*j*j),1===l?this.ratio=1-j:2===l?this.ratio=j:this._time/s<.5?this.ratio=j/2:this.ratio=1-j/2):this.ratio=this._ease.getRatio(this._time/s)),p===this._time&&!c&&r===this._cycle)return void(q!==this._totalTime&&this._onUpdate&&(b||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||k)));if(!this._initted){if(this._init(),!this._initted||this._gc)return;if(!c&&this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration))return this._time=p,this._totalTime=q,this._rawPrevTime=t,this._cycle=r,g.lazyTweens.push(this),void(this._lazy=a);this._time&&!d?this.ratio=this._ease.getRatio(this._time/s):d&&this._ease._calcEnd&&(this.ratio=this._ease.getRatio(0===this._time?0:1))}for(this._lazy!==!1&&(this._lazy=!1),this._active||!this._paused&&this._time!==p&&a>=0&&(this._active=!0),0===q&&(2===this._initted&&a>0&&this._init(),this._startAt&&(a>=0?this._startAt.render(a,b,c):e||(e="_dummyGS")),this.vars.onStart&&(0!==this._totalTime||0===s)&&(b||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||k))),h=this._firstPT;h;)h.f?h.t[h.p](h.c*this.ratio+h.s):h.t[h.p]=h.c*this.ratio+h.s,h=h._next;this._onUpdate&&(0>a&&this._startAt&&this._startTime&&this._startAt.render(a,b,c),b||(this._totalTime!==q||d)&&this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||k)),this._cycle!==r&&(b||this._gc||this.vars.onRepeat&&this.vars.onRepeat.apply(this.vars.onRepeatScope||this,this.vars.onRepeatParams||k)),e&&(this._gc||(0>a&&this._startAt&&!this._onUpdate&&this._startTime&&this._startAt.render(a,b,c),d&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!b&&this.vars[e]&&this.vars[e].apply(this.vars[e+"Scope"]||this,this.vars[e+"Params"]||k),0===s&&this._rawPrevTime===f&&n!==f&&(this._rawPrevTime=0)))},e.to=function(a,b,c){return new e(a,b,c)},e.from=function(a,b,c){return c.runBackwards=!0,c.immediateRender=0!=c.immediateRender,new e(a,b,c)},e.fromTo=function(a,b,c,d){return d.startAt=c,d.immediateRender=0!=d.immediateRender&&0!=c.immediateRender,new e(a,b,d)},e.staggerTo=e.allTo=function(a,b,f,g,j,l,m){g=g||0;var n,o,p,q,r=f.delay||0,s=[],t=function(){f.onComplete&&f.onComplete.apply(f.onCompleteScope||this,arguments),j.apply(m||this,l||k)};for(i(a)||("string"==typeof a&&(a=c.selector(a)||a),h(a)&&(a=d.call(a,0))),n=a.length,p=0;n>p;p++){o={};for(q in f)o[q]=f[q];o.delay=r,p===n-1&&j&&(o.onComplete=t),s[p]=new e(a[p],b,o),r+=g}return s},e.staggerFrom=e.allFrom=function(a,b,c,d,f,g,h){return c.runBackwards=!0,c.immediateRender=0!=c.immediateRender,e.staggerTo(a,b,c,d,f,g,h)},e.staggerFromTo=e.allFromTo=function(a,b,c,d,f,g,h,i){return d.startAt=c,d.immediateRender=0!=d.immediateRender&&0!=c.immediateRender,e.staggerTo(a,b,d,f,g,h,i)},e.delayedCall=function(a,b,c,d,f){return new e(b,0,{delay:a,onComplete:b,onCompleteParams:c,onCompleteScope:d,onReverseComplete:b,onReverseCompleteParams:c,onReverseCompleteScope:d,immediateRender:!1,useFrames:f,overwrite:0})},e.set=function(a,b){return new e(a,0,b)},e.isTweening=function(a){return c.getTweensOf(a,!0).length>0};var l=function(a,b){for(var d=[],e=0,f=a._first;f;)f instanceof c?d[e++]=f:(b&&(d[e++]=f),d=d.concat(l(f,b)),e=d.length),f=f._next;return d},m=e.getAllTweens=function(b){return l(a._rootTimeline,b).concat(l(a._rootFramesTimeline,b))};e.killAll=function(a,c,d,e){null==c&&(c=!0),null==d&&(d=!0);var f,g,h,i=m(0!=e),j=i.length,k=c&&d&&e;for(h=0;j>h;h++)g=i[h],(k||g instanceof b||(f=g.target===g.vars.onComplete)&&d||c&&!f)&&(a?g.totalTime(g._reversed?0:g.totalDuration()):g._enabled(!1,!1))},e.killChildTweensOf=function(a,b){if(null!=a){var f,j,k,l,m,n=g.tweenLookup;if("string"==typeof a&&(a=c.selector(a)||a),h(a)&&(a=d.call(a,0)),i(a))for(l=a.length;--l>-1;)e.killChildTweensOf(a[l],b);else{f=[];for(k in n)for(j=n[k].target.parentNode;j;)j===a&&(f=f.concat(n[k].tweens)),j=j.parentNode;for(m=f.length,l=0;m>l;l++)b&&f[l].totalTime(f[l].totalDuration()),f[l]._enabled(!1,!1)}}};var n=function(a,c,d,e){c=c!==!1,d=d!==!1,e=e!==!1;for(var f,g,h=m(e),i=c&&d&&e,j=h.length;--j>-1;)g=h[j],(i||g instanceof b||(f=g.target===g.vars.onComplete)&&d||c&&!f)&&g.paused(a)};return e.pauseAll=function(a,b,c){n(!0,a,b,c)},e.resumeAll=function(a,b,c){n(!1,a,b,c)},e.globalTimeScale=function(b){var d=a._rootTimeline,e=c.ticker.time;return arguments.length?(b=b||f,d._startTime=e-(e-d._startTime)*d._timeScale/b,d=a._rootFramesTimeline,e=c.ticker.frame,d._startTime=e-(e-d._startTime)*d._timeScale/b,d._timeScale=a._rootTimeline._timeScale=b,b):d._timeScale},j.progress=function(a){return arguments.length?this.totalTime(this.duration()*(this._yoyo&&0!==(1&this._cycle)?1-a:a)+this._cycle*(this._duration+this._repeatDelay),!1):this._time/this.duration()},j.totalProgress=function(a){return arguments.length?this.totalTime(this.totalDuration()*a,!1):this._totalTime/this.totalDuration()},j.time=function(a,b){return arguments.length?(this._dirty&&this.totalDuration(),a>this._duration&&(a=this._duration),this._yoyo&&0!==(1&this._cycle)?a=this._duration-a+this._cycle*(this._duration+this._repeatDelay):0!==this._repeat&&(a+=this._cycle*(this._duration+this._repeatDelay)),this.totalTime(a,b)):this._time},j.duration=function(b){return arguments.length?a.prototype.duration.call(this,b):this._duration},j.totalDuration=function(a){return arguments.length?-1===this._repeat?this:this.duration((a-this._repeat*this._repeatDelay)/(this._repeat+1)):(this._dirty&&(this._totalDuration=-1===this._repeat?999999999999:this._duration*(this._repeat+1)+this._repeatDelay*this._repeat,this._dirty=!1),this._totalDuration)},j.repeat=function(a){return arguments.length?(this._repeat=a,this._uncache(!0)):this._repeat},j.repeatDelay=function(a){return arguments.length?(this._repeatDelay=a,this._uncache(!0)):this._repeatDelay},j.yoyo=function(a){return arguments.length?(this._yoyo=a,this):this._yoyo},e},!0),window._gsDefine("TimelineLite",["core.Animation","core.SimpleTimeline","TweenLite"],function(a,b,c){var d=function(a){b.call(this,a),this._labels={},this.autoRemoveChildren=this.vars.autoRemoveChildren===!0,this.smoothChildTiming=this.vars.smoothChildTiming===!0,this._sortChildren=!0,this._onUpdate=this.vars.onUpdate;var c,d,e=this.vars;for(d in e)c=e[d],g(c)&&-1!==c.join("").indexOf("{self}")&&(e[d]=this._swapSelfInParams(c));g(e.tweens)&&this.add(e.tweens,0,e.align,e.stagger)},e=1e-10,f=c._internals.isSelector,g=c._internals.isArray,h=[],i=window._gsDefine.globals,j=function(a){var b,c={};for(b in a)c[b]=a[b];return c},k=function(a,b,c,d){a._timeline.pause(a._startTime),b&&b.apply(d||a._timeline,c||h)},l=h.slice,m=d.prototype=new b;return d.version="1.12.1",m.constructor=d,m.kill()._gc=!1,m.to=function(a,b,d,e){var f=d.repeat&&i.TweenMax||c;return b?this.add(new f(a,b,d),e):this.set(a,d,e)},m.from=function(a,b,d,e){return this.add((d.repeat&&i.TweenMax||c).from(a,b,d),e)},m.fromTo=function(a,b,d,e,f){var g=e.repeat&&i.TweenMax||c;return b?this.add(g.fromTo(a,b,d,e),f):this.set(a,e,f)},m.staggerTo=function(a,b,e,g,h,i,k,m){var n,o=new d({onComplete:i,onCompleteParams:k,onCompleteScope:m,smoothChildTiming:this.smoothChildTiming});for("string"==typeof a&&(a=c.selector(a)||a),f(a)&&(a=l.call(a,0)),g=g||0,n=0;n<a.length;n++)e.startAt&&(e.startAt=j(e.startAt)),o.to(a[n],b,j(e),n*g);return this.add(o,h)},m.staggerFrom=function(a,b,c,d,e,f,g,h){return c.immediateRender=0!=c.immediateRender,c.runBackwards=!0,this.staggerTo(a,b,c,d,e,f,g,h)},m.staggerFromTo=function(a,b,c,d,e,f,g,h,i){return d.startAt=c,d.immediateRender=0!=d.immediateRender&&0!=c.immediateRender,this.staggerTo(a,b,d,e,f,g,h,i)},m.call=function(a,b,d,e){return this.add(c.delayedCall(0,a,b,d),e)},m.set=function(a,b,d){return d=this._parseTimeOrLabel(d,0,!0),null==b.immediateRender&&(b.immediateRender=d===this._time&&!this._paused),this.add(new c(a,0,b),d)},d.exportRoot=function(a,b){a=a||{},null==a.smoothChildTiming&&(a.smoothChildTiming=!0);var e,f,g=new d(a),h=g._timeline;for(null==b&&(b=!0),h._remove(g,!0),g._startTime=0,g._rawPrevTime=g._time=g._totalTime=h._time,e=h._first;e;)f=e._next,b&&e instanceof c&&e.target===e.vars.onComplete||g.add(e,e._startTime-e._delay),e=f;return h.add(g,0),g},m.add=function(e,f,h,i){var j,k,l,m,n,o;if("number"!=typeof f&&(f=this._parseTimeOrLabel(f,0,!0,e)),!(e instanceof a)){if(e instanceof Array||e&&e.push&&g(e)){for(h=h||"normal",i=i||0,j=f,k=e.length,l=0;k>l;l++)g(m=e[l])&&(m=new d({tweens:m})),this.add(m,j),"string"!=typeof m&&"function"!=typeof m&&("sequence"===h?j=m._startTime+m.totalDuration()/m._timeScale:"start"===h&&(m._startTime-=m.delay())),j+=i;return this._uncache(!0)}if("string"==typeof e)return this.addLabel(e,f);if("function"!=typeof e)throw"Cannot add "+e+" into the timeline; it is not a tween, timeline, function, or string.";e=c.delayedCall(0,e)}if(b.prototype.add.call(this,e,f),(this._gc||this._time===this._duration)&&!this._paused&&this._duration<this.duration())for(n=this,o=n.rawTime()>e._startTime;n._timeline;)o&&n._timeline.smoothChildTiming?n.totalTime(n._totalTime,!0):n._gc&&n._enabled(!0,!1),n=n._timeline;return this},m.remove=function(b){if(b instanceof a)return this._remove(b,!1);if(b instanceof Array||b&&b.push&&g(b)){for(var c=b.length;--c>-1;)this.remove(b[c]);return this}return"string"==typeof b?this.removeLabel(b):this.kill(null,b)},m._remove=function(a,c){b.prototype._remove.call(this,a,c);var d=this._last;return d?this._time>d._startTime+d._totalDuration/d._timeScale&&(this._time=this.duration(),this._totalTime=this._totalDuration):this._time=this._totalTime=this._duration=this._totalDuration=0,this},m.append=function(a,b){return this.add(a,this._parseTimeOrLabel(null,b,!0,a))},m.insert=m.insertMultiple=function(a,b,c,d){return this.add(a,b||0,c,d)},m.appendMultiple=function(a,b,c,d){return this.add(a,this._parseTimeOrLabel(null,b,!0,a),c,d)},m.addLabel=function(a,b){return this._labels[a]=this._parseTimeOrLabel(b),this},m.addPause=function(a,b,c,d){return this.call(k,["{self}",b,c,d],this,a)},m.removeLabel=function(a){return delete this._labels[a],this},m.getLabelTime=function(a){return null!=this._labels[a]?this._labels[a]:-1},m._parseTimeOrLabel=function(b,c,d,e){var f;if(e instanceof a&&e.timeline===this)this.remove(e);else if(e&&(e instanceof Array||e.push&&g(e)))for(f=e.length;--f>-1;)e[f]instanceof a&&e[f].timeline===this&&this.remove(e[f]);if("string"==typeof c)return this._parseTimeOrLabel(c,d&&"number"==typeof b&&null==this._labels[c]?b-this.duration():0,d);if(c=c||0,"string"!=typeof b||!isNaN(b)&&null==this._labels[b])null==b&&(b=this.duration());else{if(f=b.indexOf("="),-1===f)return null==this._labels[b]?d?this._labels[b]=this.duration()+c:c:this._labels[b]+c;c=parseInt(b.charAt(f-1)+"1",10)*Number(b.substr(f+1)),b=f>1?this._parseTimeOrLabel(b.substr(0,f-1),0,d):this.duration()}return Number(b)+c},m.seek=function(a,b){return this.totalTime("number"==typeof a?a:this._parseTimeOrLabel(a),b!==!1)},m.stop=function(){return this.paused(!0)},m.gotoAndPlay=function(a,b){return this.play(a,b)},m.gotoAndStop=function(a,b){return this.pause(a,b)},m.render=function(a,b,c){this._gc&&this._enabled(!0,!1);var d,f,g,i,j,k=this._dirty?this.totalDuration():this._totalDuration,l=this._time,m=this._startTime,n=this._timeScale,o=this._paused;if(a>=k?(this._totalTime=this._time=k,this._reversed||this._hasPausedChild()||(f=!0,i="onComplete",0===this._duration&&(0===a||this._rawPrevTime<0||this._rawPrevTime===e)&&this._rawPrevTime!==a&&this._first&&(j=!0,this._rawPrevTime>e&&(i="onReverseComplete"))),this._rawPrevTime=this._duration||!b||a||this._rawPrevTime===a?a:e,a=k+1e-4):1e-7>a?(this._totalTime=this._time=0,(0!==l||0===this._duration&&this._rawPrevTime!==e&&(this._rawPrevTime>0||0>a&&this._rawPrevTime>=0))&&(i="onReverseComplete",f=this._reversed),0>a?(this._active=!1,0===this._duration&&this._rawPrevTime>=0&&this._first&&(j=!0),this._rawPrevTime=a):(this._rawPrevTime=this._duration||!b||a||this._rawPrevTime===a?a:e,a=0,this._initted||(j=!0))):this._totalTime=this._time=this._rawPrevTime=a,this._time!==l&&this._first||c||j){if(this._initted||(this._initted=!0),this._active||!this._paused&&this._time!==l&&a>0&&(this._active=!0),0===l&&this.vars.onStart&&0!==this._time&&(b||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||h)),this._time>=l)for(d=this._first;d&&(g=d._next,!this._paused||o);)(d._active||d._startTime<=this._time&&!d._paused&&!d._gc)&&(d._reversed?d.render((d._dirty?d.totalDuration():d._totalDuration)-(a-d._startTime)*d._timeScale,b,c):d.render((a-d._startTime)*d._timeScale,b,c)),d=g;else for(d=this._last;d&&(g=d._prev,!this._paused||o);)(d._active||d._startTime<=l&&!d._paused&&!d._gc)&&(d._reversed?d.render((d._dirty?d.totalDuration():d._totalDuration)-(a-d._startTime)*d._timeScale,b,c):d.render((a-d._startTime)*d._timeScale,b,c)),
-d=g;this._onUpdate&&(b||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||h)),i&&(this._gc||(m===this._startTime||n!==this._timeScale)&&(0===this._time||k>=this.totalDuration())&&(f&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!b&&this.vars[i]&&this.vars[i].apply(this.vars[i+"Scope"]||this,this.vars[i+"Params"]||h)))}},m._hasPausedChild=function(){for(var a=this._first;a;){if(a._paused||a instanceof d&&a._hasPausedChild())return!0;a=a._next}return!1},m.getChildren=function(a,b,d,e){e=e||-9999999999;for(var f=[],g=this._first,h=0;g;)g._startTime<e||(g instanceof c?b!==!1&&(f[h++]=g):(d!==!1&&(f[h++]=g),a!==!1&&(f=f.concat(g.getChildren(!0,b,d)),h=f.length))),g=g._next;return f},m.getTweensOf=function(a,b){var d,e,f=this._gc,g=[],h=0;for(f&&this._enabled(!0,!0),d=c.getTweensOf(a),e=d.length;--e>-1;)(d[e].timeline===this||b&&this._contains(d[e]))&&(g[h++]=d[e]);return f&&this._enabled(!1,!0),g},m._contains=function(a){for(var b=a.timeline;b;){if(b===this)return!0;b=b.timeline}return!1},m.shiftChildren=function(a,b,c){c=c||0;for(var d,e=this._first,f=this._labels;e;)e._startTime>=c&&(e._startTime+=a),e=e._next;if(b)for(d in f)f[d]>=c&&(f[d]+=a);return this._uncache(!0)},m._kill=function(a,b){if(!a&&!b)return this._enabled(!1,!1);for(var c=b?this.getTweensOf(b):this.getChildren(!0,!0,!1),d=c.length,e=!1;--d>-1;)c[d]._kill(a,b)&&(e=!0);return e},m.clear=function(a){var b=this.getChildren(!1,!0,!0),c=b.length;for(this._time=this._totalTime=0;--c>-1;)b[c]._enabled(!1,!1);return a!==!1&&(this._labels={}),this._uncache(!0)},m.invalidate=function(){for(var a=this._first;a;)a.invalidate(),a=a._next;return this},m._enabled=function(a,c){if(a===this._gc)for(var d=this._first;d;)d._enabled(a,!0),d=d._next;return b.prototype._enabled.call(this,a,c)},m.duration=function(a){return arguments.length?(0!==this.duration()&&0!==a&&this.timeScale(this._duration/a),this):(this._dirty&&this.totalDuration(),this._duration)},m.totalDuration=function(a){if(!arguments.length){if(this._dirty){for(var b,c,d=0,e=this._last,f=999999999999;e;)b=e._prev,e._dirty&&e.totalDuration(),e._startTime>f&&this._sortChildren&&!e._paused?this.add(e,e._startTime-e._delay):f=e._startTime,e._startTime<0&&!e._paused&&(d-=e._startTime,this._timeline.smoothChildTiming&&(this._startTime+=e._startTime/this._timeScale),this.shiftChildren(-e._startTime,!1,-9999999999),f=0),c=e._startTime+e._totalDuration/e._timeScale,c>d&&(d=c),e=b;this._duration=this._totalDuration=d,this._dirty=!1}return this._totalDuration}return 0!==this.totalDuration()&&0!==a&&this.timeScale(this._totalDuration/a),this},m.usesFrames=function(){for(var b=this._timeline;b._timeline;)b=b._timeline;return b===a._rootFramesTimeline},m.rawTime=function(){return this._paused?this._totalTime:(this._timeline.rawTime()-this._startTime)*this._timeScale},d},!0),window._gsDefine("TimelineMax",["TimelineLite","TweenLite","easing.Ease"],function(a,b,c){var d=function(b){a.call(this,b),this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._cycle=0,this._yoyo=this.vars.yoyo===!0,this._dirty=!0},e=1e-10,f=[],g=new c(null,null,1,0),h=d.prototype=new a;return h.constructor=d,h.kill()._gc=!1,d.version="1.12.1",h.invalidate=function(){return this._yoyo=this.vars.yoyo===!0,this._repeat=this.vars.repeat||0,this._repeatDelay=this.vars.repeatDelay||0,this._uncache(!0),a.prototype.invalidate.call(this)},h.addCallback=function(a,c,d,e){return this.add(b.delayedCall(0,a,d,e),c)},h.removeCallback=function(a,b){if(a)if(null==b)this._kill(null,a);else for(var c=this.getTweensOf(a,!1),d=c.length,e=this._parseTimeOrLabel(b);--d>-1;)c[d]._startTime===e&&c[d]._enabled(!1,!1);return this},h.tweenTo=function(a,c){c=c||{};var d,e,h,i={ease:g,overwrite:c.delay?2:1,useFrames:this.usesFrames(),immediateRender:!1};for(e in c)i[e]=c[e];return i.time=this._parseTimeOrLabel(a),d=Math.abs(Number(i.time)-this._time)/this._timeScale||.001,h=new b(this,d,i),i.onStart=function(){h.target.paused(!0),h.vars.time!==h.target.time()&&d===h.duration()&&h.duration(Math.abs(h.vars.time-h.target.time())/h.target._timeScale),c.onStart&&c.onStart.apply(c.onStartScope||h,c.onStartParams||f)},h},h.tweenFromTo=function(a,b,c){c=c||{},a=this._parseTimeOrLabel(a),c.startAt={onComplete:this.seek,onCompleteParams:[a],onCompleteScope:this},c.immediateRender=c.immediateRender!==!1;var d=this.tweenTo(b,c);return d.duration(Math.abs(d.vars.time-a)/this._timeScale||.001)},h.render=function(a,b,c){this._gc&&this._enabled(!0,!1);var d,g,h,i,j,k,l=this._dirty?this.totalDuration():this._totalDuration,m=this._duration,n=this._time,o=this._totalTime,p=this._startTime,q=this._timeScale,r=this._rawPrevTime,s=this._paused,t=this._cycle;if(a>=l?(this._locked||(this._totalTime=l,this._cycle=this._repeat),this._reversed||this._hasPausedChild()||(g=!0,i="onComplete",0===this._duration&&(0===a||0>r||r===e)&&r!==a&&this._first&&(j=!0,r>e&&(i="onReverseComplete"))),this._rawPrevTime=this._duration||!b||a||this._rawPrevTime===a?a:e,this._yoyo&&0!==(1&this._cycle)?this._time=a=0:(this._time=m,a=m+1e-4)):1e-7>a?(this._locked||(this._totalTime=this._cycle=0),this._time=0,(0!==n||0===m&&r!==e&&(r>0||0>a&&r>=0)&&!this._locked)&&(i="onReverseComplete",g=this._reversed),0>a?(this._active=!1,0===m&&r>=0&&this._first&&(j=!0),this._rawPrevTime=a):(this._rawPrevTime=m||!b||a||this._rawPrevTime===a?a:e,a=0,this._initted||(j=!0))):(0===m&&0>r&&(j=!0),this._time=this._rawPrevTime=a,this._locked||(this._totalTime=a,0!==this._repeat&&(k=m+this._repeatDelay,this._cycle=this._totalTime/k>>0,0!==this._cycle&&this._cycle===this._totalTime/k&&this._cycle--,this._time=this._totalTime-this._cycle*k,this._yoyo&&0!==(1&this._cycle)&&(this._time=m-this._time),this._time>m?(this._time=m,a=m+1e-4):this._time<0?this._time=a=0:a=this._time))),this._cycle!==t&&!this._locked){var u=this._yoyo&&0!==(1&t),v=u===(this._yoyo&&0!==(1&this._cycle)),w=this._totalTime,x=this._cycle,y=this._rawPrevTime,z=this._time;if(this._totalTime=t*m,this._cycle<t?u=!u:this._totalTime+=m,this._time=n,this._rawPrevTime=0===m?r-1e-4:r,this._cycle=t,this._locked=!0,n=u?0:m,this.render(n,b,0===m),b||this._gc||this.vars.onRepeat&&this.vars.onRepeat.apply(this.vars.onRepeatScope||this,this.vars.onRepeatParams||f),v&&(n=u?m+1e-4:-1e-4,this.render(n,!0,!1)),this._locked=!1,this._paused&&!s)return;this._time=z,this._totalTime=w,this._cycle=x,this._rawPrevTime=y}if(!(this._time!==n&&this._first||c||j))return void(o!==this._totalTime&&this._onUpdate&&(b||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||f)));if(this._initted||(this._initted=!0),this._active||!this._paused&&this._totalTime!==o&&a>0&&(this._active=!0),0===o&&this.vars.onStart&&0!==this._totalTime&&(b||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||f)),this._time>=n)for(d=this._first;d&&(h=d._next,!this._paused||s);)(d._active||d._startTime<=this._time&&!d._paused&&!d._gc)&&(d._reversed?d.render((d._dirty?d.totalDuration():d._totalDuration)-(a-d._startTime)*d._timeScale,b,c):d.render((a-d._startTime)*d._timeScale,b,c)),d=h;else for(d=this._last;d&&(h=d._prev,!this._paused||s);)(d._active||d._startTime<=n&&!d._paused&&!d._gc)&&(d._reversed?d.render((d._dirty?d.totalDuration():d._totalDuration)-(a-d._startTime)*d._timeScale,b,c):d.render((a-d._startTime)*d._timeScale,b,c)),d=h;this._onUpdate&&(b||this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||f)),i&&(this._locked||this._gc||(p===this._startTime||q!==this._timeScale)&&(0===this._time||l>=this.totalDuration())&&(g&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!b&&this.vars[i]&&this.vars[i].apply(this.vars[i+"Scope"]||this,this.vars[i+"Params"]||f)))},h.getActive=function(a,b,c){null==a&&(a=!0),null==b&&(b=!0),null==c&&(c=!1);var d,e,f=[],g=this.getChildren(a,b,c),h=0,i=g.length;for(d=0;i>d;d++)e=g[d],e.isActive()&&(f[h++]=e);return f},h.getLabelAfter=function(a){a||0!==a&&(a=this._time);var b,c=this.getLabelsArray(),d=c.length;for(b=0;d>b;b++)if(c[b].time>a)return c[b].name;return null},h.getLabelBefore=function(a){null==a&&(a=this._time);for(var b=this.getLabelsArray(),c=b.length;--c>-1;)if(b[c].time<a)return b[c].name;return null},h.getLabelsArray=function(){var a,b=[],c=0;for(a in this._labels)b[c++]={time:this._labels[a],name:a};return b.sort(function(a,b){return a.time-b.time}),b},h.progress=function(a){return arguments.length?this.totalTime(this.duration()*(this._yoyo&&0!==(1&this._cycle)?1-a:a)+this._cycle*(this._duration+this._repeatDelay),!1):this._time/this.duration()},h.totalProgress=function(a){return arguments.length?this.totalTime(this.totalDuration()*a,!1):this._totalTime/this.totalDuration()},h.totalDuration=function(b){return arguments.length?-1===this._repeat?this:this.duration((b-this._repeat*this._repeatDelay)/(this._repeat+1)):(this._dirty&&(a.prototype.totalDuration.call(this),this._totalDuration=-1===this._repeat?999999999999:this._duration*(this._repeat+1)+this._repeatDelay*this._repeat),this._totalDuration)},h.time=function(a,b){return arguments.length?(this._dirty&&this.totalDuration(),a>this._duration&&(a=this._duration),this._yoyo&&0!==(1&this._cycle)?a=this._duration-a+this._cycle*(this._duration+this._repeatDelay):0!==this._repeat&&(a+=this._cycle*(this._duration+this._repeatDelay)),this.totalTime(a,b)):this._time},h.repeat=function(a){return arguments.length?(this._repeat=a,this._uncache(!0)):this._repeat},h.repeatDelay=function(a){return arguments.length?(this._repeatDelay=a,this._uncache(!0)):this._repeatDelay},h.yoyo=function(a){return arguments.length?(this._yoyo=a,this):this._yoyo},h.currentLabel=function(a){return arguments.length?this.seek(a,!0):this.getLabelBefore(this._time+1e-8)},d},!0),function(){var a=180/Math.PI,b=[],c=[],d=[],e={},f=function(a,b,c,d){this.a=a,this.b=b,this.c=c,this.d=d,this.da=d-a,this.ca=c-a,this.ba=b-a},g=",x,y,z,left,top,right,bottom,marginTop,marginLeft,marginRight,marginBottom,paddingLeft,paddingTop,paddingRight,paddingBottom,backgroundPosition,backgroundPosition_y,",h=function(a,b,c,d){var e={a:a},f={},g={},h={c:d},i=(a+b)/2,j=(b+c)/2,k=(c+d)/2,l=(i+j)/2,m=(j+k)/2,n=(m-l)/8;return e.b=i+(a-i)/4,f.b=l+n,e.c=f.a=(e.b+f.b)/2,f.c=g.a=(l+m)/2,g.b=m-n,h.b=k+(d-k)/4,g.c=h.a=(g.b+h.b)/2,[e,f,g,h]},i=function(a,e,f,g,i){var j,k,l,m,n,o,p,q,r,s,t,u,v,w=a.length-1,x=0,y=a[0].a;for(j=0;w>j;j++)n=a[x],k=n.a,l=n.d,m=a[x+1].d,i?(t=b[j],u=c[j],v=(u+t)*e*.25/(g?.5:d[j]||.5),o=l-(l-k)*(g?.5*e:0!==t?v/t:0),p=l+(m-l)*(g?.5*e:0!==u?v/u:0),q=l-(o+((p-o)*(3*t/(t+u)+.5)/4||0))):(o=l-(l-k)*e*.5,p=l+(m-l)*e*.5,q=l-(o+p)/2),o+=q,p+=q,n.c=r=o,0!==j?n.b=y:n.b=y=n.a+.6*(n.c-n.a),n.da=l-k,n.ca=r-k,n.ba=y-k,f?(s=h(k,y,r,l),a.splice(x,1,s[0],s[1],s[2],s[3]),x+=4):x++,y=p;n=a[x],n.b=y,n.c=y+.4*(n.d-y),n.da=n.d-n.a,n.ca=n.c-n.a,n.ba=y-n.a,f&&(s=h(n.a,y,n.c,n.d),a.splice(x,1,s[0],s[1],s[2],s[3]))},j=function(a,d,e,g){var h,i,j,k,l,m,n=[];if(g)for(a=[g].concat(a),i=a.length;--i>-1;)"string"==typeof(m=a[i][d])&&"="===m.charAt(1)&&(a[i][d]=g[d]+Number(m.charAt(0)+m.substr(2)));if(h=a.length-2,0>h)return n[0]=new f(a[0][d],0,0,a[-1>h?0:1][d]),n;for(i=0;h>i;i++)j=a[i][d],k=a[i+1][d],n[i]=new f(j,0,0,k),e&&(l=a[i+2][d],b[i]=(b[i]||0)+(k-j)*(k-j),c[i]=(c[i]||0)+(l-k)*(l-k));return n[i]=new f(a[i][d],0,0,a[i+1][d]),n},k=function(a,f,h,k,l,m){var n,o,p,q,r,s,t,u,v={},w=[],x=m||a[0];l="string"==typeof l?","+l+",":g,null==f&&(f=1);for(o in a[0])w.push(o);if(a.length>1){for(u=a[a.length-1],t=!0,n=w.length;--n>-1;)if(o=w[n],Math.abs(x[o]-u[o])>.05){t=!1;break}t&&(a=a.concat(),m&&a.unshift(m),a.push(a[1]),m=a[a.length-3])}for(b.length=c.length=d.length=0,n=w.length;--n>-1;)o=w[n],e[o]=-1!==l.indexOf(","+o+","),v[o]=j(a,o,e[o],m);for(n=b.length;--n>-1;)b[n]=Math.sqrt(b[n]),c[n]=Math.sqrt(c[n]);if(!k){for(n=w.length;--n>-1;)if(e[o])for(p=v[w[n]],s=p.length-1,q=0;s>q;q++)r=p[q+1].da/c[q]+p[q].da/b[q],d[q]=(d[q]||0)+r*r;for(n=d.length;--n>-1;)d[n]=Math.sqrt(d[n])}for(n=w.length,q=h?4:1;--n>-1;)o=w[n],p=v[o],i(p,f,h,k,e[o]),t&&(p.splice(0,q),p.splice(p.length-q,q));return v},l=function(a,b,c){b=b||"soft";var d,e,g,h,i,j,k,l,m,n,o,p={},q="cubic"===b?3:2,r="soft"===b,s=[];if(r&&c&&(a=[c].concat(a)),null==a||a.length<q+1)throw"invalid Bezier data";for(m in a[0])s.push(m);for(j=s.length;--j>-1;){for(m=s[j],p[m]=i=[],n=0,l=a.length,k=0;l>k;k++)d=null==c?a[k][m]:"string"==typeof(o=a[k][m])&&"="===o.charAt(1)?c[m]+Number(o.charAt(0)+o.substr(2)):Number(o),r&&k>1&&l-1>k&&(i[n++]=(d+i[n-2])/2),i[n++]=d;for(l=n-q+1,n=0,k=0;l>k;k+=q)d=i[k],e=i[k+1],g=i[k+2],h=2===q?0:i[k+3],i[n++]=o=3===q?new f(d,e,g,h):new f(d,(2*e+d)/3,(2*e+g)/3,g);i.length=n}return p},m=function(a,b,c){for(var d,e,f,g,h,i,j,k,l,m,n,o=1/c,p=a.length;--p>-1;)for(m=a[p],f=m.a,g=m.d-f,h=m.c-f,i=m.b-f,d=e=0,k=1;c>=k;k++)j=o*k,l=1-j,d=e-(e=(j*j*g+3*l*(j*h+l*i))*j),n=p*c+k-1,b[n]=(b[n]||0)+d*d},n=function(a,b){b=b>>0||6;var c,d,e,f,g=[],h=[],i=0,j=0,k=b-1,l=[],n=[];for(c in a)m(a[c],g,b);for(e=g.length,d=0;e>d;d++)i+=Math.sqrt(g[d]),f=d%b,n[f]=i,f===k&&(j+=i,f=d/b>>0,l[f]=n,h[f]=j,i=0,n=[]);return{length:j,lengths:h,segments:l}},o=window._gsDefine.plugin({propName:"bezier",priority:-1,version:"1.3.2",API:2,global:!0,init:function(a,b,c){this._target=a,b instanceof Array&&(b={values:b}),this._func={},this._round={},this._props=[],this._timeRes=null==b.timeResolution?6:parseInt(b.timeResolution,10);var d,e,f,g,h,i=b.values||[],j={},m=i[0],o=b.autoRotate||c.vars.orientToBezier;this._autoRotate=o?o instanceof Array?o:[["x","y","rotation",o===!0?0:Number(o)||0]]:null;for(d in m)this._props.push(d);for(f=this._props.length;--f>-1;)d=this._props[f],this._overwriteProps.push(d),e=this._func[d]="function"==typeof a[d],j[d]=e?a[d.indexOf("set")||"function"!=typeof a["get"+d.substr(3)]?d:"get"+d.substr(3)]():parseFloat(a[d]),h||j[d]!==i[0][d]&&(h=j);if(this._beziers="cubic"!==b.type&&"quadratic"!==b.type&&"soft"!==b.type?k(i,isNaN(b.curviness)?1:b.curviness,!1,"thruBasic"===b.type,b.correlate,h):l(i,b.type,j),this._segCount=this._beziers[d].length,this._timeRes){var p=n(this._beziers,this._timeRes);this._length=p.length,this._lengths=p.lengths,this._segments=p.segments,this._l1=this._li=this._s1=this._si=0,this._l2=this._lengths[0],this._curSeg=this._segments[0],this._s2=this._curSeg[0],this._prec=1/this._curSeg.length}if(o=this._autoRotate)for(this._initialRotations=[],o[0]instanceof Array||(this._autoRotate=o=[o]),f=o.length;--f>-1;){for(g=0;3>g;g++)d=o[f][g],this._func[d]="function"==typeof a[d]?a[d.indexOf("set")||"function"!=typeof a["get"+d.substr(3)]?d:"get"+d.substr(3)]:!1;d=o[f][2],this._initialRotations[f]=this._func[d]?this._func[d].call(this._target):this._target[d]}return this._startRatio=c.vars.runBackwards?1:0,!0},set:function(b){var c,d,e,f,g,h,i,j,k,l,m=this._segCount,n=this._func,o=this._target,p=b!==this._startRatio;if(this._timeRes){if(k=this._lengths,l=this._curSeg,b*=this._length,e=this._li,b>this._l2&&m-1>e){for(j=m-1;j>e&&(this._l2=k[++e])<=b;);this._l1=k[e-1],this._li=e,this._curSeg=l=this._segments[e],this._s2=l[this._s1=this._si=0]}else if(b<this._l1&&e>0){for(;e>0&&(this._l1=k[--e])>=b;);0===e&&b<this._l1?this._l1=0:e++,this._l2=k[e],this._li=e,this._curSeg=l=this._segments[e],this._s1=l[(this._si=l.length-1)-1]||0,this._s2=l[this._si]}if(c=e,b-=this._l1,e=this._si,b>this._s2&&e<l.length-1){for(j=l.length-1;j>e&&(this._s2=l[++e])<=b;);this._s1=l[e-1],this._si=e}else if(b<this._s1&&e>0){for(;e>0&&(this._s1=l[--e])>=b;);0===e&&b<this._s1?this._s1=0:e++,this._s2=l[e],this._si=e}h=(e+(b-this._s1)/(this._s2-this._s1))*this._prec}else c=0>b?0:b>=1?m-1:m*b>>0,h=(b-c*(1/m))*m;for(d=1-h,e=this._props.length;--e>-1;)f=this._props[e],g=this._beziers[f][c],i=(h*h*g.da+3*d*(h*g.ca+d*g.ba))*h+g.a,this._round[f]&&(i=Math.round(i)),n[f]?o[f](i):o[f]=i;if(this._autoRotate){var q,r,s,t,u,v,w,x=this._autoRotate;for(e=x.length;--e>-1;)f=x[e][2],v=x[e][3]||0,w=x[e][4]===!0?1:a,g=this._beziers[x[e][0]],q=this._beziers[x[e][1]],g&&q&&(g=g[c],q=q[c],r=g.a+(g.b-g.a)*h,t=g.b+(g.c-g.b)*h,r+=(t-r)*h,t+=(g.c+(g.d-g.c)*h-t)*h,s=q.a+(q.b-q.a)*h,u=q.b+(q.c-q.b)*h,s+=(u-s)*h,u+=(q.c+(q.d-q.c)*h-u)*h,i=p?Math.atan2(u-s,t-r)*w+v:this._initialRotations[e],n[f]?o[f](i):o[f]=i)}}}),p=o.prototype;o.bezierThrough=k,o.cubicToQuadratic=h,o._autoCSS=!0,o.quadraticToCubic=function(a,b,c){return new f(a,(2*b+a)/3,(2*b+c)/3,c)},o._cssRegister=function(){var a=window._gsDefine.globals.CSSPlugin;if(a){var b=a._internals,c=b._parseToProxy,d=b._setPluginRatio,e=b.CSSPropTween;b._registerComplexSpecialProp("bezier",{parser:function(a,b,f,g,h,i){b instanceof Array&&(b={values:b}),i=new o;var j,k,l,m=b.values,n=m.length-1,p=[],q={};if(0>n)return h;for(j=0;n>=j;j++)l=c(a,m[j],g,h,i,n!==j),p[j]=l.end;for(k in b)q[k]=b[k];return q.values=p,h=new e(a,"bezier",0,0,l.pt,2),h.data=l,h.plugin=i,h.setRatio=d,0===q.autoRotate&&(q.autoRotate=!0),!q.autoRotate||q.autoRotate instanceof Array||(j=q.autoRotate===!0?0:Number(q.autoRotate),q.autoRotate=null!=l.end.left?[["left","top","rotation",j,!1]]:null!=l.end.x?[["x","y","rotation",j,!1]]:!1),q.autoRotate&&(g._transform||g._enableTransforms(!1),l.autoRotate=g._target._gsTransform),i._onInitTween(l.proxy,q,g._tween),h}})}},p._roundProps=function(a,b){for(var c=this._overwriteProps,d=c.length;--d>-1;)(a[c[d]]||a.bezier||a.bezierThrough)&&(this._round[c[d]]=b)},p._kill=function(a){var b,c,d=this._props;for(b in this._beziers)if(b in a)for(delete this._beziers[b],delete this._func[b],c=d.length;--c>-1;)d[c]===b&&d.splice(c,1);return this._super._kill.call(this,a)}}(),window._gsDefine("plugins.CSSPlugin",["plugins.TweenPlugin","TweenLite"],function(a,b){var c,d,e,f,g=function(){a.call(this,"css"),this._overwriteProps.length=0,this.setRatio=g.prototype.setRatio},h={},i=g.prototype=new a("css");i.constructor=g,g.version="1.12.1",g.API=2,g.defaultTransformPerspective=0,g.defaultSkewType="compensated",i="px",g.suffixMap={top:i,right:i,bottom:i,left:i,width:i,height:i,fontSize:i,padding:i,margin:i,perspective:i,lineHeight:""};var j,k,l,m,n,o,p=/(?:\d|\-\d|\.\d|\-\.\d)+/g,q=/(?:\d|\-\d|\.\d|\-\.\d|\+=\d|\-=\d|\+=.\d|\-=\.\d)+/g,r=/(?:\+=|\-=|\-|\b)[\d\-\.]+[a-zA-Z0-9]*(?:%|\b)/gi,s=/[^\d\-\.]/g,t=/(?:\d|\-|\+|=|#|\.)*/g,u=/opacity *= *([^)]*)/i,v=/opacity:([^;]*)/i,w=/alpha\(opacity *=.+?\)/i,x=/^(rgb|hsl)/,y=/([A-Z])/g,z=/-([a-z])/gi,A=/(^(?:url\(\"|url\())|(?:(\"\))$|\)$)/gi,B=function(a,b){return b.toUpperCase()},C=/(?:Left|Right|Width)/i,D=/(M11|M12|M21|M22)=[\d\-\.e]+/gi,E=/progid\:DXImageTransform\.Microsoft\.Matrix\(.+?\)/i,F=/,(?=[^\)]*(?:\(|$))/gi,G=Math.PI/180,H=180/Math.PI,I={},J=document,K=J.createElement("div"),L=J.createElement("img"),M=g._internals={_specialProps:h},N=navigator.userAgent,O=function(){var a,b=N.indexOf("Android"),c=J.createElement("div");return l=-1!==N.indexOf("Safari")&&-1===N.indexOf("Chrome")&&(-1===b||Number(N.substr(b+8,1))>3),n=l&&Number(N.substr(N.indexOf("Version/")+8,1))<6,m=-1!==N.indexOf("Firefox"),/MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(N)&&(o=parseFloat(RegExp.$1)),c.innerHTML="<a style='top:1px;opacity:.55;'>a</a>",a=c.getElementsByTagName("a")[0],a?/^0.55/.test(a.style.opacity):!1}(),P=function(a){return u.test("string"==typeof a?a:(a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100:1},Q=function(a){window.console},R="",S="",T=function(a,b){b=b||K;var c,d,e=b.style;if(void 0!==e[a])return a;for(a=a.charAt(0).toUpperCase()+a.substr(1),c=["O","Moz","ms","Ms","Webkit"],d=5;--d>-1&&void 0===e[c[d]+a];);return d>=0?(S=3===d?"ms":c[d],R="-"+S.toLowerCase()+"-",S+a):null},U=J.defaultView?J.defaultView.getComputedStyle:function(){},V=g.getStyle=function(a,b,c,d,e){var f;return O||"opacity"!==b?(!d&&a.style[b]?f=a.style[b]:(c=c||U(a))?f=c[b]||c.getPropertyValue(b)||c.getPropertyValue(b.replace(y,"-$1").toLowerCase()):a.currentStyle&&(f=a.currentStyle[b]),null==e||f&&"none"!==f&&"auto"!==f&&"auto auto"!==f?f:e):P(a)},W=M.convertToPixels=function(a,c,d,e,f){if("px"===e||!e)return d;if("auto"===e||!d)return 0;var h,i,j,k=C.test(c),l=a,m=K.style,n=0>d;if(n&&(d=-d),"%"===e&&-1!==c.indexOf("border"))h=d/100*(k?a.clientWidth:a.clientHeight);else{if(m.cssText="border:0 solid red;position:"+V(a,"position")+";line-height:0;","%"!==e&&l.appendChild)m[k?"borderLeftWidth":"borderTopWidth"]=d+e;else{if(l=a.parentNode||J.body,i=l._gsCache,j=b.ticker.frame,i&&k&&i.time===j)return i.width*d/100;m[k?"width":"height"]=d+e}l.appendChild(K),h=parseFloat(K[k?"offsetWidth":"offsetHeight"]),l.removeChild(K),k&&"%"===e&&g.cacheWidths!==!1&&(i=l._gsCache=l._gsCache||{},i.time=j,i.width=h/d*100),0!==h||f||(h=W(a,c,d,e,!0))}return n?-h:h},X=M.calculateOffset=function(a,b,c){if("absolute"!==V(a,"position",c))return 0;var d="left"===b?"Left":"Top",e=V(a,"margin"+d,c);return a["offset"+d]-(W(a,b,parseFloat(e),e.replace(t,""))||0)},Y=function(a,b){var c,d,e={};if(b=b||U(a,null))if(c=b.length)for(;--c>-1;)e[b[c].replace(z,B)]=b.getPropertyValue(b[c]);else for(c in b)e[c]=b[c];else if(b=a.currentStyle||a.style)for(c in b)"string"==typeof c&&void 0===e[c]&&(e[c.replace(z,B)]=b[c]);return O||(e.opacity=P(a)),d=ya(a,b,!1),e.rotation=d.rotation,e.skewX=d.skewX,e.scaleX=d.scaleX,e.scaleY=d.scaleY,e.x=d.x,e.y=d.y,wa&&(e.z=d.z,e.rotationX=d.rotationX,e.rotationY=d.rotationY,e.scaleZ=d.scaleZ),e.filters&&delete e.filters,e},Z=function(a,b,c,d,e){var f,g,h,i={},j=a.style;for(g in c)"cssText"!==g&&"length"!==g&&isNaN(g)&&(b[g]!==(f=c[g])||e&&e[g])&&-1===g.indexOf("Origin")&&("number"==typeof f||"string"==typeof f)&&(i[g]="auto"!==f||"left"!==g&&"top"!==g?""!==f&&"auto"!==f&&"none"!==f||"string"!=typeof b[g]||""===b[g].replace(s,"")?f:0:X(a,g),void 0!==j[g]&&(h=new la(j,g,j[g],h)));if(d)for(g in d)"className"!==g&&(i[g]=d[g]);return{difs:i,firstMPT:h}},$={width:["Left","Right"],height:["Top","Bottom"]},_=["marginLeft","marginRight","marginTop","marginBottom"],aa=function(a,b,c){var d=parseFloat("width"===b?a.offsetWidth:a.offsetHeight),e=$[b],f=e.length;for(c=c||U(a,null);--f>-1;)d-=parseFloat(V(a,"padding"+e[f],c,!0))||0,d-=parseFloat(V(a,"border"+e[f]+"Width",c,!0))||0;return d},ba=function(a,b){(null==a||""===a||"auto"===a||"auto auto"===a)&&(a="0 0");var c=a.split(" "),d=-1!==a.indexOf("left")?"0%":-1!==a.indexOf("right")?"100%":c[0],e=-1!==a.indexOf("top")?"0%":-1!==a.indexOf("bottom")?"100%":c[1];return null==e?e="0":"center"===e&&(e="50%"),("center"===d||isNaN(parseFloat(d))&&-1===(d+"").indexOf("="))&&(d="50%"),b&&(b.oxp=-1!==d.indexOf("%"),b.oyp=-1!==e.indexOf("%"),b.oxr="="===d.charAt(1),b.oyr="="===e.charAt(1),b.ox=parseFloat(d.replace(s,"")),b.oy=parseFloat(e.replace(s,""))),d+" "+e+(c.length>2?" "+c[2]:"")},ca=function(a,b){return"string"==typeof a&&"="===a.charAt(1)?parseInt(a.charAt(0)+"1",10)*parseFloat(a.substr(2)):parseFloat(a)-parseFloat(b)},da=function(a,b){return null==a?b:"string"==typeof a&&"="===a.charAt(1)?parseInt(a.charAt(0)+"1",10)*Number(a.substr(2))+b:parseFloat(a)},ea=function(a,b,c,d){var e,f,g,h,i=1e-6;return null==a?h=b:"number"==typeof a?h=a:(e=360,f=a.split("_"),g=Number(f[0].replace(s,""))*(-1===a.indexOf("rad")?1:H)-("="===a.charAt(1)?0:b),f.length&&(d&&(d[c]=b+g),-1!==a.indexOf("short")&&(g%=e,g!==g%(e/2)&&(g=0>g?g+e:g-e)),-1!==a.indexOf("_cw")&&0>g?g=(g+9999999999*e)%e-(g/e|0)*e:-1!==a.indexOf("ccw")&&g>0&&(g=(g-9999999999*e)%e-(g/e|0)*e)),h=b+g),i>h&&h>-i&&(h=0),h},fa={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},ga=function(a,b,c){return a=0>a?a+1:a>1?a-1:a,255*(1>6*a?b+(c-b)*a*6:.5>a?c:2>3*a?b+(c-b)*(2/3-a)*6:b)+.5|0},ha=function(a){var b,c,d,e,f,g;return a&&""!==a?"number"==typeof a?[a>>16,a>>8&255,255&a]:(","===a.charAt(a.length-1)&&(a=a.substr(0,a.length-1)),fa[a]?fa[a]:"#"===a.charAt(0)?(4===a.length&&(b=a.charAt(1),c=a.charAt(2),d=a.charAt(3),a="#"+b+b+c+c+d+d),a=parseInt(a.substr(1),16),[a>>16,a>>8&255,255&a]):"hsl"===a.substr(0,3)?(a=a.match(p),e=Number(a[0])%360/360,f=Number(a[1])/100,g=Number(a[2])/100,c=.5>=g?g*(f+1):g+f-g*f,b=2*g-c,a.length>3&&(a[3]=Number(a[3])),a[0]=ga(e+1/3,b,c),a[1]=ga(e,b,c),a[2]=ga(e-1/3,b,c),a):(a=a.match(p)||fa.transparent,a[0]=Number(a[0]),a[1]=Number(a[1]),a[2]=Number(a[2]),a.length>3&&(a[3]=Number(a[3])),a)):fa.black},ia="(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#.+?\\b";for(i in fa)ia+="|"+i+"\\b";ia=new RegExp(ia+")","gi");var ja=function(a,b,c,d){if(null==a)return function(a){return a};var e,f=b?(a.match(ia)||[""])[0]:"",g=a.split(f).join("").match(r)||[],h=a.substr(0,a.indexOf(g[0])),i=")"===a.charAt(a.length-1)?")":"",j=-1!==a.indexOf(" ")?" ":",",k=g.length,l=k>0?g[0].replace(p,""):"";return k?e=b?function(a){var b,m,n,o;if("number"==typeof a)a+=l;else if(d&&F.test(a)){for(o=a.replace(F,"|").split("|"),n=0;n<o.length;n++)o[n]=e(o[n]);return o.join(",")}if(b=(a.match(ia)||[f])[0],m=a.split(b).join("").match(r)||[],n=m.length,k>n--)for(;++n<k;)m[n]=c?m[(n-1)/2|0]:g[n];return h+m.join(j)+j+b+i+(-1!==a.indexOf("inset")?" inset":"")}:function(a){var b,f,m;if("number"==typeof a)a+=l;else if(d&&F.test(a)){for(f=a.replace(F,"|").split("|"),m=0;m<f.length;m++)f[m]=e(f[m]);return f.join(",")}if(b=a.match(r)||[],m=b.length,k>m--)for(;++m<k;)b[m]=c?b[(m-1)/2|0]:g[m];return h+b.join(j)+i}:function(a){return a}},ka=function(a){return a=a.split(","),function(b,c,d,e,f,g,h){var i,j=(c+"").split(" ");for(h={},i=0;4>i;i++)h[a[i]]=j[i]=j[i]||j[(i-1)/2>>0];return e.parse(b,h,f,g)}},la=(M._setPluginRatio=function(a){this.plugin.setRatio(a);for(var b,c,d,e,f=this.data,g=f.proxy,h=f.firstMPT,i=1e-6;h;)b=g[h.v],h.r?b=Math.round(b):i>b&&b>-i&&(b=0),h.t[h.p]=b,h=h._next;if(f.autoRotate&&(f.autoRotate.rotation=g.rotation),1===a)for(h=f.firstMPT;h;){if(c=h.t,c.type){if(1===c.type){for(e=c.xs0+c.s+c.xs1,d=1;d<c.l;d++)e+=c["xn"+d]+c["xs"+(d+1)];c.e=e}}else c.e=c.s+c.xs0;h=h._next}},function(a,b,c,d,e){this.t=a,this.p=b,this.v=c,this.r=e,d&&(d._prev=this,this._next=d)}),ma=(M._parseToProxy=function(a,b,c,d,e,f){var g,h,i,j,k,l=d,m={},n={},o=c._transform,p=I;for(c._transform=null,I=b,d=k=c.parse(a,b,d,e),I=p,f&&(c._transform=o,l&&(l._prev=null,l._prev&&(l._prev._next=null)));d&&d!==l;){if(d.type<=1&&(h=d.p,n[h]=d.s+d.c,m[h]=d.s,f||(j=new la(d,"s",h,j,d.r),d.c=0),1===d.type))for(g=d.l;--g>0;)i="xn"+g,h=d.p+"_"+i,n[h]=d.data[i],m[h]=d[i],f||(j=new la(d,i,h,j,d.rxp[i]));d=d._next}return{proxy:m,end:n,firstMPT:j,pt:k}},M.CSSPropTween=function(a,b,d,e,g,h,i,j,k,l,m){this.t=a,this.p=b,this.s=d,this.c=e,this.n=i||b,a instanceof ma||f.push(this.n),this.r=j,this.type=h||0,k&&(this.pr=k,c=!0),this.b=void 0===l?d:l,this.e=void 0===m?d+e:m,g&&(this._next=g,g._prev=this)}),na=g.parseComplex=function(a,b,c,d,e,f,g,h,i,k){c=c||f||"",g=new ma(a,b,0,0,g,k?2:1,null,!1,h,c,d),d+="";var l,m,n,o,r,s,t,u,v,w,y,z,A=c.split(", ").join(",").split(" "),B=d.split(", ").join(",").split(" "),C=A.length,D=j!==!1;for((-1!==d.indexOf(",")||-1!==c.indexOf(","))&&(A=A.join(" ").replace(F,", ").split(" "),B=B.join(" ").replace(F,", ").split(" "),C=A.length),C!==B.length&&(A=(f||"").split(" "),C=A.length),g.plugin=i,g.setRatio=k,l=0;C>l;l++)if(o=A[l],r=B[l],u=parseFloat(o),u||0===u)g.appendXtra("",u,ca(r,u),r.replace(q,""),D&&-1!==r.indexOf("px"),!0);else if(e&&("#"===o.charAt(0)||fa[o]||x.test(o)))z=","===r.charAt(r.length-1)?"),":")",o=ha(o),r=ha(r),v=o.length+r.length>6,v&&!O&&0===r[3]?(g["xs"+g.l]+=g.l?" transparent":"transparent",g.e=g.e.split(B[l]).join("transparent")):(O||(v=!1),g.appendXtra(v?"rgba(":"rgb(",o[0],r[0]-o[0],",",!0,!0).appendXtra("",o[1],r[1]-o[1],",",!0).appendXtra("",o[2],r[2]-o[2],v?",":z,!0),v&&(o=o.length<4?1:o[3],g.appendXtra("",o,(r.length<4?1:r[3])-o,z,!1)));else if(s=o.match(p)){if(t=r.match(q),!t||t.length!==s.length)return g;for(n=0,m=0;m<s.length;m++)y=s[m],w=o.indexOf(y,n),g.appendXtra(o.substr(n,w-n),Number(y),ca(t[m],y),"",D&&"px"===o.substr(w+y.length,2),0===m),n=w+y.length;g["xs"+g.l]+=o.substr(n)}else g["xs"+g.l]+=g.l?" "+o:o;if(-1!==d.indexOf("=")&&g.data){for(z=g.xs0+g.data.s,l=1;l<g.l;l++)z+=g["xs"+l]+g.data["xn"+l];g.e=z+g["xs"+l]}return g.l||(g.type=-1,g.xs0=g.e),g.xfirst||g},oa=9;for(i=ma.prototype,i.l=i.pr=0;--oa>0;)i["xn"+oa]=0,i["xs"+oa]="";i.xs0="",i._next=i._prev=i.xfirst=i.data=i.plugin=i.setRatio=i.rxp=null,i.appendXtra=function(a,b,c,d,e,f){var g=this,h=g.l;return g["xs"+h]+=f&&h?" "+a:a||"",c||0===h||g.plugin?(g.l++,g.type=g.setRatio?2:1,g["xs"+g.l]=d||"",h>0?(g.data["xn"+h]=b+c,g.rxp["xn"+h]=e,g["xn"+h]=b,g.plugin||(g.xfirst=new ma(g,"xn"+h,b,c,g.xfirst||g,0,g.n,e,g.pr),g.xfirst.xs0=0),g):(g.data={s:b+c},g.rxp={},g.s=b,g.c=c,g.r=e,g)):(g["xs"+h]+=b+(d||""),g)};var pa=function(a,b){b=b||{},this.p=b.prefix?T(a)||a:a,h[a]=h[this.p]=this,this.format=b.formatter||ja(b.defaultValue,b.color,b.collapsible,b.multi),b.parser&&(this.parse=b.parser),this.clrs=b.color,this.multi=b.multi,this.keyword=b.keyword,this.dflt=b.defaultValue,this.pr=b.priority||0},qa=M._registerComplexSpecialProp=function(a,b,c){"object"!=typeof b&&(b={parser:c});var d,e,f=a.split(","),g=b.defaultValue;for(c=c||[g],d=0;d<f.length;d++)b.prefix=0===d&&b.prefix,b.defaultValue=c[d]||g,e=new pa(f[d],b)},ra=function(a){if(!h[a]){var b=a.charAt(0).toUpperCase()+a.substr(1)+"Plugin";qa(a,{parser:function(a,c,d,e,f,g,i){var j=(window.GreenSockGlobals||window).com.greensock.plugins[b];return j?(j._cssRegister(),h[d].parse(a,c,d,e,f,g,i)):(Q("Error: "+b+" js file not loaded."),f)}})}};i=pa.prototype,i.parseComplex=function(a,b,c,d,e,f){var g,h,i,j,k,l,m=this.keyword;if(this.multi&&(F.test(c)||F.test(b)?(h=b.replace(F,"|").split("|"),i=c.replace(F,"|").split("|")):m&&(h=[b],i=[c])),i){for(j=i.length>h.length?i.length:h.length,g=0;j>g;g++)b=h[g]=h[g]||this.dflt,c=i[g]=i[g]||this.dflt,m&&(k=b.indexOf(m),l=c.indexOf(m),k!==l&&(c=-1===l?i:h,c[g]+=" "+m));b=h.join(", "),c=i.join(", ")}return na(a,this.p,b,c,this.clrs,this.dflt,d,this.pr,e,f)},i.parse=function(a,b,c,d,f,g,h){return this.parseComplex(a.style,this.format(V(a,this.p,e,!1,this.dflt)),this.format(b),f,g)},g.registerSpecialProp=function(a,b,c){qa(a,{parser:function(a,d,e,f,g,h,i){var j=new ma(a,e,0,0,g,2,e,!1,c);return j.plugin=h,j.setRatio=b(a,d,f._tween,e),j},priority:c})};var sa="scaleX,scaleY,scaleZ,x,y,z,skewX,skewY,rotation,rotationX,rotationY,perspective".split(","),ta=T("transform"),ua=R+"transform",va=T("transformOrigin"),wa=null!==T("perspective"),xa=M.Transform=function(){this.skewY=0},ya=M.getTransform=function(a,b,c,d){if(a._gsTransform&&c&&!d)return a._gsTransform;var e,f,h,i,j,k,l,m,n,o,p,q,r,s=c?a._gsTransform||new xa:new xa,t=s.scaleX<0,u=2e-5,v=1e5,w=179.99,x=w*G,y=wa?parseFloat(V(a,va,b,!1,"0 0 0").split(" ")[2])||s.zOrigin||0:0;for(ta?e=V(a,ua,b,!0):a.currentStyle&&(e=a.currentStyle.filter.match(D),e=e&&4===e.length?[e[0].substr(4),Number(e[2].substr(4)),Number(e[1].substr(4)),e[3].substr(4),s.x||0,s.y||0].join(","):""),f=(e||"").match(/(?:\-|\b)[\d\-\.e]+\b/gi)||[],h=f.length;--h>-1;)i=Number(f[h]),f[h]=(j=i-(i|=0))?(j*v+(0>j?-.5:.5)|0)/v+i:i;if(16===f.length){var z=f[8],A=f[9],B=f[10],C=f[12],E=f[13],F=f[14];if(s.zOrigin&&(F=-s.zOrigin,C=z*F-f[12],E=A*F-f[13],F=B*F+s.zOrigin-f[14]),!c||d||null==s.rotationX){var I,J,K,L,M,N,O,P=f[0],Q=f[1],R=f[2],S=f[3],T=f[4],U=f[5],W=f[6],X=f[7],Y=f[11],Z=Math.atan2(W,B),$=-x>Z||Z>x;s.rotationX=Z*H,Z&&(L=Math.cos(-Z),M=Math.sin(-Z),I=T*L+z*M,J=U*L+A*M,K=W*L+B*M,z=T*-M+z*L,A=U*-M+A*L,B=W*-M+B*L,Y=X*-M+Y*L,T=I,U=J,W=K),Z=Math.atan2(z,P),s.rotationY=Z*H,Z&&(N=-x>Z||Z>x,L=Math.cos(-Z),M=Math.sin(-Z),I=P*L-z*M,J=Q*L-A*M,K=R*L-B*M,A=Q*M+A*L,B=R*M+B*L,Y=S*M+Y*L,P=I,Q=J,R=K),Z=Math.atan2(Q,U),s.rotation=Z*H,Z&&(O=-x>Z||Z>x,L=Math.cos(-Z),M=Math.sin(-Z),P=P*L+T*M,J=Q*L+U*M,U=Q*-M+U*L,W=R*-M+W*L,Q=J),O&&$?s.rotation=s.rotationX=0:O&&N?s.rotation=s.rotationY=0:N&&$&&(s.rotationY=s.rotationX=0),s.scaleX=(Math.sqrt(P*P+Q*Q)*v+.5|0)/v,s.scaleY=(Math.sqrt(U*U+A*A)*v+.5|0)/v,s.scaleZ=(Math.sqrt(W*W+B*B)*v+.5|0)/v,
-s.skewX=0,s.perspective=Y?1/(0>Y?-Y:Y):0,s.x=C,s.y=E,s.z=F}}else if((!wa||d||!f.length||s.x!==f[4]||s.y!==f[5]||!s.rotationX&&!s.rotationY)&&(void 0===s.x||"none"!==V(a,"display",b))){var _=f.length>=6,aa=_?f[0]:1,ba=f[1]||0,ca=f[2]||0,da=_?f[3]:1;s.x=f[4]||0,s.y=f[5]||0,k=Math.sqrt(aa*aa+ba*ba),l=Math.sqrt(da*da+ca*ca),m=aa||ba?Math.atan2(ba,aa)*H:s.rotation||0,n=ca||da?Math.atan2(ca,da)*H+m:s.skewX||0,o=k-Math.abs(s.scaleX||0),p=l-Math.abs(s.scaleY||0),Math.abs(n)>90&&Math.abs(n)<270&&(t?(k*=-1,n+=0>=m?180:-180,m+=0>=m?180:-180):(l*=-1,n+=0>=n?180:-180)),q=(m-s.rotation)%180,r=(n-s.skewX)%180,(void 0===s.skewX||o>u||-u>o||p>u||-u>p||q>-w&&w>q&&q*v|!1||r>-w&&w>r&&r*v|!1)&&(s.scaleX=k,s.scaleY=l,s.rotation=m,s.skewX=n),wa&&(s.rotationX=s.rotationY=s.z=0,s.perspective=parseFloat(g.defaultTransformPerspective)||0,s.scaleZ=1)}s.zOrigin=y;for(h in s)s[h]<u&&s[h]>-u&&(s[h]=0);return c&&(a._gsTransform=s),s},za=function(a){var b,c,d=this.data,e=-d.rotation*G,f=e+d.skewX*G,g=1e5,h=(Math.cos(e)*d.scaleX*g|0)/g,i=(Math.sin(e)*d.scaleX*g|0)/g,j=(Math.sin(f)*-d.scaleY*g|0)/g,k=(Math.cos(f)*d.scaleY*g|0)/g,l=this.t.style,m=this.t.currentStyle;if(m){c=i,i=-j,j=-c,b=m.filter,l.filter="";var n,p,q=this.t.offsetWidth,r=this.t.offsetHeight,s="absolute"!==m.position,v="progid:DXImageTransform.Microsoft.Matrix(M11="+h+", M12="+i+", M21="+j+", M22="+k,w=d.x,x=d.y;if(null!=d.ox&&(n=(d.oxp?q*d.ox*.01:d.ox)-q/2,p=(d.oyp?r*d.oy*.01:d.oy)-r/2,w+=n-(n*h+p*i),x+=p-(n*j+p*k)),s?(n=q/2,p=r/2,v+=", Dx="+(n-(n*h+p*i)+w)+", Dy="+(p-(n*j+p*k)+x)+")"):v+=", sizingMethod='auto expand')",-1!==b.indexOf("DXImageTransform.Microsoft.Matrix(")?l.filter=b.replace(E,v):l.filter=v+" "+b,(0===a||1===a)&&1===h&&0===i&&0===j&&1===k&&(s&&-1===v.indexOf("Dx=0, Dy=0")||u.test(b)&&100!==parseFloat(RegExp.$1)||-1===b.indexOf(b.indexOf("Alpha"))&&l.removeAttribute("filter")),!s){var y,z,A,B=8>o?1:-1;for(n=d.ieOffsetX||0,p=d.ieOffsetY||0,d.ieOffsetX=Math.round((q-((0>h?-h:h)*q+(0>i?-i:i)*r))/2+w),d.ieOffsetY=Math.round((r-((0>k?-k:k)*r+(0>j?-j:j)*q))/2+x),oa=0;4>oa;oa++)z=_[oa],y=m[z],c=-1!==y.indexOf("px")?parseFloat(y):W(this.t,z,parseFloat(y),y.replace(t,""))||0,A=c!==d[z]?2>oa?-d.ieOffsetX:-d.ieOffsetY:2>oa?n-d.ieOffsetX:p-d.ieOffsetY,l[z]=(d[z]=Math.round(c-A*(0===oa||2===oa?1:B)))+"px"}}},Aa=M.set3DTransformRatio=function(a){var b,c,d,e,f,g,h,i,j,k,l,n,o,p,q,r,s,t,u,v,w,x,y,z=this.data,A=this.t.style,B=z.rotation*G,C=z.scaleX,D=z.scaleY,E=z.scaleZ,F=z.perspective;if((1===a||0===a)&&"auto"===z.force3D&&!(z.rotationY||z.rotationX||1!==E||F||z.z))return void Ba.call(this,a);if(m){var H=1e-4;H>C&&C>-H&&(C=E=2e-5),H>D&&D>-H&&(D=E=2e-5),!F||z.z||z.rotationX||z.rotationY||(F=0)}if(B||z.skewX)t=Math.cos(B),u=Math.sin(B),b=t,f=u,z.skewX&&(B-=z.skewX*G,t=Math.cos(B),u=Math.sin(B),"simple"===z.skewType&&(v=Math.tan(z.skewX*G),v=Math.sqrt(1+v*v),t*=v,u*=v)),c=-u,g=t;else{if(!(z.rotationY||z.rotationX||1!==E||F))return void(A[ta]="translate3d("+z.x+"px,"+z.y+"px,"+z.z+"px)"+(1!==C||1!==D?" scale("+C+","+D+")":""));b=g=1,c=f=0}l=1,d=e=h=i=j=k=n=o=p=0,q=F?-1/F:0,r=z.zOrigin,s=1e5,B=z.rotationY*G,B&&(t=Math.cos(B),u=Math.sin(B),j=l*-u,o=q*-u,d=b*u,h=f*u,l*=t,q*=t,b*=t,f*=t),B=z.rotationX*G,B&&(t=Math.cos(B),u=Math.sin(B),v=c*t+d*u,w=g*t+h*u,x=k*t+l*u,y=p*t+q*u,d=c*-u+d*t,h=g*-u+h*t,l=k*-u+l*t,q=p*-u+q*t,c=v,g=w,k=x,p=y),1!==E&&(d*=E,h*=E,l*=E,q*=E),1!==D&&(c*=D,g*=D,k*=D,p*=D),1!==C&&(b*=C,f*=C,j*=C,o*=C),r&&(n-=r,e=d*n,i=h*n,n=l*n+r),e=(v=(e+=z.x)-(e|=0))?(v*s+(0>v?-.5:.5)|0)/s+e:e,i=(v=(i+=z.y)-(i|=0))?(v*s+(0>v?-.5:.5)|0)/s+i:i,n=(v=(n+=z.z)-(n|=0))?(v*s+(0>v?-.5:.5)|0)/s+n:n,A[ta]="matrix3d("+[(b*s|0)/s,(f*s|0)/s,(j*s|0)/s,(o*s|0)/s,(c*s|0)/s,(g*s|0)/s,(k*s|0)/s,(p*s|0)/s,(d*s|0)/s,(h*s|0)/s,(l*s|0)/s,(q*s|0)/s,e,i,n,F?1+-n/F:1].join(",")+")"},Ba=M.set2DTransformRatio=function(a){var b,c,d,e,f,g=this.data,h=this.t,i=h.style;return g.rotationX||g.rotationY||g.z||g.force3D===!0||"auto"===g.force3D&&1!==a&&0!==a?(this.setRatio=Aa,void Aa.call(this,a)):void(g.rotation||g.skewX?(b=g.rotation*G,c=b-g.skewX*G,d=1e5,e=g.scaleX*d,f=g.scaleY*d,i[ta]="matrix("+(Math.cos(b)*e|0)/d+","+(Math.sin(b)*e|0)/d+","+(Math.sin(c)*-f|0)/d+","+(Math.cos(c)*f|0)/d+","+g.x+","+g.y+")"):i[ta]="matrix("+g.scaleX+",0,0,"+g.scaleY+","+g.x+","+g.y+")")};qa("transform,scale,scaleX,scaleY,scaleZ,x,y,z,rotation,rotationX,rotationY,rotationZ,skewX,skewY,shortRotation,shortRotationX,shortRotationY,shortRotationZ,transformOrigin,transformPerspective,directionalRotation,parseTransform,force3D,skewType",{parser:function(a,b,c,d,f,h,i){if(d._transform)return f;var j,k,l,m,n,o,p,q=d._transform=ya(a,e,!0,i.parseTransform),r=a.style,s=1e-6,t=sa.length,u=i,v={};if("string"==typeof u.transform&&ta)l=K.style,l[ta]=u.transform,l.display="block",l.position="absolute",J.body.appendChild(K),j=ya(K,null,!1),J.body.removeChild(K);else if("object"==typeof u){if(j={scaleX:da(null!=u.scaleX?u.scaleX:u.scale,q.scaleX),scaleY:da(null!=u.scaleY?u.scaleY:u.scale,q.scaleY),scaleZ:da(u.scaleZ,q.scaleZ),x:da(u.x,q.x),y:da(u.y,q.y),z:da(u.z,q.z),perspective:da(u.transformPerspective,q.perspective)},p=u.directionalRotation,null!=p)if("object"==typeof p)for(l in p)u[l]=p[l];else u.rotation=p;j.rotation=ea("rotation"in u?u.rotation:"shortRotation"in u?u.shortRotation+"_short":"rotationZ"in u?u.rotationZ:q.rotation,q.rotation,"rotation",v),wa&&(j.rotationX=ea("rotationX"in u?u.rotationX:"shortRotationX"in u?u.shortRotationX+"_short":q.rotationX||0,q.rotationX,"rotationX",v),j.rotationY=ea("rotationY"in u?u.rotationY:"shortRotationY"in u?u.shortRotationY+"_short":q.rotationY||0,q.rotationY,"rotationY",v)),j.skewX=null==u.skewX?q.skewX:ea(u.skewX,q.skewX),j.skewY=null==u.skewY?q.skewY:ea(u.skewY,q.skewY),(k=j.skewY-q.skewY)&&(j.skewX+=k,j.rotation+=k)}for(wa&&null!=u.force3D&&(q.force3D=u.force3D,o=!0),q.skewType=u.skewType||q.skewType||g.defaultSkewType,n=q.force3D||q.z||q.rotationX||q.rotationY||j.z||j.rotationX||j.rotationY||j.perspective,n||null==u.scale||(j.scaleZ=1);--t>-1;)c=sa[t],m=j[c]-q[c],(m>s||-s>m||null!=I[c])&&(o=!0,f=new ma(q,c,q[c],m,f),c in v&&(f.e=v[c]),f.xs0=0,f.plugin=h,d._overwriteProps.push(f.n));return m=u.transformOrigin,(m||wa&&n&&q.zOrigin)&&(ta?(o=!0,c=va,m=(m||V(a,c,e,!1,"50% 50%"))+"",f=new ma(r,c,0,0,f,-1,"transformOrigin"),f.b=r[c],f.plugin=h,wa?(l=q.zOrigin,m=m.split(" "),q.zOrigin=(m.length>2&&(0===l||"0px"!==m[2])?parseFloat(m[2]):l)||0,f.xs0=f.e=m[0]+" "+(m[1]||"50%")+" 0px",f=new ma(q,"zOrigin",0,0,f,-1,f.n),f.b=l,f.xs0=f.e=q.zOrigin):f.xs0=f.e=m):ba(m+"",q)),o&&(d._transformType=n||3===this._transformType?3:2),f},prefix:!0}),qa("boxShadow",{defaultValue:"0px 0px 0px 0px #999",prefix:!0,color:!0,multi:!0,keyword:"inset"}),qa("borderRadius",{defaultValue:"0px",parser:function(a,b,c,f,g,h){b=this.format(b);var i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y=["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],z=a.style;for(q=parseFloat(a.offsetWidth),r=parseFloat(a.offsetHeight),i=b.split(" "),j=0;j<y.length;j++)this.p.indexOf("border")&&(y[j]=T(y[j])),m=l=V(a,y[j],e,!1,"0px"),-1!==m.indexOf(" ")&&(l=m.split(" "),m=l[0],l=l[1]),n=k=i[j],o=parseFloat(m),t=m.substr((o+"").length),u="="===n.charAt(1),u?(p=parseInt(n.charAt(0)+"1",10),n=n.substr(2),p*=parseFloat(n),s=n.substr((p+"").length-(0>p?1:0))||""):(p=parseFloat(n),s=n.substr((p+"").length)),""===s&&(s=d[c]||t),s!==t&&(v=W(a,"borderLeft",o,t),w=W(a,"borderTop",o,t),"%"===s?(m=v/q*100+"%",l=w/r*100+"%"):"em"===s?(x=W(a,"borderLeft",1,"em"),m=v/x+"em",l=w/x+"em"):(m=v+"px",l=w+"px"),u&&(n=parseFloat(m)+p+s,k=parseFloat(l)+p+s)),g=na(z,y[j],m+" "+l,n+" "+k,!1,"0px",g);return g},prefix:!0,formatter:ja("0px 0px 0px 0px",!1,!0)}),qa("backgroundPosition",{defaultValue:"0 0",parser:function(a,b,c,d,f,g){var h,i,j,k,l,m,n="background-position",p=e||U(a,null),q=this.format((p?o?p.getPropertyValue(n+"-x")+" "+p.getPropertyValue(n+"-y"):p.getPropertyValue(n):a.currentStyle.backgroundPositionX+" "+a.currentStyle.backgroundPositionY)||"0 0"),r=this.format(b);if(-1!==q.indexOf("%")!=(-1!==r.indexOf("%"))&&(m=V(a,"backgroundImage").replace(A,""),m&&"none"!==m)){for(h=q.split(" "),i=r.split(" "),L.setAttribute("src",m),j=2;--j>-1;)q=h[j],k=-1!==q.indexOf("%"),k!==(-1!==i[j].indexOf("%"))&&(l=0===j?a.offsetWidth-L.width:a.offsetHeight-L.height,h[j]=k?parseFloat(q)/100*l+"px":parseFloat(q)/l*100+"%");q=h.join(" ")}return this.parseComplex(a.style,q,r,f,g)},formatter:ba}),qa("backgroundSize",{defaultValue:"0 0",formatter:ba}),qa("perspective",{defaultValue:"0px",prefix:!0}),qa("perspectiveOrigin",{defaultValue:"50% 50%",prefix:!0}),qa("transformStyle",{prefix:!0}),qa("backfaceVisibility",{prefix:!0}),qa("userSelect",{prefix:!0}),qa("margin",{parser:ka("marginTop,marginRight,marginBottom,marginLeft")}),qa("padding",{parser:ka("paddingTop,paddingRight,paddingBottom,paddingLeft")}),qa("clip",{defaultValue:"rect(0px,0px,0px,0px)",parser:function(a,b,c,d,f,g){var h,i,j;return 9>o?(i=a.currentStyle,j=8>o?" ":",",h="rect("+i.clipTop+j+i.clipRight+j+i.clipBottom+j+i.clipLeft+")",b=this.format(b).split(",").join(j)):(h=this.format(V(a,this.p,e,!1,this.dflt)),b=this.format(b)),this.parseComplex(a.style,h,b,f,g)}}),qa("textShadow",{defaultValue:"0px 0px 0px #999",color:!0,multi:!0}),qa("autoRound,strictUnits",{parser:function(a,b,c,d,e){return e}}),qa("border",{defaultValue:"0px solid #000",parser:function(a,b,c,d,f,g){return this.parseComplex(a.style,this.format(V(a,"borderTopWidth",e,!1,"0px")+" "+V(a,"borderTopStyle",e,!1,"solid")+" "+V(a,"borderTopColor",e,!1,"#000")),this.format(b),f,g)},color:!0,formatter:function(a){var b=a.split(" ");return b[0]+" "+(b[1]||"solid")+" "+(a.match(ia)||["#000"])[0]}}),qa("borderWidth",{parser:ka("borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth")}),qa("float,cssFloat,styleFloat",{parser:function(a,b,c,d,e,f){var g=a.style,h="cssFloat"in g?"cssFloat":"styleFloat";return new ma(g,h,0,0,e,-1,c,!1,0,g[h],b)}});var Ca=function(a){var b,c=this.t,d=c.filter||V(this.data,"filter"),e=this.s+this.c*a|0;100===e&&(-1===d.indexOf("atrix(")&&-1===d.indexOf("radient(")&&-1===d.indexOf("oader(")?(c.removeAttribute("filter"),b=!V(this.data,"filter")):(c.filter=d.replace(w,""),b=!0)),b||(this.xn1&&(c.filter=d=d||"alpha(opacity="+e+")"),-1===d.indexOf("pacity")?0===e&&this.xn1||(c.filter=d+" alpha(opacity="+e+")"):c.filter=d.replace(u,"opacity="+e))};qa("opacity,alpha,autoAlpha",{defaultValue:"1",parser:function(a,b,c,d,f,g){var h=parseFloat(V(a,"opacity",e,!1,"1")),i=a.style,j="autoAlpha"===c;return"string"==typeof b&&"="===b.charAt(1)&&(b=("-"===b.charAt(0)?-1:1)*parseFloat(b.substr(2))+h),j&&1===h&&"hidden"===V(a,"visibility",e)&&0!==b&&(h=0),O?f=new ma(i,"opacity",h,b-h,f):(f=new ma(i,"opacity",100*h,100*(b-h),f),f.xn1=j?1:0,i.zoom=1,f.type=2,f.b="alpha(opacity="+f.s+")",f.e="alpha(opacity="+(f.s+f.c)+")",f.data=a,f.plugin=g,f.setRatio=Ca),j&&(f=new ma(i,"visibility",0,0,f,-1,null,!1,0,0!==h?"inherit":"hidden",0===b?"hidden":"inherit"),f.xs0="inherit",d._overwriteProps.push(f.n),d._overwriteProps.push(c)),f}});var Da=function(a,b){b&&(a.removeProperty?("ms"===b.substr(0,2)&&(b="M"+b.substr(1)),a.removeProperty(b.replace(y,"-$1").toLowerCase())):a.removeAttribute(b))},Ea=function(a){if(this.t._gsClassPT=this,1===a||0===a){this.t.setAttribute("class",0===a?this.b:this.e);for(var b=this.data,c=this.t.style;b;)b.v?c[b.p]=b.v:Da(c,b.p),b=b._next;1===a&&this.t._gsClassPT===this&&(this.t._gsClassPT=null)}else this.t.getAttribute("class")!==this.e&&this.t.setAttribute("class",this.e)};qa("className",{parser:function(a,b,d,f,g,h,i){var j,k,l,m,n,o=a.getAttribute("class")||"",p=a.style.cssText;if(g=f._classNamePT=new ma(a,d,0,0,g,2),g.setRatio=Ea,g.pr=-11,c=!0,g.b=o,k=Y(a,e),l=a._gsClassPT){for(m={},n=l.data;n;)m[n.p]=1,n=n._next;l.setRatio(1)}return a._gsClassPT=g,g.e="="!==b.charAt(1)?b:o.replace(new RegExp("\\s*\\b"+b.substr(2)+"\\b"),"")+("+"===b.charAt(0)?" "+b.substr(2):""),f._tween._duration&&(a.setAttribute("class",g.e),j=Z(a,k,Y(a),i,m),a.setAttribute("class",o),g.data=j.firstMPT,a.style.cssText=p,g=g.xfirst=f.parse(a,j.difs,g,h)),g}});var Fa=function(a){if((1===a||0===a)&&this.data._totalTime===this.data._totalDuration&&"isFromStart"!==this.data.data){var b,c,d,e,f=this.t.style,g=h.transform.parse;if("all"===this.e)f.cssText="",e=!0;else for(b=this.e.split(","),d=b.length;--d>-1;)c=b[d],h[c]&&(h[c].parse===g?e=!0:c="transformOrigin"===c?va:h[c].p),Da(f,c);e&&(Da(f,ta),this.t._gsTransform&&delete this.t._gsTransform)}};for(qa("clearProps",{parser:function(a,b,d,e,f){return f=new ma(a,d,0,0,f,2),f.setRatio=Fa,f.e=b,f.pr=-10,f.data=e._tween,c=!0,f}}),i="bezier,throwProps,physicsProps,physics2D".split(","),oa=i.length;oa--;)ra(i[oa]);i=g.prototype,i._firstPT=null,i._onInitTween=function(a,b,h){if(!a.nodeType)return!1;this._target=a,this._tween=h,this._vars=b,j=b.autoRound,c=!1,d=b.suffixMap||g.suffixMap,e=U(a,""),f=this._overwriteProps;var i,m,o,p,q,r,s,t,u,w=a.style;if(k&&""===w.zIndex&&(i=V(a,"zIndex",e),("auto"===i||""===i)&&this._addLazySet(w,"zIndex",0)),"string"==typeof b&&(p=w.cssText,i=Y(a,e),w.cssText=p+";"+b,i=Z(a,i,Y(a)).difs,!O&&v.test(b)&&(i.opacity=parseFloat(RegExp.$1)),b=i,w.cssText=p),this._firstPT=m=this.parse(a,b,null),this._transformType){for(u=3===this._transformType,ta?l&&(k=!0,""===w.zIndex&&(s=V(a,"zIndex",e),("auto"===s||""===s)&&this._addLazySet(w,"zIndex",0)),n&&this._addLazySet(w,"WebkitBackfaceVisibility",this._vars.WebkitBackfaceVisibility||(u?"visible":"hidden"))):w.zoom=1,o=m;o&&o._next;)o=o._next;t=new ma(a,"transform",0,0,null,2),this._linkCSSP(t,null,o),t.setRatio=u&&wa?Aa:ta?Ba:za,t.data=this._transform||ya(a,e,!0),f.pop()}if(c){for(;m;){for(r=m._next,o=p;o&&o.pr>m.pr;)o=o._next;(m._prev=o?o._prev:q)?m._prev._next=m:p=m,(m._next=o)?o._prev=m:q=m,m=r}this._firstPT=p}return!0},i.parse=function(a,b,c,f){var g,i,k,l,m,n,o,p,q,r,s=a.style;for(g in b)n=b[g],i=h[g],i?c=i.parse(a,n,g,this,c,f,b):(m=V(a,g,e)+"",q="string"==typeof n,"color"===g||"fill"===g||"stroke"===g||-1!==g.indexOf("Color")||q&&x.test(n)?(q||(n=ha(n),n=(n.length>3?"rgba(":"rgb(")+n.join(",")+")"),c=na(s,g,m,n,!0,"transparent",c,0,f)):!q||-1===n.indexOf(" ")&&-1===n.indexOf(",")?(k=parseFloat(m),o=k||0===k?m.substr((k+"").length):"",(""===m||"auto"===m)&&("width"===g||"height"===g?(k=aa(a,g,e),o="px"):"left"===g||"top"===g?(k=X(a,g,e),o="px"):(k="opacity"!==g?0:1,o="")),r=q&&"="===n.charAt(1),r?(l=parseInt(n.charAt(0)+"1",10),n=n.substr(2),l*=parseFloat(n),p=n.replace(t,"")):(l=parseFloat(n),p=q?n.substr((l+"").length)||"":""),""===p&&(p=g in d?d[g]:o),n=l||0===l?(r?l+k:l)+p:b[g],o!==p&&""!==p&&(l||0===l)&&k&&(k=W(a,g,k,o),"%"===p?(k/=W(a,g,100,"%")/100,b.strictUnits!==!0&&(m=k+"%")):"em"===p?k/=W(a,g,1,"em"):"px"!==p&&(l=W(a,g,l,p),p="px"),r&&(l||0===l)&&(n=l+k+p)),r&&(l+=k),!k&&0!==k||!l&&0!==l?void 0!==s[g]&&(n||n+""!="NaN"&&null!=n)?(c=new ma(s,g,l||k||0,0,c,-1,g,!1,0,m,n),c.xs0="none"!==n||"display"!==g&&-1===g.indexOf("Style")?n:m):Q("invalid "+g+" tween value: "+b[g]):(c=new ma(s,g,k,l-k,c,0,g,j!==!1&&("px"===p||"zIndex"===g),0,m,n),c.xs0=p)):c=na(s,g,m,n,!0,null,c,0,f)),f&&c&&!c.plugin&&(c.plugin=f);return c},i.setRatio=function(a){var b,c,d,e=this._firstPT,f=1e-6;if(1!==a||this._tween._time!==this._tween._duration&&0!==this._tween._time)if(a||this._tween._time!==this._tween._duration&&0!==this._tween._time||this._tween._rawPrevTime===-1e-6)for(;e;){if(b=e.c*a+e.s,e.r?b=Math.round(b):f>b&&b>-f&&(b=0),e.type)if(1===e.type)if(d=e.l,2===d)e.t[e.p]=e.xs0+b+e.xs1+e.xn1+e.xs2;else if(3===d)e.t[e.p]=e.xs0+b+e.xs1+e.xn1+e.xs2+e.xn2+e.xs3;else if(4===d)e.t[e.p]=e.xs0+b+e.xs1+e.xn1+e.xs2+e.xn2+e.xs3+e.xn3+e.xs4;else if(5===d)e.t[e.p]=e.xs0+b+e.xs1+e.xn1+e.xs2+e.xn2+e.xs3+e.xn3+e.xs4+e.xn4+e.xs5;else{for(c=e.xs0+b+e.xs1,d=1;d<e.l;d++)c+=e["xn"+d]+e["xs"+(d+1)];e.t[e.p]=c}else-1===e.type?e.t[e.p]=e.xs0:e.setRatio&&e.setRatio(a);else e.t[e.p]=b+e.xs0;e=e._next}else for(;e;)2!==e.type?e.t[e.p]=e.b:e.setRatio(a),e=e._next;else for(;e;)2!==e.type?e.t[e.p]=e.e:e.setRatio(a),e=e._next},i._enableTransforms=function(a){this._transformType=a||3===this._transformType?3:2,this._transform=this._transform||ya(this._target,e,!0)};var Ga=function(a){this.t[this.p]=this.e,this.data._linkCSSP(this,this._next,null,!0)};i._addLazySet=function(a,b,c){var d=this._firstPT=new ma(a,b,0,0,this._firstPT,2);d.e=c,d.setRatio=Ga,d.data=this},i._linkCSSP=function(a,b,c,d){return a&&(b&&(b._prev=a),a._next&&(a._next._prev=a._prev),a._prev?a._prev._next=a._next:this._firstPT===a&&(this._firstPT=a._next,d=!0),c?c._next=a:d||null!==this._firstPT||(this._firstPT=a),a._next=b,a._prev=c),a},i._kill=function(b){var c,d,e,f=b;if(b.autoAlpha||b.alpha){f={};for(d in b)f[d]=b[d];f.opacity=1,f.autoAlpha&&(f.visibility=1)}return b.className&&(c=this._classNamePT)&&(e=c.xfirst,e&&e._prev?this._linkCSSP(e._prev,c._next,e._prev._prev):e===this._firstPT&&(this._firstPT=c._next),c._next&&this._linkCSSP(c._next,c._next._next,e._prev),this._classNamePT=null),a.prototype._kill.call(this,f)};var Ha=function(a,b,c){var d,e,f,g;if(a.slice)for(e=a.length;--e>-1;)Ha(a[e],b,c);else for(d=a.childNodes,e=d.length;--e>-1;)f=d[e],g=f.type,f.style&&(b.push(Y(f)),c&&c.push(f)),1!==g&&9!==g&&11!==g||!f.childNodes.length||Ha(f,b,c)};return g.cascadeTo=function(a,c,d){var e,f,g,h=b.to(a,c,d),i=[h],j=[],k=[],l=[],m=b._internals.reservedProps;for(a=h._targets||h.target,Ha(a,j,l),h.render(c,!0),Ha(a,k),h.render(0,!0),h._enabled(!0),e=l.length;--e>-1;)if(f=Z(l[e],j[e],k[e]),f.firstMPT){f=f.difs;for(g in d)m[g]&&(f[g]=d[g]);i.push(b.to(l[e],c,f))}return i},a.activate([g]),g},!0),function(){var a=window._gsDefine.plugin({propName:"roundProps",priority:-1,API:2,init:function(a,b,c){return this._tween=c,!0}}),b=a.prototype;b._onInitAllProps=function(){for(var a,b,c,d=this._tween,e=d.vars.roundProps instanceof Array?d.vars.roundProps:d.vars.roundProps.split(","),f=e.length,g={},h=d._propLookup.roundProps;--f>-1;)g[e[f]]=1;for(f=e.length;--f>-1;)for(a=e[f],b=d._firstPT;b;)c=b._next,b.pg?b.t._roundProps(g,!0):b.n===a&&(this._add(b.t,a,b.s,b.c),c&&(c._prev=b._prev),b._prev?b._prev._next=c:d._firstPT===b&&(d._firstPT=c),b._next=b._prev=null,d._propLookup[a]=h),b=c;return!1},b._add=function(a,b,c,d){this._addTween(a,b,c,c+d,b,!0),this._overwriteProps.push(b)}}(),window._gsDefine.plugin({propName:"attr",API:2,version:"0.3.2",init:function(a,b,c){var d,e,f;if("function"!=typeof a.setAttribute)return!1;this._target=a,this._proxy={},this._start={},this._end={};for(d in b)this._start[d]=this._proxy[d]=e=a.getAttribute(d),f=this._addTween(this._proxy,d,parseFloat(e),b[d],d),this._end[d]=f?f.s+f.c:b[d],this._overwriteProps.push(d);return!0},set:function(a){this._super.setRatio.call(this,a);for(var b,c=this._overwriteProps,d=c.length,e=1===a?this._end:a?this._proxy:this._start;--d>-1;)b=c[d],this._target.setAttribute(b,e[b]+"")}}),window._gsDefine.plugin({propName:"directionalRotation",API:2,version:"0.2.0",init:function(a,b,c){"object"!=typeof b&&(b={rotation:b}),this.finals={};var d,e,f,g,h,i,j=b.useRadians===!0?2*Math.PI:360,k=1e-6;for(d in b)"useRadians"!==d&&(i=(b[d]+"").split("_"),e=i[0],f=parseFloat("function"!=typeof a[d]?a[d]:a[d.indexOf("set")||"function"!=typeof a["get"+d.substr(3)]?d:"get"+d.substr(3)]()),g=this.finals[d]="string"==typeof e&&"="===e.charAt(1)?f+parseInt(e.charAt(0)+"1",10)*Number(e.substr(2)):Number(e)||0,h=g-f,i.length&&(e=i.join("_"),-1!==e.indexOf("short")&&(h%=j,h!==h%(j/2)&&(h=0>h?h+j:h-j)),-1!==e.indexOf("_cw")&&0>h?h=(h+9999999999*j)%j-(h/j|0)*j:-1!==e.indexOf("ccw")&&h>0&&(h=(h-9999999999*j)%j-(h/j|0)*j)),(h>k||-k>h)&&(this._addTween(a,d,f,f+h,d),this._overwriteProps.push(d)));return!0},set:function(a){var b;if(1!==a)this._super.setRatio.call(this,a);else for(b=this._firstPT;b;)b.f?b.t[b.p](this.finals[b.p]):b.t[b.p]=this.finals[b.p],b=b._next}})._autoCSS=!0,window._gsDefine("easing.Back",["easing.Ease"],function(a){var b,c,d,e=window.GreenSockGlobals||window,f=e.com.greensock,g=2*Math.PI,h=Math.PI/2,i=f._class,j=function(b,c){var d=i("easing."+b,function(){},!0),e=d.prototype=new a;return e.constructor=d,e.getRatio=c,d},k=a.register||function(){},l=function(a,b,c,d,e){var f=i("easing."+a,{easeOut:new b,easeIn:new c,easeInOut:new d},!0);return k(f,a),f},m=function(a,b,c){this.t=a,this.v=b,c&&(this.next=c,c.prev=this,this.c=c.v-b,this.gap=c.t-a)},n=function(b,c){var d=i("easing."+b,function(a){this._p1=a||0===a?a:1.70158,this._p2=1.525*this._p1},!0),e=d.prototype=new a;return e.constructor=d,e.getRatio=c,e.config=function(a){return new d(a)},d},o=l("Back",n("BackOut",function(a){return(a-=1)*a*((this._p1+1)*a+this._p1)+1}),n("BackIn",function(a){return a*a*((this._p1+1)*a-this._p1)}),n("BackInOut",function(a){return(a*=2)<1?.5*a*a*((this._p2+1)*a-this._p2):.5*((a-=2)*a*((this._p2+1)*a+this._p2)+2)})),p=i("easing.SlowMo",function(a,b,c){b=b||0===b?b:.7,null==a?a=.7:a>1&&(a=1),this._p=1!==a?b:0,this._p1=(1-a)/2,this._p2=a,this._p3=this._p1+this._p2,this._calcEnd=c===!0},!0),q=p.prototype=new a;return q.constructor=p,q.getRatio=function(a){var b=a+(.5-a)*this._p;return a<this._p1?this._calcEnd?1-(a=1-a/this._p1)*a:b-(a=1-a/this._p1)*a*a*a*b:a>this._p3?this._calcEnd?1-(a=(a-this._p3)/this._p1)*a:b+(a-b)*(a=(a-this._p3)/this._p1)*a*a*a:this._calcEnd?1:b},p.ease=new p(.7,.7),q.config=p.config=function(a,b,c){return new p(a,b,c)},b=i("easing.SteppedEase",function(a){a=a||1,this._p1=1/a,this._p2=a+1},!0),q=b.prototype=new a,q.constructor=b,q.getRatio=function(a){return 0>a?a=0:a>=1&&(a=.999999999),(this._p2*a>>0)*this._p1},q.config=b.config=function(a){return new b(a)},c=i("easing.RoughEase",function(b){b=b||{};for(var c,d,e,f,g,h,i=b.taper||"none",j=[],k=0,l=0|(b.points||20),n=l,o=b.randomize!==!1,p=b.clamp===!0,q=b.template instanceof a?b.template:null,r="number"==typeof b.strength?.4*b.strength:.4;--n>-1;)c=o?Math.random():1/l*n,d=q?q.getRatio(c):c,"none"===i?e=r:"out"===i?(f=1-c,e=f*f*r):"in"===i?e=c*c*r:.5>c?(f=2*c,e=f*f*.5*r):(f=2*(1-c),e=f*f*.5*r),o?d+=Math.random()*e-.5*e:n%2?d+=.5*e:d-=.5*e,p&&(d>1?d=1:0>d&&(d=0)),j[k++]={x:c,y:d};for(j.sort(function(a,b){return a.x-b.x}),h=new m(1,1,null),n=l;--n>-1;)g=j[n],h=new m(g.x,g.y,h);this._prev=new m(0,0,0!==h.t?h:h.next)},!0),q=c.prototype=new a,q.constructor=c,q.getRatio=function(a){var b=this._prev;if(a>b.t){for(;b.next&&a>=b.t;)b=b.next;b=b.prev}else for(;b.prev&&a<=b.t;)b=b.prev;return this._prev=b,b.v+(a-b.t)/b.gap*b.c},q.config=function(a){return new c(a)},c.ease=new c,l("Bounce",j("BounceOut",function(a){return 1/2.75>a?7.5625*a*a:2/2.75>a?7.5625*(a-=1.5/2.75)*a+.75:2.5/2.75>a?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}),j("BounceIn",function(a){return(a=1-a)<1/2.75?1-7.5625*a*a:2/2.75>a?1-(7.5625*(a-=1.5/2.75)*a+.75):2.5/2.75>a?1-(7.5625*(a-=2.25/2.75)*a+.9375):1-(7.5625*(a-=2.625/2.75)*a+.984375)}),j("BounceInOut",function(a){var b=.5>a;return a=b?1-2*a:2*a-1,a=1/2.75>a?7.5625*a*a:2/2.75>a?7.5625*(a-=1.5/2.75)*a+.75:2.5/2.75>a?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375,b?.5*(1-a):.5*a+.5})),l("Circ",j("CircOut",function(a){return Math.sqrt(1-(a-=1)*a)}),j("CircIn",function(a){return-(Math.sqrt(1-a*a)-1)}),j("CircInOut",function(a){return(a*=2)<1?-.5*(Math.sqrt(1-a*a)-1):.5*(Math.sqrt(1-(a-=2)*a)+1)})),d=function(b,c,d){var e=i("easing."+b,function(a,b){this._p1=a||1,this._p2=b||d,this._p3=this._p2/g*(Math.asin(1/this._p1)||0)},!0),f=e.prototype=new a;return f.constructor=e,f.getRatio=c,f.config=function(a,b){return new e(a,b)},e},l("Elastic",d("ElasticOut",function(a){return this._p1*Math.pow(2,-10*a)*Math.sin((a-this._p3)*g/this._p2)+1},.3),d("ElasticIn",function(a){return-(this._p1*Math.pow(2,10*(a-=1))*Math.sin((a-this._p3)*g/this._p2))},.3),d("ElasticInOut",function(a){return(a*=2)<1?-.5*(this._p1*Math.pow(2,10*(a-=1))*Math.sin((a-this._p3)*g/this._p2)):this._p1*Math.pow(2,-10*(a-=1))*Math.sin((a-this._p3)*g/this._p2)*.5+1},.45)),l("Expo",j("ExpoOut",function(a){return 1-Math.pow(2,-10*a)}),j("ExpoIn",function(a){return Math.pow(2,10*(a-1))-.001}),j("ExpoInOut",function(a){return(a*=2)<1?.5*Math.pow(2,10*(a-1)):.5*(2-Math.pow(2,-10*(a-1)))})),l("Sine",j("SineOut",function(a){return Math.sin(a*h)}),j("SineIn",function(a){return-Math.cos(a*h)+1}),j("SineInOut",function(a){return-.5*(Math.cos(Math.PI*a)-1)})),i("easing.EaseLookup",{find:function(b){return a.map[b]}},!0),k(e.SlowMo,"SlowMo","ease,"),k(c,"RoughEase","ease,"),k(b,"SteppedEase","ease,"),o},!0)}),function(a){"use strict";var b=a.GreenSockGlobals||a;if(!b.TweenLite){var c,d,e,f,g,h=function(a){var c,d=a.split("."),e=b;for(c=0;c<d.length;c++)e[d[c]]=e=e[d[c]]||{};return e},i=h("com.greensock"),j=1e-10,k=[].slice,l=function(){},m=function(){var a=Object.prototype.toString,b=a.call([]);return function(c){return null!=c&&(c instanceof Array||"object"==typeof c&&!!c.push&&a.call(c)===b)}}(),n={},o=function(c,d,e,f){this.sc=n[c]?n[c].sc:[],n[c]=this,this.gsClass=null,this.func=e;var g=[];this.check=function(i){for(var j,k,l,m,p=d.length,q=p;--p>-1;)(j=n[d[p]]||new o(d[p],[])).gsClass?(g[p]=j.gsClass,q--):i&&j.sc.push(this);if(0===q&&e)for(k=("com.greensock."+c).split("."),l=k.pop(),m=h(k.join("."))[l]=this.gsClass=e.apply(e,g),f&&(b[l]=m,"function"==typeof define&&define.amd?define((a.GreenSockAMDPath?a.GreenSockAMDPath+"/":"")+c.split(".").join("/"),[],function(){return m}):"undefined"!=typeof module&&module.exports&&(module.exports=m)),p=0;p<this.sc.length;p++)this.sc[p].check()},this.check(!0)},p=a._gsDefine=function(a,b,c,d){return new o(a,b,c,d)},q=i._class=function(a,b,c){return b=b||function(){},p(a,[],function(){return b},c),b};p.globals=b;var r=[0,0,1,1],s=[],t=q("easing.Ease",function(a,b,c,d){this._func=a,this._type=c||0,this._power=d||0,this._params=b?r.concat(b):r},!0),u=t.map={},v=t.register=function(a,b,c,d){for(var e,f,g,h,j=b.split(","),k=j.length,l=(c||"easeIn,easeOut,easeInOut").split(",");--k>-1;)for(f=j[k],e=d?q("easing."+f,null,!0):i.easing[f]||{},g=l.length;--g>-1;)h=l[g],u[f+"."+h]=u[h+f]=e[h]=a.getRatio?a:a[h]||new a};for(e=t.prototype,e._calcEnd=!1,e.getRatio=function(a){if(this._func)return this._params[0]=a,this._func.apply(null,this._params);var b=this._type,c=this._power,d=1===b?1-a:2===b?a:.5>a?2*a:2*(1-a);return 1===c?d*=d:2===c?d*=d*d:3===c?d*=d*d*d:4===c&&(d*=d*d*d*d),1===b?1-d:2===b?d:.5>a?d/2:1-d/2},c=["Linear","Quad","Cubic","Quart","Quint,Strong"],d=c.length;--d>-1;)e=c[d]+",Power"+d,v(new t(null,null,1,d),e,"easeOut",!0),v(new t(null,null,2,d),e,"easeIn"+(0===d?",easeNone":"")),v(new t(null,null,3,d),e,"easeInOut");u.linear=i.easing.Linear.easeIn,u.swing=i.easing.Quad.easeInOut;var w=q("events.EventDispatcher",function(a){this._listeners={},this._eventTarget=a||this});e=w.prototype,e.addEventListener=function(a,b,c,d,e){e=e||0;var h,i,j=this._listeners[a],k=0;for(null==j&&(this._listeners[a]=j=[]),i=j.length;--i>-1;)h=j[i],h.c===b&&h.s===c?j.splice(i,1):0===k&&h.pr<e&&(k=i+1);j.splice(k,0,{c:b,s:c,up:d,pr:e}),this!==f||g||f.wake()},e.removeEventListener=function(a,b){var c,d=this._listeners[a];if(d)for(c=d.length;--c>-1;)if(d[c].c===b)return void d.splice(c,1)},e.dispatchEvent=function(a){var b,c,d,e=this._listeners[a];if(e)for(b=e.length,c=this._eventTarget;--b>-1;)d=e[b],d.up?d.c.call(d.s||c,{type:a,target:c}):d.c.call(d.s||c)};var x=a.requestAnimationFrame,y=a.cancelAnimationFrame,z=Date.now||function(){return(new Date).getTime()},A=z();for(c=["ms","moz","webkit","o"],d=c.length;--d>-1&&!x;)x=a[c[d]+"RequestAnimationFrame"],y=a[c[d]+"CancelAnimationFrame"]||a[c[d]+"CancelRequestAnimationFrame"];q("Ticker",function(a,b){var c,d,e,h,i,k=this,m=z(),n=b!==!1&&x,o=500,p=33,q=function(a){var b,f,g=z()-A;g>o&&(m+=g-p),A+=g,k.time=(A-m)/1e3,b=k.time-i,(!c||b>0||a===!0)&&(k.frame++,i+=b+(b>=h?.004:h-b),f=!0),a!==!0&&(e=d(q)),f&&k.dispatchEvent("tick")};w.call(k),k.time=k.frame=0,k.tick=function(){q(!0)},k.lagSmoothing=function(a,b){o=a||1/j,p=Math.min(b,o,0)},k.sleep=function(){null!=e&&(n&&y?y(e):clearTimeout(e),d=l,e=null,k===f&&(g=!1))},k.wake=function(){null!==e?k.sleep():k.frame>10&&(A=z()-o+5),d=0===c?l:n&&x?x:function(a){return setTimeout(a,1e3*(i-k.time)+1|0)},k===f&&(g=!0),q(2)},k.fps=function(a){return arguments.length?(c=a,h=1/(c||60),i=this.time+h,void k.wake()):c},k.useRAF=function(a){return arguments.length?(k.sleep(),n=a,void k.fps(c)):n},k.fps(a),setTimeout(function(){n&&(!e||k.frame<5)&&k.useRAF(!1)},1500)}),e=i.Ticker.prototype=new i.events.EventDispatcher,e.constructor=i.Ticker;var B=q("core.Animation",function(a,b){if(this.vars=b=b||{},this._duration=this._totalDuration=a||0,this._delay=Number(b.delay)||0,this._timeScale=1,this._active=b.immediateRender===!0,this.data=b.data,this._reversed=b.reversed===!0,Q){g||f.wake();var c=this.vars.useFrames?P:Q;c.add(this,c._time),this.vars.paused&&this.paused(!0)}});f=B.ticker=new i.Ticker,e=B.prototype,e._dirty=e._gc=e._initted=e._paused=!1,e._totalTime=e._time=0,e._rawPrevTime=-1,e._next=e._last=e._onUpdate=e._timeline=e.timeline=null,e._paused=!1;var C=function(){g&&z()-A>2e3&&f.wake(),setTimeout(C,2e3)};C(),e.play=function(a,b){return null!=a&&this.seek(a,b),this.reversed(!1).paused(!1)},e.pause=function(a,b){return null!=a&&this.seek(a,b),this.paused(!0)},e.resume=function(a,b){return null!=a&&this.seek(a,b),this.paused(!1)},e.seek=function(a,b){return this.totalTime(Number(a),b!==!1)},e.restart=function(a,b){return this.reversed(!1).paused(!1).totalTime(a?-this._delay:0,b!==!1,!0)},e.reverse=function(a,b){return null!=a&&this.seek(a||this.totalDuration(),b),this.reversed(!0).paused(!1)},e.render=function(a,b,c){},e.invalidate=function(){return this},e.isActive=function(){var a,b=this._timeline,c=this._startTime;return!b||!this._gc&&!this._paused&&b.isActive()&&(a=b.rawTime())>=c&&a<c+this.totalDuration()/this._timeScale},e._enabled=function(a,b){return g||f.wake(),this._gc=!a,this._active=this.isActive(),b!==!0&&(a&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!a&&this.timeline&&this._timeline._remove(this,!0)),!1},e._kill=function(a,b){return this._enabled(!1,!1)},e.kill=function(a,b){return this._kill(a,b),this},e._uncache=function(a){for(var b=a?this:this.timeline;b;)b._dirty=!0,b=b.timeline;return this},e._swapSelfInParams=function(a){for(var b=a.length,c=a.concat();--b>-1;)"{self}"===a[b]&&(c[b]=this);return c},e.eventCallback=function(a,b,c,d){if("on"===(a||"").substr(0,2)){var e=this.vars;if(1===arguments.length)return e[a];null==b?delete e[a]:(e[a]=b,e[a+"Params"]=m(c)&&-1!==c.join("").indexOf("{self}")?this._swapSelfInParams(c):c,e[a+"Scope"]=d),"onUpdate"===a&&(this._onUpdate=b)}return this},e.delay=function(a){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+a-this._delay),this._delay=a,this):this._delay},e.duration=function(a){return arguments.length?(this._duration=this._totalDuration=a,this._uncache(!0),this._timeline.smoothChildTiming&&this._time>0&&this._time<this._duration&&0!==a&&this.totalTime(this._totalTime*(a/this._duration),!0),this):(this._dirty=!1,this._duration)},e.totalDuration=function(a){return this._dirty=!1,arguments.length?this.duration(a):this._totalDuration},e.time=function(a,b){return arguments.length?(this._dirty&&this.totalDuration(),this.totalTime(a>this._duration?this._duration:a,b)):this._time},e.totalTime=function(a,b,c){if(g||f.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(0>a&&!c&&(a+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var d=this._totalDuration,e=this._timeline;if(a>d&&!c&&(a=d),this._startTime=(this._paused?this._pauseTime:e._time)-(this._reversed?d-a:a)/this._timeScale,e._dirty||this._uncache(!1),e._timeline)for(;e._timeline;)e._timeline._time!==(e._startTime+e._totalTime)/e._timeScale&&e.totalTime(e._totalTime,!0),e=e._timeline}this._gc&&this._enabled(!0,!1),(this._totalTime!==a||0===this._duration)&&(this.render(a,b,!1),H.length&&R())}return this},e.progress=e.totalProgress=function(a,b){return arguments.length?this.totalTime(this.duration()*a,b):this._time/this.duration()},e.startTime=function(a){return arguments.length?(a!==this._startTime&&(this._startTime=a,
-this.timeline&&this.timeline._sortChildren&&this.timeline.add(this,a-this._delay)),this):this._startTime},e.timeScale=function(a){if(!arguments.length)return this._timeScale;if(a=a||j,this._timeline&&this._timeline.smoothChildTiming){var b=this._pauseTime,c=b||0===b?b:this._timeline.totalTime();this._startTime=c-(c-this._startTime)*this._timeScale/a}return this._timeScale=a,this._uncache(!1)},e.reversed=function(a){return arguments.length?(a!=this._reversed&&(this._reversed=a,this.totalTime(this._timeline&&!this._timeline.smoothChildTiming?this.totalDuration()-this._totalTime:this._totalTime,!0)),this):this._reversed},e.paused=function(a){if(!arguments.length)return this._paused;if(a!=this._paused&&this._timeline){g||a||f.wake();var b=this._timeline,c=b.rawTime(),d=c-this._pauseTime;!a&&b.smoothChildTiming&&(this._startTime+=d,this._uncache(!1)),this._pauseTime=a?c:null,this._paused=a,this._active=this.isActive(),!a&&0!==d&&this._initted&&this.duration()&&this.render(b.smoothChildTiming?this._totalTime:(c-this._startTime)/this._timeScale,!0,!0)}return this._gc&&!a&&this._enabled(!0,!1),this};var D=q("core.SimpleTimeline",function(a){B.call(this,0,a),this.autoRemoveChildren=this.smoothChildTiming=!0});e=D.prototype=new B,e.constructor=D,e.kill()._gc=!1,e._first=e._last=null,e._sortChildren=!1,e.add=e.insert=function(a,b,c,d){var e,f;if(a._startTime=Number(b||0)+a._delay,a._paused&&this!==a._timeline&&(a._pauseTime=a._startTime+(this.rawTime()-a._startTime)/a._timeScale),a.timeline&&a.timeline._remove(a,!0),a.timeline=a._timeline=this,a._gc&&a._enabled(!0,!0),e=this._last,this._sortChildren)for(f=a._startTime;e&&e._startTime>f;)e=e._prev;return e?(a._next=e._next,e._next=a):(a._next=this._first,this._first=a),a._next?a._next._prev=a:this._last=a,a._prev=e,this._timeline&&this._uncache(!0),this},e._remove=function(a,b){return a.timeline===this&&(b||a._enabled(!1,!0),a.timeline=null,a._prev?a._prev._next=a._next:this._first===a&&(this._first=a._next),a._next?a._next._prev=a._prev:this._last===a&&(this._last=a._prev),this._timeline&&this._uncache(!0)),this},e.render=function(a,b,c){var d,e=this._first;for(this._totalTime=this._time=this._rawPrevTime=a;e;)d=e._next,(e._active||a>=e._startTime&&!e._paused)&&(e._reversed?e.render((e._dirty?e.totalDuration():e._totalDuration)-(a-e._startTime)*e._timeScale,b,c):e.render((a-e._startTime)*e._timeScale,b,c)),e=d},e.rawTime=function(){return g||f.wake(),this._totalTime};var E=q("TweenLite",function(b,c,d){if(B.call(this,c,d),this.render=E.prototype.render,null==b)throw"Cannot tween a null target.";this.target=b="string"!=typeof b?b:E.selector(b)||b;var e,f,g,h=b.jquery||b.length&&b!==a&&b[0]&&(b[0]===a||b[0].nodeType&&b[0].style&&!b.nodeType),i=this.vars.overwrite;if(this._overwrite=i=null==i?O[E.defaultOverwrite]:"number"==typeof i?i>>0:O[i],(h||b instanceof Array||b.push&&m(b))&&"number"!=typeof b[0])for(this._targets=g=k.call(b,0),this._propLookup=[],this._siblings=[],e=0;e<g.length;e++)f=g[e],f?"string"!=typeof f?f.length&&f!==a&&f[0]&&(f[0]===a||f[0].nodeType&&f[0].style&&!f.nodeType)?(g.splice(e--,1),this._targets=g=g.concat(k.call(f,0))):(this._siblings[e]=S(f,this,!1),1===i&&this._siblings[e].length>1&&T(f,this,null,1,this._siblings[e])):(f=g[e--]=E.selector(f),"string"==typeof f&&g.splice(e+1,1)):g.splice(e--,1);else this._propLookup={},this._siblings=S(b,this,!1),1===i&&this._siblings.length>1&&T(b,this,null,1,this._siblings);(this.vars.immediateRender||0===c&&0===this._delay&&this.vars.immediateRender!==!1)&&(this._time=-j,this.render(-this._delay))},!0),F=function(b){return b.length&&b!==a&&b[0]&&(b[0]===a||b[0].nodeType&&b[0].style&&!b.nodeType)},G=function(a,b){var c,d={};for(c in a)N[c]||c in b&&"transform"!==c&&"x"!==c&&"y"!==c&&"width"!==c&&"height"!==c&&"className"!==c&&"border"!==c||!(!K[c]||K[c]&&K[c]._autoCSS)||(d[c]=a[c],delete a[c]);a.css=d};e=E.prototype=new B,e.constructor=E,e.kill()._gc=!1,e.ratio=0,e._firstPT=e._targets=e._overwrittenProps=e._startAt=null,e._notifyPluginsOfEnabled=e._lazy=!1,E.version="1.12.1",E.defaultEase=e._ease=new t(null,null,1,1),E.defaultOverwrite="auto",E.ticker=f,E.autoSleep=!0,E.lagSmoothing=function(a,b){f.lagSmoothing(a,b)},E.selector=a.$||a.jQuery||function(b){return a.$?(E.selector=a.$,a.$(b)):a.document?a.document.getElementById("#"===b.charAt(0)?b.substr(1):b):b};var H=[],I={},J=E._internals={isArray:m,isSelector:F,lazyTweens:H},K=E._plugins={},L=J.tweenLookup={},M=0,N=J.reservedProps={ease:1,delay:1,overwrite:1,onComplete:1,onCompleteParams:1,onCompleteScope:1,useFrames:1,runBackwards:1,startAt:1,onUpdate:1,onUpdateParams:1,onUpdateScope:1,onStart:1,onStartParams:1,onStartScope:1,onReverseComplete:1,onReverseCompleteParams:1,onReverseCompleteScope:1,onRepeat:1,onRepeatParams:1,onRepeatScope:1,easeParams:1,yoyo:1,immediateRender:1,repeat:1,repeatDelay:1,data:1,paused:1,reversed:1,autoCSS:1,lazy:1},O={none:0,all:1,auto:2,concurrent:3,allOnStart:4,preexisting:5,"true":1,"false":0},P=B._rootFramesTimeline=new D,Q=B._rootTimeline=new D,R=function(){var a=H.length;for(I={};--a>-1;)c=H[a],c&&c._lazy!==!1&&(c.render(c._lazy,!1,!0),c._lazy=!1);H.length=0};Q._startTime=f.time,P._startTime=f.frame,Q._active=P._active=!0,setTimeout(R,1),B._updateRoot=E.render=function(){var a,b,c;if(H.length&&R(),Q.render((f.time-Q._startTime)*Q._timeScale,!1,!1),P.render((f.frame-P._startTime)*P._timeScale,!1,!1),H.length&&R(),!(f.frame%120)){for(c in L){for(b=L[c].tweens,a=b.length;--a>-1;)b[a]._gc&&b.splice(a,1);0===b.length&&delete L[c]}if(c=Q._first,(!c||c._paused)&&E.autoSleep&&!P._first&&1===f._listeners.tick.length){for(;c&&c._paused;)c=c._next;c||f.sleep()}}},f.addEventListener("tick",B._updateRoot);var S=function(a,b,c){var d,e,f=a._gsTweenID;if(L[f||(a._gsTweenID=f="t"+M++)]||(L[f]={target:a,tweens:[]}),b&&(d=L[f].tweens,d[e=d.length]=b,c))for(;--e>-1;)d[e]===b&&d.splice(e,1);return L[f].tweens},T=function(a,b,c,d,e){var f,g,h,i;if(1===d||d>=4){for(i=e.length,f=0;i>f;f++)if((h=e[f])!==b)h._gc||h._enabled(!1,!1)&&(g=!0);else if(5===d)break;return g}var k,l=b._startTime+j,m=[],n=0,o=0===b._duration;for(f=e.length;--f>-1;)(h=e[f])===b||h._gc||h._paused||(h._timeline!==b._timeline?(k=k||U(b,0,o),0===U(h,k,o)&&(m[n++]=h)):h._startTime<=l&&h._startTime+h.totalDuration()/h._timeScale>l&&((o||!h._initted)&&l-h._startTime<=2e-10||(m[n++]=h)));for(f=n;--f>-1;)h=m[f],2===d&&h._kill(c,a)&&(g=!0),(2!==d||!h._firstPT&&h._initted)&&h._enabled(!1,!1)&&(g=!0);return g},U=function(a,b,c){for(var d=a._timeline,e=d._timeScale,f=a._startTime;d._timeline;){if(f+=d._startTime,e*=d._timeScale,d._paused)return-100;d=d._timeline}return f/=e,f>b?f-b:c&&f===b||!a._initted&&2*j>f-b?j:(f+=a.totalDuration()/a._timeScale/e)>b+j?0:f-b-j};e._init=function(){var a,b,c,d,e,f=this.vars,g=this._overwrittenProps,h=this._duration,i=!!f.immediateRender,j=f.ease;if(f.startAt){this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),e={};for(d in f.startAt)e[d]=f.startAt[d];if(e.overwrite=!1,e.immediateRender=!0,e.lazy=i&&f.lazy!==!1,e.startAt=e.delay=null,this._startAt=E.to(this.target,0,e),i)if(this._time>0)this._startAt=null;else if(0!==h)return}else if(f.runBackwards&&0!==h)if(this._startAt)this._startAt.render(-1,!0),this._startAt.kill(),this._startAt=null;else{c={};for(d in f)N[d]&&"autoCSS"!==d||(c[d]=f[d]);if(c.overwrite=0,c.data="isFromStart",c.lazy=i&&f.lazy!==!1,c.immediateRender=i,this._startAt=E.to(this.target,0,c),i){if(0===this._time)return}else this._startAt._init(),this._startAt._enabled(!1)}if(j?j instanceof t?this._ease=f.easeParams instanceof Array?j.config.apply(j,f.easeParams):j:this._ease="function"==typeof j?new t(j,f.easeParams):u[j]||E.defaultEase:this._ease=E.defaultEase,this._easeType=this._ease._type,this._easePower=this._ease._power,this._firstPT=null,this._targets)for(a=this._targets.length;--a>-1;)this._initProps(this._targets[a],this._propLookup[a]={},this._siblings[a],g?g[a]:null)&&(b=!0);else b=this._initProps(this.target,this._propLookup,this._siblings,g);if(b&&E._onPluginEvent("_onInitAllProps",this),g&&(this._firstPT||"function"!=typeof this.target&&this._enabled(!1,!1)),f.runBackwards)for(c=this._firstPT;c;)c.s+=c.c,c.c=-c.c,c=c._next;this._onUpdate=f.onUpdate,this._initted=!0},e._initProps=function(b,c,d,e){var f,g,h,i,j,k;if(null==b)return!1;I[b._gsTweenID]&&R(),this.vars.css||b.style&&b!==a&&b.nodeType&&K.css&&this.vars.autoCSS!==!1&&G(this.vars,b);for(f in this.vars){if(k=this.vars[f],N[f])k&&(k instanceof Array||k.push&&m(k))&&-1!==k.join("").indexOf("{self}")&&(this.vars[f]=k=this._swapSelfInParams(k,this));else if(K[f]&&(i=new K[f])._onInitTween(b,this.vars[f],this)){for(this._firstPT=j={_next:this._firstPT,t:i,p:"setRatio",s:0,c:1,f:!0,n:f,pg:!0,pr:i._priority},g=i._overwriteProps.length;--g>-1;)c[i._overwriteProps[g]]=this._firstPT;(i._priority||i._onInitAllProps)&&(h=!0),(i._onDisable||i._onEnable)&&(this._notifyPluginsOfEnabled=!0)}else this._firstPT=c[f]=j={_next:this._firstPT,t:b,p:f,f:"function"==typeof b[f],n:f,pg:!1,pr:0},j.s=j.f?b[f.indexOf("set")||"function"!=typeof b["get"+f.substr(3)]?f:"get"+f.substr(3)]():parseFloat(b[f]),j.c="string"==typeof k&&"="===k.charAt(1)?parseInt(k.charAt(0)+"1",10)*Number(k.substr(2)):Number(k)-j.s||0;j&&j._next&&(j._next._prev=j)}return e&&this._kill(e,b)?this._initProps(b,c,d,e):this._overwrite>1&&this._firstPT&&d.length>1&&T(b,this,c,this._overwrite,d)?(this._kill(c,b),this._initProps(b,c,d,e)):(this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration)&&(I[b._gsTweenID]=!0),h)},e.render=function(a,b,c){var d,e,f,g,h=this._time,i=this._duration,k=this._rawPrevTime;if(a>=i)this._totalTime=this._time=i,this.ratio=this._ease._calcEnd?this._ease.getRatio(1):1,this._reversed||(d=!0,e="onComplete"),0===i&&(this._initted||!this.vars.lazy||c)&&(this._startTime===this._timeline._duration&&(a=0),(0===a||0>k||k===j)&&k!==a&&(c=!0,k>j&&(e="onReverseComplete")),this._rawPrevTime=g=!b||a||k===a?a:j);else if(1e-7>a)this._totalTime=this._time=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0,(0!==h||0===i&&k>0&&k!==j)&&(e="onReverseComplete",d=this._reversed),0>a?(this._active=!1,0===i&&(this._initted||!this.vars.lazy||c)&&(k>=0&&(c=!0),this._rawPrevTime=g=!b||a||k===a?a:j)):this._initted||(c=!0);else if(this._totalTime=this._time=a,this._easeType){var l=a/i,m=this._easeType,n=this._easePower;(1===m||3===m&&l>=.5)&&(l=1-l),3===m&&(l*=2),1===n?l*=l:2===n?l*=l*l:3===n?l*=l*l*l:4===n&&(l*=l*l*l*l),1===m?this.ratio=1-l:2===m?this.ratio=l:.5>a/i?this.ratio=l/2:this.ratio=1-l/2}else this.ratio=this._ease.getRatio(a/i);if(this._time!==h||c){if(!this._initted){if(this._init(),!this._initted||this._gc)return;if(!c&&this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration))return this._time=this._totalTime=h,this._rawPrevTime=k,H.push(this),void(this._lazy=a);this._time&&!d?this.ratio=this._ease.getRatio(this._time/i):d&&this._ease._calcEnd&&(this.ratio=this._ease.getRatio(0===this._time?0:1))}for(this._lazy!==!1&&(this._lazy=!1),this._active||!this._paused&&this._time!==h&&a>=0&&(this._active=!0),0===h&&(this._startAt&&(a>=0?this._startAt.render(a,b,c):e||(e="_dummyGS")),this.vars.onStart&&(0!==this._time||0===i)&&(b||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||s))),f=this._firstPT;f;)f.f?f.t[f.p](f.c*this.ratio+f.s):f.t[f.p]=f.c*this.ratio+f.s,f=f._next;this._onUpdate&&(0>a&&this._startAt&&this._startTime&&this._startAt.render(a,b,c),b||(this._time!==h||d)&&this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||s)),e&&(this._gc||(0>a&&this._startAt&&!this._onUpdate&&this._startTime&&this._startAt.render(a,b,c),d&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!b&&this.vars[e]&&this.vars[e].apply(this.vars[e+"Scope"]||this,this.vars[e+"Params"]||s),0===i&&this._rawPrevTime===j&&g!==j&&(this._rawPrevTime=0)))}},e._kill=function(a,b){if("all"===a&&(a=null),null==a&&(null==b||b===this.target))return this._lazy=!1,this._enabled(!1,!1);b="string"!=typeof b?b||this._targets||this.target:E.selector(b)||b;var c,d,e,f,g,h,i,j;if((m(b)||F(b))&&"number"!=typeof b[0])for(c=b.length;--c>-1;)this._kill(a,b[c])&&(h=!0);else{if(this._targets){for(c=this._targets.length;--c>-1;)if(b===this._targets[c]){g=this._propLookup[c]||{},this._overwrittenProps=this._overwrittenProps||[],d=this._overwrittenProps[c]=a?this._overwrittenProps[c]||{}:"all";break}}else{if(b!==this.target)return!1;g=this._propLookup,d=this._overwrittenProps=a?this._overwrittenProps||{}:"all"}if(g){i=a||g,j=a!==d&&"all"!==d&&a!==g&&("object"!=typeof a||!a._tempKill);for(e in i)(f=g[e])&&(f.pg&&f.t._kill(i)&&(h=!0),f.pg&&0!==f.t._overwriteProps.length||(f._prev?f._prev._next=f._next:f===this._firstPT&&(this._firstPT=f._next),f._next&&(f._next._prev=f._prev),f._next=f._prev=null),delete g[e]),j&&(d[e]=1);!this._firstPT&&this._initted&&this._enabled(!1,!1)}}return h},e.invalidate=function(){return this._notifyPluginsOfEnabled&&E._onPluginEvent("_onDisable",this),this._firstPT=null,this._overwrittenProps=null,this._onUpdate=null,this._startAt=null,this._initted=this._active=this._notifyPluginsOfEnabled=this._lazy=!1,this._propLookup=this._targets?{}:[],this},e._enabled=function(a,b){if(g||f.wake(),a&&this._gc){var c,d=this._targets;if(d)for(c=d.length;--c>-1;)this._siblings[c]=S(d[c],this,!0);else this._siblings=S(this.target,this,!0)}return B.prototype._enabled.call(this,a,b),this._notifyPluginsOfEnabled&&this._firstPT?E._onPluginEvent(a?"_onEnable":"_onDisable",this):!1},E.to=function(a,b,c){return new E(a,b,c)},E.from=function(a,b,c){return c.runBackwards=!0,c.immediateRender=0!=c.immediateRender,new E(a,b,c)},E.fromTo=function(a,b,c,d){return d.startAt=c,d.immediateRender=0!=d.immediateRender&&0!=c.immediateRender,new E(a,b,d)},E.delayedCall=function(a,b,c,d,e){return new E(b,0,{delay:a,onComplete:b,onCompleteParams:c,onCompleteScope:d,onReverseComplete:b,onReverseCompleteParams:c,onReverseCompleteScope:d,immediateRender:!1,useFrames:e,overwrite:0})},E.set=function(a,b){return new E(a,0,b)},E.getTweensOf=function(a,b){if(null==a)return[];a="string"!=typeof a?a:E.selector(a)||a;var c,d,e,f;if((m(a)||F(a))&&"number"!=typeof a[0]){for(c=a.length,d=[];--c>-1;)d=d.concat(E.getTweensOf(a[c],b));for(c=d.length;--c>-1;)for(f=d[c],e=c;--e>-1;)f===d[e]&&d.splice(c,1)}else for(d=S(a).concat(),c=d.length;--c>-1;)(d[c]._gc||b&&!d[c].isActive())&&d.splice(c,1);return d},E.killTweensOf=E.killDelayedCallsTo=function(a,b,c){"object"==typeof b&&(c=b,b=!1);for(var d=E.getTweensOf(a,b),e=d.length;--e>-1;)d[e]._kill(c,a)};var V=q("plugins.TweenPlugin",function(a,b){this._overwriteProps=(a||"").split(","),this._propName=this._overwriteProps[0],this._priority=b||0,this._super=V.prototype},!0);if(e=V.prototype,V.version="1.10.1",V.API=2,e._firstPT=null,e._addTween=function(a,b,c,d,e,f){var g,h;return null!=d&&(g="number"==typeof d||"="!==d.charAt(1)?Number(d)-c:parseInt(d.charAt(0)+"1",10)*Number(d.substr(2)))?(this._firstPT=h={_next:this._firstPT,t:a,p:b,s:c,c:g,f:"function"==typeof a[b],n:e||b,r:f},h._next&&(h._next._prev=h),h):void 0},e.setRatio=function(a){for(var b,c=this._firstPT,d=1e-6;c;)b=c.c*a+c.s,c.r?b=Math.round(b):d>b&&b>-d&&(b=0),c.f?c.t[c.p](b):c.t[c.p]=b,c=c._next},e._kill=function(a){var b,c=this._overwriteProps,d=this._firstPT;if(null!=a[this._propName])this._overwriteProps=[];else for(b=c.length;--b>-1;)null!=a[c[b]]&&c.splice(b,1);for(;d;)null!=a[d.n]&&(d._next&&(d._next._prev=d._prev),d._prev?(d._prev._next=d._next,d._prev=null):this._firstPT===d&&(this._firstPT=d._next)),d=d._next;return!1},e._roundProps=function(a,b){for(var c=this._firstPT;c;)(a[this._propName]||null!=c.n&&a[c.n.split(this._propName+"_").join("")])&&(c.r=b),c=c._next},E._onPluginEvent=function(a,b){var c,d,e,f,g,h=b._firstPT;if("_onInitAllProps"===a){for(;h;){for(g=h._next,d=e;d&&d.pr>h.pr;)d=d._next;(h._prev=d?d._prev:f)?h._prev._next=h:e=h,(h._next=d)?d._prev=h:f=h,h=g}h=b._firstPT=e}for(;h;)h.pg&&"function"==typeof h.t[a]&&h.t[a]()&&(c=!0),h=h._next;return c},V.activate=function(a){for(var b=a.length;--b>-1;)a[b].API===V.API&&(K[(new a[b])._propName]=a[b]);return!0},p.plugin=function(a){if(!(a&&a.propName&&a.init&&a.API))throw"illegal plugin definition.";var b,c=a.propName,d=a.priority||0,e=a.overwriteProps,f={init:"_onInitTween",set:"setRatio",kill:"_kill",round:"_roundProps",initAll:"_onInitAllProps"},g=q("plugins."+c.charAt(0).toUpperCase()+c.substr(1)+"Plugin",function(){V.call(this,c,d),this._overwriteProps=e||[]},a.global===!0),h=g.prototype=new V(c);h.constructor=g,g.API=a.API;for(b in f)"function"==typeof a[b]&&(h[f[b]]=a[b]);return g.version=a.version,V.activate([g]),g},c=a._gsQueue){for(d=0;d<c.length;d++)c[d]();for(e in n)!n[e].func}g=!1}}(window),angular.module("att.abs.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)},100),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]).factory("$scrollTo",["$window",function(a){var b=function(b,c,d){TweenMax.to(a,d||1,{scrollTo:{y:c,x:b},ease:Power4.easeOut})};return b}]).factory("animation",function(){return TweenMax}).factory("$progressBar",function(){var a=function(a){var b=function(b,c){TweenMax.to({},c,{onUpdateParams:["{self}"],onUpdate:a,onComplete:b})};return function(){return b}()};return a}).factory("$height",function(){var a=function(a,b,c,d){TweenMax.to(a,b,{height:c,autoAlpha:d},0)};return a}),angular.module("att.abs.accordion",["att.abs.utilities","att.abs.position","att.abs.transition"]).constant("accordionConfig",{closeOthers:!1}).controller("AccordionController",["$scope","$attrs","accordionConfig","$log",function(a,b,c,d){this.groups=[],this.index=-1,this.scope=a,a.forceExpand=!1,this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&!a.forceExpand&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)}),this.groups.indexOf(d)===this.groups.length-1&&a.forceExpand&&(a.forceExpand=!1)},this.expandAll=function(){a.forceExpand=!0,angular.forEach(this.groups,function(a){a.isOpen=!0})},this.collapseAll=function(){angular.forEach(this.groups,function(a){a.isOpen=!1})},this.focus=function(a){var b=this;angular.forEach(this.groups,function(c,d){c!==a?c.focused=!1:(b.index=d,c.focused=!0)})},this.blur=function(a){a.focused=!1,this.index=-1,d.log("accordion.blur()",a)},this.cycle=function(b,c,d){if(c)if(this.index===this.groups.length-1){if(d)return this.index=0,b.focused=!1,void a.$apply();this.index=0}else this.index++;else this.index<=0&&!d?this.index=this.groups.length-1:this.index--;b.focused=!1,this.groups[this.index].setFocus=!0,this.groups[this.index].focused=!0,a.$apply()},this.addGroup=function(a){var b=this;a.index=this.groups.length,a.focused=!1,this.groups.push(a),this.groups.length>0&&(this.index=0),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(this.groups.indexOf(a),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,scope:{cClass:"@css",expandAll:"=?",collapseAll:"=?"},template:'<div class="{{cClass}}" ng-transclude></div>',link:function(a,b,c,d){a.$watch("expandAll",function(b){b&&(d.expandAll(),a.expandAll=!1)}),a.$watch("collapseAll",function(b){b&&(d.collapseAll(),a.collapseAll=!1)})}}}).directive("accordionGroup",[function(){return{require:["^accordion","accordionGroup"],restrict:"EA",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/accordion/accordion.html",scope:{heading:"@",isOpen:"=?"},controller:["$scope",function(a){a.showicon=!0,this.setHeading=function(b){this.heading=b,a.showicon=!1},this.isIsOpen=function(){return a.isOpen}}],link:function(a,b,c,d){var e=d[0],f=d[1],g={tab:9,enter:13,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40},h=b.children().eq(0);a.setFocus=!1;var i=function(b){var c=!0;switch(b.keyCode){case g.enter:b.preventDefault(),a.toggle(),a.$apply();break;case g.up:case g.left:b.preventDefault(),e.cycle(a,!1);break;case g.down:case g.right:b.preventDefault(),e.cycle(a,!0);break;default:c=!1}return b.stopPropagation(),c};angular.isUndefined(a.isOpen)&&(a.isOpen=!1),h.bind("keydown",i),e.addGroup(a),0===a.index&&(a.focused=!0),f.toggle=a.toggle=function(){return a.isOpen=!a.isOpen,e.focus(a),a.isOpen},a.$watch("isOpen",function(b){b&&e.closeOthers(a)}),a.$watch("focused",function(b){b?(h.attr("tabindex","0"),a.setFocus&&h[0].focus()):(a.setFocus=!1,h.attr("tabindex","-1"))})}}}]).directive("accordionToggle",function(){return{restrict:"EA",require:"^accordionGroup",scope:{expandIcon:"@",collapseIcon:"@"},link:function(a,b,c,d){var e=function(c){a.expandIcon&&a.collapseIcon&&(c?(b.removeClass(a.expandIcon),b.addClass(a.collapseIcon)):(b.removeClass(a.collapseIcon),b.addClass(a.expandIcon)))};b.bind("click",function(){d.toggle(),a.$apply()}),a.$watch(function(){return d.isIsOpen()},function(a){e(a)})}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",require:"^accordionGroup",compile:function(a,b,c){var d=function(a,b,d,e){c(a,function(a){b.append(a),e.setHeading(b)})};return d}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&b.find("span").eq(0).prepend(a)})}}}).directive("attGoTop",["$scrollTo",function(a){return{restrict:"A",transclude:!1,link:function(b,c,d){c.bind("click",function(){a(0,d.attGoTop)})}}}]).directive("attGoTo",["$anchorScroll","$location",function(a,b){return{restrict:"A",transclude:!1,link:function(c,d,e){d.bind("click",function(){var c=e.attGoTo;b.hash()!==c?b.hash(e.attGoTo):a()})}}}]).directive("freeStanding",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:!0,template:"<div><span class='att-accordion__freestanding' ng-show='showAccordion'></span>\n<div class='section-toggle'>\n<button class='section-toggle__button' ng-click='fsToggle()'>\n    {{btnText}}<i style='font-size:0.875rem' ng-class='{\"icon-chevron-up\": showAccordion,\"icon-chevron-down\": !showAccordion, }'></i> \n</button>\n</div></div>",compile:function(a,b,c){var d=function(a,b,d){a.content="",c(a,function(a){b.find("span").append(a)}),a.showAccordion=!1,a.btnText=a.showAccordion?d.hideMsg:d.showMsg,a.fsToggle=function(){a.showAccordion=!a.showAccordion,a.btnText=a.showAccordion?d.hideMsg:d.showMsg}};return d}}}).directive("expanders",function(){return{restrict:"EA",replace:!0,transclude:!0,template:"<div ng-transclude></div>",controller:["$scope",function(a){var b=null;this.setScope=function(a){b=a},this.toggle=function(){return a.isOpen=b.isOpen=!b.isOpen,b.isOpen}}],link:function(a){a.isOpen=!1}}}).directive("expanderHeading",function(){return{require:"^expanders",restrict:"EA",replace:!0,transclude:!0,scope:!0,template:"<div style='padding:10px !important' ng-transclude></div>"}}).directive("expanderBody",function(){return{restrict:"EA",require:"^expanders",replace:!0,transclude:!0,scope:{},template:"<div collapse='!isOpen'><div ng-transclude></div></div>",link:function(a,b,c,d){a.isOpen=!1,d.setScope(a)}}}).directive("expanderToggle",function(){return{restrict:"EA",require:"^expanders",scope:{expandIcon:"@",collapseIcon:"@"},link:function(a,b,c,d){var e=!1,f=function(){a.expandIcon&&a.collapseIcon&&(e?(b.removeClass(a.expandIcon),b.addClass(a.collapseIcon)):(b.removeClass(a.collapseIcon),b.addClass(a.expandIcon)))};b.bind("keydown",function(b){13===b.keyCode&&a.toggleit()}),b.bind("click",function(){a.toggleit()}),a.toggleit=function(){e=d.toggle(),f(),a.$apply()},f()}}}).directive("collapse",["$transition",function(a){var b={open:{marginTop:null,marginBottom:null,paddingTop:null,paddingBottom:null,display:"block"},closed:{marginTop:0,marginBottom:0,paddingTop:0,paddingBottom:0,display:"none"}},c=function(a,c,d){c.removeClass("collapse"),c.css({height:d}),0===d?c.css(b.closed):c.css(b.open),c.addClass("collapse")};return{link:function(d,e,f){var g,h=!0;d.$watch(function(){return e[0].scrollHeight},function(){0===e[0].scrollHeight||g||(h?c(d,e,e[0].scrollHeight+"px"):c(d,e,"auto"))});var i,j=function(b){return i&&i.cancel(),i=a(e,b),i.then(function(){i=void 0},function(){i=void 0}),i},k=function(){d.postTransition=!0,h?(h=!1,g||c(d,e,"auto")):j(angular.extend({height:e[0].scrollHeight+"px"},b.open)).then(function(){g||c(d,e,"auto")}),g=!1},l=function(){g=!0,h?(h=!1,c(d,e,0)):(c(d,e,e[0].scrollHeight+"px"),j(angular.extend({height:0},b.closed)).then(function(){d.postTransition=!1}))};d.$watch(f.collapse,function(a){a?l():k()})}}}]).directive("attAccord",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"AttAccordCtrl",templateUrl:"app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html"}}).controller("AttAccordCtrl",[function(){this.type="attAccord",this.headerCtrl,this.bodyCtrl;var a=!0;this.toggleBody=function(){a?this.expandBody():this.collapseBody(),a=!a},this.expandBody=function(){this.bodyCtrl.expand()},this.collapseBody=function(){this.bodyCtrl.collapse()}}]).controller("AttAccordHeaderCtrl",[function(){this.type="header"}]).directive("attAccordHeader",["keymap","events",function(a,b){return{restrict:"EA",transclude:!0,replace:!0,require:["^attAccord","attAccordHeader"],controller:"AttAccordHeaderCtrl",templateUrl:"app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html",link:function(b,c,d,e){var f=e[0],g=e[1];f.headerCtrl=g;var h=c.children().eq(0);b.clickFunc=function(){f.toggleBody()};var i=function(c){var d=!0;switch(c.keyCode){case a.KEY.ENTER:c.preventDefault(),b.clickFunc(),b.$apply();break;default:d=!1}return c.stopPropagation(),d};angular.isUndefined(b.isOpen)&&(b.isOpen=!1),h.bind("keydown",i)}}}]).controller("AttAccordBodyCtrl",["$scope",function(a){this.type="body",this.expand=function(){a.expand()},this.collapse=function(){a.collapse()}}]).directive("attAccordBody",["$timeout","$height",function(a,b){return{restrict:"EA",transclude:!0,replace:!0,require:["^attAccord","attAccordBody"],controller:"AttAccordBodyCtrl",templateUrl:"app/scripts/ng_js_att_tpls/accordion/attAccordBody.html",link:function(c,d,e,f){var g=f[0],h=f[1];g.bodyCtrl=h;var i;a(function(){i=d[0].offsetHeight,b(d,0,0,0)}),c.expand=function(){b(d,.05,i,1)},c.collapse=function(){b(d,.25,0,0)}}}}]),angular.module("att.abs.alert",[]).directive("attAlert",[function(){return{restrict:"EA",replace:!0,transclude:!0,scope:{alertType:"@type",showTop:"@topPos",showAlert:"="},templateUrl:"app/scripts/ng_js_att_tpls/alert/alert.html",link:function(a){"true"===a.showTop?a.cssStyle={top:"50px"}:a.cssStyle={top:"0px"},a.close=function(){a.showAlert=!1}}}}]),angular.module("att.abs.boardStrip",["att.abs.utilities"]).constant("BoardStripConfig",{maxVisibleBoards:4,boardsToScroll:1,boardLength:140,boardMargin:15}).directive("attBoard",[function(){return{restrict:"AE",replace:!0,transclude:!0,require:"^attBoardStrip",scope:{boardIndex:"=",boardLabel:"="},templateUrl:"app/scripts/ng_js_att_tpls/boardStrip/attBoard.html",link:function(a,b,c,d){var e=d;a.getCurrentIndex=function(){return e.getCurrentIndex()},a.selectBoard=function(a){isNaN(a)||e.setCurrentIndex(a)},a.isInView=function(a){return e.isInView(a)}}}}]).directive("attBoardStrip",["BoardStripConfig","$timeout","$ieVersion",function(a,b,c){return{restrict:"AE",replace:!0,transclude:!0,scope:{currentIndex:"=selectedIndex",boardsMasterArray:"=",onAddBoard:"&?"},templateUrl:"app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html",controller:function(b){if(angular.isDefined(b.boardsMasterArray)||(b.boardsMasterArray=[]),this.rectifyMaxVisibleBoards=function(){this.maxVisibleIndex>=b.boardsMasterArray.length&&(this.maxVisibleIndex=b.boardsMasterArray.length-1),this.maxVisibleIndex<0&&(this.maxVisibleIndex=0)},this.resetBoardStrip=function(){b.currentIndex=0,this.maxVisibleIndex=a.maxVisibleBoards-1,this.minVisibleIndex=0,this.rectifyMaxVisibleBoards()},b.currentIndex>0){var c=b.currentIndex;this.resetBoardStrip(),c>b.boardsMasterArray.length?b.currentIndex=b.boardsMasterArray.length-1:b.currentIndex=c}else this.resetBoardStrip();this.getCurrentIndex=function(){return b.currentIndex},this.setCurrentIndex=function(a){b.currentIndex=a},this.isInView=function(a){return a<=this.maxVisibleIndex&&a>=this.minVisibleIndex},this.getBoardsMasterArrayLength=function(){return b.boardsMasterArray.length}},link:function(d,e,f,g){var h,i=c(),j=1e3;i&&10>i&&(j=0);var k=function(b){return b*(a.boardLength+a.boardMargin)};e[0].querySelector(".board-viewport")&&angular.element(e[0].querySelector(".board-viewport")).css({width:k(a.maxVisibleBoards)+"px"});var l=function(b){return b*(a.boardLength+a.boardMargin)};e[0].querySelector(".boardstrip-container")&&(angular.element(e[0].querySelector(".boardstrip-container")).css({width:l(g.getBoardsMasterArrayLength())+"px"}),angular.element(e[0].querySelector(".boardstrip-container")).css({left:"0px"}));var m=function(){var b;return b=g.getBoardsMasterArrayLength()<=a.maxVisibleBoards?0:g.minVisibleIndex*(a.boardLength+a.boardMargin)*-1},n=function(a,b,c){for(var d=0;d<a.length;d++)angular.element(a[d]).attr("tabindex","-1");for(var d=b;c>=d;d++)angular.element(a[d]).attr("tabindex","0")};d.$watchCollection("boardsMasterArray",function(c,d){c!==d&&(c.length<d.length?(g.resetBoardStrip(),b(function(){var a=e[0].querySelectorAll("[att-board]");if(0!==a.length){var c=angular.element(e[0].querySelector(".boardstrip-container"))[0].style.left,d=m();c!==d+"px"?(angular.element(e[0].querySelector(".boardstrip-container")).css({left:d+"px"}),b.cancel(h),h=b(function(){a[0].focus()},j)):a[0].focus()}else e[0].querySelector("div.boardstrip-item--add").focus();angular.element(e[0].querySelector(".boardstrip-container")).css({width:l(g.getBoardsMasterArrayLength())+"px"})})):(g.maxVisibleIndex=g.getBoardsMasterArrayLength()-1,g.minVisibleIndex=Math.max(g.maxVisibleIndex-a.maxVisibleBoards+1,0),g.setCurrentIndex(g.maxVisibleIndex),b(function(){angular.element(e[0].querySelector(".boardstrip-container")).css({width:l(g.getBoardsMasterArrayLength())+"px"});var a=angular.element(e[0].querySelector(".boardstrip-container"))[0].style.left,c=m(),d=e[0].querySelectorAll("[att-board]");a!==c+"px"?(angular.element(e[0].querySelector(".boardstrip-container")).css({left:c+"px"}),b.cancel(h),h=b(function(){d[d.length-1].focus()},j)):d[d.length-1].focus(),n(d,g.minVisibleIndex,g.maxVisibleIndex)})))}),d.nextBoard=function(){g.maxVisibleIndex+=a.boardsToScroll,g.rectifyMaxVisibleBoards(),g.minVisibleIndex=g.maxVisibleIndex-(a.maxVisibleBoards-1),b.cancel(h),angular.element(e[0].querySelector(".boardstrip-container")).css({left:m()+"px"}),b(function(){var a=e[0].querySelectorAll("[att-board]");if(n(a,g.minVisibleIndex,g.maxVisibleIndex),!d.isNextBoard())try{a[a.length-1].focus()}catch(b){}},j)},d.prevBoard=function(){g.minVisibleIndex-=a.boardsToScroll,g.minVisibleIndex<0&&(g.minVisibleIndex=0),g.maxVisibleIndex=g.minVisibleIndex+a.maxVisibleBoards-1,g.rectifyMaxVisibleBoards(),b.cancel(h),angular.element(e[0].querySelector(".boardstrip-container")).css({left:m()+"px"}),b(function(){var a=e[0].querySelectorAll("[att-board]");if(n(a,g.minVisibleIndex,g.maxVisibleIndex),
-0===g.minVisibleIndex)try{e[0].querySelector("div.boardstrip-item--add").focus()}catch(b){}})},d.isPrevBoard=function(){return g.minVisibleIndex>0},d.isNextBoard=function(){return g.getBoardsMasterArrayLength()-1>g.maxVisibleIndex}}}}]).directive("attAddBoard",["BoardStripConfig","$parse","$timeout",function(a,b,c){return{restrict:"AE",replace:!0,require:"^attBoardStrip",scope:{onAddBoard:"&?"},templateUrl:"app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html",link:function(a,c,d,e){a.addBoard=function(){d.onAddBoard&&(a.onAddBoard=b(a.onAddBoard),a.onAddBoard())}}}}]).directive("attBoardNavigation",["keymap","events",function(a,b){return{restrict:"AE",link:function(c,d){var e=a.KEY.LEFT,f=a.KEY.RIGHT;d.bind("keydown",function(a){switch(a.keyCode||(a.keyCode=a.which),a.keyCode){case f:if(b.preventDefault(a),b.stopPropagation(a),d[0].nextElementSibling&&parseInt(angular.element(d[0].nextElementSibling).attr("tabindex"))>=0)angular.element(d[0])[0].nextElementSibling.focus();else{var c=angular.element(d[0])[0];do{if(!c.nextSibling)break;c=c.nextSibling}while(c&&"LI"!==c.tagName);c.tagName&&"LI"===c.tagName&&parseInt(angular.element(c).attr("tabindex"))>=0&&c.focus()}break;case e:if(b.preventDefault(a),b.stopPropagation(a),d[0].previousElementSibling&&parseInt(angular.element(d[0].previousElementSibling).attr("tabindex"))>=0)angular.element(d[0])[0].previousElementSibling.focus();else{var g=angular.element(d[0])[0];do{if(!g.previousSibling)break;g=g.previousSibling}while(g&&"LI"!==g.tagName);g.tagName&&"LI"===g.tagName&&parseInt(angular.element(c).attr("tabindex"))>=0&&g.focus()}}})}}}]),angular.module("att.abs.breadCrumbs",[]).constant("classConstant",{defaultClass:"breadcrumbs__link",activeClass:"breadcrumbs__link--active"}).directive("attCrumb",["classConstant",function(a){return{restrict:"A",link:function(b,c,d){c.addClass(a.defaultClass),"active"===d.attCrumb&&c.addClass(a.activeClass),c.hasClass("last")||c.after('<i class="breadcrumbs__item"></i>')}}}]),angular.module("att.abs.buttons",["att.abs.position","att.abs.utilities"]).constant("btnConfig",{btnClass:"button",btnPrimaryClass:"button--primary",btnSecondaryClass:"button--secondary",btnDisabledClass:"button--inactive",btnSmallClass:"button--small"}).directive("attButton",["btnConfig",function(a){return{restrict:"A",link:function(b,c,d){c.addClass(a.btnClass),"small"===d.size&&c.addClass(a.btnSmallClass),d.$observe("btnType",function(b){"primary"===b?(c.addClass(a.btnPrimaryClass),c.removeClass(a.btnSecondaryClass),c.removeClass(a.btnDisabledClass),c.removeAttr("disabled")):"secondary"===b?(c.addClass(a.btnSecondaryClass),c.removeClass(a.btnPrimaryClass),c.removeClass(a.btnDisabledClass),c.removeAttr("disabled")):"disabled"===b&&(c.addClass(a.btnDisabledClass),c.removeClass(a.btnPrimaryClass),c.removeClass(a.btnSecondaryClass),c.attr("disabled","disabled"))})}}}]).directive("attButtonLoader",[function(){return{restrict:"A",replace:!1,scope:{size:"@"},template:"<div ng-class=\"{'button--loading': size === 'large','button--loading__small': size === 'small'}\"><i></i><i class=\"second__loader\"></i><i></i></div>",link:function(a,b){b.addClass("button button--inactive")}}}]).directive("attButtonHero",[function(){return{restrict:"A",replace:!1,transclude:!0,scope:{icon:"@"},template:"<div class=\"button--hero__inner\"><span ng-transclude></span> <i ng-class=\"{'icon-arrow-right': icon === 'arrow-right','icon-cart': icon === 'cart'}\"></i></div>",link:function(a,b){b.addClass("button button--hero"),b.attr("tabindex","0")}}}]).directive("attBtnDropdown",["$document","$timeout","$isElement","$documentBind","keymap","events",function(a,b,c,d,e,f){return{restrict:"EA",scope:{type:"@dropdowntype"},replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html",link:function(g,h){g.isOpen=!1;var i=-1,j=[],k=void 0;b(function(){j=h.find("li"),k=h.find("button")[0]},10);var l=g.toggle=function(a){angular.isUndefined(a)||""===a?g.isOpen=!g.isOpen:g.isOpen=a},m=function(){i+1<j.length&&(i++,j[i].focus())},n=function(){i-1>=0&&(i--,j[i].focus())};h.bind("keydown",function(a){var b=a.keyCode;if(e.isAllowedKey(b)||e.isControl(a)||e.isFunctionKey(a))switch(b){case e.KEY.ENTER:i>0&&(k.focus(),g.$apply());break;case e.KEY.ESC:l(!1),i=-1,k.focus(),g.$apply();break;case e.KEY.DOWN:m(),g.$apply(),f.preventDefault(a),f.stopPropagation(a);break;case e.KEY.UP:n(),g.$apply(),f.preventDefault(a),f.stopPropagation(a)}else b===e.KEY.TAB&&(l(!1),i=-1,g.$apply())});var o=function(b){var d=c(angular.element(b.target),h,a);if(!d){l(!1),i=-1;for(var e=0;e<j.length;e++)angular.element(j[e]).removeClass("selected");k.focus(),g.$apply()}};d.click("isOpen",o,g)}}}]),angular.module("att.abs.checkbox",[]).constant("attCheckboxConfig",{activeClass:"att-checkbox--on",disabledClass:"att-checkbox--disabled"}).directive("checkboxLimit",function(){return{scope:{checkboxLimit:"=",selectLimit:"@?",maxSelected:"&?"},restrict:"A",require:"checkboxLimit",controller:["$scope",function(a){a.limit=!0,this.getMaxLimits=function(){return a.limit},this.setMaxLimits=function(b){a.limit=b},this.maxCheckboxSelected=function(){a.maxSelected()}}],link:function(a,b,c,d){a.$watch("checkboxLimit",function(){var b=0;for(var c in a.checkboxLimit)a.checkboxLimit.hasOwnProperty(c)&&a.checkboxLimit[c]&&(b+=1);b>=parseInt(a.selectLimit)?d.setMaxLimits(!1):d.setMaxLimits(!0)},!0)}}}).directive("attCheckbox",["$compile","attCheckboxConfig",function(a,b){return{scope:{},restrict:"A",require:["ngModel","^?checkboxLimit"],link:function(c,d,e,f){var g=f[0],h=f[1],i=a('<div tabindex="0" role="checkbox" att-accessibility-click="13,32" aria-label="Checkbox" ng-click="updateModel($event)" class="att-checkbox"></div>')(c);d.css({display:"none"}),d.wrap(i),d.parent().append('<div class="att-checkbox__indicator"></div>'),d.parent().attr("title",e.title),d.parent().attr("aria-label",e.title),d.parent().attr("id",e.id),d.removeAttr("id"),g.$render=function(){var a=g.$modelValue?!0:!1;d.parent().toggleClass(b.activeClass,a),d.parent().attr("aria-checked",a)},c.updateModel=function(a){c.disabled||(g.$setViewValue(d.parent().hasClass(b.activeClass)?!1:!0),h&&!h.getMaxLimits()&&g.$modelValue?(h.maxCheckboxSelected(),g.$setViewValue(d.parent().hasClass(b.activeClass)?!0:!1)):g.$render()),a.preventDefault()},e.$observe("disabled",function(a){c.disabled=a||"disabled"===a||"true"===a,d.parent().toggleClass(b.disabledClass,c.disabled),d.parent().attr("tabindex",c.disabled?"-1":"0")})}}}]).directive("checkboxGroup",["$compile",function(a){return{scope:{checkboxGroup:"=",checkboxGroupValue:"=?"},restrict:"A",link:function(b,c,d){b.checkboxState="none",void 0===b.checkboxGroupValue&&(b.checkboxGroupValue="indeterminate"),c.css({display:"none"}),c.wrap(a('<div tabindex="0" role="checkbox" att-accessibility-click="13,32" ng-click="updateModel($event)" class="att-checkbox"></div>')(b)),c.parent().append('<div class="att-checkbox__indicator"></div>'),c.parent().attr("title",d.title),c.parent().attr("aria-label",d.title),b.$watch("checkboxState",function(a){"all"===a?(c.parent().addClass("att-checkbox--on"),c.parent().removeClass("att-checkbox--indeterminate"),c.parent().attr("aria-checked",!0)):"none"===a?(c.parent().removeClass("att-checkbox--on"),c.parent().removeClass("att-checkbox--indeterminate"),c.parent().attr("aria-checked",!1)):"indeterminate"===a&&(c.parent().removeClass("att-checkbox--on"),c.parent().addClass("att-checkbox--indeterminate"),c.parent().attr("aria-checked",!0))}),b.updateModel=function(a){if(c.parent().hasClass("att-checkbox--on")){c.parent().removeClass("att-checkbox--on");for(var d in b.checkboxGroup)b.checkboxGroup.hasOwnProperty(d)&&(b.checkboxGroup[d]=!1)}else{c.parent().addClass("att-checkbox--on");for(var e in b.checkboxGroup)b.checkboxGroup.hasOwnProperty(e)&&(b.checkboxGroup[e]=!0)}a.preventDefault()},b.$watch("checkboxGroupValue",function(a){if(a===!1){c.parent().removeClass("att-checkbox--on");for(var d in b.checkboxGroup)b.checkboxGroup.hasOwnProperty(d)&&(b.checkboxGroup[d]=!1)}else if(a===!0){c.parent().addClass("att-checkbox--on");for(var e in b.checkboxGroup)b.checkboxGroup.hasOwnProperty(e)&&(b.checkboxGroup[e]=!0)}}),b.$watch("checkboxGroup",function(){var a=0,c=0,d=0;for(var e in b.checkboxGroup)b.checkboxGroup.hasOwnProperty(e)&&(d+=1,b.checkboxGroup[e]?a+=1:b.checkboxGroup[e]||(c+=1));d===a?(b.checkboxState="all",b.checkboxGroupValue=!0):d===c?(b.checkboxState="none",b.checkboxGroupValue=!1):(b.checkboxState="indeterminate",b.checkboxGroupValue="indeterminate")},!0)}}}]),angular.module("att.abs.colorselector",[]).directive("colorSelectorWrapper",[function(){return{scope:{selected:"=",iconColor:"@"},restrict:"AE",transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/colorselector/colorselector.html",link:function(a){a.applycolor={"background-color":a.iconColor},a.selectedcolor=function(b){a.selected=b}}}}]).directive("colorSelector",["$compile",function(a){return{restrict:"A",scope:{colorSelector:"@",ngModel:"="},link:function(b,c,d){c.removeAttr("color-selector");var e=d.title,f=angular.element('<color-selector-wrapper selected="ngModel" title="'+e+'" icon-color="{{colorSelector}}">'+c.prop("outerHTML")+"</color-selector-wrapper>"),g=a(f)(b);c.replaceWith(g)}}}]),angular.module("att.abs.datepicker",["att.abs.position","att.abs.utilities"]).constant("datepickerConfig",{dateFormat:"MM/dd/yyyy",dayFormat:"d",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEEE",dayTitleFormat:"MMMM yyyy",disableWeekend:!1,disableSunday:!1,startingDay:0,minDate:null,maxDate:null,mode:0,dateFilter:{defaultText:"Select from list"},datepickerEvalAttributes:["dateFormat","dayFormat","monthFormat","yearFormat","dayHeaderFormat","dayTitleFormat","disableWeekend","disableSunday","startingDay","mode"],datepickerWatchAttributes:["min","max"]}).factory("datepickerService",["datepickerConfig","dateFilter",function(a,b){var c=function(b,c){if(angular.isDefined(b)&&null!==b&&angular.isDefined(c)&&null!==c){var d=a.datepickerEvalAttributes.concat(a.datepickerWatchAttributes);for(var e in b){var f=b[e];-1!==d.indexOf(e)&&angular.isDefined(f)&&c.attr(e.toSnakeCase(),e)}}},d=function(b,c){if(angular.isDefined(b)&&null!==b&&angular.isDefined(c)&&null!==c){var d=function(a,b){c[a]=c.$parent.$eval(b)},e=function(a,b){c.$parent.$watch(b,function(b){c[a]=b}),c.$watch(a,function(a){c.$parent[b]=a})},f=a.datepickerEvalAttributes,g=a.datepickerWatchAttributes;for(var h in b){var i=b[h];-1!==f.indexOf(h)&&angular.isDefined(i)?d(h,i):-1!==g.indexOf(h)&&angular.isDefined(i)&&e(h,i)}}},e=function(a,c){if(a&&c){var d;-1!==c.indexOf("/")?d="/":-1!==c.indexOf("-")?d="-":-1!==c.indexOf(".")&&(d=".");var e=a.split(d),f=c.split(d);if(e.length!==f.length)return!1;for(var g=0;g<e.length;g++)e[g]=e[g].lPad(f[g].length,"0");var h=e.join(d),i=b(new Date(h),c);return h===i}};return{setAttributes:c,bindScope:d,validateDateString:e}}]).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function(a,b,c,d){function e(b,c){return angular.isDefined(b)?a.$parent.$eval(b):c}function f(a,b){return new Date(a,b,0).getDate()}function g(a,b){for(var c=[],d=a,e=0;b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(b){return b&&angular.isDate(a.currentDate)&&0===u(b,a.currentDate)?!0:!1}function i(b){return b&&angular.isDate(a.fromDate)&&0===u(b,a.fromDate)?!0:!1}function j(b){return b&&angular.isDate(a.fromDate)&&angular.isDate(a.currentDate)&&0===u(b,a.currentDate)?!0:!1}function k(b){return b&&angular.isDate(a.fromDate)&&angular.isDate(a.currentDate)&&u(b,a.fromDate)>=0&&u(b,a.currentDate)<=0?!0:!1}function l(a){return"Saturday"===c(a,s.dayHeader)||"Sunday"===c(a,s.dayHeader)?!0:!1}function m(b){return 0===u(b,a.resetTime(new Date))?!0:!1}function n(b){return b&&angular.isDate(a.focusedDate)&&0===u(b,a.focusedDate)?!0:!1}function o(b,c){return a.minDate&&a.minDate.getTime()>=b.getTime()&&a.minDate.getTime()<=c.getTime()}function p(b,c){return a.maxDate&&a.maxDate.getTime()>=b.getTime()&&a.maxDate.getTime()<=c.getTime()}function q(a){if(a){var b={pre:a.substr(0,3),post:a};return b}}function r(a){return{date:a.date,label:c(a.date,a.formatDay),header:c(a.date,a.formatHeader),focused:!!a.isFocused,selected:!!a.isSelected,from:!!a.isFromDate,to:!!a.isToDate,dateRange:!!a.isDateRange,oldMonth:!!a.oldMonth,nextMonth:!!a.newMonth,disabled:!!a.isDisabled,today:!!a.isToday,weekend:!!a.isWeakend}}var s={date:e(b.dateFormat,d.dateFormat),day:e(b.dayFormat,d.dayFormat),month:e(b.monthFormat,d.monthFormat),year:e(b.yearFormat,d.yearFormat),dayHeader:e(b.dayHeaderFormat,d.dayHeaderFormat),dayTitle:e(b.dayTitleFormat,d.dayTitleFormat),disableWeekend:e(b.disableWeekend,d.disableWeekend),disableSunday:e(b.disableSunday,d.disableSunday)},t=e(b.startingDay,d.startingDay);a.mode=e(b.mode,d.mode),a.minDate=d.minDate?a.resetTime(d.minDate):null,a.maxDate=d.maxDate?a.resetTime(d.maxDate):null;var u=this.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},v=this.isDisabled=function(b){return s.disableWeekend!==!0||"Saturday"!==c(b,s.dayHeader)&&"Sunday"!==c(b,s.dayHeader)?s.disableSunday===!0&&"Sunday"===c(b,s.dayHeader)?!0:a.minDate&&u(b,a.minDate)<0||a.maxDate&&u(b,a.maxDate)>0:!0};this.modes=[{name:"day",getVisibleDates:function(b,d){var e=b.getFullYear(),u=b.getMonth(),w=new Date(e,u,1),x=new Date(e,u+1,0),y=t-w.getDay(),z=y>0?7-y:-y,A=new Date(w),B=0;z>0&&(A.setDate(-z+1),B+=z),B+=f(e,u+1),B+=(7-B%7)%7;for(var C=g(A,B),D=[],E=0;B>E;E++){var F=new Date(C[E]);C[E]=r({date:F,formatDay:s.day,formatHeader:s.dayHeader,isFocused:n(F),isSelected:h(F),isFromDate:i(F),isToDate:j(F),isDateRange:k(F),oldMonth:new Date(F.getFullYear(),F.getMonth(),1,0,0,0).getTime()<new Date(e,u,1,0,0,0).getTime(),newMonth:new Date(F.getFullYear(),F.getMonth(),1,0,0,0).getTime()>new Date(e,u,1,0,0,0).getTime(),isDisabled:v(F),isToday:m(F),isWeakend:l(F)})}for(var G=0;7>G;G++)D[G]=q(c(C[G].date,s.dayHeader));return"top"===d?(a.disablePrevTop=o(w,x),a.disableNextTop=p(w,x)):"bottom"===d?(a.disablePrevBottom=o(w,x),a.disableNextBottom=p(w,x)):(a.disablePrevTop=a.disablePrevBottom=o(w,x),a.disableNextTop=a.disableNextBottom=p(w,x)),a.disablePrev=a.disablePrevTop||a.disablePrevBottom,a.disableNext=a.disableNextTop||a.disableNextBottom,{objects:C,title:c(b,s.dayTitle),labels:D}},split:7,step:{months:1}},{name:"month",getVisibleDates:function(a){for(var b=[],d=[],e=a.getFullYear(),f=0;12>f;f++){var g=new Date(e,f,1);b[f]=r({date:g,formatDay:s.month,formatHeader:s.month,isFocused:n(g),isSelected:h(g),isFromDate:i(g),isToDate:j(g),isDateRange:k(g),oldMonth:!1,newMonth:!1,isDisabled:v(g),isToday:m(g),isWeakend:!1})}return{objects:b,title:c(a,s.year),labels:d}},split:3,step:{years:1}}]}]).directive("datepicker",["$timeout",function(a){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/datepicker.html",scope:{currentDate:"=?current",fromDate:"=?from"},require:"datepicker",controller:"DatepickerController",link:function(b,c,d,e){function f(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c}function g(a){if(angular.isDate(a)&&!isNaN(a)?h=new Date(a):h||(h=new Date),h){var c;1===b.mode?(h=new Date,c=k(angular.copy(h),-1)):c=angular.copy(h);var d=i.modes[b.mode],e=d.getVisibleDates(c,"top");b.currentRows=f(e.objects,d.split),b.currentTitle=e.title,b.labels=e.labels||[];var g=d.getVisibleDates(k(angular.copy(c),1),"bottom");b.nextRows=f(g.objects,d.split),b.nextTitle=g.title}}var h,i=e,j=!1;b.focusedDate,b.resetTime=function(a){var c;return isNaN(new Date(a))?null:(c=new Date(a),c=1===b.mode?new Date(c.getFullYear(),c.getMonth()):new Date(c.getFullYear(),c.getMonth(),c.getDate()))},d.min&&b.$parent.$watch(d.min,function(a){b.minDate=a?b.resetTime(a):null,g()}),d.max&&b.$parent.$watch(d.max,function(a){b.maxDate=a?b.resetTime(a):null,g()});var k=function(a,c){var d=i.modes[b.mode].step;return a.setDate(1),a.setMonth(a.getMonth()+c*(d.months||0)),a.setFullYear(a.getFullYear()+c*(d.years||0)),a},l=function(a){var c=new Date(a.getFullYear(),a.getMonth(),a.getDate());b.currentDate=c},m=function(a){var c=new Date(a.getFullYear(),a.getMonth(),a.getDate());b.fromDate=c};b.select=function(a){j=!0,d.from?angular.isDate(b.fromDate)&&angular.isDate(b.currentDate)||(angular.isDate(b.fromDate)?l(a):angular.isDate(b.fromDate)||m(a)):l(a),b.focusedDate=a};var n=function(c,d){m(d),a(function(){j=!0,b.focusedDate=d,l(c)})};b.move=function(a){h=k(angular.copy(h),a),g()},b.$watch("currentDate",function(a){return angular.isDate(a)&&!isNaN(a)&&i.isDisabled(a)?void(b.currentDate=null):d.from&&!isNaN(a)&&!isNaN(b.fromDate)&&i.compare(a,b.fromDate)<0?void n(b.fromDate,a):(j?(g(),j=!1):angular.isDefined(a)&&null!==a?g(a):g(),void(b.focusedDate=void 0))}),b.$watch("fromDate",function(a){if(angular.isDate(a)&&!isNaN(a)&&i.isDisabled(a))return void(b.fromDate=null);if(d.from){if(!isNaN(b.currentDate)&&!isNaN(a)&&i.compare(b.currentDate,a)<0)return void n(a,b.currentDate);j?(g(),j=!1):angular.isDefined(a)&&null!==a?g(a):g()}b.focusedDate=void 0})}}}]).directive("datepickerPopup",["$document","datepickerService","$isElement","$documentBind",function(a,b,c,d){var e=function(e,f,g){b.bindScope(g,e),e.isOpen=!1;var h=e.toggle=function(a){a===!0||a===!1?e.isOpen=a:e.isOpen=!e.isOpen};e.$watch("current",function(){h(!1)});var i=function(b){var d=c(angular.element(b.target),f,a);d||(h(!1),e.$apply())};d.click("isOpen",i,e)};return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html",scope:{current:"=current"},compile:function(a,c){var d=a.find("span").eq(1);return d.attr("current","current"),b.setAttributes(c,d),e}}}]).directive("attDatepicker",["$log",function(a){return{restrict:"A",require:"ngModel",scope:{},controller:["$scope","$element","$attrs","$compile","datepickerConfig","datepickerService",function(a,b,c,d,e,f){var g=angular.isDefined(c.dateFormat)?a.$parent.$eval(c.dateFormat):e.dateFormat,h='<div class="sr-focus hidden-spoken" tabindex="-1">the date you selected is {{$parent.current | date : \''+g+"'}}</div>";b.removeAttr("att-datepicker"),b.removeAttr("ng-model"),b.attr("ng-model","$parent.current"),b.attr("aria-describedby","datepicker"),b.attr("format-date",g),b.attr("att-input-deny","[^0-9/-]"),b.attr("maxlength",10);var i=angular.element("<div></div>");i.attr("datepicker-popup",""),i.attr("current","current"),f.setAttributes(c,i),f.bindScope(c,a),i.html(""),i.append(b.prop("outerHTML")),null===navigator.userAgent.match(/MSIE 8/)&&i.append(h);var j=i.prop("outerHTML");j=d(j)(a),b.replaceWith(j)}],link:function(b,c,d,e){return e?(b.$watch("current",function(a){e.$setViewValue(a)}),void(e.$render=function(){b.current=e.$viewValue})):void a.error("ng-model is required.")}}}]).directive("formatDate",["dateFilter","datepickerService",function(a,b){return{restrict:"A",require:"ngModel",link:function(c,d,e,f){var g="";e.$observe("formatDate",function(a){g=a});var h=function(b){return b?(f.$setValidity("invalidDate",!0),a(b,g)):(f.$setValidity("invalidDate",!1),d.val())},i=function(a){return b.validateDateString(a,g)?(f.$setValidity("invalidDate",!0),new Date(a)):(f.$setValidity("invalidDate",!1),null)};f.$formatters.unshift(h),f.$parsers.unshift(i)}}}]).directive("attDateFilter",["$document","dateFilter","datepickerConfig","datepickerService","$isElement","$documentBind",function(a,b,c,d,e,f){var g=function(g,h,i,j){d.bindScope(i,g),g.selectedOption=c.dateFilter.defaultText,g.showDropdownList=!1,g.showCalendar=!1,g.applyButtonType="disabled",g.currentSelection="";var k=angular.isDefined(i.dateFormat)?g.$parent.$eval(i.dateFormat):c.dateFormat,l=!1,m=function(a){if(!l){var c=k.toUpperCase(),d=k.toUpperCase();isNaN(new Date(g.fromDate))||(c=b(g.fromDate,k)),isNaN(new Date(g.currentDate))||(d=b(g.currentDate,k)),"Custom Single Date"===a?(j.$setValidity("invalidDate",!0),g.maxLength=10,g.selectedOption=d):"Custom Range"===a&&(j.$setValidity("invalidDate",!0),j.$setValidity("invalidDateRange",!0),g.maxLength=21,g.selectedOption=c+"-"+d)}},n=g.clear=function(a){g.fromDate=void 0,g.currentDate=void 0,g.applyButtonType="disabled",a||(j.$setValidity("invalidDate",!0),j.$setValidity("invalidDateRange",!0),m(g.currentSelection))},o=function(){g.showCalendar=!0},p=function(){g.showCalendar=!1,"Custom Single Date"!==g.currentSelection&&"Custom Range"!==g.currentSelection&&n(!0)},q=g.showDropdown=function(a){a===!0||a===!1?g.showDropdownList=a:g.showDropdownList=!g.showDropdownList,g.showDropdownList?("Custom Single Date"===g.currentSelection||"Custom Range"===g.currentSelection)&&o():(g.focusInputButton=!0,p())};g.resetTime=function(a){var b;return isNaN(new Date(a))?null:(b=new Date(a),new Date(b.getFullYear(),b.getMonth(),b.getDate()))},g.getDropdownText=function(){l=!0;var a=g.selectedOption;if("Custom Single Date"===g.currentSelection)!isNaN(new Date(a))&&d.validateDateString(a,k)?(j.$setValidity("invalidDate",!0),g.fromDate=void 0,g.currentDate=new Date(a)):(j.$setValidity("invalidDate",!1),n(!0));else if("Custom Range"===g.currentSelection)if(-1===a.indexOf("-")||2!==a.split("-").length&&6!==a.split("-").length)j.$setValidity("invalidDateRange",!1),n(!0);else{j.$setValidity("invalidDateRange",!0);var b=a.split("-");if(2===b.length)b[0]=b[0].trim(),b[1]=b[1].trim();else if(6===b.length){var c=b[0].trim()+"-"+b[1].trim()+"-"+b[2].trim(),e=b[3].trim()+"-"+b[4].trim()+"-"+b[5].trim();b[0]=c,b[1]=e}if(!isNaN(new Date(b[0]))&&!isNaN(new Date(b[1]))&&d.validateDateString(b[0],k)&&d.validateDateString(b[1],k)){j.$setValidity("invalidDate",!0);var f=new Date(b[0]),h=new Date(b[1]);f.getTime()<h.getTime()?(j.$setValidity("invalidDateRange",!0),g.fromDate=f,g.currentDate=h):(j.$setValidity("invalidDateRange",!1),n(!0))}else j.$setValidity("invalidDate",!1),n(!0)}},g.untrackInputChange=function(){l=!1},g.selectAdvancedOption=function(a,b){g.currentSelection=a,b||(n(),o()),g.$watch("currentDate",function(b){isNaN(new Date(b))||(g.applyButtonType="primary",m(a),l||(g.focusApplyButton=!0))}),g.$watch("fromDate",function(b){isNaN(new Date(b))||m(a)}),"Custom Single Date"===a?g.focusSingleDateCalendar=!0:"Custom Range"===a&&(g.focusRangeCalendar=!0)},g.resetFocus=function(){g.focusSingleDateCalendar=!1,g.focusRangeCalendar=!1,g.focusApplyButton=!1},g.apply=function(){g.dateRange.selection=g.selectedOption,isNaN(new Date(g.fromDate))?(g.from=void 0,g.dateRange.from=void 0):(g.from=g.fromDate,g.dateRange.from=g.fromDate),isNaN(new Date(g.currentDate))?(g.current=void 0,g.dateRange.current=void 0):(g.current=g.currentDate,g.dateRange.current=g.currentDate),q()},g.$watchCollection(function(){return g.dateRange},function(a){if(j){var b=angular.copy(a);j.$setViewValue(b)}}),j.$render=function(){if(j.$viewValue){var a=j.$viewValue;g.selectedOption=a.selection,g.fromDate=a.from,g.currentDate=a.current,void 0!==g.fromDate&&void 0!==g.currentDate?(g.selectAdvancedOption("Custom Range",!0),g.dateRange.from=g.fromDate,g.dateRange.current=g.currentDate):void 0!==g.currentDate&&(g.selectAdvancedOption("Custom Single Date",!0),g.dateRange.from=void 0,g.dateRange.current=g.currentDate)}},g.cancel=function(){g.currentSelection="",g.selectedOption=c.dateFilter.defaultText,q()};var r=function(b){var c=e(angular.element(b.target),h,a);c||(g.cancel(),g.$apply())};f.click("showDropdownList",r,g)};return{restrict:"EA",scope:{from:"=?from",current:"=?current"},replace:!0,require:"?ngModel",transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/dateFilter.html",controller:["$scope","$element","$attrs",function(a){a.dateRange={selection:void 0,from:void 0,current:void 0},this.selectOption=function(b,c,d){a.selectedOption=d,a.currentSelection=d,a.dateRange.selection=d,a.dateRange.current=a.resetTime(c),a.dateRange.from=a.resetTime(b),a.showDropdown()},a.checkCurrentSelection=this.checkCurrentSelection=function(b){return b===a.currentSelection?!0:!1}}],compile:function(a,b){var c=a.find("span").eq(4),e=a.find("span").eq(5);return e.attr("from","fromDate"),c.attr("current","currentDate"),e.attr("current","currentDate"),d.setAttributes(b,c),d.setAttributes(b,e),g}}}]).directive("attDateFilterList",function(){return{restrict:"EA",scope:{fromDate:"=fromDate",toDate:"=toDate",caption:"=caption",disabled:"=disabled"},require:"^attDateFilter",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html",link:function(a,b,c,d){a.selectOption=function(a,b,c){d.selectOption(a,b,c)},a.checkCurrentSelection=d.checkCurrentSelection}}}),angular.module("att.abs.devNotes",[]).directive("attDevNotes",function(){return{restrict:"EA",transclude:!0,scope:{},controller:function(a){var b=a.panes=[];a.select=function(a){angular.forEach(b,function(a){a.selected=!1}),a.selected=!0},this.addPane=function(c){0===b.length&&a.select(c),b.push(c)}},template:'<div><ul class="tabs"><li ng-repeat="pane in panes" ng-class="{active:pane.selected}"><a href="javascript:void(0)" ng-click="select(pane)">{{pane.title}}</a></li></ul><div ng-transclude></div></div>',replace:!0}}).directive("pane",function(){return{require:"^attDevNotes",restrict:"EA",transclude:!0,scope:{title:"@"},link:function(a,b,c,d){d.addPane(a)},template:'<div class="tab-pane" ng-class="{active: selected}">'+"<pre ng-class=\"{'language-markup':title=='HTML','language-javascript':title=='JavaScript','language-json':title=='JSON'}\"  class=\" line-numbers\"><code ng-transclude></code></pre></div>",replace:!0}}),angular.module("att.abs.dividerLines",[]).directive("attDividerLines",[function(){return{scope:{attDividerLines:"@"},restrict:"A",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html",link:function(a,b,c){a.lightContainer=c.attDividerLines}}}]),angular.module("att.abs.dragdrop",[]).directive("attFileDrop",["$parse",function(a){return{restrict:"A",scope:{fileModel:"=",onDrop:"&",attFileDrop:"&"},controller:["$scope","$attrs",function(a,b){""!==b.attFileDrop&&(a.onDrop=a.attFileDrop),this.onDrop=a.onDrop}],link:function(b,c){c.addClass("dragdrop"),c.bind("dragover",function(a){return a.originalEvent&&(a.dataTransfer=a.originalEvent.dataTransfer),a.dataTransfer.dropEffect="move",a.preventDefault&&a.preventDefault(),c.addClass("dragdrop-over"),!1}),c.bind("dragenter",function(a){return a.preventDefault&&a.preventDefault(),c.addClass("dragdrop-over"),!1}),c.bind("dragleave",function(){return c.removeClass("dragdrop-over"),!1}),c.bind("drop",function(d){return d.preventDefault&&d.preventDefault(),d.stopPropagation&&d.stopPropagation(),d.originalEvent&&(d.dataTransfer=d.originalEvent.dataTransfer),c.removeClass("dragdrop-over"),d.dataTransfer.files&&d.dataTransfer.files.length>0&&(b.fileModel=d.dataTransfer.files[0],b.$apply(),"function"==typeof b.onDrop&&(b.onDrop=a(b.onDrop),b.onDrop())),!1})}}}]).directive("attFileLink",[function(){return{restrict:"EA",require:"^?attFileDrop",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html",scope:{fileModel:"=?",onFileSelect:"&",attFileLink:"&"},controller:["$scope","$parse",function(a,b){this.setFileModel=function(b){a.takeFileModelFromParent?(a.$parent.fileModel=b,a.$parent.$apply()):(a.fileModel=b,a.$apply())},this.callbackFunction=function(){"function"==typeof a.onFileSelect&&(a.onFileSelect=b(a.onFileSelect),a.onFileSelect())}}],link:function(a,b,c,d){a.takeFileModelFromParent=!1,!c.fileModel&&d&&(a.takeFileModelFromParent=!0),""!==c.attFileLink?a.onFileSelect=a.attFileLink:!c.onFileSelect&&d&&(a.onFileSelect=d.onDrop)}}}]).directive("attFileChange",["$log","$rootScope",function(a,b){return{restrict:"A",require:"^attFileLink",link:function(c,d,e,f){function g(c){if(c.target.files&&c.target.files.length>0)f.setFileModel(c.target.files[0]),f.callbackFunction();else{var d=c.target.value;try{var e=new ActiveXObject("Scripting.FileSystemObject");f.setFileModel(e.getFile(d)),f.callbackFunction()}catch(c){var g="Error: Please follow the guidelines of Drag and Drop component on Sandbox demo page.";a.error(g),b.$broadcast("att-file-link-failure",g)}}}d.bind("change",g)}}}]),angular.module("att.abs.drawer",["att.abs.utilities"]).directive("attDrawer",["$document","$timeout","DOMHelper",function(a,b,c){return{restrict:"EA",replace:!0,transclude:!0,scope:{drawerOpen:"=?",drawerAutoClose:"&?"},template:'<div><div class="att-drawer" ng-transclude></div><div ng-class="{\'drawer-backdrop\':drawerOpen}"></div></div>',link:function(a,d,e){function f(b,c){b&&0!==b.style.width&&0!==b.style.height&&(m.style.display="none","right"===c.side||"left"===c.side?b.style.width="0px":("top"===c.side||"bottom"===c.side)&&(b.style.height="0px")),a.drawerOpen=!1,angular.isDefined(k)&&null!=k&&k.focus()}function g(a,c){k=document.activeElement,0!==a.style.width&&0!==a.style.height&&("right"===c.side||"left"===c.side?a.style.width=c.size:("top"===c.side||"bottom"===c.side)&&(a.style.height=c.size),b(function(){m.style.display="block",angular.isDefined(j)&&null!=j&&j.focus()},1e3*c.speed))}function h(a){var b={};return a&&"[object Function]"===b.toString.call(a)}var i={},j=void 0,k=void 0;i.side=e.drawerSlide||"top",i.speed=e.drawerSpeed||"0.25",i.size=e.drawerSize||"300px",i.zindex=e.drawerZindex||1e3,i.className=e.drawerClass||"att-drawer";var l=d.eq(0).children()[0],m=angular.element(l).children()[0];l.className=i.className,l.style.transitionDuration=i.speed+"s",l.style.webkitTransitionDuration=i.speed+"s",l.style.zIndex=i.zindex,l.style.position="fixed",l.style.width=0,l.style.height=0,l.style.transitionProperty="width, height","right"===i.side||"left"===i.side?(l.style.height=e.drawerCustomHeight||"100%",l.style.top=e.drawerCustomTop||"0px",l.style.bottom=e.drawerCustomBottom||"0px",l.style.right=e.drawerCustomRight||"0px"):("top"===i.side||"bottom"===i.side)&&(l.style.width=e.drawerCustomWidth||"100%",l.style.left=e.drawerCustomLeft||"0px",l.style.top=e.drawerCustomTop||"0px",l.style.right=e.drawerCustomRight||"0px"),b(function(){j=c.firstTabableElement(d[0])},10,!1),e.drawerSize&&a.$watch(function(){return e.drawerSize},function(b){i.size=b,a.drawerOpen&&g(l,i)}),a.$watch("drawerOpen",function(a){a?g(l,i):f(l,i)}),a.drawerAutoClose&&(a.$on("$locationChangeStart",function(){f(l,i),h(a.drawerAutoClose)&&a.drawerAutoClose()}),a.$on("$stateChangeStart",function(){f(l,i),h(a.drawerAutoClose)&&a.drawerAutoClose()}))}}}]),angular.module("att.abs.message",[]).directive("attMessages",[function(){return{restrict:"EA",scope:{messageType:"=?"},controller:["$scope","$element","$attrs",function(a,b,c){a.messageScope=[],this.registerScope=function(b){a.messageScope.push(b)},a.$parent.$watchCollection(c["for"],function(b){for(var c in b){if(b[c]){a.error=c;break}a.error=null}for(var d=0;d<a.messageScope.length;d++)a.messageScope[d].when===a.error?(a.messageScope[d].show(),a.setMessageType(a.messageScope[d].type)):a.messageScope[d].hide();null===a.error&&a.setMessageType(null)}),a.setMessageType=this.setMessageType=function(b){c.messageType&&(a.messageType=b)}}]}}]).directive("attMessage",[function(){return{restrict:"EA",scope:{},require:"^attMessages",link:function(a,b,c,d){d.registerScope(a),a.when=c.when||c.attMessage,a.type=c.type,a.show=function(){b.css({display:"block"})},a.hide=function(){b.css({display:"none"})},a.hide()}}}]),angular.module("att.abs.formField",["att.abs.message","att.abs.utilities"]).directive("attFormField",[function(){return{priority:101,restrict:"A",controller:function(){},link:function(a,b,c){b.wrap('<div class="form-field"></div>'),b.parent().append('<label class="form-field__label">'+c.placeholder||c.attFormField+"</label>"),b.wrap('<div class="form-field-input-container"></div>'),b.bind("keyup",function(){""!==this.value?b.parent().parent().find("label").addClass("form-field__label--show").removeClass("form-field__label--hide"):b.parent().parent().find("label").addClass("form-field__label--hide").removeClass("form-field__label--show")}),b.bind("blur",function(){
-""===this.value&&b.parent().parent().find("label").removeClass("form-field__label--hide")})}}}]).directive("attFormFieldValidation",["$compile","$log",function(a,b){return{priority:102,scope:{},restrict:"A",require:["?ngModel","?attFormField"],link:function(c,d,e,f){var g=f[0],h=f[1];return c.valid="",g?h?(d.parent().append(a(angular.element('<i class="icon-info-alert error" ng-show="valid===false">&nbsp;</i>'))(c)),d.parent().append(a(angular.element('<i class="icon-info-success success" ng-show="valid===true">&nbsp;</i>'))(c)),c.$watch("valid",function(a){a?d.parent().parent().addClass("success"):a===!1?d.parent().parent().addClass("error"):d.parent().parent().removeClass("success").removeClass("error")}),void d.bind("keyup",function(){g.$valid?c.valid=!0:g.$invalid?c.valid=!1:c.valid="",c.$apply()})):void b.error("att-form-field-validation :: att-form-field directive is required."):void b.error("att-form-field-validation :: ng-model directive is required.")}}}]).directive("attFormFieldValidationAlert",["$timeout",function(a){return{scope:{messageType:"=?"},restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html",link:function(b,c,d,e){b.showLabel=!1,b.hideLabel=!1,b.errorMessage=!1,b.warningMessage=!1;var f=function(){var a=b.messageType;"error"===a?(b.errorMessage=!0,b.warningMessage=!1):"warning"===a?(b.errorMessage=!1,b.warningMessage=!0):(b.errorMessage=!1,b.warningMessage=!1)},g=-1!==navigator.userAgent.toLowerCase().indexOf("msie 8.0");c.find("label").text(c.find("input").attr("placeholder")),c.find("input").bind("keyup",function(){""!==this.value?(b.showLabel=!0,b.hideLabel=!1,g&&c.find("label").css({top:"-20px"})):(b.showLabel=!1,b.hideLabel=!0,g&&c.find("label").css({top:"0px"})),f(),b.$apply()}),c.find("input").bind("blur",function(){""===this.value&&(b.showLabel=!1,b.hideLabel=!1),b.$apply()}),a(function(){f()},100)}}}]).constant("CoreFormsUiConfig",{phoneMask:"(___) ___-____"}).directive("attPhoneMask",["$parse","CoreFormsUiConfig",function(a,b){return{require:"ngModel",scope:{ngModel:"="},link:function(a,c,d,e){var f=navigator.userAgent.toLowerCase(),g=f.indexOf("android")>-1,h=(-1!==f.indexOf("msie 8.0"),""),i=!1;h=g?"__________":b.phoneMask,c.attr("maxlength",h.length);var j=function(a){var b=!1;return a&&(b=10===a.length),e.$setValidity("invalidPhoneNumber",i),e.$setValidity("mask",b),b},k=function(){var a,b=e.$modelValue;if(b.length){var c,d,f,g,i;for(g=[],f=h.split(""),i=f.length,c=b.substring(0,h.length),d=b.replace(/[^0-9]/g,"").split(""),a=0;i>a&&(g.push("_"===f[a]?d.shift():f[a]),0!==d.length);a++);return b=g.join(""),"("===b&&(b=""),e.$setViewValue(b),e.$render(),b}},l=function(b){b.which&&((b.which<48||b.which>57)&&(b.which<96||b.which>105)?8===b.which||9===b.which||46===b.which||13===b.which||37===b.which||39===b.which||b.ctrlKey===!0||"118"===b.which&&"86"===b.which||b.ctrlKey===!0||"99"===b.which&&"67"===b.which||b.ctrlKey===!0||"120"===b.which&&"88"===b.which||(b.preventDefault?b.preventDefault():b.returnValue=!1,c.attr("aria-label","Only numbers are allowed"),i=!1):(c.removeAttr("aria-label"),i=!0)),a.$apply()},m=function(a){var b=/^[A-Za-z]+$/,c=/^[0-9]+$/;a.match(b)&&(i=!1),a.match(c)&&(i=!0);var d="";return a&&a.length>0&&(d=a.replace(/[^0-9]/g,"")),j(d),d},n=function(a){var b="";return j(a),a&&(b=k()),b};e.$parsers.push(m),e.$formatters.push(n),c.bind("keyup",k),c.bind("keydown",l),c.bind("input",function(a){k(a),l(a)})}}}]).constant("validationTypeInt",{validationNum:{number:"1",text:"2",email:"3"}}).directive("attFormFieldPrv",["keyMapAc","validationTypeInt",function(a,b){return{priority:101,restrict:"AE",controller:["$scope",function(c){this.showHideErrorMessage=function(a){null!=c.$$prevSibling&&angular.isDefined(c.$$prevSibling)&&angular.isDefined(c.$$prevSibling.hideErrorMsg)&&(c.$$prevSibling.hideErrorMsg=a,c.$apply())},this.findAllowedCharactor=function(b){var d=a.keys;if(angular.isDefined(c.allowedSpecialCharacters)&&angular.isDefined(c.allowedSpecialCharacters.length)&&c.allowedSpecialCharacters.length>0){for(var e=c.allowedSpecialCharacters,f=!1,g=0;g<e.length;g++)if(e[g]===d[b]){f=!0;break}return f}return!1},this.validateText=function(a,b,c,d){if(angular.isDefined(b)&&0===b.length){var e=/^[a-zA-Z0-9]*$/i;return e.test(c)}var f="^[a-zA-Z0-9"+d+"]*$",g=new RegExp(f,"i");return g.test(c)},this.validateNumber=function(a,b,c,d){if(angular.isDefined(b)&&0===b.length){var e=/^[0-9\.]+$/;return e.test(c)}var f="^[0-9."+d+"]*$",g=new RegExp(f,"i");return g.test(c)},this.validateEmail=function(a,b,c,d){if(angular.isDefined(b)&&0===b.length){var e=/(([a-zA-Z0-9\-?\.?]+)@(([a-zA-Z0-9\-_]+\.)+)([a-z]{2,3}))+$/;return e.test(c)}var f="(([a-z"+d+"A-Z0-9-?.?]+)@(([a-z"+d+"A-Z0-9-_]+.)+)(["+d+"a-z]{2,3}))+$",g=new RegExp(f,"i");return g.test(c)},this.validateInput=function(a,c,d){var e="",f=!1;if(angular.isDefined(c)&&angular.isDefined(c.length)&&c.length>0)for(var g=0;g<c.length;g++)e+="\\"+c[g];switch(b.validationNum[a]){case b.validationNum.text:f=this.validateText(a,c,d,e);break;case b.validationNum.number:f=this.validateNumber(a,c,d,e);break;case b.validationNum.email:f=this.validateEmail(a,c,d,e)}return f}}],link:function(a,b,c){b.parent().prepend('<label class="form-field__label">'+c.placeholder+"</label>"),b.wrap('<div class="form-field-input-container"></div>'),b.parent().parent().find("label").addClass("form-field__label--show")}}}]).directive("attFormFieldValidationPrv",["keyMapAc","validationTypeInt",function(a,b){return{priority:202,scope:{validationType:"=",allowedChars:"="},restrict:"A",require:["?ngModel","^attFormFieldPrv"],link:function(c,d,e,f){var g=f[1];d.bind("keyup",function(){g.validateInput(c.validationType,c.allowedChars,d[0].value)?g.showHideErrorMessage(!1):g.showHideErrorMessage(!0)});var h=a.keyRange,i=a.allowedKeys,j=function(a,b){var c=b.which<h.startNum||b.which>h.endNum,d=b.which<h.startCapitalLetters||b.which>h.endCapitalLetters,e=b.which<h.startSmallLetters||b.which>h.endSmallLetters,f=c&&d&&e;return f&&!a},k=function(a,b){return(b.which<h.startNum||b.which>h.endNum)&&!a},l=function(a,b){var c="-"!==String.fromCharCode(b.which)&&"_"!==String.fromCharCode(b.which),d="@"!==String.fromCharCode(b.which)&&"."!==String.fromCharCode(b.which),e=c&&d,f=j(a,b);return!a&&e&&f},m=function(a,c,d){switch(a){case b.validationNum.text:if(j(c,d))return!0;break;case b.validationNum.number:if(k(c,d))return!0;break;case b.validationNum.email:if(l(c,d))return!0}return!1};d.bind("keypress",function(a){a.which||(a.keyCode?a.which=a.keyCode:a.charCode&&(a.which=a.charCode));var d=g.findAllowedCharactor(a.which),e=angular.isDefined(c.validationType)&&""!==c.validationType,f=a.which!==i.TAB&&a.which!==i.BACKSPACE&&a.which!==i.DELETE,h=e&&f;h&&m(b.validationNum[c.validationType],d,a)&&a.preventDefault()})}}}]).directive("attFormFieldValidationAlertPrv",[function(){return{restrict:"A",scope:{errorMessage:"="},transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html",link:function(a){a.errorMessage=a.errorMessage,angular.isDefined(a.$parent.hideErrorMsg)?a.hideErrorMsg=a.$parent.hideErrorMsg:a.hideErrorMsg=!0}}}]).factory("Cards",[function(){var a=/(\d{1,4})/g,b=/(?:^|\s)(\d{4})$/,c=[{type:"discover",pattern:/^(6011|65|64[4-9]|622)/,format:a,inputFormat:b,length:[16],cvcLength:[3],cvcSecurityImg:"visaI",zipLength:[5],luhn:!0},{type:"mc",pattern:/^5[1-5]/,format:a,inputFormat:b,length:[16],cvcLength:[3],cvcSecurityImg:"visaI",zipLength:[5],luhn:!0},{type:"amex",pattern:/^3[47]/,format:/(\d{1,4})(\d{1,6})?(\d{1,5})?/,inputFormat:/^(\d{4}|\d{4}\s\d{6})$/,length:[15],cvcLength:[4],cvcSecurityImg:"amexI",zipLength:[5],luhn:!0},{type:"visa",pattern:/^4/,format:a,inputFormat:b,length:[16],cvcLength:[3],cvcSecurityImg:"visaI",zipLength:[5],luhn:!0}],d=function(a){var b,d,e;for(a=(a+"").replace(/\D/g,""),d=0,e=c.length;e>d;d++)if(b=c[d],b.pattern.test(a))return b},e=function(a){var b,d,e;for(d=0,e=c.length;e>d;d++)if(b=c[d],b.type===a)return b};return{fromNumber:function(a){return d(a)},fromType:function(a){return e(a)},defaultFormat:function(){return a},defaultInputFormat:function(){return b}}}]).factory("_Validate",["Cards","$parse",function(a,b){var c=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1},d=function(a){var b,c,d,e,f,g;for(d=!0,e=0,c=(a+"").split("").reverse(),f=0,g=c.length;g>f;f++)b=c[f],b=parseInt(b,10),(d=!d)&&(b*=2),b>9&&(b-=9),e+=b;return e%10===0},e={};return e.cvc=function(d,e,f,g){var h,i;if(angular.isUndefined(d)||null===d||0===d.length)return!0;if(!/^\d+$/.test(d))return!1;var j;if(g.paymentsTypeModel){var k=b(g.paymentsTypeModel);j=k(f)}return j?(i=a.fromType(j),h=d.length,c.call(null!==i?i.cvcLength:void 0,h)>=0):d.length>=3&&d.length<=4},e.zip=function(d,e,f,g){var h,i;if(angular.isUndefined(d)||null===d||0===d.length)return!0;if(!/^\d+$/.test(d))return!1;var j;if(g.paymentsTypeModel){var k=b(g.paymentsTypeModel);j=k(f)}return j?(i=a.fromType(j),h=d.length,c.call(null!==i?i.zipLength:void 0,h)>=0):d.length<6},e.card=function(e,f,g,h){var i,j,k;h.paymentsTypeModel&&(k=b(h.paymentsTypeModel));var l=function(){k&&k.assign(g,null),f.$card=null};return angular.isUndefined(e)||null===e||0===e.length?(l(),!0):(e=(e+"").replace(/\s+|-/g,""),/^\d+$/.test(e)&&(i=a.fromNumber(e))?(f.$card=angular.copy(i),k&&k.assign(g,i.type),ret=(j=e.length,c.call(i.length,j)>=0&&(i.luhn===!1||d(e))),ret):(l(),!1))},function(a,b,c,d,f){if(!e[a])throw types=Object.keys(e),errstr='Unknown type for validation: "'+a+'". ',errstr+='Should be one of: "'+types.join('", "')+'"',errstr;return e[a](b,c,d,f)}}]).factory("_ValidateWatch",["_Validate",function(a){var b={};return b.cvc=function(b,c,d,e){e.paymentsTypeModel&&d.$watch(e.paymentsTypeModel,function(f,g){if(f!==g){var h=a(b,c.$modelValue,c,d,e);c.$setValidity(b,h)}})},b.zip=function(b,c,d,e){e.paymentsTypeModel&&d.$watch(e.paymentsTypeModel,function(f,g){if(f!==g){var h=a(b,c.$modelValue,c,d,e);c.$setValidity(b,h)}})},function(a,c,d,e){return b[a]?b[a](a,c,d,e):void 0}}]).directive("validateCard",["$window","_Validate","_ValidateWatch",function(a,b,c){return{restrict:"A",require:"ngModel",link:function(a,d,e,f){var g=e.validateCard;c(g,f,a,e);var h=function(c){var h=b(g,c,f,a,e);return f.$setValidity(g,h),"card"===g&&(null===f.$card?null==c||""===c||""===c?(a.invalidCardError="",a.invalidCard=""):c.length>=1&&(a.invalidCardError="error",a.invalidCard="The number entered is not a recognized credit card number."):h?(a.invalidCardError="",a.invalidCard=""):f.$card.length.indexOf(c.length)>=0?(a.invalidCardError="error",a.invalidCard="The number entered is not a recognized credit card number."):(a.invalidCardError="",a.invalidCard=""),d.bind("blur",function(){h&&null!==f.$card?(a.invalidCardError="",a.invalidCard=""):(a.invalidCardError="error",a.invalidCard="The number entered is not a recognized credit card number.")})),h?c:void 0};f.$formatters.push(h),f.$parsers.push(h)}}}]).directive("creditCardImage",function(){return{templateUrl:"app/scripts/ng_js_att_tpls/formField/creditCardImage.html",replace:!1,transclude:!1,link:function(a,b,c){a.$watch(c.creditCardImage,function(b,c){b!==c&&(a.cvc="",angular.isUndefined(b)||null===b||(a.newValCCI="show-"+b),null===b&&(a.newValCCI=""))})}}}).directive("securityCodeImage",["$document",function(a){return{templateUrl:"app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html",replace:!1,transclude:!1,link:function(b,c,d){b.$watch(d.securityCodeImage,function(a,c){a!==c&&(angular.isUndefined(a)||null===a||("amexI"===a?(b.newValI="ccv2-security-amex",b.newValIAlt="The 4 digit CVC security code is on the front of the card.",b.cvcPlaceholder="4 digits",b.cvcMaxlength=4):"visaI"===a&&(b.newValI="ccv2-security",b.newValIAlt="The CVC security code is on the back of your card right after the credit card number.",b.cvcPlaceholder="3 digits",b.cvcMaxlength=3)),null===a&&(b.newValI="ccv2-security",b.cvcPlaceholder="3 digits",b.cvcMaxlength=3,b.newValIAlt="The CVC security code is on the back of your card right after the credit card number."))}),c.bind("click",function(a){a.preventDefault(),c.find("button").hasClass("active")?c.find("button").removeClass("active"):c.find("button").addClass("active")});var e=angular.element(a);e.bind("click",function(a){var b=a.target.className;"btn btn-alt btn-tooltip active"!==b&&c.find("button").hasClass("active")&&c.find("button").removeClass("active")})}}}]),angular.module("att.abs.hourpicker",["att.abs.utilities"]).constant("hourpickerConfig",{days:["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],customOption:"Custom"}).controller("hourPickerController",["$scope",function(a){a.options=[],this.setOptions=function(b,c,d,e,f,g){a.options.push(b),void 0!==e&&(a.preselect=e);var h;if(void 0!==c){a.fromtime=c;for(h in a.days)a.days.hasOwnProperty(h)&&(a.FrtimeList[a.days[h]]={},void 0!==f?(a.FrtimeList[a.days[h]].value=f,a.selectedFromOption[a.days[h]]=f):(a.FrtimeList[a.days[h]].value=c[0].value,a.selectedFromOption[a.days[h]]=c[0].value))}if(void 0!==d){a.totime=d;for(h in a.days)a.days.hasOwnProperty(h)&&(a.TotimeList[a.days[h]]={},void 0!==g?(a.TotimeList[a.days[h]].value=g,a.selectedToOption[a.days[h]]=g):(a.TotimeList[a.days[h]].value=d[0].value,a.selectedToOption[a.days[h]]=d[0].value),a.showToTimeErrorDay[a.days[h]]=!1)}void 0!==f&&(a.uncheckedFromTime=f),void 0!==g&&(a.uncheckedToTime=g)},this.getSelectedOption=function(){return a.selectedOption},this.setToTimeErrorDay=function(b,c){a.showToTimeErrorDay[b]=c}}]).directive("attHourpickerOption",[function(){return{restrict:"EA",require:"^attHourpicker",scope:{option:"=option",fromtime:"=fromtime",totime:"=totime",preselect:"=preselect",uncheckedFromTime:"=",uncheckedToTime:"="},link:function(a,b,c,d){d.setOptions(a.option,a.fromtime,a.totime,a.preselect,a.uncheckedFromTime,a.uncheckedToTime)}}}]).directive("attHourpicker",["hourpickerConfig","$document","$log","$documentBind","$timeout",function(a,b,c,d,e){return{require:"ngModel",restrict:"EA",controller:"hourPickerController",transclude:!0,scope:{model:"=ngModel",resetFlag:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html",link:function(b,c,f,g){var h=!1;b.isFromDropDownOpen=!1,b.isToDropDownOpen=!1;var i="",j={};b.days=a.days,b.daysList={},b.FrtimeList={},b.FrtimeListDay={},b.TotimeListDay={},b.selectedFromOption={},b.selectedToOption={},b.TotimeList={},b.selectedIndex=0,b.selectedOption="Select from list",b.customTime=[],b.resetFlag=!1,b.showToTimeErrorDay={},b.validatedCustomPreselect=[],b.$watch("resetFlag",function(c,d){if(c!==d){if(c&&b.selectedOption===a.customOption){for(day in b.daysList)b.daysList.hasOwnProperty(day)&&(b.daysList[day]=!1,b.addSelectedValue(day));b.preselectUpdateFxn(b.preselect)}b.resetFlag=!1}}),b.$watch("selCategory",function(a){a&&g.$setViewValue(a)},!0),b.updateData=function(c){if(c.constructor===Array){b.showDaysSelector=!0,b.selectedOption=a.customOption;for(var d in c)if(c.hasOwnProperty(d)){var e=c[d].day;"boolean"==typeof c[d].preEnabled&&c[d].preEnabled?b.daysList[e]=!0:b.daysList[e]=!1;for(var f in b.fromtime)b.fromtime[f].value!==c[d].FromTime||b.uncheckedFromTime||(b.FrtimeList[e].value=b.fromtime[f].value,b.selectedFromOption[e]=b.FrtimeList[e].value);for(var g in b.totime)b.totime[g].value!==c[d].ToTime||b.uncheckedToTime||(b.TotimeList[e].value=b.totime[g].value,b.selectedToOption[e]=b.TotimeList[e].value);if(b.addSelectedValue(e,c[d].FromTime,c[d].ToTime),parseInt(d)+1===c.length)break}}else b.selectOption(c.day)},b.$watch("preselect",function(a){b.preselectUpdateFxn(a)}),b.preselectUpdateFxn=function(a){if(void 0!==a){if(b.options&&(a=b.validatePreselectData(a)),""===a)return;b.updateData(a)}},b.validatePreselectData=function(a){if(a.constructor===Array){for(var c in a)if(a.hasOwnProperty(c)){var d=a[c].day,e=!1,f=!1,g=!1;for(var h in b.days)if(b.days[h]===d){e=!0;break}if(!e){a.splice(c,1);continue}for(var i in b.fromtime)if(b.fromtime[i].value===a[c].FromTime){f=!0;break}f||(a[c].FromTime=b.fromtime[0].value);for(var j in b.totime)if(b.totime[j].value===a[c].ToTime){g=!0;break}if(g||(a[c].ToTime=b.totime[0].value),"boolean"==typeof a[c].preEnabled&&a[c].preEnabled?a[c].preEnabled=!0:a[c].preEnabled=!1,b.validatedCustomPreselect[d]={},b.validatedCustomPreselect[d].FromTime=a[c].FromTime,b.validatedCustomPreselect[d].ToTime=a[c].ToTime,parseInt(c)+1===a.length)break}}else{var k=!1;for(var l in b.options)if(b.options[l]===a.day){k=!0;break}k||(a="")}return a},b.selectPrevNextValue=function(a,b,c){var d,e=0;if(38===a.keyCode)d=-1;else{if(40!==a.keyCode)return c;d=1}if(-1!==b.indexOf(c))e=b.indexOf(c)+d;else for(var f in b)if(b[f].value===c){e=parseInt(f)+d;break}return e===b.length?e-=1:-1===e&&(e+=1),a.preventDefault(),b[e].value?b[e].value:b[e]},b.showDropdown=function(){b.showlist=!b.showlist,h=!h},b.showfromDayDropdown=function(a){for(count in b.FrtimeListDay)count!==a&&b.FrtimeListDay[count]&&(b.FrtimeListDay[count]=!1);for(count in b.TotimeListDay)b.TotimeListDay[count]&&(b.TotimeListDay[count]=!1);b.FrtimeListDay[a]=!b.FrtimeListDay[a],h=!h,b.showlist=!1,b.FrtimeListDay[a]?(b.isFromDropDownOpen=!0,i=a):b.isFromDropDownOpen=!1,e(function(){if(b.FrtimeListDay[a]){var d=angular.element(c)[0].querySelector(".customdays-width"),e=angular.element(d.querySelector(".select2-container-active")).parent()[0].querySelector("ul"),f=angular.element(e.querySelector(".selectedItemInDropDown"))[0].offsetTop;angular.element(e)[0].scrollTop=f}})},b.showtoDayDropdown=function(a){for(count in b.TotimeListDay)count!==a&&b.TotimeListDay[count]&&(b.TotimeListDay[count]=!1);for(count in b.FrtimeListDay)b.FrtimeListDay[count]&&(b.FrtimeListDay[count]=!1);b.TotimeListDay[a]=!b.TotimeListDay[a],h=!h,b.showlist=!1,b.TotimeListDay[a]?(b.isToDropDownOpen=!0,i=a):b.isToDropDownOpen=!1,e(function(){if(b.TotimeListDay[a]){var d=angular.element(c)[0].querySelector(".customdays-width"),e=angular.element(d.querySelector(".select2-container-active")).parent()[0].querySelector("ul"),f=angular.element(e.querySelector(".selectedItemInDropDown"))[0].offsetTop;angular.element(e)[0].scrollTop=f}})},b.selectFromDayOption=function(a,c){b.selectedFromOption[a]=c,b.FrtimeList[a].value=c,b.FrtimeListDay[a]=!1,b.isFromDropDownOpen=!1},b.selectToDayOption=function(a,c){b.selectedToOption[a]=c,b.TotimeList[a].value=c,b.TotimeListDay[a]=!1,b.isToDropDownOpen=!1},b.addSelectedValue=function(a,c,d){var e,f;if(void 0===b.daysList[a]||b.daysList[a]){for(b.selectedFromOption[a]===b.uncheckedFromTime&&(angular.isDefined(b.validatedCustomPreselect[a])?(b.selectedFromOption[a]=b.validatedCustomPreselect[a].FromTime,c=b.validatedCustomPreselect[a].FromTime,b.FrtimeList[a].value=b.validatedCustomPreselect[a].FromTime):(b.selectedFromOption[a]=b.fromtime[0].value,c=b.fromtime[0].value,b.FrtimeList[a].value=b.fromtime[0].value)),b.selectedToOption[a]===b.uncheckedToTime&&(angular.isDefined(b.validatedCustomPreselect[a])?(b.selectedToOption[a]=b.validatedCustomPreselect[a].ToTime,d=b.validatedCustomPreselect[a].ToTime,b.TotimeList[a].value=b.validatedCustomPreselect[a].ToTime):(b.selectedToOption[a]=b.totime[0].value,d=b.totime[0].value,b.TotimeList[a].value=b.totime[0].value)),j.day=a,j.FromTime=b.FrtimeList[a].value,j.ToTime=b.TotimeList[a].value,e=0,f=b.customTime.length;f>e;e++)if(b.customTime[e].day===a){b.customTime[e].FromTime=j.FromTime,b.customTime[e].ToTime=j.ToTime;break}if(e===f){var g=angular.copy(j);b.customTime.push(g)}}else for(e=0,f=b.customTime.length;f>e;e++)if(b.customTime[e].day===a){b.uncheckedFromTime?b.selectedFromOption[b.customTime[e].day]=b.uncheckedFromTime:b.selectedFromOption[b.customTime[e].day]=b.FrtimeList[b.customTime[e].day].value,b.uncheckedToTime?b.selectedToOption[b.customTime[e].day]=b.uncheckedToTime:b.selectedToOption[b.customTime[e].day]=b.TotimeList[b.customTime[e].day].value,b.customTime.splice(e,1);break}b.selCategory=b.customTime};var k=function(){b.showlist&&b.$apply(function(){b.showlist=!1})};d.click("showlist",k,b);var l=function(){b.$apply(function(){b.isFromDropDownOpen&&(b.FrtimeListDay[i]=!1,b.isFromDropDownOpen=!1)})};d.click("isFromDropDownOpen",l,b);var m=function(){b.$apply(function(){b.isToDropDownOpen&&(b.TotimeListDay[i]=!1,b.isToDropDownOpen=!1)})};d.click("isToDropDownOpen",m,b),b.selectOption=function(c){if(c===a.customOption)b.showDaysSelector=!0,b.selCategory=b.customTime;else{b.showDaysSelector=!1;var d=/[0-9]\s?am/i.exec(c),e=/[0-9]\s?pm/i.exec(c);b.selCategory={day:c,FromTime:null===d?"NA":d[0],ToTime:null===e?"NA":e[0]}}b.showlist=!1,h=!1,b.selectedOption=c}}}}]).directive("attHourpickerValidator",["hourpickerConfig",function(a){return{restrict:"A",require:["attHourpicker","ngModel"],link:function(b,c,d,e){var f=e[0],g=e[1],h=function(a){var b=Number(a.match(/^(\d+)/)[1]),c=Number(a.match(/:(\d+)/)[1]),d=a.match(/\s(.*)$/)[1].toUpperCase();"PM"===d&&12>b&&(b+=12),"AM"===d&&12===b&&(b-=12);var e=b.toString(),f=c.toString();return 10>b&&(e="0"+e),10>c&&(f="0"+f),parseInt(e+f,10)},i=function(a,b){var c=h(a),d=h(b);return d-c},j=function(b){if(f.getSelectedOption()===a.customOption){var c=0;for(var d in b)b.hasOwnProperty(d)&&(i(b[d].FromTime,b[d].ToTime)<=0?(f.setToTimeErrorDay(b[d].day,!0),c++):f.setToTimeErrorDay(b[d].day,!1));return c>0?(g.$setValidity("validationStatus",!1),[]):(g.$setValidity("validationStatus",!0),b)}return g.$setValidity("validationStatus",!0),b};g.$parsers.unshift(j)}}}]),angular.module("att.abs.iconButtons",[]).constant("buttonConfig",{activeClass:"active--button",toggleEvent:"click"}).directive("attIconBtnRadio",["buttonConfig",function(a){var b=a.activeClass||"active--button",c=a.toggleEvent||"click";return{require:"ngModel",link:function(a,d,e,f){d.attr("tabindex","0"),d.append("<span class='hidden-spoken'>"+e.attIconBtnRadio+"</span>"),f.$render=function(){d.parent().toggleClass(b,angular.equals(f.$modelValue,e.attIconBtnRadio))},d.parent().bind(c,function(){d.parent().hasClass(b)||a.$apply(function(){f.$setViewValue(e.attIconBtnRadio),f.$render()})})}}}]).directive("attIconBtnCheckbox",["buttonConfig",function(a){var b=a.activeClass||"active--button",c=a.toggleEvent||"click";return{require:"ngModel",link:function(a,d,e,f){function g(){var b=a.$eval(e.btnCheckboxTrue);return angular.isDefined(b)?b:!0}function h(){var b=a.$eval(e.btnCheckboxFalse);return angular.isDefined(b)?b:!1}d.attr("tabindex","0"),d.append("<span class='hidden-spoken'>"+e.attIconBtnCheckbox+"</span>"),f.$render=function(){d.parent().toggleClass(b,angular.equals(f.$modelValue,g()))},d.parent().bind(c,function(){a.$apply(function(){f.$setViewValue(d.parent().hasClass(b)?h():g()),f.$render()})})}}}]),angular.module("att.abs.links",["ngSanitize"]).directive("attLink",[function(){return{restrict:"A",link:function(a,b){b.addClass("link"),b.attr("href")||b.attr("tabindex","0")}}}]).directive("attLinkVisited",[function(){return{restrict:"A",link:function(a,b){b.addClass("link--visited"),b.attr("href")||b.attr("tabindex","0")}}}]).directive("attReadmore",["$timeout",function(a){return{restrict:"A",scope:{lines:"@noOfLines",textModel:"=",isOpen:"="},templateUrl:"app/scripts/ng_js_att_tpls/links/readMore.html",link:function(b,c){var d=1;b.$watch("textModel",function(e){e?("function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),b.textToDisplay=e.trim(),b.readFlag=!0,a(function(){var a=c[0].children[0].children[0];1===d&&(d=window.getComputedStyle?parseInt(b.lines)*parseFloat(window.getComputedStyle(a,null).getPropertyValue("height")):parseInt(b.lines)*parseFloat(a.currentStyle.height),b.elemHeight=d,b.readLinkStyle={height:b.elemHeight+"px"})}),b.readMoreLink=!0,b.readLessLink=!1):(b.textToDisplay="",b.readMoreLink=!1,b.readLessLink=!1,b.readFlag=!1)});var e=c.parent();e.hasClass("att-accordion__body")&&b.$watch("isOpen",function(a){a||(b.readMoreLink=!0,b.readLessLink=!1,b.readLinkStyle={height:b.elemHeight+"px"},b.readFlag=!0)}),b.readMore=function(){b.readMoreLink=!1,b.readLessLink=!0,b.readLinkStyle={height:"auto"},b.readFlag=!1;var d=angular.element(c).children().eq(1).find("a")[0];a(function(){d.focus()})},b.readLess=function(){b.readMoreLink=!0,b.readLessLink=!1,b.readLinkStyle={height:b.elemHeight+"px"},b.readFlag=!0;var d=angular.element(c).children().eq(0).find("a")[0];a(function(){d.focus()})}}}}]).directive("attLinksList",[function(){return{restrict:"A",controller:function(){},link:function(a,b){b.addClass("links-list")}}}]).directive("attLinksListItem",[function(){return{restrict:"A",require:"^attLinksList",link:function(a,b){b.addClass("links-list__item"),b.attr("href")||b.attr("tabindex","0")}}}]),angular.module("att.abs.loading",[]).directive("attLoading",["$window",function(a){return{restrict:"A",replace:!0,scope:{icon:"@attLoading",progressStatus:"=?",colorClass:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/loading/loading.html",link:function(b,c){var d=b.progressStatus;if(b.progressStatus=Math.min(100,Math.max(0,d)),-1!==a.navigator.userAgent.indexOf("MSIE 8.")){var e=0,f=36*b.progressStatus;c.css({"background-position-x":e,"background-position-y":-f})}}}}]),angular.module("att.abs.modal",["att.abs.utilities"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c<a.length;c++)if(b===a[c].key)return a[c]},keys:function(){for(var b=[],c=0;c<a.length;c++)b.push(a[c].key);return b},top:function(){return a[a.length-1]},remove:function(b){for(var c=-1,d=0;d<a.length;d++)if(b===a[d].key){c=d;break}return a.splice(c,1)[0]},removeTop:function(){return a.splice(a.length-1,1)[0]},length:function(){return a.length}}}}}).directive("modalBackdrop",["$timeout",function(a){return{restrict:"EA",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/modal/backdrop.html",link:function(b){b.animate=!1,a(function(){b.animate=!0})}}}]).directive("modalWindow",["$modalStack","$timeout","$document",function(a,b,c){return{restrict:"EA",scope:{index:"@",modalTitle:"@?"},replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/modal/window.html",link:function(d,e,f){d.windowClass=f.windowClass||"",f.modalTitle&&""!==f.modalTitle&&(e[0].setAttribute("aria-label",f.modalTitle),e[0].removeAttribute("modal-title")),b(function(){d.focusModalFlag=!0,d.animate=!0}),c.on("focus keydown",function(a){9===a.which&&(String.prototype.contains=function(a){return-1!==this.indexOf(a)},e[0]===a.target||e[0].contains(a.target)||e[0].focus())}),d.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!=c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault?(b.preventDefault(),b.stopPropagation()):b.returnValue=!1,a.dismiss(c.key,"backdrop click"))}}}}]).factory("$modalStack",["$document","$compile","$rootScope","$$stackedMap","events","keymap",function(a,b,c,d,e,f){function g(){for(var a=-1,b=m.keys(),c=0;c<b.length;c++)m.get(b[c]).value.backdrop&&(a=c);return a}function h(b){var c=a.find("body").eq(0),d=a.find("html").eq(0),e=m.get(b).value;m.remove(b),e.modalDomEl.remove(),c.toggleClass(k,m.length()>0),d.css({overflow:"scroll"}),j&&-1==g()&&(j.remove(),j=void 0),e.modalScope.$destroy(),angular.isDefined(o)&&null!=o&&o.focus()}var i,j,k="modal-open",l=c.$new(!0),m=d.createNew(),n={},o=void 0;return c.$watch(g,function(a){l.index=a}),a.bind("keydown",function(a){var b;if(27===a.which)b=m.top(),b&&b.value.keyboard&&c.$apply(function(){n.dismiss(b.key)});else if(a.keyCode===f.KEY.BACKSPACE){var d,g=!1,h=a.srcElement||a.target;g=void 0===h.type?!0:"INPUT"===h.tagName.toUpperCase()&&("TEXT"===(d=h.type.toUpperCase())||"PASSWORD"===d||"FILE"===d||"SEARCH"===d||"EMAIL"===d||"NUMBER"===d||"DATE"===d||"TEL"===d||"URL"===d||"TIME"===d)||"TEXTAREA"===h.tagName.toUpperCase()?h.readOnly||h.disabled:!0,g&&e.preventDefault(a)}}),n.open=function(c,d){m.add(c,{deferred:d.deferred,modalScope:d.scope,backdrop:d.backdrop,keyboard:d.keyboard}),o=document.activeElement;var e=a.find("body").eq(0),f=a.find("html").eq(0);g()>=0&&!j&&(i=angular.element("<div modal-backdrop></div>"),j=b(i)(l),e.append(j));var h=angular.element("<div modal-window></div>");h.attr("window-class",d.windowClass),h.attr("index",m.length()-1),h.attr("modal-title",d.modalTitle),h.html(d.content);var n=b(h)(d.scope);m.top().value.modalDomEl=n,e.append(n),e.addClass(k),f.css({overflow:"hidden"})},n.close=function(a,b){var c=m.get(a);c&&(c.value.deferred.resolve(b),h(a))},n.dismiss=function(a,b){var c=m.get(a).value;c&&(c.deferred.reject(b),h(a))},n.getTop=function(){return m.top()},n}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,windowClass:b.windowClass,modalTitle:b.modalTitle})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}).directive("simpleModal",["$modal",function(a){return{restrict:"EA",scope:{simpleModal:"@",backdrop:"@",keyboard:"@",modalOk:"&",modalCancel:"&",windowClass:"@",controller:"@",modalTitle:"@?"},link:function(b,c){c.bind("click",function(d){d.preventDefault(),angular.isDefined(c.attr("href"))&&""!==c.attr("href")&&(b.simpleModal=c.attr("href")),"false"===b.backdrop?b.backdropclick="static":b.backdropclick=!0,"false"===b.keyboard?b.keyboardev=!1:b.keyboardev=!0,a.open({templateUrl:b.simpleModal,backdrop:b.backdropclick,keyboard:b.keyboardev,windowClass:b.windowClass,controller:b.controller,modalTitle:b.modalTitle}).result.then(b.modalOk,b.modalCancel)})}}}]).directive("tabbedItem",["$modal","$log",function(a,b){return{restrict:"AE",replace:!0,scope:{items:"=items",controller:"@",templateId:"@",modalTitle:"@?"},templateUrl:"app/scripts/ng_js_att_tpls/modal/tabbedItem.html",controller:["$scope","$rootScope","$attrs",function(c){c.clickTab=function(d){for(var e=0;e<c.items.length;e++)e===d?(c.items[e].isTabOpen=!0,c.items[e].showData=!0):(c.items[e].isTabOpen=!1,c.items[e].showData=!1);var f=a.open({templateUrl:c.templateId,controller:c.controller,windowClass:"tabbedOverlay_modal",modalTitle:c.modalTitle,resolve:{items:function(){return c.items}}});f.result.then(function(a){c.selected=a},function(){b.info("Modal dismissed at: "+new Date)})},c.isActiveTab=function(a){return c.items&&c.items[a]&&c.items[a].isTabOpen}}]}}]).directive("tabbedOverlay",[function(){return{restrict:"AE",replace:!0,scope:{items:"="},transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html",controller:["$scope",function(a){a.clickTab=function(b){for(var c=0;c<a.items.length;c++)c===b?(a.items[c].isTabOpen=!0,a.items[c].showData=!0):(a.items[c].isTabOpen=!1,a.items[c].showData=!1)},a.isActiveTab=function(b){return a.items&&a.items[b]&&a.items[b].isTabOpen}}]}}]),angular.module("att.abs.pagination",["att.abs.utilities"]).directive("attPagination",[function(){return{restrict:"EA",scope:{totalPages:"=",currentPage:"=",showInput:"=",clickHandler:"=?"},replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/pagination/pagination.html",
-link:function(a){function b(b){angular.isDefined(b)&&null!==b&&((!b||1>b)&&(b=1),b>a.totalPages&&(b=a.totalPages),a.currentPage!==b&&(a.currentPage=b,c(a.currentPage)),a.totalPages>7&&(b<a.pages[0]&&b>3?a.pages=[b,b+1,b+2]:b>a.pages[2]&&b<a.totalPages-2?a.pages=[b-2,b-1,b]:3>=b?a.pages=[1,2,3]:b>=a.totalPages-2&&(a.pages=[a.totalPages-2,a.totalPages-1,a.totalPages])))}a.focusedPage,a.$watch("totalPages",function(c){if(angular.isDefined(c)&&null!==c){if(a.pages=[],1>c)return void(a.totalPages=1);if(7>=c)for(var d=1;c>=d;d++)a.pages.push(d);else if(c>7){var e=Math.ceil(c/2);a.pages=[e-1,e,e+1]}b(1)}}),a.$watch("currentPage",function(a){b(a)});var c=function(b){angular.isFunction(a.clickHandler)&&a.clickHandler(b)};a.next=function(b){b.preventDefault(),a.currentPage<a.totalPages&&(a.currentPage+=1,c(a.currentPage))},a.prev=function(b){b.preventDefault(),a.currentPage>1&&(a.currentPage-=1,c(a.currentPage))},a.selectPage=function(b,d){d.preventDefault(),a.currentPage=b,a.focusedPage=b,c(a.currentPage)},a.checkSelectedPage=function(b){return a.currentPage===b?!0:!1},a.isFocused=function(b){return a.focusedPage===b}}}}]),angular.module("att.abs.paneSelector",["att.abs.utilities"]).constant("paneGroupConstants",{SIDE_WIDTH_DEFAULT:"33%",INNER_PANE_DEFAULT:"67%",SIDE_PANE_ID:"sidePane",NO_DRILL_DOWN:"none"}).factory("animation",function(){return TweenLite}).directive("attPaneAccessibility",["keymap","$window",function(a,b){return{restrict:"A",require:["^?sidePane","^?innerPane"],link:function(b,c,d,e){var f=e[0],g=e[1],h=!1;b.ie=function(){for(var a,b=3,c=document.createElement("div"),d=c.getElementsByTagName("i");c.innerHTML="<!--[if gt IE "+ ++b+"]><i></i>< ![endif]-->",d[0];);return b>4?b:a}(),h=8===b.ie?!0:!1,c.bind("keydown",function(b){if(a.isAllowedKey(b.keyCode)||a.isControl(b)||a.isFunctionKey(b)){b.preventDefault(),b.stopPropagation();var d;switch(b.keyCode){case a.KEY.DOWN:if(d=angular.element(c[0])[0],d&&d.nextElementSibling&&d.nextElementSibling.focus(),h){do{if(!d||!d.nextSibling)break;d=d.nextSibling}while(d&&"DIV"!==d.tagName);d.focus()}break;case a.KEY.UP:if(d=angular.element(c[0])[0],d&&d.previousElementSibling&&d.previousElementSibling.focus(),h){do{if(!d||!d.previousSibling)break;d=d.previousSibling}while(d&&"DIV"!==d.tagName);d.focus()}break;case a.KEY.RIGHT:angular.isDefined(f)&&(d=f.getElement()[0]),angular.isDefined(g)&&(d=g.getElement()[0]);do{if(!d||!d.nextElementSibling)break;d=d.nextElementSibling}while("none"===window.getComputedStyle(d,null).getPropertyValue("display"));if(h)do{if(!d||!d.nextSibling)break;d=d.nextSibling}while(d&&"DIV"==d.tagName&&"none"==d.currentStyle.display);d&&d.querySelector("[att-pane-accessibility]").focus();break;case a.KEY.LEFT:angular.isDefined(f)&&(d=f.getElement()[0]),angular.isDefined(g)&&(d=g.getElement()[0]);do{if(!d||!d.previousElementSibling)break;d=d.previousElementSibling}while("none"==window.getComputedStyle(d,null).getPropertyValue("display"));if(h)do{if(!d||!d.previousSibling)break;d=d.previousSibling}while(d&&"DIV"==d.tagName&&"none"==d.currentStyle.display);d&&d.querySelector("[att-pane-accessibility]").focus()}}})}}}]).directive("sideRow",[function(){return{restrict:"A",replace:!0,require:["^sidePane","^paneGroup"],link:function(a,b,c,d){var e=d[0],f=d[1];a.$first&&(e.sidePaneIds=[]);var g=c.paneId,h=c.drillDownTo;e.sidePaneRows.push({paneId:g,drillDownTo:h}),b.on("click",function(){e.currentSelectedRowPaneId=g,f.slideOutPane(g,!0)})}}}]).controller("SidePaneCtrl",["$scope","$element","animation","paneGroupConstants",function(a,b,c,d){this.getElement=function(){return b},this.sidePaneTracker={},this.currentWidth=d.SIDE_WIDTH_DEFAULT,this.paneId=d.SIDE_PANE_ID,this.currentSelectedRowPaneId,this.drillDownToMapper={},this.sidePaneRows=[],this.init=function(){var a=this.sidePaneRows;if(a)for(var b in a)if(a.hasOwnProperty(b)){var c=a[b].paneId,d=a[b].drillDownTo;this.drillDownToMapper[c]=d,0==b&&(this.currentSelectedRowPaneId=c,this.sidePaneTracker[c]=[])}},this.getSidePanesList=function(){return this.sidePaneTracker[this.currentSelectedRowPaneId]},this.addToSidePanesList=function(a){void 0===this.sidePaneTracker[this.currentSelectedRowPaneId]?this.sidePaneTracker[this.currentSelectedRowPaneId]=[]:a&&this.sidePaneTracker[this.currentSelectedRowPaneId].push(a)},this.setWidth=function(a){a&&(this.currentWidth=a),c.set(b,{width:this.currentWidth})},this.resizeWidth=function(a){a&&(this.currentWidth=a),c.to(b,.5,{width:a})}}]).directive("sidePane",["paneGroupConstants",function(a){return{restrict:"EA",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/paneSelector/sidePane.html",require:["^paneGroup","sidePane"],controller:"SidePaneCtrl",scope:{},link:function(b,c,d,e){var f=e[0],g=e[1];f.addPaneCtrl(a.SIDE_PANE_ID,g)}}}]).directive("drillDownRow",["$parse","paneGroupConstants",function(a,b){return{restrict:"A",replace:!0,require:["^innerPane","^paneGroup"],link:function(a,c,d,e){var f=e[0],g=e[1];c.on("click",function(){var a=f.drillDownTo;f.drillDownTo!==b.NO_DRILL_DOWN&&g.slideOutPane(a),c[0].focus()})}}}]).controller("InnerPaneCtrl",["$scope","$element","animation","paneGroupConstants",function(a,b,c,d){this.getElement=function(){return b},this.paneId=a.paneId,this.drillDownTo,this.currentWidth=d.INNER_PANE_DEFAULT,this.setWidth=function(a){a&&(this.currentWidth=a),c.set(b,{width:this.currentWidth})},this.resizeWidth=function(a,d){c.to(b,.25,{width:a,onComplete:d})},this.displayNone=function(){c.set(b,{display:"none"})},this.displayBlock=function(){c.set(b,{display:"block"}),this&&this.hideRightBorder()},this.floatLeft=function(){c.set(b,{"float":"left"})},this.hideLeftBorder=function(){c.set(b,{borderLeftWidth:"0px"})},this.showLeftBorder=function(){c.set(b,{borderLeftWidth:"1px"})},this.hideRightBorder=function(){c.set(b,{borderRightWidth:"0px"})},this.showRightBorder=function(){c.set(b,{borderRightWidth:"1px"})},this.slideFromRight=function(){c.set(b,{"float":"right"}),c.set(b,{width:this.currentWidth})},this.startOpen=function(){return a.startOpen}}]).directive("innerPane",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/paneSelector/innerPane.html",require:["^paneGroup","innerPane"],controller:"InnerPaneCtrl",scope:{paneId:"@"},link:function(a,b,c,d){""===c.startOpen&&(a.startOpen=!0);var e=d[0],f=d[1];e.addPaneCtrl(a.paneId,f)}}}).controller("PaneGroupCtrl",["$scope","$element","paneGroupConstants",function(a,b,c){this.panes={},this.accountLevelPaneModel=[],this.title=a.title,this.init=function(){function a(a,b){var c,d=[];for(c in a.sidePaneRows)if(a.sidePaneRows.hasOwnProperty(c)){var e=a.sidePaneRows[c];c>0&&b[e.paneId].startOpen&&b[e.paneId].startOpen()&&(d.push(e),a.addToSidePanesList(e.paneId))}if(f)for(c in d)if(d.hasOwnProperty(c)){var g=d[c].paneId,h=b[g];h&&h.setWidth&&h.displayBlock&&(h.setWidth(f),h.displayBlock())}}var b=this.panes[c.SIDE_PANE_ID];if(b){b.init();var d,e=1;for(d in this.panes)this.panes[d].startOpen&&this.panes[d].startOpen()&&e++;var f;if(e>=3&&(f=100/e+"%"),this.panes[b.currentSelectedRowPaneId]){f?(b.setWidth(f),this.panes[b.currentSelectedRowPaneId].setWidth(f)):(b.setWidth(),this.panes[b.currentSelectedRowPaneId].setWidth()),this.panes[b.currentSelectedRowPaneId].displayBlock();for(d in this.panes)d!==c.SIDE_PANE_ID&&d!==b.currentSelectedRowPaneId&&this.panes[d].displayNone(),this.panes[d].drillDownTo=b.drillDownToMapper[d]}a(b,this.panes)}},this.resetPanes=function(){for(var a in this.panes)if(this.panes.hasOwnProperty(a)){var b=this.panes[a];b&&b.paneId!==c.SIDE_PANE_ID&&(b.floatLeft(),b.displayNone())}this.panes[c.SIDE_PANE_ID]&&this.panes[c.SIDE_PANE_ID].setWidth(c.SIDE_WIDTH_DEFAULT)},this.addPaneCtrl=function(a,b){this.panes[a]=b},this._slideOutPane=function(a,b){this.resetPanes();var d;if(b)if(this.panes[c.SIDE_PANE_ID]&&(d=this.panes[c.SIDE_PANE_ID].getSidePanesList()),d){if(this.panes&&this.panes[c.SIDE_PANE_ID])if(0===d.length&&this.panes[a])this.panes[c.SIDE_PANE_ID].setWidth(c.SIDE_WIDTH_DEFAULT),this.panes[a].displayBlock(),this.panes[a].setWidth(c.INNER_PANE_DEFAULT);else{var e=d.length+2,f=100/e+"%";this.panes[c.SIDE_PANE_ID].setWidth(f),this.panes[this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId]&&(this.panes[this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId].displayBlock(),this.panes[this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId].setWidth(f));for(var g in d)this.panes[d[g]]&&(this.panes[d[g]].displayBlock(),this.panes[d[g]].setWidth(f))}}else this.panes&&this.panes[c.SIDE_PANE_ID]&&this.panes[a]&&(this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId=a,this.panes[c.SIDE_PANE_ID].addToSidePanesList(),this.panes[a].slideFromRight(),this.panes[a].displayBlock(),this.panes[a].setWidth(c.INNER_PANE_DEFAULT));else{var h,i=!1;this.panes[c.SIDE_PANE_ID]&&(h=this.panes[c.SIDE_PANE_ID].getSidePanesList());for(var j in h)if(h.hasOwnProperty(j)){var k=h[j];if(k===a){i=!0;break}}!i&&this.panes[c.SIDE_PANE_ID]&&this.panes[c.SIDE_PANE_ID].addToSidePanesList(a);var l;this.panes[c.SIDE_PANE_ID]&&(l=this.panes[c.SIDE_PANE_ID].getSidePanesList().length);var m=l+2,n=100/m+"%";this.panes[c.SIDE_PANE_ID]&&this.panes[c.SIDE_PANE_ID].setWidth(n);var o;this.panes[c.SIDE_PANE_ID]&&(o=this.panes[c.SIDE_PANE_ID].getSidePanesList()[l-1]);var p=this;p.panes[c.SIDE_PANE_ID]&&(d=p.panes[c.SIDE_PANE_ID].getSidePanesList());for(var q in d)if(d.hasOwnProperty(q)){var r=d[q],s=this.panes[r];r!==o&&s&&(s.setWidth(n),s.displayBlock(),s.floatLeft())}this.panes[this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId]&&(this.panes[this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId].displayBlock(),this.panes[this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId].showRightBorder(),this.panes[this.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId].resizeWidth(n,function(){p.panes[o]&&p.panes[p.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId]&&(p.panes[p.panes[c.SIDE_PANE_ID].currentSelectedRowPaneId].hideRightBorder(),p.panes[o].setWidth(n),p.panes[o].slideFromRight(),p.panes[o].displayBlock(),p.panes[o].floatLeft())}))}},this.slideOutPane=function(a,b){this._slideOutPane(a,b)}}]).directive("paneGroup",["$timeout",function(a){return{restrict:"EA",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html",scope:{},controller:"PaneGroupCtrl",link:function(b,c,d,e){function f(){e.init()}a(f,100)}}}]),angular.module("att.abs.tooltip",["att.abs.position","att.abs.utilities","ngSanitize"]).constant("tooltipDefaultOptions",{placement:"above",animation:!1,popupDelay:0,stylett:"dark",appendToBody:!0}).provider("$tooltip",["tooltipDefaultOptions",function(a){function b(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var c={mouseenter:"mouseleave",click:"click",focus:"blur",mouseover:"mouseout"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate","$attElementDetach",function(e,f,g,h,i,j,k,l){return function(e,m,n){function o(a){var b=a||p.trigger||n,d=c[b]||b;return{show:b,hide:d}}var p=angular.extend({},a,d),q=b(e),r=k.startSymbol(),s=k.endSymbol();return{restrict:"EA",scope:!0,link:function(a,b,c){function d(){a.tt_isOpen?n():k()}function k(){(!F||a.$eval(c[m+"Enable"]))&&(a.tt_popupDelay?y=g(t,a.tt_popupDelay):a.$apply(t))}function n(){a.$apply(function(){u()})}function t(){var c,d,e,f;if(a.tt_content){x&&g.cancel(x),B.css({top:0,left:0,display:"block","z-index":9999}),C?(z=z||i.find("body"),z.append(B)):b.after(B),c=C?j.offset(b):j.position(b),d=B.prop("offsetWidth"),e=B.prop("offsetHeight");var h=10;switch(a.tt_placement){case"right":f=C?{top:c.top+c.height/2-e/2,left:c.left+c.width+G}:{top:c.top+c.height/2-e/2,left:c.left+c.width+h+G};break;case"below":f=C?{top:c.top+c.height+G,left:c.left+c.width/2-d/2}:{top:c.top+c.height+h+G,left:c.left+c.width/2-d/2};break;case"left":f=C?{top:c.top+c.height/2-e/2,left:c.left-d-G}:{top:c.top+c.height/2-e/2,left:c.left-d-h-G};break;default:f=C?{top:c.top-e-G,left:c.left+c.width/2-d/2}:{top:c.top-e-h-G,left:c.left+c.width/2-d/2}}f.top+="px",f.left+="px",B.css(f),a.tt_isOpen=!0}}function u(){a.tt_isOpen=!1,g.cancel(y),angular.isDefined(a.tt_animation)&&a.tt_animation()?x=g(function(){l(B[0])},500):l(B[0])}function v(){b.removeAttr("title"),w||(H?b.attr("title",a.tooltipAriaLabel):b.attr("title",a.tt_content))}b.attr("tabindex")||b.attr("tabindex","0");var w=!1;b.bind("mouseenter",function(){w=!0,b.removeAttr("title")}),b.bind("mouseleave",function(){w=!1,v()}),a.parentAttrs=c;var x,y,z,A="<div "+q+'-popup title="'+r+"tt_title"+s+'" content="'+r+"tt_content"+s+'" placement="'+r+"tt_placement"+s+'" animation="tt_animation()" is-open="tt_isOpen" stylett="'+r+"tt_style"+s+'" ></div>',B=f(A)(a),C=angular.isDefined(p.appendToBody)?p.appendToBody:!1,D=o(void 0),E=!1,F=angular.isDefined(c[m+"Enable"]),G=0,H=!1;a.tt_isOpen=!1,a.$watch("tt_isOpen",function(a,b){a===b||a||l(B[0])}),c.$observe(e,function(b){b?(a.tt_content=b,v()):a.tt_isOpen&&u()}),c.$observe(m+"Title",function(b){a.tt_title=b}),c.$observe(m+"Placement",function(b){a.tt_placement=angular.isDefined(b)?b:p.placement}),c.$observe(m+"Style",function(b){a.tt_style=angular.isDefined(b)?b:p.stylett}),c.$observe(m+"Animation",function(b){a.tt_animation=angular.isDefined(b)?h(b):function(){return p.animation}}),c.$observe(m+"PopupDelay",function(b){var c=parseInt(b,10);a.tt_popupDelay=isNaN(c)?p.popupDelay:c}),c.$observe(m+"Trigger",function(a){E&&(b.unbind(D.show,k),b.unbind(D.hide,n)),D=o(a),"focus"===D.show?(b.bind("focus",k),b.bind("blur",n),b.bind("click",function(a){a.stopPropagation()})):D.show===D.hide?b.bind(D.show,d):(b.bind(D.show,k),b.bind(D.hide,n)),E=!0}),c.$observe(m+"AppendToBody",function(b){C=angular.isDefined(b)?h(b)(a):C}),c.$observe(m+"Offset",function(a){G=angular.isDefined(a)?parseInt(a,10):0}),c.$observe(m+"AriaLabel",function(b){angular.isDefined(b)?(a.tooltipAriaLabel=b,H=!0):H=!1,v()}),C&&a.$on("$locationChangeSuccess",function(){a.tt_isOpen&&u()}),a.$on("$destroy",function(){a.tt_isOpen?u():B.remove()})}}}}]}]).directive("tooltipPopup",["$document","$documentBind",function(a,b){return{restrict:"EA",replace:!0,transclude:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"=",stylett:"@"},templateUrl:"app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html",link:function(a,c){a.$watch("isOpen",function(){a.isOpen}),c.bind("click",function(a){a.stopPropagation()});var d=function(){a.$apply(function(){a.isOpen=!1})};b.event("click","isOpen",d,a,!0,10)}}}]).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipCondition",["$timeout",function(a){return{restrict:"EA",replace:!0,scope:{tooltipCondition:"@?"},template:'<p><span tooltip="{{tooltipCondition}}" ng-if="showpop">{{tooltipCondition}}</span><span id="innerElement" ng-hide="showpop">{{tooltipCondition}}</span></p>',link:function(b,c,d){b.showpop=!1,"true"===d.height?a(function(){var a=c[0].offsetHeight,d=c.children(0)[0].offsetHeight;d>a&&(b.showpop=!0)}):b.tooltipCondition.length>=25&&(b.showpop=!0)}}}]),angular.module("att.abs.popOvers",["att.abs.tooltip","att.abs.utilities","ngSanitize"]).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]).directive("popoverPopup",["$document","$documentBind","$timeout","events","DOMHelper",function(a,b,c,d,e){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/popOvers/popOvers.html",scope:{content:"@",placement:"@",animation:"&",isOpen:"=",stylett:"@"},link:function(a,f,g,h){a.closeable=!1;try{a.closeable=""===a.$parent.parentAttrs.closeable?!0:!1}catch(i){}var j=void 0,k=void 0,l=function(b){a.$apply(function(){a.isOpen=!1})},m=function(b){(27===b.which||27===b.keyCode)&&(console.log("ESC was pressed!"),a.$apply(function(){a.isOpen=!1}))};c(function(){k=e.firstTabableElement(f)},10,!1),a.$watch("isOpen",function(b){if(a.isOpen){if(j=document.activeElement,angular.isDefined(k))try{k.focus()}catch(c){}}else if(angular.isDefined(j))try{j.focus()}catch(c){}}),a.$watch("stylett",function(b){a.popOverStyle=b}),a.$watch("placement",function(b){a.popOverPlacement=b}),a.closeMe=function(){a.isOpen=!1},f.bind("click",function(a){d.stopPropagation(a)}),b.event("click","isOpen",l,a,!0,10),b.event("keydown","isOpen",m,a,!0,10)}}}]),angular.module("att.abs.profileCard",[]).constant("profileStatus",{status:{ACTIVE:{status:"Active",color:"green"},DEACTIVATED:{status:"Deactivated",color:"red"},LOCKED:{status:"Locked",color:"red"},IDLE:{status:"Idle",color:"yellow"},PENDING:{status:"Pending",color:"blue"}},role:"COMPANY ADMINISTRATOR"}).directive("profileCard",["$http","$q","profileStatus",function(a,b,c){return{restrict:"EA",replace:"true",templateUrl:function(a,b){return b.addUser?"app/scripts/ng_js_att_tpls/profileCard/addUser.html":"app/scripts/ng_js_att_tpls/profileCard/profileCard.html"},scope:{profile:"="},link:function(a,d,e){function f(a){var c=b.defer(),d=new Image;return d.onerror=function(){c.reject(!1)},d.onload=function(){c.resolve(!0)},void 0!==a&&a.length>0?d.src=a:c.reject(!1),c.promise}if(a.image=!0,!e.addUser){a.image=!1,f(a.profile.img).then(function(b){a.image=b});var g=a.profile.name.split(" ");a.initials="";for(var h=0;h<g.length;h++)a.initials+=g[h][0];a.profile.role.toUpperCase()===c.role&&(a.badge=!0);var i=c.status[a.profile.state.toUpperCase()];i&&(a.profile.state=c.status[a.profile.state.toUpperCase()].status,a.colorIcon=c.status[a.profile.state.toUpperCase()].color,(a.profile.state.toUpperCase()===c.status.PENDING.status.toUpperCase()||a.profile.state.toUpperCase()===c.status.LOCKED.status.toUpperCase())&&(a.profile.lastLogin=a.profile.state));var j=(new Date).getTime(),k=new Date(a.profile.lastLogin).getTime(),l=(j-k)/864e5;1>=l?a.profile.lastLogin="Today":2>=l&&(a.profile.lastLogin="Yesterday")}}}}]),angular.module("att.abs.progressBars",[]).directive("attProgressBar",[function(){return{restrict:"A",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/progressBars/progressBars.html"}}]),angular.module("att.abs.radio",[]).constant("attRadioConfig",{activeClass:"att-radio--on",disabledClass:"att-radio--disabled"}).directive("attRadio",["$compile","attRadioConfig",function(a,b){return{scope:{},restrict:"A",require:"ngModel",link:function(c,d,e,f){var g=f;c.radioVal="";var h=angular.element('<div att-accessibility-click="13,32" ng-click="updateModel($event)" class="att-radio"></div>');d.attr("value",e.attRadio),d.removeAttr("att-radio"),d.removeAttr("title"),d.attr("ng-model","radioVal"),h.append(d.prop("outerHTML")),h.append('<div class="att-radio__indicator"></div>'),h.attr("title",e.title);var i=h.prop("outerHTML");i=a(i)(c),d=d.replaceWith(i);var j=i.find("input");j.on("focus",function(){i.css("outline","thin dotted #333"),i.css("outline","-webkit-focus-ring-color auto 5px")}),j.on("blur",function(){i.css("outline","none")}),g.$render=function(){c.radioVal=g.$modelValue;var a=angular.equals(g.$modelValue,e.attRadio);i.toggleClass(b.activeClass,a)},c.updateModel=function(){j[0].focus();var a=i.hasClass(b.activeClass);a||c.disabled||(g.$setViewValue(a?null:e.attRadio),g.$render())},e.$observe("disabled",function(a){c.disabled=a||"disabled"===a||"true"===a,c.disabled&&(i.addClass(b.disabledClass),i.attr("tabindex","-1"))})}}}]),angular.module("att.abs.scrollbar",["att.abs.position"]).constant("attScrollbarConstant",{defaults:{axis:"y",navigation:!1,wheel:!0,wheelSpeed:40,wheelLock:!0,scrollInvert:!1,trackSize:!1,thumbSize:!1,alwaysVisible:!0}}).directive("attScrollbar",["$window","$timeout","$parse","$animate","attScrollbarConstant","$position",function(a,b,c,d,e,f){return{restrict:"A",scope:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html",controller:["$scope","$element","$attrs",function(g,h,i){function j(){w.contentRatio<=1&&w.contentPosition>w.contentSize-w.viewportSize?w.contentPosition=w.contentSize-w.viewportSize:w.contentRatio>1&&w.contentPosition>0&&(w.contentPosition=0),w.contentPosition<=0?g.prevAvailable=!1:g.prevAvailable=!0,w.contentPosition>=w.contentSize-w.viewportSize?g.nextAvailable=!1:g.nextAvailable=!0}function k(){F?(z.on("touchstart",m),C.on("touchstart",m)):(C.on("mousedown",n),B.on("mousedown",r)),angular.element(a).on("resize",l),w.options.wheel&&h.on(G,o)}function l(){w.update()}function m(a){1===a.touches.length&&(a.stopPropagation(),n(a.touches[0]))}function n(a){x.addClass("scroll-no-select"),h.addClass("scroll-no-select"),w.options.alwaysVisible||B.addClass("visible"),D=E?a.clientX:a.clientY,w.thumbPosition=parseInt(C.css(J),10)||0,F?(L=!1,K=!1,z.on("touchmove",p),z.on("touchend",s),C.on("touchmove",q),C.on("touchend",s)):(y.on("mousemove",r),y.on("mouseup",s),C.on("mouseup",s))}function o(c){if(!(w.contentRatio>=1)){w.options.alwaysVisible||(v&&b.cancel(v),B.addClass("visible"),v=b(function(){B.removeClass("visible")},100));var d=c&&c.originalEvent||c||a.event,e=w.options.axis.toUpperCase(),f={X:d.deltaX||0,Y:d.deltaY||0},i=0===d.deltaMode?w.options.wheelSpeed:1;w.options.scrollInvert&&(i*=-1),"mousewheel"===G&&(f.Y=-1*d.wheelDelta/40,d.wheelDeltaX&&(f.X=-1*d.wheelDeltaX/40)),f.X*=-1/i,f.Y*=-1/i;var k=f[e];w.contentPosition-=k*w.options.wheelSpeed,w.contentPosition=Math.min(w.contentSize-w.viewportSize,Math.max(0,w.contentPosition)),fireEvent(h[0],"move"),j(),C.css(J,w.contentPosition/w.trackRatio+"px"),A.css(J,-w.contentPosition+"px"),(w.options.wheelLock||w.contentPosition!==w.contentSize-w.viewportSize&&0!==w.contentPosition)&&d.preventDefault(),g.$apply()}}function p(a){a.preventDefault(),L=!0,r(a.touches[0])}function q(a){a.preventDefault(),K=!0,r(a.touches[0])}function r(a){if(!(w.contentRatio>=1)){var b=E?a.clientX:a.clientY,c=b-D;(w.options.scrollInvert&&!F||F&&!w.options.scrollInvert)&&(c=D-b),L&&F&&(c=D-b),K&&F&&(c=b-D);var d=Math.min(w.trackSize-w.thumbSize,Math.max(0,w.thumbPosition+c));w.contentPosition=d*w.trackRatio,fireEvent(h[0],"move"),j(),C.css(J,d+"px"),A.css(J,-w.contentPosition+"px"),g.$apply()}}function s(){x.removeClass("scroll-no-select"),h.removeClass("scroll-no-select"),w.options.alwaysVisible||B.removeClass("visible"),y.off("mousemove",r),y.off("mouseup",s),C.off("mouseup",s),y.off("touchmove",p),y.off("ontouchend",s),C.off("touchmove",q),C.off("touchend",s)}var t={axis:i.attScrollbar||e.defaults.axis,navigation:i.navigation||e.defaults.navigation,wheel:e.defaults.wheel,wheelSpeed:e.defaults.wheelSpeed,wheelLock:e.defaults.wheelLock,scrollInvert:e.defaults.scrollInvert,trackSize:e.defaults.trackSize,thumbSize:e.defaults.thumbSize,alwaysVisible:e.defaults.alwaysVisible},u=i.scrollbar;u=u?c(u)(g):{},this.options=angular.extend({},t,u),this._defaults=t;var v,w=this,x=angular.element(document.querySelectorAll("body")[0]),y=angular.element(document),z=angular.element(h[0].querySelectorAll(".scroll-viewport")[0]),A=angular.element(h[0].querySelectorAll(".scroll-overview")[0]),B=angular.element(h[0].querySelectorAll(".scroll-bar")[0]),C=angular.element(h[0].querySelectorAll(".scroll-thumb")[0]),D=0,E="x"===this.options.axis,F=!1,G="onwheel"in document?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll",H=E?"width":"height",I=H.charAt(0).toUpperCase()+H.slice(1).toLowerCase(),J=E?"left":"top",K=!1,L=!1;("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)&&(F=!0),this.contentPosition=0,this.viewportSize=0,this.contentSize=0,this.contentRatio=0,this.trackSize=0,this.trackRatio=0,this.thumbSize=0,this.thumbPosition=0,this.initialize=function(){return this.options.alwaysVisible||B.css("opacity",0),w.update(),k(),w},this.setSizeData=function(){this.viewportSize=z.prop("offset"+I)||1,this.contentSize=A.prop("scroll"+I)||1,this.contentRatio=this.viewportSize/this.contentSize,this.trackSize=this.options.trackSize||this.viewportSize,this.thumbSize=Math.min(this.trackSize,Math.max(0,this.options.thumbSize||this.trackSize*this.contentRatio)),this.trackRatio=this.options.thumbSize?(this.contentSize-this.viewportSize)/(this.trackSize-this.thumbSize):this.contentSize/this.trackSize},this.update=function(a){return w.setSizeData(),D=B.prop("offsetTop"),B.toggleClass("disable",this.contentRatio>=1||isNaN(this.contentRatio)),!this.options.alwaysVisible&&this.contentRatio<1&&this.viewportSize>0&&d.addClass(B,"visible").then(function(){d.removeClass(B,"visible"),g.$digest()}),null!==a&&("bottom"===a?this.contentPosition=this.contentSize-this.viewportSize:this.contentPosition=parseInt(a,10)||0),j(),C.css(J,w.contentPosition/w.trackRatio+"px"),B.css(H,w.trackSize+"px"),C.css(H,w.thumbSize+"px"),A.css(J,-w.contentPosition+"px"),this},fireEvent=function(a,b){var c,d=a;document.createEvent?(c=document.createEvent("HTMLEvents"),c.initEvent(b,!0,!1),d.dispatchEvent(c)):document.createEventObject&&(c=document.createEventObject(),d.fireEvent("on"+b,c))},g.customScroll=function(a){if(!(w.contentRatio>=1)){var b,c=f.position(z);b=E?c.width:c.height,a?w.contentPosition+=b:w.contentPosition-=b,w.contentPosition=Math.min(w.contentSize-w.viewportSize,Math.max(0,w.contentPosition)),fireEvent(h[0],"move"),j(),C.css(J,w.contentPosition/w.trackRatio+"px"),A.css(J,-w.contentPosition+"px")}},this.cleanup=function(){z.off("touchstart",m),C.off("mousedown",n),B.off("mousedown",r),C.off("touchmove",q),C.off("touchend",s),angular.element(a).off("resize",l),h.off(G,o),w.options.alwaysVisible=!0,s()}}],link:function(a,c,d,e){a.navigation=e.options.navigation,a.viewportHeight=d.viewportHeight,a.viewportWidth=d.viewportWidth,a.scrollbarAxis=e.options.axis,"x"===a.scrollbarAxis?c.addClass("horizontal"):"y"===a.scrollbarAxis&&c.addClass("vertical");var f=c.css("position");"relative"!==f&&"absolute"!==f&&c.css("position","relative"),a.$watch(function(){b(g,100,!1)});var g=function(){var b=angular.element(c[0].querySelectorAll(".scroll-overview")[0]),d=b.prop("scrollHeight"),f=a.oldValue;d!==f&&(a.oldValue=d,e.update())};e.initialize(),c.on("$destroy",function(){e.cleanup()})}}}]),angular.module("att.abs.search",["att.abs.utilities","att.abs.position","att.abs.utilities"]).directive("attSearch",["$document","$filter","$isElement","$documentBind","$timeout","$log","keymap",function(a,b,c,d,e,f,g){return{restrict:"A",scope:{cName:"=attSearch"},transclude:!1,replace:!1,require:"ngModel",templateUrl:"app/scripts/ng_js_att_tpls/search/search.html",link:function(b,h,i,j){b.selectedIndex=-1,b.selectedOption=i.placeholder,b.isDisabled=!1,b.className="select2-match",b.showSearch=!1,b.showlist=!1;var k="",l=new Date,m=void 0,n=[];e(function(){n=h.find("li")},10),f.warn("attSearch is deprecated, please use attSelect instead. This component will be removed by version 2.7."),i.noFilter||"true"===i.noFilter?b.noFilter=!0:b.noFilter=!1,"false"===i.placeholderAsOption?b.selectedOption=i.placeholder:b.selectMsg=i.placeholder,(i.startsWithFilter||"true"===i.startsWithFilter)&&(b.startsWithFilter=!0),"true"===i.showInputFilter&&(b.showSearch=!1,f.warn("showInputFilter functionality has been removed from the library.")),i.disabled&&(b.isDisabled=!0),m=angular.element(h).children().eq(0).find("a")[0];var o=0,p=function(){if(b.noFilter){var a=k,c=0;for(c=o;c<b.cName.length;c++)if(b.cName[c].title.startsWith(a)&&c!==b.selectedIndex){b.selectOption(b.cName[c],c,b.showlist),o=c,k="";break}(c>=b.cName.length||!b.cName[c+1].title.startsWith(a))&&o>0&&(o=0)}};b.showDropdown=function(){i.disabled||(b.showlist=!b.showlist,b.setSelectTop())},h.bind("keydown",function(a){if(g.isAllowedKey(a.keyCode)||g.isControl(a)||g.isFunctionKey(a))switch(a.preventDefault(),a.stopPropagation(),a.keyCode){case g.KEY.DOWN:b.selectNext();break;case g.KEY.UP:b.selectPrev(),k="";break;case g.KEY.ENTER:b.selectCurrent(),k="";break;case g.KEY.BACKSPACE:b.title="",k="",b.$apply();break;case g.KEY.SPACE:b.noFilter||(b.title+=" "),b.$apply();break;case g.KEY.ESC:""===b.title||void 0===b.title?(b.showlist=!1,m.focus(),b.$apply()):(b.title="",b.$apply()),b.noFilter&&(k="",m.focus(),b.showlist=!1)}else if(9!==a.keyCode){if(b.noFilter){var c=new Date,d=Math.abs(l.getMilliseconds()-c.getMilliseconds());l=c,d>100&&(k=""),k=k?k+String.fromCharCode(a.keyCode):String.fromCharCode(a.keyCode),k.length>2&&(k=k.substring(0,2)),p()}else b.showlist=!0,b.title=b.title?b.title+String.fromCharCode(a.keyCode):String.fromCharCode(a.keyCode);b.$apply()}else 9===a.keyCode&&(b.showlist=!1,b.title="",b.$apply())}),b.selectOption=function(a,c,d){-1===c||"-1"===c?(b.selCategory="",b.selectedIndex=-1,j.$setViewValue(""),"false"!==i.placeholderAsOption&&(b.selectedOption=b.selectMsg)):(b.selCategory=b.cName[c],b.selectedIndex=c,j.$setViewValue(b.selCategory),b.selectedOption=b.selCategory.title,angular.isDefined(n[c])&&n[c].focus()),b.title="",d||(b.showlist=!1,m.focus()),b.$apply()},b.selectCurrent=function(){b.showlist?(b.selectOption(b.selectMsg,b.selectedIndex,!1),b.$apply()):(b.showlist=!0,b.setSelectTop(),b.$apply())},b.hoverIn=function(a){b.selectedIndex=a,b.focusme()},b.setSelectTop=function(){e(function(){if(b.showlist&&!b.noFilter){var a=angular.element(h)[0].querySelector(".select2-results");if(angular.element(a.querySelector(".select2-result-current"))[0])var c=angular.element(a.querySelector(".select2-result-current"))[0].offsetTop;angular.element(a)[0].scrollTop=c}})},b.setCurrentTop=function(){e(function(){if(b.showlist){var a=angular.element(h)[0].querySelector(".select2-results");if(angular.element(a.querySelector(".hovstyle"))[0])var c=angular.element(a.querySelector(".hovstyle"))[0].offsetTop;c<angular.element(a)[0].scrollTop?angular.element(a)[0].scrollTop-=30:c+30>angular.element(a)[0].clientHeight&&(angular.element(a)[0].scrollTop+=30)}})},b.selectNext=function(){b.selectedIndex+1<=b.cName.length-1&&(b.selectedIndex+=1,b.showlist||b.selectOption(b.selectMsg,b.selectedIndex,!1),b.focusme(),b.$apply()),b.setCurrentTop()},b.selectPrev=function(){b.selectedIndex-1>=0?(b.selectedIndex-=1,b.showlist||b.selectOption(b.selectMsg,b.selectedIndex,!1),b.focusme(),b.$apply()):b.selectedIndex-1<0&&(void 0===i.placeholderAsOption||"true"===i.placeholderAsOption?b.selectedIndex=-1:b.selectedIndex=0,b.showlist||b.selectOption(b.selectMsg,b.selectedIndex,!1),b.focusme(),b.$apply()),b.setCurrentTop()},b.updateSelection=function(a){b.selectedOption=a.title,b.title=""},b.focusme=function(){e(function(){var a=angular.element(h).find("ul").find("li"),c=b.selectedIndex+2;b.noFilter&&(c=b.selectedIndex),angular.isDefined(a[c])&&a[c].focus()})},b.$watch("selCategory",function(a){a&&b.updateSelection(a)}),j.$viewChangeListeners.push(function(){b.$eval(i.ngChange)}),j.$render=function(){b.selCategory=j.$viewValue};var q=function(d){var e=c(angular.element(d.target),h,a);e||(b.showlist=!1,m.focus(),b.$apply())};d.click("showlist",q,b)}}}]),angular.module("att.abs.select",["att.abs.utilities","att.abs.position","att.abs.utilities"]).directive("attSelect",["$document","$filter","$isElement","$documentBind","$timeout","keymap","$log",function(a,b,c,d,e,f,g){return{restrict:"A",scope:{cName:"=attSelect"},transclude:!1,replace:!1,require:"ngModel",templateUrl:"app/scripts/ng_js_att_tpls/select/select.html",link:function(h,i,j,k){h.selectedIndex=-1,h.selectedOption=j.placeholder,h.isDisabled=!1,h.className="select2-match",h.showSearch=!1,h.showlist=!1;var l="",m=new Date,n=void 0,o=[];e(function(){o=i.find("li")},10),j.noFilter||"true"===j.noFilter?h.noFilter=!0:h.noFilter=!1,"false"===j.placeholderAsOption?h.selectedOption=j.placeholder:h.selectMsg=j.placeholder,(j.startsWithFilter||"true"===j.startsWithFilter)&&(h.startsWithFilter=!0),"true"===j.showInputFilter&&(h.showSearch=!1,g.warn("showInputFilter functionality has been removed from the library.")),j.disabled&&(h.isDisabled=!0);var p=function(){return h.startsWithFilter?"startsWith":"filter"};n=angular.element(i).children().eq(0).find("span")[0];var q=0,r=function(){if(h.noFilter){var a=l,b=0;for(b=q;b<h.cName.length;b++)if(h.cName[b].title.startsWith(a)&&b!==h.selectedIndex){
-h.selectOption(h.cName[b],b,h.showlist),q=b,l="";break}(b>=h.cName.length||!h.cName[b+1].title.startsWith(a))&&q>0&&(q=0)}};h.showDropdown=function(){j.disabled||(h.showlist=!h.showlist,h.setSelectTop(),h.focusme())},i.bind("keydown",function(a){if(f.isAllowedKey(a.keyCode)||f.isControl(a)||f.isFunctionKey(a))switch(a.preventDefault(),a.stopPropagation(),a.keyCode){case f.KEY.DOWN:h.selectNext();break;case f.KEY.UP:h.selectPrev(),l="";break;case f.KEY.ENTER:h.selectCurrent(),l="";break;case f.KEY.BACKSPACE:h.title="",l="",h.$apply();break;case f.KEY.SPACE:h.noFilter||(h.title+=" "),h.$apply();break;case f.KEY.ESC:""===h.title||void 0===h.title?(h.showlist=!1,n.focus(),h.$apply()):(h.title="",h.$apply()),h.noFilter&&(l="",n.focus(),h.showlist=!1)}else if(a.keyCode!==f.KEY.TAB){if(h.noFilter){var c=new Date,d=Math.abs(m.getMilliseconds()-c.getMilliseconds());m=c,d>100&&(l=""),l=l?l+String.fromCharCode(a.keyCode):String.fromCharCode(a.keyCode),l.length>2&&(l=l.substring(0,2)),r()}else if(h.showlist=!0,h.title=h.title?h.title+String.fromCharCode(a.keyCode):String.fromCharCode(a.keyCode),""!=h.title)for(var e=b(p())(h.cName,h.title),g=0;g<e.length;g++)for(var i=0;i<h.cName.length&&angular.isDefined(h.cName[h.selectedIndex]);i++)if(e[g].title===h.cName[h.selectedIndex].title){h.selectedIndex=g,h.focusme();break}h.$apply()}else a.keyCode===f.KEY.TAB&&(h.showlist=!1,h.title="",h.$apply())}),h.selectOption=function(a,c,d){if(-1===c||"-1"===c)h.selCategory="",h.selectedIndex=-1,k.$setViewValue(""),"false"!==j.placeholderAsOption&&(h.selectedOption=h.selectMsg);else{if(""!=h.title){var f=b(p())(h.cName,h.title);if(angular.isDefined(f)&&angular.isDefined(f[c]))for(var g=0;g<h.cName.length;g++)if(f[c].title===h.cName[g].title){c=g;break}}h.selCategory=h.cName[c],h.selectedIndex=c,k.$setViewValue(h.selCategory),h.selectedOption=h.selCategory.title,e(function(){if(angular.isDefined(o[c]))try{o[index].focus()}catch(a){}})}h.title="",d||(h.showlist=!1,n.focus())},h.selectCurrent=function(){h.showlist?h.selectOption(h.selectMsg,h.selectedIndex,!1):(h.showlist=!0,h.setSelectTop()),h.$apply()},h.hoverIn=function(a){h.selectedIndex=a,h.focusme()},h.setSelectTop=function(){e(function(){if(h.showlist&&!h.noFilter){var a=angular.element(i)[0].querySelector(".select2-results");if(angular.element(a.querySelector(".select2-result-current"))[0])var b=angular.element(a.querySelector(".select2-result-current"))[0].offsetTop;angular.element(a)[0].scrollTop=b}})},h.setCurrentTop=function(){e(function(){if(h.showlist){var a=angular.element(i)[0].querySelector(".select2-results");if(angular.element(a.querySelector(".hovstyle"))[0])var b=angular.element(a.querySelector(".hovstyle"))[0].offsetTop;b<angular.element(a)[0].scrollTop?angular.element(a)[0].scrollTop-=30:b+30>angular.element(a)[0].clientHeight&&(angular.element(a)[0].scrollTop+=30)}})},h.selectNext=function(){h.cName.length;if(h.selectedIndex+1<=h.cName.length-1){h.selectedIndex+=1;var a=h.cName[h.selectedIndex].disabled;a&&(h.selectedIndex+=1),h.showlist||h.selectOption(h.selectMsg,h.selectedIndex,!1),h.focusme(),h.$apply()}h.setCurrentTop()},h.selectPrev=function(){if(h.selectedIndex-1>=0){h.selectedIndex-=1;var a=h.cName[h.selectedIndex].disabled;a&&(h.selectedIndex-=1),h.showlist||h.selectOption(h.selectMsg,h.selectedIndex,!1),h.focusme(),h.$apply()}else h.selectedIndex-1<0&&(void 0===j.placeholderAsOption||"true"===j.placeholderAsOption?void 0===j.placeholder?h.selectedIndex=0:h.selectedIndex=-1:h.selectedIndex=0,h.showlist||h.selectOption(h.selectMsg,h.selectedIndex,!1),h.focusme(),h.$apply());h.setCurrentTop()},h.updateSelection=function(a){h.selectedOption=a.title,h.title="",a.index<0&&h.selectOption(h.selectMsg,a.index,h.showlist)},h.focusme=function(){e(function(){var a=angular.element(i).find("ul").find("li"),b=h.selectedIndex+2;if(h.noFilter&&(b=h.selectedIndex),angular.isDefined(a[b]))try{a[b].focus()}catch(c){}})},h.$watch("selCategory",function(a){a&&h.updateSelection(a)}),k.$viewChangeListeners.push(function(){h.$eval(j.ngChange)}),k.$render=function(){h.selCategory=k.$viewValue};var s=function(b){var d=c(angular.element(b.target),i,a);d||(h.showlist=!1,n.focus(),h.$apply())};d.click("showlist",s,h)}}}]).directive("textDropdown",["$document","$isElement","$documentBind","keymap",function(a,b,c,d){return{restrict:"EA",replace:!0,scope:{actions:"=actions",defaultAction:"=defaultAction",onActionClicked:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/select/textDropdown.html",link:function(e,f,g){e.selectedIndex=0,e.selectedOption=g.placeholder,e.isDisabled=!1,e.isActionsShown=!1;var h=void 0;if(g.disabled&&(e.isDisabled=!0),h=f.find("div")[0],angular.isDefined(e.defaultAction))if(angular.isDefined(e.defaultAction)||""!==e.defaultAction){for(var i in e.actions)if(e.actions[i]===e.defaultAction){e.currentAction=e.actions[i],e.selectedIndex=e.actions.indexOf(i),e.isActionsShown=!1;break}}else e.currentAction=e.actions[0];else e.currentAction=e.actions[0],e.selectedIndex=0;e.toggle=function(){e.isActionsShown=!e.isActionsShown},e.chooseAction=function(a,b,c){null!=a?(e.currentAction=b,e.selectedIndex=c):e.currentAction=e.actions[e.selectedIndex],angular.isFunction(e.onActionClicked)&&e.onActionClicked(e.currentAction),e.toggle()},e.isCurrentAction=function(a){return a===e.currentAction},f.bind("keydown",function(a){if(d.isAllowedKey(a.keyCode)||d.isControl(a)||d.isFunctionKey(a)){switch(a.preventDefault(),a.stopPropagation(),a.keyCode){case d.KEY.DOWN:e.selectNext();break;case d.KEY.UP:e.selectPrev();break;case d.KEY.ENTER:e.selectCurrent();break;case d.KEY.ESC:e.isActionsShown=!1,h.focus(),e.$apply()}return void e.$apply()}a.keyCode===d.KEY.TAB&&(e.isActionsShown=!1,e.$apply())}),e.selectCurrent=function(){e.selectedIndex<0&&(e.selectedIndex=0),e.isActionsShown?e.chooseAction(null,e.currentAction):e.toggle()},e.selectNext=function(){e.isActionsShown&&(e.selectedIndex+1<e.actions.length?e.selectedIndex+=1:e.selectedIndex=e.actions.length-1,e.$apply())},e.selectPrev=function(){e.isActionsShown&&(e.selectedIndex-1>=0?e.selectedIndex-=1:e.selectedIndex-1<0&&(e.selectedIndex=0),e.$apply())},e.hoverIn=function(a){e.selectedIndex=a};var j=function(c){var d=b(angular.element(c.target),f,a);d||(e.toggle(),e.$apply())};c.click("isActionsShown",j,e)}}}]),angular.module("att.abs.slider",["att.abs.position"]).constant("sliderDefaultOptions",{width:300,step:1,precision:0,disabledWidth:116}).directive("attSlider",["sliderDefaultOptions","$position","$document",function(a,b,c){return{restrict:"EA",replace:!0,transclude:!0,scope:{floor:"=",ceiling:"=",step:"@",precision:"@",width:"@",textDisplay:"=",value:"=",ngModelSingle:"=?",ngModelLow:"=?",ngModelHigh:"=?",ngModelDisabled:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/slider/slider.html",link:function(d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y=0,z=!1;d.minPtrOffset=0,d.maxPtrOffset=0;var A=a.disabledWidth,B=e.children();n=B[0].children,n=angular.element(n[0]),x=B[1].children,w=angular.element(x[0]),v=angular.element(x[1]),u=angular.element(x[2]),o=null==f.ngModelSingle&&null==f.ngModelLow&&null==f.ngModelHigh&&null!=f.ngModelDisabled,r=null==f.ngModelSingle&&null!=f.ngModelLow&&null!=f.ngModelHigh,s="ngModelLow",t="ngModelHigh",r?w.remove():(v.remove(),u.remove()),o?(d.disabledStyle={width:A+"px",zIndex:1},d.handleStyle={left:A+"px"}):n.remove(),p=parseFloat(d.floor),q=parseFloat(d.ceiling),m=q-p,g=0,h=void 0!==f.width?f.width:0!==e[0].clientWidth?e[0].clientWidth:a.width,l=h-g,d.keyDown=function(c){if(39===c.keyCode){var f=b.position(e).left;if(i)"ngModelLow"===d.ref?(j=a.step+j,i=j):"ngModelHigh"===d.ref?(k=a.step+k,i=k):i=a.step+i;else{if(r&&"ngModelLow"===d.ref)return;i=a.step+f,j=k=i}}else if(37===c.keyCode){var g=b.position(w).left;i?0>=i||("ngModelLow"===d.ref?(j-=a.step,i=j):"ngModelHigh"===d.ref?(k-=a.step,i=k):(i-=a.step,j=k=i)):i=g-a.step}i>=0&&d.ptrOffset(i)},d.mouseDown=function(a,b){d.ref=b,z=!0,y=r?d.ref===s?a.clientX-d.minPtrOffset:a.clientX-d.maxPtrOffset:i?a.clientX-i:a.clientX,o&&(d.ref="ngModelDisabled",d.disabledStyle={width:A+"px",zIndex:1})},d.moveElem=function(a){if(z){var b;b=a.clientX,i=b-y,d.ptrOffset(i)}},d.focus=function(a,b){console.log(b),d.ref=b},d.mouseUp=function(a){z=!1,v.removeClass("dragging"),u.removeClass("dragging"),w.removeClass("dragging"),c.off("mousemove")},d.keyUp=function(a){z=!1,v.removeClass("dragging"),u.removeClass("dragging"),w.removeClass("dragging"),c.off("mousemove")},d.calStep=function(a,b,c,d){var e,f,g,h;return null===d&&(d=0),null===c&&(c=1/Math.pow(10,b)),f=(a-d)%c,h=f>c/2?a+c-f:a-f,e=Math.pow(10,b),g=h*e/e,g.toFixed(b)},d.percentOffset=function(a){return(a-g)/l*100},d.ptrOffset=function(b){var c,e;if(b=Math.max(Math.min(b,h),g),c=d.percentOffset(b),e=p+m*c/100,r){var f;d.ref===s?(d.minHandleStyle={left:b+"px"},d.minNewVal=e,d.minPtrOffset=b,v.addClass("dragging"),e>d.maxNewVal&&(d.ref=t,u[0].focus(),d.maxNewVal=e,d.maxPtrOffset=b,u.addClass("dragging"),v.removeClass("dragging"),d.maxHandleStyle={left:b+"px"})):(d.maxHandleStyle={left:b+"px"},d.maxNewVal=e,d.maxPtrOffset=b,u.addClass("dragging"),e<d.minNewVal&&(d.ref=s,v[0].focus(),d.minVal=e,d.minPtrOffset=b,v.addClass("dragging"),u.removeClass("dragging"),d.minHandleStyle={left:b+"px"})),f=parseInt(d.maxPtrOffset)-parseInt(d.minPtrOffset),d.rangeStyle={width:f+"px",left:d.minPtrOffset+"px"}}else o&&b>A?d.rangeStyle={width:b+"px",zIndex:0}:(w.addClass("dragging"),d.rangeStyle={width:b+"px"}),d.handleStyle={left:b+"px"};(void 0===d.precision||void 0===d.step)&&(d.precision=a.precision,d.step=a.step),e=d.calStep(e,parseInt(d.precision),parseFloat(d.step),parseFloat(d.floor)),d[d.ref]=e}}}}]).directive("attSliderMin",[function(){return{require:"^attSlider",restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/slider/minContent.html"}}]).directive("attSliderMax",[function(){return{require:"^attSlider",restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/slider/maxContent.html"}}]),angular.module("att.abs.splitButtonDropdown",["att.abs.utilities","att.abs.position"]).directive("attButtonDropdown",["$document","$parse","$documentBind","$timeout","$isElement",function(a,b,c,d,e){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html",scope:{btnText:"@",btnType:"@",btnLink:"@",btnClick:"&",toggleTitle:"@"},controller:["$scope","$element",function(a,b){this.cSelected=0,this.closeAndFocusDropdown=function(){a.isDropDownOpen&&a.$apply(function(){a.isDropDownOpen=!1,angular.element(b[0].querySelector("a.dropdown-toggle"))[0].focus()})},this.focusNext=function(){this.cSelected=this.cSelected+1>=this.childScopes.length?a.cycleSelection===!0?0:this.childScopes.length-1:this.cSelected+1,this.childScopes[this.cSelected].sFlag=!0,this.resetFlag(this.cSelected)},this.focusPrev=function(){this.cSelected=this.cSelected-1<0?a.cycleSelection===!0?this.childScopes.length-1:0:this.cSelected-1,this.childScopes[this.cSelected].sFlag=!0,this.resetFlag(this.cSelected)},this.childScopes=[],this.registerScope=function(a){this.childScopes.push(a)},this.resetFlag=function(a){for(var b=0;b<this.childScopes.length;b++)b!==a&&(this.childScopes[b].sFlag=!1)}}],link:function(f,g,h){f.isSmall=""===h.small?!0:!1,f.multiselect=""===h.multiselect?!0:!1,f.cycleSelection=""===h.cycleSelection?!0:!1,f.isDropDownOpen=!1,f.isActionDropdown=!1,f.btnText||(f.isActionDropdown=!0),f.clickFxn=function(){"function"!=typeof f.btnClick||f.btnLink||(f.btnClick=b(f.btnClick),f.btnClick()),f.multiselect===!0&&(f.isDropDownOpen=!1)},f.toggleDropdown=function(){"disabled"!==f.btnType&&(f.isDropDownOpen=!f.isDropDownOpen,f.isDropDownOpen&&d(function(){angular.element(g[0].querySelector("li"))[0].focus()}))},f.btnTypeSelector=function(a,b){""!==a?f.btnTypeFinal=a:f.btnTypeFinal=b};var i=function(b){var c=e(angular.element(b.target),g.find("ul").eq(0),a);c||(f.isDropDownOpen=!1,f.$apply())};c.click("isDropDownOpen",i,f),h.$observe("btnType",function(a){f.btnType=a}),h.$observe("attButtonDropdown",function(a){h.attButtonDropdown=a,f.btnTypeSelector(h.attButtonDropdown,f.btnType)})}}}]).directive("attButtonDropdownItem",["$location","keymap",function(a,b){return{restrict:"EA",require:["^attButtonDropdown","?ngModel"],replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html",scope:{itemLink:"@"},link:function(a,c,d,e){angular.element(c[0].querySelector("a"));a.sFlag=!1,e[0].registerScope(a);e[1]?a.isSelected=e[1].$viewValue:a.isSelected=!1,c.bind("keydown",function(c){if(b.isAllowedKey(c.keyCode)||b.isControl(c)||b.isFunctionKey(c))switch(c.preventDefault(),c.stopPropagation(),c.keyCode){case b.KEY.DOWN:e[0].focusNext();break;case b.KEY.UP:e[0].focusPrev();break;case b.KEY.ENTER:a.selectItem();break;case b.KEY.ESC:e[0].closeAndFocusDropdown()}a.$apply()}),a.selectItem=function(){e[1]&&a.$evalAsync(function(){e[1].$setViewValue(!e[1].$viewValue)})}}}}]),angular.module("att.abs.splitIconButton",["att.abs.utilities"]).constant("iconStateConstants",{MIDDLE:"middle",LEFT:"left",RIGHT:"right",NEXT_TO_DROPDOWN:"next-to-dropdown",LEFT_NEXT_TO_DROPDOWN:"left-next-to-dropdown",DIR_TYPE:{LEFT:"left",RIGHT:"right",BUTTON:"button"},SPLIT_ICON_BTN_EVENT_EMITTER_KEY:"splitIconButtonTap"}).directive("expandableLine",[function(){return{restrict:"EA",replace:!0,priority:300,require:["^attSplitIconButton","expandableLine"],controller:["$scope",function(a){a.isActive=!1,this.setActiveState=function(b){a.isActive=b},this.isActive=a.isActive,this.dirType=a.dirType}],template:"<div ng-class=\"{'expand-line-container': !isActive, 'expand-line-container-active': isActive}\"> <div ng-class=\"{'hovered-line':isActive, 'vertical-line':!isActive}\"> </div></div>",scope:{dirType:"@"},link:function(a,b,c,d){var e=d[0],f=d[1];e.addSubCtrl(f)}}}]).controller("AttSplitIconCtrl",["$scope",function(a){this.setType=function(b){a.type=b},this.isDropdown=function(b){a.isDropdown=b},this.dropDownClicked=function(){a.dropDownClicked&&a.dropDownClicked()},this.dirType=a.dirType}]).directive("attSplitIcon",["$document","$timeout","iconStateConstants","$documentBind","events","keymap",function(a,b,c,d,e,f){return{restrict:"EA",replace:!0,priority:200,transclude:!0,require:["^attSplitIconButton","attSplitIcon"],templateUrl:"app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html",scope:{icon:"@",iconTitle:"@title",hoverWatch:"=",dropDownWatch:"=",dirType:"@"},controller:"AttSplitIconCtrl",link:function(a,b,g,h){var i=h[0],j=h[1];i.addSubCtrl(j),a.iconStateConstants=c;var k,l=0,m=!1;a.isDropdown=!1,a.isDropdownOpen=!1;var n=function(b){a.isDropdown&&(m?(m=!1,a.toggleDropdown()):a.toggleDropdown(!1),a.$apply())};g.dropDownId&&""!==g.dropDownId&&(a.dropDownId=g.dropDownId,a.isDropdown=!0),a.$on(c.SPLIT_ICON_BTN_EVENT_EMITTER_KEY,function(c,d){function g(b){switch(b.which){case f.KEY.TAB:a.toggleDropdown(!1),a.$digest();break;case f.KEY.ESC:n();break;case f.KEY.ENTER:a.isDropDownOpen&&h();break;case f.KEY.UP:b.preventDefault(),e.stopPropagation(b),a.isDropDownOpen&&a.previousItemInDropdown();break;case f.KEY.DOWN:b.preventDefault(),e.stopPropagation(b),a.isDropDownOpen?a.nextItemInDropdown():(m=!0,n(),h())}}function h(){if(void 0===k){k=[];for(var a=b.find("li"),c=0;c<a.length;c++)k.push(a.eq(c));k[l].children().eq(0).addClass("selected-item")}}if("boolean"==typeof d&&d)a.dropDownClicked(),a.isDropDownOpen&&k[l].eq(0).find("a")[0].click();else{var i=d;a.isDropdown&&g(i)}}),a.nextItemInDropdown=function(){k&&l<k.length-1&&(l++,k[l-1].children().eq(0).removeClass("selected-item"),k[l].children().eq(0).addClass("selected-item"))},a.previousItemInDropdown=function(){l>0&&(l--,k[l].children().eq(0).addClass("selected-item"),l+1<k.length&&k[l+1].children().eq(0).removeClass("selected-item"))},a.$watch("isIconHovered",function(b){a.hoverWatch=b}),a.$watch("type",function(b){function c(b,c,d,e,f){a.isMiddle=b,a.isNextToDropDown=c,a.isRight=d,a.isLeft=e,a.isLeftNextDropdown=f}switch(b){case a.iconStateConstants.MIDDLE:c(!0,!1,!1,!0,!1);break;case a.iconStateConstants.LEFT:c(!1,!1,!1,!0,!1);break;case a.iconStateConstants.RIGHT:c(!1,!1,!0,!1,!1);break;case a.iconStateConstants.NEXT_TO_DROPDOWN:c(!1,!0,!0,!0,!1);break;case a.iconStateConstants.LEFT_NEXT_TO_DROPDOWN:c(!1,!1,!1,!0,!0)}}),a.dropDownClicked=function(){m=!0},a.toggleDropdown=function(b){void 0!==b?a.isDropDownOpen=b:a.isDropDownOpen=!a.isDropDownOpen,a.dropDownWatch=a.isDropDownOpen},d.click("isDropdown",n,a)}}}]).controller("AttSplitIconButtonCtrl",["$scope","iconStateConstants",function(a,b){function c(a){var b=-1;for(var c in d.subCtrls){var e=d.subCtrls[c];if(e.dirType===a){b=c;break}}return b}this.subCtrls=[],a.isLeftLineShown=!0,a.isRightLineShown=!0,a.childrenScopes=[];var d=this;this.addSubCtrl=function(a){this.subCtrls.push(a)},this.isLeftLineShown=function(b){return void 0===b?a.isLeftLineShown:void(a.isLeftLineShown=b)},this.isRightLineShown=function(b){return void 0===b?a.isRightLineShown:void(a.isRightLineShown=b)},this.setLeftLineHover=function(d){var e=c(b.DIR_TYPE.LEFT);a.isLeftLineShown&&this.subCtrls[e]&&this.subCtrls[e].setActiveState&&this.subCtrls[e].setActiveState(d)},this.setRightLineHover=function(d){var e=c(b.DIR_TYPE.RIGHT);a.isRightLineShown&&this.subCtrls[e]&&this.subCtrls[e].setActiveState&&this.subCtrls[e].setActiveState(d)},this.toggleLines=function(d,e,f,g){function h(){for(var a=0;j>a;a++)if(i[a]===f){j-1>=a+1&&i[a+1].isLeftLineShown()&&i[a+1].subCtrls[k]&&i[a+1].subCtrls[k].setActiveState&&i[a+1].subCtrls[k].setActiveState(d),a-1>=0&&i[a-1].isRightLineShown()&&i[a-1].subCtrls[l]&&i[a-1].subCtrls[l].setActiveState&&i[a-1].subCtrls[l].setActiveState(d);break}}var i=e.subIconButtons,j=i.length,k=c(b.DIR_TYPE.LEFT),l=c(b.DIR_TYPE.RIGHT);g?i[j-2]==f?i[j-2].isLeftLineShown()?i[j-2].subCtrls[k].setActiveState(d):j-3>=0&&i[j-3].isRightLineShown()&&i[j-3].subCtrls[l].setActiveState(d):(h(),a.isLeftLineShown&&this.subCtrls[k].setActiveState(d),a.isRightLineShown&&this.subCtrls[l].setActiveState(d)):(a.isLeftLineShown||a.isRightLineShown||h(),a.isLeftLineShown&&this.subCtrls[k].setActiveState&&this.subCtrls[k].setActiveState(d),a.isRightLineShown&&this.subCtrls[l].setActiveState&&this.subCtrls[l].setActiveState(d))},this.setButtonType=function(a){var d=c(b.DIR_TYPE.BUTTON);this.subCtrls[d]&&this.subCtrls[d].setType&&this.subCtrls[d].setType(a)}}]).directive("attSplitIconButton",["$document","iconStateConstants","keymap",function(a,b,c){return{restrict:"EA",replace:!0,priority:100,transclude:!0,require:["^attSplitIconButtonGroup","attSplitIconButton"],controller:"AttSplitIconButtonCtrl",templateUrl:"app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html",scope:{icon:"@",title:"@",dropDownId:"@"},link:function(a,d,e,f){a.title||(a.title=a.icon);var g=f[0],h=f[1];g.addIconButton(h),d.bind("keydown",function(d){(d.which===c.KEY.ESC||d.which===c.KEY.DOWN||d.which===c.KEY.ENTER||d.which===c.KEY.UP||d.which===c.KEY.TAB)&&(a.clickHandler(),a.$broadcast(b.SPLIT_ICON_BTN_EVENT_EMITTER_KEY,d))}),a.dropDownWatch=!1,a.iconStateConstants=b,a.clickHandler=function(){g.hideLeftLineRightButton(h)},a.$watch("isHovered",function(a){a?h.toggleLines(a,g,h,g.isDropDownOpen):h.toggleLines(a,g,h,g.isDropDownOpen)}),a.$watch("dropDownWatch",function(a){g.isDropDownOpen=a,g.toggleDropdownState(a)})}}}]).controller("AttSplitIconButtonGroupCtrl",["$scope","iconStateConstants",function(a,b){this.subIconButtons=[],this.addIconButton=function(a){this.subIconButtons.push(a)},this.isDropDownOpen=!1,this.hideLeftLineRightButton=function(a){var b=this.subIconButtons.length,c=this.subIconButtons[b-2],d=this.subIconButtons[b-1];a!=c&&a!=d&&d.setLeftLineHover(!1)},this.toggleDropdownState=function(a){var c=this.subIconButtons.length;c>2?a?(this.subIconButtons[c-2].isRightLineShown()?this.subIconButtons[c-2].setRightLineHover(!0):this.subIconButtons[c-1].setLeftLineHover(!0),this.subIconButtons[c-2].setButtonType(b.NEXT_TO_DROPDOWN)):(this.subIconButtons[c-1].setLeftLineHover(!1),this.subIconButtons[c-2].setButtonType(b.MIDDLE)):a?(this.subIconButtons[0].setRightLineHover(!0),this.subIconButtons[0].setButtonType(b.LEFT_NEXT_TO_DROPDOWN)):this.subIconButtons[0].setButtonType(b.LEFT)}}]).directive("attSplitIconButtonGroup",["$document","$timeout","iconStateConstants",function(a,b,c){return{restrict:"EA",replace:!0,priority:50,transclude:!0,require:"attSplitIconButtonGroup",controller:"AttSplitIconButtonGroupCtrl",templateUrl:"app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html",scope:{},link:function(a,d,e,f){function g(){var a=f.subIconButtons,b=0,e=a.length-1;if(a[b].setButtonType(c.LEFT),a[b].isLeftLineShown(!1),a[b].isRightLineShown(!0),a[e].setButtonType(c.RIGHT),a[e].isRightLineShown(!1),a[e].isLeftLineShown(!1),e>=2){for(var g=1;e>g;)a[g].setButtonType(c.MIDDLE),a[g].isRightLineShown(!1),a[g].isLeftLineShown(!1),g++;for(var h=2;e>=h;)h==e?a[h].isLeftLineShown(!0):(a[h].isRightLineShown(!0),a[h].isLeftLineShown(!0)),h+=2}var i=d.find("ul");if(i.length>0){var j=e+1;if(j>2){var k=34*j-70+j/1.5+.5,l=k+"px";angular.element(i).css("left",l),angular.element(i).css("border-top-left-radius","0px")}else angular.element(i).css("left","0px")}}b(g,100)}}}]),angular.module("att.abs.stepSlider",["att.abs.position"]).constant("sliderConstants",{SLIDER:{settings:{from:1,to:40,step:1,smooth:!0,limits:!0,value:"3",dimension:"",vertical:!1},className:"jslider",selector:".jslider-"},EVENTS:{},COLORS:{GREEN:"green",BLUE_HIGHLIGHT:"blue",MAGENTA:"magenta",GOLD:"gold",PURPLE:"purple",DARK_BLUE:"dark-blue",REGULAR:"regular",WHITE:"white"}}).factory("utils",function(){return{offset:function(a){var b=a[0],c=0,d=0,e=document.documentElement||document.body,f=window.pageXOffset||e.scrollLeft,g=window.pageYOffset||e.scrollTop;return c=b.getBoundingClientRect().left+f,d=b.getBoundingClientRect().top+g,{left:c,top:d}},roundUpToScale:function(a,b,c,d){function e(a,b){var c=.1;return Math.abs(b-a)<=c?!0:!1}for(var f,g,h,i,j=1;j<b.length;j++){if(f=b[j-1],g=b[j],i=.5*(g-f)+f,0===f&&i>=a||e(f,a)){h=f;break}if(a>f&&(g>a||e(a,g))){h=g;break}}return c&&c>h?b[d]:h},valueForDifferentScale:function(a,b,c,d){var e=c/100;return 0===e?a:d[c]},convertToMbpsGbps:function(a,b,c){function d(a,b){var c=Math.pow(10,b);return~~(a*c)/c}var e=3;return c&&(e=c),a>1024&&1e6>a&&angular.equals(b,"Kbps")?(a=d(a/1e3,e),b="Mbps"):a>1024&&1e6>a&&angular.equals(b,"Mbps")?(a=d(a/1e3,e),b="Mbps"):b=(1024>=a&&angular.equals(b,"Mbps"),"Kbps"),a>=1e6&&angular.equals(b,"Kbps")&&(a=d(a/1e6,e),b="Gbps"),{unitValue:a,unitLabel:b}},getConversionFactorValue:function(a,b,c){if(a<=b[0].startVal)return{scaledVal:a,scaledDimension:c};var d=0;for(var e in b){var f=b[e];a>f.startVal&&(d=e)}var g=b[d].scaleFactor,h=a/g,i=b[d].dimension;return{scaledVal:h,scaledDimension:i}}}}).factory("sliderDraggable",["utils",function(a){function b(){this._init.apply(this,arguments)}return b.prototype.oninit=function(){},b.prototype.events=function(){},b.prototype.onmousedown=function(){this.ptr.css({position:"absolute"})},b.prototype.onmousemove=function(a,b,c){this.ptr.css({left:b,top:c})},b.prototype.onmouseup=function(){},b.prototype.isDefault={drag:!1,clicked:!1,toclick:!0,mouseup:!1},b.prototype._init=function(){if(arguments.length>0){if(this.ptr=arguments[0],this.parent=arguments[2],!this.ptr)return;this.is={},angular.extend(this.is,this.isDefault);var b=a.offset(this.ptr);this.d={left:b.left,top:b.top,width:this.ptr[0].clientWidth,height:this.ptr[0].clientHeight},this.oninit.apply(this,arguments),this._events()}},b.prototype._getPageCoords=function(a){var b={};return b=a.targetTouches&&a.targetTouches[0]?{x:a.targetTouches[0].pageX,y:a.targetTouches[0].pageY}:{x:a.pageX,y:a.pageY}},b.prototype._bindEvent=function(a,b,c){this.supportTouches_?a[0].attachEvent(this.events_[b],c):a.bind&&a.bind(this.events_[b],c)},b.prototype._events=function(){var a=this;this.supportTouches_="ontouchend"in document,this.events_={click:this.supportTouches_?"touchstart":"click",down:this.supportTouches_?"touchstart":"mousedown",move:this.supportTouches_?"touchmove":"mousemove",up:this.supportTouches_?"touchend":"mouseup",mousedown:(this.supportTouches_,"mousedown")};var b=angular.element(window.document);this._bindEvent(b,"move",function(b){a.is.drag&&(b.stopPropagation(),b.preventDefault(),a.parent.disabled||a._mousemove(b))}),this._bindEvent(b,"down",function(b){a.is.drag&&(b.stopPropagation(),b.preventDefault())}),this._bindEvent(b,"up",function(b){a._mouseup(b)}),this._bindEvent(this.ptr,"down",function(b){return a._mousedown(b),!1}),this._bindEvent(this.ptr,"up",function(b){a._mouseup(b)}),this.events()},b.prototype._mousedown=function(a){this.is.drag=!0,this.is.clicked=!1,this.is.mouseup=!1;var b=this._getPageCoords(a);this.cx=b.x-this.ptr[0].offsetLeft,this.cy=b.y-this.ptr[0].offsetTop,angular.extend(this.d,{left:this.ptr[0].offsetLeft,top:this.ptr[0].offsetTop,width:this.ptr[0].clientWidth,height:this.ptr[0].clientHeight}),this.outer&&this.outer.get(0)&&this.outer.css({height:Math.max(this.outer.height(),$(document.body).height()),overflow:"hidden"}),this.onmousedown(a)},b.prototype._mousemove=function(a){if(0!==this.uid){this.is.toclick=!1;var b=this._getPageCoords(a);this.onmousemove(a,b.x-this.cx,b.y-this.cy)}},b.prototype._mouseup=function(a){this.is.drag&&(this.is.drag=!1,this.outer&&this.outer.get(0)&&($.browser.mozilla?this.outer.css({overflow:"hidden"}):this.outer.css({overflow:"visible"}),$.browser.msie&&"6.0"===$.browser.version?this.outer.css({height:"100%"}):this.outer.css({height:"auto"})),this.onmouseup(a))},b}]).factory("sliderPointer",["sliderDraggable","utils",function(a,b){function c(){a.apply(this,arguments)}return c.prototype=new a,c.prototype.oninit=function(a,b,c){this.uid=b,this.parent=c,this.value={},this.settings=angular.copy(c.settings)},c.prototype.onmousedown=function(a){var c=b.offset(this.parent.domNode),d={left:c.left,top:c.top,width:this.parent.domNode[0].clientWidth,height:this.parent.domNode[0].clientHeight};this._parent={offset:d,width:d.width,height:d.height},this.ptr.addClass("jslider-pointer-hover"),this.setIndexOver()},c.prototype.onmousemove=function(a,c,d){var e=this._getPageCoords(a),f=this.calc(e.x);this.parent.settings.smooth||(f=b.roundUpToScale(f,this.parent.settings.scale,this.parent.settings.cutOffWidth,this.parent.settings.cutOffIndex));var g=this.parent.settings.cutOffWidth;g&&g>f&&(f=g),this._set(f)},c.prototype.onmouseup=function(a){if(this.settings.callback&&angular.isFunction(this.settings.callback)){var b=this.parent.getValue();this.settings.callback.call(this.parent,b)}this.ptr.removeClass("jslider-pointer-hover")},c.prototype.setIndexOver=function(){this.parent.setPointersIndex(1),this.index(2)},c.prototype.index=function(a){},c.prototype.limits=function(a){return this.parent.limits(a,this)},c.prototype.calc=function(a){var b=a-this._parent.offset.left,c=this.limits(100*b/this._parent.width);return c},c.prototype.set=function(a,b){this.value.origin=this.parent.round(a),this._set(this.parent.valueToPrc(a,this),b)},c.prototype._set=function(a,b){b||(this.value.origin=this.parent.prcToValue(a)),this.value.prc=a,this.ptr.css({left:a+"%"}),this.parent.redraw(this)},c}]).factory("slider",["sliderPointer","sliderConstants","utils",function(a,b,c){function d(){return this.init.apply(this,arguments)}function e(a){f.css("width",a)}var f;return d.prototype.changeCutOffWidth=e,d.prototype.init=function(a,c,d){this.settings=b.SLIDER.settings,angular.extend(this.settings,angular.copy(d)),this.inputNode=a,this.inputNode.addClass("ng-hide"),this.settings.interval=this.settings.to-this.settings.from,this.settings.calculate&&$.isFunction(this.settings.calculate)&&(this.nice=this.settings.calculate),this.settings.onstatechange&&$.isFunction(this.settings.onstatechange)&&(this.onstatechange=this.settings.onstatechange),this.is={init:!1},this.o={},this.create(c)},d.prototype.create=function(b){var d=this;this.domNode=b;var e=c.offset(this.domNode),g={left:e.left,top:e.top,width:this.domNode[0].clientWidth,height:this.domNode[0].clientHeight};this.sizes={domWidth:this.domNode[0].clientWidth,domOffset:g},angular.extend(this.o,{pointers:{},labels:{0:{o:angular.element(this.domNode.find("div")[5])},1:{o:angular.element(this.domNode.find("div")[6])}},limits:{0:angular.element(this.domNode.find("div")[3]),1:angular.element(this.domNode.find("div")[5])}}),angular.extend(this.o.labels[0],{value:this.o.labels[0].o.find("span")}),angular.extend(this.o.labels[1],{value:this.o.labels[1].o.find("span")}),d.settings.value.split(";")[1]||(this.settings.single=!0);var h=this.domNode.find("div");f=angular.element(h[8]),f&&f.css&&f.css("width","0%");var i=[angular.element(h[1]),angular.element(h[2])];angular.forEach(i,function(b,c){d.settings=angular.copy(d.settings);var e=d.settings.value.split(";")[c];if(e){d.o.pointers[c]=new a(b,c,d);var f=d.settings.value.split(";")[c-1];f&&parseInt(e,10)<parseInt(f,10)&&(e=f);var g=e<d.settings.from?d.settings.from:e;g=e>d.settings.to?d.settings.to:e,d.o.pointers[c].set(g,!0),0===c&&d.domNode.bind("mousedown",d.clickHandler.apply(d))}}),this.o.value=angular.element(this.domNode.find("i")[2]),this.is.init=!0,angular.forEach(this.o.pointers,function(a){d.redraw(a)})},d.prototype.clickHandler=function(){var a=this;return function(b){if(!a.disabled){var d=b.target.className,e=0;d.indexOf("jslider-pointer-to")>0&&(e=1);var f=c.offset(a.domNode),g={left:f.left,top:f.top,width:a.domNode[0].clientWidth,height:a.domNode[0].clientHeight};e=1;var h=a.o.pointers[e];return h._parent={offset:g,width:g.width,height:g.height},h._mousemove(b),h.onmouseup(),!1}}},d.prototype.disable=function(a){this.disabled=a},d.prototype.nice=function(a){return a},d.prototype.onstatechange=function(){},d.prototype.limits=function(a,b){if(!this.settings.smooth){var c=100*this.settings.step/this.settings.interval;a=Math.round(a/c)*c}var d=this.o.pointers[1-b.uid];d&&b.uid&&a<d.value.prc&&(a=d.value.prc),d&&!b.uid&&a>d.value.prc&&(a=d.value.prc),0>a&&(a=0),a>100&&(a=100);var e=Math.round(10*a)/10;return e},d.prototype.setPointersIndex=function(a){angular.forEach(this.getPointers(),function(a,b){a.index(b)})},d.prototype.getPointers=function(){return this.o.pointers},d.prototype.onresize=function(){var a=this;this.sizes={domWidth:this.domNode[0].clientWidth,domHeight:this.domNode[0].clientHeight,domOffset:{left:this.domNode[0].offsetLeft,top:this.domNode[0].offsetTop,width:this.domNode[0].clientWidth,height:this.domNode[0].clientHeight}},angular.forEach(this.o.pointers,function(b,c){a.redraw(b)})},d.prototype.update=function(){this.onresize(),this.drawScale()},d.prototype.drawScale=function(){},d.prototype.redraw=function(a){if(!this.settings.smooth){var b=c.roundUpToScale(a.value.prc,this.settings.scale,this.settings.cutOffWidth,this.settings.cutOffIndex);a.value.origin=b,a.value.prc=b}if(!this.is.init)return!1;this.setValue();var d=this.o.pointers[1].value.prc,e={left:"0%",width:d+"%"};this.o.value.css(e);var f=this.nice(a.value.origin),g=this.settings.firstDimension;if(this.settings.stepWithDifferentScale&&!this.settings.smooth&&(f=c.valueForDifferentScale(this.settings.from,this.settings.to,f,this.settings.prcToValueMapper)),this.settings.realtimeCallback&&angular.isFunction(this.settings.realtimeCallback)&&void 0!==this.settings.cutOffVal&&1===a.uid&&this.settings.realtimeCallback(f),this.settings.conversion){var h=c.getConversionFactorValue(parseInt(f),this.settings.conversion,this.settings.firstDimension);f=h.scaledVal,g=h.scaledDimension}f=parseFloat(f);var i=c.convertToMbpsGbps(f,g,this.settings.decimalPlaces);this.o.labels[a.uid].value.html(i.unitValue+" "+i.unitLabel),this.redrawLabels(a)},d.prototype.redrawLabels=function(a){function b(a,b,d){b.margin=-b.label/2;var e=c.sizes.domWidth,f=b.border+b.margin;return 0>f&&(b.margin-=f),b.border+b.label/2>e?(b.margin=0,b.right=!0):b.right=!1,b.margin=-(a.o[0].clientWidth/2-a.o[0].clientWidth/20),
-a.o.css({left:d+"%",marginLeft:b.margin,right:"auto"}),b.right&&a.o.css({left:"auto",right:0}),b}var c=this,d=this.o.labels[a.uid],e=a.value.prc,f={label:d.o[0].offsetWidth,right:!1,border:e*i/100},g=null,h=null;if(!this.settings.single)switch(h=this.o.pointers[1-a.uid],g=this.o.labels[h.uid],a.uid){case 0:f.border+f.label/2>g.o[0].offsetLeft-this.sizes.domOffset.left?(g.o.css({visibility:"hidden"}),g.value.html(this.nice(h.value.origin)),d.o.css({visibility:"hidden"}),e=(h.value.prc-e)/2+e,h.value.prc!==a.value.prc&&(d.value.html(this.nice(a.value.origin)+"&nbsp;&ndash;&nbsp;"+this.nice(h.value.origin)),f.label=d.o[0].clientWidth,f.border=e*i/100)):g.o.css({visibility:"visible"});break;case 1:f.border-f.label/2<g.o[0].offsetLeft-this.sizes.domOffset.left+g.o[0].clientWidth?(g.o.css({visibility:"hidden"}),g.value.html(this.nice(h.value.origin)),d.o.css({visibility:"visible"}),e=(e-h.value.prc)/2+h.value.prc,h.value.prc!==a.value.prc&&(d.value.html(this.nice(h.value.origin)+"&nbsp;&ndash;&nbsp;"+this.nice(a.value.origin)),f.label=d.o[0].clientWidth,f.border=e*i/100)):g.o.css({visibility:"visible"})}f=b(d,f,e);var i=c.sizes.domWidth;g&&(f={label:g.o[0].clientWidth,right:!1,border:h.value.prc*this.sizes.domWidth/100},f=b(g,f,h.value.prc))},d.prototype.redrawLimits=function(){if(this.settings.limits){var a=[!0,!0];for(var b in this.o.pointers)if(!this.settings.single||0===b){var c=this.o.pointers[b],d=this.o.labels[c.uid],e=d.o[0].offsetLeft-this.sizes.domOffset.left,f=this.o.limits[0];e<f[0].clientWidth&&(a[0]=!1),f=this.o.limits[1],e+d.o[0].clientWidth>this.sizes.domWidth-f[0].clientWidth&&(a[1]=!1)}for(var g=0;g<a.length;g++)a[g]?angular.element(this.o.limits[g]).addClass("animate-show"):angular.element(this.o.limits[g]).addClass("animate-hidde")}},d.prototype.setValue=function(){var a=this.getValue();this.inputNode.attr("value",a),this.onstatechange.call(this,a,this.inputNode)},d.prototype.getValue=function(){if(!this.is.init)return!1;var a=this,b="";return angular.forEach(this.o.pointers,function(d,e){if(void 0!==d.value.prc&&!isNaN(d.value.prc)){var f=d.value.prc,g=a.prcToValue(f);if(!a.settings.smooth)var g=c.valueForDifferentScale(a.settings.from,a.settings.to,f,a.settings.prcToValueMapper);b+=(e>0?";":"")+g}}),b},d.prototype.getPrcValue=function(){if(!this.is.init)return!1;var a="";return $.each(this.o.pointers,function(b){void 0===this.value.prc||isNaN(this.value.prc)||(a+=(b>0?";":"")+this.value.prc)}),a},d.prototype.prcToValue=function(a){var b;if(this.settings.heterogeneity&&this.settings.heterogeneity.length>0)for(var c=this.settings.heterogeneity,d=0,e=this.settings.from,f=0;f<=c.length;f++){var g;g=c[f]?c[f].split("/"):[100,this.settings.to],a>=d&&a<=g[0]&&(b=e+(a-d)*(g[1]-e)/(g[0]-d)),d=g[0],e=g[1]}else b=this.settings.from+a*this.settings.interval/100;var h=this.round(b);return h},d.prototype.valueToPrc=function(a,b){var c;if(this.settings.heterogeneity&&this.settings.heterogeneity.length>0)for(var d=this.settings.heterogeneity,e=0,f=this.settings.from,g=0;g<=d.length;g++){var h;h=d[g]?d[g].split("/"):[100,this.settings.to],a>=f&&a<=h[1]&&(c=b.limits(e+(a-f)*(h[0]-e)/(h[1]-f))),e=h[0],f=h[1]}else c=b.limits(100*(a-this.settings.from)/this.settings.interval);return c},d.prototype.round=function(a){return a=Math.round(a/this.settings.step)*this.settings.step,a=this.settings.round?Math.round(a*Math.pow(10,this.settings.round))/Math.pow(10,this.settings.round):Math.round(a)},d}]).directive("attStepSlider",["$compile","$templateCache","$timeout","$window","slider","sliderConstants","utils",function(a,b,c,d,e,f,g){var h="app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html";return{restrict:"AE",require:"?ngModel",scope:{options:"=",cutOff:"="},priority:1,templateUrl:h,link:function(i,j,k,l){function m(){angular.element(d).bind("resize",function(a){i.slider.onresize()})}if(l){i.mainSliderClass="step-slider",j.after(a(b.get(h))(i,function(a,b){b.tmplElt=a})),l.$render=function(){if(l.$viewValue.split&&1===l.$viewValue.split(";").length?l.$viewValue="0;"+l.$viewValue:"number"==typeof l.$viewValue&&(l.$viewValue="0;"+l.$viewValue),(l.$viewValue||0===l.$viewValue)&&("number"==typeof l.$viewValue&&(l.$viewValue=""+l.$viewValue),i.slider)){var a="0";if(i.slider.getPointers()[0].set(a,!0),l.$viewValue.split(";")[1]){var b=l.$viewValue.split(";")[1];b.length>=4&&(b=b.substring(0,2)),i.options.realtime||i.options.callback(parseFloat(l.$viewValue.split(";")[1])),i.slider.getPointers()[1].set(l.$viewValue.split(";")[1],!0)}}};var n=function(){function a(){0!==d[0]&&d.splice(0,0,0),100!==d[d.length-1]&&d.splice(d.length,0,100)}function b(){if(d[d.length-1]!==i.options.to&&d.splice(d.length,0,i.options.to),i.options.displayScaledvalues){for(var a in d)h.push(Math.log2(d[a]));var b=h[h.length-1]}for(var a in d){var c,e=d[a]/i.options.from,f=d[a]/i.options.to;c=i.options.displayScaledvalues?h[a]/b*100:(d[a]-i.options.from)/(i.options.to-i.options.from)*100;var g=d[a];1===f?c=100:1===e&&(c=0),d[a]=c,k[""+c]=g}}i.from=""+i.options.from,i.to=""+i.options.to,i.options.calculate&&"function"==typeof i.options.calculate&&(i.from=i.options.calculate(i.from),i.to=i.options.calculate(i.to)),i.showDividers=i.options.showDividers,i.COLORS=f.COLORS,i.sliderColor=i.options.sliderColor,i.sliderColor||(i.sliderColor=f.COLORS.REGULAR);var d=i.options.scale,e=[],h=[],k={};for(var n in d){var p=d[n];e.push(p)}0===i.options.from&&100===i.options.to||!i.options.smooth?0===i.options.from&&100===i.options.to||i.options.smooth?(b(),a()):(i.options.stepWithDifferentScale=!0,b(),a()):(a(),i.options.stepWithDifferentScale=!0);var q=0;if(i.options.decimalPlaces&&(q=i.options.decimalPlaces),i.endDimension=i.options.dimension,i.options.conversion){var r=i.options.conversion.length-1,s=i.options.conversion[r].dimension,t=i.options.conversion[r].scaleFactor;i.endDimension=" "+s;var u=(i.to/t).toFixed(q);i.toStr=u}else i.toStr=i.options.to;var v=g.convertToMbpsGbps(i.toStr,i.endDimension,i.options.decimalPlaces);i.toStr=v.unitValue,i.endDimension=" "+v.unitLabel;var w={from:i.options.from,to:i.options.to,step:i.options.step,smooth:i.options.smooth,limits:!0,stepWithDifferentScale:i.options.stepWithDifferentScale,round:i.options.round||!1,value:l.$viewValue,scale:i.options.scale,nonPercentScaleArray:e,prcToValueMapper:k,firstDimension:i.options.dimension,decimalPlaces:q,conversion:i.options.conversion,realtimeCallback:i.options.callback};angular.isFunction(i.options.realtime)?w.realtimeCallback=function(a){l.$setViewValue(a),i.options.callback(a)}:w.callback=o,w.calculate=i.options.calculate||void 0,w.onstatechange=i.options.onstatechange||void 0,c(function(){var a=i.tmplElt.find("div")[7];w.conversion||(i.tmplElt.find("div").eq(6).find("span").eq(0).css("padding-left","10px"),i.tmplElt.find("div").eq(6).find("span").eq(0).css("padding-right","15px")),i.slider=angular.element.slider(j,i.tmplElt,w),angular.element(a).html(i.generateScale()),i.drawScale(a),m(),i.$watch("options.disable",function(a){i.slider&&(i.tmplElt.toggleClass("disabled",a),i.slider.disable(a))}),i.$watch("cutOff",function(a){if(a&&a>0){var b=(a-i.slider.settings.from)/(i.slider.settings.to-i.slider.settings.from);if(b=100*b,i.isCutOffSlider=!0,i.slider.settings.cutOffWidth=b,i.cutOffVal=a,i.options.conversion){var c=g.getConversionFactorValue(a,i.options.conversion,i.options.dimension);c.scaledVal=parseFloat(c.scaledVal).toFixed(i.options.decimalPlaces),i.cutOffVal=c.scaledVal+" "+c.scaledDimension}i.slider.settings.cutOffVal=a,i.slider.changeCutOffWidth(b+"%");var d=i.slider.settings.nonPercentScaleArray;for(var e in d)if(e>=1){var f=d[e-1],h=d[e];a>f&&h>=a&&(i.slider.settings.cutOffIndex=e)}}else i.slider.settings.cutOffVal=0})})};i.generateScale=function(){if(i.options.scale&&i.options.scale.length>0){for(var a="",b=i.options.scale,c="left",d=0;d<b.length;d++)if(0!==d&&d!==b.length-1){var e=(b[d]-i.from)/(i.to-i.from)*100;i.options.stepWithDifferentScale&&!i.options.smooth&&(e=b[d]),a+='<span style="'+c+": "+e+'%"></span>'}return a}return""},i.drawScale=function(a){angular.forEach(angular.element(a).find("ins"),function(a,b){a.style.marginLeft=-a.clientWidth/2})};var o=function(a){var b=a.split(";")[1];i.$apply(function(){l.$setViewValue(parseInt(b))}),i.options.callback&&i.options.callback(parseInt(b))};i.$watch("options",function(a){n()}),angular.element.slider=function(a,b,c){b.data("jslider")||b.data("jslider",new e(a,b,c));var d=b.data("jslider");return d}}}}}]),angular.module("att.abs.steptracker",["att.abs.transition"]).directive("steptracker",["$timeout",function(a){return{priority:100,scope:{sdata:"=sdata",cstep:"=currentStep",clickHandler:"=?",disableClick:"=?"},restrict:"EA",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/steptracker/step-tracker.html",link:function(b,c){void 0===b.disableClick&&(b.disableClick=!1),a(function(){function a(a){return angular.element(g[a-1])}function d(){if(b.cstep>0&&b.cstep<=b.sdata.length-1&&j>0){var c=j/k*100+"%";l=a(b.cstep),l.css("width",c)}}function e(){b.cstep<=b.sdata.length&&(j=b.sdata[b.cstep-1].currentPage,k=b.sdata[b.cstep-1].totalPages)}b.cstep<1?b.cstep=1:b.cstep>b.sdata.length&&(b.cstep=b.sdata.length);var f=c.find("div"),g=[];for(var h in f)if(f.eq(h)[0]){var i=f.eq(h)[0].className;i.indexOf("track ng-scope")>-1&&g.push(f.eq(h))}var j,k,l=a(b.cstep);b.set_width=function(a){var c=100/(b.sdata.length-1)+"%";return b.sdata.length-1>a?{width:c}:void 0},b.$watch("sdata",function(){e();var a=b.cstep;if(1>j&&(j=1,1!==b.cstep&&(b.cstep--,e())),j>k){if(b.cstep>b.sdata.length-1)return void b.cstep++;j=k,d(),b.cstep++,e(),d()}1>j&&a===b.cstep&&(j=1,b.cstep>1&&(b.cstep--,b.sdata[b.cstep-1].currentPage=b.sdata[b.cstep-1].totalPages,b.sdata[b.cstep].currentPage=1)),d()},!0),b.activestep=function(a){return a===b.cstep-1},b.donesteps=function(a){return a<b.cstep-1},b.laststep=function(a){return a===b.sdata.length-1},b.isIncomplete=function(a){if(a===b.cstep-1)return!1;if(a>=0&&a<b.sdata.length-1){var c=b.sdata[a];return c.currentPage<=c.totalPages}},b.stepclick=function(a,c){if(c<b.cstep){for(var f=b.cstep-1;f>c;f--)b.sdata[f].currentPage=1;b.sdata[c].currentPage--}angular.isFunction(b.clickHandler)&&b.clickHandler(a,c),b.cstep=c+1,b.cstep<=b.sdata.length&&b.sdata[b.cstep].currentPage<1&&(b.sdata[b.cstep].currentPage=1),e(),d()}},100)}}}]).constant("timelineConstants",{STEP_TYPE:{ALERT:"alert",COMPLETED:"completed",CANCELLED:"cancelled"}}).controller("AttTimelineCtrl",["$scope","$timeout",function(a,b){function c(){function b(a,b){return a.order<b.order?-1:a.order>b.order?1:0}f.sort(b),e.sort(b),a.$parent.animate&&d(),a.$watch("trigger",function(b){b?a.resetTimeline():a.$parent.animate=!1})}function d(){function c(){for(var a in f){var b=f[a];if(a%2===0?b.unhoveredStateForBelow(.25):b.unhoveredStateForAbove(.25),b.isStop())break}}function d(a,h){return 0===a?function(){f[a+1].isStop()&&f[a+1].isCancelled()&&e[a].isCancelled(!0),e[a].animate(d(a+1,h),h)}:a===e.length-1?function(){f[0].isCurrentStep()&&f[0].isCurrentStep(!1),f[a].isStop()?(f[a-1].shrinkAnimate(g),f[a].isCurrentStep(!0)):(f[a-1].shrinkAnimate(g),e[a].animate(d(a+1,h),h)),f[a].expandedAnimate(g),b(function(){c()},500)}:a===e.length?function(){f[0].isCurrentStep()&&f[0].isCurrentStep(!1),f[a-1].shrinkAnimate(g),f[a].expandedAnimate(g),f[a].isCurrentStep(!0),b(function(){c()},500)}:function(){f[0].isCurrentStep()&&f[0].isCurrentStep(!1),f[a].isStop()?(f[a-1].shrinkAnimate(g),f[a].expandedAnimate(g),f[a].isCurrentStep(!0),b(function(){c()},500)):(f[a+1].isStop()&&f[a+1].isCancelled()&&e[a].isCancelled(!0),f[a-1].shrinkAnimate(g),e[a].animate(d(a+1,h),h),f[a].expandedAnimate(g))}}var g=.25,h=.25;"number"==typeof a.barAnimateDuration&&(h=a.barAnimateDuration);var i=d(0,h);i()}var e=[],f=[];this.numSteps=0,this.isAlternate=function(){return a.alternate},this.addTimelineBarCtrls=function(a){e.push(a)},this.addTimelineDotCtrls=function(a){f.push(a)},b(c,200)}]).directive("attTimeline",["$timeout","$compile",function(a,b){return{restrict:"EA",replace:!0,scope:{steps:"=",trigger:"=",alternate:"=",barAnimateDuration:"="},templateUrl:"app/scripts/ng_js_att_tpls/steptracker/timeline.html",controller:"AttTimelineCtrl",link:function(a,c,d,e){var f=function(){for(var b=a.steps,c=[],d=1;d<b.length;d++){var f=b[d];c.push(f)}a.middleSteps=c,e.numSteps=b.length-1};f(),a.resetTimeline=function(){a.animate=!0,b(c)(a)}}}}]).controller("TimelineBarCtrl",["$scope",function(a){this.type="timelinebar",this.order=parseInt(a.order),this.animate=function(b,c){a.loadingAnimation(b,c)},this.isCancelled=function(b){a.isCancelled=b}}]).directive("timelineBar",["animation","$progressBar",function(a,b){return{restrict:"EA",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/steptracker/timelineBar.html",scope:{order:"@"},require:["^attTimeline","timelineBar"],controller:"TimelineBarCtrl",link:function(c,d,e,f){var g=f[0],h=f[1];g.addTimelineBarCtrls(h),c.isCompleted=!0;var i=100/g.numSteps-3;d.css("width",i+"%");var j=d.find("div").eq(0);a.set(j,{opacity:0});var k=function(b){a.set(j,{opacity:1}),a.set(j,{scaleX:b.progress(),transformOrigin:"left"})};c.loadingAnimation=b(k)}}}]).controller("TimelineDotCtrl",["$scope","$timeout","timelineConstants",function(a,b,c){this.type="dot",this.order=parseInt(a.order);var d=this;b(function(){0!==d.order&&(d.order%2!==0?a.initializeAboveForAnimation():a.initializeBelowForAnimation())}),this.expandedAnimate=function(b){a.setColor(),a.expandedAnimate(b),0===d.order||a.isStepsLessThanFive()||(d.order%2!==0?a.expandContentForAbove(b):a.expandContentForBelow(b))},this.unhoveredStateForAbove=function(b){a.unhoveredStateForAbove(b)},this.unhoveredStateForBelow=function(b){a.unhoveredStateForBelow(b)},this.shrinkAnimate=function(b){a.shrinkAnimate(b)},this.setExpanded=function(){a.setSize(3)},this.isStop=function(){return a.isStop},this.isCancelled=function(){return a.type===c.STEP_TYPE.CANCELLED},this.isAlert=function(){return a.type===c.STEP_TYPE.ALERT},this.isCurrentStep=function(b){return void 0!==b&&(a.isCurrentStep=b),a.isCurrentStep}}]).directive("timelineDot",["animation","timelineConstants",function(a,b){return{restrict:"EA",replace:!0,scope:{order:"@",title:"@",description:"@",by:"@",date:"@",type:"@"},templateUrl:"app/scripts/ng_js_att_tpls/steptracker/timelineDot.html",require:["^attTimeline","timelineDot"],controller:"TimelineDotCtrl",link:function(c,d,e,f){function g(){return c.description||c.by||c.date?!1:!0}var h=f[0],i=f[1];h.addTimelineDotCtrls(i),c.numSteps=h.numSteps+1,c.isCurrentStep=!1,c.isCompleted=!1,c.isStop=!1,(c.type===b.STEP_TYPE.ALERT||c.type===b.STEP_TYPE.CANCELLED)&&(c.isStop=!0),c.isInactive=!0;var j=d.find("div"),k=j.eq(0),l=j.eq(2),m=j.eq(3),n=j.eq(5),o=j.eq(6),p=j.eq(9);c.isStepsLessThanFive=function(){return c.numSteps<5?!0:!1},c.titleMouseover=function(a){c.isStepsLessThanFive()||g()||(1===a&&c.order%2===0&&c.expandContentForBelow(.25),2===a&&c.order%2!==0&&c.expandContentForAbove(.25))},c.titleMouseleave=function(){c.order%2===0?c.unhoveredStateForBelow(.25):c.unhoveredStateForAbove(.25)},c.initializeAboveForAnimation=function(){if(!c.isStepsLessThanFive()&&h.isAlternate()&&(a.set(o,{opacity:0}),a.set(p,{opacity:0}),!g())){var b=o[0].offsetHeight+p[0].offsetHeight;a.set(n,{top:b})}},c.expandContentForAbove=function(b){!c.isStepsLessThanFive()&&h.isAlternate()&&(a.to(n,b,{top:0}),a.to(o,b,{opacity:1}),a.to(p,b,{opacity:1}))},c.unhoveredStateForAbove=function(b){if(!c.isStepsLessThanFive()&&h.isAlternate()){a.set(o,{opacity:0}),a.set(p,{opacity:1});var d=o[0].offsetHeight;a.to(n,b,{top:d})}},c.initializeBelowForAnimation=function(){!c.isStepsLessThanFive()&&h.isAlternate()&&(a.set(o,{height:"0%",opacity:0,top:"-20px"}),a.set(p,{opacity:0}))},c.expandContentForBelow=function(b){!c.isStepsLessThanFive()&&h.isAlternate()&&(a.set(p,{opacity:1}),a.to(o,b,{height:"auto",opacity:1,top:"0px"}))},c.unhoveredStateForBelow=function(b){!c.isStepsLessThanFive()&&h.isAlternate()&&(a.to(o,b,{height:"0%",opacity:0,top:"-20px",position:"relative"}),a.set(p,{opacity:1}))},g()&&c.order%2!==0&&h.isAlternate()&&m.css("top","-47px"),c.order%2!==0&&h.isAlternate()?c.isBelowInfoBoxShown=!1:c.isBelowInfoBoxShown=!0,c.isStepsLessThanFive()&&!h.isAlternate()&&a.set(p,{marginTop:10}),a.set(k,{opacity:".5"}),a.set(l,{opacity:"0.0"}),a.set(l,{scale:.1}),0===c.order&&(a.set(l,{opacity:"1.0"}),a.set(l,{scale:1}),a.set(k,{scale:3}),c.isCurrentStep=!0,c.isInactive=!1,c.isCompleted=!0),c.setColor=function(){c.isInactive=!1,c.type===b.STEP_TYPE.CANCELLED?c.isCancelled=!0:c.type===b.STEP_TYPE.ALERT?c.isAlert=!0:c.isCompleted=!0,c.$phase||c.$apply()},c.setSize=function(b){a.set(biggerCircle,{scale:b})},c.setExpandedCircle=function(){a.set(l,{opacity:"1.0"}),a.set(l,{scale:1})},c.expandedAnimate=function(b){a.to(k,b,{scale:3}),a.set(l,{opacity:"1.0"}),a.to(l,b,{scale:1})},c.shrinkAnimate=function(b){a.to(k,b,{scale:1})}}}}]),angular.module("att.abs.table",["att.abs.utilities"]).constant("tableConfig",{defaultSortPattern:!1,highlightSearchStringClass:"tablesorter-search-highlight"}).directive("attTable",["$filter",function(a){return{restrict:"EA",replace:!0,transclude:!0,scope:{tableData:"=",viewPerPage:"=",currentPage:"=",totalPage:"=",searchCategory:"=",searchString:"="},require:"attTable",templateUrl:"app/scripts/ng_js_att_tpls/table/attTable.html",controller:["$scope",function(a){this.headers=[],this.currentSortIndex=null,this.setIndex=function(a){this.headers.push(a)},this.getIndex=function(a){for(var b=0;b<this.headers.length;b++)if(this.headers[b].headerName===a)return this.headers[b].index;return null},this.sortData=function(b,c){a.$parent.columnIndex=b,a.$parent.reverse=c,this.currentSortIndex=b,a.currentPage=1,this.resetSortPattern()},this.getSearchString=function(){return a.searchString},this.resetSortPattern=function(){for(var a=0;a<this.headers.length;a++){var b=this.headers[a];b.index!==this.currentSortIndex&&b.resetSortPattern()}}}],link:function(b,c,d,e){b.searchCriteria={},b.$watchCollection("tableData",function(a){a&&!isNaN(a.length)&&(b.totalRows=a.length)}),b.$watch("currentPage",function(a){b.$parent.currentPage=a}),b.$watch("viewPerPage",function(a){b.$parent.viewPerPage=a}),b.$watch(function(){return b.totalRows/b.viewPerPage},function(a){isNaN(a)||(b.totalPage=Math.ceil(a),b.currentPage=1)});var f=function(a){return angular.isDefined(a)&&null!==a&&""!==a?!0:void 0},g=function(a,c){if(f(a)&&f(c)){var d=e.getIndex(c);b.searchCriteria={},null!==d&&(b.searchCriteria[d]=a)}else!f(a)||angular.isDefined(c)&&null!==c&&""!==c?b.searchCriteria={}:b.searchCriteria={$:a}};b.$watch("searchCategory",function(a,c){a!==c&&g(b.searchString,a)}),b.$watch("searchString",function(a,c){a!==c&&g(a,b.searchCategory)}),b.$watchCollection("searchCriteria",function(c){b.$parent.searchCriteria=c,b.totalRows=b.tableData&&a("filter")(b.tableData,c,!1).length||0,b.currentPage=1})}}}]).directive("attTableRow",[function(){return{restrict:"EA",compile:function(a,b){if("header"===b.type)a.find("tr").eq(0).addClass("tablesorter-headerRow");else if("body"===b.type){var c=a.children();b.rowRepeat&&(b.trackBy?c.attr("ng-repeat",b.rowRepeat.concat(" | orderBy : columnIndex : reverse | filter : searchCriteria : false | attLimitTo : viewPerPage : viewPerPage*(currentPage-1) track by "+b.trackBy)):c.attr("ng-repeat",b.rowRepeat.concat(" | orderBy : columnIndex : reverse | filter : searchCriteria : false | attLimitTo : viewPerPage : viewPerPage*(currentPage-1) track by $index"))),c.attr("ng-class","{'alt-row': $even,'normal-row': $odd}"),a.append(c)}}}}]).directive("attTableHeader",["tableConfig",function(a){return{restrict:"EA",replace:!0,transclude:!0,scope:{sortable:"@",defaultSort:"@",index:"@key"},require:"^attTable",templateUrl:"app/scripts/ng_js_att_tpls/table/attTableHeader.html",link:function(b,c,d,e){var f=a.defaultSortPattern;b.headerName=c.text(),b.sortPattern=null,e.setIndex(b),b.$watch(function(){return c.text()},function(a){b.headerName=a}),b.sort=function(a){"boolean"==typeof a&&(f=a),e.sortData(b.index,f),b.sortPattern=f?"desc":"asc",f=!f},b.$watch(function(){return e.currentSortIndex},function(a){a!==b.index&&(b.sortPattern=null)}),"false"!==b.sortable&&("A"===b.defaultSort||"a"===b.defaultSort?b.sort(!1):("D"===b.defaultSort||"d"===b.defaultSort)&&b.sort(!0)),b.resetSortPattern=function(){f=a.defaultSortPattern}}}}]).directive("attTableBody",["$filter","$timeout","tableConfig",function(a,b,c){return{restrict:"EA",require:"^attTable",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/table/attTableBody.html",link:function(d,e,f,g){var h=c.highlightSearchStringClass,i="",j=function(b){var c=b.text();b.html(a("highlight")(c,i,h))},k=function(a){var b=a.children();if(!(b.length>0))return void j(a);for(var c=0;c<b.length;c++)k(b.eq(c))},l=function(a){for(var b=a.find("*"),c=0;c<b.length;c++)if(b.eq(c).attr("class")&&-1!==b.eq(c).attr("class").indexOf(h)){var d=b.eq(c).text();b.eq(c).replaceWith(d)}};b(function(){var a=e.children();d.$watch(function(){return g.getSearchString()},function(b){i=b,l(e),a.length>0?k(e):j(e)})},50)}}}]),angular.module("att.abs.tableMessages",["att.abs.utilities"]).constant("messageConstants",{TABLE_MESSAGE_TYPES:{noMatching:1,errorLoading:2,magnifySearch:3,isLoading:4},USER_MESSAGE_TYPES:{success:1,error:0}}).directive("attTableMessage",["messageConstants",function(a){return{restrict:"AE",replace:!0,transclude:!0,scope:{msgType:"=",onRefreshClick:"&"},templateUrl:"app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html",link:function(b){b.messageConstants=a,b.refreshAction=function(a){b.onRefreshClick(a)}}}}]).directive("attUserMessage",["messageConstants","$timeout","DOMHelper",function(a,b,c){return{restrict:"AE",replace:!0,transclude:!0,scope:{thetitle:"=",type:"=",message:"=",trigger:"="},templateUrl:"app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html",link:function(d,e){var f=void 0,g=void 0;d.messageConstants=a,b(function(){g=c.firstTabableElement(e[0])},10),d.$watch("trigger",function(){d.trigger?(f=document.activeElement,angular.isDefined(g)&&g.focus()):angular.isDefined(f)&&f.focus()})}}}]),angular.module("att.abs.tabs",["att.abs.utilities"]).directive("attTabs",function(){return{restrict:"EA",transclude:!1,replace:!0,scope:{tabs:"=title"},controller:["$scope",function(a){this.getData=function(){return a.tabs},this.onClickTab=function(b){return a.currentTab=b.url,a.currentTab},this.isActiveTab=function(b){return b===a.currentTab}}],link:function(a){for(var b=0;b<a.tabs.length;b++)a.tabs[b].selected&&a.tabs[b].url&&(a.currentTab=a.tabs[b].url)}}}).directive("floatingTabs",function(){return{require:"^attTabs",restrict:"EA",transclude:!1,replace:!0,scope:{size:"@"},templateUrl:"app/scripts/ng_js_att_tpls/tabs/floatingTabs.html",link:function(a,b,c,d){a.tabs=d.getData(),a.onClickTab=d.onClickTab,a.isActiveTab=d.isActiveTab}}}).directive("simplifiedTabs",function(){return{require:"^attTabs",restrict:"EA",transclude:!1,replace:!0,scope:{ctab:"=ngModel"},templateUrl:"app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html",link:function(a,b,c,d){a.tabs=d.getData(),a.clickTab=function(b){return a.ctab=b.id,a.ctab},a.isActive=function(b){return b===a.ctab}}}}).directive("genericTabs",function(){return{require:"^attTabs",restrict:"EA",transclude:!1,replace:!0,scope:{ctab:"=ngModel"},templateUrl:"app/scripts/ng_js_att_tpls/tabs/genericTabs.html",link:function(a,b,c,d){a.tabs=d.getData(),a.clickTab=function(b){return a.ctab=b.id,a.ctab},a.isActive=function(b){return b===a.ctab}}}}).directive("skipNavigation",function(){return{link:function(a,b,c){b.bind("click",function(){var a=angular.element(b.parent().parent().parent().parent())[0].querySelector("a.skiptoBody");angular.element(a).attr("tabindex",-1),a.focus()})}}}).directive("parentTab",[function(){return{restrict:"EA",scope:{menuItems:"=",activeSubMenu:"=",activeMenu:"="},controller:["$scope",function(a){a.megaMenu=a.menuItems,a.megaMenuTab,a.megaMenuHoverTab,this.setMenu=function(){a.menuItems=a.megaMenu,a.activeSubMenu.scroll=!1;for(var b=0;b<a.menuItems.length;b++)a.menuItems[b].active&&(a.activeMenu=a.menuItems[b]);this.setSubMenuStatus(!1),a.$apply()},this.setActiveMenu=function(){if(void 0!==a.megaMenuTab&&null!==a.megaMenuTab)a.menuItems=[a.megaMenuTab],a.megaMenuTab.scroll=!0,a.activeMenu={},a.activeSubMenu=a.megaMenuTab,this.setSubMenuStatus(!0);else{for(var b=0;b<a.menuItems.length;b++)if(a.menuItems[b].active=!1,a.menuItems[b].subItems)for(var c=0;c<a.menuItems[b].subItems.length;c++)a.menuItems[b].subItems[c].active=!1;a.menuItems=a.megaMenu}a.$apply()};var b=!1;this.setSubMenuStatus=function(a){b=a},this.getSubMenuStatus=function(){return b},this.setActiveMenuTab=function(b){a.megaMenuTab=b},this.setActiveMenuHoverTab=function(b){a.megaMenuHoverTab=b},this.setActiveSubMenuTab=function(){a.megaMenuTab=a.megaMenuHoverTab},this.resetMenuTab=function(){a.megaMenuTab=void 0},this.clearSubMenu=function(){a.$evalAsync(function(){a.megaMenuTab=void 0,a.megaMenuHoverTab=void 0})}}]}}]).directive("parentmenuTabs",[function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{megaMenu:"@",menuItems:"="},controller:["$scope",function(a){this.getMenu=function(){return a.menuItems},this.setMenu=function(b){a.menuItems=b}}],templateUrl:"app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html"}}]).directive("menuTabs",["$window","$document","events","keymap",function(a,b,c,d){return{restrict:"EA",transclude:!0,replace:!0,require:["^?parentTab","^?parentmenuTabs"],scope:{activeMenu:"=",menuItem:"=",subMenu:"@",subItemActive:"@",tabName:"=?",tabUrl:"=?"},templateUrl:function(a,b){return b.megaMenu?"app/scripts/ng_js_att_tpls/tabs/menuTab.html":"app/scripts/ng_js_att_tpls/tabs/submenuTab.html"},link:function(e,f,g,h){function i(a,b){clearTimeout(a._tId),a._tId=setTimeout(function(){k.setMenu()},b)}function j(a,b){clearTimeout(a._tId),a._tId=setTimeout(function(){k.setActiveMenu()},b)}var k=h[0],l=h[1];e.clickInactive=!0,e.showHoverChild=function(a){e.clickInactive=!1,e.hoverChild=h[0].getSubMenuStatus(),"mouseover"===a.type&&h[0].getSubMenuStatus()&&e.showChildren(a)},e.showChildren=function(a){e.parentMenuItems=l.getMenu();for(var b=0;b<e.parentMenuItems.length;b++){if(e.parentMenuItems[b].active=!1,e.parentMenuItems[b].subItems)for(var c=0;c<e.parentMenuItems[b].subItems.length;c++)e.parentMenuItems[b].subItems[c].active=!1;e.clickInactive=!0}e.menuItem.active=!0,e.activeMenu=e.menuItem,a.stopPropagation()},e.$watch("subItemActive",function(a){"true"===a&&"true"===e.subMenu&&k.setActiveMenuHoverTab(e.menuItem)}),e.showMenuClick=function(a){k.setActiveMenuTab(e.menuItem),a.stopPropagation()},e.showSubMenuClick=function(a){k.setActiveSubMenuTab(),a.stopPropagation()},e.resetMenu=function(a){k.resetMenuTab(),a.stopPropagation()},b.bind("scroll",function(){0===a.pageYOffset?i(k.setMenu,100):a.pageYOffset>1&&a.pageYOffset<1500&&j(k.setActiveMenu,100)}),f.bind("keydown",function(a){switch(a.keyCode||(a.keyCode=a.which),a.keyCode!==d.KEY.TAB&&(c.preventDefault(a),c.stopPropagation(a)),a.keyCode){case d.KEY.ESC:var b;f.attr("mega-menu")?"item"===f.attr("menu-item")&&(b=angular.element(f.parent().parent().parent().parent())[0].querySelector("a.skiptoBody"),angular.element(b).attr("tabindex",-1),b.focus()):"true"===f.attr("sub-menu")?(b=angular.element(f.parent().parent().parent().parent().parent().parent().parent())[0].querySelector("a.skiptoBody"),angular.element(b).attr("tabindex",-1),b.focus()):void 0===f.attr("sub-menu")&&(b=angular.element(f.parent().parent().parent().parent().parent().parent().parent().parent().parent().parent())[0].querySelector("a.skiptoBody"),angular.element(b).attr("tabindex",-1),b.focus());break;case d.KEY.RIGHT:if(f.attr("mega-menu")){if("item"===f.attr("menu-item")){var g=angular.element(f)[0];if(g.nextElementSibling)null==g.nextElementSibling.querySelector("span")||g.nextElementSibling.querySelector("span").focus();else{do{if(!g||!g.nextSibling)break;g=g.nextSibling}while(g&&"LI"!==g.tagName);g&&(null===g.querySelector("span")||g.querySelector("span").focus()),c.preventDefault(a),c.stopPropagation(a)}}}else{var g=angular.element(f)[0];if("true"===f.attr("sub-menu")){if(null===g.nextElementSibling)break;if(g.nextElementSibling)g.nextElementSibling.querySelector("a").focus();else{do{if(!g||!g.nextSibling)break;g=g.nextSibling}while(g&&"LI"!==g.tagName);g&&(null==g.querySelector("a")||g.querySelector("a").focus()),c.preventDefault(a),c.stopPropagation(a)}}else if(void 0===f.attr("sub-menu")){if(null===g.nextElementSibling)break;if(g.nextElementSibling)g.nextElementSibling.querySelector("a").focus();else{do{if(!g||!g.nextSibling)break;g=g.nextSibling}while(g&&"LI"!==g.tagName);g&&(null==g.querySelector("a")||g.querySelector("a").focus())}}}break;case d.KEY.DOWN:if(f.attr("mega-menu"))angular.element(f)[0].querySelectorAll(".megamenu__items")[0].querySelector("a").focus();else if(void 0===f.attr("sub-menu")){var g=document.activeElement;if(null===g.nextElementSibling)break;if(g.nextElementSibling)g.nextElementSibling.focus();else{do{if(!g||!g.nextSibling)break;g=g.nextSibling}while(g&&"A"!==g.tagName);null!==g.attributes&&g.focus(),c.stopPropagation(a)}}else if("true"===f.attr("sub-menu")){var h=angular.element(f)[0].querySelector("span").querySelector("a");if(null===h)break;h.focus()}break;case d.KEY.LEFT:if(f.attr("mega-menu")){if("item"===f.attr("menu-item")){var g=angular.element(f)[0];if(g.previousElementSibling)null===g.previousElementSibling.querySelector("span")||g.previousElementSibling.querySelector("span").focus();else{do{if(!g||!g.previousSibling)break;g=g.previousSibling}while(g&&"LI"!==g.tagName);g&&(null===g.querySelector("span")||g.querySelector("span").focus()),c.preventDefault(a),c.stopPropagation(a)}}}else{var g=angular.element(f)[0];if("true"===f.attr("sub-menu")){if(null===g.previousElementSibling)break;if(g.previousElementSibling)g.previousElementSibling.querySelector("a").focus();else{do{if(!g||!g.previousSibling)break;g=g.previousSibling}while(g&&"LI"!==g.tagName);g&&(null==g.querySelector("a")||g.querySelector("a").focus()),c.preventDefault(a),c.stopPropagation(a)}}else if(void 0===f.attr("sub-menu")){if(null===g.previousElementSibling)break;if(g.previousElementSibling)g.previousElementSibling.querySelector("a").focus();else{do{if(!g||!g.previousSibling)break;g=g.previousSibling}while(g&&"LI"!==g.tagName);g&&(null==g.querySelector("a")||g.querySelector("a").focus())}}}break;case d.KEY.UP:if("true"===f.attr("sub-menu")){var g=document.activeElement,i=angular.element(f.parent().parent().parent().parent())[0].querySelector("span");i.focus(),k.clearSubMenu(),e.menuItem.active=!1;break}if(void 0===f.attr("sub-menu")){var g=document.activeElement,i=angular.element(f.parent().parent().parent().parent())[0].querySelector("a");if(document.activeElement===angular.element(g).parent().parent()[0].querySelectorAll("a")[0]){i.focus();break}if(g.previousElementSibling){g.previousElementSibling;null!=g.previousElementSibling?g.previousElementSibling.focus():i.focus()}else{do{if(!g||!g.previousSibling)break;g=g.previousSibling}while(g&&"A"!==g.tagName);g&&3!==g.nodeType&&g.focus(),c.preventDefault(a),c.stopPropagation(a)}break}}})}}}]),angular.module("att.abs.tagBadges",[]).directive("tagBadges",["$parse","$timeout",function(a,b){return{restrict:"EA",replace:!1,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html",scope:{styleType:"@",onClose:"&"},link:function(c,d,e){c.isSmall=!1,c.isIcon=!1,c.isColor=!1,c.display=!0,c.isClosable=!1,c.isHighlight=!1,c.customColor=!1,""===e.small&&(c.isSmall=!0),"icon"===c.styleType?c.isIcon=!0:"color"===c.styleType&&(c.isColor=!0,void 0!==e.color&&""!==e.color&&(c.customColor=!0,e.$observe("color",function(a){c.border_type_borderColor=a,c.background_type_backgroundColor=a,c.background_type_borderColor=a}))),c.activeHighlight=function(a){c.customColor&&(a?c.isHighlight=!0:c.isHighlight=!1)},""===e.closable&&(c.isClosable=!0,c.closeMe=function(){c.display=!1,b(function(){
-d.attr("tabindex","0"),d[0].focus(),d.bind("blur",function(){d.remove()})}),e.onClose&&(c.onClose=a(c.onClose),c.onClose())})}}}]),angular.module("att.abs.textOverflow",[]).constant("textDefaultOptions",{width:"50%"}).directive("attTextOverflow",["textDefaultOptions","$compile",function(a,b){return{restrict:"A",link:function(c,d,e){var f=d.text();if(d.addClass("text-ellipsis"),e.$observe("attTextOverflow",function(b){b?d.css({width:b}):d.css({width:a.width})}),!d.attr("tooltip")){d.attr("tooltip",f),d.attr("tooltip-placement","above");var g=angular.element(d);b(g)(c)}}}}]),angular.module("att.abs.toggle",["angular-gestures","att.abs.position"]).directive("attToggleTemplate",["$compile","$log","$position",function(a,b,c){return{restrict:"A",require:"ngModel",transclude:!0,scope:{modelVal:"=ngModel"},templateUrl:"app/scripts/ng_js_att_tpls/toggle/demoToggle.html",link:function(a,b,d){a.initialDragPosition=0;var e=0,f=c.offset(b.children().eq(1).children().eq(0)).width-1,g=function(){a.attrValue===d.ngTrueValue||a.attrValue?a.modelVal=!1:a.modelVal=!0};a.updateModel=function(a){1!==e&&(g(),e=0),a.preventDefault()},a.drag=function(d){if(e=1,"dragstart"===d.type)a.initialDragPosition=c.position(b.children().eq(1)).left,b.children().eq(1).addClass("dragging");else if("drag"===d.type){var h=Math.min(0,Math.max(a.initialDragPosition+d.gesture.deltaX,-f));b.children().eq(1).css({left:h+"px"})}else if("dragend"===d.type){var i=c.position(b.children().eq(1)).left>-1*f/2;b.children().eq(1).removeClass("dragging"),TweenMax.to(b.children().eq(1),.1,{left:i?0:-1*f,ease:Power4.easeOut,onComplete:function(){b.children().eq(1).css({left:""})}}),(i||!i&&"left"===d.gesture.direction)&&g(),e=0}return!1},a.directiveValue=d.attToggleTemplate,a.on=d.trueValue,a.off=d.falseValue;var h=-1*f+"px";a.$watch("modelVal",function(c){if(a.attrValue=c,c===d.ngTrueValue||c){b.children().eq(1).css({left:"0px"}),b.addClass("att-checkbox--on");var f=b.find("div").find("div").eq(1);f.attr("aria-checked",!0),e=0}else{b.children().eq(1).css({left:h}),b.removeClass("att-checkbox--on");var f=b.find("div").find("div").eq(1);f.attr("aria-checked",!1),e=0}b.children().eq(1).css({left:""})})}}}]).directive("attToggleMain",["$compile",function(a){return{restrict:"A",require:"ngModel",transclude:!0,replace:!0,scope:{modelValue:"=ngModel",trueValue:"=ngTrueValue",falseValue:"=ngFalseValue"},link:function(b,c,d){var e="",f="";c.removeAttr("att-toggle-main"),b.on=d.ngTrueValue,b.off=d.ngFalseValue,b.largeValue=d.attToggleMain,angular.isDefined(d.ngTrueValue)&&(e+=' true-value="{{on}}" false-value="{{off}}"'),void 0!==b.largeValue&&(f+=' ="{{largeValue}}"'),c.css({display:"none"});var g=angular.element('<div class="att-switch att-switch-alt" ng-class="{\'large\' : largeValue == \'large\'}" ng-model="modelValue"'+e+" att-toggle-template"+f+">"+c.prop("outerHTML")+"</div>");g=a(g)(b),c.replaceWith(g)}}}]),angular.module("att.abs.treeview",[]).directive("treeView",function(){return{restrict:"A",link:function(a,b){function c(){f.reversed()?f.play():f.reverse()}function d(a){a.stopPropagation(),void 0!==angular.element(a.target).attr("tree-view")&&(b.hasClass("minus")?b.removeClass("minus"):b.addClass("minus"),c())}var e=b.children("ul li"),f=TweenMax.from(e,.2,{display:"none",paused:!0,reversed:!0});b.attr("tabindex","0"),b.on("click",function(a){d(a)}),b.on("keypress",function(a){var b=a.keyCode?a.keyCode:a.charCode,c=[13,32];c.length>0&&b&&c.indexOf(b)>-1&&(d(a),a.preventDefault())})}}}),angular.module("att.abs.typeAhead",["att.abs.tagBadges"]).directive("focusMe",["$timeout","$parse",function(a,b){return{link:function(c,d,e){var f=b(e.focusMe);c.$watch(f,function(b){b&&a(function(){d[0].focus(),c.inputActive=!0})}),d.bind("blur",function(){f.assign(c,!1),c.inputActive=!1,c.$digest()})}}}]).directive("typeAhead",["$timeout","$log",function(a,b){return{restrict:"EA",templateUrl:"app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html",replace:!0,scope:{items:"=",title:"@?",titleName:"@",subtitle:"@",model:"=",emailIdList:"=",emailMessage:"="},link:function(c,d){!angular.isDefined(c.titleName)&&angular.isDefined(c.title)&&a(function(){c.titleName=c.title,b.warn("title attribute is deprecated and title-name attribute is used instead as it is conflicting with html title attribute")}),c.lineItems=[],c.filteredListLength=-1,c.filteredList=[],c.setFocus=function(){c.clickFocus=!0},c.setFocus(),c.handleSelection=function(a,b){c.lineItems.push(a),c.emailIdList.push(b),c.model="",c.current=0,c.selected=!0,c.clickFocus=!0},c.theMethodToBeCalled=function(b){var d=c.lineItems.slice();c.emailIdList.splice(b,1),d.splice(b,1),a(function(){c.lineItems=[],c.$apply(),c.lineItems=c.lineItems.concat(d)})},c.current=0,c.selected=!0,c.isCurrent=function(a,b,d,e){return c.current===a&&(c.itemName=b,c.itemEmail=d),c.dropdownLength=e,c.current===a},c.setCurrent=function(a){c.current=a},c.selectionIndex=function(a){38===a.keyCode&&c.current>0?(a.preventDefault(),c.current=c.current-1,c.isCurrent(c.current)):9===a.keyCode?c.selected=!0:13===a.keyCode&&c.dropdownLength!==c.items.length?c.handleSelection(c.itemName,c.itemEmail):8===a.keyCode&&0===c.model.length||46===a.keyCode?c.theMethodToBeCalled(c.lineItems.length-1):40===a.keyCode&&c.current<c.dropdownLength-1&&(a.preventDefault(),c.current=c.current+1,c.isCurrent(c.current)),d[0].querySelector(".list-scrollable").scrollTop=35*(c.current-1)}}}}]),angular.module("att.abs.verticalSteptracker",["ngSanitize"]).directive("verticalSteptracker",[function(){return{restrict:"EA",transclude:!0,replace:!1,scope:{},template:'<div class="vertical-nav"><ul ng-transclude arial-label="step list" role="presentation" class="tickets-list-height"></ul></div>',link:function(){}}}]).directive("verticalSteptrackerStep",[function(){return{restrict:"EA",transclude:!0,replace:!1,scope:{type:"=type",id:"=id"},templateUrl:"app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html",link:function(){}}}]).directive("attAbsLink",[function(){return{restrict:"EA",transclude:!0,replace:!1,template:'<span ng-transclude class="view-log"></span>'}}]),angular.module("att.abs.videoControls",[]).config(["$compileProvider",function(a){a.aHrefSanitizationWhitelist(/^\s*(https?|javascript):/)}]).directive("videoControls",[function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/videoControls/videoControls.html"}}]).directive("photoControls",[function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/videoControls/photoControls.html",scope:{prevLink:"@",nextLink:"@"},link:function(a,b,c){c.prevLink||(a.prevLink="javascript:void(0)"),c.nextLink||(a.nextLink="javascript:void(0)"),a.links={prevLink:a.prevLink,nextLink:a.nextLink}}}}]),angular.module("app/scripts/ng_js_att_tpls/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/accordion/accordion.html",'<div class="att-accordion__group tabpanel" ng-class="{\'att-accordion__group att-accordion__group--open\':isOpen,\'att-accordion__group\':!isOpen }">\n    <a  ng-show="showicon" \n        class="toggle-header att-accordion__heading att-accordion__toggle noafter" \n        aria-selected="{{focused}}" \n        aria-controls="panel{{index}}" \n        aria-expanded="{{isOpen}}" \n        ng-class="{focus: focused, selected: focused}"         \n        role="tab" \n        ng-click="toggle()" \n        accordion-transclude="heading" \n        style="cursor:pointer; text-decoration:none">\n        <span>{{heading}}</span>\n        <i ng-class="{\'icon-chevron-down\':!isOpen,\'icon-chevron-up\':isOpen }" class="pull-right"></i>\n    </a>\n    <div ng-show="!showicon" \n         ng-class="{focus: focused, selected: focused}" \n         style="text-decoration:none" \n         accordion-transclude="heading"          \n         role="tab"  \n         aria-expanded="{{isOpen}}"\n         aria-selected="{{focused}}" \n         aria-controls="panel{{index}}" \n         class="toggle-header att-accordion__heading att-accordion__toggle noafter">\n        <span>{{heading}}</span>\n    </div>    \n    <div aria-label="{{heading}}" \n         aria-hidden="{{!isOpen}}" \n         role="tabpanel" \n         collapse="!isOpen" \n         class="att-accordion__body" \n         id="panel{{index}}" \n         ng-transclude>\n    </div>\n    <div class="att-accordion__bottom--border"></div>    \n</div> ')}]),angular.module("app/scripts/ng_js_att_tpls/accordion/accordion_alt.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/accordion/accordion_alt.html",'<div class="att-accordion__group tabpanel" ng-class="{\'att-accordion__group att-accordion__group--open\':isOpen,\'att-accordion__group\':!isOpen }">\n    <a class="toggle-header att-accordion__heading att-accordion__toggle" \n       aria-selected="{{focused}}" \n       aria-controls="panel{{index}}" \n       ng-class="{focus: focused, selected: focused}" \n       aria-expanded="{{isOpen}}" \n       role="tab" \n       ng-click="toggle()" \n       accordion-transclude="heading">        \n    </a>\n    <span>{{heading}}</span>\n    <div aria-label="{{heading}}" \n         aria-hidden="{{!isOpen}}" \n         role="tabpanel" \n         collapse="!isOpen" \n         class="att-accordion__body" \n         id="panel{{index}}" \n         ng-transclude>\n    </div>\n</div> ')}]),angular.module("app/scripts/ng_js_att_tpls/accordion/attAccord.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/accordion/attAccord.html","<div ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/accordion/attAccordBody.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/accordion/attAccordBody.html","<div ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html",'<div ng-click="clickFunc()">\n	<div ng-transclude>\n		<i class="icon-chevron-down"></i>\n	</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/alert/alert.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/alert/alert.html","<div class=\"alert\" ng-class=\"{'alert-success': alertType === 'success', 'alert-warning': alertType === 'warning', 'alert-error': alertType === 'error', 'alert-info': alertType === 'info', 'alert-inplace': showTop !== 'true'}\" ng-show=\"showAlert\" ng-style=\"cssStyle\">\n    <div class=\"container\">\n"+'        <a href="javascript:void(0)" alt="close" class="close-role" ng-click="close()" tabindex="0" att-accessibility-click="32,13">Dismiss <i class="icon-circle-action-close"></i></a>\n        <span ng-transclude> </span>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html",'<div tabindex="0" att-accessibility-click="13,32" ng-click="addBoard()" aria-label="Add Board" class="boardstrip-item--add">\n    <i aria-hidden="true" class="icon-add centered"></i>\n    <br/>\n    <div class="centered">Add board</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/boardStrip/attBoard.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/boardStrip/attBoard.html",'<li att-board-navigation tabindex="0" aria-label="{{boardLabel}}" att-accessibility-click="13,32" ng-click="selectBoard(boardIndex)" class="board-item" ng-class="{\'selected\': getCurrentIndex()===boardIndex}">\n    <div ng-transclude></div>\n    <div class="board-caret" ng-if="getCurrentIndex()===boardIndex">\n        <div class="board-caret-indicator"></div>\n        <div class="board-caret-arrow-up"></div>\n    </div>\n</li>')}]),angular.module("app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html",'<div class="att-boardstrip">\n	<div class="boardstrip-reel">\n		<div class="prev-items" ng-if="isPrevBoard()">\n			<i tabindex="0" aria-label="Scroll Boardstrip Left" att-accessibility-click="13,32" ng-click="prevBoard()" class="arrow icon-arrow-left-circle"></i>\n		</div>\n		<div att-add-board on-add-board="onAddBoard()"></div>\n		<div class="board-viewport"><ul role="presentation" class="boardstrip-container" ng-transclude></ul></div>\n		<div class="next-items" ng-if="isNextBoard()">\n			<i tabindex="0" aria-label="Scroll Boardstrip Right" att-accessibility-click="13,32" ng-click="nextBoard()" class="arrow icon-arrow-right-circle"></i>\n		</div>\n	</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html",'<div class="att-btn-dropdown">\n    <div class="buttons-dropdown--small btn-group" ng-class="{\'open\': isOpen}" att-accessibility-click="13,32" ng-click="toggle()">\n        \n        <button role="menu" class="button button--secondary button--small buttons-dropdown__drop dropdown-toggle" ng-if="type===\'dots\'" alt="Click for Options" >\n            \n            <div class="circle"></div>\n            <div class="circle"></div>\n            <div class="circle"></div>\n        </button>\n        <button role="menu" class="button button--secondary button--small buttons-dropdown__drop dropdown-toggle ng-isolate-scope actions-title" ng-if="type === \'actions\'" alt="Actions dropdown Buttons">Actions</button>\n        \n\n'+"        <ul ng-class=\"{'dropdown-menu dots-dropdwn': type==='dots', 'dropdown-menu actions-dropdwn': type === 'actions'}\" ng-transclude></ul>\n    </div>\n    \n</div>\n")}]),angular.module("app/scripts/ng_js_att_tpls/colorselector/colorselector.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/colorselector/colorselector.html",'<div class="att-radio att-color-selector__item"  \n     ng-class="{\'att-radio--on\': (iconColor === selected)}">\n    <div class="att-radio__indicator" tabindex="0" att-accessibility-click="32,13" ng-click="selectedcolor(iconColor)" \n         ng-style="applycolor" ng-transclude></div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/dateFilter.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/datepicker/dateFilter.html",'<div class="calendar" ng-class="{\'monthpicker\':mode === 1}">\n    <div class="select2-container" ng-class="{\'select2-container-active select2-dropdown-open\': showDropdownList}" style="width: 100%; z-index:0">\n        <a tabindex="0" id="select2-choice" class="select2-choice" href="javascript:void(0)" att-element-focus="focusInputButton" ng-show="!showCalendar" att-accessibility-click="13,32" ng-click="showDropdown()" ng-blur="focusInputButton=false">\n            <span class="select2-chosen" ng-show="!showCalendar">{{selectedOption}}</span>\n            <input type="text" ng-show="showCalendar" ng-blur="untrackInputChange($event)" att-input-deny="[^0-9\\/-]" maxlength="{{maxLength}}" ng-model="selectedOption" aria-labelledby="select2-choice" ng-change="getDropdownText()" />\n            <abbr class="select2-search-choice-close"></abbr>\n            <span ng-class="{\'select2-arrow\': mode !== 1, \'calendar-icon\': mode === 1}"><b></b></span>\n        </a>\n        <a id="select2-chosen" class="select2-choice" href="javascript:void(0)" ng-show="showCalendar">\n            <span class="select2-chosen" ng-show="!showCalendar">{{selectedOption}}</span>\n            <input type="text" ng-show="showCalendar" ng-blur="untrackInputChange($event)" att-input-deny="[^0-9\\/-]" maxlength="{{maxLength}}" ng-model="selectedOption" aria-labelledby="select2-chosen" ng-change="getDropdownText()" />\n            <abbr class="select2-search-choice-close"></abbr>\n            <span tabindex="0" ng-class="{\'select2-arrow\': mode !== 1, \'calendar-icon\': mode === 1}" att-accessibility-click="13,32" ng-click="showDropdown()"><b></b></span>\n        </a>\n    </div>\n    <div class="select2-drop select2-drop-active select2-display-none" ng-style="{display: (showDropdownList && \'block\') || \'none\', \'border-radius\': showCalendar && \'0 0 0 6px\'}" style="width: 100%">\n        <div  id="dateFilterList" att-scrollbar ><ul class="select2-results options" ng-transclude></ul></div>\n		<ul class="select2-results sttings" style="margin-top:0px">\n			<li tabindex="0" class="select2-result select2-highlighted greyBorder" ng-class="{\'select2-result-current\': checkCurrentSelection(\'Custom Single Date\')}" att-accessibility-click="13,32" ng-click="selectAdvancedOption(\'Custom Single Date\')">\n                <div class="select2-result-label" ng-if="mode !== 1">Custom Single Date...</div>\n				<div class="select2-result-label" ng-if="mode === 1">Custom single month...</div>\n            </li>\n            <li tabindex="0" class="select2-result select2-highlighted" ng-class="{\'select2-result-current\': checkCurrentSelection(\'Custom Range\')}" att-accessibility-click="13,32" ng-click="selectAdvancedOption(\'Custom Range\')">\n                <div class="select2-result-label" ng-if="mode !== 1">Custom Range...</div>\n				<div class="select2-result-label" ng-if="mode === 1">Custom month range...</div>\n            </li>\n            <li class="select2-result select2-highlighted btnContainer" ng-style="{display: (showCalendar && \'block\') || \'none\'}">\n                <button tabindex="0" ng-blur="resetFocus($event)" att-element-focus="focusApplyButton" att-button="" btn-type="{{applyButtonType}}" size="small" att-accessibility-click="13,32" ng-click="apply()">Apply</button>\n                <button tabindex="0" att-button="" btn-type="secondary" size="small" att-accessibility-click="13,32" ng-click="cancel()">Cancel</button>\n                <div>\n                    <a tabindex="0" href="javascript:void(0)" ng-if="mode !== 1" style="text-decoration:underline;" att-accessibility-click="13,32" ng-click="clear()">Clear Dates</a>\n                    <a tabindex="0" href="javascript:void(0)" ng-if="mode === 1" style="text-decoration:underline;" att-accessibility-click="13,32" ng-click="clear()">Clear Months</a>\n                </div>\n            </li>\n		</ul>\n    </div>\n    <div class="datepicker-wrapper show-right" ng-style="{display: (showCalendar && \'block\') || \'none\'}">\n        <span datepicker ng-blur="resetFocus($event)" att-element-focus="focusSingleDateCalendar" ng-show="checkCurrentSelection(\'Custom Single Date\')"></span>\n        <span datepicker ng-blur="resetFocus($event)" att-element-focus="focusRangeCalendar" ng-show="checkCurrentSelection(\'Custom Range\')"></span>\n    </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html",'<li ng-click="!disabled && selectOption(fromDate,toDate,caption)" att-accessibility-click="13,32" ng-class="{\'select2-result-current\': checkCurrentSelection(caption)}" class="select2-result select2-highlighted ng-scope" tabindex="{{!disabled?\'0\':\'-1\'}}">\n                <div class="select2-result-label" ng-class="{\'disabled\':disabled}" ng-transclude></div>\n</li>')}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/datepicker/datepicker.html",'<div id="datepicker" class="datepicker" ng-class="{\'monthpicker\': mode === 1}" aria-hidden="false" role="dialog" tabindex="-1" aria-labelledby="datepicker">\n    <div class="datepicker-days" style="display: block;">\n        <table class="table-condensed">\n            <thead>\n                <tr>\n                    <th id="month" tabindex="0" class="datepicker-switch" colspan="{{(mode !== 1) && (currentRows[0].length - 2) || (currentRows[0].length)}}" style="text-align:left">{{currentTitle}}</th>\n                    <th ng-if="mode !== 1" id="prev" aria-hidden="{{!disablePrev && \'false\'|| \'true\'}}" tabindex="{{!disablePrev && \'0\'|| \'-1\'}}" att-accessibility-click="13,32" ng-click="!disablePrev && move(-1)">\n            <div class="icons-list" data-size="medium"><i class="icon-arrow-left-circle" ng-class="{\'disabled\': disablePrev}" alt="Left Arrow"></i>\n            </div><span class="hidden-spoken">Previous Month</span>\n            </th>\n            <th ng-if="mode !== 1" id="next" aria-hidden="{{!disableNext && \'false\'|| \'true\'}}" tabindex="{{!disableNext && \'0\'|| \'-1\'}}" att-accessibility-click="13,32" ng-click="!disableNext && move(1)">\n            <div class="icons-list" data-size="medium"><i class="icon-arrow-right-circle" ng-class="{\'disabled\': disableNext}" alt="Right Arrow"></i>\n            </div><span class="hidden-spoken">Next Month</span>\n            </th>\n            </tr>\n            <tr ng-if="labels.length > 0">\n                <th tabindex="-1" class="dow weekday" ng-repeat="label in labels"><span>{{label.pre}}</span></th>\n            </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <td id="datepickerBody" att-scrollbar colspan="{{currentRows[0].length}}" style="padding: 0px;" headers="">\n                        <table ng-class="{\'table-condensed\': mode === 0, \'monthtable-condensed\': mode === 1}" style="padding: 0px;">\n                            <thead class="hidden-spoken">\n                                <tr ng-show="labels.length > 0">\n                                    <th id="{{label.post}}" tabindex="-1" class="dow weekday" ng-repeat="label in labels"></th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                <tr ng-repeat="row in currentRows">\n                                    <td headers="{{(mode === 0) && dt.header || \'month\'}}" att-element-focus="dt.focused" aria-hidden="{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && \'false\') || \'true\'}}" tabindex="{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && \'0\') || \'-1\'}}" ng-repeat="dt in row" class="days" ng-class="{\'active\': dt.selected || dt.from || dt.to, \'from\': dt.from, \'to\': dt.to, \'range\': dt.dateRange, \'prev-month \': dt.oldMonth, \'next-month\': dt.nextMonth, \'disabled\': dt.disabled, \'today\': dt.today, \'weekend\': dt.weekend}" ng-click="!dt.selected && !dt.from && !dt.to && !dt.disabled && !dt.oldMonth && !dt.nextMonth && select(dt.date)" att-accessibility-click="13,32" aria-label="{{dt.date | date : \'EEEE, MMMM d\'}}"><span class="day">{{dt.label}}</span></td>\n                                </tr>\n                                <tr ng-if="mode === 1" class="divider"><td colspan="{{nextRows[0].length}}"><hr></td></tr>\n                                <tr>\n                                    <th id="month" tabindex="0" class="datepicker-switch internal" colspan="{{nextRows[0].length}}" style="text-align:left">{{nextTitle}}</th>\n                                </tr>\n                                <tr ng-repeat="row in nextRows">\n'+"                                    <td headers=\"{{(mode === 0) && dt.header || 'month'}}\" att-element-focus=\"dt.focused\" aria-hidden=\"{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && 'false') || 'true'}}\" tabindex=\"{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && '0') || '-1'}}\" ng-repeat=\"dt in row\" class=\"days\" ng-class=\"{'active': dt.selected || dt.from || dt.to, 'from': dt.from, 'to': dt.to, 'range': dt.dateRange, 'prev-month ': dt.oldMonth, 'next-month': dt.nextMonth, 'disabled': dt.disabled, 'today': dt.today, 'weekend': dt.weekend}\" ng-click=\"!dt.selected && !dt.from && !dt.to && !dt.disabled && !dt.oldMonth && !dt.nextMonth && select(dt.date)\" att-accessibility-click=\"13,32\" aria-label=\"{{dt.date | date : 'EEEE, MMMM d'}}\"><span class=\"day\">{{dt.label}}</span></td>\n                                </tr>\n                            </tbody>\n                        </table>\n                    </td>\n                </tr>\n            </tbody>\n        </table>\n    </div>\n</div>\n")}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html",'<div class="calendar">\n    <div class="box" ng-class="{\'active\': isOpen}">\n        <span ng-transclude></span>\n        <i class="calendar-icon" tabindex="0" att-accessibility-click="13,32" ng-click="toggle()" alt="Calendar Icon"></i>\n    </div>\n    <div class="datepicker-wrapper datepicker-wrapper-display-none" ng-style="{display: (isOpen && \'block\') || \'none\'}" aria-hidden="false" role="dialog" tabindex="-1">\n        <span datepicker></span>\n    </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html",'<div class="divider-container" ng-class="{\'divider-container-light\': lightContainer}">\n    <hr ng-class="{\'divider-light\': lightContainer}">\n</div>\n\n')}]),angular.module("app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html",'<label class="fileContainer"><span ng-transclude></span><input type="file" att-file-change></label>')}]),angular.module("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html",'<div class="form-field" ng-class="{\'error\': errorMessage, \'warning\': warningMessage}">\n    <label class="form-field__label" ng-class="{\'form-field__label--show\': showLabel, \'form-field__label--hide\': hideLabel}"></label>\n    <div class="form-field-input-container" ng-transclude></div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html",'<div class="form-field" ng-class="{\'error\':hideErrorMsg}">\n    <div class="form-field-input-container" ng-transclude></div>\n	<div class="form-field__message error" type="error" ng-show="hideErrorMsg" >\n		<i class="icon-info-alert"></i>{{errorMessage}}\n	</div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/formField/creditCardImage.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/formField/creditCardImage.html",'<span class="css-sprite pull-right">\n<span class="hidden-spoken">We accept</span>\n<ul class="{{newValCCI}}">\n        <li class="css-sprite-mc"><span class="hidden-spoken">MasterCard</span></li>\n        <li class="css-sprite-visa"><span class="hidden-spoken">Visa</span></li>\n        <li class="css-sprite-amex"><span class="hidden-spoken">American Express</span></li>\n        <li class="css-sprite-discover"><span class="hidden-spoken">Discover</span></li>														\n</ul>\n</span>\n<label for="ccForm.card" class="pull-left">Card number</label>')}]),angular.module("app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html",'<div>\n<button type="button" class="btn btn-alt btn-tooltip" style="padding-top:16px" title="Help"><i class="hidden-spoken">Help</i></button>\n<div class="helpertext" role="tooltip">\n<div class="popover-title"></div>\n<div class="popover-content">\n    <p class="text-legal cvc-cc">\n        <img ng-src="images/{{newValI}}.png" alt="{{newValIAlt}}">\n    </p>\n</div>\n</div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html",'<div class="hourpicker">\n    <div class="dropdown-width">\n        <div ng-model="showlist" class="select2-container topDropDownWidth" ng-class="{\'select2-dropdown-open select2-container-active\': showlist}" >\n            <a class="select2-choice" href="javascript:void(0)" id="customSelect" ng-keydown="selectOption(selectPrevNextValue($event,options,selectedOption))" att-accessibility-click="13" ng-click="showDropdown()">\n                <span class="select2-chosen">{{selectedOption}}</span>\n                <span class="select2-arrow"><b></b></span>\n            </a>\n        </div>             \n        <div class="select2-display-none select2-with-searchbox select2-drop-active show-search resultTopWidth" ng-show="showlist">       \n        <ul class="select2-results resultTopMargin" >                       \n            <li  ng-model="ListType" ng-repeat="option in options" att-accessibility-click="13" ng-click="selectOption(option,$index)" class="select2-results-dept-0 select2-result select2-result-selectable"><div class="select2-result-label"><span >{{option}}</span></div></li>                        \n        </ul>\n        </div>\n    </div>\n    <div ng-show="showDaysSelector" class="customdays-width">\n        <div att-divider-lines class="divider-margin-f"></div>  \n        <div class="col-md-3 fromto-margin">\n            <div>From</div> <br>\n            <div>To</div>\n        </div>\n        <div ng-repeat="day in days">\n            <div class="col-md-3 col-md-days">\n                <div  class="col-md-1 daysselect-margin">\n                    <input type="checkbox" ng-model="daysList[day]" title="Day selection {{$index}}" att-checkbox ng-change="addSelectedValue(day)">    \n                </div>\n                <span>{{day}}</span><br>\n                \n                <div class="dropDownMarginBottom">\n                    <div class="select2-container topDropDownWidth" ng-class="{\'select2-dropdown-open select2-container-active\': FrtimeListDay[day]}" >\n                        <a class="select2-choice selectDropDown" href="javascript:void(0)" tabindex="{{daysList[day] ? \'0\' : \'-1\'}}" att-accessibility-click="13" ng-click="daysList[day] && showfromDayDropdown(day)" ng-class="{\'select2-chosen-disabled\':!daysList[day]}"  ng-keydown="daysList[day] && selectFromDayOption(day , selectPrevNextValue($event,fromtime,selectedFromOption[day]));daysList[day] && addSelectedValue(day);">\n                            <span class="select2-chosen dropDownMarginRight" >{{selectedFromOption[day]}} <i ng-if="daysList[day]" ng-class="FrtimeListDay[day] ? \'icon-dropdown-up\' : \'icon-dropdown-down\'"></i></span>\n                        </a>\n                    </div>             \n                    \n                    <div class="select2-display-none select2-with-searchbox select2-drop-active show-search resultFromDropDown"  ng-show="FrtimeListDay[day]">       \n                    <ul class="select2-results resultTopMargin" >                       \n                        <li ng-click="selectFromDayOption(day,time.value);addSelectedValue(day);" ng-repeat="time in fromtime"  class="select2-results-dept-0 select2-result select2-result-selectable"><div class="select2-result-label" ng-class="{\'selectedItemInDropDown\': (time.value==selectedFromOption[day])}"><span >{{time.value}}</span></div></li>                        \n                    </ul>\n                    </div>\n                </div>\n                \n                <div class="dropDownMarginBottom">\n                    <div class="select2-container topDropDownWidth" ng-class="{\'select2-dropdown-open select2-container-active\': TotimeListDay[day]}" >\n                        <a class="select2-choice selectDropDown" href="javascript:void(0)" tabindex="{{daysList[day] ? \'0\' : \'-1\'}}" att-accessibility-click="13" ng-click="daysList[day] && showtoDayDropdown(day)" ng-class="{\'select2-chosen-disabled\':!daysList[day], \'selectDropDown-error\':daysList[day] && showToTimeErrorDay[day]}"  ng-keydown="daysList[day] && selectToDayOption(day , selectPrevNextValue($event,totime,selectedToOption[day]));daysList[day] && addSelectedValue(day);">\n                            <span class="select2-chosen dropDownMarginRight">{{selectedToOption[day]}} <i ng-if="daysList[day]" ng-class="TotimeListDay[day] ? \'icon-dropdown-up\' : \'icon-dropdown-down\'" ></i></span>\n                        </a>\n                    </div>\n                    \n                    <div class="select2-display-none select2-with-searchbox select2-drop-active show-search resultToDropDown" ng-show="TotimeListDay[day]">       \n                    <ul class="select2-results resultTopMargin" >                       \n                        <li ng-click="selectToDayOption(day,time.value);addSelectedValue(day);" ng-repeat="time in totime"  class="select2-results-dept-0 select2-result select2-result-selectable"><div class="select2-result-label" ng-class="{\'selectedItemInDropDown\': (time.value==selectedToOption[day])}"><span >{{time.value}}</span></div></li>                        \n                    </ul>\n                    </div>\n                </div>\n            </div>  \n        </div>    \n        <div att-divider-lines class="divider-margin-s"></div>\n    </div>\n    <div ng-transclude></div>\n</div>');
-}]),angular.module("app/scripts/ng_js_att_tpls/links/readMore.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/links/readMore.html",'<div>\n    <div ng-bind-html="textToDisplay" ng-class="{\'att--readMore\': readFlag, \'att--readLess\': !readFlag}" ng-style="readLinkStyle"></div>\n    <span class="att--readmore__link" ng-show="readMoreLink">… <a href="javascript:void(0);" ng-click="readMore()" att-accessbility-click="32,13">Read More</a>\n    </span>\n</div>\n<span class="att--readless__link" ng-show="readLessLink">\n    <a href="javascript:void(0);" ng-click="readLess()" att-accessbility-click="32,13">Read Less</a>\n</span>')}]),angular.module("app/scripts/ng_js_att_tpls/loading/loading.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/loading/loading.html",'<div data-progress="{{progressStatus}}" class="{{colorClass}}" ng-class="{\'att-loading-count\':icon == \'count\',\'loading--small\':icon == \'small\',\'loading\': icon != \'count\'}" alt="Loading">\n	<div class="att-loading-circle" ng-if="icon == \'count\'">\n		<div class="att-loading-circle__mask att-loading-circle__full">\n			<div class="att-loading-circle__fill"></div>\n		</div>\n		<div class="att-loading-circle__mask att-loading-circle__half">\n			<div class="att-loading-circle__fill"></div>\n			<div class="att-loading-circle__fill att-loading-circle__fix"></div>\n		</div>\n	</div>\n	<div ng-class="{\'att-loading-inset\':icon == \'count\',\'loading__inside\':icon != \'count\'}"><div class="att-loading-inset__percentage" ng-if="icon == \'count\'" alt="Loading with Count"></div></div>\n</div>\n\n')}]),angular.module("app/scripts/ng_js_att_tpls/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/modal/backdrop.html",'<div class="overlayed" ng-class="{show: animate}" \n'+"     ng-style=\"{'z-index': 2000 + index*10,'overflow':'scroll'}\">         \n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/modal/tabbedItem.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/modal/tabbedItem.html",'<div>\n    <ul class="tabs_overlay">\n        <li ng-repeat="item in items" class="tabs_overlay__item two__item" ng-class="{\'active\':isActiveTab($index)}" ng-click="clickTab($index)">\n            <i class="{{item.iconClass}}"></i>\n            {{item.title}} ({{item.number}})\n            <a class="viewLink" att-link>Show</a>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html",'<div>\n    <ul class="tabs_overlay">\n        <li ng-repeat="item in items" class="tabs_overlay__item two__item" ng-class="{\'active\':isActiveTab($index)}" ng-click="clickTab($index)">\n            <i class="{{item.iconClass}}"></i>\n            {{item.title}} ({{item.number}})\n            <a class="viewLink" att-link>Show</a>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/modal/window.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/modal/window.html",'<div tabindex="-1" role="dialog" att-element-focus="focusModalFlag" class="modals {{ windowClass }}" ng-class="{show: animate}" \n     ng-style="{\'z-index\': 2010 + index*10}"  ng-click="close($event)" ng-transclude>         \n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/pagination/pagination.html",'<div class="pager">\n    <a tabindex="0" href="javascript:void(0)" class="pager__item--prev" att-accessibility-click="13,32" ng-click="prev($event)" ng-if="currentPage > 1"><i class="icon-arrow-left"></i> Previous</a>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item pager__item--link" ng-if="totalPages > 7 && currentPage > 3" att-accessibility-click="13,32" ng-click="selectPage(1, $event)">1</a>\n    <span class="pager__item" ng-if="totalPages > 7 && currentPage > 3">...</span>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item pager__item--link" att-element-focus="isFocused(page)" ng-repeat="page in pages" ng-class="{\'pager__item--active\': checkSelectedPage(page)}" att-accessibility-click="13,32" ng-click="selectPage(page, $event)">{{page}}</a>\n    <span class="pager__item" ng-if="totalPages > 7 && currentPage < totalPages - 2 && showInput !== true">...</span>\n    <span ng-show="totalPages > 7 && showInput === true"><input class="pager__item--input" type="text" placeholder="..." maxlength="2" ng-model="currentPage" aria-label="Current page count"/></span>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item pager__item--link" ng-if="totalPages > 7 && currentPage < totalPages - 2" att-accessibility-click="13,32" ng-click="selectPage(totalPages, $event)">{{totalPages}}</a>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item--next" att-accessibility-click="13,32" ng-click="next($event)" ng-if="currentPage < totalPages">Next <i class="icon-arrow-right"></i></a>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/paneSelector/innerPane.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/paneSelector/innerPane.html","<div class='inner-pane' ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html","<div class='pane-group' ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/paneSelector/sidePane.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/paneSelector/sidePane.html","<div class='side-pane' ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html","<div class=\"att-tooltip \" \n     ng-class=\"{ 'att-tooltip--on': isOpen, \n                'att-tooltip--dark att-tooltip--dark--hover':stylett=='dark', \n                'att-tooltip--light att-tooltip--light--hover':stylett=='light',\n                'att-tooltip--left':placement=='left', \n                'att-tooltip--above':placement=='above', \n                'att-tooltip--right':placement=='right', \n                'att-tooltip--below':placement=='below'}\" \n    ng-bind-html=\"content | unsafe\" ></div>")}]),angular.module("app/scripts/ng_js_att_tpls/popOvers/popOvers.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/popOvers/popOvers.html","<div class=\"att-popover popover-demo\" ng-style=\"{backgroundColor:popOverStyle}\"\n     ng-class=\"{'att-tooltip--dark':popOverStyle==='grey',\n                'att-pop-over--left':popOverPlacement==='left', \n                'att-pop-over--above':popOverPlacement==='above', \n                'att-pop-over--right':popOverPlacement==='right'}\" \n    style='position: absolute; max-width: 490px;'>\n    <div class=\"pop-over-caret\"\n         ng-class=\"{'pop-over-caret-border--left':popOverPlacement==='left', \n                'pop-over-caret-border--above':popOverPlacement==='above', \n                'pop-over-caret-border--right':popOverPlacement==='right', \n                'pop-over-caret-border--below':popOverPlacement==='below'}\">\n    </div>\n    <div class=\"pop-over-caret\" ng-style=\"popOverPlacement=='below' && {borderBottom:'6px solid ' +popOverStyle}||popOverPlacement=='left' && {borderLeft:'6px solid ' +popOverStyle}||popOverPlacement=='right' && {borderRight:'6px solid ' +popOverStyle}||popOverPlacement=='above' && {borderTop:'6px solid ' +popOverStyle}\"\n         ng-class=\"{'pop-over-caret--left':popOverPlacement==='left', \n                'pop-over-caret--above':popOverPlacement==='above', \n                'pop-over-caret--right':popOverPlacement==='right', \n                'pop-over-caret--below':popOverPlacement==='below'}\"></div>\n    \n    <div class=\"att-popover-content\">\n"+'	<a ng-if="closeable" href="javascript:void(0)" class="icon-close att-popover__close" ng-click="closeMe();$event.preventDefault()"></a>\n        <div class="popover-packages__container" ng-include="content"></div>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/profileCard/addUser.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/profileCard/addUser.html",'<div  class="col-md-9 profile-card add-user">\n    <div class="atcenter">\n        <div><i class="icon-add"></i></div>\n        <span>add User</span>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/profileCard/profileCard.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/profileCard/profileCard.html",'<div class="col-md-9 profile-card">\n    <div class="top-block">\n       <div class="profile-image">\n            <img ng-if="image" profile-name="{{profile.name}}" ng-src="{{profile.img}}" alt="{{profile.name}}">\n            <span ng-hide="image" class="default-img">{{initials}}</span>\n            <p class="name" tooltip-condition="{{profile.name}}" height="true"></p>\n            <p class="status">\n                <span class="status-icon" ng-class="{\'icon-green\':colorIcon===\'green\',\'icon-red\':colorIcon===\'red\',\'icon-blue\':colorIcon===\'blue\',\'icon-yellow\':colorIcon===\'yellow\'}">   \n                </span>\n                <span>{{profile.state}}<span ng-if="badge" class="status-badge">Admin</span></span>\n            </p>\n        </div>\n    </div>\n    <div class="bottom-block">\n         <div class="profile-details">\n            <label>Username</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.userName}}">{{profile.userName}}</p>\n            <label>Email</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.email}}">{{profile.email}}</p>\n            <label>Role</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.role}}">{{profile.role}}</p>\n            <label>Last Login</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.lastLogin}}">{{profile.lastLogin}}</p>\n         </div>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/progressBars/progressBars.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/progressBars/progressBars.html",'<div class="att-progress">\n    <div class="att-progress-value">&nbsp;</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html",'<div class="scroll-bar" style="position: absolute">\n    <div class="scroll-thumb" style="position: absolute; overflow: hidden"></div>\n</div>\n<div class="prev icons-list" data-size="medium" ng-show="navigation && prevAvailable" ng-style="{height: scrollbarAxis === \'x\' && position.height + \'px\'}">\n    <a href="javascript:void(0);" ng-click="customScroll(false)" aria-label="Scroll" aria-hidden="true">\n        <i ng-class="{\'icon-chevron-up\': (scrollbarAxis === \'y\'), \'icon-chevron-left\': (scrollbarAxis === \'x\')}"></i>\n    </a>\n</div>\n<div class="scroll-viewport" ng-style="{height: (scrollbarAxis === \'x\' && position.height + \'px\') || viewportHeight, width: viewportWidth}" style="position: relative; overflow: hidden">\n    <div class="scroll-overview" style="position: absolute; display: table; width: 100%" att-position="position" ng-transclude></div>\n</div>\n<div class=\'next icons-list\' data-size="medium" ng-show="navigation && nextAvailable" ng-style="{height: scrollbarAxis === \'x\' && position.height + \'px\'}">\n    <a href="javascript:void(0);" ng-click="customScroll(true)" aria-label="Scroll" aria-hidden="true">\n'+"        <i ng-class=\"{'icon-chevron-down': (scrollbarAxis === 'y'), 'icon-chevron-right': (scrollbarAxis === 'x')}\"></i>\n    </a>\n</div>\n")}]),angular.module("app/scripts/ng_js_att_tpls/search/search.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/search/search.html",'<div class="select2-container show-search" ng-class="{\'select2-dropdown-open\': (showlist && !isDisabled),\'select2-container-disabled\':isDisabled, \'select2-container-active\': isact}" ng-init="isact=false;" style="width: 100%;">\n    <a href="javascript:void(0)" class="select2-choice needsclick" tabindex="0" ng-click="showDropdown()" ng-class="{\'select2-chosen-disabled\':isDisabled}" role="combobox" aria-expanded="{{showlist}}" aria-owns="inList" aria-label="{{selectedOption}} selected" ng-focus="isact=true;" ng-blur="isact=false;">\n        <span class="select2-chosen needsclick" aria-hidden = "true">{{selectedOption}}</span>\n        <abbr class="select2-search-choice-close needsclick"></abbr>\n        <span class="select2-arrow needsclick" role="presentation">\n            <b role="presentation" class="needsclick"></b>\n        </span>\n    </a>    \n    <input class="select2-focusser select2-offscreen"            \n           tabindex="-1" \n           type="text" \n           aria-hidden="true" \n           title="hidden"           \n           aria-haspopup="true"           \n           role="button">    \n</div>\n\n<div class="select2-drop select2-with-searchbox select2-drop-auto-width select2-drop-active" ng-class="{\'select2-display-none\':(!showlist || isDisabled)}" style="width:100%;z-index: 10">\n    <div class="select2-search">\n        <label ng-if="!noFilter" class="select2-offscreen" aria-label="Inline Search Field" aria-hidden="true">Inline Search Field</label>\n        <input ng-if="!noFilter" ng-model="title" aria-label="title" typeahead="c.title for c in cName | filter:$viewValue:startsWith" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="select2-input" aria-autocomplete="list" placeholder="">\n    </div>\n    <ul id="inList" class="select2-results" role="listbox">\n        <li ng-show="filteredName.length === 0" class="select2-no-results" tabindex="-1">No matches found</li>\n        <li class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-show="selectMsg && filteredName.length > 0" ng-click="selectOption(selectMsg, \'-1\')" ng-class="{\'select2-result-current\': selectedOption === selectMsg, \'hovstyle\': selectedIndex === -1}" ng-mouseover="hoverIn(-1)" aria-label="{{selectMsg}}" tabindex="-1">\n            <div ng-if="startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n            <div ng-if="!startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li role="menuitem" ng-if="startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | startsWith:title:item)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)" aria-label="{{item.title}}" tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li role="menuitem" ng-if="!startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | filter:title)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)" aria-label="{{item.title}}" tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/select/select.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/select/select.html",'<div class="select2-container show-search" ng-class="{\'select2-dropdown-open\': (showlist && !isDisabled),\'select2-container-disabled\': isDisabled, \'select2-container-active\': isact}" ng-init="isact=false;">\n    <span class="select2-choice needsclick" tabindex="{{isDisabled ? -1 : 0}}" ng-click="showDropdown()" ng-class="{\'select2-chosen-disabled\':isDisabled}" role="combobox" aria-expanded="{{showlist}}" aria-owns="inList" aria-label="{{selectedOption}} selected" ng-focus="isact=true;" ng-blur="isact=false;">\n        <span class="select2-chosen needsclick" aria-hidden="true">{{selectedOption}}</span>\n        <abbr class="select2-search-choice-close needsclick"></abbr>\n        <span class="select2-arrow needsclick" role="presentation">\n            <b role="presentation" class="needsclick"></b>\n        </span>\n    </span>    \n    <input class="select2-focusser select2-offscreen"            \n           tabindex="-1" \n           type="text" \n           aria-hidden="true" \n           title="hidden"           \n           aria-haspopup="true"           \n           role="button">    \n</div>\n\n<div class="select2-drop select2-with-searchbox select2-drop-auto-width select2-drop-active" ng-class="{\'select2-display-none\':(!showlist || isDisabled)}" style="width:100%;z-index: 10">\n    <div class="select2-search">\n        <label ng-if="!noFilter" class="select2-offscreen" aria-label="Inline Search Field" aria-hidden="true">Inline Search Field</label>\n        <input ng-if="!noFilter" ng-model="title" aria-label="title" typeahead="c.title for c in cName | filter:$viewValue:startsWith" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="select2-input" aria-autocomplete="list" placeholder="">\n    </div>\n    <ul id="inList" class="select2-results" role="listbox">\n        <li ng-if="!noFilter" ng-show="filteredName.length === 0" class="select2-no-results" tabindex="-1">No matches found</li>\n        <li ng-if="!noFilter" class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-show="selectMsg && filteredName.length > 0" ng-click="selectOption(selectMsg, \'-1\')" ng-class="{\'select2-result-current\': selectedOption === selectMsg, \'hovstyle\': selectedIndex === -1}" ng-mouseover="hoverIn(-1)" aria-label="{{selectMsg}}" tabindex="-1">\n            <div ng-if="startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n            <div ng-if="!startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li  role="menuitem"  ng-if="startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | startsWith:title:item)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)"  tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li role="menuitem" ng-if="!startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | filter:title)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)"  tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/select/textDropdown.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/select/textDropdown.html",'<div tabindex="0" class="text-dropdown">\n	<div class="dropdown" ng-class="{\'not-visible\': isActionsShown}" ng-click="toggle()">\n		<span class="action--selected" ng-bind="currentAction"></span>\n		<i ng-class="isActionsShown ? \'icon-dropdown-up\' : \'icon-dropdown-down\'"></i>\n	</div>\n	<ul ng-class="isActionsShown ? \'actionsOpened\' : \'actionsClosed\'" ng-show="isActionsShown">\n		<li ng-class="{\'highlight\': selectedIndex==$index}" ng-repeat="action in actions track by $index" ng-click="chooseAction($event, action, $index)" ng-mouseover="hoverIn($index)">{{action}}<i ng-class="{\'icon-included-checkmark\': isCurrentAction(action)}" att-accessibility-click="13,32"></i></li>\n	</ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/slider/maxContent.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/slider/maxContent.html",'<div class="att-slider__label att-slider__label--max att-slider__label--below" ng-transclude></div>')}]),angular.module("app/scripts/ng_js_att_tpls/slider/minContent.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/slider/minContent.html",'<div class="att-slider__label att-slider__label--min att-slider__label--below" ng-transclude></div>')}]),angular.module("app/scripts/ng_js_att_tpls/slider/slider.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/slider/slider.html",'<div class="att-slider" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)">\n    <div class="att-slider__track">\n        <div class="att-slider__range att-slider__range--disabled" ng-style="disabledStyle"></div>\n        <div class="att-slider__range" ng-style="rangeStyle"></div>\n    </div>\n    <div class="att-slider__handles-container">\n       <div role="menuitem" aria-label="{{ngModelSingle}}" class="att-slider__handle" ng-style="handleStyle" ng-mousedown="mouseDown($event,\'ngModelSingle\')" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)" tabindex="0" ng-keydown="keyDown($event,\'ngModelSingle\')"></div>\n       <div role="menuitem" aria-label="Minimum Value- {{ngModelLow}}" class="att-slider__handle" ng-style="minHandleStyle" ng-mousedown="mouseDown($event,\'ngModelLow\')" ng-focus="focus($event,\'ngModelLow\')" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)" tabindex="0" ng-keyup="keyUp($event,\'ngModelLow\')" ng-keydown="keyDown($event,\'ngModelLow\')"></div>\n       <div role="menuitem" aria-label="Maximum Value- {{ngModelHigh}}" class="att-slider__handle" ng-style="maxHandleStyle" ng-mousedown="mouseDown($event,\'ngModelHigh\')" ng-focus="focus($event,\'ngModelHigh\')" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)" tabindex="0" ng-keyup="keyUp($event,\'ngModelHigh\')" ng-keydown="keyDown($event,\'ngModelHigh\')"></div>\n    </div>\n    <div ng-transclude></div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html",'<div class=" btn-group" \n     ng-class="{\'buttons-dropdown--large\':!isSmall, \n                 \'buttons-dropdown--small\':isSmall, \n                 \'action-dropdown\':(isActionDropdown), \n                 \'open\':isDropDownOpen}">\n    <a tabindex="0" href="javascript:void(0)" class="button btn buttons-dropdown__split" \n       ng-class="{\'button--primary\':(btnType==undefined || btnType==\'primary\'), \n                   \'button--secondary\':btnType==\'secondary\', \n                   \'button--disabled\':btnType==\'disabled\', \n                   \'button--small\':isSmall}" \n       ng-if="!isActionDropdown"\n       ng-click="btnType===\'disabled\'?undefined:clickFxn()" att-accessibility-click="13,32">{{btnText}}</a>\n    <a tabindex="0" href="javascript:void(0)" role="button" aria-label="Toggle Dropdown" aria-haspopup="true" class="button buttons-dropdown__drop dropdown-toggle" \n       ng-class="{\'button--primary\':(btnType==undefined || btnType==\'primary\'), \n               \'button--secondary\':btnType==\'secondary\', \n               \'button--disabled\':btnType==\'disabled\', \n               \'button--small\':isSmall}" ng-click="toggleDropdown()" att-accessibility-click="13,32">{{toggleTitle}} </a>\n    <ul class="dropdown-menu" ng-class="{\'align-right\':multiselect ===true}" aria-expanded="{{isDropDownOpen}}" ng-click="hideDropdown()" role="menu" ng-transclude></ul>\n</div>  ')}]),angular.module("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html",'<li role="menuitem" att-element-focus="sFlag" tabindex="0" ng-transclude></li>')}]),angular.module("app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html","<div class='split-icon-button-container'>\n\n	<div class='split-icon-button' ng-class=\"{'icon-with-chevron': isRight && !isMiddle && !isLeftNextDropdown && !isNextToDropDown, 'split-icon-button-middle':isMiddle, 'split-icon-button-right':isRight, 'split-icon-button-left':isLeft, 'split-icon-button-left-dropdown': isLeftNextDropdown ,'split-icon-button-next-dropdown': isNextToDropDown,'split-icon-button-dropdown': isDropDownOpen,'split-icon-button-hover':isIconHovered || isDropDownOpen}\" ng-mouseover='isIconHovered = true;' ng-mouseleave='isIconHovered = false;' tabindex=\"-1\" att-accessibility-click=\"13,32\" ng-click='dropDownClicked();'>\n	        <a class='{{icon}}' title='{{iconTitle}}' tabindex=\"0\"></a>\n	        <i ng-if=\"isRight && !isMiddle && !isLeftNextDropdown && !isNextToDropDown\" \n	        	ng-class=\"isDropDownOpen ? 'icon-dropdown-up' : 'icon-dropdown-down'\"> </i>\n	</div> \n\n	 <ul ng-if='isDropdown' class='dropdown-menu {{dropDownId}}' ng-show='\n	 isDropDownOpen' ng-click='toggleDropdown(false)' role=\"presentation\" ng-transclude>\n	 </ul>\n\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html","<div>\n	<div ng-if='isLeftLineShown' dir-type='{{iconStateConstants.DIR_TYPE.LEFT}}' expandable-line></div>\n	<div ng-click='clickHandler()' att-split-icon icon='{{icon}}' title='{{title}}' dir-type='{{iconStateConstants.DIR_TYPE.BUTTON}}' hover-watch='isHovered' drop-down-watch='dropDownWatch' drop-down-id='{{dropDownId}}'>\n		<div ng-transclude>\n		</div>\n	</div>\n	<div ng-if='isRightLineShown' dir-type='{{iconStateConstants.DIR_TYPE.RIGHT}}' expandable-line></div>\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html","<div ng-transclude>\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html",'<span ng-class="mainSliderClass">\n    <table>\n        <tr>\n            <td>\n                <div class="jslider-bg">\n                    <i class="l"></i>\n                    <i class="r"></i>\n                    <i class="v" ng-class="{\'step-slider-green\':sliderColor == COLORS.GREEN, \'step-slider-blue\': sliderColor == COLORS.BLUE_HIGHLIGHT, \'step-slider-magenta\': sliderColor == COLORS.MAGENTA, \'step-slider-gold\': sliderColor == COLORS.GOLD, \'step-slider-purple\': sliderColor == COLORS.PURPLE, \'step-slider-dark-blue\': sliderColor == COLORS.DARK_BLUE, \'step-slider-regular\': sliderColor == COLORS.REGULAR, \'step-slider-white\': sliderColor == COLORS.WHITE, \'cutoff-slider\': isCutOffSlider}"></i>\n                </div>\n                <div class="jslider-pointer" id="left-pointer"></div>\n                <div class="jslider-pointer jslider-pointer-to" ng-class="{\'step-slider-green\':sliderColor == COLORS.GREEN, \'step-slider-blue\': sliderColor == COLORS.BLUE_HIGHLIGHT, \'step-slider-magenta\': sliderColor == COLORS.MAGENTA, \'step-slider-gold\': sliderColor == COLORS.GOLD, \'step-slider-purple\': sliderColor == COLORS.PURPLE, \'step-slider-dark-blue\': sliderColor == COLORS.DARK_BLUE, \'step-slider-regular\': sliderColor == COLORS.REGULAR, \'step-slider-white\':sliderColor == COLORS.WHITE ,\'cutoff-slider\': isCutOffSlider}"></div>\n                <div class="jslider-label"><span ng-bind="from"></span><span ng-bind="options.dimension"></span></div>\n                <div class="jslider-label jslider-label-to"><span ng-bind="toStr"></span><span ng-bind="endDimension"></span></div>\n                <div class="jslider-value" id="jslider-value-left"><span></span>{{options.dimension}}</div>\n                <div class="jslider-value jslider-value-to"><span></span>{{toolTipDimension}}</div>\n                <div class="jslider-scale" ng-class="{\'show-dividers\': showDividers, \'cutoff-slider-dividers\':isCutOffSlider}">\n                </div>\n                <div class="jslider-cutoff">\n                    <div class="jslider-label jslider-label-cutoff">\n                        <span ng-bind="cutOffVal"></span>\n                    </div>\n                </div>\n            </td>\n        </tr>\n    </table>\n</span>\n')}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/step-tracker.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/steptracker/step-tracker.html",'<div class="steptracker1">\n    <div class="steptracker-bg">\n        <div tabindex="0" ng-click="stepclick($event, $index);" att-accessibility-click="13,23" class="steptracker-track size-onethird" ng-repeat="step in sdata"\n             ng-style="set_width($index)"\n             ng-class="{\'last\':laststep($index),\'done\':donesteps($index),\'active\':activestep($index), \'incomplete\': isIncomplete($index), \'disabled\': disableClick}">\n            <div class="circle">{{($index) + 1}}<span>{{step.title}}</span></div>\n            <div ng-if="!laststep($index)" class="track"></div>\n        </div>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/step.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/steptracker/step.html",'<div class="steptracker1">\n    <div class="steptracker-bg">\n        <div class="steptracker-track size-onethird" \n             ng-class="{\'last\':laststep($index),\'done\':donesteps($index),\'active\':activestep($index)}">\n            <div class="circle" tabindex="0" \n                 ng-click="stepclick($event, $index);" \n                 att-accessibility-click="13,23">{{($index) + 1}}<span>{{step.title}}</span></div>\n            <div ng-if="!laststep($index)" class="track"></div>\n        </div>\n    </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/timeline.html",[]).run(["$templateCache",function(a){
-a.put("app/scripts/ng_js_att_tpls/steptracker/timeline.html","<div class='att-timeline'>\n	<div timeline-dot order='0' title='{{steps[0].title}}' description='{{steps[0].description}}' by='{{steps[0].by}}' date='{{steps[0].date}}' type='{{steps[0].type}}'></div>\n\n	<div ng-repeat=\"m in middleSteps track by $index\">\n		<div timeline-bar order='{{$index}}'></div>\n		<div timeline-dot order='{{$index + 1}}' title='{{m.title}}' description='{{m.description}}' by='{{m.by}}' date='{{m.date}}' type='{{m.type}}'>\n		</div>\n	</div>\n\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/timelineBar.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/steptracker/timelineBar.html","<div class='timeline-bar'>\n	<div class='progress-bar' ng-class=\"{'completed-color':isCompleted,'cancelled-color':isCancelled,'alert-color':isAlert}\">\n	</div>\n	<hr></hr>\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/timelineDot.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/steptracker/timelineDot.html","<div class='timeline-dot'>\n\n	<div class='bigger-circle' ng-class=\"{'completed-color':isCompleted,'cancelled-color':isCancelled,'alert-color':isAlert}\">\n	</div>\n\n	<div class='inactive-circle'>\n	</div>\n\n	<div class='expandable-circle' ng-class=\"{'completed-color':isCompleted,'cancelled-color':isCancelled,'alert-color':isAlert}\">\n	</div>\n\n	<div ng-class=\"{'below-info-box':isBelowInfoBoxShown, 'above-info-box': !isBelowInfoBoxShown}\" tabindex=\"0\">\n		\n		<div ng-if='isBelowInfoBoxShown' class='vertical-line'>\n		</div>\n\n		<div class='info-container' ng-init='isContentShown=false'>\n			<div ng-class=\"{'current-step-title':isCurrentStep, 'title':!isCurrentStep,'completed-color-text':isCompleted,'cancelled-color-text':isCancelled,'alert-color-text':isAlert, 'inactive-color-text':isInactive}\" ng-mouseover='titleMouseover(1)' ng-mouseleave='titleMouseleave()' ng-bind='title' ></div>\n			<div class='content'>\n				<div class='description' ng-bind='description'></div>\n				<div class='submitter' ng-bind='by'></div>\n			</div>\n			<div class='date' ng-mouseover='titleMouseover(2)' ng-mouseleave='titleMouseleave()' ng-bind='date'></div>\n		</div>\n\n		<div ng-if='!isBelowInfoBoxShown' class='vertical-line'>\n		</div>\n	</div>\n\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/table/attTable.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/table/attTable.html",'<table class="tablesorter tablesorter-default" ng-transclude></table>\n')}]),angular.module("app/scripts/ng_js_att_tpls/table/attTableBody.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/table/attTableBody.html","<td ng-transclude></td>\n")}]),angular.module("app/scripts/ng_js_att_tpls/table/attTableHeader.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/table/attTableHeader.html","<th role=\"button\" aria-label=\"column header {{headerName}} {{sortable !== 'false' && '' || 'sortable'}} {{sortPattern !== 'null' && '' || sortPattern}}\" tabindex=\"{{sortable !== 'false' && '0' || '-1'}}\" class=\"tablesorter-header\" ng-class=\"{'tablesorter-headerAsc': sortPattern === 'asc', 'tablesorter-headerDesc': sortPattern === 'desc', 'tablesort-sortable': sortable !== 'false', 'sorter-false': sortable === 'false'}\" att-accessibility-click=\"13,32\" ng-click=\"(sortable !== 'false') && sort();\"><div class=\"tablesorter-header-inner\" ng-transclude></div></th>")}]),angular.module("app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html",'<div class="att-table-message">\n   <div class="message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.noMatching">\n      <div class="img-magnify-glass"></div> \n      <div>\n         <div ng-transclude></div>\n      </div>\n   </div>\n   <div class="message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.errorLoading">\n      <div class="img-oops-exclamation" tabindex="0" aria-label="Oops! The information could not load at this time. Please click link to refresh the page."></div> \n      <div>Oops!</div>\n      <div>The information could not load at this time.</div>\n      <div>Please <a href="javascript:void(0)" ng-click="refreshAction($event)">refresh the page</a>\n      </div>\n   </div>\n   <div class="message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.magnifySearch">\n      <div class="img-magnify-glass"></div>\n      <div>\n         <p class="title" tabindex="0">Please input values to <br/> begin your search.</p>\n      </div>\n   </div>\n   <div class="message loading-message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.isLoading">\n      <div class="img-loading-dots"></div>\n      <div ng-transclude></div>\n   </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html",'<div class="att-user-message">\n  <div ng-class="type==messageConstants.USER_MESSAGE_TYPES.error && trigger ? \'message-wrapper-error\' : \'hidden\'">\n      <div class="message-icon-error"> <i class="icon-info-alert"></i> </div>\n\n      <div class="message-body-wrapper">\n        <div class="message-title-error" ng-if="thetitle && thetitle.length > 0"> <span ng-bind="thetitle" tabindex="0" aria-label="{{thetitle}}"></span> </div>\n        <div class="message-msg" ng-bind="message" ng-if="message && message.length > 0" tabindex="0"></div>\n        <div class="message-bottom">\n           <div ng-transclude></div>\n        </div>\n      </div>\n\n   </div>\n  <div ng-class="type==messageConstants.USER_MESSAGE_TYPES.success && trigger ? \'message-wrapper-success\' : \'hidden\'">\n      <div class="message-icon-success"> <i class="icon-included-checkmark"></i></div>\n\n      <div class="message-body-wrapper">\n        <div class="message-title-success" ng-if="thetitle && thetitle.length > 0" >\n          <span ng-bind="thetitle" tabindex="0" aria-label="{{thetitle}}"></span>\n        </div>\n        <div class="message-msg" ng-bind="message" ng-if="message && message.length > 0" tabindex="0"></div>\n        <div class="message-bottom">\n           <div ng-transclude></div>\n        </div>\n      </div>\n\n   </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/floatingTabs.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tabs/floatingTabs.html","<ul ng-class=\"{'tabsbid': size === 'large', 'tabsbid--small': size === 'small'}\">\n <li ng-repeat=\"tab in tabs\" ng-class=\"{'tabsbid__item tabsbid__item--active': isActiveTab(tab.url), 'tabsbid__item': !isActiveTab(tab.url)}\" ng-click=\"onClickTab(tab)\">\n"+'        <a class="tabsbid__item-link" href="{{tab.url}}" tabindex="0" att-accessibility-click="32,13">{{tab.title}}</a>\n  </li>\n</ul>')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/genericTabs.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tabs/genericTabs.html","<ul ng-class=\"{'tabsbid': size === 'large', 'tabsbid--small': size === 'small'}\">\n    <li ng-repeat=\"tab in tabs\" ng-class=\"{'tabsbid__item tabsbid__item--active': isActive(tab.id), 'tabsbid__item': !isActive(tab.id),'tabs__item--active': isActive(tab.id)}\" ng-click=\"clickTab(tab)\">\n"+'		<a class="tabsbid__item-link" href="{{tab.url}}" tabindex="0" att-accessibility-click="32,13">{{tab.title}}</a>\n    </li>\n</ul>\n')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/menuTab.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tabs/menuTab.html",'<li class="megamenu__item" ng-mouseover="showHoverChild($event)" ng-class="{\'tabs__item--active\': menuItem.active==true && !hoverChild==true}">\n    <span role="menuitem" att-accessibility-click="13,32" tabindex="0" ng-click="showChildren($event);!clickInactive||resetMenu($event)">{{tabName}}</span>\n    <div ng-transclude></div>\n</li>\n')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html",'<div ng-class="{\'megamenu-tabs\': megaMenu,\'submenu-tabs\': !megaMenu}">\n    <ul class="megamenu__items" role="presentation" ng-transclude>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html",'<div class="simplified-tabs">\n<ul class="simplified-tabs__items" role="tablist">\n    <li ng-repeat="tab in tabs" role="tab" class="simplified-tabs__item" ng-class="{\'tabs__item--active\': isActive(tab.id)}" ng-click="clickTab(tab)" tabindex="0" att-accessibility-click="32,13">{{tab.title}}</li>\n    <li class="tabs__pointer"></li>\n</ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/submenuTab.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tabs/submenuTab.html",'<li class="tabsbid__item megamenu__item" ng-class="{\'subMenuHover\': menuItem.active==true}">\n<a ng-href="{{tabUrl}}" role="menuitem" ng-if="subMenu === true" ng-mouseover="!subMenu || showChildren($event)" ng-focus="!subMenu ||showChildren($event)" tabindex="{{subMenu==\'true\'?0:-1}}" ng-click="!subMenu ||showMenuClick($event) ; subMenu ||showSubMenuClick($event)" att-accessibility-click="13,32">{{tabName}}</a>\n<a  ng-href="{{tabUrl}}" role="menuitem" ng-if="!menuItem.leafNode && subMenu !== true" ng-mouseover="!subMenu || showChildren($event)" ng-focus="!subMenu ||showChildren($event)" tabindex="{{subMenu==\'true\'?0:-1}}" ng-click="!subMenu ||showMenuClick($event) ; subMenu ||showSubMenuClick($event)" att-accessibility-click="13,32">{{tabName}}</a>\n<span ng-transclude></span>\n</li>\n')}]),angular.module("app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html","<div class=\"tags__item\" \n     ng-class=\"{'tags__item--small':isSmall, \n                 'tags__item--color':isColor, \n                 'tags__item--cloud':!isClosable && !isColor,'active':applyActiveClass}\"\n     ng-if=\"display\" \n     ng-style=\"{borderColor: border_type_borderColor, background: isHighlight?'#bbb':undefined, color: isHighlight?'#444':undefined }\"\n"+'     ng-mousedown="activeHighlight(true)" role="presentation" ng-mouseup="activeHighlight(false)">\n    <i class="icon-filter tags__item--icon" ng-if="isIcon">&nbsp;</i>\n    <i class="tags__item--color-icon" ng-if="isColor" ng-style="{backgroundColor: background_type_backgroundColor, borderColor: background_type_borderColor}"></i>\n    <span class="tags__item--title" role="presentation"  tabindex=0 aria-label="tag" ng-mousedown="activeHighlight(true)" ng-mouseup="activeHighlight(false)" ng-transclude></span>\n    <a href="javascript:void(0)" title="Dismiss Link" class="tags__item--action" ng-click="closeMe();$event.preventDefault()" ng-if="isClosable"\n       ng-style="{color: (isHighlight && \'#444\') || \'#888\' , borderLeft: (isHighlight && \'1px solid #444\')|| \'1px solid #888\' }">\n        <i class="icon-erase">&nbsp;</i>\n    </a>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/toggle/demoToggle.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/toggle/demoToggle.html",'<span ng-transclude></span>\n<div class="att-switch-content" hm-drag = "drag($event)" att-accessibility-click="13,32" ng-click="updateModel($event)" hm-dragstart="alert(\'hello\')" hm-dragend="drag($event)" ng-class="{\'large\' : directiveValue == \'large\'}"  style="-webkit-user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);">\n    <div class="att-switch-onText" ng-style="" ng-class="{\'icon-included-checkmark ico\' : on === undefined,\'large\' : directiveValue == \'large\'}">{{on}}<span class="hidden-spoken">{{directiveValue}} when checked.</span></div>\n    <div class="att-switch-thumb" tabindex="0" title="Toggle switch" role="checkbox"  ng-class="{\'large\' : directiveValue == \'large\'}"></div>\n    <div class="att-switch-offText" ng-class="{\'icon-erase ico\' : on === undefined,\'large\' : directiveValue == \'large\'}">{{off}}<span class="hidden-spoken">{{directiveValue}} when unchecked.</span></div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html",'<div class="typeahead mainContainerOuter">\n    <span class="message">To</span>\n    <div class=\'maincontainer\' ng-click="setFocus()" ng-focus="inputActive=true" ng-class ="{\'typeahed_active\':inputActive || (lineItems.length && inputActive)}">\n        <span tag-badges closable ng-repeat ="lineItem in lineItems track by $index" on-close="theMethodToBeCalled($index)" >{{lineItem}}</span>\n        <input type="text"  focus-me="clickFocus" ng-focus="inputActive=true" ng-model="model" ng-keydown="selected = false; selectionIndex($event)"/><br/> \n    </div>\n    <div ng-hide="!model.length || selected">\n        <div class="filtercontainer list-scrollable" ng-show="( items | filter:model).length">\n            <div  class="item" ng-repeat="item in items| filter:model track by $index"  ng-click="handleSelection(item[titleName],item[subtitle])" att-accessibility-click="13,32" ng-class="{active:isCurrent($index,item[titleName],item[subtitle],( items | filter:model).length)}"ng-mouseenter="setCurrent($index)">\n                <span class="title" >{{item[titleName]}}</span>\n                <span class="subtitle">{{item[subtitle]}}</span>\n            </div>  \n        </div>\n    </div>\n   \n    <div class="textAreaEmailContentDiv">\n        <span class="message">Message</span>\n        <textarea rows="4" cols="50" role="textarea" class="textAreaEmailContent" ng-model="emailMessage">To send \n a text, picture, or video message1 to an AT&T wireless device from your email:my message.</textarea>\n        \n    </div>\n    \n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html","<li>\n    <i ng-class=\"{'icon-tickets-active' : type == 'actual' && id =='Active','icon-tickets-referred' : type == 'actual' && id =='Requested Closed','icon-ticket-regular' : type == 'progress' && id =='In Progress','icon-tickets-contested' : type == 'actual' && id =='Contested','icon-tickets-returned' : type == 'actual' && id =='Deferred','icon-tickets-closed' : type == 'actual' && id =='Ready to Close','icon-tickets-cleared' : type == 'actual' && id =='Cleared'}\"></i>\n    <span ng-transclude></span>\n</li>\n        \n")}]),angular.module("app/scripts/ng_js_att_tpls/videoControls/photoControls.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/videoControls/photoControls.html",'<div>\n    <a title="{{links.prevLink}}" aria-label="Previous Link"  ng-href="{{links.prevLink}}"><i alt="previous" class="icon-arrow-left">&nbsp;</i></a>\n    <span ng-transclude></span>\n    <a title="{{links.nextLink}}" aria-label="Next Link"  ng-href="{{links.nextLink}}"><i alt="next" class="icon-arrow-right">&nbsp;</i></a>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/videoControls/videoControls.html",[]).run(["$templateCache",function(a){a.put("app/scripts/ng_js_att_tpls/videoControls/videoControls.html",'<div class="video-player">\n    <div class="video-player__control video-player__play-button">\n        <a class="video-player__button gigant-play" data-toggle-buttons="icon-play, icon-pause" data-target="i"><i class="icon-play"  alt="Play/Pause Button"></i></a>\n    </div>\n    <div class="video-player__control video-player__track">\n\n        <div class="video-player__track--inner">\n            <div class="video-player__track--loaded" style="width: 75%"></div>\n            <div class="video-player__track--played" style="width: 40%">\n                <div class="att-tooltip att-tooltip--on att-tooltip--dark att-tooltip--above video-player__track-tooltip" ng-transclude></div>\n                <div class="video-player__track-handle"></div>\n            </div>\n        </div>\n    </div>\n    <a class="video-player__time" ng-transclude></a>\n    <div class="video-player__control video-player__volume_icon">\n        <a class="video-player__button" data-toggle-buttons="icon-volume-mute, icon-volume-up" data-target="i"><i class="icon-volume-up" alt="Volume Button"></i></a>\n    </div>\n    <ul class="video-player__control video-player__volume">\n        <li class="video-player__volume-bar video-player__volume-bar--full">&nbsp;</li>\n        <li class="video-player__volume-bar video-player__volume-bar--full">&nbsp;</li>\n        <li class="video-player__volume-bar">&nbsp;</li>\n        <li class="video-player__volume-bar">&nbsp;</li>\n        <li class="video-player__volume-bar">&nbsp;</li>\n    </ul>\n    <div class="video-player__control video-player__toggle-fullscreen-button">\n        <a class="video-player__button" data-toggle-buttons="icon-full-screen, icon-normal-screen" data-target="i"><i class="icon-full-screen" alt="Full Screen Button">&nbsp;</i></a>\n    </div>\n</div>')}]);
-return {}
-})(angular, window);
\ No newline at end of file
+!function(angular,window){return angular.module("att.abs",["att.abs.tpls","att.abs.utilities","att.abs.position","att.abs.transition","att.abs.accordion","att.abs.alert","att.abs.boardStrip","att.abs.breadCrumbs","att.abs.buttons","att.abs.checkbox","att.abs.colorselector","att.abs.datepicker","att.abs.devNotes","att.abs.dividerLines","att.abs.dragdrop","att.abs.drawer","att.abs.message","att.abs.formField","att.abs.hourpicker","att.abs.iconButtons","att.abs.links","att.abs.loading","att.abs.modal","att.abs.pagination","att.abs.paneSelector","att.abs.tooltip","att.abs.popOvers","att.abs.profileCard","att.abs.progressBars","att.abs.radio","att.abs.scrollbar","att.abs.search","att.abs.select","att.abs.slider","att.abs.splitButtonDropdown","att.abs.splitIconButton","att.abs.stepSlider","att.abs.steptracker","att.abs.table","att.abs.tableMessages","att.abs.tabs","att.abs.tagBadges","att.abs.textOverflow","att.abs.toggle","att.abs.treeview","att.abs.typeAhead","att.abs.verticalSteptracker","att.abs.videoControls"]),angular.module("att.abs.tpls",["app/scripts/ng_js_att_tpls/accordion/accordion.html","app/scripts/ng_js_att_tpls/accordion/accordion_alt.html","app/scripts/ng_js_att_tpls/accordion/attAccord.html","app/scripts/ng_js_att_tpls/accordion/attAccordBody.html","app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html","app/scripts/ng_js_att_tpls/alert/alert.html","app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html","app/scripts/ng_js_att_tpls/boardStrip/attBoard.html","app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html","app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html","app/scripts/ng_js_att_tpls/colorselector/colorselector.html","app/scripts/ng_js_att_tpls/datepicker/dateFilter.html","app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html","app/scripts/ng_js_att_tpls/datepicker/datepicker.html","app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html","app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html","app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html","app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html","app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html","app/scripts/ng_js_att_tpls/formField/creditCardImage.html","app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html","app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html","app/scripts/ng_js_att_tpls/links/readMore.html","app/scripts/ng_js_att_tpls/loading/loading.html","app/scripts/ng_js_att_tpls/modal/backdrop.html","app/scripts/ng_js_att_tpls/modal/tabbedItem.html","app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html","app/scripts/ng_js_att_tpls/modal/window.html","app/scripts/ng_js_att_tpls/pagination/pagination.html","app/scripts/ng_js_att_tpls/paneSelector/innerPane.html","app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html","app/scripts/ng_js_att_tpls/paneSelector/sidePane.html","app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html","app/scripts/ng_js_att_tpls/popOvers/popOvers.html","app/scripts/ng_js_att_tpls/profileCard/addUser.html","app/scripts/ng_js_att_tpls/profileCard/profileCard.html","app/scripts/ng_js_att_tpls/progressBars/progressBars.html","app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html","app/scripts/ng_js_att_tpls/search/search.html","app/scripts/ng_js_att_tpls/select/select.html","app/scripts/ng_js_att_tpls/select/textDropdown.html","app/scripts/ng_js_att_tpls/slider/maxContent.html","app/scripts/ng_js_att_tpls/slider/minContent.html","app/scripts/ng_js_att_tpls/slider/slider.html","app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html","app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html","app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html","app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html","app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html","app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html","app/scripts/ng_js_att_tpls/steptracker/step-tracker.html","app/scripts/ng_js_att_tpls/steptracker/step.html","app/scripts/ng_js_att_tpls/steptracker/timeline.html","app/scripts/ng_js_att_tpls/steptracker/timelineBar.html","app/scripts/ng_js_att_tpls/steptracker/timelineDot.html","app/scripts/ng_js_att_tpls/table/attTable.html","app/scripts/ng_js_att_tpls/table/attTableBody.html","app/scripts/ng_js_att_tpls/table/attTableHeader.html","app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html","app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html","app/scripts/ng_js_att_tpls/tabs/floatingTabs.html","app/scripts/ng_js_att_tpls/tabs/genericTabs.html","app/scripts/ng_js_att_tpls/tabs/menuTab.html","app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html","app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html","app/scripts/ng_js_att_tpls/tabs/submenuTab.html","app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html","app/scripts/ng_js_att_tpls/toggle/demoToggle.html","app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html","app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html","app/scripts/ng_js_att_tpls/videoControls/photoControls.html","app/scripts/ng_js_att_tpls/videoControls/videoControls.html"]),angular.module("att.abs.utilities",[]).filter("unsafe",["$sce",function(e){return function(t){return e.trustAsHtml(t)}}]).filter("highlight",function(){function e(e){return e.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(t,n,i){return n&&t?t.replace(new RegExp(e(n),"gi"),'<span class="'+i+'">$&</span>'):t}}).filter("attLimitTo",function(){return function(e,t,n){var i=[],a=t,s=n;return isNaN(s)&&(s=0),i=e&&!isNaN(a)?e.slice(s,s+a):e}}).filter("startsWith",function(){return"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e){return 0===this.indexOf(e)}),function(e,t){if(void 0===t||""===t)return e;var n=[];return angular.forEach(e,function(e){e.title.toLowerCase().startsWith(t.toLowerCase())&&n.push(e)}),n}}).directive("attInputDeny",[function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,i){var a=null;n.$observe("attInputDeny",function(e){e&&(a=new RegExp(e,"g"))}),t.bind("input",function(){var t=i.$viewValue&&i.$viewValue.replace(a,"");t!==i.$viewValue&&(i.$setViewValue(t),i.$render(),e.$apply())})}}}]).directive("attAccessibilityClick",[function(){return{restrict:"A",link:function(e,t,n){var i=[];n.$observe("attAccessibilityClick",function(e){e&&(i=e.split(","))}),t.bind("keydown",function(e){var n=function(){var t=!1;return e.keyCode||(e.which?e.keyCode=e.which:e.charCode&&(e.keyCode=e.charCode)),e.keyCode&&i.indexOf(e.keyCode.toString())>-1&&(t=!0),t};i.length>0&&n()&&(t[0].click(),e.preventDefault())})}}}]).directive("attElementFocus",[function(){return{restrict:"A",link:function(e,t,n){e.$watch(n.attElementFocus,function(e){e&&t[0].focus()})}}}]).directive("focusOn",["$timeout",function(e){var t=function(e){if(!e.focusOn&&""!==e.focusOn)throw"FocusOnCondition missing attribute to evaluate"};return{restrict:"A",link:function(n,i,a){t(a),n.$watch(a.focusOn,function(t){t&&e(function(){i[0].focus()})})}}}]).constant("whenScrollEndsConstants",{threshold:100,width:0,height:0}).directive("whenScrollEnds",function(e,t){return{restrict:"A",link:function(n,i,a){var s=parseInt(a.threshold,10)||e.threshold;return a.axis&&""!==a.axis?void("x"===a.axis?(visibleWidth=parseInt(a.width,10)||e.width,i.css("width")&&(visibleWidth=i.css("width").split("px")[0]),i[0].addEventListener("scroll",function(){var e=i.prop("scrollWidth");void 0===e&&(e=1);var t=e-visibleWidth;t-i[0].scrollLeft<=s&&n.$apply(a.whenScrollEnds)})):"y"===a.axis&&(visibleHeight=parseInt(a.height,10)||e.height,i.css("width")&&(visibleHeight=i.css("height").split("px")[0]),i[0].addEventListener("scroll",function(){var e=i.prop("scrollHeight");void 0===e&&(e=1);var t=e-visibleHeight;t-i[0].scrollTop<=s&&n.$apply(a.whenScrollEnds)}))):void t.warn("axis attribute must be defined for whenScrollEnds.")}}}).directive("validImei",function(){return{restrict:"A",require:"ngModel",link:function(e,t,n,i){i.$parsers.unshift(function(t){if(t){if(e.valid=!1,isNaN(t)||15!==t.length)e.valid=!1;else{for(var n=0,a=[],s=0;15>s;s++)a[s]=parseInt(t.substring(s,s+1),10),s%2!==0&&(a[s]=parseInt(2*a[s],10)),a[s]>9&&(a[s]=parseInt(a[s]%10,10)+parseInt(a[s]/10,10)),n+=parseInt(a[s],10);n%10===0?e.valid=!0:e.valid=!1}i.$setValidity("invalidImei",e.valid)}return e.valid?t:void 0})}}}).directive("togglePassword",function(){return{restrict:"A",transclude:!1,link:function(e,t,n,i){t.bind("click",function(){var e=n.togglePassword;t[0].innerHTML="Show"===t[0].innerHTML?"Hide":"Show";var i=angular.element(document.querySelector("#"+e))[0].type;angular.element(document.querySelector("#"+e))[0].type="password"===i?"text":"password"})}}}).factory("events",function(){var e=function(e){e.stopPropagation?e.stopPropagation():e.returnValue=!1},t=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1};return{stopPropagation:e,preventDefault:t}}).factory("$documentBind",["$document","$timeout",function(e,t){var n=function(n,i,a){a.$watch(n,function(n){t(function(){n?e.bind("click",i):e.unbind("click",i)})})},i=function(n,i,a,s,r,o){r?(o||(o=0),s.$watch(i,function(i,s){i!==s&&t(function(){i?e.bind(n,a):e.unbind(n,a)},o)})):s.$watch(i,function(t,i){t!==i&&(t?e.bind(n,a):e.unbind(n,a))})};return{click:n,event:i}}]).factory("DOMHelper",function(){function e(e){var t=angular.element(e),n=parseInt(t.attr("tabindex"),10)>=0?!0:!1,i=t[0].tagName.toUpperCase();return n||"A"===i||"INPUT"===i||"TEXTAREA"===i?!(t[0].disabled||t[0].readOnly):!1}function t(e){return 1==e.nodeType&&"SCRIPT"!=e.nodeName&&"STYLE"!=e.nodeName}function n(i){var i=i||document.getElementsByTagName("body")[0];if(t(i)&&e(i))return i;if(!i.hasChildNodes())return void 0;for(var a=i.firstChild;a;){var s=n(a);if(s)return s;a=a.nextSibling}}var i=function(e){var t=e;return e.hasOwnProperty("length")&&(t=e[0]),n(t)};return{firstTabableElement:i}}).factory("keymap",function(){return{KEY:{TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,COMMAND:91},MAP:{91:"COMMAND",8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSEBREAK",20:"CAPSLOCK",27:"ESC",32:"SPACE",33:"PAGE_UP",34:"PAGE_DOWN",35:"END",36:"HOME",37:"LEFT",38:"UP",39:"RIGHT",40:"DOWN",43:"+",44:"PRINTSCREEN",45:"INSERT",46:"DELETE",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUMLOCK",145:"SCROLLLOCK",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},isControl:function(e){var t=e.keyCode;switch(t){case this.KEY.COMMAND:case this.KEY.SHIFT:case this.KEY.CTRL:case this.KEY.ALT:return!0}return e.metaKey?!0:!1},isFunctionKey:function(e){return e=e.keyCode?e.keyCode:e,e>=112&&123>=e},isVerticalMovement:function(e){return~[this.KEY.UP,this.KEY.DOWN].indexOf(e)},isHorizontalMovement:function(e){return~[this.KEY.LEFT,this.KEY.RIGHT,this.KEY.BACKSPACE,this.KEY.DELETE].indexOf(e)},isAllowedKey:function(e){return~[this.KEY.SPACE,this.KEY.ESC,this.KEY.ENTER].indexOf(e)||this.isHorizontalMovement(e)||this.isVerticalMovement(e)}}}).factory("keyMapAc",function(){return{keys:{32:" ",33:"!",34:'"',35:"#",36:"$",37:"%",38:"&",39:"'",40:"(",41:")",42:"*",43:"+",44:",",45:"-",46:".",47:"/",58:":",59:";",60:"<",61:"=",62:">",63:"?",64:"@",91:"[",92:"\\",93:"]",94:"^",95:"_",96:"`",123:"{",124:"|",125:"}",126:"~"},keyRange:{startNum:"48",endNum:"57",startSmallLetters:"97",endSmallLetters:"122",startCapitalLetters:"65",endCapitalLetters:"90"},allowedKeys:{TAB:8,BACKSPACE:9,DELETE:16}}}).factory("$attElementDetach",function(){var e=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)};return e}).factory("$ieVersion",function(){var ie=null,loadIEVersion=function(){var isIE10=eval("/*@cc_on!@*/false")&&10===document.documentMode;if(isIE10)return 10;var v=3,div=document.createElement("div"),all=div.getElementsByTagName("i");do div.innerHTML="<!--[if gt IE "+ ++v+"]><i></i><![endif]-->";while(all[0]);return v>4?v:void 0};return function(){return null===ie&&(ie=loadIEVersion()),ie}}),function(){String.prototype.toSnakeCase=function(){return this.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})};var e=function(e,t){e=e||"",t=!isNaN(t)&&t||0;for(var n="",i=0;t>i;i++)n+=e;return n},t=function(t,n,i,a){return t=t||"",n=!isNaN(n)&&n||0,i=i||"",n>t.length?a?e(i,n-t.length)+t:t+e(i,n-t.length):t};String.prototype.lPad=function(e,n){return t(this,e,n,!0)},String.prototype.rPad=function(e,n){return t(this,e,n,!1)},Array.prototype.indexOf||(Array.prototype.indexOf=function(e){for(var t=0;t<this.length;t++)if(this[t]===e)return t;return-1})}(),angular.module("att.abs.position",[]).factory("$position",["$document","$window",function(e,t){function n(e,n){return e.currentStyle?e.currentStyle[n]:t.getComputedStyle?t.getComputedStyle(e)[n]:e.style[n]}function i(e){return"static"===(n(e,"position")||"static")}var a=function(t){for(var n=e[0],a=t.offsetParent||n;a&&a!==n&&i(a);)a=a.offsetParent;return a||n};return{position:function(t){var n=this.offset(t),i={top:0,left:0},s=a(t[0]);return s!==e[0]&&(i=this.offset(angular.element(s)),i.top+=s.clientTop-s.scrollTop,i.left+=s.clientLeft-s.scrollLeft),{width:t.prop("offsetWidth"),height:t.prop("offsetHeight"),top:n.top-i.top,left:n.left-i.left}},offset:function(n){var i=n[0].getBoundingClientRect();return{width:n.prop("offsetWidth"),height:n.prop("offsetHeight"),top:i.top+(t.pageYOffset||e[0].body.scrollTop||e[0].documentElement.scrollTop),left:i.left+(t.pageXOffset||e[0].body.scrollLeft||e[0].documentElement.scrollLeft)}}}}]).factory("$isElement",[function(){var e=function(t,n,i){return t[0]===n[0]?!0:t[0]===i[0]?!1:e(t.parent()[0]&&t.parent()||n,n,i)};return e}]).directive("attPosition",["$position",function(e){return{restrict:"A",link:function(t,n,i){t.$watchCollection(function(){return e.position(n)},function(e){t[i.attPosition]=e})}}}]),(window._gsQueue||(window._gsQueue=[])).push(function(){"use strict";var e=document.documentElement,t=window,n=function(n,i){var a="x"===i?"Width":"Height",s="scroll"+a,r="client"+a,o=document.body;return n===t||n===e||n===o?Math.max(e[s],o[s])-(t["inner"+a]||Math.max(e[r],o[r])):n[s]-n["offset"+a]},i=window._gsDefine.plugin({propName:"scrollTo",API:2,version:"1.7.3",init:function(e,i,a){return this._wdw=e===t,this._target=e,this._tween=a,"object"!=typeof i&&(i={y:i}),this._autoKill=i.autoKill!==!1,this.x=this.xPrev=this.getX(),this.y=this.yPrev=this.getY(),null!=i.x?(this._addTween(this,"x",this.x,"max"===i.x?n(e,"x"):i.x,"scrollTo_x",!0),this._overwriteProps.push("scrollTo_x")):this.skipX=!0,null!=i.y?(this._addTween(this,"y",this.y,"max"===i.y?n(e,"y"):i.y,"scrollTo_y",!0),this._overwriteProps.push("scrollTo_y")):this.skipY=!0,!0},set:function(e){this._super.setRatio.call(this,e);var i=this._wdw||!this.skipX?this.getX():this.xPrev,a=this._wdw||!this.skipY?this.getY():this.yPrev,s=a-this.yPrev,r=i-this.xPrev;this._autoKill&&(!this.skipX&&(r>7||-7>r)&&i<n(this._target,"x")&&(this.skipX=!0),!this.skipY&&(s>7||-7>s)&&a<n(this._target,"y")&&(this.skipY=!0),this.skipX&&this.skipY&&this._tween.kill()),this._wdw?t.scrollTo(this.skipX?i:this.x,this.skipY?a:this.y):(this.skipY||(this._target.scrollTop=this.y),this.skipX||(this._target.scrollLeft=this.x)),this.xPrev=this.x,this.yPrev=this.y}}),a=i.prototype;i.max=n,a.getX=function(){return this._wdw?null!=t.pageXOffset?t.pageXOffset:null!=e.scrollLeft?e.scrollLeft:document.body.scrollLeft:this._target.scrollLeft},a.getY=function(){return this._wdw?null!=t.pageYOffset?t.pageYOffset:null!=e.scrollTop?e.scrollTop:document.body.scrollTop:this._target.scrollTop},a._kill=function(e){return e.scrollTo_x&&(this.skipX=!0),e.scrollTo_y&&(this.skipY=!0),this._super._kill.call(this,e)}}),window._gsDefine&&window._gsQueue.pop()(),function(e){"use strict";var t=e.GreenSockGlobals||e;if(!t.TweenLite){var n,i,a,s,r,o=function(e){var n,i=e.split("."),a=t;for(n=0;n<i.length;n++)a[i[n]]=a=a[i[n]]||{};return a},l=o("com.greensock"),c=1e-10,d=[].slice,p=function(){},u=function(){var e=Object.prototype.toString,t=e.call([]);return function(n){return null!=n&&(n instanceof Array||"object"==typeof n&&!!n.push&&e.call(n)===t)}}(),h={},g=function(n,i,a,s){this.sc=h[n]?h[n].sc:[],h[n]=this,this.gsClass=null,this.func=a;var r=[];this.check=function(l){for(var c,d,p,u,f=i.length,m=f;--f>-1;)(c=h[i[f]]||new g(i[f],[])).gsClass?(r[f]=c.gsClass,m--):l&&c.sc.push(this);if(0===m&&a)for(d=("com.greensock."+n).split("."),p=d.pop(),u=o(d.join("."))[p]=this.gsClass=a.apply(a,r),s&&(t[p]=u,"function"==typeof define&&define.amd?define((e.GreenSockAMDPath?e.GreenSockAMDPath+"/":"")+n.split(".").join("/"),[],function(){return u}):"undefined"!=typeof module&&module.exports&&(module.exports=u)),f=0;f<this.sc.length;f++)this.sc[f].check()},this.check(!0)},f=e._gsDefine=function(e,t,n,i){return new g(e,t,n,i)},m=l._class=function(e,t,n){return t=t||function(){},f(e,[],function(){return t},n),t};f.globals=t;var v=[0,0,1,1],b=[],_=m("easing.Ease",function(e,t,n,i){this._func=e,this._type=n||0,this._power=i||0,this._params=t?v.concat(t):v},!0),y=_.map={},w=_.register=function(e,t,n,i){for(var a,s,r,o,c=t.split(","),d=c.length,p=(n||"easeIn,easeOut,easeInOut").split(",");--d>-1;)for(s=c[d],a=i?m("easing."+s,null,!0):l.easing[s]||{},r=p.length;--r>-1;)o=p[r],y[s+"."+o]=y[o+s]=a[o]=e.getRatio?e:e[o]||new e};for(a=_.prototype,a._calcEnd=!1,a.getRatio=function(e){if(this._func)return this._params[0]=e,this._func.apply(null,this._params);var t=this._type,n=this._power,i=1===t?1-e:2===t?e:.5>e?2*e:2*(1-e);return 1===n?i*=i:2===n?i*=i*i:3===n?i*=i*i*i:4===n&&(i*=i*i*i*i),1===t?1-i:2===t?i:.5>e?i/2:1-i/2},n=["Linear","Quad","Cubic","Quart","Quint,Strong"],i=n.length;--i>-1;)a=n[i]+",Power"+i,w(new _(null,null,1,i),a,"easeOut",!0),w(new _(null,null,2,i),a,"easeIn"+(0===i?",easeNone":"")),w(new _(null,null,3,i),a,"easeInOut");y.linear=l.easing.Linear.easeIn,y.swing=l.easing.Quad.easeInOut;var k=m("events.EventDispatcher",function(e){this._listeners={},this._eventTarget=e||this});a=k.prototype,a.addEventListener=function(e,t,n,i,a){a=a||0;var o,l,c=this._listeners[e],d=0;for(null==c&&(this._listeners[e]=c=[]),l=c.length;--l>-1;)o=c[l],o.c===t&&o.s===n?c.splice(l,1):0===d&&o.pr<a&&(d=l+1);c.splice(d,0,{c:t,s:n,up:i,pr:a}),this!==s||r||s.wake()},a.removeEventListener=function(e,t){var n,i=this._listeners[e];if(i)for(n=i.length;--n>-1;)if(i[n].c===t)return void i.splice(n,1)},a.dispatchEvent=function(e){var t,n,i,a=this._listeners[e];if(a)for(t=a.length,n=this._eventTarget;--t>-1;)i=a[t],i.up?i.c.call(i.s||n,{type:e,target:n}):i.c.call(i.s||n)};var C=e.requestAnimationFrame,S=e.cancelAnimationFrame,x=Date.now||function(){return(new Date).getTime()},T=x();for(n=["ms","moz","webkit","o"],i=n.length;--i>-1&&!C;)C=e[n[i]+"RequestAnimationFrame"],S=e[n[i]+"CancelAnimationFrame"]||e[n[i]+"CancelRequestAnimationFrame"];m("Ticker",function(e,t){var n,i,a,o,l,d=this,u=x(),h=t!==!1&&C,g=500,f=33,m=function(e){var t,s,r=x()-T;r>g&&(u+=r-f),T+=r,d.time=(T-u)/1e3,t=d.time-l,(!n||t>0||e===!0)&&(d.frame++,l+=t+(t>=o?.004:o-t),s=!0),e!==!0&&(a=i(m)),s&&d.dispatchEvent("tick")};k.call(d),d.time=d.frame=0,d.tick=function(){m(!0)},d.lagSmoothing=function(e,t){g=e||1/c,f=Math.min(t,g,0)},d.sleep=function(){null!=a&&(h&&S?S(a):clearTimeout(a),i=p,a=null,d===s&&(r=!1))},d.wake=function(){null!==a?d.sleep():d.frame>10&&(T=x()-g+5),i=0===n?p:h&&C?C:function(e){return setTimeout(e,1e3*(l-d.time)+1|0)},d===s&&(r=!0),m(2)},d.fps=function(e){return arguments.length?(n=e,o=1/(n||60),l=this.time+o,void d.wake()):n},d.useRAF=function(e){return arguments.length?(d.sleep(),h=e,void d.fps(n)):h},d.fps(e),setTimeout(function(){h&&(!a||d.frame<5)&&d.useRAF(!1)},1500)}),a=l.Ticker.prototype=new l.events.EventDispatcher,a.constructor=l.Ticker;var D=m("core.Animation",function(e,t){if(this.vars=t=t||{},this._duration=this._totalDuration=e||0,this._delay=Number(t.delay)||0,this._timeScale=1,this._active=t.immediateRender===!0,this.data=t.data,this._reversed=t.reversed===!0,q){r||s.wake();var n=this.vars.useFrames?V:q;n.add(this,n._time),this.vars.paused&&this.paused(!0)}});s=D.ticker=new l.Ticker,a=D.prototype,a._dirty=a._gc=a._initted=a._paused=!1,a._totalTime=a._time=0,a._rawPrevTime=-1,a._next=a._last=a._onUpdate=a._timeline=a.timeline=null,a._paused=!1;var $=function(){r&&x()-T>2e3&&s.wake(),setTimeout($,2e3)};$(),a.play=function(e,t){return null!=e&&this.seek(e,t),this.reversed(!1).paused(!1)},a.pause=function(e,t){return null!=e&&this.seek(e,t),this.paused(!0)},a.resume=function(e,t){return null!=e&&this.seek(e,t),this.paused(!1)},a.seek=function(e,t){return this.totalTime(Number(e),t!==!1)},a.restart=function(e,t){return this.reversed(!1).paused(!1).totalTime(e?-this._delay:0,t!==!1,!0)},a.reverse=function(e,t){return null!=e&&this.seek(e||this.totalDuration(),t),this.reversed(!0).paused(!1)},a.render=function(e,t,n){},a.invalidate=function(){return this},a.isActive=function(){var e,t=this._timeline,n=this._startTime;return!t||!this._gc&&!this._paused&&t.isActive()&&(e=t.rawTime())>=n&&e<n+this.totalDuration()/this._timeScale},a._enabled=function(e,t){return r||s.wake(),this._gc=!e,this._active=this.isActive(),t!==!0&&(e&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!e&&this.timeline&&this._timeline._remove(this,!0)),!1},a._kill=function(e,t){return this._enabled(!1,!1)},a.kill=function(e,t){return this._kill(e,t),this},a._uncache=function(e){for(var t=e?this:this.timeline;t;)t._dirty=!0,t=t.timeline;return this},a._swapSelfInParams=function(e){for(var t=e.length,n=e.concat();--t>-1;)"{self}"===e[t]&&(n[t]=this);return n},a.eventCallback=function(e,t,n,i){if("on"===(e||"").substr(0,2)){var a=this.vars;if(1===arguments.length)return a[e];null==t?delete a[e]:(a[e]=t,a[e+"Params"]=u(n)&&-1!==n.join("").indexOf("{self}")?this._swapSelfInParams(n):n,a[e+"Scope"]=i),"onUpdate"===e&&(this._onUpdate=t)}return this},a.delay=function(e){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+e-this._delay),this._delay=e,this):this._delay},a.duration=function(e){return arguments.length?(this._duration=this._totalDuration=e,this._uncache(!0),this._timeline.smoothChildTiming&&this._time>0&&this._time<this._duration&&0!==e&&this.totalTime(this._totalTime*(e/this._duration),!0),this):(this._dirty=!1,this._duration)},a.totalDuration=function(e){return this._dirty=!1,arguments.length?this.duration(e):this._totalDuration},a.time=function(e,t){return arguments.length?(this._dirty&&this.totalDuration(),this.totalTime(e>this._duration?this._duration:e,t)):this._time},a.totalTime=function(e,t,n){if(r||s.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(0>e&&!n&&(e+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var i=this._totalDuration,a=this._timeline;if(e>i&&!n&&(e=i),this._startTime=(this._paused?this._pauseTime:a._time)-(this._reversed?i-e:e)/this._timeScale,a._dirty||this._uncache(!1),a._timeline)for(;a._timeline;)a._timeline._time!==(a._startTime+a._totalTime)/a._timeScale&&a.totalTime(a._totalTime,!0),a=a._timeline}this._gc&&this._enabled(!0,!1),(this._totalTime!==e||0===this._duration)&&(this.render(e,t,!1),L.length&&H())}return this},a.progress=a.totalProgress=function(e,t){return arguments.length?this.totalTime(this.duration()*e,t):this._time/this.duration()},a.startTime=function(e){return arguments.length?(e!==this._startTime&&(this._startTime=e,this.timeline&&this.timeline._sortChildren&&this.timeline.add(this,e-this._delay)),this):this._startTime},a.timeScale=function(e){if(!arguments.length)return this._timeScale;if(e=e||c,this._timeline&&this._timeline.smoothChildTiming){var t=this._pauseTime,n=t||0===t?t:this._timeline.totalTime();this._startTime=n-(n-this._startTime)*this._timeScale/e}return this._timeScale=e,this._uncache(!1)},a.reversed=function(e){return arguments.length?(e!=this._reversed&&(this._reversed=e,this.totalTime(this._timeline&&!this._timeline.smoothChildTiming?this.totalDuration()-this._totalTime:this._totalTime,!0)),this):this._reversed},a.paused=function(e){if(!arguments.length)return this._paused;if(e!=this._paused&&this._timeline){r||e||s.wake();var t=this._timeline,n=t.rawTime(),i=n-this._pauseTime;!e&&t.smoothChildTiming&&(this._startTime+=i,this._uncache(!1)),this._pauseTime=e?n:null,this._paused=e,this._active=this.isActive(),!e&&0!==i&&this._initted&&this.duration()&&this.render(t.smoothChildTiming?this._totalTime:(n-this._startTime)/this._timeScale,!0,!0)}return this._gc&&!e&&this._enabled(!0,!1),this};var A=m("core.SimpleTimeline",function(e){D.call(this,0,e),this.autoRemoveChildren=this.smoothChildTiming=!0});a=A.prototype=new D,a.constructor=A,a.kill()._gc=!1,a._first=a._last=null,a._sortChildren=!1,a.add=a.insert=function(e,t,n,i){var a,s;if(e._startTime=Number(t||0)+e._delay,e._paused&&this!==e._timeline&&(e._pauseTime=e._startTime+(this.rawTime()-e._startTime)/e._timeScale),e.timeline&&e.timeline._remove(e,!0),e.timeline=e._timeline=this,e._gc&&e._enabled(!0,!0),a=this._last,this._sortChildren)for(s=e._startTime;a&&a._startTime>s;)a=a._prev;return a?(e._next=a._next,a._next=e):(e._next=this._first,this._first=e),e._next?e._next._prev=e:this._last=e,e._prev=a,this._timeline&&this._uncache(!0),this},a._remove=function(e,t){return e.timeline===this&&(t||e._enabled(!1,!0),e.timeline=null,e._prev?e._prev._next=e._next:this._first===e&&(this._first=e._next),e._next?e._next._prev=e._prev:this._last===e&&(this._last=e._prev),this._timeline&&this._uncache(!0)),this},a.render=function(e,t,n){var i,a=this._first;for(this._totalTime=this._time=this._rawPrevTime=e;a;)i=a._next,(a._active||e>=a._startTime&&!a._paused)&&(a._reversed?a.render((a._dirty?a.totalDuration():a._totalDuration)-(e-a._startTime)*a._timeScale,t,n):a.render((e-a._startTime)*a._timeScale,t,n)),a=i},a.rawTime=function(){return r||s.wake(),this._totalTime};var E=m("TweenLite",function(t,n,i){if(D.call(this,n,i),this.render=E.prototype.render,null==t)throw"Cannot tween a null target.";this.target=t="string"!=typeof t?t:E.selector(t)||t;var a,s,r,o=t.jquery||t.length&&t!==e&&t[0]&&(t[0]===e||t[0].nodeType&&t[0].style&&!t.nodeType),l=this.vars.overwrite;if(this._overwrite=l=null==l?R[E.defaultOverwrite]:"number"==typeof l?l>>0:R[l],(o||t instanceof Array||t.push&&u(t))&&"number"!=typeof t[0])for(this._targets=r=d.call(t,0),this._propLookup=[],this._siblings=[],a=0;a<r.length;a++)s=r[a],s?"string"!=typeof s?s.length&&s!==e&&s[0]&&(s[0]===e||s[0].nodeType&&s[0].style&&!s.nodeType)?(r.splice(a--,1),this._targets=r=r.concat(d.call(s,0))):(this._siblings[a]=U(s,this,!1),1===l&&this._siblings[a].length>1&&W(s,this,null,1,this._siblings[a])):(s=r[a--]=E.selector(s),"string"==typeof s&&r.splice(a+1,1)):r.splice(a--,1);else this._propLookup={},this._siblings=U(t,this,!1),1===l&&this._siblings.length>1&&W(t,this,null,1,this._siblings);(this.vars.immediateRender||0===n&&0===this._delay&&this.vars.immediateRender!==!1)&&(this._time=-c,this.render(-this._delay))},!0),I=function(t){return t.length&&t!==e&&t[0]&&(t[0]===e||t[0].nodeType&&t[0].style&&!t.nodeType)},P=function(e,t){var n,i={};for(n in e)B[n]||n in t&&"transform"!==n&&"x"!==n&&"y"!==n&&"width"!==n&&"height"!==n&&"className"!==n&&"border"!==n||!(!F[n]||F[n]&&F[n]._autoCSS)||(i[n]=e[n],delete e[n]);e.css=i};a=E.prototype=new D,a.constructor=E,a.kill()._gc=!1,a.ratio=0,a._firstPT=a._targets=a._overwrittenProps=a._startAt=null,a._notifyPluginsOfEnabled=a._lazy=!1,E.version="1.12.1",E.defaultEase=a._ease=new _(null,null,1,1),E.defaultOverwrite="auto",E.ticker=s,E.autoSleep=!0,E.lagSmoothing=function(e,t){s.lagSmoothing(e,t)},E.selector=e.$||e.jQuery||function(t){return e.$?(E.selector=e.$,e.$(t)):e.document?e.document.getElementById("#"===t.charAt(0)?t.substr(1):t):t};var L=[],O={},M=E._internals={isArray:u,isSelector:I,lazyTweens:L},F=E._plugins={},N=M.tweenLookup={},j=0,B=M.reservedProps={ease:1,delay:1,overwrite:1,onComplete:1,onCompleteParams:1,onCompleteScope:1,useFrames:1,runBackwards:1,startAt:1,onUpdate:1,onUpdateParams:1,onUpdateScope:1,onStart:1,onStartParams:1,onStartScope:1,onReverseComplete:1,onReverseCompleteParams:1,onReverseCompleteScope:1,onRepeat:1,onRepeatParams:1,onRepeatScope:1,easeParams:1,yoyo:1,immediateRender:1,repeat:1,repeatDelay:1,data:1,paused:1,reversed:1,autoCSS:1,lazy:1},R={none:0,all:1,auto:2,concurrent:3,allOnStart:4,preexisting:5,"true":1,"false":0},V=D._rootFramesTimeline=new A,q=D._rootTimeline=new A,H=function(){var e=L.length;for(O={};--e>-1;)n=L[e],n&&n._lazy!==!1&&(n.render(n._lazy,!1,!0),n._lazy=!1);L.length=0};q._startTime=s.time,V._startTime=s.frame,q._active=V._active=!0,setTimeout(H,1),D._updateRoot=E.render=function(){var e,t,n;if(L.length&&H(),q.render((s.time-q._startTime)*q._timeScale,!1,!1),V.render((s.frame-V._startTime)*V._timeScale,!1,!1),L.length&&H(),!(s.frame%120)){for(n in N){for(t=N[n].tweens,e=t.length;--e>-1;)t[e]._gc&&t.splice(e,1);0===t.length&&delete N[n]}if(n=q._first,(!n||n._paused)&&E.autoSleep&&!V._first&&1===s._listeners.tick.length){for(;n&&n._paused;)n=n._next;n||s.sleep()}}},s.addEventListener("tick",D._updateRoot);var U=function(e,t,n){var i,a,s=e._gsTweenID;if(N[s||(e._gsTweenID=s="t"+j++)]||(N[s]={target:e,tweens:[]}),t&&(i=N[s].tweens,i[a=i.length]=t,n))for(;--a>-1;)i[a]===t&&i.splice(a,1);return N[s].tweens},W=function(e,t,n,i,a){var s,r,o,l;if(1===i||i>=4){for(l=a.length,s=0;l>s;s++)if((o=a[s])!==t)o._gc||o._enabled(!1,!1)&&(r=!0);else if(5===i)break;return r}var d,p=t._startTime+c,u=[],h=0,g=0===t._duration;for(s=a.length;--s>-1;)(o=a[s])===t||o._gc||o._paused||(o._timeline!==t._timeline?(d=d||z(t,0,g),0===z(o,d,g)&&(u[h++]=o)):o._startTime<=p&&o._startTime+o.totalDuration()/o._timeScale>p&&((g||!o._initted)&&p-o._startTime<=2e-10||(u[h++]=o)));for(s=h;--s>-1;)o=u[s],2===i&&o._kill(n,e)&&(r=!0),(2!==i||!o._firstPT&&o._initted)&&o._enabled(!1,!1)&&(r=!0);return r},z=function(e,t,n){for(var i=e._timeline,a=i._timeScale,s=e._startTime;i._timeline;){if(s+=i._startTime,a*=i._timeScale,i._paused)return-100;i=i._timeline}return s/=a,s>t?s-t:n&&s===t||!e._initted&&2*c>s-t?c:(s+=e.totalDuration()/e._timeScale/a)>t+c?0:s-t-c};a._init=function(){var e,t,n,i,a,s=this.vars,r=this._overwrittenProps,o=this._duration,l=!!s.immediateRender,c=s.ease;if(s.startAt){this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),a={};for(i in s.startAt)a[i]=s.startAt[i];if(a.overwrite=!1,a.immediateRender=!0,a.lazy=l&&s.lazy!==!1,a.startAt=a.delay=null,this._startAt=E.to(this.target,0,a),l)if(this._time>0)this._startAt=null;else if(0!==o)return}else if(s.runBackwards&&0!==o)if(this._startAt)this._startAt.render(-1,!0),this._startAt.kill(),this._startAt=null;else{n={};for(i in s)B[i]&&"autoCSS"!==i||(n[i]=s[i]);if(n.overwrite=0,n.data="isFromStart",n.lazy=l&&s.lazy!==!1,n.immediateRender=l,this._startAt=E.to(this.target,0,n),l){if(0===this._time)return}else this._startAt._init(),this._startAt._enabled(!1)}if(c?c instanceof _?this._ease=s.easeParams instanceof Array?c.config.apply(c,s.easeParams):c:this._ease="function"==typeof c?new _(c,s.easeParams):y[c]||E.defaultEase:this._ease=E.defaultEase,this._easeType=this._ease._type,this._easePower=this._ease._power,this._firstPT=null,this._targets)for(e=this._targets.length;--e>-1;)this._initProps(this._targets[e],this._propLookup[e]={},this._siblings[e],r?r[e]:null)&&(t=!0);else t=this._initProps(this.target,this._propLookup,this._siblings,r);if(t&&E._onPluginEvent("_onInitAllProps",this),r&&(this._firstPT||"function"!=typeof this.target&&this._enabled(!1,!1)),
+s.runBackwards)for(n=this._firstPT;n;)n.s+=n.c,n.c=-n.c,n=n._next;this._onUpdate=s.onUpdate,this._initted=!0},a._initProps=function(t,n,i,a){var s,r,o,l,c,d;if(null==t)return!1;O[t._gsTweenID]&&H(),this.vars.css||t.style&&t!==e&&t.nodeType&&F.css&&this.vars.autoCSS!==!1&&P(this.vars,t);for(s in this.vars){if(d=this.vars[s],B[s])d&&(d instanceof Array||d.push&&u(d))&&-1!==d.join("").indexOf("{self}")&&(this.vars[s]=d=this._swapSelfInParams(d,this));else if(F[s]&&(l=new F[s])._onInitTween(t,this.vars[s],this)){for(this._firstPT=c={_next:this._firstPT,t:l,p:"setRatio",s:0,c:1,f:!0,n:s,pg:!0,pr:l._priority},r=l._overwriteProps.length;--r>-1;)n[l._overwriteProps[r]]=this._firstPT;(l._priority||l._onInitAllProps)&&(o=!0),(l._onDisable||l._onEnable)&&(this._notifyPluginsOfEnabled=!0)}else this._firstPT=n[s]=c={_next:this._firstPT,t:t,p:s,f:"function"==typeof t[s],n:s,pg:!1,pr:0},c.s=c.f?t[s.indexOf("set")||"function"!=typeof t["get"+s.substr(3)]?s:"get"+s.substr(3)]():parseFloat(t[s]),c.c="string"==typeof d&&"="===d.charAt(1)?parseInt(d.charAt(0)+"1",10)*Number(d.substr(2)):Number(d)-c.s||0;c&&c._next&&(c._next._prev=c)}return a&&this._kill(a,t)?this._initProps(t,n,i,a):this._overwrite>1&&this._firstPT&&i.length>1&&W(t,this,n,this._overwrite,i)?(this._kill(n,t),this._initProps(t,n,i,a)):(this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration)&&(O[t._gsTweenID]=!0),o)},a.render=function(e,t,n){var i,a,s,r,o=this._time,l=this._duration,d=this._rawPrevTime;if(e>=l)this._totalTime=this._time=l,this.ratio=this._ease._calcEnd?this._ease.getRatio(1):1,this._reversed||(i=!0,a="onComplete"),0===l&&(this._initted||!this.vars.lazy||n)&&(this._startTime===this._timeline._duration&&(e=0),(0===e||0>d||d===c)&&d!==e&&(n=!0,d>c&&(a="onReverseComplete")),this._rawPrevTime=r=!t||e||d===e?e:c);else if(1e-7>e)this._totalTime=this._time=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0,(0!==o||0===l&&d>0&&d!==c)&&(a="onReverseComplete",i=this._reversed),0>e?(this._active=!1,0===l&&(this._initted||!this.vars.lazy||n)&&(d>=0&&(n=!0),this._rawPrevTime=r=!t||e||d===e?e:c)):this._initted||(n=!0);else if(this._totalTime=this._time=e,this._easeType){var p=e/l,u=this._easeType,h=this._easePower;(1===u||3===u&&p>=.5)&&(p=1-p),3===u&&(p*=2),1===h?p*=p:2===h?p*=p*p:3===h?p*=p*p*p:4===h&&(p*=p*p*p*p),1===u?this.ratio=1-p:2===u?this.ratio=p:.5>e/l?this.ratio=p/2:this.ratio=1-p/2}else this.ratio=this._ease.getRatio(e/l);if(this._time!==o||n){if(!this._initted){if(this._init(),!this._initted||this._gc)return;if(!n&&this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration))return this._time=this._totalTime=o,this._rawPrevTime=d,L.push(this),void(this._lazy=e);this._time&&!i?this.ratio=this._ease.getRatio(this._time/l):i&&this._ease._calcEnd&&(this.ratio=this._ease.getRatio(0===this._time?0:1))}for(this._lazy!==!1&&(this._lazy=!1),this._active||!this._paused&&this._time!==o&&e>=0&&(this._active=!0),0===o&&(this._startAt&&(e>=0?this._startAt.render(e,t,n):a||(a="_dummyGS")),this.vars.onStart&&(0!==this._time||0===l)&&(t||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||b))),s=this._firstPT;s;)s.f?s.t[s.p](s.c*this.ratio+s.s):s.t[s.p]=s.c*this.ratio+s.s,s=s._next;this._onUpdate&&(0>e&&this._startAt&&this._startTime&&this._startAt.render(e,t,n),t||(this._time!==o||i)&&this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||b)),a&&(this._gc||(0>e&&this._startAt&&!this._onUpdate&&this._startTime&&this._startAt.render(e,t,n),i&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!t&&this.vars[a]&&this.vars[a].apply(this.vars[a+"Scope"]||this,this.vars[a+"Params"]||b),0===l&&this._rawPrevTime===c&&r!==c&&(this._rawPrevTime=0)))}},a._kill=function(e,t){if("all"===e&&(e=null),null==e&&(null==t||t===this.target))return this._lazy=!1,this._enabled(!1,!1);t="string"!=typeof t?t||this._targets||this.target:E.selector(t)||t;var n,i,a,s,r,o,l,c;if((u(t)||I(t))&&"number"!=typeof t[0])for(n=t.length;--n>-1;)this._kill(e,t[n])&&(o=!0);else{if(this._targets){for(n=this._targets.length;--n>-1;)if(t===this._targets[n]){r=this._propLookup[n]||{},this._overwrittenProps=this._overwrittenProps||[],i=this._overwrittenProps[n]=e?this._overwrittenProps[n]||{}:"all";break}}else{if(t!==this.target)return!1;r=this._propLookup,i=this._overwrittenProps=e?this._overwrittenProps||{}:"all"}if(r){l=e||r,c=e!==i&&"all"!==i&&e!==r&&("object"!=typeof e||!e._tempKill);for(a in l)(s=r[a])&&(s.pg&&s.t._kill(l)&&(o=!0),s.pg&&0!==s.t._overwriteProps.length||(s._prev?s._prev._next=s._next:s===this._firstPT&&(this._firstPT=s._next),s._next&&(s._next._prev=s._prev),s._next=s._prev=null),delete r[a]),c&&(i[a]=1);!this._firstPT&&this._initted&&this._enabled(!1,!1)}}return o},a.invalidate=function(){return this._notifyPluginsOfEnabled&&E._onPluginEvent("_onDisable",this),this._firstPT=null,this._overwrittenProps=null,this._onUpdate=null,this._startAt=null,this._initted=this._active=this._notifyPluginsOfEnabled=this._lazy=!1,this._propLookup=this._targets?{}:[],this},a._enabled=function(e,t){if(r||s.wake(),e&&this._gc){var n,i=this._targets;if(i)for(n=i.length;--n>-1;)this._siblings[n]=U(i[n],this,!0);else this._siblings=U(this.target,this,!0)}return D.prototype._enabled.call(this,e,t),this._notifyPluginsOfEnabled&&this._firstPT?E._onPluginEvent(e?"_onEnable":"_onDisable",this):!1},E.to=function(e,t,n){return new E(e,t,n)},E.from=function(e,t,n){return n.runBackwards=!0,n.immediateRender=0!=n.immediateRender,new E(e,t,n)},E.fromTo=function(e,t,n,i){return i.startAt=n,i.immediateRender=0!=i.immediateRender&&0!=n.immediateRender,new E(e,t,i)},E.delayedCall=function(e,t,n,i,a){return new E(t,0,{delay:e,onComplete:t,onCompleteParams:n,onCompleteScope:i,onReverseComplete:t,onReverseCompleteParams:n,onReverseCompleteScope:i,immediateRender:!1,useFrames:a,overwrite:0})},E.set=function(e,t){return new E(e,0,t)},E.getTweensOf=function(e,t){if(null==e)return[];e="string"!=typeof e?e:E.selector(e)||e;var n,i,a,s;if((u(e)||I(e))&&"number"!=typeof e[0]){for(n=e.length,i=[];--n>-1;)i=i.concat(E.getTweensOf(e[n],t));for(n=i.length;--n>-1;)for(s=i[n],a=n;--a>-1;)s===i[a]&&i.splice(n,1)}else for(i=U(e).concat(),n=i.length;--n>-1;)(i[n]._gc||t&&!i[n].isActive())&&i.splice(n,1);return i},E.killTweensOf=E.killDelayedCallsTo=function(e,t,n){"object"==typeof t&&(n=t,t=!1);for(var i=E.getTweensOf(e,t),a=i.length;--a>-1;)i[a]._kill(n,e)};var Y=m("plugins.TweenPlugin",function(e,t){this._overwriteProps=(e||"").split(","),this._propName=this._overwriteProps[0],this._priority=t||0,this._super=Y.prototype},!0);if(a=Y.prototype,Y.version="1.10.1",Y.API=2,a._firstPT=null,a._addTween=function(e,t,n,i,a,s){var r,o;return null!=i&&(r="number"==typeof i||"="!==i.charAt(1)?Number(i)-n:parseInt(i.charAt(0)+"1",10)*Number(i.substr(2)))?(this._firstPT=o={_next:this._firstPT,t:e,p:t,s:n,c:r,f:"function"==typeof e[t],n:a||t,r:s},o._next&&(o._next._prev=o),o):void 0},a.setRatio=function(e){for(var t,n=this._firstPT,i=1e-6;n;)t=n.c*e+n.s,n.r?t=Math.round(t):i>t&&t>-i&&(t=0),n.f?n.t[n.p](t):n.t[n.p]=t,n=n._next},a._kill=function(e){var t,n=this._overwriteProps,i=this._firstPT;if(null!=e[this._propName])this._overwriteProps=[];else for(t=n.length;--t>-1;)null!=e[n[t]]&&n.splice(t,1);for(;i;)null!=e[i.n]&&(i._next&&(i._next._prev=i._prev),i._prev?(i._prev._next=i._next,i._prev=null):this._firstPT===i&&(this._firstPT=i._next)),i=i._next;return!1},a._roundProps=function(e,t){for(var n=this._firstPT;n;)(e[this._propName]||null!=n.n&&e[n.n.split(this._propName+"_").join("")])&&(n.r=t),n=n._next},E._onPluginEvent=function(e,t){var n,i,a,s,r,o=t._firstPT;if("_onInitAllProps"===e){for(;o;){for(r=o._next,i=a;i&&i.pr>o.pr;)i=i._next;(o._prev=i?i._prev:s)?o._prev._next=o:a=o,(o._next=i)?i._prev=o:s=o,o=r}o=t._firstPT=a}for(;o;)o.pg&&"function"==typeof o.t[e]&&o.t[e]()&&(n=!0),o=o._next;return n},Y.activate=function(e){for(var t=e.length;--t>-1;)e[t].API===Y.API&&(F[(new e[t])._propName]=e[t]);return!0},f.plugin=function(e){if(!(e&&e.propName&&e.init&&e.API))throw"illegal plugin definition.";var t,n=e.propName,i=e.priority||0,a=e.overwriteProps,s={init:"_onInitTween",set:"setRatio",kill:"_kill",round:"_roundProps",initAll:"_onInitAllProps"},r=m("plugins."+n.charAt(0).toUpperCase()+n.substr(1)+"Plugin",function(){Y.call(this,n,i),this._overwriteProps=a||[]},e.global===!0),o=r.prototype=new Y(n);o.constructor=r,r.API=e.API;for(t in s)"function"==typeof e[t]&&(o[s[t]]=e[t]);return r.version=e.version,Y.activate([r]),r},n=e._gsQueue){for(i=0;i<n.length;i++)n[i]();for(a in h)!h[a].func}r=!1}}(window),angular.module("att.abs.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(e,t,n){function i(e){for(var t in e)if(void 0!==s.style[t])return e[t]}var a=function(i,s,r){r=r||{};var o=e.defer(),l=a[r.animation?"animationEndEventName":"transitionEndEventName"],c=function(){n.$apply(function(){i.unbind(l,c),o.resolve(i)})};return l&&i.bind(l,c),t(function(){angular.isString(s)?i.addClass(s):angular.isFunction(s)?s(i):angular.isObject(s)&&i.css(s),l||o.resolve(i)},100),o.promise.cancel=function(){l&&i.unbind(l,c),o.reject("Transition cancelled")},o.promise},s=document.createElement("trans"),r={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},o={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return a.transitionEndEventName=i(r),a.animationEndEventName=i(o),a}]).factory("$scrollTo",["$window",function(e){var t=function(t,n,i){TweenMax.to(e,i||1,{scrollTo:{y:n,x:t},ease:Power4.easeOut})};return t}]).factory("animation",function(){return TweenMax}).factory("$progressBar",function(){var e=function(e){var t=function(t,n){TweenMax.to({},n,{onUpdateParams:["{self}"],onUpdate:e,onComplete:t})};return function(){return t}()};return e}).factory("$height",function(){var e=function(e,t,n,i){TweenMax.to(e,t,{height:n,autoAlpha:i},0)};return e}),angular.module("att.abs.accordion",["att.abs.utilities","att.abs.position","att.abs.transition"]).constant("accordionConfig",{closeOthers:!1}).controller("AccordionController",["$scope","$attrs","accordionConfig","$log",function(e,t,n,i){this.groups=[],this.index=-1,this.scope=e,e.forceExpand=!1,this.closeOthers=function(i){var a=angular.isDefined(t.closeOthers)?e.$eval(t.closeOthers):n.closeOthers;a&&!e.forceExpand&&angular.forEach(this.groups,function(e){e!==i&&(e.isOpen=!1)}),this.groups.indexOf(i)===this.groups.length-1&&e.forceExpand&&(e.forceExpand=!1)},this.expandAll=function(){e.forceExpand=!0,angular.forEach(this.groups,function(e){e.isOpen=!0})},this.collapseAll=function(){angular.forEach(this.groups,function(e){e.isOpen=!1})},this.focus=function(e){var t=this;angular.forEach(this.groups,function(n,i){n!==e?n.focused=!1:(t.index=i,n.focused=!0)})},this.blur=function(e){e.focused=!1,this.index=-1,i.log("accordion.blur()",e)},this.cycle=function(t,n,i){if(n)if(this.index===this.groups.length-1){if(i)return this.index=0,t.focused=!1,void e.$apply();this.index=0}else this.index++;else this.index<=0&&!i?this.index=this.groups.length-1:this.index--;t.focused=!1,this.groups[this.index].setFocus=!0,this.groups[this.index].focused=!0,e.$apply()},this.addGroup=function(e){var t=this;e.index=this.groups.length,e.focused=!1,this.groups.push(e),this.groups.length>0&&(this.index=0),e.$on("$destroy",function(){t.removeGroup(e)})},this.removeGroup=function(e){var t=this.groups.indexOf(e);-1!==t&&this.groups.splice(this.groups.indexOf(e),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,scope:{cClass:"@css",expandAll:"=?",collapseAll:"=?"},template:'<div class="{{cClass}}" ng-transclude></div>',link:function(e,t,n,i){e.$watch("expandAll",function(t){t&&(i.expandAll(),e.expandAll=!1)}),e.$watch("collapseAll",function(t){t&&(i.collapseAll(),e.collapseAll=!1)})}}}).directive("accordionGroup",[function(){return{require:["^accordion","accordionGroup"],restrict:"EA",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/accordion/accordion.html",scope:{heading:"@",isOpen:"=?"},controller:["$scope",function(e){e.showicon=!0,this.setHeading=function(t){this.heading=t,e.showicon=!1},this.isIsOpen=function(){return e.isOpen}}],link:function(e,t,n,i){var a=i[0],s=i[1],r={tab:9,enter:13,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40},o=t.children().eq(0),l=n.parentLink;e.setFocus=!1,e.childLength=n.childLength,e.headingIconClass=n.imageSource;var c=function(t){var n=!0;switch(t.keyCode){case r.enter:t.preventDefault(),e.toggle(),e.$apply();break;case r.up:case r.left:t.preventDefault(),a.cycle(e,!1);break;case r.down:case r.right:t.preventDefault(),a.cycle(e,!0);break;default:n=!1}return t.stopPropagation(),n};angular.isUndefined(e.isOpen)&&(e.isOpen=!1),o.bind("keydown",c),a.addGroup(e),0===e.index&&(e.focused=!0),s.toggle=e.toggle=function(){return e.childLength>0?(e.isOpen=!e.isOpen,a.focus(e),e.isOpen):void(window.location.href=l)},e.$watch("isOpen",function(t){t&&a.closeOthers(e)}),e.$watch("focused",function(t){t?(o.attr("tabindex","0"),e.setFocus&&o[0].focus()):(e.setFocus=!1,o.attr("tabindex","-1"))})}}}]).directive("accordionToggle",function(){return{restrict:"EA",require:"^accordionGroup",scope:{expandIcon:"@",collapseIcon:"@"},link:function(e,t,n,i){var a=function(n){e.expandIcon&&e.collapseIcon&&(n?(t.removeClass(e.expandIcon),t.addClass(e.collapseIcon)):(t.removeClass(e.collapseIcon),t.addClass(e.expandIcon)))};t.bind("click",function(){i.toggle(),e.$apply()}),e.$watch(function(){return i.isIsOpen()},function(e){a(e)})}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",require:"^accordionGroup",compile:function(e,t,n){var i=function(e,t,i,a){n(e,function(e){t.append(e),a.setHeading(t)})};return i}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(e,t,n,i){e.$watch(function(){return i[n.accordionTransclude]},function(e){e&&t.find("span").eq(0).prepend(e)})}}}).directive("attGoTop",["$scrollTo",function(e){return{restrict:"A",transclude:!1,link:function(t,n,i){n.bind("click",function(){e(0,i.attGoTop)})}}}]).directive("attGoTo",["$anchorScroll","$location",function(e,t){return{restrict:"A",transclude:!1,link:function(n,i,a){i.bind("click",function(){var n=a.attGoTo;t.hash()!==n?t.hash(a.attGoTo):e()})}}}]).directive("freeStanding",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:!0,template:"<div><span class='att-accordion__freestanding' ng-show='showAccordion'></span>\n<div class='section-toggle'>\n<button class='section-toggle__button' ng-click='fsToggle()'>\n    {{btnText}}<i style='font-size:0.875rem' ng-class='{\"icon-chevron-up\": showAccordion,\"icon-chevron-down\": !showAccordion, }'></i> \n</button>\n</div></div>",compile:function(e,t,n){var i=function(e,t,i){e.content="",n(e,function(e){t.find("span").append(e)}),e.showAccordion=!1,e.btnText=e.showAccordion?i.hideMsg:i.showMsg,e.fsToggle=function(){e.showAccordion=!e.showAccordion,e.btnText=e.showAccordion?i.hideMsg:i.showMsg}};return i}}}).directive("expanders",function(){return{restrict:"EA",replace:!0,transclude:!0,template:"<div ng-transclude></div>",controller:["$scope",function(e){var t=null;this.setScope=function(e){t=e},this.toggle=function(){return e.isOpen=t.isOpen=!t.isOpen,t.isOpen}}],link:function(e){e.isOpen=!1}}}).directive("expanderHeading",function(){return{require:"^expanders",restrict:"EA",replace:!0,transclude:!0,scope:!0,template:"<div style='padding:10px !important' ng-transclude></div>"}}).directive("expanderBody",function(){return{restrict:"EA",require:"^expanders",replace:!0,transclude:!0,scope:{},template:"<div collapse='!isOpen'><div ng-transclude></div></div>",link:function(e,t,n,i){e.isOpen=!1,i.setScope(e)}}}).directive("expanderToggle",function(){return{restrict:"EA",require:"^expanders",scope:{expandIcon:"@",collapseIcon:"@"},link:function(e,t,n,i){var a=!1,s=function(){e.expandIcon&&e.collapseIcon&&(a?(t.removeClass(e.expandIcon),t.addClass(e.collapseIcon)):(t.removeClass(e.collapseIcon),t.addClass(e.expandIcon)))};t.bind("keydown",function(t){13===t.keyCode&&e.toggleit()}),t.bind("click",function(){e.toggleit()}),e.toggleit=function(){a=i.toggle(),s(),e.$apply()},s()}}}).directive("collapse",["$transition",function(e){var t={open:{marginTop:null,marginBottom:null,paddingTop:null,paddingBottom:null,display:"block"},closed:{marginTop:0,marginBottom:0,paddingTop:0,paddingBottom:0,display:"none"}},n=function(e,n,i){n.removeClass("collapse"),n.css({height:i}),0===i?n.css(t.closed):n.css(t.open),n.addClass("collapse")};return{link:function(i,a,s){var r,o=!0;i.$watch(function(){return a[0].scrollHeight},function(){0===a[0].scrollHeight||r||(o?n(i,a,a[0].scrollHeight+"px"):n(i,a,"auto"))});var l,c=function(t){return l&&l.cancel(),l=e(a,t),l.then(function(){l=void 0},function(){l=void 0}),l},d=function(){i.postTransition=!0,o?(o=!1,r||n(i,a,"auto")):c(angular.extend({height:a[0].scrollHeight+"px"},t.open)).then(function(){r||n(i,a,"auto")}),r=!1},p=function(){r=!0,o?(o=!1,n(i,a,0)):(n(i,a,a[0].scrollHeight+"px"),c(angular.extend({height:0},t.closed)).then(function(){i.postTransition=!1}))};i.$watch(s.collapse,function(e){e?p():d()})}}}]).directive("attAccord",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"AttAccordCtrl",templateUrl:"app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html"}}).controller("AttAccordCtrl",[function(){this.type="attAccord",this.headerCtrl,this.bodyCtrl;var e=!0;this.toggleBody=function(){e?this.expandBody():this.collapseBody(),e=!e},this.expandBody=function(){this.bodyCtrl.expand()},this.collapseBody=function(){this.bodyCtrl.collapse()}}]).controller("AttAccordHeaderCtrl",[function(){this.type="header"}]).directive("attAccordHeader",["keymap","events",function(e,t){return{restrict:"EA",transclude:!0,replace:!0,require:["^attAccord","attAccordHeader"],controller:"AttAccordHeaderCtrl",templateUrl:"app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html",link:function(t,n,i,a){var s=a[0],r=a[1];s.headerCtrl=r;var o=n.children().eq(0);t.clickFunc=function(){s.toggleBody()};var l=function(n){var i=!0;switch(n.keyCode){case e.KEY.ENTER:n.preventDefault(),t.clickFunc(),t.$apply();break;default:i=!1}return n.stopPropagation(),i};angular.isUndefined(t.isOpen)&&(t.isOpen=!1),o.bind("keydown",l)}}}]).controller("AttAccordBodyCtrl",["$scope",function(e){this.type="body",this.expand=function(){e.expand()},this.collapse=function(){e.collapse()}}]).directive("attAccordBody",["$timeout","$height",function(e,t){return{restrict:"EA",transclude:!0,replace:!0,require:["^attAccord","attAccordBody"],controller:"AttAccordBodyCtrl",templateUrl:"app/scripts/ng_js_att_tpls/accordion/attAccordBody.html",link:function(n,i,a,s){var r=s[0],o=s[1];r.bodyCtrl=o;var l;e(function(){l=i[0].offsetHeight,t(i,0,0,0)}),n.expand=function(){t(i,.05,l,1)},n.collapse=function(){t(i,.25,0,0)}}}}]),angular.module("att.abs.alert",[]).directive("attAlert",[function(){return{restrict:"EA",replace:!0,transclude:!0,scope:{alertType:"@type",showTop:"@topPos",showAlert:"="},templateUrl:"app/scripts/ng_js_att_tpls/alert/alert.html",link:function(e){"true"===e.showTop?e.cssStyle={top:"50px"}:e.cssStyle={top:"0px"},e.close=function(){e.showAlert=!1}}}}]),angular.module("att.abs.boardStrip",["att.abs.utilities"]).constant("BoardStripConfig",{maxVisibleBoards:4,boardsToScroll:1,boardLength:140,boardMargin:15}).directive("attBoard",[function(){return{restrict:"AE",replace:!0,transclude:!0,require:"^attBoardStrip",scope:{boardIndex:"=",boardLabel:"="},templateUrl:"app/scripts/ng_js_att_tpls/boardStrip/attBoard.html",link:function(e,t,n,i){var a=i;e.getCurrentIndex=function(){return a.getCurrentIndex()},e.selectBoard=function(e){isNaN(e)||a.setCurrentIndex(e)},e.isInView=function(e){return a.isInView(e)}}}}]).directive("attBoardStrip",["BoardStripConfig","$timeout","$ieVersion",function(e,t,n){return{restrict:"AE",replace:!0,transclude:!0,scope:{currentIndex:"=selectedIndex",boardsMasterArray:"=",onAddBoard:"&?"},templateUrl:"app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html",controller:function(t){if(angular.isDefined(t.boardsMasterArray)||(t.boardsMasterArray=[]),this.rectifyMaxVisibleBoards=function(){this.maxVisibleIndex>=t.boardsMasterArray.length&&(this.maxVisibleIndex=t.boardsMasterArray.length-1),this.maxVisibleIndex<0&&(this.maxVisibleIndex=0)},this.resetBoardStrip=function(){t.currentIndex=0,this.maxVisibleIndex=e.maxVisibleBoards-1,this.minVisibleIndex=0,this.rectifyMaxVisibleBoards()},t.currentIndex>0){var n=t.currentIndex;this.resetBoardStrip(),n>t.boardsMasterArray.length?t.currentIndex=t.boardsMasterArray.length-1:t.currentIndex=n}else this.resetBoardStrip();this.getCurrentIndex=function(){return t.currentIndex},this.setCurrentIndex=function(e){t.currentIndex=e},this.isInView=function(e){return e<=this.maxVisibleIndex&&e>=this.minVisibleIndex},this.getBoardsMasterArrayLength=function(){return t.boardsMasterArray.length}},link:function(i,a,s,r){var o,l=n(),c=1e3;l&&10>l&&(c=0);var d=function(t){return t*(e.boardLength+e.boardMargin)};a[0].querySelector(".board-viewport")&&angular.element(a[0].querySelector(".board-viewport")).css({width:d(e.maxVisibleBoards)+"px"});var p=function(t){return t*(e.boardLength+e.boardMargin)};a[0].querySelector(".boardstrip-container")&&(angular.element(a[0].querySelector(".boardstrip-container")).css({width:p(r.getBoardsMasterArrayLength())+"px"}),angular.element(a[0].querySelector(".boardstrip-container")).css({left:"0px"}));var u=function(){var t;return t=r.getBoardsMasterArrayLength()<=e.maxVisibleBoards?0:r.minVisibleIndex*(e.boardLength+e.boardMargin)*-1},h=function(e,t,n){for(var i=0;i<e.length;i++)angular.element(e[i]).attr("tabindex","-1");for(var i=t;n>=i;i++)angular.element(e[i]).attr("tabindex","0")};i.$watchCollection("boardsMasterArray",function(n,i){n!==i&&(n.length<i.length?(r.resetBoardStrip(),t(function(){var e=a[0].querySelectorAll("[att-board]");if(0!==e.length){var n=angular.element(a[0].querySelector(".boardstrip-container"))[0].style.left,i=u();n!==i+"px"?(angular.element(a[0].querySelector(".boardstrip-container")).css({left:i+"px"}),t.cancel(o),o=t(function(){e[0].focus()},c)):e[0].focus()}else a[0].querySelector("div.boardstrip-item--add").focus();angular.element(a[0].querySelector(".boardstrip-container")).css({width:p(r.getBoardsMasterArrayLength())+"px"})})):(r.maxVisibleIndex=r.getBoardsMasterArrayLength()-1,r.minVisibleIndex=Math.max(r.maxVisibleIndex-e.maxVisibleBoards+1,0),r.setCurrentIndex(r.maxVisibleIndex),t(function(){angular.element(a[0].querySelector(".boardstrip-container")).css({width:p(r.getBoardsMasterArrayLength())+"px"});var e=angular.element(a[0].querySelector(".boardstrip-container"))[0].style.left,n=u(),i=a[0].querySelectorAll("[att-board]");e!==n+"px"?(angular.element(a[0].querySelector(".boardstrip-container")).css({left:n+"px"}),t.cancel(o),o=t(function(){i[i.length-1].focus()},c)):i[i.length-1].focus(),h(i,r.minVisibleIndex,r.maxVisibleIndex)})))}),i.nextBoard=function(){r.maxVisibleIndex+=e.boardsToScroll,r.rectifyMaxVisibleBoards(),r.minVisibleIndex=r.maxVisibleIndex-(e.maxVisibleBoards-1),t.cancel(o),angular.element(a[0].querySelector(".boardstrip-container")).css({left:u()+"px"}),t(function(){var e=a[0].querySelectorAll("[att-board]");if(h(e,r.minVisibleIndex,r.maxVisibleIndex),!i.isNextBoard())try{e[e.length-1].focus()}catch(t){}},c)},i.prevBoard=function(){r.minVisibleIndex-=e.boardsToScroll,r.minVisibleIndex<0&&(r.minVisibleIndex=0),r.maxVisibleIndex=r.minVisibleIndex+e.maxVisibleBoards-1,r.rectifyMaxVisibleBoards(),t.cancel(o),angular.element(a[0].querySelector(".boardstrip-container")).css({left:u()+"px"}),t(function(){var e=a[0].querySelectorAll("[att-board]");if(h(e,r.minVisibleIndex,r.maxVisibleIndex),0===r.minVisibleIndex)try{a[0].querySelector("div.boardstrip-item--add").focus()}catch(t){}})},i.isPrevBoard=function(){return r.minVisibleIndex>0},i.isNextBoard=function(){return r.getBoardsMasterArrayLength()-1>r.maxVisibleIndex}}}}]).directive("attAddBoard",["BoardStripConfig","$parse","$timeout",function(e,t,n){return{restrict:"AE",replace:!0,require:"^attBoardStrip",scope:{onAddBoard:"&?"},templateUrl:"app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html",link:function(e,n,i,a){e.addBoard=function(){i.onAddBoard&&(e.onAddBoard=t(e.onAddBoard),e.onAddBoard())}}}}]).directive("attBoardNavigation",["keymap","events",function(e,t){return{restrict:"AE",link:function(n,i){var a=e.KEY.LEFT,s=e.KEY.RIGHT;i.bind("keydown",function(e){switch(e.keyCode||(e.keyCode=e.which),e.keyCode){case s:if(t.preventDefault(e),t.stopPropagation(e),i[0].nextElementSibling&&parseInt(angular.element(i[0].nextElementSibling).attr("tabindex"))>=0)angular.element(i[0])[0].nextElementSibling.focus();else{var n=angular.element(i[0])[0];do{if(!n.nextSibling)break;n=n.nextSibling}while(n&&"LI"!==n.tagName);n.tagName&&"LI"===n.tagName&&parseInt(angular.element(n).attr("tabindex"))>=0&&n.focus()}break;case a:if(t.preventDefault(e),t.stopPropagation(e),i[0].previousElementSibling&&parseInt(angular.element(i[0].previousElementSibling).attr("tabindex"))>=0)angular.element(i[0])[0].previousElementSibling.focus();else{var r=angular.element(i[0])[0];do{if(!r.previousSibling)break;r=r.previousSibling}while(r&&"LI"!==r.tagName);r.tagName&&"LI"===r.tagName&&parseInt(angular.element(n).attr("tabindex"))>=0&&r.focus()}}})}}}]),angular.module("att.abs.breadCrumbs",[]).constant("classConstant",{defaultClass:"breadcrumbs__link",activeClass:"breadcrumbs__link--active"}).directive("attCrumb",["classConstant",function(e){return{restrict:"A",link:function(t,n,i){n.addClass(e.defaultClass),"active"===i.attCrumb&&n.addClass(e.activeClass),n.hasClass("last")||n.after('<i class="breadcrumbs__item"></i>')}}}]),angular.module("att.abs.buttons",["att.abs.position","att.abs.utilities"]).constant("btnConfig",{btnClass:"button",btnPrimaryClass:"button--primary",btnSecondaryClass:"button--secondary",btnDisabledClass:"button--inactive",btnSmallClass:"button--small"}).directive("attButton",["btnConfig",function(e){return{restrict:"A",link:function(t,n,i){n.addClass(e.btnClass),"small"===i.size&&n.addClass(e.btnSmallClass),i.$observe("btnType",function(t){"primary"===t?(n.addClass(e.btnPrimaryClass),n.removeClass(e.btnSecondaryClass),n.removeClass(e.btnDisabledClass),n.removeAttr("disabled")):"secondary"===t?(n.addClass(e.btnSecondaryClass),n.removeClass(e.btnPrimaryClass),n.removeClass(e.btnDisabledClass),n.removeAttr("disabled")):"disabled"===t&&(n.addClass(e.btnDisabledClass),n.removeClass(e.btnPrimaryClass),n.removeClass(e.btnSecondaryClass),n.attr("disabled","disabled"))})}}}]).directive("attButtonLoader",[function(){return{restrict:"A",replace:!1,scope:{size:"@"},template:"<div ng-class=\"{'button--loading': size === 'large','button--loading__small': size === 'small'}\"><i></i><i class=\"second__loader\"></i><i></i></div>",link:function(e,t){t.addClass("button button--inactive")}}}]).directive("attButtonHero",[function(){return{restrict:"A",replace:!1,transclude:!0,scope:{icon:"@"},template:"<div class=\"button--hero__inner\"><span ng-transclude></span> <i ng-class=\"{'icon-arrow-right': icon === 'arrow-right','icon-cart': icon === 'cart'}\"></i></div>",link:function(e,t){t.addClass("button button--hero"),t.attr("tabindex","0")}}}]).directive("attBtnDropdown",["$document","$timeout","$isElement","$documentBind","keymap","events",function(e,t,n,i,a,s){return{restrict:"EA",scope:{type:"@dropdowntype"},replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html",link:function(r,o){r.isOpen=!1;var l=-1,c=[],d=void 0;t(function(){c=o.find("li"),d=o.find("button")[0]},10);var p=r.toggle=function(e){angular.isUndefined(e)||""===e?r.isOpen=!r.isOpen:r.isOpen=e},u=function(){l+1<c.length&&(l++,c[l].focus())},h=function(){l-1>=0&&(l--,c[l].focus())};o.bind("keydown",function(e){var t=e.keyCode;if(a.isAllowedKey(t)||a.isControl(e)||a.isFunctionKey(e))switch(t){case a.KEY.ENTER:l>0&&(d.focus(),r.$apply());break;case a.KEY.ESC:p(!1),l=-1,d.focus(),r.$apply();break;case a.KEY.DOWN:u(),r.$apply(),s.preventDefault(e),s.stopPropagation(e);break;case a.KEY.UP:h(),r.$apply(),s.preventDefault(e),s.stopPropagation(e)}else t===a.KEY.TAB&&(p(!1),l=-1,r.$apply())});var g=function(t){var i=n(angular.element(t.target),o,e);if(!i){p(!1),l=-1;for(var a=0;a<c.length;a++)angular.element(c[a]).removeClass("selected");d.focus(),r.$apply()}};i.click("isOpen",g,r)}}}]),angular.module("att.abs.checkbox",[]).constant("attCheckboxConfig",{activeClass:"att-checkbox--on",disabledClass:"att-checkbox--disabled"}).directive("checkboxLimit",function(){return{scope:{checkboxLimit:"=",selectLimit:"@?",maxSelected:"&?"},restrict:"A",require:"checkboxLimit",controller:["$scope",function(e){e.limit=!0,this.getMaxLimits=function(){return e.limit},this.setMaxLimits=function(t){e.limit=t},this.maxCheckboxSelected=function(){e.maxSelected()}}],link:function(e,t,n,i){e.$watch("checkboxLimit",function(){var t=0;for(var n in e.checkboxLimit)e.checkboxLimit.hasOwnProperty(n)&&e.checkboxLimit[n]&&(t+=1);t>=parseInt(e.selectLimit)?i.setMaxLimits(!1):i.setMaxLimits(!0)},!0)}}}).directive("attCheckbox",["$compile","attCheckboxConfig",function(e,t){return{scope:{},restrict:"A",require:["ngModel","^?checkboxLimit"],link:function(n,i,a,s){var r=s[0],o=s[1],l=e('<div tabindex="0" role="checkbox" att-accessibility-click="13,32" aria-label="Checkbox" ng-click="updateModel($event)" class="att-checkbox"></div>')(n);i.css({display:"none"}),i.wrap(l),i.parent().append('<div class="att-checkbox__indicator"></div>'),i.parent().attr("title",a.title),i.parent().attr("aria-label",a.title),i.parent().attr("id",a.id),i.removeAttr("id"),r.$render=function(){var e=r.$modelValue?!0:!1;i.parent().toggleClass(t.activeClass,e),i.parent().attr("aria-checked",e)},n.updateModel=function(e){n.disabled||(r.$setViewValue(i.parent().hasClass(t.activeClass)?!1:!0),o&&!o.getMaxLimits()&&r.$modelValue?(o.maxCheckboxSelected(),r.$setViewValue(i.parent().hasClass(t.activeClass)?!0:!1)):r.$render()),e.preventDefault()},a.$observe("disabled",function(e){n.disabled=e||"disabled"===e||"true"===e,i.parent().toggleClass(t.disabledClass,n.disabled),i.parent().attr("tabindex",n.disabled?"-1":"0")})}}}]).directive("checkboxGroup",["$compile",function(e){return{scope:{checkboxGroup:"=",checkboxGroupValue:"=?"},restrict:"A",link:function(t,n,i){t.checkboxState="none",void 0===t.checkboxGroupValue&&(t.checkboxGroupValue="indeterminate"),n.css({display:"none"}),n.wrap(e('<div tabindex="0" role="checkbox" att-accessibility-click="13,32" ng-click="updateModel($event)" class="att-checkbox"></div>')(t)),n.parent().append('<div class="att-checkbox__indicator"></div>'),n.parent().attr("title",i.title),n.parent().attr("aria-label",i.title),t.$watch("checkboxState",function(e){"all"===e?(n.parent().addClass("att-checkbox--on"),n.parent().removeClass("att-checkbox--indeterminate"),n.parent().attr("aria-checked",!0)):"none"===e?(n.parent().removeClass("att-checkbox--on"),n.parent().removeClass("att-checkbox--indeterminate"),n.parent().attr("aria-checked",!1)):"indeterminate"===e&&(n.parent().removeClass("att-checkbox--on"),n.parent().addClass("att-checkbox--indeterminate"),n.parent().attr("aria-checked",!0))}),t.updateModel=function(e){if(n.parent().hasClass("att-checkbox--on")){n.parent().removeClass("att-checkbox--on");for(var i in t.checkboxGroup)t.checkboxGroup.hasOwnProperty(i)&&(t.checkboxGroup[i]=!1)}else{n.parent().addClass("att-checkbox--on");for(var a in t.checkboxGroup)t.checkboxGroup.hasOwnProperty(a)&&(t.checkboxGroup[a]=!0)}e.preventDefault()},t.$watch("checkboxGroupValue",function(e){if(e===!1){n.parent().removeClass("att-checkbox--on");
+for(var i in t.checkboxGroup)t.checkboxGroup.hasOwnProperty(i)&&(t.checkboxGroup[i]=!1)}else if(e===!0){n.parent().addClass("att-checkbox--on");for(var a in t.checkboxGroup)t.checkboxGroup.hasOwnProperty(a)&&(t.checkboxGroup[a]=!0)}}),t.$watch("checkboxGroup",function(){var e=0,n=0,i=0;for(var a in t.checkboxGroup)t.checkboxGroup.hasOwnProperty(a)&&(i+=1,t.checkboxGroup[a]?e+=1:t.checkboxGroup[a]||(n+=1));i===e?(t.checkboxState="all",t.checkboxGroupValue=!0):i===n?(t.checkboxState="none",t.checkboxGroupValue=!1):(t.checkboxState="indeterminate",t.checkboxGroupValue="indeterminate")},!0)}}}]),angular.module("att.abs.colorselector",[]).directive("colorSelectorWrapper",[function(){return{scope:{selected:"=",iconColor:"@"},restrict:"AE",transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/colorselector/colorselector.html",link:function(e){e.applycolor={"background-color":e.iconColor},e.selectedcolor=function(t){e.selected=t}}}}]).directive("colorSelector",["$compile",function(e){return{restrict:"A",scope:{colorSelector:"@",ngModel:"="},link:function(t,n,i){n.removeAttr("color-selector");var a=i.title,s=angular.element('<color-selector-wrapper selected="ngModel" title="'+a+'" icon-color="{{colorSelector}}">'+n.prop("outerHTML")+"</color-selector-wrapper>"),r=e(s)(t);n.replaceWith(r)}}}]),angular.module("att.abs.datepicker",["att.abs.position","att.abs.utilities"]).constant("datepickerConfig",{dateFormat:"MM/dd/yyyy",dayFormat:"d",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEEE",dayTitleFormat:"MMMM yyyy",disableWeekend:!1,disableSunday:!1,startingDay:0,minDate:null,maxDate:null,mode:0,dateFilter:{defaultText:"Select from list"},datepickerEvalAttributes:["dateFormat","dayFormat","monthFormat","yearFormat","dayHeaderFormat","dayTitleFormat","disableWeekend","disableSunday","startingDay","mode"],datepickerWatchAttributes:["min","max"]}).factory("datepickerService",["datepickerConfig","dateFilter",function(e,t){var n=function(t,n){if(angular.isDefined(t)&&null!==t&&angular.isDefined(n)&&null!==n){var i=e.datepickerEvalAttributes.concat(e.datepickerWatchAttributes);for(var a in t){var s=t[a];-1!==i.indexOf(a)&&angular.isDefined(s)&&n.attr(a.toSnakeCase(),a)}}},i=function(t,n){if(angular.isDefined(t)&&null!==t&&angular.isDefined(n)&&null!==n){var i=function(e,t){n[e]=n.$parent.$eval(t)},a=function(e,t){n.$parent.$watch(t,function(t){n[e]=t}),n.$watch(e,function(e){n.$parent[t]=e})},s=e.datepickerEvalAttributes,r=e.datepickerWatchAttributes;for(var o in t){var l=t[o];-1!==s.indexOf(o)&&angular.isDefined(l)?i(o,l):-1!==r.indexOf(o)&&angular.isDefined(l)&&a(o,l)}}},a=function(e,n){if(e&&n){var i;-1!==n.indexOf("/")?i="/":-1!==n.indexOf("-")?i="-":-1!==n.indexOf(".")&&(i=".");var a=e.split(i),s=n.split(i);if(a.length!==s.length)return!1;for(var r=0;r<a.length;r++)a[r]=a[r].lPad(s[r].length,"0");var o=a.join(i),l=t(new Date(o),n);return o===l}};return{setAttributes:n,bindScope:i,validateDateString:a}}]).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function(e,t,n,i){function a(t,n){return angular.isDefined(t)?e.$parent.$eval(t):n}function s(e,t){return new Date(e,t,0).getDate()}function r(e,t){for(var n=[],i=e,a=0;t>a;)n[a++]=new Date(i),i.setDate(i.getDate()+1);return n}function o(t){return t&&angular.isDate(e.currentDate)&&0===y(t,e.currentDate)?!0:!1}function l(t){return t&&angular.isDate(e.fromDate)&&0===y(t,e.fromDate)?!0:!1}function c(t){return t&&angular.isDate(e.fromDate)&&angular.isDate(e.currentDate)&&0===y(t,e.currentDate)?!0:!1}function d(t){return t&&angular.isDate(e.fromDate)&&angular.isDate(e.currentDate)&&y(t,e.fromDate)>=0&&y(t,e.currentDate)<=0?!0:!1}function p(e){return"Saturday"===n(e,b.dayHeader)||"Sunday"===n(e,b.dayHeader)?!0:!1}function u(t){return 0===y(t,e.resetTime(new Date))?!0:!1}function h(t){return t&&angular.isDate(e.focusedDate)&&0===y(t,e.focusedDate)?!0:!1}function g(t,n){return e.minDate&&e.minDate.getTime()>=t.getTime()&&e.minDate.getTime()<=n.getTime()}function f(t,n){return e.maxDate&&e.maxDate.getTime()>=t.getTime()&&e.maxDate.getTime()<=n.getTime()}function m(e){if(e){var t={pre:e.substr(0,3),post:e};return t}}function v(e){return{date:e.date,label:n(e.date,e.formatDay),header:n(e.date,e.formatHeader),focused:!!e.isFocused,selected:!!e.isSelected,from:!!e.isFromDate,to:!!e.isToDate,dateRange:!!e.isDateRange,oldMonth:!!e.oldMonth,nextMonth:!!e.newMonth,disabled:!!e.isDisabled,today:!!e.isToday,weekend:!!e.isWeakend}}var b={date:a(t.dateFormat,i.dateFormat),day:a(t.dayFormat,i.dayFormat),month:a(t.monthFormat,i.monthFormat),year:a(t.yearFormat,i.yearFormat),dayHeader:a(t.dayHeaderFormat,i.dayHeaderFormat),dayTitle:a(t.dayTitleFormat,i.dayTitleFormat),disableWeekend:a(t.disableWeekend,i.disableWeekend),disableSunday:a(t.disableSunday,i.disableSunday)},_=a(t.startingDay,i.startingDay);e.mode=a(t.mode,i.mode),e.minDate=i.minDate?e.resetTime(i.minDate):null,e.maxDate=i.maxDate?e.resetTime(i.maxDate):null;var y=this.compare=function(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate())-new Date(t.getFullYear(),t.getMonth(),t.getDate())},w=this.isDisabled=function(t){return b.disableWeekend!==!0||"Saturday"!==n(t,b.dayHeader)&&"Sunday"!==n(t,b.dayHeader)?b.disableSunday===!0&&"Sunday"===n(t,b.dayHeader)?!0:e.minDate&&y(t,e.minDate)<0||e.maxDate&&y(t,e.maxDate)>0:!0};this.modes=[{name:"day",getVisibleDates:function(t,i){var a=t.getFullYear(),y=t.getMonth(),k=new Date(a,y,1),C=new Date(a,y+1,0),S=_-k.getDay(),x=S>0?7-S:-S,T=new Date(k),D=0;x>0&&(T.setDate(-x+1),D+=x),D+=s(a,y+1),D+=(7-D%7)%7;for(var $=r(T,D),A=[],E=0;D>E;E++){var I=new Date($[E]);$[E]=v({date:I,formatDay:b.day,formatHeader:b.dayHeader,isFocused:h(I),isSelected:o(I),isFromDate:l(I),isToDate:c(I),isDateRange:d(I),oldMonth:new Date(I.getFullYear(),I.getMonth(),1,0,0,0).getTime()<new Date(a,y,1,0,0,0).getTime(),newMonth:new Date(I.getFullYear(),I.getMonth(),1,0,0,0).getTime()>new Date(a,y,1,0,0,0).getTime(),isDisabled:w(I),isToday:u(I),isWeakend:p(I)})}for(var P=0;7>P;P++)A[P]=m(n($[P].date,b.dayHeader));return"top"===i?(e.disablePrevTop=g(k,C),e.disableNextTop=f(k,C)):"bottom"===i?(e.disablePrevBottom=g(k,C),e.disableNextBottom=f(k,C)):(e.disablePrevTop=e.disablePrevBottom=g(k,C),e.disableNextTop=e.disableNextBottom=f(k,C)),e.disablePrev=e.disablePrevTop||e.disablePrevBottom,e.disableNext=e.disableNextTop||e.disableNextBottom,{objects:$,title:n(t,b.dayTitle),labels:A}},split:7,step:{months:1}},{name:"month",getVisibleDates:function(e){for(var t=[],i=[],a=e.getFullYear(),s=0;12>s;s++){var r=new Date(a,s,1);t[s]=v({date:r,formatDay:b.month,formatHeader:b.month,isFocused:h(r),isSelected:o(r),isFromDate:l(r),isToDate:c(r),isDateRange:d(r),oldMonth:!1,newMonth:!1,isDisabled:w(r),isToday:u(r),isWeakend:!1})}return{objects:t,title:n(e,b.year),labels:i}},split:3,step:{years:1}}]}]).directive("datepicker",["$timeout",function(e){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/datepicker.html",scope:{currentDate:"=?current",fromDate:"=?from"},require:"datepicker",controller:"DatepickerController",link:function(t,n,i,a){function s(e,t){for(var n=[];e.length>0;)n.push(e.splice(0,t));return n}function r(e){if(angular.isDate(e)&&!isNaN(e)?o=new Date(e):o||(o=new Date),o){var n;1===t.mode?(o=new Date,n=d(angular.copy(o),-1)):n=angular.copy(o);var i=l.modes[t.mode],a=i.getVisibleDates(n,"top");t.currentRows=s(a.objects,i.split),t.currentTitle=a.title,t.labels=a.labels||[];var r=i.getVisibleDates(d(angular.copy(n),1),"bottom");t.nextRows=s(r.objects,i.split),t.nextTitle=r.title}}var o,l=a,c=!1;t.focusedDate,t.resetTime=function(e){var n;return isNaN(new Date(e))?null:(n=new Date(e),n=1===t.mode?new Date(n.getFullYear(),n.getMonth()):new Date(n.getFullYear(),n.getMonth(),n.getDate()))},i.min&&t.$parent.$watch(i.min,function(e){t.minDate=e?t.resetTime(e):null,r()}),i.max&&t.$parent.$watch(i.max,function(e){t.maxDate=e?t.resetTime(e):null,r()});var d=function(e,n){var i=l.modes[t.mode].step;return e.setDate(1),e.setMonth(e.getMonth()+n*(i.months||0)),e.setFullYear(e.getFullYear()+n*(i.years||0)),e},p=function(e){var n=new Date(e.getFullYear(),e.getMonth(),e.getDate());t.currentDate=n},u=function(e){var n=new Date(e.getFullYear(),e.getMonth(),e.getDate());t.fromDate=n};t.select=function(e){c=!0,i.from?angular.isDate(t.fromDate)&&angular.isDate(t.currentDate)||(angular.isDate(t.fromDate)?p(e):angular.isDate(t.fromDate)||u(e)):p(e),t.focusedDate=e};var h=function(n,i){u(i),e(function(){c=!0,t.focusedDate=i,p(n)})};t.move=function(e){o=d(angular.copy(o),e),r()},t.$watch("currentDate",function(e){return angular.isDate(e)&&!isNaN(e)&&l.isDisabled(e)?void(t.currentDate=null):i.from&&!isNaN(e)&&!isNaN(t.fromDate)&&l.compare(e,t.fromDate)<0?void h(t.fromDate,e):(c?(r(),c=!1):angular.isDefined(e)&&null!==e?r(e):r(),void(t.focusedDate=void 0))}),t.$watch("fromDate",function(e){if(angular.isDate(e)&&!isNaN(e)&&l.isDisabled(e))return void(t.fromDate=null);if(i.from){if(!isNaN(t.currentDate)&&!isNaN(e)&&l.compare(t.currentDate,e)<0)return void h(e,t.currentDate);c?(r(),c=!1):angular.isDefined(e)&&null!==e?r(e):r()}t.focusedDate=void 0})}}}]).directive("datepickerPopup",["$document","datepickerService","$isElement","$documentBind",function(e,t,n,i){var a=function(a,s,r){t.bindScope(r,a),a.isOpen=!1;var o=a.toggle=function(e){e===!0||e===!1?a.isOpen=e:a.isOpen=!a.isOpen};a.$watch("current",function(){o(!1)});var l=function(t){var i=n(angular.element(t.target),s,e);i||(o(!1),a.$apply())};i.click("isOpen",l,a)};return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html",scope:{current:"=current"},compile:function(e,n){var i=e.find("span").eq(1);return i.attr("current","current"),t.setAttributes(n,i),a}}}]).directive("attDatepicker",["$log",function(e){return{restrict:"A",require:"ngModel",scope:{},controller:["$scope","$element","$attrs","$compile","datepickerConfig","datepickerService",function(e,t,n,i,a,s){var r=angular.isDefined(n.dateFormat)?e.$parent.$eval(n.dateFormat):a.dateFormat,o='<div class="sr-focus hidden-spoken" tabindex="-1">the date you selected is {{$parent.current | date : \''+r+"'}}</div>";t.removeAttr("att-datepicker"),t.removeAttr("ng-model"),t.attr("ng-model","$parent.current"),t.attr("aria-describedby","datepicker"),t.attr("format-date",r),t.attr("att-input-deny","[^0-9/-]"),t.attr("maxlength",10),t.attr("readonly","readonly");var l=angular.element("<div></div>");l.attr("datepicker-popup",""),l.attr("current","current"),s.setAttributes(n,l),s.bindScope(n,e),l.html(""),l.append(t.prop("outerHTML")),null===navigator.userAgent.match(/MSIE 8/)&&l.append(o);var c=l.prop("outerHTML");c=i(c)(e),t.replaceWith(c)}],link:function(t,n,i,a){return a?(t.$watch("current",function(e){a.$setViewValue(e)}),void(a.$render=function(){t.current=a.$viewValue})):void e.error("ng-model is required.")}}}]).directive("formatDate",["dateFilter","datepickerService",function(e,t){return{restrict:"A",require:"ngModel",link:function(n,i,a,s){var r="";a.$observe("formatDate",function(e){r=e});var o=function(t){return t?(s.$setValidity("invalidDate",!0),e(t,r)):(s.$setValidity("invalidDate",!1),i.val())},l=function(e){return t.validateDateString(e,r)?(s.$setValidity("invalidDate",!0),new Date(e)):(s.$setValidity("invalidDate",!1),null)};s.$formatters.unshift(o),s.$parsers.unshift(l)}}}]).directive("attDateFilter",["$document","dateFilter","datepickerConfig","datepickerService","$isElement","$documentBind",function(e,t,n,i,a,s){var r=function(r,o,l,c){i.bindScope(l,r),r.selectedOption=n.dateFilter.defaultText,r.showDropdownList=!1,r.showCalendar=!1,r.applyButtonType="disabled",r.currentSelection="";var d=angular.isDefined(l.dateFormat)?r.$parent.$eval(l.dateFormat):n.dateFormat,p=!1,u=function(e){if(!p){var n=d.toUpperCase(),i=d.toUpperCase();isNaN(new Date(r.fromDate))||(n=t(r.fromDate,d)),isNaN(new Date(r.currentDate))||(i=t(r.currentDate,d)),"Custom Single Date"===e?(c.$setValidity("invalidDate",!0),r.maxLength=10,r.selectedOption=i):"Custom Range"===e&&(c.$setValidity("invalidDate",!0),c.$setValidity("invalidDateRange",!0),r.maxLength=21,r.selectedOption=n+"-"+i)}},h=r.clear=function(e){r.fromDate=void 0,r.currentDate=void 0,r.applyButtonType="disabled",e||(c.$setValidity("invalidDate",!0),c.$setValidity("invalidDateRange",!0),u(r.currentSelection))},g=function(){r.showCalendar=!0},f=function(){r.showCalendar=!1,"Custom Single Date"!==r.currentSelection&&"Custom Range"!==r.currentSelection&&h(!0)},m=r.showDropdown=function(e){e===!0||e===!1?r.showDropdownList=e:r.showDropdownList=!r.showDropdownList,r.showDropdownList?("Custom Single Date"===r.currentSelection||"Custom Range"===r.currentSelection)&&g():(r.focusInputButton=!0,f())};r.resetTime=function(e){var t;return isNaN(new Date(e))?null:(t=new Date(e),new Date(t.getFullYear(),t.getMonth(),t.getDate()))},r.getDropdownText=function(){p=!0;var e=r.selectedOption;if("Custom Single Date"===r.currentSelection)!isNaN(new Date(e))&&i.validateDateString(e,d)?(c.$setValidity("invalidDate",!0),r.fromDate=void 0,r.currentDate=new Date(e)):(c.$setValidity("invalidDate",!1),h(!0));else if("Custom Range"===r.currentSelection)if(-1===e.indexOf("-")||2!==e.split("-").length&&6!==e.split("-").length)c.$setValidity("invalidDateRange",!1),h(!0);else{c.$setValidity("invalidDateRange",!0);var t=e.split("-");if(2===t.length)t[0]=t[0].trim(),t[1]=t[1].trim();else if(6===t.length){var n=t[0].trim()+"-"+t[1].trim()+"-"+t[2].trim(),a=t[3].trim()+"-"+t[4].trim()+"-"+t[5].trim();t[0]=n,t[1]=a}if(!isNaN(new Date(t[0]))&&!isNaN(new Date(t[1]))&&i.validateDateString(t[0],d)&&i.validateDateString(t[1],d)){c.$setValidity("invalidDate",!0);var s=new Date(t[0]),o=new Date(t[1]);s.getTime()<o.getTime()?(c.$setValidity("invalidDateRange",!0),r.fromDate=s,r.currentDate=o):(c.$setValidity("invalidDateRange",!1),h(!0))}else c.$setValidity("invalidDate",!1),h(!0)}},r.untrackInputChange=function(){p=!1},r.selectAdvancedOption=function(e,t){r.currentSelection=e,t||(h(),g()),r.$watch("currentDate",function(t){isNaN(new Date(t))||(r.applyButtonType="primary",u(e),p||(r.focusApplyButton=!0))}),r.$watch("fromDate",function(t){isNaN(new Date(t))||u(e)}),"Custom Single Date"===e?r.focusSingleDateCalendar=!0:"Custom Range"===e&&(r.focusRangeCalendar=!0)},r.resetFocus=function(){r.focusSingleDateCalendar=!1,r.focusRangeCalendar=!1,r.focusApplyButton=!1},r.apply=function(){r.dateRange.selection=r.selectedOption,isNaN(new Date(r.fromDate))?(r.from=void 0,r.dateRange.from=void 0):(r.from=r.fromDate,r.dateRange.from=r.fromDate),isNaN(new Date(r.currentDate))?(r.current=void 0,r.dateRange.current=void 0):(r.current=r.currentDate,r.dateRange.current=r.currentDate),m()},r.$watchCollection(function(){return r.dateRange},function(e){if(c){var t=angular.copy(e);c.$setViewValue(t)}}),c.$render=function(){if(c.$viewValue){var e=c.$viewValue;r.selectedOption=e.selection,r.fromDate=e.from,r.currentDate=e.current,void 0!==r.fromDate&&void 0!==r.currentDate?(r.selectAdvancedOption("Custom Range",!0),r.dateRange.from=r.fromDate,r.dateRange.current=r.currentDate):void 0!==r.currentDate&&(r.selectAdvancedOption("Custom Single Date",!0),r.dateRange.from=void 0,r.dateRange.current=r.currentDate)}},r.cancel=function(){r.currentSelection="",r.selectedOption=n.dateFilter.defaultText,m()};var v=function(t){var n=a(angular.element(t.target),o,e);n||(r.cancel(),r.$apply())};s.click("showDropdownList",v,r)};return{restrict:"EA",scope:{from:"=?from",current:"=?current"},replace:!0,require:"?ngModel",transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/dateFilter.html",controller:["$scope","$element","$attrs",function(e){e.dateRange={selection:void 0,from:void 0,current:void 0},this.selectOption=function(t,n,i){e.selectedOption=i,e.currentSelection=i,e.dateRange.selection=i,e.dateRange.current=e.resetTime(n),e.dateRange.from=e.resetTime(t),e.showDropdown()},e.checkCurrentSelection=this.checkCurrentSelection=function(t){return t===e.currentSelection?!0:!1}}],compile:function(e,t){var n=e.find("span").eq(4),a=e.find("span").eq(5);return a.attr("from","fromDate"),n.attr("current","currentDate"),a.attr("current","currentDate"),i.setAttributes(t,n),i.setAttributes(t,a),r}}}]).directive("attDateFilterList",function(){return{restrict:"EA",scope:{fromDate:"=fromDate",toDate:"=toDate",caption:"=caption",disabled:"=disabled"},require:"^attDateFilter",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html",link:function(e,t,n,i){e.selectOption=function(e,t,n){i.selectOption(e,t,n)},e.checkCurrentSelection=i.checkCurrentSelection}}}),angular.module("att.abs.devNotes",[]).directive("attDevNotes",function(){return{restrict:"EA",transclude:!0,scope:{},controller:function(e){var t=e.panes=[];e.select=function(e){angular.forEach(t,function(e){e.selected=!1}),e.selected=!0},this.addPane=function(n){0===t.length&&e.select(n),t.push(n)}},template:'<div><ul class="tabs"><li ng-repeat="pane in panes" ng-class="{active:pane.selected}"><a href="javascript:void(0)" ng-click="select(pane)">{{pane.title}}</a></li></ul><div ng-transclude></div></div>',replace:!0}}).directive("pane",function(){return{require:"^attDevNotes",restrict:"EA",transclude:!0,scope:{title:"@"},link:function(e,t,n,i){i.addPane(e)},template:'<div class="tab-pane" ng-class="{active: selected}">'+"<pre ng-class=\"{'language-markup':title=='HTML','language-javascript':title=='JavaScript','language-json':title=='JSON'}\"  class=\" line-numbers\"><code ng-transclude></code></pre></div>",replace:!0}}),angular.module("att.abs.dividerLines",[]).directive("attDividerLines",[function(){return{scope:{attDividerLines:"@"},restrict:"A",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html",link:function(e,t,n){e.lightContainer=n.attDividerLines}}}]),angular.module("att.abs.dragdrop",[]).directive("attFileDrop",["$parse",function(e){return{restrict:"A",scope:{fileModel:"=",onDrop:"&",attFileDrop:"&"},controller:["$scope","$attrs",function(e,t){""!==t.attFileDrop&&(e.onDrop=e.attFileDrop),this.onDrop=e.onDrop}],link:function(t,n){n.addClass("dragdrop"),n.bind("dragover",function(e){return e.originalEvent&&(e.dataTransfer=e.originalEvent.dataTransfer),e.dataTransfer.dropEffect="move",e.preventDefault&&e.preventDefault(),n.addClass("dragdrop-over"),!1}),n.bind("dragenter",function(e){return e.preventDefault&&e.preventDefault(),n.addClass("dragdrop-over"),!1}),n.bind("dragleave",function(){return n.removeClass("dragdrop-over"),!1}),n.bind("drop",function(i){return i.preventDefault&&i.preventDefault(),i.stopPropagation&&i.stopPropagation(),i.originalEvent&&(i.dataTransfer=i.originalEvent.dataTransfer),n.removeClass("dragdrop-over"),i.dataTransfer.files&&i.dataTransfer.files.length>0&&(t.fileModel=i.dataTransfer.files[0],t.$apply(),"function"==typeof t.onDrop&&(t.onDrop=e(t.onDrop),t.onDrop())),!1})}}}]).directive("attFileLink",[function(){return{restrict:"EA",require:"^?attFileDrop",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html",scope:{fileModel:"=?",onFileSelect:"&",attFileLink:"&"},controller:["$scope","$parse",function(e,t){this.setFileModel=function(t){e.takeFileModelFromParent?(e.$parent.fileModel=t,e.$parent.$apply()):(e.fileModel=t,e.$apply())},this.callbackFunction=function(){"function"==typeof e.onFileSelect&&(e.onFileSelect=t(e.onFileSelect),e.onFileSelect())}}],link:function(e,t,n,i){e.takeFileModelFromParent=!1,!n.fileModel&&i&&(e.takeFileModelFromParent=!0),""!==n.attFileLink?e.onFileSelect=e.attFileLink:!n.onFileSelect&&i&&(e.onFileSelect=i.onDrop)}}}]).directive("attFileChange",["$log","$rootScope",function(e,t){return{restrict:"A",require:"^attFileLink",link:function(n,i,a,s){function r(n){if(n.target.files&&n.target.files.length>0)s.setFileModel(n.target.files[0]),s.callbackFunction();else{var i=n.target.value;try{var a=new ActiveXObject("Scripting.FileSystemObject");s.setFileModel(a.getFile(i)),s.callbackFunction()}catch(n){var r="Error: Please follow the guidelines of Drag and Drop component on Sandbox demo page.";e.error(r),t.$broadcast("att-file-link-failure",r)}}}i.bind("change",r)}}}]),angular.module("att.abs.drawer",["att.abs.utilities"]).directive("attDrawer",["$document","$timeout","DOMHelper",function(e,t,n){return{restrict:"EA",replace:!0,transclude:!0,scope:{drawerOpen:"=?",drawerAutoClose:"&?"},template:'<div><div class="att-drawer" ng-transclude></div><div ng-class="{\'drawer-backdrop\':drawerOpen}"></div></div>',link:function(e,i,a){function s(t,n){t&&0!==t.style.width&&0!==t.style.height&&(u.style.display="none","right"===n.side||"left"===n.side?t.style.width="0px":("top"===n.side||"bottom"===n.side)&&(t.style.height="0px")),e.drawerOpen=!1,angular.isDefined(d)&&null!=d&&d.focus()}function r(e,n){d=document.activeElement,0!==e.style.width&&0!==e.style.height&&("right"===n.side||"left"===n.side?e.style.width=n.size:("top"===n.side||"bottom"===n.side)&&(e.style.height=n.size),t(function(){u.style.display="block",angular.isDefined(c)&&null!=c&&c.focus()},1e3*n.speed))}function o(e){var t={};return e&&"[object Function]"===t.toString.call(e)}var l={},c=void 0,d=void 0;l.side=a.drawerSlide||"top",l.speed=a.drawerSpeed||"0.25",l.size=a.drawerSize||"300px",l.zindex=a.drawerZindex||1e3,l.className=a.drawerClass||"att-drawer";var p=i.eq(0).children()[0],u=angular.element(p).children()[0];p.className=l.className,p.style.transitionDuration=l.speed+"s",p.style.webkitTransitionDuration=l.speed+"s",p.style.zIndex=l.zindex,p.style.position="fixed",p.style.width=0,p.style.height=0,p.style.transitionProperty="width, height","right"===l.side?(p.style.height=a.drawerCustomHeight||"100%",p.style.top=a.drawerCustomTop||"0px",p.style.bottom=a.drawerCustomBottom||"0px",p.style.right=a.drawerCustomRight||"0px"):"left"===l.side?(p.style.height=a.drawerCustomHeight||"100%",p.style.top=a.drawerCustomTop||"0px",p.style.bottom=a.drawerCustomBottom||"0px",p.style.left=a.drawerCustomRight||"0px"):("top"===l.side||"bottom"===l.side)&&(p.style.width=a.drawerCustomWidth||"100%",p.style.left=a.drawerCustomLeft||"0px",p.style.top=a.drawerCustomTop||"0px",p.style.right=a.drawerCustomRight||"0px"),t(function(){c=n.firstTabableElement(i[0])},10,!1),a.drawerSize&&e.$watch(function(){return a.drawerSize},function(t){l.size=t,e.drawerOpen&&r(p,l)}),e.$watch("drawerOpen",function(e){e?r(p,l):s(p,l)}),e.drawerAutoClose()&&(e.$on("$locationChangeStart",function(){s(p,l),o(e.drawerAutoClose())&&e.drawerAutoClose()}),e.$on("$stateChangeStart",function(){s(p,l),o(e.drawerAutoClose)&&e.drawerAutoClose()}))}}}]),angular.module("att.abs.message",[]).directive("attMessages",[function(){return{restrict:"EA",scope:{messageType:"=?"},controller:["$scope","$element","$attrs",function(e,t,n){e.messageScope=[],this.registerScope=function(t){e.messageScope.push(t)},e.$parent.$watchCollection(n["for"],function(t){for(var n in t){if(t[n]){e.error=n;break}e.error=null}for(var i=0;i<e.messageScope.length;i++)e.messageScope[i].when===e.error?(e.messageScope[i].show(),e.setMessageType(e.messageScope[i].type)):e.messageScope[i].hide();null===e.error&&e.setMessageType(null)}),e.setMessageType=this.setMessageType=function(t){n.messageType&&(e.messageType=t)}}]}}]).directive("attMessage",[function(){return{restrict:"EA",scope:{},require:"^attMessages",link:function(e,t,n,i){i.registerScope(e),t.attr("role","alert"),e.when=n.when||n.attMessage,e.type=n.type,e.show=function(){t.css({display:"block"})},e.hide=function(){t.css({display:"none"})},e.hide()}}}]),angular.module("att.abs.formField",["att.abs.message","att.abs.utilities"]).directive("attFormField",[function(){return{priority:101,restrict:"A",controller:function(){},link:function(e,t,n){t.wrap('<div class="form-field"></div>'),t.parent().append('<label class="form-field__label">'+n.placeholder||n.attFormField+"</label>"),t.wrap('<div class="form-field-input-container"></div>'),t.bind("keyup",function(){""!==this.value?t.parent().parent().find("label").addClass("form-field__label--show").removeClass("form-field__label--hide"):t.parent().parent().find("label").addClass("form-field__label--hide").removeClass("form-field__label--show")}),t.bind("blur",function(){""===this.value&&t.parent().parent().find("label").removeClass("form-field__label--hide")})}}}]).directive("attFormFieldValidation",["$compile","$log",function(e,t){return{priority:102,scope:{},restrict:"A",require:["?ngModel","?attFormField"],link:function(n,i,a,s){var r=s[0],o=s[1];return n.valid="",r?o?(i.parent().append(e(angular.element('<i class="icon-info-alert error" ng-show="valid===false">&nbsp;</i>'))(n)),i.parent().append(e(angular.element('<i class="icon-info-success success" ng-show="valid===true">&nbsp;</i>'))(n)),n.$watch("valid",function(e){e?i.parent().parent().addClass("success"):e===!1?i.parent().parent().addClass("error"):i.parent().parent().removeClass("success").removeClass("error")}),void i.bind("keyup",function(){r.$valid?n.valid=!0:r.$invalid?n.valid=!1:n.valid="",n.$apply()})):void t.error("att-form-field-validation :: att-form-field directive is required."):void t.error("att-form-field-validation :: ng-model directive is required.")}}}]).directive("attFormFieldValidationAlert",["$timeout",function(e){return{scope:{messageType:"=?"},restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html",link:function(t,n,i,a){t.showLabel=!1,t.hideLabel=!1,t.errorMessage=!1,t.warningMessage=!1;var s=function(){var e=t.messageType;"error"===e?(t.errorMessage=!0,t.warningMessage=!1):"warning"===e?(t.errorMessage=!1,t.warningMessage=!0):(t.errorMessage=!1,t.warningMessage=!1)},r=-1!==navigator.userAgent.toLowerCase().indexOf("msie 8.0");n.find("label").text(n.find("input").attr("placeholder")),n.find("input").bind("keyup",function(){""!==this.value?(t.showLabel=!0,t.hideLabel=!1,r&&n.find("label").css({top:"-20px"})):(t.showLabel=!1,t.hideLabel=!0,r&&n.find("label").css({top:"0px"})),s(),t.$apply()}),n.find("input").bind("blur",function(){""===this.value&&(t.showLabel=!1,t.hideLabel=!1),t.$apply()}),e(function(){s()},100)}}}]).constant("CoreFormsUiConfig",{phoneMask:"(___) ___-____"}).directive("attPhoneMask",["$parse","CoreFormsUiConfig",function(e,t){return{require:"ngModel",scope:{ngModel:"="},link:function(e,n,i,a){var s=navigator.userAgent.toLowerCase(),r=s.indexOf("android")>-1,o=(-1!==s.indexOf("msie 8.0"),""),l=!1;o=r?"__________":t.phoneMask,n.attr("maxlength",o.length);var c=function(e){var t=!1;return e&&(t=10===e.length),a.$setValidity("invalidPhoneNumber",l),a.$setValidity("mask",t),t},d=function(){var e,t=a.$modelValue;if(t.length){var n,i,s,r,l;for(r=[],s=o.split(""),l=s.length,n=t.substring(0,o.length),i=t.replace(/[^0-9]/g,"").split(""),e=0;l>e&&(r.push("_"===s[e]?i.shift():s[e]),0!==i.length);e++);return t=r.join(""),"("===t&&(t=""),a.$setViewValue(t),a.$render(),t}},p=function(t){t.which&&((t.which<48||t.which>57)&&(t.which<96||t.which>105)?8===t.which||9===t.which||46===t.which||13===t.which||37===t.which||39===t.which||t.ctrlKey===!0||"118"===t.which&&"86"===t.which||t.ctrlKey===!0||"99"===t.which&&"67"===t.which||t.ctrlKey===!0||"120"===t.which&&"88"===t.which||(t.preventDefault?t.preventDefault():t.returnValue=!1,n.attr("aria-label","Only numbers are allowed"),l=!1):(n.removeAttr("aria-label"),l=!0)),e.$apply()},u=function(e){var t=/^[A-Za-z]+$/,n=/^[0-9]+$/;e.match(t)&&(l=!1),e.match(n)&&(l=!0);var i="";return e&&e.length>0&&(i=e.replace(/[^0-9]/g,"")),c(i),i},h=function(e){var t="";return c(e),e&&(t=d()),t};a.$parsers.push(u),a.$formatters.push(h),n.bind("keyup",d),n.bind("keydown",p),n.bind("input",function(e){d(e),p(e)})}}}]).constant("validationTypeInt",{validationNum:{number:"1",text:"2",email:"3"}}).directive("attFormFieldPrv",["keyMapAc","validationTypeInt",function(e,t){return{priority:101,restrict:"AE",controller:["$scope",function(n){this.showHideErrorMessage=function(e){null!=n.$$prevSibling&&angular.isDefined(n.$$prevSibling)&&angular.isDefined(n.$$prevSibling.hideErrorMsg)&&(n.$$prevSibling.hideErrorMsg=e,n.$apply())},this.findAllowedCharactor=function(t){var i=e.keys;if(angular.isDefined(n.allowedSpecialCharacters)&&angular.isDefined(n.allowedSpecialCharacters.length)&&n.allowedSpecialCharacters.length>0){for(var a=n.allowedSpecialCharacters,s=!1,r=0;r<a.length;r++)if(a[r]===i[t]){s=!0;break}return s}return!1},this.validateText=function(e,t,n,i){if(angular.isDefined(t)&&0===t.length){var a=/^[a-zA-Z0-9]*$/i;return a.test(n)}var s="^[a-zA-Z0-9"+i+"]*$",r=new RegExp(s,"i");return r.test(n)},this.validateNumber=function(e,t,n,i){if(angular.isDefined(t)&&0===t.length){var a=/^[0-9\.]+$/;return a.test(n)}var s="^[0-9."+i+"]*$",r=new RegExp(s,"i");return r.test(n)},this.validateEmail=function(e,t,n,i){if(angular.isDefined(t)&&0===t.length){var a=/(([a-zA-Z0-9\-?\.?]+)@(([a-zA-Z0-9\-_]+\.)+)([a-z]{2,3}))+$/;return a.test(n)}var s="(([a-z"+i+"A-Z0-9-?.?]+)@(([a-z"+i+"A-Z0-9-_]+.)+)(["+i+"a-z]{2,3}))+$",r=new RegExp(s,"i");return r.test(n)},this.validateInput=function(e,n,i){var a="",s=!1;if(angular.isDefined(n)&&angular.isDefined(n.length)&&n.length>0)for(var r=0;r<n.length;r++)a+="\\"+n[r];switch(t.validationNum[e]){case t.validationNum.text:s=this.validateText(e,n,i,a);break;case t.validationNum.number:s=this.validateNumber(e,n,i,a);break;case t.validationNum.email:s=this.validateEmail(e,n,i,a)}return s}}],link:function(e,t,n){t.parent().prepend('<label class="form-field__label">'+n.placeholder+"</label>"),t.wrap('<div class="form-field-input-container"></div>'),t.parent().parent().find("label").addClass("form-field__label--show")}}}]).directive("attFormFieldValidationPrv",["keyMapAc","validationTypeInt",function(e,t){return{priority:202,scope:{validationType:"=",allowedChars:"="},restrict:"A",require:["?ngModel","^attFormFieldPrv"],link:function(n,i,a,s){var r=s[1];i.bind("keyup",function(){r.validateInput(n.validationType,n.allowedChars,i[0].value)?r.showHideErrorMessage(!1):r.showHideErrorMessage(!0)});var o=e.keyRange,l=e.allowedKeys,c=function(e,t){var n=t.which<o.startNum||t.which>o.endNum,i=t.which<o.startCapitalLetters||t.which>o.endCapitalLetters,a=t.which<o.startSmallLetters||t.which>o.endSmallLetters,s=n&&i&&a;return s&&!e},d=function(e,t){return(t.which<o.startNum||t.which>o.endNum)&&!e},p=function(e,t){var n="-"!==String.fromCharCode(t.which)&&"_"!==String.fromCharCode(t.which),i="@"!==String.fromCharCode(t.which)&&"."!==String.fromCharCode(t.which),a=n&&i,s=c(e,t);return!e&&a&&s},u=function(e,n,i){switch(e){case t.validationNum.text:if(c(n,i))return!0;break;case t.validationNum.number:if(d(n,i))return!0;break;case t.validationNum.email:if(p(n,i))return!0}return!1};i.bind("keypress",function(e){e.which||(e.keyCode?e.which=e.keyCode:e.charCode&&(e.which=e.charCode));var i=r.findAllowedCharactor(e.which),a=angular.isDefined(n.validationType)&&""!==n.validationType,s=e.which!==l.TAB&&e.which!==l.BACKSPACE&&e.which!==l.DELETE,o=a&&s;o&&u(t.validationNum[n.validationType],i,e)&&e.preventDefault()})}}}]).directive("attFormFieldValidationAlertPrv",[function(){return{restrict:"A",scope:{errorMessage:"="},transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html",link:function(e){e.errorMessage=e.errorMessage,angular.isDefined(e.$parent.hideErrorMsg)?e.hideErrorMsg=e.$parent.hideErrorMsg:e.hideErrorMsg=!0}}}]).factory("Cards",[function(){var e=/(\d{1,4})/g,t=/(?:^|\s)(\d{4})$/,n=[{type:"discover",pattern:/^(6011|65|64[4-9]|622)/,format:e,inputFormat:t,length:[16],cvcLength:[3],cvcSecurityImg:"visaI",zipLength:[5],luhn:!0},{type:"mc",pattern:/^5[1-5]/,format:e,inputFormat:t,length:[16],cvcLength:[3],cvcSecurityImg:"visaI",zipLength:[5],luhn:!0},{type:"amex",pattern:/^3[47]/,format:/(\d{1,4})(\d{1,6})?(\d{1,5})?/,inputFormat:/^(\d{4}|\d{4}\s\d{6})$/,length:[15],cvcLength:[4],cvcSecurityImg:"amexI",zipLength:[5],luhn:!0},{type:"visa",pattern:/^4/,
+format:e,inputFormat:t,length:[16],cvcLength:[3],cvcSecurityImg:"visaI",zipLength:[5],luhn:!0}],i=function(e){var t,i,a;for(e=(e+"").replace(/\D/g,""),i=0,a=n.length;a>i;i++)if(t=n[i],t.pattern.test(e))return t},a=function(e){var t,i,a;for(i=0,a=n.length;a>i;i++)if(t=n[i],t.type===e)return t};return{fromNumber:function(e){return i(e)},fromType:function(e){return a(e)},defaultFormat:function(){return e},defaultInputFormat:function(){return t}}}]).factory("_Validate",["Cards","$parse",function(e,t){var n=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1},i=function(e){var t,n,i,a,s,r;for(i=!0,a=0,n=(e+"").split("").reverse(),s=0,r=n.length;r>s;s++)t=n[s],t=parseInt(t,10),(i=!i)&&(t*=2),t>9&&(t-=9),a+=t;return a%10===0},a={};return a.cvc=function(i,a,s,r){var o,l;if(angular.isUndefined(i)||null===i||0===i.length)return!0;if(!/^\d+$/.test(i))return!1;var c;if(r.paymentsTypeModel){var d=t(r.paymentsTypeModel);c=d(s)}return c?(l=e.fromType(c),o=i.length,n.call(null!==l?l.cvcLength:void 0,o)>=0):i.length>=3&&i.length<=4},a.zip=function(i,a,s,r){var o,l;if(angular.isUndefined(i)||null===i||0===i.length)return!0;if(!/^\d+$/.test(i))return!1;var c;if(r.paymentsTypeModel){var d=t(r.paymentsTypeModel);c=d(s)}return c?(l=e.fromType(c),o=i.length,n.call(null!==l?l.zipLength:void 0,o)>=0):i.length<6},a.card=function(a,s,r,o){var l,c,d;o.paymentsTypeModel&&(d=t(o.paymentsTypeModel));var p=function(){d&&d.assign(r,null),s.$card=null};return angular.isUndefined(a)||null===a||0===a.length?(p(),!0):(a=(a+"").replace(/\s+|-/g,""),/^\d+$/.test(a)&&(l=e.fromNumber(a))?(s.$card=angular.copy(l),d&&d.assign(r,l.type),ret=(c=a.length,n.call(l.length,c)>=0&&(l.luhn===!1||i(a))),ret):(p(),!1))},function(e,t,n,i,s){if(!a[e])throw types=Object.keys(a),errstr='Unknown type for validation: "'+e+'". ',errstr+='Should be one of: "'+types.join('", "')+'"',errstr;return a[e](t,n,i,s)}}]).factory("_ValidateWatch",["_Validate",function(e){var t={};return t.cvc=function(t,n,i,a){a.paymentsTypeModel&&i.$watch(a.paymentsTypeModel,function(s,r){if(s!==r){var o=e(t,n.$modelValue,n,i,a);n.$setValidity(t,o)}})},t.zip=function(t,n,i,a){a.paymentsTypeModel&&i.$watch(a.paymentsTypeModel,function(s,r){if(s!==r){var o=e(t,n.$modelValue,n,i,a);n.$setValidity(t,o)}})},function(e,n,i,a){return t[e]?t[e](e,n,i,a):void 0}}]).directive("validateCard",["$window","_Validate","_ValidateWatch",function(e,t,n){return{restrict:"A",require:"ngModel",link:function(e,i,a,s){var r=a.validateCard;n(r,s,e,a);var o=function(n){var o=t(r,n,s,e,a);return s.$setValidity(r,o),"card"===r&&(null===s.$card?null==n||""===n||""===n?(e.invalidCardError="",e.invalidCard=""):n.length>=1&&(e.invalidCardError="error",e.invalidCard="The number entered is not a recognized credit card number."):o?(e.invalidCardError="",e.invalidCard=""):s.$card.length.indexOf(n.length)>=0?(e.invalidCardError="error",e.invalidCard="The number entered is not a recognized credit card number."):(e.invalidCardError="",e.invalidCard=""),i.bind("blur",function(){o&&null!==s.$card?(e.invalidCardError="",e.invalidCard=""):(e.invalidCardError="error",e.invalidCard="The number entered is not a recognized credit card number.")})),o?n:void 0};s.$formatters.push(o),s.$parsers.push(o)}}}]).directive("creditCardImage",function(){return{templateUrl:"app/scripts/ng_js_att_tpls/formField/creditCardImage.html",replace:!1,transclude:!1,link:function(e,t,n){e.$watch(n.creditCardImage,function(t,n){t!==n&&(e.cvc="",angular.isUndefined(t)||null===t||(e.newValCCI="show-"+t),null===t&&(e.newValCCI=""))})}}}).directive("securityCodeImage",["$document",function(e){return{templateUrl:"app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html",replace:!1,transclude:!1,link:function(t,n,i){t.$watch(i.securityCodeImage,function(e,n){e!==n&&(angular.isUndefined(e)||null===e||("amexI"===e?(t.newValI="ccv2-security-amex",t.newValIAlt="The 4 digit CVC security code is on the front of the card.",t.cvcPlaceholder="4 digits",t.cvcMaxlength=4):"visaI"===e&&(t.newValI="ccv2-security",t.newValIAlt="The CVC security code is on the back of your card right after the credit card number.",t.cvcPlaceholder="3 digits",t.cvcMaxlength=3)),null===e&&(t.newValI="ccv2-security",t.cvcPlaceholder="3 digits",t.cvcMaxlength=3,t.newValIAlt="The CVC security code is on the back of your card right after the credit card number."))}),n.bind("click",function(e){e.preventDefault(),n.find("button").hasClass("active")?n.find("button").removeClass("active"):n.find("button").addClass("active")});var a=angular.element(e);a.bind("click",function(e){var t=e.target.className;"btn btn-alt btn-tooltip active"!==t&&n.find("button").hasClass("active")&&n.find("button").removeClass("active")})}}}]),angular.module("att.abs.hourpicker",["att.abs.utilities"]).constant("hourpickerConfig",{days:["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],customOption:"Custom"}).controller("hourPickerController",["$scope",function(e){e.options=[],this.setOptions=function(t,n,i,a,s,r){e.options.push(t),void 0!==a&&(e.preselect=a);var o;if(void 0!==n){e.fromtime=n;for(o in e.days)e.days.hasOwnProperty(o)&&(e.FrtimeList[e.days[o]]={},void 0!==s?(e.FrtimeList[e.days[o]].value=s,e.selectedFromOption[e.days[o]]=s):(e.FrtimeList[e.days[o]].value=n[0].value,e.selectedFromOption[e.days[o]]=n[0].value))}if(void 0!==i){e.totime=i;for(o in e.days)e.days.hasOwnProperty(o)&&(e.TotimeList[e.days[o]]={},void 0!==r?(e.TotimeList[e.days[o]].value=r,e.selectedToOption[e.days[o]]=r):(e.TotimeList[e.days[o]].value=i[0].value,e.selectedToOption[e.days[o]]=i[0].value),e.showToTimeErrorDay[e.days[o]]=!1)}void 0!==s&&(e.uncheckedFromTime=s),void 0!==r&&(e.uncheckedToTime=r)},this.getSelectedOption=function(){return e.selectedOption},this.setToTimeErrorDay=function(t,n){e.showToTimeErrorDay[t]=n}}]).directive("attHourpickerOption",[function(){return{restrict:"EA",require:"^attHourpicker",scope:{option:"=option",fromtime:"=fromtime",totime:"=totime",preselect:"=preselect",uncheckedFromTime:"=",uncheckedToTime:"="},link:function(e,t,n,i){i.setOptions(e.option,e.fromtime,e.totime,e.preselect,e.uncheckedFromTime,e.uncheckedToTime)}}}]).directive("attHourpicker",["hourpickerConfig","$document","$log","$documentBind","$timeout",function(e,t,n,i,a){return{require:"ngModel",restrict:"EA",controller:"hourPickerController",transclude:!0,scope:{model:"=ngModel",resetFlag:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html",link:function(t,n,s,r){var o=!1;t.isFromDropDownOpen=!1,t.isToDropDownOpen=!1;var l="",c={};t.days=e.days,t.daysList={},t.FrtimeList={},t.FrtimeListDay={},t.TotimeListDay={},t.selectedFromOption={},t.selectedToOption={},t.TotimeList={},t.selectedIndex=0,t.selectedOption="Select from list",t.customTime=[],t.resetFlag=!1,t.showToTimeErrorDay={},t.validatedCustomPreselect=[],t.$watch("resetFlag",function(n,i){if(n!==i){if(n&&t.selectedOption===e.customOption){for(day in t.daysList)t.daysList.hasOwnProperty(day)&&(t.daysList[day]=!1,t.addSelectedValue(day));t.preselectUpdateFxn(t.preselect)}t.resetFlag=!1}}),t.$watch("selCategory",function(e){e&&r.$setViewValue(e)},!0),t.updateData=function(n){if(n.constructor===Array){t.showDaysSelector=!0,t.selectedOption=e.customOption;for(var i in n)if(n.hasOwnProperty(i)){var a=n[i].day;"boolean"==typeof n[i].preEnabled&&n[i].preEnabled?t.daysList[a]=!0:t.daysList[a]=!1;for(var s in t.fromtime)t.fromtime[s].value!==n[i].FromTime||t.uncheckedFromTime||(t.FrtimeList[a].value=t.fromtime[s].value,t.selectedFromOption[a]=t.FrtimeList[a].value);for(var r in t.totime)t.totime[r].value!==n[i].ToTime||t.uncheckedToTime||(t.TotimeList[a].value=t.totime[r].value,t.selectedToOption[a]=t.TotimeList[a].value);if(t.addSelectedValue(a,n[i].FromTime,n[i].ToTime),parseInt(i)+1===n.length)break}}else t.selectOption(n.day)},t.$watch("preselect",function(e){t.preselectUpdateFxn(e)}),t.preselectUpdateFxn=function(e){if(void 0!==e){if(t.options&&(e=t.validatePreselectData(e)),""===e)return;t.updateData(e)}},t.validatePreselectData=function(e){if(e.constructor===Array){for(var n in e)if(e.hasOwnProperty(n)){var i=e[n].day,a=!1,s=!1,r=!1;for(var o in t.days)if(t.days[o]===i){a=!0;break}if(!a){e.splice(n,1);continue}for(var l in t.fromtime)if(t.fromtime[l].value===e[n].FromTime){s=!0;break}s||(e[n].FromTime=t.fromtime[0].value);for(var c in t.totime)if(t.totime[c].value===e[n].ToTime){r=!0;break}if(r||(e[n].ToTime=t.totime[0].value),"boolean"==typeof e[n].preEnabled&&e[n].preEnabled?e[n].preEnabled=!0:e[n].preEnabled=!1,t.validatedCustomPreselect[i]={},t.validatedCustomPreselect[i].FromTime=e[n].FromTime,t.validatedCustomPreselect[i].ToTime=e[n].ToTime,parseInt(n)+1===e.length)break}}else{var d=!1;for(var p in t.options)if(t.options[p]===e.day){d=!0;break}d||(e="")}return e},t.selectPrevNextValue=function(e,t,n){var i,a=0;if(38===e.keyCode)i=-1;else{if(40!==e.keyCode)return n;i=1}if(-1!==t.indexOf(n))a=t.indexOf(n)+i;else for(var s in t)if(t[s].value===n){a=parseInt(s)+i;break}return a===t.length?a-=1:-1===a&&(a+=1),e.preventDefault(),t[a].value?t[a].value:t[a]},t.showDropdown=function(){t.showlist=!t.showlist,o=!o},t.showfromDayDropdown=function(e){for(count in t.FrtimeListDay)count!==e&&t.FrtimeListDay[count]&&(t.FrtimeListDay[count]=!1);for(count in t.TotimeListDay)t.TotimeListDay[count]&&(t.TotimeListDay[count]=!1);t.FrtimeListDay[e]=!t.FrtimeListDay[e],o=!o,t.showlist=!1,t.FrtimeListDay[e]?(t.isFromDropDownOpen=!0,l=e):t.isFromDropDownOpen=!1,a(function(){if(t.FrtimeListDay[e]){var i=angular.element(n)[0].querySelector(".customdays-width"),a=angular.element(i.querySelector(".select2-container-active")).parent()[0].querySelector("ul"),s=angular.element(a.querySelector(".selectedItemInDropDown"))[0].offsetTop;angular.element(a)[0].scrollTop=s}})},t.showtoDayDropdown=function(e){for(count in t.TotimeListDay)count!==e&&t.TotimeListDay[count]&&(t.TotimeListDay[count]=!1);for(count in t.FrtimeListDay)t.FrtimeListDay[count]&&(t.FrtimeListDay[count]=!1);t.TotimeListDay[e]=!t.TotimeListDay[e],o=!o,t.showlist=!1,t.TotimeListDay[e]?(t.isToDropDownOpen=!0,l=e):t.isToDropDownOpen=!1,a(function(){if(t.TotimeListDay[e]){var i=angular.element(n)[0].querySelector(".customdays-width"),a=angular.element(i.querySelector(".select2-container-active")).parent()[0].querySelector("ul"),s=angular.element(a.querySelector(".selectedItemInDropDown"))[0].offsetTop;angular.element(a)[0].scrollTop=s}})},t.selectFromDayOption=function(e,n){t.selectedFromOption[e]=n,t.FrtimeList[e].value=n,t.FrtimeListDay[e]=!1,t.isFromDropDownOpen=!1},t.selectToDayOption=function(e,n){t.selectedToOption[e]=n,t.TotimeList[e].value=n,t.TotimeListDay[e]=!1,t.isToDropDownOpen=!1},t.addSelectedValue=function(e,n,i){var a,s;if(void 0===t.daysList[e]||t.daysList[e]){for(t.selectedFromOption[e]===t.uncheckedFromTime&&(angular.isDefined(t.validatedCustomPreselect[e])?(t.selectedFromOption[e]=t.validatedCustomPreselect[e].FromTime,n=t.validatedCustomPreselect[e].FromTime,t.FrtimeList[e].value=t.validatedCustomPreselect[e].FromTime):(t.selectedFromOption[e]=t.fromtime[0].value,n=t.fromtime[0].value,t.FrtimeList[e].value=t.fromtime[0].value)),t.selectedToOption[e]===t.uncheckedToTime&&(angular.isDefined(t.validatedCustomPreselect[e])?(t.selectedToOption[e]=t.validatedCustomPreselect[e].ToTime,i=t.validatedCustomPreselect[e].ToTime,t.TotimeList[e].value=t.validatedCustomPreselect[e].ToTime):(t.selectedToOption[e]=t.totime[0].value,i=t.totime[0].value,t.TotimeList[e].value=t.totime[0].value)),c.day=e,c.FromTime=t.FrtimeList[e].value,c.ToTime=t.TotimeList[e].value,a=0,s=t.customTime.length;s>a;a++)if(t.customTime[a].day===e){t.customTime[a].FromTime=c.FromTime,t.customTime[a].ToTime=c.ToTime;break}if(a===s){var r=angular.copy(c);t.customTime.push(r)}}else for(a=0,s=t.customTime.length;s>a;a++)if(t.customTime[a].day===e){t.uncheckedFromTime?t.selectedFromOption[t.customTime[a].day]=t.uncheckedFromTime:t.selectedFromOption[t.customTime[a].day]=t.FrtimeList[t.customTime[a].day].value,t.uncheckedToTime?t.selectedToOption[t.customTime[a].day]=t.uncheckedToTime:t.selectedToOption[t.customTime[a].day]=t.TotimeList[t.customTime[a].day].value,t.customTime.splice(a,1);break}t.selCategory=t.customTime};var d=function(){t.showlist&&t.$apply(function(){t.showlist=!1})};i.click("showlist",d,t);var p=function(){t.$apply(function(){t.isFromDropDownOpen&&(t.FrtimeListDay[l]=!1,t.isFromDropDownOpen=!1)})};i.click("isFromDropDownOpen",p,t);var u=function(){t.$apply(function(){t.isToDropDownOpen&&(t.TotimeListDay[l]=!1,t.isToDropDownOpen=!1)})};i.click("isToDropDownOpen",u,t),t.selectOption=function(n){if(n===e.customOption)t.showDaysSelector=!0,t.selCategory=t.customTime;else{t.showDaysSelector=!1;var i=/[0-9]\s?am/i.exec(n),a=/[0-9]\s?pm/i.exec(n);t.selCategory={day:n,FromTime:null===i?"NA":i[0],ToTime:null===a?"NA":a[0]}}t.showlist=!1,o=!1,t.selectedOption=n}}}}]).directive("attHourpickerValidator",["hourpickerConfig",function(e){return{restrict:"A",require:["attHourpicker","ngModel"],link:function(t,n,i,a){var s=a[0],r=a[1],o=function(e){var t=Number(e.match(/^(\d+)/)[1]),n=Number(e.match(/:(\d+)/)[1]),i=e.match(/\s(.*)$/)[1].toUpperCase();"PM"===i&&12>t&&(t+=12),"AM"===i&&12===t&&(t-=12);var a=t.toString(),s=n.toString();return 10>t&&(a="0"+a),10>n&&(s="0"+s),parseInt(a+s,10)},l=function(e,t){var n=o(e),i=o(t);return i-n},c=function(t){if(s.getSelectedOption()===e.customOption){var n=0;for(var i in t)t.hasOwnProperty(i)&&(l(t[i].FromTime,t[i].ToTime)<=0?(s.setToTimeErrorDay(t[i].day,!0),n++):s.setToTimeErrorDay(t[i].day,!1));return n>0?(r.$setValidity("validationStatus",!1),[]):(r.$setValidity("validationStatus",!0),t)}return r.$setValidity("validationStatus",!0),t};r.$parsers.unshift(c)}}}]),angular.module("att.abs.iconButtons",[]).constant("buttonConfig",{activeClass:"active--button",toggleEvent:"click"}).directive("attIconBtnRadio",["buttonConfig",function(e){var t=e.activeClass||"active--button",n=e.toggleEvent||"click";return{require:"ngModel",link:function(e,i,a,s){i.attr("tabindex","0"),i.append("<span class='hidden-spoken'>"+a.attIconBtnRadio+"</span>"),s.$render=function(){i.parent().toggleClass(t,angular.equals(s.$modelValue,a.attIconBtnRadio))},i.parent().bind(n,function(){i.parent().hasClass(t)||e.$apply(function(){s.$setViewValue(a.attIconBtnRadio),s.$render()})})}}}]).directive("attIconBtnCheckbox",["buttonConfig",function(e){var t=e.activeClass||"active--button",n=e.toggleEvent||"click";return{require:"ngModel",link:function(e,i,a,s){function r(){var t=e.$eval(a.btnCheckboxTrue);return angular.isDefined(t)?t:!0}function o(){var t=e.$eval(a.btnCheckboxFalse);return angular.isDefined(t)?t:!1}i.attr("tabindex","0"),i.append("<span class='hidden-spoken'>"+a.attIconBtnCheckbox+"</span>"),s.$render=function(){i.parent().toggleClass(t,angular.equals(s.$modelValue,r()))},i.parent().bind(n,function(){e.$apply(function(){s.$setViewValue(i.parent().hasClass(t)?o():r()),s.$render()})})}}}]),angular.module("att.abs.links",["ngSanitize"]).directive("attLink",[function(){return{restrict:"A",link:function(e,t){t.addClass("link"),t.attr("href")||t.attr("tabindex","0")}}}]).directive("attLinkVisited",[function(){return{restrict:"A",link:function(e,t){t.addClass("link--visited"),t.attr("href")||t.attr("tabindex","0")}}}]).directive("attReadmore",["$timeout",function(e){return{restrict:"A",scope:{lines:"@noOfLines",textModel:"=",isOpen:"="},templateUrl:"app/scripts/ng_js_att_tpls/links/readMore.html",link:function(t,n){var i=1;t.$watch("textModel",function(a){a?("function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),t.textToDisplay=a.trim(),t.readFlag=!0,e(function(){var e=n[0].children[0].children[0];1===i&&(i=window.getComputedStyle?parseInt(t.lines)*parseFloat(window.getComputedStyle(e,null).getPropertyValue("height")):parseInt(t.lines)*parseFloat(e.currentStyle.height),t.elemHeight=i,t.readLinkStyle={height:t.elemHeight+"px"})}),t.readMoreLink=!0,t.readLessLink=!1):(t.textToDisplay="",t.readMoreLink=!1,t.readLessLink=!1,t.readFlag=!1)});var a=n.parent();a.hasClass("att-accordion__body")&&t.$watch("isOpen",function(e){e||(t.readMoreLink=!0,t.readLessLink=!1,t.readLinkStyle={height:t.elemHeight+"px"},t.readFlag=!0)}),t.readMore=function(){t.readMoreLink=!1,t.readLessLink=!0,t.readLinkStyle={height:"auto"},t.readFlag=!1;var i=angular.element(n).children().eq(1).find("a")[0];e(function(){i.focus()})},t.readLess=function(){t.readMoreLink=!0,t.readLessLink=!1,t.readLinkStyle={height:t.elemHeight+"px"},t.readFlag=!0;var i=angular.element(n).children().eq(0).find("a")[0];e(function(){i.focus()})}}}}]).directive("attLinksList",[function(){return{restrict:"A",controller:function(){},link:function(e,t){t.addClass("links-list")}}}]).directive("attLinksListItem",[function(){return{restrict:"A",require:"^attLinksList",link:function(e,t){t.addClass("links-list__item"),t.attr("href")||t.attr("tabindex","0")}}}]),angular.module("att.abs.loading",[]).directive("attLoading",["$window",function(e){return{restrict:"A",replace:!0,scope:{icon:"@attLoading",progressStatus:"=?",colorClass:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/loading/loading.html",link:function(t,n){var i=t.progressStatus;if(t.progressStatus=Math.min(100,Math.max(0,i)),-1!==e.navigator.userAgent.indexOf("MSIE 8.")){var a=0,s=36*t.progressStatus;n.css({"background-position-x":a,"background-position-y":-s})}}}}]),angular.module("att.abs.modal",["att.abs.utilities"]).factory("$$stackedMap",function(){return{createNew:function(){var e=[];return{add:function(t,n){e.push({key:t,value:n})},get:function(t){for(var n=0;n<e.length;n++)if(t===e[n].key)return e[n]},keys:function(){for(var t=[],n=0;n<e.length;n++)t.push(e[n].key);return t},top:function(){return e[e.length-1]},remove:function(t){for(var n=-1,i=0;i<e.length;i++)if(t===e[i].key){n=i;break}return e.splice(n,1)[0]},removeTop:function(){return e.splice(e.length-1,1)[0]},length:function(){return e.length}}}}}).directive("modalBackdrop",["$timeout",function(e){return{restrict:"EA",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/modal/backdrop.html",link:function(t){t.animate=!1,e(function(){t.animate=!0})}}}]).directive("modalWindow",["$modalStack","$timeout","$document",function(e,t,n){return{restrict:"EA",scope:{index:"@",modalTitle:"@?"},replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/modal/window.html",link:function(i,a,s){i.windowClass=s.windowClass||"",s.modalTitle&&""!==s.modalTitle&&(a[0].setAttribute("aria-label",s.modalTitle),a[0].removeAttribute("modal-title")),t(function(){i.focusModalFlag=!0,i.animate=!0}),n.on("focus keydown",function(e){9===e.which&&(String.prototype.contains=function(e){return-1!==this.indexOf(e)},a[0]===e.target||a[0].contains(e.target)||a[0].focus())}),i.close=function(t){var n=e.getTop();n&&n.value.backdrop&&"static"!=n.value.backdrop&&t.target===t.currentTarget&&(t.preventDefault?(t.preventDefault(),t.stopPropagation()):t.returnValue=!1,e.dismiss(n.key,"backdrop click"))}}}}]).factory("$modalStack",["$document","$compile","$rootScope","$$stackedMap","events","keymap",function(e,t,n,i,a,s){function r(){for(var e=-1,t=u.keys(),n=0;n<t.length;n++)u.get(t[n]).value.backdrop&&(e=n);return e}function o(t){var n=e.find("body").eq(0),i=e.find("html").eq(0),a=u.get(t).value;u.remove(t),a.modalDomEl.remove(),n.toggleClass(d,u.length()>0),i.css({overflow:"scroll"}),c&&-1==r()&&(c.remove(),c=void 0),a.modalScope.$destroy(),angular.isDefined(g)&&null!=g&&g.focus()}var l,c,d="modal-open",p=n.$new(!0),u=i.createNew(),h={},g=void 0;return n.$watch(r,function(e){p.index=e}),e.bind("keydown",function(e){var t;if(27===e.which)t=u.top(),t&&t.value.keyboard&&n.$apply(function(){h.dismiss(t.key)});else if(e.keyCode===s.KEY.BACKSPACE){var i,r=!1,o=e.srcElement||e.target;r=void 0===o.type?!0:"INPUT"===o.tagName.toUpperCase()&&("TEXT"===(i=o.type.toUpperCase())||"PASSWORD"===i||"FILE"===i||"SEARCH"===i||"EMAIL"===i||"NUMBER"===i||"DATE"===i||"TEL"===i||"URL"===i||"TIME"===i)||"TEXTAREA"===o.tagName.toUpperCase()?o.readOnly||o.disabled:!0,r&&a.preventDefault(e)}}),h.open=function(n,i){u.add(n,{deferred:i.deferred,modalScope:i.scope,backdrop:i.backdrop,keyboard:i.keyboard}),g=document.activeElement;var a=e.find("body").eq(0),s=e.find("html").eq(0);r()>=0&&!c&&(l=angular.element("<div modal-backdrop></div>"),c=t(l)(p),a.append(c));var o=angular.element("<div modal-window></div>");o.attr("window-class",i.windowClass),o.attr("index",u.length()-1),o.attr("modal-title",i.modalTitle),o.html(i.content);var h=t(o)(i.scope);u.top().value.modalDomEl=h,a.append(h),a.addClass(d),s.css({overflow:"hidden"})},h.close=function(e,t){var n=u.get(e);n&&(n.value.deferred.resolve(t),o(e))},h.dismiss=function(e,t){var n=u.get(e).value;n&&(n.deferred.reject(t),o(e))},h.getTop=function(){return u.top()},h}]).provider("$modal",function(){var e={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(t,n,i,a,s,r,o){function l(e){return e.template?i.when(e.template):a.get(e.templateUrl,{cache:s}).then(function(e){return e.data})}function c(e){var n=[];return angular.forEach(e,function(e){(angular.isFunction(e)||angular.isArray(e))&&n.push(i.when(t.invoke(e)))}),n}var d={};return d.open=function(t){var a=i.defer(),s=i.defer(),d={result:a.promise,opened:s.promise,close:function(e){o.close(d,e)},dismiss:function(e){o.dismiss(d,e)}};if(t=angular.extend({},e.options,t),t.resolve=t.resolve||{},!t.template&&!t.templateUrl)throw new Error("One of template or templateUrl options is required.");var p=i.all([l(t)].concat(c(t.resolve)));return p.then(function(e){var i=(t.scope||n).$new();i.$close=d.close,i.$dismiss=d.dismiss;var s,l={},c=1;t.controller&&(l.$scope=i,l.$modalInstance=d,angular.forEach(t.resolve,function(t,n){l[n]=e[c++]}),s=r(t.controller,l)),o.open(d,{scope:i,deferred:a,content:e[0],backdrop:t.backdrop,keyboard:t.keyboard,windowClass:t.windowClass,modalTitle:t.modalTitle})},function(e){a.reject(e)}),p.then(function(){s.resolve(!0)},function(){s.reject(!1)}),d},d}]};return e}).directive("simpleModal",["$modal",function(e){return{restrict:"EA",scope:{simpleModal:"@",backdrop:"@",keyboard:"@",modalOk:"&",modalCancel:"&",windowClass:"@",controller:"@",modalTitle:"@?"},link:function(t,n){n.bind("click",function(i){i.preventDefault(),angular.isDefined(n.attr("href"))&&""!==n.attr("href")&&(t.simpleModal=n.attr("href")),"false"===t.backdrop?t.backdropclick="static":t.backdropclick=!0,"false"===t.keyboard?t.keyboardev=!1:t.keyboardev=!0,e.open({templateUrl:t.simpleModal,backdrop:t.backdropclick,keyboard:t.keyboardev,windowClass:t.windowClass,controller:t.controller,modalTitle:t.modalTitle}).result.then(t.modalOk,t.modalCancel)})}}}]).directive("tabbedItem",["$modal","$log",function(e,t){return{restrict:"AE",replace:!0,scope:{items:"=items",controller:"@",templateId:"@",modalTitle:"@?"},templateUrl:"app/scripts/ng_js_att_tpls/modal/tabbedItem.html",controller:["$scope","$rootScope","$attrs",function(n){n.clickTab=function(i){for(var a=0;a<n.items.length;a++)a===i?(n.items[a].isTabOpen=!0,n.items[a].showData=!0):(n.items[a].isTabOpen=!1,n.items[a].showData=!1);var s=e.open({templateUrl:n.templateId,controller:n.controller,windowClass:"tabbedOverlay_modal",modalTitle:n.modalTitle,resolve:{items:function(){return n.items}}});s.result.then(function(e){n.selected=e},function(){t.info("Modal dismissed at: "+new Date)})},n.isActiveTab=function(e){return n.items&&n.items[e]&&n.items[e].isTabOpen}}]}}]).directive("tabbedOverlay",[function(){return{restrict:"AE",replace:!0,scope:{items:"="},transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html",controller:["$scope",function(e){e.clickTab=function(t){for(var n=0;n<e.items.length;n++)n===t?(e.items[n].isTabOpen=!0,e.items[n].showData=!0):(e.items[n].isTabOpen=!1,e.items[n].showData=!1)},e.isActiveTab=function(t){return e.items&&e.items[t]&&e.items[t].isTabOpen}}]}}]),angular.module("att.abs.pagination",["att.abs.utilities"]).directive("attPagination",[function(){return{restrict:"EA",scope:{totalPages:"=",currentPage:"=",showInput:"=",clickHandler:"=?"},replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/pagination/pagination.html",link:function(e){function t(t){angular.isDefined(t)&&null!==t&&((!t||1>t)&&(t=1),t>e.totalPages&&(t=e.totalPages),e.currentPage!==t&&(e.currentPage=t,n(e.currentPage)),e.totalPages>7&&(t<e.pages[0]&&t>3?e.pages=[t,t+1,t+2]:t>e.pages[2]&&t<e.totalPages-2?e.pages=[t-2,t-1,t]:3>=t?e.pages=[1,2,3]:t>=e.totalPages-2&&(e.pages=[e.totalPages-2,e.totalPages-1,e.totalPages])))}e.focusedPage,e.$watch("totalPages",function(n){if(angular.isDefined(n)&&null!==n){if(e.pages=[],1>n)return void(e.totalPages=1);if(7>=n)for(var i=1;n>=i;i++)e.pages.push(i);else if(n>7){var a=Math.ceil(n/2);e.pages=[a-1,a,a+1]}t(1)}}),e.$watch("currentPage",function(e){t(e)});var n=function(t){angular.isFunction(e.clickHandler)&&e.clickHandler(t)};e.next=function(t){t.preventDefault(),e.currentPage<e.totalPages&&(e.currentPage+=1,n(e.currentPage))},e.prev=function(t){t.preventDefault(),e.currentPage>1&&(e.currentPage-=1,n(e.currentPage))},e.selectPage=function(t,i){i.preventDefault(),e.currentPage=t,e.focusedPage=t,n(e.currentPage)},e.checkSelectedPage=function(t){return e.currentPage===t?!0:!1},e.isFocused=function(t){return e.focusedPage===t}}}}]),angular.module("att.abs.paneSelector",["att.abs.utilities"]).constant("paneGroupConstants",{SIDE_WIDTH_DEFAULT:"33%",INNER_PANE_DEFAULT:"67%",SIDE_PANE_ID:"sidePane",NO_DRILL_DOWN:"none"}).factory("animation",function(){return TweenLite}).directive("attPaneAccessibility",["keymap","$window",function(e,t){return{restrict:"A",require:["^?sidePane","^?innerPane"],link:function(t,n,i,a){var s=a[0],r=a[1],o=!1;t.ie=function(){for(var e,t=3,n=document.createElement("div"),i=n.getElementsByTagName("i");n.innerHTML="<!--[if gt IE "+ ++t+"]><i></i>< ![endif]-->",i[0];);return t>4?t:e}(),o=8===t.ie?!0:!1,n.bind("keydown",function(t){if(e.isAllowedKey(t.keyCode)||e.isControl(t)||e.isFunctionKey(t)){t.preventDefault(),t.stopPropagation();var i;switch(t.keyCode){case e.KEY.DOWN:if(i=angular.element(n[0])[0],i&&i.nextElementSibling&&i.nextElementSibling.focus(),o){do{if(!i||!i.nextSibling)break;i=i.nextSibling}while(i&&"DIV"!==i.tagName);i.focus()}break;case e.KEY.UP:if(i=angular.element(n[0])[0],i&&i.previousElementSibling&&i.previousElementSibling.focus(),o){do{if(!i||!i.previousSibling)break;i=i.previousSibling}while(i&&"DIV"!==i.tagName);i.focus()}break;case e.KEY.RIGHT:angular.isDefined(s)&&(i=s.getElement()[0]),angular.isDefined(r)&&(i=r.getElement()[0]);do{if(!i||!i.nextElementSibling)break;i=i.nextElementSibling}while("none"===window.getComputedStyle(i,null).getPropertyValue("display"));if(o)do{if(!i||!i.nextSibling)break;i=i.nextSibling}while(i&&"DIV"==i.tagName&&"none"==i.currentStyle.display);i&&i.querySelector("[att-pane-accessibility]").focus();break;case e.KEY.LEFT:angular.isDefined(s)&&(i=s.getElement()[0]),angular.isDefined(r)&&(i=r.getElement()[0]);do{if(!i||!i.previousElementSibling)break;i=i.previousElementSibling}while("none"==window.getComputedStyle(i,null).getPropertyValue("display"));if(o)do{if(!i||!i.previousSibling)break;i=i.previousSibling}while(i&&"DIV"==i.tagName&&"none"==i.currentStyle.display);i&&i.querySelector("[att-pane-accessibility]").focus()}}})}}}]).directive("sideRow",[function(){return{restrict:"A",replace:!0,require:["^sidePane","^paneGroup"],link:function(e,t,n,i){var a=i[0],s=i[1];e.$first&&(a.sidePaneIds=[]);var r=n.paneId,o=n.drillDownTo;a.sidePaneRows.push({paneId:r,drillDownTo:o}),t.on("click",function(){a.currentSelectedRowPaneId=r,s.slideOutPane(r,!0)})}}}]).controller("SidePaneCtrl",["$scope","$element","animation","paneGroupConstants",function(e,t,n,i){this.getElement=function(){return t},this.sidePaneTracker={},this.currentWidth=i.SIDE_WIDTH_DEFAULT,this.paneId=i.SIDE_PANE_ID,this.currentSelectedRowPaneId,this.drillDownToMapper={},this.sidePaneRows=[],this.init=function(){var e=this.sidePaneRows;if(e)for(var t in e)if(e.hasOwnProperty(t)){var n=e[t].paneId,i=e[t].drillDownTo;this.drillDownToMapper[n]=i,0==t&&(this.currentSelectedRowPaneId=n,this.sidePaneTracker[n]=[])}},this.getSidePanesList=function(){return this.sidePaneTracker[this.currentSelectedRowPaneId]},this.addToSidePanesList=function(e){void 0===this.sidePaneTracker[this.currentSelectedRowPaneId]?this.sidePaneTracker[this.currentSelectedRowPaneId]=[]:e&&this.sidePaneTracker[this.currentSelectedRowPaneId].push(e)},this.setWidth=function(e){e&&(this.currentWidth=e),n.set(t,{width:this.currentWidth})},this.resizeWidth=function(e){e&&(this.currentWidth=e),n.to(t,.5,{width:e})}}]).directive("sidePane",["paneGroupConstants",function(e){return{restrict:"EA",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/paneSelector/sidePane.html",require:["^paneGroup","sidePane"],controller:"SidePaneCtrl",scope:{},link:function(t,n,i,a){var s=a[0],r=a[1];s.addPaneCtrl(e.SIDE_PANE_ID,r)}}}]).directive("drillDownRow",["$parse","paneGroupConstants",function(e,t){return{restrict:"A",replace:!0,require:["^innerPane","^paneGroup"],link:function(e,n,i,a){var s=a[0],r=a[1];n.on("click",function(){var e=s.drillDownTo;s.drillDownTo!==t.NO_DRILL_DOWN&&r.slideOutPane(e),n[0].focus()})}}}]).controller("InnerPaneCtrl",["$scope","$element","animation","paneGroupConstants",function(e,t,n,i){this.getElement=function(){return t},this.paneId=e.paneId,this.drillDownTo,this.currentWidth=i.INNER_PANE_DEFAULT,this.setWidth=function(e){e&&(this.currentWidth=e),n.set(t,{width:this.currentWidth})},this.resizeWidth=function(e,i){n.to(t,.25,{width:e,onComplete:i})},this.displayNone=function(){n.set(t,{display:"none"})},this.displayBlock=function(){n.set(t,{display:"block"}),this&&this.hideRightBorder()},this.floatLeft=function(){n.set(t,{"float":"left"})},this.hideLeftBorder=function(){n.set(t,{borderLeftWidth:"0px"})},this.showLeftBorder=function(){n.set(t,{borderLeftWidth:"1px"})},this.hideRightBorder=function(){n.set(t,{borderRightWidth:"0px"})},this.showRightBorder=function(){n.set(t,{borderRightWidth:"1px"})},this.slideFromRight=function(){n.set(t,{"float":"right"}),n.set(t,{width:this.currentWidth})},this.startOpen=function(){return e.startOpen}}]).directive("innerPane",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/paneSelector/innerPane.html",require:["^paneGroup","innerPane"],controller:"InnerPaneCtrl",scope:{paneId:"@"},link:function(e,t,n,i){""===n.startOpen&&(e.startOpen=!0);var a=i[0],s=i[1];a.addPaneCtrl(e.paneId,s)}}}).controller("PaneGroupCtrl",["$scope","$element","paneGroupConstants",function(e,t,n){this.panes={},this.accountLevelPaneModel=[],this.title=e.title,this.init=function(){function e(e,t){var n,i=[];for(n in e.sidePaneRows)if(e.sidePaneRows.hasOwnProperty(n)){var a=e.sidePaneRows[n];n>0&&t[a.paneId].startOpen&&t[a.paneId].startOpen()&&(i.push(a),e.addToSidePanesList(a.paneId))}if(s)for(n in i)if(i.hasOwnProperty(n)){var r=i[n].paneId,o=t[r];o&&o.setWidth&&o.displayBlock&&(o.setWidth(s),o.displayBlock())}}var t=this.panes[n.SIDE_PANE_ID];if(t){t.init();var i,a=1;for(i in this.panes)this.panes[i].startOpen&&this.panes[i].startOpen()&&a++;var s;if(a>=3&&(s=100/a+"%"),this.panes[t.currentSelectedRowPaneId]){s?(t.setWidth(s),this.panes[t.currentSelectedRowPaneId].setWidth(s)):(t.setWidth(),this.panes[t.currentSelectedRowPaneId].setWidth()),this.panes[t.currentSelectedRowPaneId].displayBlock();for(i in this.panes)i!==n.SIDE_PANE_ID&&i!==t.currentSelectedRowPaneId&&this.panes[i].displayNone(),this.panes[i].drillDownTo=t.drillDownToMapper[i]}e(t,this.panes)}},this.resetPanes=function(){for(var e in this.panes)if(this.panes.hasOwnProperty(e)){var t=this.panes[e];t&&t.paneId!==n.SIDE_PANE_ID&&(t.floatLeft(),t.displayNone())}this.panes[n.SIDE_PANE_ID]&&this.panes[n.SIDE_PANE_ID].setWidth(n.SIDE_WIDTH_DEFAULT)},this.addPaneCtrl=function(e,t){
+this.panes[e]=t},this._slideOutPane=function(e,t){this.resetPanes();var i;if(t)if(this.panes[n.SIDE_PANE_ID]&&(i=this.panes[n.SIDE_PANE_ID].getSidePanesList()),i){if(this.panes&&this.panes[n.SIDE_PANE_ID])if(0===i.length&&this.panes[e])this.panes[n.SIDE_PANE_ID].setWidth(n.SIDE_WIDTH_DEFAULT),this.panes[e].displayBlock(),this.panes[e].setWidth(n.INNER_PANE_DEFAULT);else{var a=i.length+2,s=100/a+"%";this.panes[n.SIDE_PANE_ID].setWidth(s),this.panes[this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId]&&(this.panes[this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId].displayBlock(),this.panes[this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId].setWidth(s));for(var r in i)this.panes[i[r]]&&(this.panes[i[r]].displayBlock(),this.panes[i[r]].setWidth(s))}}else this.panes&&this.panes[n.SIDE_PANE_ID]&&this.panes[e]&&(this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId=e,this.panes[n.SIDE_PANE_ID].addToSidePanesList(),this.panes[e].slideFromRight(),this.panes[e].displayBlock(),this.panes[e].setWidth(n.INNER_PANE_DEFAULT));else{var o,l=!1;this.panes[n.SIDE_PANE_ID]&&(o=this.panes[n.SIDE_PANE_ID].getSidePanesList());for(var c in o)if(o.hasOwnProperty(c)){var d=o[c];if(d===e){l=!0;break}}!l&&this.panes[n.SIDE_PANE_ID]&&this.panes[n.SIDE_PANE_ID].addToSidePanesList(e);var p;this.panes[n.SIDE_PANE_ID]&&(p=this.panes[n.SIDE_PANE_ID].getSidePanesList().length);var u=p+2,h=100/u+"%";this.panes[n.SIDE_PANE_ID]&&this.panes[n.SIDE_PANE_ID].setWidth(h);var g;this.panes[n.SIDE_PANE_ID]&&(g=this.panes[n.SIDE_PANE_ID].getSidePanesList()[p-1]);var f=this;f.panes[n.SIDE_PANE_ID]&&(i=f.panes[n.SIDE_PANE_ID].getSidePanesList());for(var m in i)if(i.hasOwnProperty(m)){var v=i[m],b=this.panes[v];v!==g&&b&&(b.setWidth(h),b.displayBlock(),b.floatLeft())}this.panes[this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId]&&(this.panes[this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId].displayBlock(),this.panes[this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId].showRightBorder(),this.panes[this.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId].resizeWidth(h,function(){f.panes[g]&&f.panes[f.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId]&&(f.panes[f.panes[n.SIDE_PANE_ID].currentSelectedRowPaneId].hideRightBorder(),f.panes[g].setWidth(h),f.panes[g].slideFromRight(),f.panes[g].displayBlock(),f.panes[g].floatLeft())}))}},this.slideOutPane=function(e,t){this._slideOutPane(e,t)}}]).directive("paneGroup",["$timeout",function(e){return{restrict:"EA",transclude:!0,replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html",scope:{},controller:"PaneGroupCtrl",link:function(t,n,i,a){function s(){a.init()}e(s,100)}}}]),angular.module("att.abs.tooltip",["att.abs.position","att.abs.utilities","ngSanitize"]).constant("tooltipDefaultOptions",{placement:"above",animation:!1,popupDelay:0,stylett:"dark",appendToBody:!0}).provider("$tooltip",["tooltipDefaultOptions",function(e){function t(e){var t=/[A-Z]/g,n="-";return e.replace(t,function(e,t){return(t?n:"")+e.toLowerCase()})}var n={mouseenter:"mouseleave",click:"click",focus:"blur",mouseover:"mouseout"},i={};this.options=function(e){angular.extend(i,e)},this.setTriggers=function(e){angular.extend(n,e)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate","$attElementDetach",function(a,s,r,o,l,c,d,p){return function(a,u,h){function g(e){var t=e||f.trigger||h,i=n[t]||t;return{show:t,hide:i}}var f=angular.extend({},e,i),m=t(a),v=d.startSymbol(),b=d.endSymbol();return{restrict:"EA",scope:!0,link:function(e,t,n){function i(){e.tt_isOpen?h():d()}function d(){(!I||e.$eval(n[u+"Enable"]))&&(e.tt_popupDelay?S=r(_,e.tt_popupDelay):e.$apply(_))}function h(){e.$apply(function(){y()})}function _(){var n,i,a,s;if(e.tt_content){C&&r.cancel(C),D.css({top:0,left:0,display:"block","z-index":9999}),$?(x=x||l.find("body"),x.append(D)):t.after(D),n=$?c.offset(t):c.position(t),i=D.prop("offsetWidth"),a=D.prop("offsetHeight");var o=10;switch(e.tt_placement){case"right":s=$?{top:n.top+n.height/2-a/2,left:n.left+n.width+P}:{top:n.top+n.height/2-a/2,left:n.left+n.width+o+P};break;case"below":s=$?{top:n.top+n.height+P,left:n.left+n.width/2-i/2}:{top:n.top+n.height+o+P,left:n.left+n.width/2-i/2};break;case"left":s=$?{top:n.top+n.height/2-a/2,left:n.left-i-P}:{top:n.top+n.height/2-a/2,left:n.left-i-o-P};break;default:s=$?{top:n.top-a-P,left:n.left+n.width/2-i/2}:{top:n.top-a-o-P,left:n.left+n.width/2-i/2}}s.top+="px",s.left+="px",D.css(s),e.tt_isOpen=!0}}function y(){e.tt_isOpen=!1,r.cancel(S),angular.isDefined(e.tt_animation)&&e.tt_animation()?C=r(function(){p(D[0])},500):p(D[0])}function w(){t.removeAttr("title"),k||(L?t.attr("title",e.tooltipAriaLabel):t.attr("title",e.tt_content))}t.attr("tabindex")||t.attr("tabindex","0");var k=!1;t.bind("mouseenter",function(){k=!0,t.removeAttr("title")}),t.bind("mouseleave",function(){k=!1}),e.parentAttrs=n;var C,S,x,T="<div "+m+'-popup title="'+v+"tt_title"+b+'" content="'+v+"tt_content"+b+'" placement="'+v+"tt_placement"+b+'" animation="tt_animation()" is-open="tt_isOpen" stylett="'+v+"tt_style"+b+'" ></div>',D=s(T)(e),$=angular.isDefined(f.appendToBody)?f.appendToBody:!1,A=g(void 0),E=!1,I=angular.isDefined(n[u+"Enable"]),P=0,L=!1;e.tt_isOpen=!1,e.$watch("tt_isOpen",function(e,t){e===t||e||p(D[0])}),n.$observe(a,function(t){t?e.tt_content=t:e.tt_isOpen&&y()}),n.$observe(u+"Title",function(t){e.tt_title=t}),n.$observe(u+"Placement",function(t){e.tt_placement=angular.isDefined(t)?t:f.placement}),n.$observe(u+"Style",function(t){e.tt_style=angular.isDefined(t)?t:f.stylett}),n.$observe(u+"Animation",function(t){e.tt_animation=angular.isDefined(t)?o(t):function(){return f.animation}}),n.$observe(u+"PopupDelay",function(t){var n=parseInt(t,10);e.tt_popupDelay=isNaN(n)?f.popupDelay:n}),n.$observe(u+"Trigger",function(e){E&&(t.unbind(A.show,d),t.unbind(A.hide,h)),A=g(e),"focus"===A.show?(t.bind("focus",d),t.bind("blur",h),t.bind("click",function(e){e.stopPropagation()})):A.show===A.hide?t.bind(A.show,i):(t.bind(A.show,d),t.bind(A.hide,h)),E=!0}),n.$observe(u+"AppendToBody",function(t){$=angular.isDefined(t)?o(t)(e):$}),n.$observe(u+"Offset",function(e){P=angular.isDefined(e)?parseInt(e,10):0}),n.$observe(u+"AriaLabel",function(t){angular.isDefined(t)?(e.tooltipAriaLabel=t,L=!0):L=!1,w()}),$&&e.$on("$locationChangeSuccess",function(){e.tt_isOpen&&y()}),e.$on("$destroy",function(){e.tt_isOpen?y():D.remove()})}}}}]}]).directive("tooltipPopup",["$document","$documentBind",function(e,t){return{restrict:"EA",replace:!0,transclude:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"=",stylett:"@"},templateUrl:"app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html",link:function(e,n){e.$watch("isOpen",function(){e.isOpen}),n.bind("click",function(e){e.stopPropagation()});var i=function(){e.$apply(function(){e.isOpen=!1})};t.event("click","isOpen",i,e,!0,10)}}}]).directive("tooltip",["$tooltip",function(e){return e("tooltip","tooltip","mouseenter")}]).directive("tooltipCondition",["$timeout",function(e){return{restrict:"EA",replace:!0,scope:{tooltipCondition:"@?"},template:'<p><span tooltip="{{tooltipCondition}}" ng-if="showpop">{{tooltipCondition}}</span><span id="innerElement" ng-hide="showpop">{{tooltipCondition}}</span></p>',link:function(t,n,i){t.showpop=!1,"true"===i.height?e(function(){var e=n[0].offsetHeight,i=n.children(0)[0].offsetHeight;i>e&&(t.showpop=!0)}):t.tooltipCondition.length>=25&&(t.showpop=!0)}}}]),angular.module("att.abs.popOvers",["att.abs.tooltip","att.abs.utilities","ngSanitize"]).directive("popover",["$tooltip",function(e){return e("popover","popover","click")}]).directive("popoverPopup",["$document","$documentBind","$timeout","events","DOMHelper",function(e,t,n,i,a){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/popOvers/popOvers.html",scope:{content:"@",placement:"@",animation:"&",isOpen:"=",stylett:"@"},link:function(e,s,r,o){e.closeable=!1;try{e.closeable=""===e.$parent.parentAttrs.closeable?!0:!1}catch(l){}var c=void 0,d=void 0,p=function(t){e.$apply(function(){e.isOpen=!1})},u=function(t){(27===t.which||27===t.keyCode)&&(console.log("ESC was pressed!"),e.$apply(function(){e.isOpen=!1}))};n(function(){d=a.firstTabableElement(s)},10,!1),e.$watch("isOpen",function(t){if(e.isOpen){if(c=document.activeElement,angular.isDefined(d))try{d.focus()}catch(n){}}else if(angular.isDefined(c))try{c.focus()}catch(n){}}),e.$watch("stylett",function(t){e.popOverStyle=t}),e.$watch("placement",function(t){e.popOverPlacement=t}),e.closeMe=function(){e.isOpen=!1},s.bind("click",function(e){i.stopPropagation(e)}),t.event("click","isOpen",p,e,!0,10),t.event("keydown","isOpen",u,e,!0,10)}}}]),angular.module("att.abs.profileCard",[]).constant("profileStatus",{status:{ACTIVE:{status:"Active",color:"green"},DEACTIVATED:{status:"Deactivated",color:"red"},LOCKED:{status:"Locked",color:"red"},IDLE:{status:"Idle",color:"yellow"},PENDING:{status:"Pending",color:"blue"}},role:"COMPANY ADMINISTRATOR"}).directive("profileCard",["$http","$q","profileStatus",function(e,t,n){return{restrict:"EA",replace:"true",templateUrl:function(e,t){return t.addUser?"app/scripts/ng_js_att_tpls/profileCard/addUser.html":"app/scripts/ng_js_att_tpls/profileCard/profileCard.html"},scope:{profile:"="},link:function(e,i,a){function s(e){var n=t.defer(),i=new Image;return i.onerror=function(){n.reject(!1)},i.onload=function(){n.resolve(!0)},void 0!==e&&e.length>0?i.src=e:n.reject(!1),n.promise}if(e.image=!0,!a.addUser){e.image=!1,s(e.profile.img).then(function(t){e.image=t});var r=e.profile.name.split(" ");e.initials="";for(var o=0;o<r.length;o++)e.initials+=r[o][0];e.profile.role.toUpperCase()===n.role&&(e.badge=!0);var l=n.status[e.profile.state.toUpperCase()];l&&(e.profile.state=n.status[e.profile.state.toUpperCase()].status,e.colorIcon=n.status[e.profile.state.toUpperCase()].color,(e.profile.state.toUpperCase()===n.status.PENDING.status.toUpperCase()||e.profile.state.toUpperCase()===n.status.LOCKED.status.toUpperCase())&&(e.profile.lastLogin=e.profile.state));var c=(new Date).getTime(),d=new Date(e.profile.lastLogin).getTime(),p=(c-d)/864e5;1>=p?e.profile.lastLogin="Today":2>=p&&(e.profile.lastLogin="Yesterday")}}}}]),angular.module("att.abs.progressBars",[]).directive("attProgressBar",[function(){return{restrict:"A",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/progressBars/progressBars.html"}}]),angular.module("att.abs.radio",[]).constant("attRadioConfig",{activeClass:"att-radio--on",disabledClass:"att-radio--disabled"}).directive("attRadio",["$compile","attRadioConfig",function(e,t){return{scope:{},restrict:"A",require:"ngModel",link:function(n,i,a,s){var r=s;n.radioVal="";var o=angular.element('<div att-accessibility-click="13,32" ng-click="updateModel($event)" class="att-radio"></div>');i.attr("value",a.attRadio),i.removeAttr("att-radio"),i.removeAttr("title"),i.attr("ng-model","radioVal"),o.append(i.prop("outerHTML")),o.append('<div class="att-radio__indicator"></div>'),o.attr("title",a.title);var l=o.prop("outerHTML");l=e(l)(n),i=i.replaceWith(l);var c=l.find("input");c.on("focus",function(){l.css("outline","2px solid #5E9ED6"),l.css("outline","-webkit-focus-ring-color auto 5px")}),c.on("blur",function(){l.css("outline","none")}),r.$render=function(){n.radioVal=r.$modelValue;var e=angular.equals(r.$modelValue,a.attRadio);l.toggleClass(t.activeClass,e)},n.updateModel=function(){c[0].focus();var e=l.hasClass(t.activeClass);e||n.disabled||(r.$setViewValue(e?null:a.attRadio),r.$render())},a.$observe("disabled",function(e){n.disabled=e||"disabled"===e||"true"===e,n.disabled?(l.addClass(t.disabledClass),l.attr("tabindex","-1")):(l.removeClass(t.disabledClass),l.attr("tabindex","0"))})}}}]),angular.module("att.abs.scrollbar",["att.abs.position"]).constant("attScrollbarConstant",{defaults:{axis:"y",navigation:!1,wheel:!0,wheelSpeed:40,wheelLock:!0,scrollInvert:!1,trackSize:!1,thumbSize:!1,alwaysVisible:!0}}).directive("attScrollbar",["$window","$timeout","$parse","$animate","attScrollbarConstant","$position",function(e,t,n,i,a,s){return{restrict:"A",scope:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html",controller:["$scope","$element","$attrs",function(r,o,l){function c(){k.contentRatio<=1&&k.contentPosition>k.contentSize-k.viewportSize?k.contentPosition=k.contentSize-k.viewportSize:k.contentRatio>1&&k.contentPosition>0&&(k.contentPosition=0),k.contentPosition<=0?r.prevAvailable=!1:r.prevAvailable=!0,k.contentPosition>=k.contentSize-k.viewportSize?r.nextAvailable=!1:r.nextAvailable=!0}function d(){I?(x.on("touchstart",u),$.on("touchstart",u)):($.on("mousedown",h),D.on("mousedown",v)),angular.element(e).on("resize",p),k.options.wheel&&o.on(P,g)}function p(){k.update()}function u(e){1===e.touches.length&&(e.stopPropagation(),h(e.touches[0]))}function h(e){C.addClass("scroll-no-select"),o.addClass("scroll-no-select"),k.options.alwaysVisible||D.addClass("visible"),A=E?e.clientX:e.clientY,k.thumbPosition=parseInt($.css(M),10)||0,I?(N=!1,F=!1,x.on("touchmove",f),x.on("touchend",b),$.on("touchmove",m),$.on("touchend",b)):(S.on("mousemove",v),S.on("mouseup",b),$.on("mouseup",b))}function g(n){if(!(k.contentRatio>=1)){k.options.alwaysVisible||(w&&t.cancel(w),D.addClass("visible"),w=t(function(){D.removeClass("visible")},100));var i=n&&n.originalEvent||n||e.event,a=k.options.axis.toUpperCase(),s={X:i.deltaX||0,Y:i.deltaY||0},l=0===i.deltaMode?k.options.wheelSpeed:1;k.options.scrollInvert&&(l*=-1),"mousewheel"===P&&(s.Y=-1*i.wheelDelta/40,i.wheelDeltaX&&(s.X=-1*i.wheelDeltaX/40)),s.X*=-1/l,s.Y*=-1/l;var d=s[a];k.contentPosition-=d*k.options.wheelSpeed,k.contentPosition=Math.min(k.contentSize-k.viewportSize,Math.max(0,k.contentPosition)),fireEvent(o[0],"move"),c(),$.css(M,k.contentPosition/k.trackRatio+"px"),T.css(M,-k.contentPosition+"px"),(k.options.wheelLock||k.contentPosition!==k.contentSize-k.viewportSize&&0!==k.contentPosition)&&i.preventDefault(),r.$apply()}}function f(e){e.preventDefault(),N=!0,v(e.touches[0])}function m(e){e.preventDefault(),F=!0,v(e.touches[0])}function v(e){if(!(k.contentRatio>=1)){var t=E?e.clientX:e.clientY,n=t-A;(k.options.scrollInvert&&!I||I&&!k.options.scrollInvert)&&(n=A-t),N&&I&&(n=A-t),F&&I&&(n=t-A);var i=Math.min(k.trackSize-k.thumbSize,Math.max(0,k.thumbPosition+n));k.contentPosition=i*k.trackRatio,fireEvent(o[0],"move"),c(),$.css(M,i+"px"),T.css(M,-k.contentPosition+"px"),r.$apply()}}function b(){C.removeClass("scroll-no-select"),o.removeClass("scroll-no-select"),k.options.alwaysVisible||D.removeClass("visible"),S.off("mousemove",v),S.off("mouseup",b),$.off("mouseup",b),S.off("touchmove",f),S.off("ontouchend",b),$.off("touchmove",m),$.off("touchend",b)}var _={axis:l.attScrollbar||a.defaults.axis,navigation:l.navigation||a.defaults.navigation,wheel:a.defaults.wheel,wheelSpeed:a.defaults.wheelSpeed,wheelLock:a.defaults.wheelLock,scrollInvert:a.defaults.scrollInvert,trackSize:a.defaults.trackSize,thumbSize:a.defaults.thumbSize,alwaysVisible:a.defaults.alwaysVisible},y=l.scrollbar;y=y?n(y)(r):{},this.options=angular.extend({},_,y),this._defaults=_;var w,k=this,C=angular.element(document.querySelectorAll("body")[0]),S=angular.element(document),x=angular.element(o[0].querySelectorAll(".scroll-viewport")[0]),T=angular.element(o[0].querySelectorAll(".scroll-overview")[0]),D=angular.element(o[0].querySelectorAll(".scroll-bar")[0]),$=angular.element(o[0].querySelectorAll(".scroll-thumb")[0]),A=0,E="x"===this.options.axis,I=!1,P="onwheel"in document?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll",L=E?"width":"height",O=L.charAt(0).toUpperCase()+L.slice(1).toLowerCase(),M=E?"left":"top",F=!1,N=!1;("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)&&(I=!0),this.contentPosition=0,this.viewportSize=0,this.contentSize=0,this.contentRatio=0,this.trackSize=0,this.trackRatio=0,this.thumbSize=0,this.thumbPosition=0,this.initialize=function(){return this.options.alwaysVisible||D.css("opacity",0),k.update(),d(),k},this.setSizeData=function(){this.viewportSize=x.prop("offset"+O)||1,this.contentSize=T.prop("scroll"+O)||1,this.contentRatio=this.viewportSize/this.contentSize,this.trackSize=this.options.trackSize||this.viewportSize,this.thumbSize=Math.min(this.trackSize,Math.max(0,this.options.thumbSize||this.trackSize*this.contentRatio)),this.trackRatio=this.options.thumbSize?(this.contentSize-this.viewportSize)/(this.trackSize-this.thumbSize):this.contentSize/this.trackSize},this.update=function(e){return k.setSizeData(),A=D.prop("offsetTop"),D.toggleClass("disable",this.contentRatio>=1||isNaN(this.contentRatio)),!this.options.alwaysVisible&&this.contentRatio<1&&this.viewportSize>0&&i.addClass(D,"visible").then(function(){i.removeClass(D,"visible"),r.$digest()}),null!==e&&("bottom"===e?this.contentPosition=this.contentSize-this.viewportSize:this.contentPosition=parseInt(e,10)||0),c(),$.css(M,k.contentPosition/k.trackRatio+"px"),D.css(L,k.trackSize+"px"),$.css(L,k.thumbSize+"px"),T.css(M,-k.contentPosition+"px"),this},fireEvent=function(e,t){var n,i=e;document.createEvent?(n=document.createEvent("HTMLEvents"),n.initEvent(t,!0,!1),i.dispatchEvent(n)):document.createEventObject&&(n=document.createEventObject(),i.fireEvent("on"+t,n))},r.customScroll=function(e){if(!(k.contentRatio>=1)){var t,n=s.position(x);t=E?n.width:n.height,e?k.contentPosition+=t:k.contentPosition-=t,k.contentPosition=Math.min(k.contentSize-k.viewportSize,Math.max(0,k.contentPosition)),fireEvent(o[0],"move"),c(),$.css(M,k.contentPosition/k.trackRatio+"px"),T.css(M,-k.contentPosition+"px")}},this.cleanup=function(){x.off("touchstart",u),$.off("mousedown",h),D.off("mousedown",v),$.off("touchmove",m),$.off("touchend",b),angular.element(e).off("resize",p),o.off(P,g),k.options.alwaysVisible=!0,b()}}],link:function(e,n,i,a){e.navigation=a.options.navigation,e.viewportHeight=i.viewportHeight,e.viewportWidth=i.viewportWidth,e.scrollbarAxis=a.options.axis,"x"===e.scrollbarAxis?n.addClass("horizontal"):"y"===e.scrollbarAxis&&n.addClass("vertical");var s=n.css("position");"relative"!==s&&"absolute"!==s&&n.css("position","relative"),e.$watch(function(){t(r,100,!1)});var r=function(){var t=angular.element(n[0].querySelectorAll(".scroll-overview")[0]),i=t.prop("scrollHeight"),s=e.oldValue;i!==s&&(e.oldValue=i,a.update())};a.initialize(),n.on("$destroy",function(){a.cleanup()})}}}]),angular.module("att.abs.search",["att.abs.utilities","att.abs.position","att.abs.utilities"]).directive("attSearch",["$document","$filter","$isElement","$documentBind","$timeout","$log","keymap",function(e,t,n,i,a,s,r){return{restrict:"A",scope:{cName:"=attSearch"},transclude:!1,replace:!1,require:"ngModel",templateUrl:"app/scripts/ng_js_att_tpls/search/search.html",link:function(t,o,l,c){t.selectedIndex=-1,t.selectedOption=l.placeholder,t.isDisabled=!1,t.className="select2-match",t.showSearch=!1,t.showlist=!1;var d="",p=new Date,u=void 0,h=[];a(function(){h=o.find("li")},10),s.warn("attSearch is deprecated, please use attSelect instead. This component will be removed by version 2.7."),l.noFilter||"true"===l.noFilter?t.noFilter=!0:t.noFilter=!1,"false"===l.placeholderAsOption?t.selectedOption=l.placeholder:t.selectMsg=l.placeholder,(l.startsWithFilter||"true"===l.startsWithFilter)&&(t.startsWithFilter=!0),"true"===l.showInputFilter&&(t.showSearch=!1,s.warn("showInputFilter functionality has been removed from the library.")),l.disabled&&(t.isDisabled=!0),u=angular.element(o).children().eq(0).find("a")[0];var g=0,f=function(){if(t.noFilter){var e=d,n=0;for(n=g;n<t.cName.length;n++)if(t.cName[n].title.startsWith(e)&&n!==t.selectedIndex){t.selectOption(t.cName[n],n,t.showlist),g=n,d="";break}(n>=t.cName.length||!t.cName[n+1].title.startsWith(e))&&g>0&&(g=0)}};t.showDropdown=function(){l.disabled||(t.showlist=!t.showlist,t.setSelectTop())},o.bind("keydown",function(e){if(r.isAllowedKey(e.keyCode)||r.isControl(e)||r.isFunctionKey(e))switch(e.preventDefault(),e.stopPropagation(),e.keyCode){case r.KEY.DOWN:t.selectNext();break;case r.KEY.UP:t.selectPrev(),d="";break;case r.KEY.ENTER:t.selectCurrent(),d="";break;case r.KEY.BACKSPACE:t.title="",d="",t.$apply();break;case r.KEY.SPACE:t.noFilter||(t.title+=" "),t.$apply();break;case r.KEY.ESC:""===t.title||void 0===t.title?(t.showlist=!1,u.focus(),t.$apply()):(t.title="",t.$apply()),t.noFilter&&(d="",u.focus(),t.showlist=!1)}else if(9!==e.keyCode){if(t.noFilter){var n=new Date,i=Math.abs(p.getMilliseconds()-n.getMilliseconds());p=n,i>100&&(d=""),d=d?d+String.fromCharCode(e.keyCode):String.fromCharCode(e.keyCode),d.length>2&&(d=d.substring(0,2)),f()}else t.showlist=!0,t.title=t.title?t.title+String.fromCharCode(e.keyCode):String.fromCharCode(e.keyCode);t.$apply()}else 9===e.keyCode&&(t.showlist=!1,t.title="",t.$apply())}),t.selectOption=function(e,n,i){-1===n||"-1"===n?(t.selCategory="",t.selectedIndex=-1,c.$setViewValue(""),"false"!==l.placeholderAsOption&&(t.selectedOption=t.selectMsg)):(t.selCategory=t.cName[n],t.selectedIndex=n,c.$setViewValue(t.selCategory),t.selectedOption=t.selCategory.title,angular.isDefined(h[n])&&h[n].focus()),t.title="",i||(t.showlist=!1,u.focus()),t.$apply()},t.selectCurrent=function(){t.showlist?(t.selectOption(t.selectMsg,t.selectedIndex,!1),t.$apply()):(t.showlist=!0,t.setSelectTop(),t.$apply())},t.hoverIn=function(e){t.selectedIndex=e,t.focusme()},t.setSelectTop=function(){a(function(){if(t.showlist&&!t.noFilter){var e=angular.element(o)[0].querySelector(".select2-results");if(angular.element(e.querySelector(".select2-result-current"))[0])var n=angular.element(e.querySelector(".select2-result-current"))[0].offsetTop;angular.element(e)[0].scrollTop=n}})},t.setCurrentTop=function(){a(function(){if(t.showlist){var e=angular.element(o)[0].querySelector(".select2-results");if(angular.element(e.querySelector(".hovstyle"))[0])var n=angular.element(e.querySelector(".hovstyle"))[0].offsetTop;n<angular.element(e)[0].scrollTop?angular.element(e)[0].scrollTop-=30:n+30>angular.element(e)[0].clientHeight&&(angular.element(e)[0].scrollTop+=30)}})},t.selectNext=function(){t.selectedIndex+1<=t.cName.length-1&&(t.selectedIndex+=1,t.showlist||t.selectOption(t.selectMsg,t.selectedIndex,!1),t.focusme(),t.$apply()),t.setCurrentTop()},t.selectPrev=function(){t.selectedIndex-1>=0?(t.selectedIndex-=1,t.showlist||t.selectOption(t.selectMsg,t.selectedIndex,!1),t.focusme(),t.$apply()):t.selectedIndex-1<0&&(void 0===l.placeholderAsOption||"true"===l.placeholderAsOption?t.selectedIndex=-1:t.selectedIndex=0,t.showlist||t.selectOption(t.selectMsg,t.selectedIndex,!1),t.focusme(),t.$apply()),t.setCurrentTop()},t.updateSelection=function(e){t.selectedOption=e.title,t.title=""},t.focusme=function(){a(function(){var e=angular.element(o).find("ul").find("li"),n=t.selectedIndex+2;t.noFilter&&(n=t.selectedIndex),angular.isDefined(e[n])&&e[n].focus()})},t.$watch("selCategory",function(e){e&&t.updateSelection(e)}),c.$viewChangeListeners.push(function(){t.$eval(l.ngChange)}),c.$render=function(){t.selCategory=c.$viewValue};var m=function(i){var a=n(angular.element(i.target),o,e);a||(t.showlist=!1,u.focus(),t.$apply())};i.click("showlist",m,t)}}}]),angular.module("att.abs.select",["att.abs.utilities","att.abs.position","att.abs.utilities"]).directive("attSelect",["$document","$filter","$isElement","$documentBind","$timeout","keymap","$log",function(e,t,n,i,a,s,r){return{restrict:"A",scope:{cName:"=attSelect"},transclude:!1,replace:!1,require:"ngModel",templateUrl:"app/scripts/ng_js_att_tpls/select/select.html",link:function(o,l,c,d){o.selectedIndex=-1,o.selectedOption=c.placeholder,o.isDisabled=!1,o.className="select2-match",o.showSearch=!1,o.showlist=!1,o.titleName=c.titlename,o.$watch("ngModel",function(){});var p="",u=new Date,h=void 0,g=[];a(function(){g=l.find("li")},10),c.noFilter||"true"===c.noFilter?o.noFilter=!0:o.noFilter=!1,"false"===c.placeholderAsOption?o.selectedOption=c.placeholder:o.selectMsg=c.placeholder,(c.startsWithFilter||"true"===c.startsWithFilter)&&(o.startsWithFilter=!0),"true"===c.showInputFilter&&(o.showSearch=!1,r.warn("showInputFilter functionality has been removed from the library.")),c.disabled&&(o.isDisabled=!0);var f=function(){return o.startsWithFilter?"startsWith":"filter"};h=angular.element(l).children().eq(0).find("span")[0];var m=0,v=function(){if(o.noFilter){var e=p,t=0;for(t=m;t<o.cName.length;t++)if(o.cName[t].title.startsWith(e)&&t!==o.selectedIndex){o.selectOption(o.cName[t],t,o.showlist),m=t,p="";break}(t>=o.cName.length||!o.cName[t+1].title.startsWith(e))&&m>0&&(m=0)}};o.showDropdown=function(){c.disabled||(o.showlist=!o.showlist,o.setSelectTop(),o.focusme())},l.bind("keydown",function(e){if(s.isAllowedKey(e.keyCode)||s.isControl(e)||s.isFunctionKey(e))switch(e.preventDefault(),e.stopPropagation(),e.keyCode){case s.KEY.DOWN:o.selectNext();break;case s.KEY.UP:o.selectPrev(),p="";break;case s.KEY.ENTER:o.selectCurrent(),p="";break;case s.KEY.BACKSPACE:o.title="",p="",o.$apply();break;case s.KEY.SPACE:o.noFilter||(o.title+=" "),o.$apply();break;case s.KEY.ESC:""===o.title||void 0===o.title?(o.showlist=!1,h.focus(),o.$apply()):(o.title="",o.$apply()),o.noFilter&&(p="",h.focus(),o.showlist=!1)}else if(e.keyCode!==s.KEY.TAB){if(o.noFilter){var n=new Date,i=Math.abs(u.getMilliseconds()-n.getMilliseconds());u=n,i>100&&(p=""),p=p?p+String.fromCharCode(e.keyCode):String.fromCharCode(e.keyCode),p.length>2&&(p=p.substring(0,2)),v()}else if(o.showlist=!0,o.title=o.title?o.title+String.fromCharCode(e.keyCode):String.fromCharCode(e.keyCode),""!=o.title)for(var a=t(f())(o.cName,o.title),r=0;r<a.length;r++)for(var l=0;l<o.cName.length&&angular.isDefined(o.cName[o.selectedIndex]);l++)if(a[r].title===o.cName[o.selectedIndex].title){o.selectedIndex=r,o.focusme();break}o.$apply()}else e.keyCode===s.KEY.TAB&&(o.showlist=!1,o.title="",o.$apply())}),o.selectOption=function(e,n,i){if(-1===n||"-1"===n)o.selCategory="",o.selectedIndex=-1,d.$setViewValue(""),"false"!==c.placeholderAsOption&&(o.selectedOption=o.selectMsg);else{if(""!=o.title){var s=t(f())(o.cName,o.title);if(angular.isDefined(s)&&angular.isDefined(s[n]))for(var r=0;r<o.cName.length;r++)if(s[n].title===o.cName[r].title){n=r;break}}o.selCategory=o.cName[n],o.selectedIndex=n,d.$setViewValue(o.selCategory),o.selectedOption=o.selCategory.title,d.$render(),a(function(){if(angular.isDefined(g[n]))try{g[index].focus()}catch(e){}})}o.title="",i||(o.showlist=!1,h.focus())},o.selectCurrent=function(){o.showlist?o.selectOption(o.selectMsg,o.selectedIndex,!1):(o.showlist=!0,o.setSelectTop()),o.$apply()},o.hoverIn=function(e){o.selectedIndex=e,o.focusme()},o.setSelectTop=function(){a(function(){if(o.showlist&&!o.noFilter){var e=angular.element(l)[0].querySelector(".select2-results");if(angular.element(e.querySelector(".select2-result-current"))[0])var t=angular.element(e.querySelector(".select2-result-current"))[0].offsetTop;angular.element(e)[0].scrollTop=t}})},o.setCurrentTop=function(){a(function(){if(o.showlist){var e=angular.element(l)[0].querySelector(".select2-results");if(angular.element(e.querySelector(".hovstyle"))[0])var t=angular.element(e.querySelector(".hovstyle"))[0].offsetTop;t<angular.element(e)[0].scrollTop?angular.element(e)[0].scrollTop-=30:t+30>angular.element(e)[0].clientHeight&&(angular.element(e)[0].scrollTop+=30)}})},o.selectNext=function(){o.cName.length;if(o.selectedIndex+1<=o.cName.length-1){o.selectedIndex+=1;var e=o.cName[o.selectedIndex].disabled;e&&(o.selectedIndex+=1),o.showlist||o.selectOption(o.selectMsg,o.selectedIndex,!1),o.focusme(),o.$apply()}o.setCurrentTop()},o.selectPrev=function(){if(o.selectedIndex-1>=0){o.selectedIndex-=1;var e=o.cName[o.selectedIndex].disabled;e&&(o.selectedIndex-=1),o.showlist||o.selectOption(o.selectMsg,o.selectedIndex,!1),o.focusme(),o.$apply()}else o.selectedIndex-1<0&&(void 0===c.placeholderAsOption||"true"===c.placeholderAsOption?void 0===c.placeholder?o.selectedIndex=0:o.selectedIndex=-1:o.selectedIndex=0,o.showlist||o.selectOption(o.selectMsg,o.selectedIndex,!1),o.focusme(),o.$apply());o.setCurrentTop()},o.updateSelection=function(e){o.selectedOption=e.title,o.title="",e.index<0&&o.selectOption(o.selectMsg,e.index,o.showlist)},o.focusme=function(){a(function(){var e=angular.element(l).find("ul").find("li"),t=o.selectedIndex+2;if(o.noFilter&&(t=o.selectedIndex),angular.isDefined(e[t]))try{e[t].focus()}catch(n){}})},o.$watch("selCategory",function(e){e&&o.updateSelection(e)}),d.$viewChangeListeners.push(function(){o.$eval(c.ngChange)}),d.$render=function(){o.selCategory=d.$viewValue};var b=function(t){var i=n(angular.element(t.target),l,e);i||(o.showlist=!1,h.focus(),o.$apply())};i.click("showlist",b,o)}}}]).directive("textDropdown",["$document","$isElement","$documentBind","keymap",function(e,t,n,i){return{restrict:"EA",replace:!0,scope:{actions:"=actions",defaultAction:"=defaultAction",onActionClicked:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/select/textDropdown.html",link:function(a,s,r){a.selectedIndex=0,a.selectedOption=r.placeholder,a.isDisabled=!1,a.isActionsShown=!1;var o=void 0;if(r.disabled&&(a.isDisabled=!0),o=s.find("div")[0],angular.isDefined(a.defaultAction))if(angular.isDefined(a.defaultAction)||""!==a.defaultAction){for(var l in a.actions)if(a.actions[l]===a.defaultAction){a.currentAction=a.actions[l],a.selectedIndex=a.actions.indexOf(l),a.isActionsShown=!1;break}}else a.currentAction=a.actions[0];else a.currentAction=a.actions[0],a.selectedIndex=0;a.toggle=function(){a.isActionsShown=!a.isActionsShown},a.chooseAction=function(e,t,n){null!=e?(a.currentAction=t,a.selectedIndex=n):a.currentAction=a.actions[a.selectedIndex],angular.isFunction(a.onActionClicked)&&a.onActionClicked(a.currentAction),a.toggle()},a.isCurrentAction=function(e){return e===a.currentAction},s.bind("keydown",function(e){if(i.isAllowedKey(e.keyCode)||i.isControl(e)||i.isFunctionKey(e)){switch(e.preventDefault(),e.stopPropagation(),e.keyCode){case i.KEY.DOWN:a.selectNext();break;case i.KEY.UP:a.selectPrev();break;case i.KEY.ENTER:a.selectCurrent();break;case i.KEY.ESC:a.isActionsShown=!1,o.focus(),a.$apply()}return void a.$apply()}e.keyCode===i.KEY.TAB&&(a.isActionsShown=!1,a.$apply())}),a.selectCurrent=function(){a.selectedIndex<0&&(a.selectedIndex=0),a.isActionsShown?a.chooseAction(null,a.currentAction):a.toggle()},a.selectNext=function(){a.isActionsShown&&(a.selectedIndex+1<a.actions.length?a.selectedIndex+=1:a.selectedIndex=a.actions.length-1,a.$apply())},a.selectPrev=function(){a.isActionsShown&&(a.selectedIndex-1>=0?a.selectedIndex-=1:a.selectedIndex-1<0&&(a.selectedIndex=0),a.$apply())},a.hoverIn=function(e){a.selectedIndex=e};var c=function(n){var i=t(angular.element(n.target),s,e);i||(a.toggle(),a.$apply())};n.click("isActionsShown",c,a)}}}]),angular.module("att.abs.slider",["att.abs.position"]).constant("sliderDefaultOptions",{width:300,step:1,precision:0,disabledWidth:116}).directive("attSlider",["sliderDefaultOptions","$position","$document",function(e,t,n){return{restrict:"EA",replace:!0,transclude:!0,scope:{floor:"=",ceiling:"=",step:"@",precision:"@",width:"@",textDisplay:"=",value:"=",ngModelSingle:"=?",ngModelLow:"=?",ngModelHigh:"=?",ngModelDisabled:"=?"},templateUrl:"app/scripts/ng_js_att_tpls/slider/slider.html",link:function(i,a,s){var r,o,l,c,d,p,u,h,g,f,m,v,b,_,y,w,k,C,S=0,x=!1;i.minPtrOffset=0,i.maxPtrOffset=0;var T=e.disabledWidth,D=a.children();h=D[0].children,h=angular.element(h[0]),C=D[1].children,k=angular.element(C[0]),w=angular.element(C[1]),y=angular.element(C[2]),g=null==s.ngModelSingle&&null==s.ngModelLow&&null==s.ngModelHigh&&null!=s.ngModelDisabled,v=null==s.ngModelSingle&&null!=s.ngModelLow&&null!=s.ngModelHigh,b="ngModelLow",_="ngModelHigh",v?k.remove():(w.remove(),y.remove()),g?(i.disabledStyle={width:T+"px",zIndex:1},i.handleStyle={left:T+"px"}):h.remove(),f=parseFloat(i.floor),m=parseFloat(i.ceiling),u=m-f,r=0,o=void 0!==s.width?s.width:0!==a[0].clientWidth?a[0].clientWidth:e.width,p=o-r,i.keyDown=function(n){if(39===n.keyCode){var s=t.position(a).left;if(l)"ngModelLow"===i.ref?(c=e.step+c,l=c):"ngModelHigh"===i.ref?(d=e.step+d,
+l=d):l=e.step+l;else{if(v&&"ngModelLow"===i.ref)return;l=e.step+s,c=d=l}}else if(37===n.keyCode){var r=t.position(k).left;l?0>=l||("ngModelLow"===i.ref?(c-=e.step,l=c):"ngModelHigh"===i.ref?(d-=e.step,l=d):(l-=e.step,c=d=l)):l=r-e.step}l>=0&&i.ptrOffset(l)},i.mouseDown=function(e,t){i.ref=t,x=!0,S=v?i.ref===b?e.clientX-i.minPtrOffset:e.clientX-i.maxPtrOffset:l?e.clientX-l:e.clientX,g&&(i.ref="ngModelDisabled",i.disabledStyle={width:T+"px",zIndex:1})},i.moveElem=function(e){if(x){var t;t=e.clientX,l=t-S,i.ptrOffset(l)}},i.focus=function(e,t){console.log(t),i.ref=t},i.mouseUp=function(e){x=!1,w.removeClass("dragging"),y.removeClass("dragging"),k.removeClass("dragging"),n.off("mousemove")},i.keyUp=function(e){x=!1,w.removeClass("dragging"),y.removeClass("dragging"),k.removeClass("dragging"),n.off("mousemove")},i.calStep=function(e,t,n,i){var a,s,r,o;return null===i&&(i=0),null===n&&(n=1/Math.pow(10,t)),s=(e-i)%n,o=s>n/2?e+n-s:e-s,a=Math.pow(10,t),r=o*a/a,r.toFixed(t)},i.percentOffset=function(e){return(e-r)/p*100},i.ptrOffset=function(t){var n,a;if(t=Math.max(Math.min(t,o),r),n=i.percentOffset(t),a=f+u*n/100,v){var s;i.ref===b?(i.minHandleStyle={left:t+"px"},i.minNewVal=a,i.minPtrOffset=t,w.addClass("dragging"),a>i.maxNewVal&&(i.ref=_,y[0].focus(),i.maxNewVal=a,i.maxPtrOffset=t,y.addClass("dragging"),w.removeClass("dragging"),i.maxHandleStyle={left:t+"px"})):(i.maxHandleStyle={left:t+"px"},i.maxNewVal=a,i.maxPtrOffset=t,y.addClass("dragging"),a<i.minNewVal&&(i.ref=b,w[0].focus(),i.minVal=a,i.minPtrOffset=t,w.addClass("dragging"),y.removeClass("dragging"),i.minHandleStyle={left:t+"px"})),s=parseInt(i.maxPtrOffset)-parseInt(i.minPtrOffset),i.rangeStyle={width:s+"px",left:i.minPtrOffset+"px"}}else g&&t>T?i.rangeStyle={width:t+"px",zIndex:0}:(k.addClass("dragging"),i.rangeStyle={width:t+"px"}),i.handleStyle={left:t+"px"};(void 0===i.precision||void 0===i.step)&&(i.precision=e.precision,i.step=e.step),a=i.calStep(a,parseInt(i.precision),parseFloat(i.step),parseFloat(i.floor)),i[i.ref]=a}}}}]).directive("attSliderMin",[function(){return{require:"^attSlider",restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/slider/minContent.html"}}]).directive("attSliderMax",[function(){return{require:"^attSlider",restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/slider/maxContent.html"}}]),angular.module("att.abs.splitButtonDropdown",["att.abs.utilities","att.abs.position"]).directive("attButtonDropdown",["$document","$parse","$documentBind","$timeout","$isElement",function(e,t,n,i,a){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html",scope:{btnText:"@",btnType:"@",btnLink:"@",btnClick:"&",toggleTitle:"@"},controller:["$scope","$element",function(e,t){this.cSelected=0,this.closeAndFocusDropdown=function(){e.isDropDownOpen&&e.$apply(function(){e.isDropDownOpen=!1,angular.element(t[0].querySelector("a.dropdown-toggle"))[0].focus()})},this.focusNext=function(){this.cSelected=this.cSelected+1>=this.childScopes.length?e.cycleSelection===!0?0:this.childScopes.length-1:this.cSelected+1,this.childScopes[this.cSelected].sFlag=!0,this.resetFlag(this.cSelected)},this.focusPrev=function(){this.cSelected=this.cSelected-1<0?e.cycleSelection===!0?this.childScopes.length-1:0:this.cSelected-1,this.childScopes[this.cSelected].sFlag=!0,this.resetFlag(this.cSelected)},this.childScopes=[],this.registerScope=function(e){this.childScopes.push(e)},this.resetFlag=function(e){for(var t=0;t<this.childScopes.length;t++)t!==e&&(this.childScopes[t].sFlag=!1)}}],link:function(s,r,o){s.isSmall=""===o.small?!0:!1,s.multiselect=""===o.multiselect?!0:!1,s.cycleSelection=""===o.cycleSelection?!0:!1,s.isDropDownOpen=!1,s.isActionDropdown=!1,s.btnText||(s.isActionDropdown=!0),s.clickFxn=function(){"function"!=typeof s.btnClick||s.btnLink||(s.btnClick=t(s.btnClick),s.btnClick()),s.multiselect===!0&&(s.isDropDownOpen=!1)},s.toggleDropdown=function(){"disabled"!==s.btnType&&(s.isDropDownOpen=!s.isDropDownOpen,s.isDropDownOpen&&i(function(){angular.element(r[0].querySelector("li"))[0].focus()}))},s.btnTypeSelector=function(e,t){""!==e?s.btnTypeFinal=e:s.btnTypeFinal=t};var l=function(t){var n=a(angular.element(t.target),r.find("ul").eq(0),e);n||(s.isDropDownOpen=!1,s.$apply())};n.click("isDropDownOpen",l,s),o.$observe("btnType",function(e){s.btnType=e}),o.$observe("attButtonDropdown",function(e){o.attButtonDropdown=e,s.btnTypeSelector(o.attButtonDropdown,s.btnType)})}}}]).directive("attButtonDropdownItem",["$location","keymap",function(e,t){return{restrict:"EA",require:["^attButtonDropdown","?ngModel"],replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html",scope:{itemLink:"@"},link:function(e,n,i,a){angular.element(n[0].querySelector("a"));e.sFlag=!1,a[0].registerScope(e);a[1]?e.isSelected=a[1].$viewValue:e.isSelected=!1,n.bind("keydown",function(n){if(t.isAllowedKey(n.keyCode)||t.isControl(n)||t.isFunctionKey(n))switch(n.preventDefault(),n.stopPropagation(),n.keyCode){case t.KEY.DOWN:a[0].focusNext();break;case t.KEY.UP:a[0].focusPrev();break;case t.KEY.ENTER:e.selectItem();break;case t.KEY.ESC:a[0].closeAndFocusDropdown()}e.$apply()}),e.selectItem=function(){a[1]&&e.$evalAsync(function(){a[1].$setViewValue(!a[1].$viewValue)})}}}}]),angular.module("att.abs.splitIconButton",["att.abs.utilities"]).constant("iconStateConstants",{MIDDLE:"middle",LEFT:"left",RIGHT:"right",NEXT_TO_DROPDOWN:"next-to-dropdown",LEFT_NEXT_TO_DROPDOWN:"left-next-to-dropdown",DIR_TYPE:{LEFT:"left",RIGHT:"right",BUTTON:"button"},SPLIT_ICON_BTN_EVENT_EMITTER_KEY:"splitIconButtonTap"}).directive("expandableLine",[function(){return{restrict:"EA",replace:!0,priority:300,require:["^attSplitIconButton","expandableLine"],controller:["$scope",function(e){e.isActive=!1,this.setActiveState=function(t){e.isActive=t},this.isActive=e.isActive,this.dirType=e.dirType}],template:"<div ng-class=\"{'expand-line-container': !isActive, 'expand-line-container-active': isActive}\"> <div ng-class=\"{'hovered-line':isActive, 'vertical-line':!isActive}\"> </div></div>",scope:{dirType:"@"},link:function(e,t,n,i){var a=i[0],s=i[1];a.addSubCtrl(s)}}}]).controller("AttSplitIconCtrl",["$scope",function(e){this.setType=function(t){e.type=t},this.isDropdown=function(t){e.isDropdown=t},this.dropDownClicked=function(){e.dropDownClicked&&e.dropDownClicked()},this.dirType=e.dirType}]).directive("attSplitIcon",["$document","$timeout","iconStateConstants","$documentBind","events","keymap",function(e,t,n,i,a,s){return{restrict:"EA",replace:!0,priority:200,transclude:!0,require:["^attSplitIconButton","attSplitIcon"],templateUrl:"app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html",scope:{icon:"@",iconTitle:"@title",hoverWatch:"=",dropDownWatch:"=",dirType:"@"},controller:"AttSplitIconCtrl",link:function(e,t,r,o){var l=o[0],c=o[1];l.addSubCtrl(c),e.iconStateConstants=n;var d,p=0,u=!1;e.isDropdown=!1,e.isDropdownOpen=!1;var h=function(t){e.isDropdown&&(u?(u=!1,e.toggleDropdown()):e.toggleDropdown(!1),e.$apply())};r.dropDownId&&""!==r.dropDownId&&(e.dropDownId=r.dropDownId,e.isDropdown=!0),e.$on(n.SPLIT_ICON_BTN_EVENT_EMITTER_KEY,function(n,i){function r(t){switch(t.which){case s.KEY.TAB:e.toggleDropdown(!1),e.$digest();break;case s.KEY.ESC:h();break;case s.KEY.ENTER:e.isDropDownOpen&&o();break;case s.KEY.UP:t.preventDefault(),a.stopPropagation(t),e.isDropDownOpen&&e.previousItemInDropdown();break;case s.KEY.DOWN:t.preventDefault(),a.stopPropagation(t),e.isDropDownOpen?e.nextItemInDropdown():(u=!0,h(),o())}}function o(){if(void 0===d){d=[];for(var e=t.find("li"),n=0;n<e.length;n++)d.push(e.eq(n));d[p].children().eq(0).addClass("selected-item")}}if("boolean"==typeof i&&i)e.dropDownClicked(),e.isDropDownOpen&&d[p].eq(0).find("a")[0].click();else{var l=i;e.isDropdown&&r(l)}}),e.nextItemInDropdown=function(){d&&p<d.length-1&&(p++,d[p-1].children().eq(0).removeClass("selected-item"),d[p].children().eq(0).addClass("selected-item"))},e.previousItemInDropdown=function(){p>0&&(p--,d[p].children().eq(0).addClass("selected-item"),p+1<d.length&&d[p+1].children().eq(0).removeClass("selected-item"))},e.$watch("isIconHovered",function(t){e.hoverWatch=t}),e.$watch("type",function(t){function n(t,n,i,a,s){e.isMiddle=t,e.isNextToDropDown=n,e.isRight=i,e.isLeft=a,e.isLeftNextDropdown=s}switch(t){case e.iconStateConstants.MIDDLE:n(!0,!1,!1,!0,!1);break;case e.iconStateConstants.LEFT:n(!1,!1,!1,!0,!1);break;case e.iconStateConstants.RIGHT:n(!1,!1,!0,!1,!1);break;case e.iconStateConstants.NEXT_TO_DROPDOWN:n(!1,!0,!0,!0,!1);break;case e.iconStateConstants.LEFT_NEXT_TO_DROPDOWN:n(!1,!1,!1,!0,!0)}}),e.dropDownClicked=function(){u=!0},e.toggleDropdown=function(t){void 0!==t?e.isDropDownOpen=t:e.isDropDownOpen=!e.isDropDownOpen,e.dropDownWatch=e.isDropDownOpen},i.click("isDropdown",h,e)}}}]).controller("AttSplitIconButtonCtrl",["$scope","iconStateConstants",function(e,t){function n(e){var t=-1;for(var n in i.subCtrls){var a=i.subCtrls[n];if(a.dirType===e){t=n;break}}return t}this.subCtrls=[],e.isLeftLineShown=!0,e.isRightLineShown=!0,e.childrenScopes=[];var i=this;this.addSubCtrl=function(e){this.subCtrls.push(e)},this.isLeftLineShown=function(t){return void 0===t?e.isLeftLineShown:void(e.isLeftLineShown=t)},this.isRightLineShown=function(t){return void 0===t?e.isRightLineShown:void(e.isRightLineShown=t)},this.setLeftLineHover=function(i){var a=n(t.DIR_TYPE.LEFT);e.isLeftLineShown&&this.subCtrls[a]&&this.subCtrls[a].setActiveState&&this.subCtrls[a].setActiveState(i)},this.setRightLineHover=function(i){var a=n(t.DIR_TYPE.RIGHT);e.isRightLineShown&&this.subCtrls[a]&&this.subCtrls[a].setActiveState&&this.subCtrls[a].setActiveState(i)},this.toggleLines=function(i,a,s,r){function o(){for(var e=0;c>e;e++)if(l[e]===s){c-1>=e+1&&l[e+1].isLeftLineShown()&&l[e+1].subCtrls[d]&&l[e+1].subCtrls[d].setActiveState&&l[e+1].subCtrls[d].setActiveState(i),e-1>=0&&l[e-1].isRightLineShown()&&l[e-1].subCtrls[p]&&l[e-1].subCtrls[p].setActiveState&&l[e-1].subCtrls[p].setActiveState(i);break}}var l=a.subIconButtons,c=l.length,d=n(t.DIR_TYPE.LEFT),p=n(t.DIR_TYPE.RIGHT);r?l[c-2]==s?l[c-2].isLeftLineShown()?l[c-2].subCtrls[d].setActiveState(i):c-3>=0&&l[c-3].isRightLineShown()&&l[c-3].subCtrls[p].setActiveState(i):(o(),e.isLeftLineShown&&this.subCtrls[d].setActiveState(i),e.isRightLineShown&&this.subCtrls[p].setActiveState(i)):(e.isLeftLineShown||e.isRightLineShown||o(),e.isLeftLineShown&&this.subCtrls[d].setActiveState&&this.subCtrls[d].setActiveState(i),e.isRightLineShown&&this.subCtrls[p].setActiveState&&this.subCtrls[p].setActiveState(i))},this.setButtonType=function(e){var i=n(t.DIR_TYPE.BUTTON);this.subCtrls[i]&&this.subCtrls[i].setType&&this.subCtrls[i].setType(e)}}]).directive("attSplitIconButton",["$document","iconStateConstants","keymap",function(e,t,n){return{restrict:"EA",replace:!0,priority:100,transclude:!0,require:["^attSplitIconButtonGroup","attSplitIconButton"],controller:"AttSplitIconButtonCtrl",templateUrl:"app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html",scope:{icon:"@",title:"@",dropDownId:"@"},link:function(e,i,a,s){e.title||(e.title=e.icon);var r=s[0],o=s[1];r.addIconButton(o),i.bind("keydown",function(i){(i.which===n.KEY.ESC||i.which===n.KEY.DOWN||i.which===n.KEY.ENTER||i.which===n.KEY.UP||i.which===n.KEY.TAB)&&(e.clickHandler(),e.$broadcast(t.SPLIT_ICON_BTN_EVENT_EMITTER_KEY,i))}),e.dropDownWatch=!1,e.iconStateConstants=t,e.clickHandler=function(){r.hideLeftLineRightButton(o)},e.$watch("isHovered",function(e){e?o.toggleLines(e,r,o,r.isDropDownOpen):o.toggleLines(e,r,o,r.isDropDownOpen)}),e.$watch("dropDownWatch",function(e){r.isDropDownOpen=e,r.toggleDropdownState(e)})}}}]).controller("AttSplitIconButtonGroupCtrl",["$scope","iconStateConstants",function(e,t){this.subIconButtons=[],this.addIconButton=function(e){this.subIconButtons.push(e)},this.isDropDownOpen=!1,this.hideLeftLineRightButton=function(e){var t=this.subIconButtons.length,n=this.subIconButtons[t-2],i=this.subIconButtons[t-1];e!=n&&e!=i&&i.setLeftLineHover(!1)},this.toggleDropdownState=function(e){var n=this.subIconButtons.length;n>2?e?(this.subIconButtons[n-2].isRightLineShown()?this.subIconButtons[n-2].setRightLineHover(!0):this.subIconButtons[n-1].setLeftLineHover(!0),this.subIconButtons[n-2].setButtonType(t.NEXT_TO_DROPDOWN)):(this.subIconButtons[n-1].setLeftLineHover(!1),this.subIconButtons[n-2].setButtonType(t.MIDDLE)):e?(this.subIconButtons[0].setRightLineHover(!0),this.subIconButtons[0].setButtonType(t.LEFT_NEXT_TO_DROPDOWN)):this.subIconButtons[0].setButtonType(t.LEFT)}}]).directive("attSplitIconButtonGroup",["$document","$timeout","iconStateConstants",function(e,t,n){return{restrict:"EA",replace:!0,priority:50,transclude:!0,require:"attSplitIconButtonGroup",controller:"AttSplitIconButtonGroupCtrl",templateUrl:"app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html",scope:{},link:function(e,i,a,s){function r(){var e=s.subIconButtons,t=0,a=e.length-1;if(e[t].setButtonType(n.LEFT),e[t].isLeftLineShown(!1),e[t].isRightLineShown(!0),e[a].setButtonType(n.RIGHT),e[a].isRightLineShown(!1),e[a].isLeftLineShown(!1),a>=2){for(var r=1;a>r;)e[r].setButtonType(n.MIDDLE),e[r].isRightLineShown(!1),e[r].isLeftLineShown(!1),r++;for(var o=2;a>=o;)o==a?e[o].isLeftLineShown(!0):(e[o].isRightLineShown(!0),e[o].isLeftLineShown(!0)),o+=2}var l=i.find("ul");if(l.length>0){var c=a+1;if(c>2){var d=34*c-70+c/1.5+.5,p=d+"px";angular.element(l).css("left",p),angular.element(l).css("border-top-left-radius","0px")}else angular.element(l).css("left","0px")}}t(r,100)}}}]),angular.module("att.abs.stepSlider",["att.abs.position"]).constant("sliderConstants",{SLIDER:{settings:{from:1,to:40,step:1,smooth:!0,limits:!0,value:"3",dimension:"",vertical:!1},className:"jslider",selector:".jslider-"},EVENTS:{},COLORS:{GREEN:"green",BLUE_HIGHLIGHT:"blue",MAGENTA:"magenta",GOLD:"gold",PURPLE:"purple",DARK_BLUE:"dark-blue",REGULAR:"regular",WHITE:"white"}}).factory("utils",function(){return{offset:function(e){var t=e[0],n=0,i=0,a=document.documentElement||document.body,s=window.pageXOffset||a.scrollLeft,r=window.pageYOffset||a.scrollTop;return n=t.getBoundingClientRect().left+s,i=t.getBoundingClientRect().top+r,{left:n,top:i}},roundUpToScale:function(e,t,n,i){function a(e,t){var n=.1;return Math.abs(t-e)<=n?!0:!1}for(var s,r,o,l,c=1;c<t.length;c++){if(s=t[c-1],r=t[c],l=.5*(r-s)+s,0===s&&l>=e||a(s,e)){o=s;break}if(e>s&&(r>e||a(e,r))){o=r;break}}return n&&n>o?t[i]:o},valueForDifferentScale:function(e,t,n,i){var a=n/100;return 0===a?e:i[n]},convertToMbpsGbps:function(e,t,n){function i(e,t){var n=Math.pow(10,t);return~~(e*n)/n}var a=3;return n&&(a=n),e>1024&&1e6>e&&angular.equals(t,"Kbps")?(e=i(e/1e3,a),t="Mbps"):e>1024&&1e6>e&&angular.equals(t,"Mbps")?(e=i(e/1e3,a),t="Mbps"):t=(1024>=e&&angular.equals(t,"Mbps"),"Kbps"),e>=1e6&&angular.equals(t,"Kbps")&&(e=i(e/1e6,a),t="Gbps"),{unitValue:e,unitLabel:t}},getConversionFactorValue:function(e,t,n){if(e<=t[0].startVal)return{scaledVal:e,scaledDimension:n};var i=0;for(var a in t){var s=t[a];e>s.startVal&&(i=a)}var r=t[i].scaleFactor,o=e/r,l=t[i].dimension;return{scaledVal:o,scaledDimension:l}}}}).factory("sliderDraggable",["utils",function(e){function t(){this._init.apply(this,arguments)}return t.prototype.oninit=function(){},t.prototype.events=function(){},t.prototype.onmousedown=function(){this.ptr.css({position:"absolute"})},t.prototype.onmousemove=function(e,t,n){this.ptr.css({left:t,top:n})},t.prototype.onmouseup=function(){},t.prototype.isDefault={drag:!1,clicked:!1,toclick:!0,mouseup:!1},t.prototype._init=function(){if(arguments.length>0){if(this.ptr=arguments[0],this.parent=arguments[2],!this.ptr)return;this.is={},angular.extend(this.is,this.isDefault);var t=e.offset(this.ptr);this.d={left:t.left,top:t.top,width:this.ptr[0].clientWidth,height:this.ptr[0].clientHeight},this.oninit.apply(this,arguments),this._events()}},t.prototype._getPageCoords=function(e){var t={};return t=e.targetTouches&&e.targetTouches[0]?{x:e.targetTouches[0].pageX,y:e.targetTouches[0].pageY}:{x:e.pageX,y:e.pageY}},t.prototype._bindEvent=function(e,t,n){this.supportTouches_?e[0].attachEvent(this.events_[t],n):e.bind&&e.bind(this.events_[t],n)},t.prototype._events=function(){var e=this;this.supportTouches_="ontouchend"in document,this.events_={click:this.supportTouches_?"touchstart":"click",down:this.supportTouches_?"touchstart":"mousedown",move:this.supportTouches_?"touchmove":"mousemove",up:this.supportTouches_?"touchend":"mouseup",mousedown:(this.supportTouches_,"mousedown")};var t=angular.element(window.document);this._bindEvent(t,"move",function(t){e.is.drag&&(t.stopPropagation(),t.preventDefault(),e.parent.disabled||e._mousemove(t))}),this._bindEvent(t,"down",function(t){e.is.drag&&(t.stopPropagation(),t.preventDefault())}),this._bindEvent(t,"up",function(t){e._mouseup(t)}),this._bindEvent(this.ptr,"down",function(t){return e._mousedown(t),!1}),this._bindEvent(this.ptr,"up",function(t){e._mouseup(t)}),this.events()},t.prototype._mousedown=function(e){this.is.drag=!0,this.is.clicked=!1,this.is.mouseup=!1;var t=this._getPageCoords(e);this.cx=t.x-this.ptr[0].offsetLeft,this.cy=t.y-this.ptr[0].offsetTop,angular.extend(this.d,{left:this.ptr[0].offsetLeft,top:this.ptr[0].offsetTop,width:this.ptr[0].clientWidth,height:this.ptr[0].clientHeight}),this.outer&&this.outer.get(0)&&this.outer.css({height:Math.max(this.outer.height(),$(document.body).height()),overflow:"hidden"}),this.onmousedown(e)},t.prototype._mousemove=function(e){if(0!==this.uid){this.is.toclick=!1;var t=this._getPageCoords(e);this.onmousemove(e,t.x-this.cx,t.y-this.cy)}},t.prototype._mouseup=function(e){this.is.drag&&(this.is.drag=!1,this.outer&&this.outer.get(0)&&($.browser.mozilla?this.outer.css({overflow:"hidden"}):this.outer.css({overflow:"visible"}),$.browser.msie&&"6.0"===$.browser.version?this.outer.css({height:"100%"}):this.outer.css({height:"auto"})),this.onmouseup(e))},t}]).factory("sliderPointer",["sliderDraggable","utils",function(e,t){function n(){e.apply(this,arguments)}return n.prototype=new e,n.prototype.oninit=function(e,t,n){this.uid=t,this.parent=n,this.value={},this.settings=angular.copy(n.settings)},n.prototype.onmousedown=function(e){var n=t.offset(this.parent.domNode),i={left:n.left,top:n.top,width:this.parent.domNode[0].clientWidth,height:this.parent.domNode[0].clientHeight};this._parent={offset:i,width:i.width,height:i.height},this.ptr.addClass("jslider-pointer-hover"),this.setIndexOver()},n.prototype.onmousemove=function(e,n,i){var a=this._getPageCoords(e),s=this.calc(a.x);this.parent.settings.smooth||(s=t.roundUpToScale(s,this.parent.settings.scale,this.parent.settings.cutOffWidth,this.parent.settings.cutOffIndex));var r=this.parent.settings.cutOffWidth;r&&r>s&&(s=r),this._set(s)},n.prototype.onmouseup=function(e){if(this.settings.callback&&angular.isFunction(this.settings.callback)){var t=this.parent.getValue();this.settings.callback.call(this.parent,t)}this.ptr.removeClass("jslider-pointer-hover")},n.prototype.setIndexOver=function(){this.parent.setPointersIndex(1),this.index(2)},n.prototype.index=function(e){},n.prototype.limits=function(e){return this.parent.limits(e,this)},n.prototype.calc=function(e){var t=e-this._parent.offset.left,n=this.limits(100*t/this._parent.width);return n},n.prototype.set=function(e,t){this.value.origin=this.parent.round(e),this._set(this.parent.valueToPrc(e,this),t)},n.prototype._set=function(e,t){t||(this.value.origin=this.parent.prcToValue(e)),this.value.prc=e,this.ptr.css({left:e+"%"}),this.parent.redraw(this)},n}]).factory("slider",["sliderPointer","sliderConstants","utils",function(e,t,n){function i(){return this.init.apply(this,arguments)}function a(e){s.css("width",e)}var s;return i.prototype.changeCutOffWidth=a,i.prototype.init=function(e,n,i){this.settings=t.SLIDER.settings,angular.extend(this.settings,angular.copy(i)),this.inputNode=e,this.inputNode.addClass("ng-hide"),this.settings.interval=this.settings.to-this.settings.from,this.settings.calculate&&$.isFunction(this.settings.calculate)&&(this.nice=this.settings.calculate),this.settings.onstatechange&&$.isFunction(this.settings.onstatechange)&&(this.onstatechange=this.settings.onstatechange),this.is={init:!1},this.o={},this.create(n)},i.prototype.create=function(t){var i=this;this.domNode=t;var a=n.offset(this.domNode),r={left:a.left,top:a.top,width:this.domNode[0].clientWidth,height:this.domNode[0].clientHeight};this.sizes={domWidth:this.domNode[0].clientWidth,domOffset:r},angular.extend(this.o,{pointers:{},labels:{0:{o:angular.element(this.domNode.find("div")[5])},1:{o:angular.element(this.domNode.find("div")[6])}},limits:{0:angular.element(this.domNode.find("div")[3]),1:angular.element(this.domNode.find("div")[5])}}),angular.extend(this.o.labels[0],{value:this.o.labels[0].o.find("span")}),angular.extend(this.o.labels[1],{value:this.o.labels[1].o.find("span")}),i.settings.value.split(";")[1]||(this.settings.single=!0);var o=this.domNode.find("div");s=angular.element(o[8]),s&&s.css&&s.css("width","0%");var l=[angular.element(o[1]),angular.element(o[2])];angular.forEach(l,function(t,n){i.settings=angular.copy(i.settings);var a=i.settings.value.split(";")[n];if(a){i.o.pointers[n]=new e(t,n,i);var s=i.settings.value.split(";")[n-1];s&&parseInt(a,10)<parseInt(s,10)&&(a=s);var r=a<i.settings.from?i.settings.from:a;r=a>i.settings.to?i.settings.to:a,i.o.pointers[n].set(r,!0),0===n&&i.domNode.bind("mousedown",i.clickHandler.apply(i))}}),this.o.value=angular.element(this.domNode.find("i")[2]),this.is.init=!0,angular.forEach(this.o.pointers,function(e){i.redraw(e)})},i.prototype.clickHandler=function(){var e=this;return function(t){if(!e.disabled){var i=t.target.className,a=0;i.indexOf("jslider-pointer-to")>0&&(a=1);var s=n.offset(e.domNode),r={left:s.left,top:s.top,width:e.domNode[0].clientWidth,height:e.domNode[0].clientHeight};a=1;var o=e.o.pointers[a];return o._parent={offset:r,width:r.width,height:r.height},o._mousemove(t),o.onmouseup(),!1}}},i.prototype.disable=function(e){this.disabled=e},i.prototype.nice=function(e){return e},i.prototype.onstatechange=function(){},i.prototype.limits=function(e,t){if(!this.settings.smooth){var n=100*this.settings.step/this.settings.interval;e=Math.round(e/n)*n}var i=this.o.pointers[1-t.uid];i&&t.uid&&e<i.value.prc&&(e=i.value.prc),i&&!t.uid&&e>i.value.prc&&(e=i.value.prc),0>e&&(e=0),e>100&&(e=100);var a=Math.round(10*e)/10;return a},i.prototype.setPointersIndex=function(e){angular.forEach(this.getPointers(),function(e,t){e.index(t)})},i.prototype.getPointers=function(){return this.o.pointers},i.prototype.onresize=function(){var e=this;this.sizes={domWidth:this.domNode[0].clientWidth,domHeight:this.domNode[0].clientHeight,domOffset:{left:this.domNode[0].offsetLeft,top:this.domNode[0].offsetTop,width:this.domNode[0].clientWidth,height:this.domNode[0].clientHeight}},angular.forEach(this.o.pointers,function(t,n){e.redraw(t)})},i.prototype.update=function(){this.onresize(),this.drawScale()},i.prototype.drawScale=function(){},i.prototype.redraw=function(e){if(!this.settings.smooth){var t=n.roundUpToScale(e.value.prc,this.settings.scale,this.settings.cutOffWidth,this.settings.cutOffIndex);e.value.origin=t,e.value.prc=t}if(!this.is.init)return!1;this.setValue();var i=this.o.pointers[1].value.prc,a={left:"0%",width:i+"%"};this.o.value.css(a);var s=this.nice(e.value.origin),r=this.settings.firstDimension;if(this.settings.stepWithDifferentScale&&!this.settings.smooth&&(s=n.valueForDifferentScale(this.settings.from,this.settings.to,s,this.settings.prcToValueMapper)),this.settings.realtimeCallback&&angular.isFunction(this.settings.realtimeCallback)&&void 0!==this.settings.cutOffVal&&1===e.uid&&this.settings.realtimeCallback(s),this.settings.conversion){var o=n.getConversionFactorValue(parseInt(s),this.settings.conversion,this.settings.firstDimension);s=o.scaledVal,r=o.scaledDimension}s=parseFloat(s);var l=n.convertToMbpsGbps(s,r,this.settings.decimalPlaces);this.o.labels[e.uid].value.html(l.unitValue+" "+l.unitLabel),this.redrawLabels(e)},i.prototype.redrawLabels=function(e){function t(e,t,i){t.margin=-t.label/2;var a=n.sizes.domWidth,s=t.border+t.margin;return 0>s&&(t.margin-=s),t.border+t.label/2>a?(t.margin=0,t.right=!0):t.right=!1,t.margin=-(e.o[0].clientWidth/2-e.o[0].clientWidth/20),e.o.css({left:i+"%",marginLeft:t.margin,right:"auto"}),t.right&&e.o.css({left:"auto",right:0}),t}var n=this,i=this.o.labels[e.uid],a=e.value.prc,s={label:i.o[0].offsetWidth,right:!1,border:a*l/100},r=null,o=null;if(!this.settings.single)switch(o=this.o.pointers[1-e.uid],r=this.o.labels[o.uid],e.uid){case 0:s.border+s.label/2>r.o[0].offsetLeft-this.sizes.domOffset.left?(r.o.css({visibility:"hidden"}),r.value.html(this.nice(o.value.origin)),i.o.css({visibility:"hidden"}),a=(o.value.prc-a)/2+a,o.value.prc!==e.value.prc&&(i.value.html(this.nice(e.value.origin)+"&nbsp;&ndash;&nbsp;"+this.nice(o.value.origin)),s.label=i.o[0].clientWidth,s.border=a*l/100)):r.o.css({visibility:"visible"});break;case 1:s.border-s.label/2<r.o[0].offsetLeft-this.sizes.domOffset.left+r.o[0].clientWidth?(r.o.css({visibility:"hidden"}),r.value.html(this.nice(o.value.origin)),i.o.css({visibility:"visible"}),a=(a-o.value.prc)/2+o.value.prc,o.value.prc!==e.value.prc&&(i.value.html(this.nice(o.value.origin)+"&nbsp;&ndash;&nbsp;"+this.nice(e.value.origin)),s.label=i.o[0].clientWidth,s.border=a*l/100)):r.o.css({visibility:"visible"})}s=t(i,s,a);var l=n.sizes.domWidth;r&&(s={label:r.o[0].clientWidth,right:!1,border:o.value.prc*this.sizes.domWidth/100},s=t(r,s,o.value.prc))},i.prototype.redrawLimits=function(){if(this.settings.limits){var e=[!0,!0];for(var t in this.o.pointers)if(!this.settings.single||0===t){var n=this.o.pointers[t],i=this.o.labels[n.uid],a=i.o[0].offsetLeft-this.sizes.domOffset.left,s=this.o.limits[0];a<s[0].clientWidth&&(e[0]=!1),s=this.o.limits[1],a+i.o[0].clientWidth>this.sizes.domWidth-s[0].clientWidth&&(e[1]=!1)}for(var r=0;r<e.length;r++)e[r]?angular.element(this.o.limits[r]).addClass("animate-show"):angular.element(this.o.limits[r]).addClass("animate-hidde")}},i.prototype.setValue=function(){var e=this.getValue();this.inputNode.attr("value",e),this.onstatechange.call(this,e,this.inputNode)},i.prototype.getValue=function(){if(!this.is.init)return!1;var e=this,t="";return angular.forEach(this.o.pointers,function(i,a){if(void 0!==i.value.prc&&!isNaN(i.value.prc)){var s=i.value.prc,r=e.prcToValue(s);if(!e.settings.smooth)var r=n.valueForDifferentScale(e.settings.from,e.settings.to,s,e.settings.prcToValueMapper);t+=(a>0?";":"")+r}}),t},i.prototype.getPrcValue=function(){if(!this.is.init)return!1;var e="";return $.each(this.o.pointers,function(t){void 0===this.value.prc||isNaN(this.value.prc)||(e+=(t>0?";":"")+this.value.prc)}),e},i.prototype.prcToValue=function(e){var t;if(this.settings.heterogeneity&&this.settings.heterogeneity.length>0)for(var n=this.settings.heterogeneity,i=0,a=this.settings.from,s=0;s<=n.length;s++){var r;r=n[s]?n[s].split("/"):[100,this.settings.to],e>=i&&e<=r[0]&&(t=a+(e-i)*(r[1]-a)/(r[0]-i)),i=r[0],a=r[1]}else t=this.settings.from+e*this.settings.interval/100;var o=this.round(t);return o},i.prototype.valueToPrc=function(e,t){var n;if(this.settings.heterogeneity&&this.settings.heterogeneity.length>0)for(var i=this.settings.heterogeneity,a=0,s=this.settings.from,r=0;r<=i.length;r++){var o;o=i[r]?i[r].split("/"):[100,this.settings.to],e>=s&&e<=o[1]&&(n=t.limits(a+(e-s)*(o[0]-a)/(o[1]-s))),a=o[0],s=o[1]}else n=t.limits(100*(e-this.settings.from)/this.settings.interval);return n},i.prototype.round=function(e){return e=Math.round(e/this.settings.step)*this.settings.step,e=this.settings.round?Math.round(e*Math.pow(10,this.settings.round))/Math.pow(10,this.settings.round):Math.round(e)},i}]).directive("attStepSlider",["$compile","$templateCache","$timeout","$window","slider","sliderConstants","utils",function(e,t,n,i,a,s,r){var o="app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html";return{restrict:"AE",require:"?ngModel",scope:{options:"=",cutOff:"="},priority:1,templateUrl:o,link:function(l,c,d,p){function u(){angular.element(i).bind("resize",function(e){l.slider.onresize()})}if(p){l.mainSliderClass="step-slider",c.after(e(t.get(o))(l,function(e,t){t.tmplElt=e})),p.$render=function(){if(p.$viewValue.split&&1===p.$viewValue.split(";").length?p.$viewValue="0;"+p.$viewValue:"number"==typeof p.$viewValue&&(p.$viewValue="0;"+p.$viewValue),(p.$viewValue||0===p.$viewValue)&&("number"==typeof p.$viewValue&&(p.$viewValue=""+p.$viewValue),l.slider)){var e="0";if(l.slider.getPointers()[0].set(e,!0),p.$viewValue.split(";")[1]){var t=p.$viewValue.split(";")[1];t.length>=4&&(t=t.substring(0,2)),l.options.realtime||l.options.callback(parseFloat(p.$viewValue.split(";")[1])),l.slider.getPointers()[1].set(p.$viewValue.split(";")[1],!0)}}};var h=function(){function e(){0!==i[0]&&i.splice(0,0,0),100!==i[i.length-1]&&i.splice(i.length,0,100)}function t(){if(i[i.length-1]!==l.options.to&&i.splice(i.length,0,l.options.to),l.options.displayScaledvalues){for(var e in i)o.push(Math.log2(i[e]));var t=o[o.length-1]}for(var e in i){var n,a=i[e]/l.options.from,s=i[e]/l.options.to;n=l.options.displayScaledvalues?o[e]/t*100:(i[e]-l.options.from)/(l.options.to-l.options.from)*100;var r=i[e];1===s?n=100:1===a&&(n=0),i[e]=n,d[""+n]=r}}l.from=""+l.options.from,l.to=""+l.options.to,l.options.calculate&&"function"==typeof l.options.calculate&&(l.from=l.options.calculate(l.from),l.to=l.options.calculate(l.to)),l.showDividers=l.options.showDividers,l.COLORS=s.COLORS,l.sliderColor=l.options.sliderColor,l.sliderColor||(l.sliderColor=s.COLORS.REGULAR);var i=l.options.scale,a=[],o=[],d={};for(var h in i){var f=i[h];a.push(f)}0===l.options.from&&100===l.options.to||!l.options.smooth?0===l.options.from&&100===l.options.to||l.options.smooth?(t(),e()):(l.options.stepWithDifferentScale=!0,t(),e()):(e(),l.options.stepWithDifferentScale=!0);var m=0;if(l.options.decimalPlaces&&(m=l.options.decimalPlaces),l.endDimension=l.options.dimension,l.options.conversion){var v=l.options.conversion.length-1,b=l.options.conversion[v].dimension,_=l.options.conversion[v].scaleFactor;l.endDimension=" "+b;var y=(l.to/_).toFixed(m);l.toStr=y}else l.toStr=l.options.to;var w=r.convertToMbpsGbps(l.toStr,l.endDimension,l.options.decimalPlaces);l.toStr=w.unitValue,l.endDimension=" "+w.unitLabel;var k={from:l.options.from,to:l.options.to,step:l.options.step,smooth:l.options.smooth,limits:!0,stepWithDifferentScale:l.options.stepWithDifferentScale,round:l.options.round||!1,value:p.$viewValue,scale:l.options.scale,nonPercentScaleArray:a,prcToValueMapper:d,firstDimension:l.options.dimension,decimalPlaces:m,conversion:l.options.conversion,realtimeCallback:l.options.callback};angular.isFunction(l.options.realtime)?k.realtimeCallback=function(e){p.$setViewValue(e),l.options.callback(e)}:k.callback=g,k.calculate=l.options.calculate||void 0,k.onstatechange=l.options.onstatechange||void 0,n(function(){var e=l.tmplElt.find("div")[7];k.conversion||(l.tmplElt.find("div").eq(6).find("span").eq(0).css("padding-left","10px"),l.tmplElt.find("div").eq(6).find("span").eq(0).css("padding-right","15px")),l.slider=angular.element.slider(c,l.tmplElt,k),angular.element(e).html(l.generateScale()),l.drawScale(e),u(),l.$watch("options.disable",function(e){l.slider&&(l.tmplElt.toggleClass("disabled",e),l.slider.disable(e))}),l.$watch("cutOff",function(e){if(e&&e>0){var t=(e-l.slider.settings.from)/(l.slider.settings.to-l.slider.settings.from);if(t=100*t,l.isCutOffSlider=!0,l.slider.settings.cutOffWidth=t,l.cutOffVal=e,l.options.conversion){var n=r.getConversionFactorValue(e,l.options.conversion,l.options.dimension);n.scaledVal=parseFloat(n.scaledVal).toFixed(l.options.decimalPlaces),l.cutOffVal=n.scaledVal+" "+n.scaledDimension}l.slider.settings.cutOffVal=e,l.slider.changeCutOffWidth(t+"%");var i=l.slider.settings.nonPercentScaleArray;for(var a in i)if(a>=1){var s=i[a-1],o=i[a];e>s&&o>=e&&(l.slider.settings.cutOffIndex=a);
+}}else l.slider.settings.cutOffVal=0})})};l.generateScale=function(){if(l.options.scale&&l.options.scale.length>0){for(var e="",t=l.options.scale,n="left",i=0;i<t.length;i++)if(0!==i&&i!==t.length-1){var a=(t[i]-l.from)/(l.to-l.from)*100;l.options.stepWithDifferentScale&&!l.options.smooth&&(a=t[i]),e+='<span style="'+n+": "+a+'%"></span>'}return e}return""},l.drawScale=function(e){angular.forEach(angular.element(e).find("ins"),function(e,t){e.style.marginLeft=-e.clientWidth/2})};var g=function(e){var t=e.split(";")[1];l.$apply(function(){p.$setViewValue(parseInt(t))}),l.options.callback&&l.options.callback(parseInt(t))};l.$watch("options",function(e){h()}),angular.element.slider=function(e,t,n){t.data("jslider")||t.data("jslider",new a(e,t,n));var i=t.data("jslider");return i}}}}}]),angular.module("att.abs.steptracker",["att.abs.transition"]).directive("steptracker",["$timeout",function(e){return{priority:100,scope:{sdata:"=sdata",cstep:"=currentStep",clickHandler:"=?",disableClick:"=?"},restrict:"EA",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/steptracker/step-tracker.html",link:function(t,n){void 0===t.disableClick&&(t.disableClick=!1),e(function(){function e(e){return angular.element(r[e-1])}function i(){if(t.cstep>0&&t.cstep<=t.sdata.length-1&&c>0){var n=c/d*100+"%";p=e(t.cstep),p.css("width",n)}}function a(){t.cstep<=t.sdata.length&&(c=t.sdata[t.cstep-1].currentPage,d=t.sdata[t.cstep-1].totalPages)}t.cstep<1?t.cstep=1:t.cstep>t.sdata.length&&(t.cstep=t.sdata.length);var s=n.find("div"),r=[];for(var o in s)if(s.eq(o)[0]){var l=s.eq(o)[0].className;l.indexOf("track ng-scope")>-1&&r.push(s.eq(o))}var c,d,p=e(t.cstep);t.set_width=function(e){var n=100/(t.sdata.length-1)+"%";return t.sdata.length-1>e?{width:n}:void 0},t.$watch("sdata",function(){a();var e=t.cstep;if(1>c&&(c=1,1!==t.cstep&&(t.cstep--,a())),c>d){if(t.cstep>t.sdata.length-1)return void t.cstep++;c=d,i(),t.cstep++,a(),i()}1>c&&e===t.cstep&&(c=1,t.cstep>1&&(t.cstep--,t.sdata[t.cstep-1].currentPage=t.sdata[t.cstep-1].totalPages,t.sdata[t.cstep].currentPage=1)),i()},!0),t.activestep=function(e){return e===t.cstep-1},t.donesteps=function(e){return e<t.cstep-1},t.laststep=function(e){return e===t.sdata.length-1},t.isIncomplete=function(e){if(e===t.cstep-1)return!1;if(e>=0&&e<t.sdata.length-1){var n=t.sdata[e];return n.currentPage<=n.totalPages}},t.stepclick=function(e,n){if(n<t.cstep){for(var s=t.cstep-1;s>n;s--)t.sdata[s].currentPage=1;t.sdata[n].currentPage--}angular.isFunction(t.clickHandler)&&t.clickHandler(e,n),t.cstep=n+1,t.cstep<=t.sdata.length&&t.sdata[t.cstep].currentPage<1&&(t.sdata[t.cstep].currentPage=1),a(),i()}},100)}}}]).constant("timelineConstants",{STEP_TYPE:{ALERT:"alert",COMPLETED:"completed",CANCELLED:"cancelled"}}).controller("AttTimelineCtrl",["$scope","$timeout",function(e,t){function n(){function t(e,t){return e.order<t.order?-1:e.order>t.order?1:0}s.sort(t),a.sort(t),e.$parent.animate&&i(),e.$watch("trigger",function(t){t?e.resetTimeline():e.$parent.animate=!1})}function i(){function n(){for(var e in s){var t=s[e];if(e%2===0?t.unhoveredStateForBelow(.25):t.unhoveredStateForAbove(.25),t.isStop())break}}function i(e,o){return 0===e?function(){s[e+1].isStop()&&s[e+1].isCancelled()&&a[e].isCancelled(!0),a[e].animate(i(e+1,o),o)}:e===a.length-1?function(){s[0].isCurrentStep()&&s[0].isCurrentStep(!1),s[e].isStop()?(s[e-1].shrinkAnimate(r),s[e].isCurrentStep(!0)):(s[e-1].shrinkAnimate(r),a[e].animate(i(e+1,o),o)),s[e].expandedAnimate(r),t(function(){n()},500)}:e===a.length?function(){s[0].isCurrentStep()&&s[0].isCurrentStep(!1),s[e-1].shrinkAnimate(r),s[e].expandedAnimate(r),s[e].isCurrentStep(!0),t(function(){n()},500)}:function(){s[0].isCurrentStep()&&s[0].isCurrentStep(!1),s[e].isStop()?(s[e-1].shrinkAnimate(r),s[e].expandedAnimate(r),s[e].isCurrentStep(!0),t(function(){n()},500)):(s[e+1].isStop()&&s[e+1].isCancelled()&&a[e].isCancelled(!0),s[e-1].shrinkAnimate(r),a[e].animate(i(e+1,o),o),s[e].expandedAnimate(r))}}var r=.25,o=.25;"number"==typeof e.barAnimateDuration&&(o=e.barAnimateDuration);var l=i(0,o);l()}var a=[],s=[];this.numSteps=0,this.isAlternate=function(){return e.alternate},this.addTimelineBarCtrls=function(e){a.push(e)},this.addTimelineDotCtrls=function(e){s.push(e)},t(n,200)}]).directive("attTimeline",["$timeout","$compile",function(e,t){return{restrict:"EA",replace:!0,scope:{steps:"=",trigger:"=",alternate:"=",barAnimateDuration:"="},templateUrl:"app/scripts/ng_js_att_tpls/steptracker/timeline.html",controller:"AttTimelineCtrl",link:function(e,n,i,a){var s=function(){for(var t=e.steps,n=[],i=1;i<t.length;i++){var s=t[i];n.push(s)}e.middleSteps=n,a.numSteps=t.length-1};s(),e.resetTimeline=function(){e.animate=!0,t(n)(e)}}}}]).controller("TimelineBarCtrl",["$scope",function(e){this.type="timelinebar",this.order=parseInt(e.order),this.animate=function(t,n){e.loadingAnimation(t,n)},this.isCancelled=function(t){e.isCancelled=t}}]).directive("timelineBar",["animation","$progressBar",function(e,t){return{restrict:"EA",replace:!0,templateUrl:"app/scripts/ng_js_att_tpls/steptracker/timelineBar.html",scope:{order:"@"},require:["^attTimeline","timelineBar"],controller:"TimelineBarCtrl",link:function(n,i,a,s){var r=s[0],o=s[1];r.addTimelineBarCtrls(o),n.isCompleted=!0;var l=100/r.numSteps-3;i.css("width",l+"%");var c=i.find("div").eq(0);e.set(c,{opacity:0});var d=function(t){e.set(c,{opacity:1}),e.set(c,{scaleX:t.progress(),transformOrigin:"left"})};n.loadingAnimation=t(d)}}}]).controller("TimelineDotCtrl",["$scope","$timeout","timelineConstants",function(e,t,n){this.type="dot",this.order=parseInt(e.order);var i=this;t(function(){0!==i.order&&(i.order%2!==0?e.initializeAboveForAnimation():e.initializeBelowForAnimation())}),this.expandedAnimate=function(t){e.setColor(),e.expandedAnimate(t),0===i.order||e.isStepsLessThanFive()||(i.order%2!==0?e.expandContentForAbove(t):e.expandContentForBelow(t))},this.unhoveredStateForAbove=function(t){e.unhoveredStateForAbove(t)},this.unhoveredStateForBelow=function(t){e.unhoveredStateForBelow(t)},this.shrinkAnimate=function(t){e.shrinkAnimate(t)},this.setExpanded=function(){e.setSize(3)},this.isStop=function(){return e.isStop},this.isCancelled=function(){return e.type===n.STEP_TYPE.CANCELLED},this.isAlert=function(){return e.type===n.STEP_TYPE.ALERT},this.isCurrentStep=function(t){return void 0!==t&&(e.isCurrentStep=t),e.isCurrentStep}}]).directive("timelineDot",["animation","timelineConstants",function(e,t){return{restrict:"EA",replace:!0,scope:{order:"@",title:"@",description:"@",by:"@",date:"@",type:"@"},templateUrl:"app/scripts/ng_js_att_tpls/steptracker/timelineDot.html",require:["^attTimeline","timelineDot"],controller:"TimelineDotCtrl",link:function(n,i,a,s){function r(){return n.description||n.by||n.date?!1:!0}var o=s[0],l=s[1];o.addTimelineDotCtrls(l),n.numSteps=o.numSteps+1,n.isCurrentStep=!1,n.isCompleted=!1,n.isStop=!1,(n.type===t.STEP_TYPE.ALERT||n.type===t.STEP_TYPE.CANCELLED)&&(n.isStop=!0),n.isInactive=!0;var c=i.find("div"),d=c.eq(0),p=c.eq(2),u=c.eq(3),h=c.eq(5),g=c.eq(6),f=c.eq(9);n.isStepsLessThanFive=function(){return n.numSteps<5?!0:!1},n.titleMouseover=function(e){n.isStepsLessThanFive()||r()||(1===e&&n.order%2===0&&n.expandContentForBelow(.25),2===e&&n.order%2!==0&&n.expandContentForAbove(.25))},n.titleMouseleave=function(){n.order%2===0?n.unhoveredStateForBelow(.25):n.unhoveredStateForAbove(.25)},n.initializeAboveForAnimation=function(){if(!n.isStepsLessThanFive()&&o.isAlternate()&&(e.set(g,{opacity:0}),e.set(f,{opacity:0}),!r())){var t=g[0].offsetHeight+f[0].offsetHeight;e.set(h,{top:t})}},n.expandContentForAbove=function(t){!n.isStepsLessThanFive()&&o.isAlternate()&&(e.to(h,t,{top:0}),e.to(g,t,{opacity:1}),e.to(f,t,{opacity:1}))},n.unhoveredStateForAbove=function(t){if(!n.isStepsLessThanFive()&&o.isAlternate()){e.set(g,{opacity:0}),e.set(f,{opacity:1});var i=g[0].offsetHeight;e.to(h,t,{top:i})}},n.initializeBelowForAnimation=function(){!n.isStepsLessThanFive()&&o.isAlternate()&&(e.set(g,{height:"0%",opacity:0,top:"-20px"}),e.set(f,{opacity:0}))},n.expandContentForBelow=function(t){!n.isStepsLessThanFive()&&o.isAlternate()&&(e.set(f,{opacity:1}),e.to(g,t,{height:"auto",opacity:1,top:"0px"}))},n.unhoveredStateForBelow=function(t){!n.isStepsLessThanFive()&&o.isAlternate()&&(e.to(g,t,{height:"0%",opacity:0,top:"-20px",position:"relative"}),e.set(f,{opacity:1}))},r()&&n.order%2!==0&&o.isAlternate()&&u.css("top","-47px"),n.order%2!==0&&o.isAlternate()?n.isBelowInfoBoxShown=!1:n.isBelowInfoBoxShown=!0,n.isStepsLessThanFive()&&!o.isAlternate()&&e.set(f,{marginTop:10}),e.set(d,{opacity:".5"}),e.set(p,{opacity:"0.0"}),e.set(p,{scale:.1}),0===n.order&&(e.set(p,{opacity:"1.0"}),e.set(p,{scale:1}),e.set(d,{scale:3}),n.isCurrentStep=!0,n.isInactive=!1,n.isCompleted=!0),n.setColor=function(){n.isInactive=!1,n.type===t.STEP_TYPE.CANCELLED?n.isCancelled=!0:n.type===t.STEP_TYPE.ALERT?n.isAlert=!0:n.isCompleted=!0,n.$phase||n.$apply()},n.setSize=function(t){e.set(biggerCircle,{scale:t})},n.setExpandedCircle=function(){e.set(p,{opacity:"1.0"}),e.set(p,{scale:1})},n.expandedAnimate=function(t){e.to(d,t,{scale:3}),e.set(p,{opacity:"1.0"}),e.to(p,t,{scale:1})},n.shrinkAnimate=function(t){e.to(d,t,{scale:1})}}}}]),angular.module("att.abs.table",["att.abs.utilities"]).constant("tableConfig",{defaultSortPattern:!1,highlightSearchStringClass:"tablesorter-search-highlight"}).directive("attTable",["$filter",function(e){return{restrict:"EA",replace:!0,transclude:!0,scope:{tableData:"=",viewPerPage:"=",currentPage:"=",totalPage:"=",searchCategory:"=",searchString:"="},require:"attTable",templateUrl:"app/scripts/ng_js_att_tpls/table/attTable.html",controller:["$scope",function(e){this.headers=[],this.currentSortIndex=null,this.setIndex=function(e){this.headers.push(e)},this.getIndex=function(e){for(var t=0;t<this.headers.length;t++)if(this.headers[t].headerName===e)return this.headers[t].index;return null},this.sortData=function(t,n){e.$parent.columnIndex=t,e.$parent.reverse=n,this.currentSortIndex=t,e.currentPage=1,this.resetSortPattern()},this.getSearchString=function(){return e.searchString},this.resetSortPattern=function(){for(var e=0;e<this.headers.length;e++){var t=this.headers[e];t.index!==this.currentSortIndex&&t.resetSortPattern()}}}],link:function(t,n,i,a){t.searchCriteria={},t.$watchCollection("tableData",function(e){e&&!isNaN(e.length)&&(t.totalRows=e.length)}),t.$watch("currentPage",function(e){t.$parent.currentPage=e}),t.$watch("viewPerPage",function(e){t.$parent.viewPerPage=e}),t.$watch(function(){return t.totalRows/t.viewPerPage},function(e){isNaN(e)||(t.totalPage=Math.ceil(e),t.currentPage=1)});var s=function(e){return angular.isDefined(e)&&null!==e&&""!==e?!0:void 0},r=function(e,n){if(s(e)&&s(n)){var i=a.getIndex(n);t.searchCriteria={},null!==i&&(t.searchCriteria[i]=e)}else!s(e)||angular.isDefined(n)&&null!==n&&""!==n?t.searchCriteria={}:t.searchCriteria={$:e}};t.$watch("searchCategory",function(e,n){e!==n&&r(t.searchString,e)}),t.$watch("searchString",function(e,n){e!==n&&r(e,t.searchCategory)}),t.$watchCollection("searchCriteria",function(n){t.$parent.searchCriteria=n,t.totalRows=t.tableData&&e("filter")(t.tableData,n,!1).length||0,t.currentPage=1})}}}]).directive("attTableRow",[function(){return{restrict:"EA",compile:function(e,t){if("header"===t.type)e.find("tr").eq(0).addClass("tablesorter-headerRow");else if("body"===t.type){var n=e.children();t.rowRepeat&&(t.trackBy?n.attr("ng-repeat",t.rowRepeat.concat(" | orderBy : columnIndex : reverse | filter : searchCriteria : false | attLimitTo : viewPerPage : viewPerPage*(currentPage-1) track by "+t.trackBy)):n.attr("ng-repeat",t.rowRepeat.concat(" | orderBy : columnIndex : reverse | filter : searchCriteria : false | attLimitTo : viewPerPage : viewPerPage*(currentPage-1) track by $index"))),n.attr("ng-class","{'alt-row': $even,'normal-row': $odd}"),e.append(n)}}}}]).directive("attTableHeader",["tableConfig",function(e){return{restrict:"EA",replace:!0,transclude:!0,scope:{sortable:"@",defaultSort:"@",index:"@key"},require:"^attTable",templateUrl:"app/scripts/ng_js_att_tpls/table/attTableHeader.html",link:function(t,n,i,a){var s=e.defaultSortPattern;t.headerName=n.text(),t.sortPattern=null,a.setIndex(t),t.$watch(function(){return n.text()},function(e){t.headerName=e}),t.sort=function(e){"boolean"==typeof e&&(s=e),a.sortData(t.index,s),t.sortPattern=s?"descending":"ascending",s=!s},t.$watch(function(){return a.currentSortIndex},function(e){e!==t.index&&(t.sortPattern=null)}),void 0===t.sortable||"true"===t.sortable||t.sortable===!0?t.sortable="true":(t.sortable===!1||"false"===t.sortable)&&(t.sortable="false"),"false"!==t.sortable&&("A"===t.defaultSort||"a"===t.defaultSort?t.sort(!1):("D"===t.defaultSort||"d"===t.defaultSort)&&t.sort(!0)),t.resetSortPattern=function(){s=e.defaultSortPattern}}}}]).directive("attTableBody",["$filter","$timeout","tableConfig",function(e,t,n){return{restrict:"EA",require:"^attTable",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/table/attTableBody.html",link:function(i,a,s,r){var o=n.highlightSearchStringClass,l="",c=function(t){var n=t.text();t.html(e("highlight")(n,l,o))},d=function(e){var t=e.children();if(!(t.length>0))return void c(e);for(var n=0;n<t.length;n++)d(t.eq(n))},p=function(e){for(var t=e.find("*"),n=0;n<t.length;n++)if(t.eq(n).attr("class")&&-1!==t.eq(n).attr("class").indexOf(o)){var i=t.eq(n).text();t.eq(n).replaceWith(i)}};t(function(){var e=a.children();i.$watch(function(){return r.getSearchString()},function(t){l=t,p(a),e.length>0?d(a):c(a)})},50)}}}]),angular.module("att.abs.tableMessages",["att.abs.utilities"]).constant("messageConstants",{TABLE_MESSAGE_TYPES:{noMatching:1,errorLoading:2,magnifySearch:3,isLoading:4},USER_MESSAGE_TYPES:{success:1,error:0}}).directive("attTableMessage",["messageConstants",function(e){return{restrict:"AE",replace:!0,transclude:!0,scope:{msgType:"=",onRefreshClick:"&"},templateUrl:"app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html",link:function(t){t.messageConstants=e,t.refreshAction=function(e){t.onRefreshClick(e)}}}}]).directive("attUserMessage",["messageConstants","$timeout","DOMHelper",function(e,t,n){return{restrict:"AE",replace:!0,transclude:!0,scope:{thetitle:"=",type:"=",message:"=",trigger:"="},templateUrl:"app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html",link:function(i,a){var s=void 0,r=void 0;i.messageConstants=e,t(function(){r=n.firstTabableElement(a[0])},10),i.$watch("trigger",function(){i.trigger?(s=document.activeElement,angular.isDefined(r)&&r.focus()):angular.isDefined(s)&&s.focus()})}}}]),angular.module("att.abs.tabs",["att.abs.utilities"]).directive("attTabs",function(){return{restrict:"EA",transclude:!1,replace:!0,scope:{tabs:"=title"},controller:["$scope",function(e){this.getData=function(){return e.tabs},this.onClickTab=function(t){return e.currentTab=t.url,e.currentTab},this.isActiveTab=function(t){return t===e.currentTab}}],link:function(e){for(var t=0;t<e.tabs.length;t++)e.tabs[t].selected&&e.tabs[t].url&&(e.currentTab=e.tabs[t].url)}}}).directive("floatingTabs",function(){return{require:"^attTabs",restrict:"EA",transclude:!1,replace:!0,scope:{size:"@"},templateUrl:"app/scripts/ng_js_att_tpls/tabs/floatingTabs.html",link:function(e,t,n,i){e.tabs=i.getData(),e.onClickTab=i.onClickTab,e.isActiveTab=i.isActiveTab}}}).directive("simplifiedTabs",function(){return{require:"^attTabs",restrict:"EA",transclude:!1,replace:!0,scope:{ctab:"=ngModel"},templateUrl:"app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html",link:function(e,t,n,i){e.tabs=i.getData(),e.clickTab=function(t){return e.ctab=t.id,e.ctab},e.isActive=function(t){return t===e.ctab}}}}).directive("genericTabs",function(){return{require:"^attTabs",restrict:"EA",transclude:!1,replace:!0,scope:{ctab:"=ngModel"},templateUrl:"app/scripts/ng_js_att_tpls/tabs/genericTabs.html",link:function(e,t,n,i){e.tabs=i.getData(),e.clickTab=function(t){return e.ctab=t.id,e.ctab},e.isActive=function(t){return t===e.ctab}}}}).directive("skipNavigation",function(){return{link:function(e,t,n){t.bind("click",function(){var e=angular.element(t.parent().parent().parent().parent())[0].querySelector("a.skiptoBody");angular.element(e).attr("tabindex",-1),e.focus()})}}}).directive("parentTab",[function(){return{restrict:"EA",scope:{menuItems:"=",activeSubMenu:"=",activeMenu:"="},controller:["$scope",function(e){e.megaMenu=e.menuItems,e.megaMenuTab,e.megaMenuHoverTab,this.setMenu=function(){e.menuItems=e.megaMenu,e.activeSubMenu.scroll=!1;for(var t=0;t<e.menuItems.length;t++)e.menuItems[t].active&&(e.activeMenu=e.menuItems[t]);this.setSubMenuStatus(!1),e.$apply()},this.setActiveMenu=function(){if(void 0!==e.megaMenuTab&&null!==e.megaMenuTab)e.menuItems=[e.megaMenuTab],e.megaMenuTab.scroll=!0,e.activeMenu={},e.activeSubMenu=e.megaMenuTab,this.setSubMenuStatus(!0);else{for(var t=0;t<e.menuItems.length;t++)if(e.menuItems[t].active=!1,e.menuItems[t].subItems)for(var n=0;n<e.menuItems[t].subItems.length;n++)e.menuItems[t].subItems[n].active=!1;e.menuItems=e.megaMenu}e.$apply()};var t=!1;this.setSubMenuStatus=function(e){t=e},this.getSubMenuStatus=function(){return t},this.setActiveMenuTab=function(t){e.megaMenuTab=t},this.setActiveMenuHoverTab=function(t){e.megaMenuHoverTab=t},this.setActiveSubMenuTab=function(){e.megaMenuTab=e.megaMenuHoverTab},this.resetMenuTab=function(){e.megaMenuTab=void 0},this.clearSubMenu=function(){e.$evalAsync(function(){e.megaMenuTab=void 0,e.megaMenuHoverTab=void 0})}}]}}]).directive("parentmenuTabs",[function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{megaMenu:"@",menuItems:"="},controller:["$scope",function(e){this.getMenu=function(){return e.menuItems},this.setMenu=function(t){e.menuItems=t}}],templateUrl:"app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html"}}]).directive("menuTabs",["$window","$document","events","keymap",function(e,t,n,i){return{restrict:"EA",transclude:!0,replace:!0,require:["^?parentTab","^?parentmenuTabs"],scope:{activeMenu:"=",menuItem:"=",subMenu:"@",subItemActive:"@",tabName:"=?",tabUrl:"=?"},templateUrl:function(e,t){return t.megaMenu?"app/scripts/ng_js_att_tpls/tabs/menuTab.html":"app/scripts/ng_js_att_tpls/tabs/submenuTab.html"},link:function(e,a,s,r){var o=r[0],l=r[1];e.clickInactive=!0,e.showHoverChild=function(t){e.clickInactive=!1,e.hoverChild=r[0].getSubMenuStatus(),"mouseover"===t.type&&r[0].getSubMenuStatus()},e.showChildren=function(t){e.parentMenuItems=l.getMenu();for(var n=0;n<e.parentMenuItems.length;n++){if(e.parentMenuItems[n].active=!1,e.parentMenuItems[n].subItems)for(var i=0;i<e.parentMenuItems[n].subItems.length;i++)e.parentMenuItems[n].subItems[i].active=!1;e.clickInactive=!0}e.menuItem.active=!0,e.activeMenu=e.menuItem,t.stopPropagation()},e.$watch("subItemActive",function(t){"true"===t&&"true"===e.subMenu&&o.setActiveMenuHoverTab(e.menuItem)}),e.showMenuClick=function(t){o.setActiveMenuTab(e.menuItem),t.stopPropagation()},e.showSubMenuClick=function(e){o.setActiveSubMenuTab(),e.stopPropagation()},e.resetMenu=function(e){o.resetMenuTab(),e.stopPropagation()},t.bind("scroll",function(){}),a.bind("keydown",function(t){switch(t.keyCode||(t.keyCode=t.which),t.keyCode!==i.KEY.TAB&&(n.preventDefault(t),n.stopPropagation(t)),t.keyCode){case i.KEY.ESC:var s;a.attr("mega-menu")?"item"===a.attr("menu-item")&&(s=angular.element(a.parent().parent().parent().parent())[0].querySelector("a.skiptoBody"),angular.element(s).attr("tabindex",-1),s.focus()):"true"===a.attr("sub-menu")?(s=angular.element(a.parent().parent().parent().parent().parent().parent().parent())[0].querySelector("a.skiptoBody"),angular.element(s).attr("tabindex",-1),s.focus()):void 0===a.attr("sub-menu")&&(s=angular.element(a.parent().parent().parent().parent().parent().parent().parent().parent().parent().parent())[0].querySelector("a.skiptoBody"),angular.element(s).attr("tabindex",-1),s.focus());break;case i.KEY.RIGHT:if(a.attr("mega-menu")){if("item"===a.attr("menu-item")){var r=angular.element(a)[0];if(r.nextElementSibling)null==r.nextElementSibling.querySelector("span")||r.nextElementSibling.querySelector("span").focus();else{do{if(!r||!r.nextSibling)break;r=r.nextSibling}while(r&&"LI"!==r.tagName);r&&(null===r.querySelector("span")||r.querySelector("span").focus()),n.preventDefault(t),n.stopPropagation(t)}}}else{var r=angular.element(a)[0];if("true"===a.attr("sub-menu")){if(null===r.nextElementSibling)break;if(r.nextElementSibling)r.nextElementSibling.querySelector("a").focus();else{do{if(!r||!r.nextSibling)break;r=r.nextSibling}while(r&&"LI"!==r.tagName);r&&(null==r.querySelector("a")||r.querySelector("a").focus()),n.preventDefault(t),n.stopPropagation(t)}}else if(void 0===a.attr("sub-menu")){if(null===r.nextElementSibling)break;if(r.nextElementSibling)r.nextElementSibling.querySelector("a").focus();else{do{if(!r||!r.nextSibling)break;r=r.nextSibling}while(r&&"LI"!==r.tagName);r&&(null==r.querySelector("a")||r.querySelector("a").focus())}}}break;case i.KEY.DOWN:if(a.attr("mega-menu"))angular.element(a)[0].querySelectorAll(".megamenu__items")[0].querySelector("a").focus();else if(void 0===a.attr("sub-menu")){var r=document.activeElement;if(null===r.nextElementSibling)break;if(r.nextElementSibling)r.nextElementSibling.focus();else{do{if(!r||!r.nextSibling)break;r=r.nextSibling}while(r&&"A"!==r.tagName);null!==r.attributes&&r.focus(),n.stopPropagation(t)}}else if("true"===a.attr("sub-menu")){var l=angular.element(a)[0].querySelector("span").querySelector("a");if(null===l)break;l.focus()}break;case i.KEY.LEFT:if(a.attr("mega-menu")){if("item"===a.attr("menu-item")){var r=angular.element(a)[0];if(r.previousElementSibling)null===r.previousElementSibling.querySelector("span")||r.previousElementSibling.querySelector("span").focus();else{do{if(!r||!r.previousSibling)break;r=r.previousSibling}while(r&&"LI"!==r.tagName);r&&(null===r.querySelector("span")||r.querySelector("span").focus()),n.preventDefault(t),n.stopPropagation(t)}}}else{var r=angular.element(a)[0];if("true"===a.attr("sub-menu")){if(null===r.previousElementSibling)break;if(r.previousElementSibling)r.previousElementSibling.querySelector("a").focus();else{do{if(!r||!r.previousSibling)break;r=r.previousSibling}while(r&&"LI"!==r.tagName);r&&(null==r.querySelector("a")||r.querySelector("a").focus()),n.preventDefault(t),n.stopPropagation(t)}}else if(void 0===a.attr("sub-menu")){if(null===r.previousElementSibling)break;if(r.previousElementSibling)r.previousElementSibling.querySelector("a").focus();else{do{if(!r||!r.previousSibling)break;r=r.previousSibling}while(r&&"LI"!==r.tagName);r&&(null==r.querySelector("a")||r.querySelector("a").focus())}}}break;case i.KEY.UP:if("true"===a.attr("sub-menu")){var r=document.activeElement,c=angular.element(a.parent().parent().parent().parent())[0].querySelector("span");c.focus(),o.clearSubMenu(),e.menuItem.active=!1;break}if(void 0===a.attr("sub-menu")){var r=document.activeElement,c=angular.element(a.parent().parent().parent().parent())[0].querySelector("a");if(document.activeElement===angular.element(r).parent().parent()[0].querySelectorAll("a")[0]){c.focus();break}if(r.previousElementSibling){r.previousElementSibling;null!=r.previousElementSibling?r.previousElementSibling.focus():c.focus()}else{do{if(!r||!r.previousSibling)break;r=r.previousSibling}while(r&&"A"!==r.tagName);r&&3!==r.nodeType&&r.focus(),n.preventDefault(t),n.stopPropagation(t)}break}}})}}}]),angular.module("att.abs.tagBadges",[]).directive("tagBadges",["$parse","$timeout",function(e,t){return{restrict:"EA",replace:!1,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html",scope:{styleType:"@",onClose:"&"},link:function(n,i,a){n.isSmall=!1,n.isIcon=!1,n.isColor=!1,n.display=!0,n.isClosable=!1,n.isHighlight=!1,n.customColor=!1,""===a.small&&(n.isSmall=!0),"icon"===n.styleType?n.isIcon=!0:"color"===n.styleType&&(n.isColor=!0,void 0!==a.color&&""!==a.color&&(n.customColor=!0,a.$observe("color",function(e){n.border_type_borderColor=e,n.background_type_backgroundColor=e,n.background_type_borderColor=e}))),n.activeHighlight=function(e){n.customColor&&(e?n.isHighlight=!0:n.isHighlight=!1)},""===a.closable&&(n.isClosable=!0,n.closeMe=function(){n.display=!1,t(function(){i.attr("tabindex","0"),i[0].focus(),i.bind("blur",function(){i.remove()})}),a.onClose&&(n.onClose=e(n.onClose),n.onClose())})}}}]),angular.module("att.abs.textOverflow",[]).constant("textDefaultOptions",{width:"50%"}).directive("attTextOverflow",["textDefaultOptions","$compile",function(e,t){return{restrict:"A",link:function(n,i,a){var s=i.text();if(i.addClass("text-ellipsis"),a.$observe("attTextOverflow",function(t){t?i.css({width:t}):i.css({width:e.width})}),!i.attr("tooltip")){i.attr("tooltip",s),i.attr("tooltip-placement","above");var r=angular.element(i);t(r)(n)}}}}]),angular.module("att.abs.toggle",["angular-gestures","att.abs.position"]).directive("attToggleTemplate",["$compile","$log","$position",function(e,t,n){return{restrict:"A",require:"ngModel",transclude:!0,scope:{modelVal:"=ngModel"},templateUrl:"app/scripts/ng_js_att_tpls/toggle/demoToggle.html",link:function(e,t,i){e.initialDragPosition=0;var a=0,s=n.offset(t.children().eq(1).children().eq(0)).width-1,r=function(){e.attrValue===i.ngTrueValue||e.attrValue?e.modelVal=!1:e.modelVal=!0};e.updateModel=function(e){1!==a&&(r(),a=0),e.preventDefault()},e.drag=function(i){if(a=1,"dragstart"===i.type)e.initialDragPosition=n.position(t.children().eq(1)).left,t.children().eq(1).addClass("dragging");else if("drag"===i.type){var o=Math.min(0,Math.max(e.initialDragPosition+i.gesture.deltaX,-s));t.children().eq(1).css({left:o+"px"})}else if("dragend"===i.type){var l=n.position(t.children().eq(1)).left>-1*s/2;t.children().eq(1).removeClass("dragging"),TweenMax.to(t.children().eq(1),.1,{left:l?0:-1*s,ease:Power4.easeOut,onComplete:function(){t.children().eq(1).css({left:""})}}),(l||!l&&"left"===i.gesture.direction)&&r(),a=0}return!1},e.directiveValue=i.attToggleTemplate,e.on=i.trueValue,e.off=i.falseValue;var o=-1*s+"px";e.$watch("modelVal",function(n){if(e.attrValue=n,n===i.ngTrueValue||n){t.children().eq(1).css({left:"0px"}),t.addClass("att-checkbox--on");var s=t.find("div").find("div").eq(1);s.attr("aria-checked",!0),a=0}else{t.children().eq(1).css({left:o}),t.removeClass("att-checkbox--on");var s=t.find("div").find("div").eq(1);s.attr("aria-checked",!1),a=0}t.children().eq(1).css({left:""})})}}}]).directive("attToggleMain",["$compile",function(e){return{restrict:"A",require:"ngModel",transclude:!0,replace:!0,scope:{modelValue:"=ngModel",trueValue:"=ngTrueValue",falseValue:"=ngFalseValue"},link:function(t,n,i){var a="",s="";n.removeAttr("att-toggle-main"),t.on=i.ngTrueValue,t.off=i.ngFalseValue,t.largeValue=i.attToggleMain,angular.isDefined(i.ngTrueValue)&&(a+=' true-value="{{on}}" false-value="{{off}}"'),void 0!==t.largeValue&&(s+=' ="{{largeValue}}"'),n.css({display:"none"});var r=angular.element('<div class="att-switch att-switch-alt" ng-class="{\'large\' : largeValue == \'large\'}" ng-model="modelValue"'+a+" att-toggle-template"+s+">"+n.prop("outerHTML")+"</div>");r=e(r)(t),n.replaceWith(r)}}}]),angular.module("att.abs.treeview",[]).directive("treeView",function(){return{restrict:"A",link:function(e,t){function n(){s.reversed()?s.play():s.reverse()}function i(e){e.stopPropagation(),void 0!==angular.element(e.target).attr("tree-view")&&(t.hasClass("minus")?t.removeClass("minus"):t.addClass("minus"),n())}var a=t.children("ul li"),s=TweenMax.from(a,.2,{display:"none",paused:!0,reversed:!0});t.attr("tabindex","0"),t.on("click",function(e){i(e)}),t.on("keypress",function(e){var t=e.keyCode?e.keyCode:e.charCode,n=[13,32];n.length>0&&t&&n.indexOf(t)>-1&&(i(e),e.preventDefault())})}}}),angular.module("att.abs.typeAhead",["att.abs.tagBadges"]).directive("focusMe",["$timeout","$parse",function(e,t){return{link:function(n,i,a){var s=t(a.focusMe);n.$watch(s,function(t){t&&e(function(){i[0].focus(),n.inputActive=!0})}),i.bind("blur",function(){s.assign(n,!1),n.inputActive=!1,n.$digest()})}}}]).directive("typeAhead",["$timeout","$log",function(e,t){return{restrict:"EA",templateUrl:"app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html",replace:!0,scope:{items:"=",title:"@?",titleName:"@",subtitle:"@",model:"=",emailIdList:"=",emailMessage:"="},link:function(n,i){!angular.isDefined(n.titleName)&&angular.isDefined(n.title)&&e(function(){n.titleName=n.title,t.warn("title attribute is deprecated and title-name attribute is used instead as it is conflicting with html title attribute")}),n.lineItems=[],n.filteredListLength=-1,n.filteredList=[],n.setFocus=function(){n.clickFocus=!0},n.setFocus(),n.handleSelection=function(e,t){n.lineItems.push(e),n.emailIdList.push(t),n.model="",n.current=0,n.selected=!0,n.clickFocus=!0},n.theMethodToBeCalled=function(t){var i=n.lineItems.slice();n.emailIdList.splice(t,1),i.splice(t,1),e(function(){n.lineItems=[],n.$apply(),n.lineItems=n.lineItems.concat(i)})},n.current=0,n.selected=!0,n.isCurrent=function(e,t,i,a){return n.current===e&&(n.itemName=t,n.itemEmail=i),n.dropdownLength=a,n.current===e},n.setCurrent=function(e){n.current=e},n.selectionIndex=function(e){38===e.keyCode&&n.current>0?(e.preventDefault(),n.current=n.current-1,n.isCurrent(n.current)):9===e.keyCode?n.selected=!0:13===e.keyCode&&n.dropdownLength!==n.items.length?n.handleSelection(n.itemName,n.itemEmail):8===e.keyCode&&0===n.model.length||46===e.keyCode?n.theMethodToBeCalled(n.lineItems.length-1):40===e.keyCode&&n.current<n.dropdownLength-1&&(e.preventDefault(),n.current=n.current+1,n.isCurrent(n.current)),i[0].querySelector(".list-scrollable").scrollTop=35*(n.current-1)}}}}]),angular.module("att.abs.verticalSteptracker",["ngSanitize"]).directive("verticalSteptracker",[function(){return{restrict:"EA",transclude:!0,replace:!1,scope:{},template:'<div class="vertical-nav"><ul ng-transclude arial-label="step list" role="presentation" class="tickets-list-height"></ul></div>',link:function(){}}}]).directive("verticalSteptrackerStep",[function(){return{restrict:"EA",transclude:!0,replace:!1,scope:{type:"=type",id:"=id"},templateUrl:"app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html",link:function(){}}}]).directive("attAbsLink",[function(){return{restrict:"EA",transclude:!0,replace:!1,template:'<span ng-transclude class="view-log"></span>'}}]),angular.module("att.abs.videoControls",[]).config(["$compileProvider",function(e){e.aHrefSanitizationWhitelist(/^\s*(https?|javascript):/)}]).directive("videoControls",[function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/videoControls/videoControls.html"}}]).directive("photoControls",[function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"app/scripts/ng_js_att_tpls/videoControls/photoControls.html",scope:{prevLink:"@",nextLink:"@"},link:function(e,t,n){n.prevLink||(e.prevLink="javascript:void(0)"),n.nextLink||(e.nextLink="javascript:void(0)"),e.links={prevLink:e.prevLink,nextLink:e.nextLink}}}}]),angular.module("app/scripts/ng_js_att_tpls/accordion/accordion.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/accordion/accordion.html",'<div class="att-accordion__group tabpanel" ng-class="{\'att-accordion__group att-accordion__group--open\':isOpen,\'att-accordion__group\':!isOpen }">\n    <a  ng-show="showicon" \n        class="toggle-header att-accordion__heading att-accordion__toggle noafter" \n        aria-selected="{{focused}}" \n        aria-controls="panel{{index}}" \n        aria-expanded="{{isOpen}}" \n        ng-class="{focus: focused, selected: focused}"         \n        role="tab" \n        ng-click="toggle()" \n        accordion-transclude="heading" \n        style="cursor:pointer; text-decoration:none">\n        <span href="#"><i class={{headingIconClass}}></i>&nbsp;&nbsp;{{heading}}</span>\n        <i i ng-show = \'childLength > 0\' ng-class="{\'icon-chevron-down\':!isOpen,\'icon-chevron-up\':isOpen }" class="pull-right"></i>\n    </a>\n    <div ng-show="!showicon" \n         ng-class="{focus: focused, selected: focused}" \n         style="text-decoration:none" \n         accordion-transclude="heading"          \n         role="tab"  \n         aria-expanded="{{isOpen}}"\n         aria-selected="{{focused}}" \n         aria-controls="panel{{index}}" \n         class="toggle-header att-accordion__heading att-accordion__toggle noafter">\n        <span>{{heading}}</span>\n    </div>    \n    <div aria-label="{{heading}}" \n         aria-hidden="{{!isOpen}}" \n         role="tabpanel" \n         collapse="!isOpen" \n         class="att-accordion__body" \n         id="panel{{index}}" \n         ng-transclude>\n    </div>\n    <div class="att-accordion__bottom--border"></div>    \n</div> ');
+}]),angular.module("app/scripts/ng_js_att_tpls/accordion/accordion_alt.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/accordion/accordion_alt.html",'<div class="att-accordion__group tabpanel" ng-class="{\'att-accordion__group att-accordion__group--open\':isOpen,\'att-accordion__group\':!isOpen }">\n    <a class="toggle-header att-accordion__heading att-accordion__toggle" \n       aria-selected="{{focused}}" \n       aria-controls="panel{{index}}" \n       ng-class="{focus: focused, selected: focused}" \n       aria-expanded="{{isOpen}}" \n       role="tab" \n       ng-click="toggle()" \n       accordion-transclude="heading">        \n    </a>\n    <span>{{heading}}</span>\n    <div aria-label="{{heading}}" \n         aria-hidden="{{!isOpen}}" \n         role="tabpanel" \n         collapse="!isOpen" \n         class="att-accordion__body" \n         id="panel{{index}}" \n         ng-transclude>\n    </div>\n</div> ')}]),angular.module("app/scripts/ng_js_att_tpls/accordion/attAccord.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/accordion/attAccord.html","<div ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/accordion/attAccordBody.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/accordion/attAccordBody.html","<div ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/accordion/attAccordHeader.html",'<div ng-click="clickFunc()">\n	<div ng-transclude>\n		<i class="icon-chevron-down"></i>\n	</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/alert/alert.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/alert/alert.html","<div class=\"alert\" ng-class=\"{'alert-success': alertType === 'success', 'alert-warning': alertType === 'warning', 'alert-error': alertType === 'error', 'alert-info': alertType === 'info', 'alert-inplace': showTop !== 'true'}\" ng-show=\"showAlert\" ng-style=\"cssStyle\">\n    <div class=\"container\">\n"+'        <a href="javascript:void(0)" alt="close" class="close-role" ng-click="close()" tabindex="0" att-accessibility-click="32,13">Dismiss <i class="icon-circle-action-close"></i></a>\n        <span ng-transclude> </span>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/boardStrip/attAddBoard.html",'<div tabindex="0" att-accessibility-click="13,32" ng-click="addBoard()" aria-label="Add Board" class="boardstrip-item--add">\n    <i aria-hidden="true" class="icon-add centered"></i>\n    <br/>\n    <div class="centered">Add board</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/boardStrip/attBoard.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/boardStrip/attBoard.html",'<li att-board-navigation tabindex="0" aria-label="{{boardLabel}}" att-accessibility-click="13,32" ng-click="selectBoard(boardIndex)" class="board-item" ng-class="{\'selected\': getCurrentIndex()===boardIndex}">\n    <div ng-transclude></div>\n    <div class="board-caret" ng-if="getCurrentIndex()===boardIndex">\n        <div class="board-caret-indicator"></div>\n        <div class="board-caret-arrow-up"></div>\n    </div>\n</li>')}]),angular.module("app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/boardStrip/attBoardStrip.html",'<div class="att-boardstrip">\n	<div class="boardstrip-reel">\n		<div class="prev-items" ng-if="isPrevBoard()">\n			<i tabindex="0" aria-label="Scroll Boardstrip Left" att-accessibility-click="13,32" ng-click="prevBoard()" class="arrow icon-arrow-left-circle"></i>\n		</div>\n		<div att-add-board on-add-board="onAddBoard()"></div>\n		<div class="board-viewport"><ul role="presentation" class="boardstrip-container" ng-transclude></ul></div>\n		<div class="next-items" ng-if="isNextBoard()">\n			<i tabindex="0" aria-label="Scroll Boardstrip Right" att-accessibility-click="13,32" ng-click="nextBoard()" class="arrow icon-arrow-right-circle"></i>\n		</div>\n	</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/buttons/buttonDropdown.html",'<div class="att-btn-dropdown">\n    <div class="buttons-dropdown--small btn-group" ng-class="{\'open\': isOpen}" att-accessibility-click="13,32" ng-click="toggle()">\n        \n        <button role="menu" class="button button--secondary button--small buttons-dropdown__drop dropdown-toggle" ng-if="type===\'dots\'" alt="Click for Options" >\n            \n            <div class="circle"></div>\n            <div class="circle"></div>\n            <div class="circle"></div>\n        </button>\n        <button role="menu" class="button button--secondary button--small buttons-dropdown__drop dropdown-toggle ng-isolate-scope actions-title" ng-if="type === \'actions\'" alt="Actions dropdown Buttons">Actions</button>\n        \n\n'+"        <ul ng-class=\"{'dropdown-menu dots-dropdwn': type==='dots', 'dropdown-menu actions-dropdwn': type === 'actions'}\" ng-transclude></ul>\n    </div>\n    \n</div>\n")}]),angular.module("app/scripts/ng_js_att_tpls/colorselector/colorselector.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/colorselector/colorselector.html",'<div class="att-radio att-color-selector__item"  \n     ng-class="{\'att-radio--on\': (iconColor === selected)}">\n    <div class="att-radio__indicator" tabindex="0" att-accessibility-click="32,13" ng-click="selectedcolor(iconColor)" \n         ng-style="applycolor" ng-transclude></div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/dateFilter.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/datepicker/dateFilter.html",'<div class="calendar" ng-class="{\'monthpicker\':mode === 1}">\n    <div class="select2-container" ng-class="{\'select2-container-active select2-dropdown-open\': showDropdownList}" style="width: 100%; z-index:0">\n        <a tabindex="0" id="select2-choice" class="select2-choice" href="javascript:void(0)" att-element-focus="focusInputButton" ng-show="!showCalendar" att-accessibility-click="13,32" ng-click="showDropdown()" ng-blur="focusInputButton=false">\n            <span class="select2-chosen" ng-show="!showCalendar">{{selectedOption}}</span>\n            <input type="text" ng-show="showCalendar" ng-blur="untrackInputChange($event)" att-input-deny="[^0-9\\/-]" maxlength="{{maxLength}}" ng-model="selectedOption" aria-labelledby="select2-choice" ng-change="getDropdownText()" />\n            <abbr class="select2-search-choice-close"></abbr>\n            <span ng-class="{\'select2-arrow\': mode !== 1, \'calendar-icon\': mode === 1}"><b></b></span>\n        </a>\n        <a id="select2-chosen" class="select2-choice" href="javascript:void(0)" ng-show="showCalendar">\n            <span class="select2-chosen" ng-show="!showCalendar">{{selectedOption}}</span>\n            <input type="text" ng-show="showCalendar" ng-blur="untrackInputChange($event)" att-input-deny="[^0-9\\/-]" maxlength="{{maxLength}}" ng-model="selectedOption" aria-labelledby="select2-chosen" ng-change="getDropdownText()" />\n            <abbr class="select2-search-choice-close"></abbr>\n            <span tabindex="0" ng-class="{\'select2-arrow\': mode !== 1, \'calendar-icon\': mode === 1}" att-accessibility-click="13,32" ng-click="showDropdown()"><b></b></span>\n        </a>\n    </div>\n    <div class="select2-drop select2-drop-active select2-display-none" ng-style="{display: (showDropdownList && \'block\') || \'none\', \'border-radius\': showCalendar && \'0 0 0 6px\'}" style="width: 100%">\n        <div  id="dateFilterList" att-scrollbar ><ul class="select2-results options" ng-transclude></ul></div>\n		<ul class="select2-results sttings" style="margin-top:0px">\n			<li tabindex="0" class="select2-result select2-highlighted greyBorder" ng-class="{\'select2-result-current\': checkCurrentSelection(\'Custom Single Date\')}" att-accessibility-click="13,32" ng-click="selectAdvancedOption(\'Custom Single Date\')">\n                <div class="select2-result-label" ng-if="mode !== 1">Custom Single Date...</div>\n				<div class="select2-result-label" ng-if="mode === 1">Custom single month...</div>\n            </li>\n            <li tabindex="0" class="select2-result select2-highlighted" ng-class="{\'select2-result-current\': checkCurrentSelection(\'Custom Range\')}" att-accessibility-click="13,32" ng-click="selectAdvancedOption(\'Custom Range\')">\n                <div class="select2-result-label" ng-if="mode !== 1">Custom Range...</div>\n				<div class="select2-result-label" ng-if="mode === 1">Custom month range...</div>\n            </li>\n            <li class="select2-result select2-highlighted btnContainer" ng-style="{display: (showCalendar && \'block\') || \'none\'}">\n                <button tabindex="0" ng-blur="resetFocus($event)" att-element-focus="focusApplyButton" att-button="" btn-type="{{applyButtonType}}" size="small" att-accessibility-click="13,32" ng-click="apply()">Apply</button>\n                <button tabindex="0" att-button="" btn-type="secondary" size="small" att-accessibility-click="13,32" ng-click="cancel()">Cancel</button>\n                <div>\n                    <a tabindex="0" href="javascript:void(0)" ng-if="mode !== 1" style="text-decoration:underline;" att-accessibility-click="13,32" ng-click="clear()">Clear Dates</a>\n                    <a tabindex="0" href="javascript:void(0)" ng-if="mode === 1" style="text-decoration:underline;" att-accessibility-click="13,32" ng-click="clear()">Clear Months</a>\n                </div>\n            </li>\n		</ul>\n    </div>\n    <div class="datepicker-wrapper show-right" ng-style="{display: (showCalendar && \'block\') || \'none\'}">\n        <span datepicker ng-blur="resetFocus($event)" att-element-focus="focusSingleDateCalendar" ng-show="checkCurrentSelection(\'Custom Single Date\')"></span>\n        <span datepicker ng-blur="resetFocus($event)" att-element-focus="focusRangeCalendar" ng-show="checkCurrentSelection(\'Custom Range\')"></span>\n    </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/datepicker/dateFilterList.html",'<li ng-click="!disabled && selectOption(fromDate,toDate,caption)" att-accessibility-click="13,32" ng-class="{\'select2-result-current\': checkCurrentSelection(caption)}" class="select2-result select2-highlighted ng-scope" tabindex="{{!disabled?\'0\':\'-1\'}}">\n                <div class="select2-result-label" ng-class="{\'disabled\':disabled}" ng-transclude></div>\n</li>')}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/datepicker.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/datepicker/datepicker.html",'<div id="datepicker" class="datepicker" ng-class="{\'monthpicker\': mode === 1}" aria-hidden="false" role="dialog" tabindex="-1" aria-labelledby="datepicker">\n    <div class="datepicker-days" style="display: block;">\n        <table class="table-condensed">\n            <thead>\n                <tr>\n                    <th id="month" tabindex="0" class="datepicker-switch" colspan="{{(mode !== 1) && (currentRows[0].length - 2) || (currentRows[0].length)}}" style="text-align:left">{{currentTitle}}</th>\n                    <th ng-if="mode !== 1" id="prev" aria-hidden="{{!disablePrev && \'false\'|| \'true\'}}" tabindex="{{!disablePrev && \'0\'|| \'-1\'}}" att-accessibility-click="13,32" ng-click="!disablePrev && move(-1)">\n            <div class="icons-list" data-size="medium"><i class="icon-arrow-left-circle" ng-class="{\'disabled\': disablePrev}" alt="Left Arrow"></i>\n            </div><span class="hidden-spoken">Previous Month</span>\n            </th>\n            <th ng-if="mode !== 1" id="next" aria-hidden="{{!disableNext && \'false\'|| \'true\'}}" tabindex="{{!disableNext && \'0\'|| \'-1\'}}" att-accessibility-click="13,32" ng-click="!disableNext && move(1)">\n            <div class="icons-list" data-size="medium"><i class="icon-arrow-right-circle" ng-class="{\'disabled\': disableNext}" alt="Right Arrow"></i>\n            </div><span class="hidden-spoken">Next Month</span>\n            </th>\n            </tr>\n            <tr ng-if="labels.length > 0">\n                <th tabindex="-1" class="dow weekday" ng-repeat="label in labels"><span>{{label.pre}}</span></th>\n            </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <td id="datepickerBody" att-scrollbar colspan="{{currentRows[0].length}}" style="padding: 0px;" headers="">\n                        <table ng-class="{\'table-condensed\': mode === 0, \'monthtable-condensed\': mode === 1}" style="padding: 0px;">\n                            <thead class="hidden-spoken">\n                                <tr ng-show="labels.length > 0">\n                                    <th id="{{label.post}}" tabindex="-1" class="dow weekday" ng-repeat="label in labels"></th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                <tr ng-repeat="row in currentRows">\n                                    <td headers="{{(mode === 0) && dt.header || \'month\'}}" att-element-focus="dt.focused" aria-hidden="{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && \'false\') || \'true\'}}" tabindex="{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && \'0\') || \'-1\'}}" ng-repeat="dt in row" class="days" ng-class="{\'active\': dt.selected || dt.from || dt.to, \'from\': dt.from, \'to\': dt.to, \'range\': dt.dateRange, \'prev-month \': dt.oldMonth, \'next-month\': dt.nextMonth, \'disabled\': dt.disabled, \'today\': dt.today, \'weekend\': dt.weekend}" ng-click="!dt.selected && !dt.from && !dt.to && !dt.disabled && !dt.oldMonth && !dt.nextMonth && select(dt.date)" att-accessibility-click="13,32" aria-label="{{dt.date | date : \'EEEE, MMMM d\'}}"><span class="day">{{dt.label}}</span></td>\n                                </tr>\n                                <tr ng-if="mode === 1" class="divider"><td colspan="{{nextRows[0].length}}"><hr></td></tr>\n                                <tr>\n                                    <th id="month" tabindex="0" class="datepicker-switch internal" colspan="{{nextRows[0].length}}" style="text-align:left">{{nextTitle}}</th>\n                                </tr>\n                                <tr ng-repeat="row in nextRows">\n'+"                                    <td headers=\"{{(mode === 0) && dt.header || 'month'}}\" att-element-focus=\"dt.focused\" aria-hidden=\"{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && 'false') || 'true'}}\" tabindex=\"{{(!dt.oldMonth && !dt.nextMonth && !dt.disabled && '0') || '-1'}}\" ng-repeat=\"dt in row\" class=\"days\" ng-class=\"{'active': dt.selected || dt.from || dt.to, 'from': dt.from, 'to': dt.to, 'range': dt.dateRange, 'prev-month ': dt.oldMonth, 'next-month': dt.nextMonth, 'disabled': dt.disabled, 'today': dt.today, 'weekend': dt.weekend}\" ng-click=\"!dt.selected && !dt.from && !dt.to && !dt.disabled && !dt.oldMonth && !dt.nextMonth && select(dt.date)\" att-accessibility-click=\"13,32\" aria-label=\"{{dt.date | date : 'EEEE, MMMM d'}}\"><span class=\"day\">{{dt.label}}</span></td>\n                                </tr>\n                            </tbody>\n                        </table>\n                    </td>\n                </tr>\n            </tbody>\n        </table>\n    </div>\n</div>\n")}]),angular.module("app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/datepicker/datepickerPopup.html",'<div class="calendar">\n    <div class="box" ng-class="{\'active\': isOpen}">\n        <span ng-transclude></span>\n        <i class="calendar-icon" tabindex="0" att-accessibility-click="13,32" ng-click="toggle()" alt="Calendar Icon"></i>\n    </div>\n    <div class="datepicker-wrapper datepicker-wrapper-display-none" ng-style="{display: (isOpen && \'block\') || \'none\'}" aria-hidden="false" role="dialog" tabindex="-1">\n        <span datepicker></span>\n    </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/dividerLines/dividerLines.html",'<div class="divider-container" ng-class="{\'divider-container-light\': lightContainer}">\n    <hr ng-class="{\'divider-light\': lightContainer}">\n</div>\n\n')}]),angular.module("app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/dragdrop/fileUpload.html",'<label class="fileContainer"><span ng-transclude></span><input type="file" att-file-change></label>')}]),angular.module("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlert.html",'<div class="form-field" ng-class="{\'error\': errorMessage, \'warning\': warningMessage}">\n    <label class="form-field__label" ng-class="{\'form-field__label--show\': showLabel, \'form-field__label--hide\': hideLabel}"></label>\n    <div class="form-field-input-container" ng-transclude></div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/formField/attFormFieldValidationAlertPrv.html",'<div class="form-field" ng-class="{\'error\':hideErrorMsg}">\n    <div class="form-field-input-container" ng-transclude></div>\n	<div class="form-field__message error" type="error" ng-show="hideErrorMsg" >\n		<i class="icon-info-alert"></i>{{errorMessage}}\n	</div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/formField/creditCardImage.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/formField/creditCardImage.html",'<span class="css-sprite pull-right">\n<span class="hidden-spoken">We accept</span>\n<ul class="{{newValCCI}}">\n        <li class="css-sprite-mc"><span class="hidden-spoken">MasterCard</span></li>\n        <li class="css-sprite-visa"><span class="hidden-spoken">Visa</span></li>\n        <li class="css-sprite-amex"><span class="hidden-spoken">American Express</span></li>\n        <li class="css-sprite-discover"><span class="hidden-spoken">Discover</span></li>														\n</ul>\n</span>\n<label for="ccForm.card" class="pull-left">Card number</label>')}]),angular.module("app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/formField/cvcSecurityImg.html",'<div>\n<button type="button" class="btn btn-alt btn-tooltip" style="padding-top:16px" title="Help"><i class="hidden-spoken">Help</i></button>\n<div class="helpertext" role="tooltip">\n<div class="popover-title"></div>\n<div class="popover-content">\n    <p class="text-legal cvc-cc">\n        <img ng-src="images/{{newValI}}.png" alt="{{newValIAlt}}">\n    </p>\n</div>\n</div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/hourpicker/hourpicker.html",'<div class="hourpicker">\n    <div class="dropdown-width">\n        <div ng-model="showlist" class="select2-container topDropDownWidth" ng-class="{\'select2-dropdown-open select2-container-active\': showlist}" >\n            <a class="select2-choice" href="javascript:void(0)" id="customSelect" ng-keydown="selectOption(selectPrevNextValue($event,options,selectedOption))" att-accessibility-click="13" ng-click="showDropdown()">\n                <span class="select2-chosen">{{selectedOption}}</span>\n                <span class="select2-arrow"><b></b></span>\n            </a>\n        </div>             \n        <div class="select2-display-none select2-with-searchbox select2-drop-active show-search resultTopWidth" ng-show="showlist">       \n        <ul class="select2-results resultTopMargin" >                       \n            <li  ng-model="ListType" ng-repeat="option in options" att-accessibility-click="13" ng-click="selectOption(option,$index)" class="select2-results-dept-0 select2-result select2-result-selectable"><div class="select2-result-label"><span >{{option}}</span></div></li>                        \n        </ul>\n        </div>\n    </div>\n    <div ng-show="showDaysSelector" class="customdays-width">\n        <div att-divider-lines class="divider-margin-f"></div>  \n        <div class="col-md-3 fromto-margin">\n            <div>From</div> <br>\n            <div>To</div>\n        </div>\n        <div ng-repeat="day in days">\n            <div class="col-md-3 col-md-days">\n                <div  class="col-md-1 daysselect-margin">\n                    <input type="checkbox" ng-model="daysList[day]" title="Day selection {{$index}}" att-checkbox ng-change="addSelectedValue(day)">    \n                </div>\n                <span>{{day}}</span><br>\n                \n                <div class="dropDownMarginBottom">\n                    <div class="select2-container topDropDownWidth" ng-class="{\'select2-dropdown-open select2-container-active\': FrtimeListDay[day]}" >\n                        <a class="select2-choice selectDropDown" href="javascript:void(0)" tabindex="{{daysList[day] ? \'0\' : \'-1\'}}" att-accessibility-click="13" ng-click="daysList[day] && showfromDayDropdown(day)" ng-class="{\'select2-chosen-disabled\':!daysList[day]}"  ng-keydown="daysList[day] && selectFromDayOption(day , selectPrevNextValue($event,fromtime,selectedFromOption[day]));daysList[day] && addSelectedValue(day);">\n                            <span class="select2-chosen dropDownMarginRight" >{{selectedFromOption[day]}} <i ng-if="daysList[day]" ng-class="FrtimeListDay[day] ? \'icon-dropdown-up\' : \'icon-dropdown-down\'"></i></span>\n                        </a>\n                    </div>             \n                    \n                    <div class="select2-display-none select2-with-searchbox select2-drop-active show-search resultFromDropDown"  ng-show="FrtimeListDay[day]">       \n                    <ul class="select2-results resultTopMargin" >                       \n                        <li ng-click="selectFromDayOption(day,time.value);addSelectedValue(day);" ng-repeat="time in fromtime"  class="select2-results-dept-0 select2-result select2-result-selectable"><div class="select2-result-label" ng-class="{\'selectedItemInDropDown\': (time.value==selectedFromOption[day])}"><span >{{time.value}}</span></div></li>                        \n                    </ul>\n                    </div>\n                </div>\n                \n                <div class="dropDownMarginBottom">\n                    <div class="select2-container topDropDownWidth" ng-class="{\'select2-dropdown-open select2-container-active\': TotimeListDay[day]}" >\n                        <a class="select2-choice selectDropDown" href="javascript:void(0)" tabindex="{{daysList[day] ? \'0\' : \'-1\'}}" att-accessibility-click="13" ng-click="daysList[day] && showtoDayDropdown(day)" ng-class="{\'select2-chosen-disabled\':!daysList[day], \'selectDropDown-error\':daysList[day] && showToTimeErrorDay[day]}"  ng-keydown="daysList[day] && selectToDayOption(day , selectPrevNextValue($event,totime,selectedToOption[day]));daysList[day] && addSelectedValue(day);">\n                            <span class="select2-chosen dropDownMarginRight">{{selectedToOption[day]}} <i ng-if="daysList[day]" ng-class="TotimeListDay[day] ? \'icon-dropdown-up\' : \'icon-dropdown-down\'" ></i></span>\n                        </a>\n                    </div>\n                    \n                    <div class="select2-display-none select2-with-searchbox select2-drop-active show-search resultToDropDown" ng-show="TotimeListDay[day]">       \n                    <ul class="select2-results resultTopMargin" >                       \n                        <li ng-click="selectToDayOption(day,time.value);addSelectedValue(day);" ng-repeat="time in totime"  class="select2-results-dept-0 select2-result select2-result-selectable"><div class="select2-result-label" ng-class="{\'selectedItemInDropDown\': (time.value==selectedToOption[day])}"><span >{{time.value}}</span></div></li>                        \n                    </ul>\n                    </div>\n                </div>\n            </div>  \n        </div>    \n        <div att-divider-lines class="divider-margin-s"></div>\n    </div>\n    <div ng-transclude></div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/links/readMore.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/links/readMore.html",'<div>\n    <div ng-bind-html="textToDisplay" ng-class="{\'att--readMore\': readFlag, \'att--readLess\': !readFlag}" ng-style="readLinkStyle"></div>\n    <span class="att--readmore__link" ng-show="readMoreLink">… <a href="javascript:void(0);" ng-click="readMore()" att-accessbility-click="32,13">Read More</a>\n    </span>\n</div>\n<span class="att--readless__link" ng-show="readLessLink">\n    <a href="javascript:void(0);" ng-click="readLess()" att-accessbility-click="32,13">Read Less</a>\n</span>')}]),angular.module("app/scripts/ng_js_att_tpls/loading/loading.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/loading/loading.html",'<div data-progress="{{progressStatus}}" class="{{colorClass}}" ng-class="{\'att-loading-count\':icon == \'count\',\'loading--small\':icon == \'small\',\'loading\': icon != \'count\'}" alt="Loading">\n	<div class="att-loading-circle" ng-if="icon == \'count\'">\n		<div class="att-loading-circle__mask att-loading-circle__full">\n			<div class="att-loading-circle__fill"></div>\n		</div>\n		<div class="att-loading-circle__mask att-loading-circle__half">\n			<div class="att-loading-circle__fill"></div>\n			<div class="att-loading-circle__fill att-loading-circle__fix"></div>\n		</div>\n	</div>\n	<div ng-class="{\'att-loading-inset\':icon == \'count\',\'loading__inside\':icon != \'count\'}"><div class="att-loading-inset__percentage" ng-if="icon == \'count\'" alt="Loading with Count"></div></div>\n</div>\n\n')}]),angular.module("app/scripts/ng_js_att_tpls/modal/backdrop.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/modal/backdrop.html",'<div class="overlayed" ng-class="{show: animate}" \n'+"     ng-style=\"{'z-index': 2000 + index*10,'overflow':'scroll'}\">         \n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/modal/tabbedItem.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/modal/tabbedItem.html",'<div>\n    <ul class="tabs_overlay">\n        <li ng-repeat="item in items" class="tabs_overlay__item two__item" ng-class="{\'active\':isActiveTab($index)}" ng-click="clickTab($index)">\n            <i class="{{item.iconClass}}"></i>\n            {{item.title}} ({{item.number}})\n            <a class="viewLink" att-link>Show</a>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/modal/tabbedOverlayItem.html",'<div>\n    <ul class="tabs_overlay">\n        <li ng-repeat="item in items" class="tabs_overlay__item two__item" ng-class="{\'active\':isActiveTab($index)}" ng-click="clickTab($index)">\n            <i class="{{item.iconClass}}"></i>\n            {{item.title}} ({{item.number}})\n            <a class="viewLink" att-link>Show</a>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/modal/window.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/modal/window.html",'<div tabindex="-1" role="dialog" att-element-focus="focusModalFlag" class="modals {{ windowClass }}" ng-class="{show: animate}" \n     ng-style="{\'z-index\': 2010 + index*10}"  ng-click="close($event)" ng-transclude>         \n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/pagination/pagination.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/pagination/pagination.html",'<div class="pager">\n    <a tabindex="0" href="javascript:void(0)" class="pager__item--prev" att-accessibility-click="13,32" ng-click="prev($event)" ng-if="currentPage > 1"><i class="icon-arrow-left"></i> Previous</a>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item pager__item--link" ng-if="totalPages > 7 && currentPage > 3" att-accessibility-click="13,32" ng-click="selectPage(1, $event)">1</a>\n    <span class="pager__item" ng-if="totalPages > 7 && currentPage > 3">...</span>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item pager__item--link" att-element-focus="isFocused(page)" ng-repeat="page in pages" ng-class="{\'pager__item--active\': checkSelectedPage(page)}" att-accessibility-click="13,32" ng-click="selectPage(page, $event)">{{page}}</a>\n    <span class="pager__item" ng-if="totalPages > 7 && currentPage < totalPages - 2 && showInput !== true">...</span>\n    <span ng-show="totalPages > 7 && showInput === true"><input class="pager__item--input" type="text" placeholder="..." maxlength="2" ng-model="currentPage" aria-label="Current page count"/></span>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item pager__item--link" ng-if="totalPages > 7 && currentPage < totalPages - 2" att-accessibility-click="13,32" ng-click="selectPage(totalPages, $event)">{{totalPages}}</a>\n    <a tabindex="0" href="javascript:void(0)" class="pager__item--next" att-accessibility-click="13,32" ng-click="next($event)" ng-if="currentPage < totalPages">Next <i class="icon-arrow-right"></i></a>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/paneSelector/innerPane.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/paneSelector/innerPane.html","<div class='inner-pane' ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/paneSelector/paneGroup.html","<div class='pane-group' ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/paneSelector/sidePane.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/paneSelector/sidePane.html","<div class='side-pane' ng-transclude></div>")}]),angular.module("app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tooltip/tooltip-popup.html","<div class=\"att-tooltip \" \n     ng-class=\"{ 'att-tooltip--on': isOpen, \n                'att-tooltip--dark att-tooltip--dark--hover':stylett=='dark', \n                'att-tooltip--light att-tooltip--light--hover':stylett=='light',\n                'att-tooltip--left':placement=='left', \n                'att-tooltip--above':placement=='above', \n                'att-tooltip--right':placement=='right', \n                'att-tooltip--below':placement=='below'}\" \n    ng-bind-html=\"content | unsafe\" ></div>")}]),angular.module("app/scripts/ng_js_att_tpls/popOvers/popOvers.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/popOvers/popOvers.html","<div class=\"att-popover popover-demo\" ng-style=\"{backgroundColor:popOverStyle}\"\n     ng-class=\"{'att-tooltip--dark':popOverStyle==='grey',\n                'att-pop-over--left':popOverPlacement==='left', \n                'att-pop-over--above':popOverPlacement==='above', \n                'att-pop-over--right':popOverPlacement==='right'}\" \n    style='position: absolute; max-width: 490px;'>\n    <div class=\"pop-over-caret\"\n         ng-class=\"{'pop-over-caret-border--left':popOverPlacement==='left', \n                'pop-over-caret-border--above':popOverPlacement==='above', \n                'pop-over-caret-border--right':popOverPlacement==='right', \n                'pop-over-caret-border--below':popOverPlacement==='below'}\">\n    </div>\n    <div class=\"pop-over-caret\" ng-style=\"popOverPlacement=='below' && {borderBottom:'6px solid ' +popOverStyle}||popOverPlacement=='left' && {borderLeft:'6px solid ' +popOverStyle}||popOverPlacement=='right' && {borderRight:'6px solid ' +popOverStyle}||popOverPlacement=='above' && {borderTop:'6px solid ' +popOverStyle}\"\n         ng-class=\"{'pop-over-caret--left':popOverPlacement==='left', \n                'pop-over-caret--above':popOverPlacement==='above', \n                'pop-over-caret--right':popOverPlacement==='right', \n                'pop-over-caret--below':popOverPlacement==='below'}\"></div>\n    \n    <div class=\"att-popover-content\">\n"+'	<a ng-if="closeable" href="javascript:void(0)" class="icon-close att-popover__close" ng-click="closeMe();$event.preventDefault()"></a>\n        <div class="popover-packages__container" ng-include="content"></div>\n    </div>\n</div>');
+}]),angular.module("app/scripts/ng_js_att_tpls/profileCard/addUser.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/profileCard/addUser.html",'<div  class="col-md-9 profile-card add-user">\n    <div class="atcenter">\n        <div><i class="icon-add"></i></div>\n        <span>add User</span>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/profileCard/profileCard.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/profileCard/profileCard.html",'<div class="col-md-9 profile-card">\n    <div class="top-block">\n       <div class="profile-image">\n            <img ng-if="image" profile-name="{{profile.name}}" ng-src="{{profile.img}}" alt="{{profile.name}}">\n            <span ng-hide="image" class="default-img">{{initials}}</span>\n            <p class="name" tooltip-condition="{{profile.name}}" height="true"></p>\n            <p class="status">\n                <span class="status-icon" ng-class="{\'icon-green\':colorIcon===\'green\',\'icon-red\':colorIcon===\'red\',\'icon-blue\':colorIcon===\'blue\',\'icon-yellow\':colorIcon===\'yellow\'}">   \n                </span>\n                <span>{{profile.state}}<span ng-if="badge" class="status-badge">Admin</span></span>\n            </p>\n        </div>\n    </div>\n    <div class="bottom-block">\n         <div class="profile-details">\n            <label>Username</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.userName}}">{{profile.userName}}</p>\n            <label>Email</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.email}}">{{profile.email}}</p>\n            <label>Role</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.role}}">{{profile.role}}</p>\n            <label>Last Login</label>\n            <p att-text-overflow="92%" tooltip-condition="{{profile.lastLogin}}">{{profile.lastLogin}}</p>\n         </div>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/progressBars/progressBars.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/progressBars/progressBars.html",'<div class="att-progress">\n    <div class="att-progress-value">&nbsp;</div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/scrollbar/scrollbar.html",'<div class="scroll-bar" style="position: absolute">\n    <div class="scroll-thumb" style="position: absolute; overflow: hidden"></div>\n</div>\n<div class="prev icons-list" data-size="medium" ng-show="navigation && prevAvailable" ng-style="{height: scrollbarAxis === \'x\' && position.height + \'px\'}">\n    <a href="javascript:void(0);" ng-click="customScroll(false)" aria-label="Scroll" aria-hidden="true">\n        <i ng-class="{\'icon-chevron-up\': (scrollbarAxis === \'y\'), \'icon-chevron-left\': (scrollbarAxis === \'x\')}"></i>\n    </a>\n</div>\n<div class="scroll-viewport" ng-style="{height: (scrollbarAxis === \'x\' && position.height + \'px\') || viewportHeight, width: viewportWidth}" style="position: relative; overflow: hidden">\n    <div class="scroll-overview" style="position: absolute; display: table; width: 100%" att-position="position" ng-transclude></div>\n</div>\n<div class=\'next icons-list\' data-size="medium" ng-show="navigation && nextAvailable" ng-style="{height: scrollbarAxis === \'x\' && position.height + \'px\'}">\n    <a href="javascript:void(0);" ng-click="customScroll(true)" aria-label="Scroll" aria-hidden="true">\n'+"        <i ng-class=\"{'icon-chevron-down': (scrollbarAxis === 'y'), 'icon-chevron-right': (scrollbarAxis === 'x')}\"></i>\n    </a>\n</div>\n")}]),angular.module("app/scripts/ng_js_att_tpls/search/search.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/search/search.html",'<div class="select2-container show-search" ng-class="{\'select2-dropdown-open\': (showlist && !isDisabled),\'select2-container-disabled\':isDisabled, \'select2-container-active\': isact}" ng-init="isact=false;" style="width: 100%;">\n    <a href="javascript:void(0)" class="select2-choice needsclick" tabindex="0" ng-click="showDropdown()" ng-class="{\'select2-chosen-disabled\':isDisabled}" role="combobox" aria-expanded="{{showlist}}" aria-owns="inList" aria-label="{{selectedOption}} selected" ng-focus="isact=true;" ng-blur="isact=false;">\n        <span class="select2-chosen needsclick" aria-hidden = "true">{{selectedOption}}</span>\n        <abbr class="select2-search-choice-close needsclick"></abbr>\n        <span class="select2-arrow needsclick" role="presentation">\n            <b role="presentation" class="needsclick"></b>\n        </span>\n    </a>    \n    <input class="select2-focusser select2-offscreen"            \n           tabindex="-1" \n           type="text" \n           aria-hidden="true" \n           title="hidden"           \n           aria-haspopup="true"           \n           role="button">    \n</div>\n\n<div class="select2-drop select2-with-searchbox select2-drop-auto-width select2-drop-active" ng-class="{\'select2-display-none\':(!showlist || isDisabled)}" style="width:100%;z-index: 10">\n    <div class="select2-search">\n        <label ng-if="!noFilter" class="select2-offscreen" aria-label="Inline Search Field" aria-hidden="true">Inline Search Field</label>\n        <input ng-if="!noFilter" ng-model="title" aria-label="title" typeahead="c.title for c in cName | filter:$viewValue:startsWith" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="select2-input" aria-autocomplete="list" placeholder="">\n    </div>\n    <ul id="inList" class="select2-results" role="listbox">\n        <li ng-show="filteredName.length === 0" class="select2-no-results" tabindex="-1">No matches found</li>\n        <li class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-show="selectMsg && filteredName.length > 0" ng-click="selectOption(selectMsg, \'-1\')" ng-class="{\'select2-result-current\': selectedOption === selectMsg, \'hovstyle\': selectedIndex === -1}" ng-mouseover="hoverIn(-1)" aria-label="{{selectMsg}}" tabindex="-1">\n            <div ng-if="startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n            <div ng-if="!startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li role="menuitem" ng-if="startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | startsWith:title:item)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)" aria-label="{{item.title}}" tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li role="menuitem" ng-if="!startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | filter:title)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)" aria-label="{{item.title}}" tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/select/select.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/select/select.html",'<div class="select2-container show-search" ng-class="{\'select2-dropdown-open\': (showlist && !isDisabled),\'select2-container-disabled\': isDisabled, \'select2-container-active\': isact}" ng-init="isact=false;">\n    <span class="select2-choice needsclick" tabindex="{{isDisabled ? -1 : 0}}" ng-click="showDropdown()" ng-class="{\'select2-chosen-disabled\':isDisabled}" role="combobox" aria-expanded="{{showlist}}" aria-owns="inList" aria-label="{{titleName}} dropdown {{selectedOption}} selected" ng-focus="isact=true;" ng-blur="isact=false;">\n        <span class="select2-chosen needsclick" aria-hidden="true" ng-bind-html="selectedOption | unsafe">{{selectedOption}}</span>\n        <abbr class="select2-search-choice-close needsclick"></abbr>\n        <span class="select2-arrow needsclick" role="presentation">\n            <b role="presentation" class="needsclick"></b>\n        </span>\n    </span>    \n    <input class="select2-focusser select2-offscreen"            \n           tabindex="-1" \n           type="text" \n           aria-hidden="true" \n           title="hidden"           \n           aria-haspopup="true"           \n           role="button">    \n</div>\n\n<div class="select2-drop select2-with-searchbox select2-drop-auto-width select2-drop-active" ng-class="{\'select2-display-none\':(!showlist || isDisabled)}" style="width:100%;z-index: 10">\n    <div class="select2-search">\n        <label ng-if="!noFilter" class="select2-offscreen" aria-label="Inline Search Field" aria-hidden="true">Inline Search Field</label>\n        <input ng-if="!noFilter" ng-model="title" aria-label="title" typeahead="c.title for c in cName | filter:$viewValue:startsWith" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="select2-input" aria-autocomplete="list" placeholder="">\n    </div>\n    <ul id="inList" class="select2-results" role="listbox">\n        <li ng-if="!noFilter" ng-show="filteredName.length === 0" class="select2-no-results" tabindex="-1">No matches found</li>\n        <li ng-if="!noFilter" class="select2-results-dept-0 select2-result select2-result-selectable" role="presentation" ng-model="ListType" ng-show="selectMsg && filteredName.length > 0" ng-click="selectOption(selectMsg, \'-1\')" ng-class="{\'select2-result-current\': selectedOption === selectMsg, \'hovstyle\': selectedIndex === -1}" ng-mouseover="hoverIn(-1)" aria-label="{{selectMsg}}" tabindex="-1">\n            <div ng-if="startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n            <div ng-if="!startsWithFilter" class="select2-result-label" ng-bind-html="selectMsg | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li  role="menuitem"  ng-if="startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | startsWith:title:item)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)"  tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n\n        <li role="menuitem" ng-if="!startsWithFilter" class="select2-results-dept-0 select2-result select2-result-selectable" ng-model="ListType" ng-repeat="(fIndex, item) in filteredName = (cName | filter:title)" ng-class="{\'select2-result-current\': selectedOption === item.title,\'hovstyle\': selectedIndex === item.index,\'disable\': item.disabled}" ng-click="item.disabled || selectOption(item.title,item.index)" ng-mouseover="hoverIn(item.index)"  tabindex="-1">\n            <div class="select2-result-label" ng-bind-html="item.title | highlight:title:className | unsafe" role="option">\n                <span class="select2-match"></span>\n            </div>\n        </li>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/select/textDropdown.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/select/textDropdown.html",'<div tabindex="0" class="text-dropdown">\n	<div class="dropdown" ng-class="{\'not-visible\': isActionsShown}" ng-click="toggle()">\n		<span class="action--selected" ng-bind="currentAction"></span>\n		<i ng-class="isActionsShown ? \'icon-dropdown-up\' : \'icon-dropdown-down\'"></i>\n	</div>\n	<ul ng-class="isActionsShown ? \'actionsOpened\' : \'actionsClosed\'" ng-show="isActionsShown">\n		<li ng-class="{\'highlight\': selectedIndex==$index}" ng-repeat="action in actions track by $index" ng-click="chooseAction($event, action, $index)" ng-mouseover="hoverIn($index)">{{action}}<i ng-class="{\'icon-included-checkmark\': isCurrentAction(action)}" att-accessibility-click="13,32"></i></li>\n	</ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/slider/maxContent.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/slider/maxContent.html",'<div class="att-slider__label att-slider__label--max att-slider__label--below" ng-transclude></div>')}]),angular.module("app/scripts/ng_js_att_tpls/slider/minContent.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/slider/minContent.html",'<div class="att-slider__label att-slider__label--min att-slider__label--below" ng-transclude></div>')}]),angular.module("app/scripts/ng_js_att_tpls/slider/slider.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/slider/slider.html",'<div class="att-slider" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)">\n    <div class="att-slider__track">\n        <div class="att-slider__range att-slider__range--disabled" ng-style="disabledStyle"></div>\n        <div class="att-slider__range" ng-style="rangeStyle"></div>\n    </div>\n    <div class="att-slider__handles-container">\n       <div role="menuitem" aria-label="{{ngModelSingle}}" class="att-slider__handle" ng-style="handleStyle" ng-mousedown="mouseDown($event,\'ngModelSingle\')" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)" tabindex="0" ng-keydown="keyDown($event,\'ngModelSingle\')"></div>\n       <div role="menuitem" aria-label="Minimum Value- {{ngModelLow}}" class="att-slider__handle" ng-style="minHandleStyle" ng-mousedown="mouseDown($event,\'ngModelLow\')" ng-focus="focus($event,\'ngModelLow\')" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)" tabindex="0" ng-keyup="keyUp($event,\'ngModelLow\')" ng-keydown="keyDown($event,\'ngModelLow\')"></div>\n       <div role="menuitem" aria-label="Maximum Value- {{ngModelHigh}}" class="att-slider__handle" ng-style="maxHandleStyle" ng-mousedown="mouseDown($event,\'ngModelHigh\')" ng-focus="focus($event,\'ngModelHigh\')" ng-mousemove="moveElem($event)" ng-mouseup="mouseUp($event)" tabindex="0" ng-keyup="keyUp($event,\'ngModelHigh\')" ng-keydown="keyDown($event,\'ngModelHigh\')"></div>\n    </div>\n    <div ng-transclude></div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdown.html",'<div class=" btn-group" \n     ng-class="{\'buttons-dropdown--large\':!isSmall, \n                 \'buttons-dropdown--small\':isSmall, \n                 \'action-dropdown\':(isActionDropdown), \n                 \'open\':isDropDownOpen}">\n    <a tabindex="0" href="javascript:void(0)" class="button btn buttons-dropdown__split" \n       ng-class="{\'button--primary\':(btnType==undefined || btnType==\'primary\'), \n                   \'button--secondary\':btnType==\'secondary\', \n                   \'button--disabled\':btnType==\'disabled\', \n                   \'button--small\':isSmall}" \n       ng-if="!isActionDropdown"\n       ng-click="btnType===\'disabled\'?undefined:clickFxn()" att-accessibility-click="13,32">{{btnText}}</a>\n    <a tabindex="0" href="javascript:void(0)" role="button" aria-label="Toggle Dropdown" aria-haspopup="true" class="button buttons-dropdown__drop dropdown-toggle" \n       ng-class="{\'button--primary\':(btnType==undefined || btnType==\'primary\'), \n               \'button--secondary\':btnType==\'secondary\', \n               \'button--disabled\':btnType==\'disabled\', \n               \'button--small\':isSmall}" ng-click="toggleDropdown()" att-accessibility-click="13,32">{{toggleTitle}} </a>\n    <ul class="dropdown-menu" ng-class="{\'align-right\':multiselect ===true}" aria-expanded="{{isDropDownOpen}}" ng-click="hideDropdown()" role="menu" ng-transclude></ul>\n</div>  ')}]),angular.module("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/splitButtonDropdown/splitButtonDropdownItem.html",'<li role="menuitem" att-element-focus="sFlag" tabindex="0" ng-transclude></li>')}]),angular.module("app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/splitIconButton/splitIcon.html","<div class='split-icon-button-container'>\n\n	<div class='split-icon-button' ng-class=\"{'icon-with-chevron': isRight && !isMiddle && !isLeftNextDropdown && !isNextToDropDown, 'split-icon-button-middle':isMiddle, 'split-icon-button-right':isRight, 'split-icon-button-left':isLeft, 'split-icon-button-left-dropdown': isLeftNextDropdown ,'split-icon-button-next-dropdown': isNextToDropDown,'split-icon-button-dropdown': isDropDownOpen,'split-icon-button-hover':isIconHovered || isDropDownOpen}\" ng-mouseover='isIconHovered = true;' ng-mouseleave='isIconHovered = false;' tabindex=\"-1\" att-accessibility-click=\"13,32\" ng-click='dropDownClicked();'>\n	        <a class='{{icon}}' title='{{iconTitle}}' tabindex=\"0\"></a>\n	        <i ng-if=\"isRight && !isMiddle && !isLeftNextDropdown && !isNextToDropDown\" \n	        	ng-class=\"isDropDownOpen ? 'icon-dropdown-up' : 'icon-dropdown-down'\"> </i>\n	</div> \n\n	 <ul ng-if='isDropdown' class='dropdown-menu {{dropDownId}}' ng-show='\n	 isDropDownOpen' ng-click='toggleDropdown(false)' role=\"presentation\" ng-transclude>\n	 </ul>\n\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButton.html","<div>\n	<div ng-if='isLeftLineShown' dir-type='{{iconStateConstants.DIR_TYPE.LEFT}}' expandable-line></div>\n	<div ng-click='clickHandler()' att-split-icon icon='{{icon}}' title='{{title}}' dir-type='{{iconStateConstants.DIR_TYPE.BUTTON}}' hover-watch='isHovered' drop-down-watch='dropDownWatch' drop-down-id='{{dropDownId}}'>\n		<div ng-transclude>\n		</div>\n	</div>\n	<div ng-if='isRightLineShown' dir-type='{{iconStateConstants.DIR_TYPE.RIGHT}}' expandable-line></div>\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/splitIconButton/splitIconButtonGroup.html","<div ng-transclude>\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/stepSlider/attStepSlider.html",'<span ng-class="mainSliderClass">\n    <table>\n        <tr>\n            <td>\n                <div class="jslider-bg">\n                    <i class="l"></i>\n                    <i class="r"></i>\n                    <i class="v" ng-class="{\'step-slider-green\':sliderColor == COLORS.GREEN, \'step-slider-blue\': sliderColor == COLORS.BLUE_HIGHLIGHT, \'step-slider-magenta\': sliderColor == COLORS.MAGENTA, \'step-slider-gold\': sliderColor == COLORS.GOLD, \'step-slider-purple\': sliderColor == COLORS.PURPLE, \'step-slider-dark-blue\': sliderColor == COLORS.DARK_BLUE, \'step-slider-regular\': sliderColor == COLORS.REGULAR, \'step-slider-white\': sliderColor == COLORS.WHITE, \'cutoff-slider\': isCutOffSlider}"></i>\n                </div>\n                <div class="jslider-pointer" id="left-pointer"></div>\n                <div class="jslider-pointer jslider-pointer-to" ng-class="{\'step-slider-green\':sliderColor == COLORS.GREEN, \'step-slider-blue\': sliderColor == COLORS.BLUE_HIGHLIGHT, \'step-slider-magenta\': sliderColor == COLORS.MAGENTA, \'step-slider-gold\': sliderColor == COLORS.GOLD, \'step-slider-purple\': sliderColor == COLORS.PURPLE, \'step-slider-dark-blue\': sliderColor == COLORS.DARK_BLUE, \'step-slider-regular\': sliderColor == COLORS.REGULAR, \'step-slider-white\':sliderColor == COLORS.WHITE ,\'cutoff-slider\': isCutOffSlider}"></div>\n                <div class="jslider-label"><span ng-bind="from"></span><span ng-bind="options.dimension"></span></div>\n                <div class="jslider-label jslider-label-to"><span ng-bind="toStr"></span><span ng-bind="endDimension"></span></div>\n                <div class="jslider-value" id="jslider-value-left"><span></span>{{options.dimension}}</div>\n                <div class="jslider-value jslider-value-to"><span></span>{{toolTipDimension}}</div>\n                <div class="jslider-scale" ng-class="{\'show-dividers\': showDividers, \'cutoff-slider-dividers\':isCutOffSlider}">\n                </div>\n                <div class="jslider-cutoff">\n                    <div class="jslider-label jslider-label-cutoff">\n                        <span ng-bind="cutOffVal"></span>\n                    </div>\n                </div>\n            </td>\n        </tr>\n    </table>\n</span>\n')}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/step-tracker.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/steptracker/step-tracker.html",'<div class="steptracker1">\n    <div class="steptracker-bg">\n        <div tabindex="0" ng-click="stepclick($event, $index);" att-accessibility-click="13,23" class="steptracker-track size-onethird" ng-repeat="step in sdata"\n             ng-style="set_width($index)"\n             ng-class="{\'last\':laststep($index),\'done\':donesteps($index),\'active\':activestep($index), \'incomplete\': isIncomplete($index), \'disabled\': disableClick}">\n            <div class="circle">{{($index) + 1}}<span>{{step.title}}</span></div>\n            <div ng-if="!laststep($index)" class="track"></div>\n        </div>\n    </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/step.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/steptracker/step.html",'<div class="steptracker1">\n    <div class="steptracker-bg">\n        <div class="steptracker-track size-onethird" \n             ng-class="{\'last\':laststep($index),\'done\':donesteps($index),\'active\':activestep($index)}">\n            <div class="circle" tabindex="0" \n                 ng-click="stepclick($event, $index);" \n                 att-accessibility-click="13,23">{{($index) + 1}}<span>{{step.title}}</span></div>\n            <div ng-if="!laststep($index)" class="track"></div>\n        </div>\n    </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/timeline.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/steptracker/timeline.html","<div class='att-timeline'>\n	<div timeline-dot order='0' title='{{steps[0].title}}' description='{{steps[0].description}}' by='{{steps[0].by}}' date='{{steps[0].date}}' type='{{steps[0].type}}'></div>\n\n	<div ng-repeat=\"m in middleSteps track by $index\">\n		<div timeline-bar order='{{$index}}'></div>\n		<div timeline-dot order='{{$index + 1}}' title='{{m.title}}' description='{{m.description}}' by='{{m.by}}' date='{{m.date}}' type='{{m.type}}'>\n		</div>\n	</div>\n\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/timelineBar.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/steptracker/timelineBar.html","<div class='timeline-bar'>\n	<div class='progress-bar' ng-class=\"{'completed-color':isCompleted,'cancelled-color':isCancelled,'alert-color':isAlert}\">\n	</div>\n	<hr></hr>\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/steptracker/timelineDot.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/steptracker/timelineDot.html","<div class='timeline-dot'>\n\n	<div class='bigger-circle' ng-class=\"{'completed-color':isCompleted,'cancelled-color':isCancelled,'alert-color':isAlert}\">\n	</div>\n\n	<div class='inactive-circle'>\n	</div>\n\n	<div class='expandable-circle' ng-class=\"{'completed-color':isCompleted,'cancelled-color':isCancelled,'alert-color':isAlert}\">\n	</div>\n\n	<div ng-class=\"{'below-info-box':isBelowInfoBoxShown, 'above-info-box': !isBelowInfoBoxShown}\" tabindex=\"0\">\n		\n		<div ng-if='isBelowInfoBoxShown' class='vertical-line'>\n		</div>\n\n		<div class='info-container' ng-init='isContentShown=false'>\n			<div ng-class=\"{'current-step-title':isCurrentStep, 'title':!isCurrentStep,'completed-color-text':isCompleted,'cancelled-color-text':isCancelled,'alert-color-text':isAlert, 'inactive-color-text':isInactive}\" ng-mouseover='titleMouseover(1)' ng-mouseleave='titleMouseleave()' ng-bind='title' ></div>\n			<div class='content'>\n				<div class='description' ng-bind='description'></div>\n				<div class='submitter' ng-bind='by'></div>\n			</div>\n			<div class='date' ng-mouseover='titleMouseover(2)' ng-mouseleave='titleMouseleave()' ng-bind='date'></div>\n		</div>\n\n		<div ng-if='!isBelowInfoBoxShown' class='vertical-line'>\n		</div>\n	</div>\n\n</div>")}]),angular.module("app/scripts/ng_js_att_tpls/table/attTable.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/table/attTable.html",'<table class="tablesorter tablesorter-default" ng-transclude></table>\n')}]),angular.module("app/scripts/ng_js_att_tpls/table/attTableBody.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/table/attTableBody.html","<td ng-transclude></td>\n")}]),angular.module("app/scripts/ng_js_att_tpls/table/attTableHeader.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/table/attTableHeader.html","<th role=\"columnheader\" scope=\"col\" aria-live=\"polite\" aria-sort=\"{{sortPattern !== 'null' && '' || sortPattern}}\" aria-label=\"{{headerName}} {{sortable !== 'false' && ': activate to sort' || ' '}} {{sortPattern !== 'null' && '' || sortPattern}}\" tabindex=\"{{sortable !== 'false' && '0' || '-1'}}\" class=\"tablesorter-header\" ng-class=\"{'tablesorter-headerAsc': sortPattern === 'ascending', 'tablesorter-headerDesc': sortPattern === 'descending', 'tablesort-sortable': sortable !== 'false', 'sorter-false': sortable === 'false'}\" att-accessibility-click=\"13,32\" ng-click=\"(sortable !== 'false') && sort();\"><div class=\"tablesorter-header-inner\" ng-transclude></div></th>")}]),angular.module("app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tableMessages/attTableMessage.html",'<div class="att-table-message">\n   <div class="message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.noMatching">\n      <div class="img-magnify-glass"></div> \n      <div>\n         <div ng-transclude></div>\n      </div>\n   </div>\n   <div class="message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.errorLoading">\n      <div class="img-oops-exclamation" tabindex="0" aria-label="Oops! The information could not load at this time. Please click link to refresh the page."></div> \n      <div>Oops!</div>\n      <div>The information could not load at this time.</div>\n      <div>Please <a href="javascript:void(0)" ng-click="refreshAction($event)">refresh the page</a>\n      </div>\n   </div>\n   <div class="message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.magnifySearch">\n      <div class="img-magnify-glass"></div>\n      <div>\n         <p class="title" tabindex="0">Please input values to <br/> begin your search.</p>\n      </div>\n   </div>\n   <div class="message loading-message" ng-if="msgType==messageConstants.TABLE_MESSAGE_TYPES.isLoading">\n      <div class="img-loading-dots"></div>\n      <div ng-transclude></div>\n   </div>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tableMessages/attUserMessage.html",'<div class="att-user-message">\n  <div ng-class="type==messageConstants.USER_MESSAGE_TYPES.error && trigger ? \'message-wrapper-error\' : \'hidden\'">\n      <div class="message-icon-error"> <i class="icon-info-alert"></i> </div>\n\n      <div class="message-body-wrapper">\n        <div class="message-title-error" ng-if="thetitle && thetitle.length > 0"> <span ng-bind="thetitle" tabindex="0" aria-label="{{thetitle}}"></span> </div>\n        <div class="message-msg" ng-bind="message" ng-if="message && message.length > 0" tabindex="0"></div>\n        <div class="message-bottom">\n           <div ng-transclude></div>\n        </div>\n      </div>\n\n   </div>\n  <div ng-class="type==messageConstants.USER_MESSAGE_TYPES.success && trigger ? \'message-wrapper-success\' : \'hidden\'">\n      <div class="message-icon-success"> <i class="icon-included-checkmark"></i></div>\n\n      <div class="message-body-wrapper">\n        <div class="message-title-success" ng-if="thetitle && thetitle.length > 0" >\n          <span ng-bind="thetitle" tabindex="0" aria-label="{{thetitle}}"></span>\n        </div>\n        <div class="message-msg" ng-bind="message" ng-if="message && message.length > 0" tabindex="0"></div>\n        <div class="message-bottom">\n           <div ng-transclude></div>\n        </div>\n      </div>\n\n   </div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/floatingTabs.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tabs/floatingTabs.html","<ul ng-class=\"{'tabsbid': size === 'large', 'tabsbid--small': size === 'small'}\">\n <li ng-repeat=\"tab in tabs\" ng-class=\"{'tabsbid__item tabsbid__item--active': isActiveTab(tab.url), 'tabsbid__item': !isActiveTab(tab.url)}\" ng-click=\"onClickTab(tab)\">\n"+'        <a class="tabsbid__item-link" href="{{tab.url}}" tabindex="0" att-accessibility-click="32,13">{{tab.title}}</a>\n  </li>\n</ul>')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/genericTabs.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tabs/genericTabs.html","<ul ng-class=\"{'tabsbid': size === 'large', 'tabsbid--small': size === 'small'}\">\n    <li ng-repeat=\"tab in tabs\" ng-class=\"{'tabsbid__item tabsbid__item--active': isActive(tab.id), 'tabsbid__item': !isActive(tab.id),'tabs__item--active': isActive(tab.id)}\" ng-click=\"clickTab(tab)\">\n"+'		<a class="tabsbid__item-link" href="{{tab.url}}" tabindex="0" att-accessibility-click="32,13">{{tab.title}}</a>\n    </li>\n</ul>\n')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/menuTab.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tabs/menuTab.html",'<li class="megamenu__item" ng-mouseover="showHoverChild($event)" ng-class="{\'tabs__item--active\': menuItem.active==true && !hoverChild==true}">\n    <span role="menuitem" att-accessibility-click="13,32" tabindex="0" ng-click="showChildren($event);!clickInactive||resetMenu($event)">{{tabName}}</span>\n    <div ng-transclude></div>\n</li>\n');
+}]),angular.module("app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tabs/parentmenuTab.html",'<div ng-class="{\'megamenu-tabs\': megaMenu,\'submenu-tabs\': !megaMenu}">\n    <ul class="megamenu__items" role="presentation" ng-transclude>\n    </ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tabs/simplifiedTabs.html",'<div class="simplified-tabs">\n<ul class="simplified-tabs__items" role="tablist">\n    <li ng-repeat="tab in tabs" role="tab" class="simplified-tabs__item" ng-class="{\'tabs__item--active\': isActive(tab.id)}" ng-click="clickTab(tab)" tabindex="0" att-accessibility-click="32,13">{{tab.title}}</li>\n    <li class="tabs__pointer"></li>\n</ul>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/tabs/submenuTab.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tabs/submenuTab.html",'<li class="tabsbid__item megamenu__item" ng-class="{\'subMenuHover\': menuItem.active==true}">\n<a ng-href="{{tabUrl}}" role="menuitem" ng-if="subMenu === true" ng-mouseover="!subMenu || showChildren($event)" ng-focus="!subMenu ||showChildren($event)" tabindex="{{subMenu==\'true\'?0:-1}}" ng-click="!subMenu ||showMenuClick($event) ; subMenu ||showSubMenuClick($event)" att-accessibility-click="13,32">{{tabName}}</a>\n<a  ng-href="{{tabUrl}}" role="menuitem" ng-if="!menuItem.leafNode && subMenu !== true" ng-mouseover="!subMenu || showChildren($event)" ng-focus="!subMenu ||showChildren($event)" tabindex="{{subMenu==\'true\'?0:-1}}" ng-click="!subMenu ||showMenuClick($event) ; subMenu ||showSubMenuClick($event)" att-accessibility-click="13,32">{{tabName}}</a>\n<span ng-transclude></span>\n</li>\n')}]),angular.module("app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/tagBadges/tagBadges.html","<div class=\"tags__item\" \n     ng-class=\"{'tags__item--small':isSmall, \n                 'tags__item--color':isColor, \n                 'tags__item--cloud':!isClosable && !isColor,'active':applyActiveClass}\"\n     ng-if=\"display\" \n     ng-style=\"{borderColor: border_type_borderColor, background: isHighlight?'#bbb':undefined, color: isHighlight?'#444':undefined }\"\n"+'     ng-mousedown="activeHighlight(true)" role="presentation" ng-mouseup="activeHighlight(false)">\n    <i class="icon-filter tags__item--icon" ng-if="isIcon">&nbsp;</i>\n    <i class="tags__item--color-icon" ng-if="isColor" ng-style="{backgroundColor: background_type_backgroundColor, borderColor: background_type_borderColor}"></i>\n    <span class="tags__item--title" role="presentation"  tabindex=0  ng-mousedown="activeHighlight(true)" ng-mouseup="activeHighlight(false)" ng-transclude></span>\n    <a href="javascript:void(0)" title="Dismiss Link" class="tags__item--action" ng-click="closeMe();$event.preventDefault()" ng-if="isClosable"\n       ng-style="{color: (isHighlight && \'#444\') || \'#888\' , borderLeft: (isHighlight && \'1px solid #444\')|| \'1px solid #888\' }">\n        <i class="icon-erase">&nbsp;</i>\n    </a>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/toggle/demoToggle.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/toggle/demoToggle.html",'<span ng-transclude></span>\n<div class="att-switch-content" hm-drag = "drag($event)" att-accessibility-click="13,32" ng-click="updateModel($event)" hm-dragstart="alert(\'hello\')" hm-dragend="drag($event)" ng-class="{\'large\' : directiveValue == \'large\'}"  style="-webkit-user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);">\n    <div class="att-switch-onText" ng-style="" ng-class="{\'icon-included-checkmark ico\' : on === undefined,\'large\' : directiveValue == \'large\'}">{{on}}<span class="hidden-spoken">{{directiveValue}} when checked.</span></div>\n    <div class="att-switch-thumb" tabindex="0" title="Toggle switch" role="checkbox"  ng-class="{\'large\' : directiveValue == \'large\'}"></div>\n    <div class="att-switch-offText" ng-class="{\'icon-erase ico\' : on === undefined,\'large\' : directiveValue == \'large\'}">{{off}}<span class="hidden-spoken">{{directiveValue}} when unchecked.</span></div>\n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/typeAhead/typeAhead.html",'<div class="typeahead mainContainerOuter">\n    <span class="message">To</span>\n    <div class=\'maincontainer\' ng-click="setFocus()" ng-focus="inputActive=true" ng-class ="{\'typeahed_active\':inputActive || (lineItems.length && inputActive)}">\n        <span tag-badges closable ng-repeat ="lineItem in lineItems track by $index" on-close="theMethodToBeCalled($index)" >{{lineItem}}</span>\n        <input type="text"  focus-me="clickFocus" ng-focus="inputActive=true" ng-model="model" ng-keydown="selected = false; selectionIndex($event)"/><br/> \n    </div>\n    <div ng-hide="!model.length || selected">\n        <div class="filtercontainer list-scrollable" ng-show="( items | filter:model).length">\n            <div  class="item" ng-repeat="item in items| filter:model track by $index"  ng-click="handleSelection(item[titleName],item[subtitle])" att-accessibility-click="13,32" ng-class="{active:isCurrent($index,item[titleName],item[subtitle],( items | filter:model).length)}"ng-mouseenter="setCurrent($index)">\n                <span class="title" >{{item[titleName]}}</span>\n                <span class="subtitle">{{item[subtitle]}}</span>\n            </div>  \n        </div>\n    </div>\n   \n    <div class="textAreaEmailContentDiv">\n        <span class="message">Message</span>\n        <textarea rows="4" cols="50" role="textarea" class="textAreaEmailContent" ng-model="emailMessage">To send \n a text, picture, or video message1 to an AT&T wireless device from your email:my message.</textarea>\n        \n    </div>\n    \n</div>\n')}]),angular.module("app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/verticalSteptracker/vertical-step-tracker.html","<li>\n    <i ng-class=\"{'icon-tickets-active' : type == 'actual' && id =='Active','icon-tickets-referred' : type == 'actual' && id =='Requested Closed','icon-ticket-regular' : type == 'progress' && id =='In Progress','icon-tickets-contested' : type == 'actual' && id =='Contested','icon-tickets-returned' : type == 'actual' && id =='Deferred','icon-tickets-closed' : type == 'actual' && id =='Ready to Close','icon-tickets-cleared' : type == 'actual' && id =='Cleared'}\"></i>\n    <span ng-transclude></span>\n</li>\n        \n")}]),angular.module("app/scripts/ng_js_att_tpls/videoControls/photoControls.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/videoControls/photoControls.html",'<div>\n    <a title="{{links.prevLink}}" aria-label="Previous Link"  ng-href="{{links.prevLink}}"><i alt="previous" class="icon-arrow-left">&nbsp;</i></a>\n    <span ng-transclude></span>\n    <a title="{{links.nextLink}}" aria-label="Next Link"  ng-href="{{links.nextLink}}"><i alt="next" class="icon-arrow-right">&nbsp;</i></a>\n</div>')}]),angular.module("app/scripts/ng_js_att_tpls/videoControls/videoControls.html",[]).run(["$templateCache",function(e){e.put("app/scripts/ng_js_att_tpls/videoControls/videoControls.html",'<div class="video-player">\n    <div class="video-player__control video-player__play-button">\n        <a class="video-player__button gigant-play" data-toggle-buttons="icon-play, icon-pause" data-target="i"><i class="icon-play"  alt="Play/Pause Button"></i></a>\n    </div>\n    <div class="video-player__control video-player__track">\n\n        <div class="video-player__track--inner">\n            <div class="video-player__track--loaded" style="width: 75%"></div>\n            <div class="video-player__track--played" style="width: 40%">\n                <div class="att-tooltip att-tooltip--on att-tooltip--dark att-tooltip--above video-player__track-tooltip" ng-transclude></div>\n                <div class="video-player__track-handle"></div>\n            </div>\n        </div>\n    </div>\n    <a class="video-player__time" ng-transclude></a>\n    <div class="video-player__control video-player__volume_icon">\n        <a class="video-player__button" data-toggle-buttons="icon-volume-mute, icon-volume-up" data-target="i"><i class="icon-volume-up" alt="Volume Button"></i></a>\n    </div>\n    <ul class="video-player__control video-player__volume">\n        <li class="video-player__volume-bar video-player__volume-bar--full">&nbsp;</li>\n        <li class="video-player__volume-bar video-player__volume-bar--full">&nbsp;</li>\n        <li class="video-player__volume-bar">&nbsp;</li>\n        <li class="video-player__volume-bar">&nbsp;</li>\n        <li class="video-player__volume-bar">&nbsp;</li>\n    </ul>\n    <div class="video-player__control video-player__toggle-fullscreen-button">\n        <a class="video-player__button" data-toggle-buttons="icon-full-screen, icon-normal-screen" data-target="i"><i class="icon-full-screen" alt="Full Screen Button">&nbsp;</i></a>\n    </div>\n</div>')}]),{}}(angular,window);
\ No newline at end of file
