“version”:3,“sources”:[“module.js”,“affix/affix.js”,“alert/alert.js”,“aside/aside.js”,“button/button.js”,“collapse/collapse.js”,“datepicker/datepicker.js”,“dropdown/dropdown.js”,“helpers/date-formatter.js”,“helpers/date-parser.js”,“helpers/debounce.js”,“helpers/dimensions.js”,“helpers/parse-options.js”,“helpers/raf.js”,“modal/modal.js”,“navbar/navbar.js”,“popover/popover.js”,“select/select.js”,“tab/tab.js”,“scrollspy/scrollspy.js”,“timepicker/timepicker.js”,“tooltip/tooltip.js”,“typeahead/typeahead.js”],“names”:[],“mappings”:“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”,“file”:“angular-strap.min.js”,“sourcesContent”:[“nangular.module(‘mgcrea.ngStrap’, [n ‘mgcrea.ngStrap.modal’,n ‘mgcrea.ngStrap.aside’,n ‘mgcrea.ngStrap.alert’,n ‘mgcrea.ngStrap.button’,n ‘mgcrea.ngStrap.select’,n ‘mgcrea.ngStrap.datepicker’,n ‘mgcrea.ngStrap.timepicker’,n ‘mgcrea.ngStrap.navbar’,n ‘mgcrea.ngStrap.tooltip’,n ‘mgcrea.ngStrap.popover’,n ‘mgcrea.ngStrap.dropdown’,n ‘mgcrea.ngStrap.typeahead’,n ‘mgcrea.ngStrap.scrollspy’,n ‘mgcrea.ngStrap.affix’,n ‘mgcrea.ngStrap.tab’,n ‘mgcrea.ngStrap.collapse’n]);n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.affix’, [‘mgcrea.ngStrap.helpers.dimensions’, ‘mgcrea.ngStrap.helpers.debounce’])nn .provider(‘$affix’, function() {nn var defaults = this.defaults = {n offsetTop: ‘auto’n };nn this.$get = function($window, debounce, dimensions) {nn var bodyEl = angular.element($window.document.body);n var windowEl = angular.element($window);nn function AffixFactory(element, config) {nn var $affix = {};nn // Common varsn var options = angular.extend({}, defaults, config);n var targetEl = options.target;nn // Initial private varsn var reset = ‘affix affix-top affix-bottom’,n setWidth = false,n initialAffixTop = 0,n initialOffsetTop = 0,n offsetTop = 0,n offsetBottom = 0,n affixed = null,n unpin = null;nn var parent = element.parent();n // Options: custom parentn if (options.offsetParent) {n if (options.offsetParent.match(/^\d+$/)) {n for (var i = 0; i < (options.offsetParent * 1) - 1; i++) {\n parent = parent.parent();\n }\n }\n else {\n parent = angular.element(options.offsetParent);\n }\n }\n\n $affix.init = function() {\n\n this.$parseOffsets();\n initialOffsetTop = dimensions.offset(element[0]).top + initialAffixTop;\n setWidth = !element[0].style.width;\n\n // Bind events\n targetEl.on('scroll', this.checkPosition);\n targetEl.on('click', this.checkPositionWithEventLoop);\n windowEl.on('resize', this.$debouncedOnResize);\n\n // Both of these checkPosition() calls are necessary for the case where\n // the user hits refresh after scrolling to the bottom of the page.\n this.checkPosition();\n this.checkPositionWithEventLoop();\n\n };\n\n $affix.destroy = function() {\n\n // Unbind events\n targetEl.off('scroll', this.checkPosition);\n targetEl.off('click', this.checkPositionWithEventLoop);\n windowEl.off('resize', this.$debouncedOnResize);\n\n };\n\n $affix.checkPositionWithEventLoop = function() {\n\n // IE 9 throws an error if we use 'this' instead of '$affix'\n // in this setTimeout call\n setTimeout($affix.checkPosition, 1);\n\n };\n\n $affix.checkPosition = function() {\n // if (!this.$element.is(':visible')) return\n\n var scrollTop = getScrollTop();\n var position = dimensions.offset(element[0]);\n var elementHeight = dimensions.height(element[0]);\n\n // Get required affix class according to position\n var affix = getRequiredAffixClass(unpin, position, elementHeight);\n\n // Did affix status changed this last check?\n if(affixed === affix) return;\n affixed = affix;\n\n // Add proper affix class\n element.removeClass(reset).addClass('affix' + ((affix !== 'middle') ? '-' + affix : ''));\n\n if(affix === 'top') {\n unpin = null;\n element.css('position', (options.offsetParent) ? '' : 'relative');\n if(setWidth) {\n element.css('width', '');\n }\n element.css('top', '');\n } else if(affix === 'bottom') {\n if (options.offsetUnpin) {\n unpin = -(options.offsetUnpin * 1);\n }\n else {\n // Calculate unpin threshold when affixed to bottom.\n // Hopefully the browser scrolls pixel by pixel.\n unpin = position.top - scrollTop;\n }\n if(setWidth) {\n element.css('width', '');\n }\n element.css('position', (options.offsetParent) ? '' : 'relative');\n element.css('top', (options.offsetParent) ? '' : ((bodyEl[0].offsetHeight - offsetBottom - elementHeight - initialOffsetTop) + 'px'));\n } else { // affix === 'middle'\n unpin = null;\n if(setWidth) {\n element.css('width', element[0].offsetWidth + 'px');\n }\n element.css('position', 'fixed');\n element.css('top', initialAffixTop + 'px');\n }\n\n };\n\n $affix.$onResize = function() {\n $affix.$parseOffsets();\n $affix.checkPosition();\n };\n $affix.$debouncedOnResize = debounce($affix.$onResize, 50);\n\n $affix.$parseOffsets = function() {\n var initialPosition = element.css('position');\n // Reset position to calculate correct offsetTop\n element.css('position', (options.offsetParent) ? '' : 'relative');\n\n if(options.offsetTop) {\n if(options.offsetTop === 'auto') {\n options.offsetTop = '+0';\n }\n if(options.offsetTop.match(/^[-+]\\d+$/)) {\n initialAffixTop = - options.offsetTop * 1;\n if(options.offsetParent) {\n offsetTop = dimensions.offset(parent[0]).top + (options.offsetTop * 1);\n }\n else {\n offsetTop = dimensions.offset(element[0]).top - dimensions.css(element[0], 'marginTop', true) + (options.offsetTop * 1);\n }\n }\n else {\n offsetTop = options.offsetTop * 1;\n }\n }\n\n if(options.offsetBottom) {\n if(options.offsetParent && options.offsetBottom.match(/^[-+]\\d+$/)) {\n // add 1 pixel due to rounding problems...\n offsetBottom = getScrollHeight() - (dimensions.offset(parent[0]).top + dimensions.height(parent[0])) + (options.offsetBottom * 1) + 1;\n }\n else {\n offsetBottom = options.offsetBottom * 1;\n }\n }\n\n // Bring back the element's position after calculations\n element.css('position', initialPosition);\n };\n\n // Private methods\n\n function getRequiredAffixClass(unpin, position, elementHeight) {\n\n var scrollTop = getScrollTop();\n var scrollHeight = getScrollHeight();\n\n if(scrollTop <= offsetTop) {\n return 'top';\n } else if(unpin !== null && (scrollTop + unpin <= position.top)) {\n return 'middle';\n } else if(offsetBottom !== null && (position.top + elementHeight + initialAffixTop >= scrollHeight - offsetBottom)) {n return ‘bottom’;n } else {n return ‘middle’;n }nn }nn function getScrollTop() {n return targetEl[0] === $window ? $window.pageYOffset : targetEl[0].scrollTop;n }nn function getScrollHeight() {n return targetEl[0] === $window ? $window.document.body.scrollHeight : targetEl[0].scrollHeight;n }nn $affix.init();n return $affix;nn }nn return AffixFactory;nn };nn })nn .directive(‘bsAffix’, function($affix, $window) {nn return {n restrict: ‘EAC’,n require: ‘^?bsAffixTarget’,n link: function postLink(scope, element, attr, affixTarget) {nn var options = {scope: scope, offsetTop: ‘auto’, target: affixTarget ? affixTarget.$element : angular.element($window)};n angular.forEach([‘offsetTop’, ‘offsetBottom’, ‘offsetParent’, ‘offsetUnpin’], function(key) {n if(angular.isDefined(attr[key])) options[key] = attr[key];n });nn var affix = $affix(element, options);n scope.$on(‘$destroy’, function() {n affix && affix.destroy();n options = null;n affix = null;n });nn }n };nn })nn .directive(‘bsAffixTarget’, function() {n return {n controller: function($element) {n this.$element = $element;n }n };n });n”,“‘use strict’;nn// @BUG: following snippet won’t compile correctlyn// @TODO: submit issue to coren// ‘ ’ +nnangular.module(‘mgcrea.ngStrap.alert’, [‘mgcrea.ngStrap.modal’])nn .provider(‘$alert’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n prefixClass: ‘alert’,n prefixEvent: ‘alert’,n placement: null,n template: ‘alert/alert.tpl.html’,n container: false,n element: null,n backdrop: false,n keyboard: true,n show: true,n // Specific optionsn duration: false,n type: false,n dismissable: truen };nn this.$get = function($modal, $timeout) {nn function AlertFactory(config) {nn var $alert = {};nn // Common varsn var options = angular.extend({}, defaults, config);nn $alert = $modal(options);nn // Support scope as string options [/*title, content, */ type, dismissable]n $alert.$scope.dismissable = !!options.dismissable;n if(options.type) {n $alert.$scope.type = options.type;n }nn // Support auto-close durationn var show = $alert.show;n if(options.duration) {n $alert.show = function() {n show();n $timeout(function() {n $alert.hide();n }, options.duration * 1000);n };n }nn return $alert;nn }nn return AlertFactory;nn };nn })nn .directive(‘bsAlert’, function($window, $sce, $alert) {nn var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;nn return {n restrict: ‘EAC’,n scope: true,n link: function postLink(scope, element, attr, transclusion) {nn // Directive optionsn var options = {scope: scope, element: element, show: false};n angular.forEach([‘template’, ‘placement’, ‘keyboard’, ‘html’, ‘container’, ‘animation’, ‘duration’, ‘dismissable’], function(key) {n if(angular.isDefined(attr[key])) options[key] = attr[key];n });nn // Support scope as data-attrsn angular.forEach([‘title’, ‘content’, ‘type’], function(key) {n attr[key] && attr.$observe(key, function(newValue, oldValue) {n scope[key] = $sce.trustAsHtml(newValue);n });n });nn // Support scope as an objectn attr.bsAlert && scope.$watch(attr.bsAlert, function(newValue, oldValue) {n if(angular.isObject(newValue)) {n angular.extend(scope, newValue);n } else {n scope.content = newValue;n }n }, true);nn // Initialize alertn var alert = $alert(options);nn // Triggern element.on(attr.trigger || ‘click’, alert.toggle);nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if (alert) alert.destroy();n options = null;n alert = null;n });nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.aside’, [‘mgcrea.ngStrap.modal’])nn .provider(‘$aside’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade-and-slide-right’,n prefixClass: ‘aside’,n prefixEvent: ‘aside’,n placement: ‘right’,n template: ‘aside/aside.tpl.html’,n contentTemplate: false,n container: false,n element: null,n backdrop: true,n keyboard: true,n html: false,n show: truen };nn this.$get = function($modal) {nn function AsideFactory(config) {nn var $aside = {};nn // Common varsn var options = angular.extend({}, defaults, config);nn $aside = $modal(options);nn return $aside;nn }nn return AsideFactory;nn };nn })nn .directive(‘bsAside’, function($window, $sce, $aside) {nn var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;nn return {n restrict: ‘EAC’,n scope: true,n link: function postLink(scope, element, attr, transclusion) {n // Directive optionsn var options = {scope: scope, element: element, show: false};n angular.forEach([‘template’, ‘contentTemplate’, ‘placement’, ‘backdrop’, ‘keyboard’, ‘html’, ‘container’, ‘animation’], function(key) {n if(angular.isDefined(attr[key])) options[key] = attr[key];n });nn // Support scope as data-attrsn angular.forEach([‘title’, ‘content’], function(key) {n attr[key] && attr.$observe(key, function(newValue, oldValue) {n scope[key] = $sce.trustAsHtml(newValue);n });n });nn // Support scope as an objectn attr.bsAside && scope.$watch(attr.bsAside, function(newValue, oldValue) {n if(angular.isObject(newValue)) {n angular.extend(scope, newValue);n } else {n scope.content = newValue;n }n }, true);nn // Initialize asiden var aside = $aside(options);nn // Triggern element.on(attr.trigger || ‘click’, aside.toggle);nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if (aside) aside.destroy();n options = null;n aside = null;n });nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.button’, [])nn .provider(‘$button’, function() {nn var defaults = this.defaults = {n activeClass:‘active’,n toggleEvent:‘click’n };nn this.$get = function() {n return {defaults: defaults};n };nn })nn .directive(‘bsCheckboxGroup’, function() {nn return {n restrict: ‘A’,n require: ‘ngModel’,n compile: function postLink(element, attr) {n element.attr(‘data-toggle’, ‘buttons’);n element.removeAttr(‘ng-model’);n var children = element[0].querySelectorAll(‘input[type="checkbox"]’);n angular.forEach(children, function(child) {n var childEl = angular.element(child);n childEl.attr(‘bs-checkbox’, ”);n childEl.attr(‘ng-model’, attr.ngModel + ‘.’ + childEl.attr(‘value’));n });n }nn };nn })nn .directive(‘bsCheckbox’, function($button, $$rAF) {nn var defaults = $button.defaults;n var constantValueRegExp = /^(true|false|\d+)$/;nn return {n restrict: ‘A’,n require: ‘ngModel’,n link: function postLink(scope, element, attr, controller) {nn var options = defaults;nn // Support label > input[type="checkbox"]n var isInput = element[0].nodeName === ‘INPUT’;n var activeElement = isInput ? element.parent() : element;nn var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;n if(constantValueRegExp.test(attr.trueValue)) {n trueValue = scope.$eval(attr.trueValue);n }n var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;n if(constantValueRegExp.test(attr.falseValue)) {n falseValue = scope.$eval(attr.falseValue);n }nn // Parse exotic valuesn var hasExoticValues = typeof trueValue !== ‘boolean’ || typeof falseValue !== ‘boolean’;n if(hasExoticValues) {n controller.$parsers.push(function(viewValue) {n // console.warn(‘$parser’, element.attr(‘ng-model’), ‘viewValue’, viewValue);n return viewValue ? trueValue : falseValue;n });n // modelValue -> $formatters -> viewValuen controller.$formatters.push(function(modelValue) {n // console.warn(‘$formatter("%s"): modelValue=%o (%o)’, element.attr(‘ng-model’), modelValue, typeof modelValue);n return angular.equals(modelValue, trueValue);n });n // Fix rendering for exotic valuesn scope.$watch(attr.ngModel, function(newValue, oldValue) {n controller.$render();n });n }nn // model -> viewn controller.$render = function () {n // console.warn(‘$render’, element.attr(‘ng-model’), ‘controller.$modelValue’, typeof controller.$modelValue, controller.$modelValue, ‘controller.$viewValue’, typeof controller.$viewValue, controller.$viewValue);n var isActive = angular.equals(controller.$modelValue, trueValue);n $$rAF(function() {n if(isInput) element[0].checked = isActive;n activeElement.toggleClass(options.activeClass, isActive);n });n };nn // view -> modeln element.bind(options.toggleEvent, function() {n scope.$apply(function () {n // console.warn(‘!click’, element.attr(‘ng-model’), ‘controller.$viewValue’, typeof controller.$viewValue, controller.$viewValue, ‘controller.$modelValue’, typeof controller.$modelValue, controller.$modelValue);n if(!isInput) {n controller.$setViewValue(!activeElement.hasClass(‘active’));n }n if(!hasExoticValues) {n controller.$render();n }n });n });nn }nn };nn })nn .directive(‘bsRadioGroup’, function() {nn return {n restrict: ‘A’,n require: ‘ngModel’,n compile: function postLink(element, attr) {n element.attr(‘data-toggle’, ‘buttons’);n element.removeAttr(‘ng-model’);n var children = element[0].querySelectorAll(‘input[type="radio"]’);n angular.forEach(children, function(child) {n angular.element(child).attr(‘bs-radio’, ”);n angular.element(child).attr(‘ng-model’, attr.ngModel);n });n }nn };nn })nn .directive(‘bsRadio’, function($button, $$rAF) {nn var defaults = $button.defaults;n var constantValueRegExp = /^(true|false|\d+)$/;nn return {n restrict: ‘A’,n require: ‘ngModel’,n link: function postLink(scope, element, attr, controller) {nn var options = defaults;nn // Support ‘label > input[type="radio"]` markupn var isInput = element[0].nodeName === ’INPUT’;n var activeElement = isInput ? element.parent() : element;nn var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value;nn // model -> viewn controller.$render = function () {n // console.warn(‘$render’, element.attr(‘value’), ‘controller.$modelValue’, typeof controller.$modelValue, controller.$modelValue, ‘controller.$viewValue’, typeof controller.$viewValue, controller.$viewValue);n var isActive = angular.equals(controller.$modelValue, value);n $$rAF(function() {n if(isInput) element[0].checked = isActive;n activeElement.toggleClass(options.activeClass, isActive);n });n };nn // view -> modeln element.bind(options.toggleEvent, function() {n scope.$apply(function () {n // console.warn(‘!click’, element.attr(‘value’), ‘controller.$viewValue’, typeof controller.$viewValue, controller.$viewValue, ‘controller.$modelValue’, typeof controller.$modelValue, controller.$modelValue);n controller.$setViewValue(value);n controller.$render();n });n });nn }nn };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.collapse’, [])nn .provider(‘$collapse’, function() {nn var defaults = this.defaults = {n animation: ‘am-collapse’,n disallowToggle: false,n activeClass: ‘in’,n startCollapsed: false,n allowMultiple: falsen };nn var controller = this.controller = function($scope, $element, $attrs) {n var self = this;nn // Attributes optionsn self.$options = angular.copy(defaults);n angular.forEach([‘animation’, ‘disallowToggle’, ‘activeClass’, ‘startCollapsed’, ‘allowMultiple’], function (key) {n if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key];n });nn self.$toggles = [];n self.$targets = [];nn self.$viewChangeListeners = [];nn self.$registerToggle = function(element) {n self.$toggles.push(element);n };n self.$registerTarget = function(element) {n self.$targets.push(element);n };nn self.$unregisterToggle = function(element) {n var index = self.$toggles.indexOf(element);n // remove toggle from $toggles arrayn self.$toggles.splice(index, 1);n };n self.$unregisterTarget = function(element) {n var index = self.$targets.indexOf(element);nn // remove element from $targets arrayn self.$targets.splice(index, 1);nn if (self.$options.allowMultiple) {n // remove target index from $active array valuesn deactivateItem(element);n }nn // fix active item indexesn fixActiveItemIndexes(index);nn self.$viewChangeListeners.forEach(function(fn) {n fn();n });n };nn // use array to store all the currently open panelsn self.$targets.$active = !self.$options.startCollapsed ? [0] : [];n self.$setActive = $scope.$setActive = function(value) {n if(angular.isArray(value)) {n self.$targets.$active = angular.copy(value);n }n else if(!self.$options.disallowToggle) {n // toogle element active statusn isActive(value) ? deactivateItem(value) : activateItem(value);n } else {n activateItem(value);n }nn self.$viewChangeListeners.forEach(function(fn) {n fn();n });n };nn self.$activeIndexes = function() {n return self.$options.allowMultiple ? self.$targets.$active :n self.$targets.$active.length === 1 ? self.$targets.$active[0] : -1;n };nn function fixActiveItemIndexes(index) {n // item with index was removed, so wen // need to adjust other items index valuesn var activeIndexes = self.$targets.$active;n for(var i = 0; i < activeIndexes.length; i++) {\n if (index < activeIndexes[i]) {\n activeIndexes[i] = activeIndexes[i] - 1;\n }\n\n // the last item is active, so we need to\n // adjust its index\n if (activeIndexes[i] === self.$targets.length) {\n activeIndexes[i] = self.$targets.length - 1;\n }\n }\n }\n\n function isActive(value) {\n var activeItems = self.$targets.$active;\n return activeItems.indexOf(value) === -1 ? false : true;\n }\n\n function deactivateItem(value) {\n var index = self.$targets.$active.indexOf(value);\n if (index !== -1) {\n self.$targets.$active.splice(index, 1);\n }\n }\n\n function activateItem(value) {\n if (!self.$options.allowMultiple) {\n // remove current selected item\n self.$targets.$active.splice(0, 1);\n }\n\n if (self.$targets.$active.indexOf(value) === -1) {\n self.$targets.$active.push(value);\n }\n }\n\n };\n\n this.$get = function() {\n var $collapse = {};\n $collapse.defaults = defaults;\n $collapse.controller = controller;\n return $collapse;\n };\n\n })\n\n .directive('bsCollapse', function($window, $animate, $collapse) {\n\n var defaults = $collapse.defaults;\n\n return {\n require: ['?ngModel', 'bsCollapse'],\n controller: ['$scope', '$element', '$attrs', $collapse.controller],\n link: function postLink(scope, element, attrs, controllers) {\n\n var ngModelCtrl = controllers[0];\n var bsCollapseCtrl = controllers[1];\n\n if(ngModelCtrl) {\n\n // Update the modelValue following\n bsCollapseCtrl.$viewChangeListeners.push(function() {\n ngModelCtrl.$setViewValue(bsCollapseCtrl.$activeIndexes());\n });\n\n // modelValue -> $formatters -> viewValuen ngModelCtrl.$formatters.push(function(modelValue) {n // console.warn(‘$formatter("%s"): modelValue=%o (%o)’, element.attr(‘ng-model’), modelValue, typeof modelValue);n if (angular.isArray(modelValue)) {n // model value is an array, so just replacen // the active items directlyn bsCollapseCtrl.$setActive(modelValue);n }n else {n var activeIndexes = bsCollapseCtrl.$activeIndexes();nn if (angular.isArray(activeIndexes)) {n // we have an array of selected indexesn if (activeIndexes.indexOf(modelValue * 1) === -1) {n // item with modelValue index is not activen bsCollapseCtrl.$setActive(modelValue * 1);n }n }n else if (activeIndexes !== modelValue * 1) {n bsCollapseCtrl.$setActive(modelValue * 1);n }n }n return modelValue;n });nn }nn }n };nn })nn .directive(‘bsCollapseToggle’, function() {nn return {n require: [‘^?ngModel’, ‘^bsCollapse’],n link: function postLink(scope, element, attrs, controllers) {nn var ngModelCtrl = controllers[0];n var bsCollapseCtrl = controllers[1];nn // Add base attrn element.attr(‘data-toggle’, ‘collapse’);nn // Push pane to parent bsCollapse controllern bsCollapseCtrl.$registerToggle(element);nn // remove toggle from collapse controller when toggle is destroyedn scope.$on(‘$destroy’, function() {n bsCollapseCtrl.$unregisterToggle(element);n });nn element.on(‘click’, function() {n var index = attrs.bsCollapseToggle || bsCollapseCtrl.$toggles.indexOf(element);n bsCollapseCtrl.$setActive(index * 1);n scope.$apply();n });nn }n };nn })nn .directive(‘bsCollapseTarget’, function($animate) {nn return {n require: [‘^?ngModel’, ‘^bsCollapse’],n // scope: true,n link: function postLink(scope, element, attrs, controllers) {nn var ngModelCtrl = controllers[0];n var bsCollapseCtrl = controllers[1];nn // Add base classn element.addClass(‘collapse’);nn // Add animation classn if(bsCollapseCtrl.$options.animation) {n element.addClass(bsCollapseCtrl.$options.animation);n }nn // Push pane to parent bsCollapse controllern bsCollapseCtrl.$registerTarget(element);nn // remove pane target from collapse controller when target is destroyedn scope.$on(‘$destroy’, function() {n bsCollapseCtrl.$unregisterTarget(element);n });nn function render() {n var index = bsCollapseCtrl.$targets.indexOf(element);n var active = bsCollapseCtrl.$activeIndexes();n var action = ‘removeClass’;n if (angular.isArray(active)) {n if (active.indexOf(index) !== -1) {n action = ‘addClass’;n }n }n else if (index === active) {n action = ‘addClass’;n }nn $animate[action](element, bsCollapseCtrl.$options.activeClass);n }nn bsCollapseCtrl.$viewChangeListeners.push(function() {n render();n });n render();nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.datepicker’, [n ‘mgcrea.ngStrap.helpers.dateParser’,n ‘mgcrea.ngStrap.helpers.dateFormatter’,n ‘mgcrea.ngStrap.tooltip’])nn .provider(‘$datepicker’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n prefixClass: ‘datepicker’,n placement: ‘bottom-left’,n template: ‘datepicker/datepicker.tpl.html’,n trigger: ‘focus’,n container: false,n keyboard: true,n html: false,n delay: 0,n // lang: $locale.id,n useNative: false,n dateType: ‘date’,n dateFormat: ‘shortDate’,n modelDateFormat: null,n dayFormat: ‘dd’,n monthFormat: ‘MMM’,n yearFormat: ‘yyyy’,n monthTitleFormat: ‘MMMM yyyy’,n yearTitleFormat: ‘yyyy’,n strictFormat: false,n autoclose: false,n minDate: -Infinity,n maxDate: +Infinity,n startView: 0,n minView: 0,n startWeek: 0,n daysOfWeekDisabled: ”,n iconLeft: ‘glyphicon glyphicon-chevron-left’,n iconRight: ‘glyphicon glyphicon-chevron-right’n };nn this.$get = function($window, $document, $rootScope, $sce, $dateFormatter, datepickerViews, $tooltip, $timeout) {nn var bodyEl = angular.element($window.document.body);n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);n var isTouch = (‘createTouch’ in $window.document) && isNative;n if(!defaults.lang) defaults.lang = $dateFormatter.getDefaultLocale();nn function DatepickerFactory(element, controller, config) {nn var $datepicker = $tooltip(element, angular.extend({}, defaults, config));n var parentScope = config.scope;n var options = $datepicker.$options;n var scope = $datepicker.$scope;n if(options.startView) options.startView -= options.minView;nn // View varsnn var pickerViews = datepickerViews($datepicker);n $datepicker.$views = pickerViews.views;n var viewDate = pickerViews.viewDate;n scope.$mode = options.startView;n scope.$iconLeft = options.iconLeft;n scope.$iconRight = options.iconRight;n var $picker = $datepicker.$views[scope.$mode];nn // Scope methodsnn scope.$select = function(date) {n $datepicker.select(date);n };n scope.$selectPane = function(value) {n $datepicker.$selectPane(value);n };n scope.$toggleMode = function() {n $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length);n };nn // Public methodsnn $datepicker.update = function(date) {n // console.warn(‘$datepicker.update() newValue=%o’, date);n if(angular.isDate(date) && !isNaN(date.getTime())) {n $datepicker.$date = date;n $picker.update.call($picker, date);n }n // Build only if pristinen $datepicker.$build(true);n };nn $datepicker.updateDisabledDates = function(dateRanges) {n options.disabledDateRanges = dateRanges;n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], $datepicker.$setDisabledEl);\n }\n };\n\n $datepicker.select = function(date, keep) {\n // console.warn('$datepicker.select', date, scope.$mode);\n if(!angular.isDate(controller.$dateValue)) controller.$dateValue = new Date(date);\n if(!scope.$mode || keep) {\n controller.$setViewValue(angular.copy(date));\n controller.$render();\n if(options.autoclose && !keep) {\n $timeout(function() { $datepicker.hide(true); });\n }\n } else {\n angular.extend(viewDate, {year: date.getFullYear(), month: date.getMonth(), date: date.getDate()});\n $datepicker.setMode(scope.$mode - 1);\n $datepicker.$build();\n }\n };\n\n $datepicker.setMode = function(mode) {\n // console.warn('$datepicker.setMode', mode);\n scope.$mode = mode;\n $picker = $datepicker.$views[scope.$mode];\n $datepicker.$build();\n };\n\n // Protected methods\n\n $datepicker.$build = function(pristine) {\n // console.warn('$datepicker.$build() viewDate=%o', viewDate);\n if(pristine === true && $picker.built) return;\n if(pristine === false && !$picker.built) return;\n $picker.build.call($picker);\n };\n\n $datepicker.$updateSelected = function() {\n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], updateSelected);\n }\n };\n\n $datepicker.$isSelected = function(date) {\n return $picker.isSelected(date);\n };\n\n $datepicker.$setDisabledEl = function(el) {\n el.disabled = $picker.isDisabled(el.date);\n };\n\n $datepicker.$selectPane = function(value) {\n var steps = $picker.steps;\n // set targetDate to first day of month to avoid problems with\n // date values rollover. This assumes the viewDate does not\n // depend on the day of the month\n var targetDate = new Date(Date.UTC(viewDate.year + ((steps.year || 0) * value), viewDate.month + ((steps.month || 0) * value), 1));\n angular.extend(viewDate, {year: targetDate.getUTCFullYear(), month: targetDate.getUTCMonth(), date: targetDate.getUTCDate()});\n $datepicker.$build();\n };\n\n $datepicker.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n targetEl = targetEl.parent();\n }\n targetEl.triggerHandler('click');\n }\n };\n\n $datepicker.$onKeyDown = function(evt) {\n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n if(evt.keyCode === 13) {\n if(!scope.$mode) {\n return $datepicker.hide(true);\n } else {\n return scope.$apply(function() { $datepicker.setMode(scope.$mode - 1); });\n }\n }\n\n // Navigate with keyboard\n $picker.onKeyDown(evt);\n parentScope.$digest();\n };\n\n // Private\n\n function updateSelected(el) {\n el.selected = $datepicker.$isSelected(el.date);\n }\n\n function focusElement() {\n element[0].focus();\n }\n\n // Overrides\n\n var _init = $datepicker.init;\n $datepicker.init = function() {\n if(isNative && options.useNative) {\n element.prop('type', 'date');\n element.css('-webkit-appearance', 'textfield');\n return;\n } else if(isTouch) {\n element.prop('type', 'text');\n element.attr('readonly', 'true');\n element.on('click', focusElement);\n }\n _init();\n };\n\n var _destroy = $datepicker.destroy;\n $datepicker.destroy = function() {\n if(isNative && options.useNative) {\n element.off('click', focusElement);\n }\n _destroy();\n };\n\n var _show = $datepicker.show;\n $datepicker.show = function() {\n _show();\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n // if $datepicker is no longer showing, don't setup events\n if(!$datepicker.$isShown) return;\n $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $datepicker.$onKeyDown);\n }\n }, 0, false);\n };\n\n var _hide = $datepicker.hide;\n $datepicker.hide = function(blur) {\n if(!$datepicker.$isShown) return;\n $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $datepicker.$onKeyDown);\n }\n _hide(blur);\n };\n\n return $datepicker;\n\n }\n\n DatepickerFactory.defaults = defaults;\n return DatepickerFactory;\n\n };\n\n })\n\n .directive('bsDatepicker', function($window, $parse, $q, $dateFormatter, $dateParser, $datepicker) {\n\n var defaults = $datepicker.defaults;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, controller: controller};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'dateType', 'dateFormat', 'modelDateFormat', 'dayFormat', 'strictFormat', 'startWeek', 'startDate', 'useNative', 'lang', 'startView', 'minView', 'iconLeft', 'iconRight', 'daysOfWeekDisabled', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!datepicker || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(datepicker),?/i);\n newValue === true ? datepicker.show() : datepicker.hide();\n });\n\n // Initialize datepicker\n var datepicker = $datepicker(element, controller, options);\n options = datepicker.$options;\n // Set expected iOS format\n if(isNative && options.useNative) options.dateFormat = 'yyyy-MM-dd';\n\n var lang = options.lang;\n\n var formatDate = function(date, format) {\n return $dateFormatter.formatDate(date, format, lang);\n };\n\n var dateParser = $dateParser({format: options.dateFormat, lang: lang, strict: options.strictFormat});\n\n // Observe attributes for changes\n angular.forEach(['minDate', 'maxDate'], function(key) {\n // console.warn('attr.$observe(%s)', key, attr[key]);\n angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n // console.warn('attr.$observe(%s)=%o', key, newValue);\n datepicker.$options[key] = dateParser.getDateForAttribute(key, newValue);\n // Build only if dirty\n !isNaN(datepicker.$options[key]) && datepicker.$build(false);\n validateAgainstMinMaxDate(controller.$dateValue);\n });\n });\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n datepicker.update(controller.$dateValue);\n }, true);\n\n // Normalize undefined/null/empty array,\n // so that we don't treat changing from undefined->null as a change.n function normalizeDateRanges(ranges) {n if (!ranges || !ranges.length) return null;n return ranges;n }nn if (angular.isDefined(attr.disabledDates)) {n scope.$watch(attr.disabledDates, function(disabledRanges, previousValue) {n disabledRanges = normalizeDateRanges(disabledRanges);n previousValue = normalizeDateRanges(previousValue);nn if (disabledRanges) {n datepicker.updateDisabledDates(disabledRanges);n }n });n }nn function validateAgainstMinMaxDate(parsedDate) {n if (!angular.isDate(parsedDate)) return;n var isMinValid = isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate;n var isMaxValid = isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate;\n var isValid = isMinValid && isMaxValid;\n controller.$setValidity('date', isValid);\n controller.$setValidity('min', isMinValid);\n controller.$setValidity('max', isMaxValid);\n // Only update the model when we have a valid date\n if(isValid) controller.$dateValue = parsedDate;\n }\n\n // viewValue -> $parsers -> modelValuen controller.$parsers.unshift(function(viewValue) {n // console.warn(‘$parser("%s"): viewValue=%o’, element.attr(‘ng-model’), viewValue);n // Null values should correctly reset the model value & validityn if(!viewValue) {n controller.$setValidity(‘date’, true);n // BREAKING CHANGE:n // return null (not undefined) when input value is empty, so angularjs 1.3n // ngModelController can go ahead and run validators, like ngRequiredn return null;n }n var parsedDate = dateParser.parse(viewValue, controller.$dateValue);n if(!parsedDate || isNaN(parsedDate.getTime())) {n controller.$setValidity(‘date’, false);n // return undefined, causes ngModelController ton // invalidate model valuen return;n } else {n validateAgainstMinMaxDate(parsedDate);n }n if(options.dateType === ‘string’) {n return formatDate(parsedDate, options.modelDateFormat || options.dateFormat);n } else if(options.dateType === ‘number’) {n return controller.$dateValue.getTime();n } else if(options.dateType === ‘unix’) {n return controller.$dateValue.getTime() / 1000;n } else if(options.dateType === ‘iso’) {n return controller.$dateValue.toISOString();n } else {n return new Date(controller.$dateValue);n }n });nn // modelValue -> $formatters -> viewValuen controller.$formatters.push(function(modelValue) {n // console.warn(‘$formatter("%s"): modelValue=%o (%o)’, element.attr(‘ng-model’), modelValue, typeof modelValue);n var date;n if(angular.isUndefined(modelValue) || modelValue === null) {n date = NaN;n } else if(angular.isDate(modelValue)) {n date = modelValue;n } else if(options.dateType === ‘string’) {n date = dateParser.parse(modelValue, null, options.modelDateFormat);n } else if(options.dateType === ‘unix’) {n date = new Date(modelValue * 1000);n } else {n date = new Date(modelValue);n }n // Setup default value?n // if(isNaN(date.getTime())) {n // var today = new Date();n // date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0);n // }n controller.$dateValue = date;n return getDateFormattedString();n });nn // viewValue -> elementn controller.$render = function() {n // console.warn(‘$render("%s"): viewValue=%o’, element.attr(‘ng-model’), controller.$viewValue);n element.val(getDateFormattedString());n };nn function getDateFormattedString() {n return !controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? ” : formatDate(controller.$dateValue, options.dateFormat);n }nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if(datepicker) datepicker.destroy();n options = null;n datepicker = null;n });nn }n };nn })nn .provider(‘datepickerViews’, function() {nn var defaults = this.defaults = {n dayFormat: ‘dd’,n daySplit: 7n };nn // Split array into smaller arraysn function split(arr, size) {n var arrays = [];n while(arr.length > 0) {n arrays.push(arr.splice(0, size));n }n return arrays;n }nn // Modulus operatorn function mod(n, m) {n return ((n % m) + m) % m;n }nn this.$get = function($dateFormatter, $dateParser, $sce) {nn return function(picker) {nn var scope = picker.$scope;n var options = picker.$options;nn var lang = options.lang;n var formatDate = function(date, format) {n return $dateFormatter.formatDate(date, format, lang);n };n var dateParser = $dateParser({format: options.dateFormat, lang: lang, strict: options.strictFormat});nn var weekDaysMin = $dateFormatter.weekdaysShort(lang);n var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek));n var weekDaysLabelsHtml = $sce.trustAsHtml(‘
’ + weekDaysLabels.join(‘ | ’) + ‘ | ’);nn var startDate = picker.$date || (options.startDate ? dateParser.getDateForAttribute(‘startDate’, options.startDate) : new Date());n var viewDate = {year: startDate.getFullYear(), month: startDate.getMonth(), date: startDate.getDate()};n var timezoneOffset = startDate.getTimezoneOffset() * 6e4;nn var views = [{n format: options.dayFormat,n split: 7,n steps: { month: 1 },n update: function(date, force) {n if(!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) {n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});n picker.$build();n } else if(date.getDate() !== viewDate.date) {n viewDate.date = picker.$date.getDate();n picker.$updateSelected();n }n },n build: function() {n var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset();n var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 7) * 864e5), firstDateOffset = firstDate.getTimezoneOffset();n var today = new Date().toDateString();n // Handle daylight time switchn if(firstDateOffset !== firstDayOfMonthOffset) firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60e3);n var days = [], day;n for(var i = 0; i < 42; i++) { // < 7 * 6\n day = dateParser.daylightSavingAdjust(new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i));\n days.push({date: day, isToday: day.toDateString() === today, label: formatDate(day, this.format), selected: picker.$date && this.isSelected(day), muted: day.getMonth() !== viewDate.month, disabled: this.isDisabled(day)});\n }\n scope.title = formatDate(firstDayOfMonth, options.monthTitleFormat);\n scope.showLabels = true;\n scope.labels = weekDaysLabelsHtml;\n scope.rows = split(days, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate();\n },\n isDisabled: function(date) {\n var time = date.getTime();\n\n // Disabled because of min/max date.\n if (time < options.minDate || time > options.maxDate) return true;nn // Disabled due to being a disabled day of the weekn if (options.daysOfWeekDisabled.indexOf(date.getDay()) !== -1) return true;nn // Disabled because of disabled date range.n if (options.disabledDateRanges) {n for (var i = 0; i < options.disabledDateRanges.length; i++) {\n if (time >= options.disabledDateRanges[i].start && time <= options.disabledDateRanges[i].end) {\n return true;\n }\n }\n }\n\n return false;\n },\n onKeyDown: function(evt) {\n if (!picker.$date) {\n return;\n }\n var actualTime = picker.$date.getTime();\n var newDate;\n\n if(evt.keyCode === 37) newDate = new Date(actualTime - 1 * 864e5);\n else if(evt.keyCode === 38) newDate = new Date(actualTime - 7 * 864e5);\n else if(evt.keyCode === 39) newDate = new Date(actualTime + 1 * 864e5);\n else if(evt.keyCode === 40) newDate = new Date(actualTime + 7 * 864e5);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }, {\n name: 'month',\n format: options.monthFormat,\n split: 4,\n steps: { year: 1 },\n update: function(date, force) {\n if(!this.built || date.getFullYear() !== viewDate.year) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getMonth() !== viewDate.month) {\n angular.extend(viewDate, {month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstMonth = new Date(viewDate.year, 0, 1);\n var months = [], month;\n for (var i = 0; i < 12; i++) {\n month = new Date(viewDate.year, i, 1);\n months.push({date: month, label: formatDate(month, this.format), selected: picker.$isSelected(month), disabled: this.isDisabled(month)});\n }\n scope.title = formatDate(month, options.yearTitleFormat);\n scope.showLabels = false;\n scope.rows = split(months, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;n },n onKeyDown: function(evt) {n if (!picker.$date) {n return;n }n var actualMonth = picker.$date.getMonth();n var newDate = new Date(picker.$date);nn if(evt.keyCode === 37) newDate.setMonth(actualMonth - 1);n else if(evt.keyCode === 38) newDate.setMonth(actualMonth - 4);n else if(evt.keyCode === 39) newDate.setMonth(actualMonth + 1);n else if(evt.keyCode === 40) newDate.setMonth(actualMonth + 4);nn if (!this.isDisabled(newDate)) picker.select(newDate, true);n }n }, {n name: ‘year’,n format: options.yearFormat,n split: 4,n steps: { year: 12 },n update: function(date, force) {n if(!this.built || force || parseInt(date.getFullYear()/20, 10) !== parseInt(viewDate.year/20, 10)) {n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});n picker.$build();n } else if(date.getFullYear() !== viewDate.year) {n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});n picker.$updateSelected();n }n },n build: function() {n var firstYear = viewDate.year - viewDate.year % (this.split * 3);n var years = [], year;n for (var i = 0; i < 12; i++) {\n year = new Date(firstYear + i, 0, 1);\n years.push({date: year, label: formatDate(year, this.format), selected: picker.$isSelected(year), disabled: this.isDisabled(year)});\n }\n scope.title = years[0].label + '-' + years[years.length - 1].label;\n scope.showLabels = false;\n scope.rows = split(years, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear() + 1, 0, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;n },n onKeyDown: function(evt) {n if (!picker.$date) {n return;n }n var actualYear = picker.$date.getFullYear(),n newDate = new Date(picker.$date);nn if(evt.keyCode === 37) newDate.setYear(actualYear - 1);n else if(evt.keyCode === 38) newDate.setYear(actualYear - 4);n else if(evt.keyCode === 39) newDate.setYear(actualYear + 1);n else if(evt.keyCode === 40) newDate.setYear(actualYear + 4);nn if (!this.isDisabled(newDate)) picker.select(newDate, true);n }n }];nn return {n views: options.minView ? Array.prototype.slice.call(views, options.minView) : views,n viewDate: viewDaten };nn };nn };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.dropdown’, [‘mgcrea.ngStrap.tooltip’])nn .provider(‘$dropdown’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n prefixClass: ‘dropdown’,n placement: ‘bottom-left’,n template: ‘dropdown/dropdown.tpl.html’,n trigger: ‘click’,n container: false,n keyboard: true,n html: false,n delay: 0n };nn this.$get = function($window, $rootScope, $tooltip, $timeout) {nn var bodyEl = angular.element($window.document.body);n var matchesSelector = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector;nn function DropdownFactory(element, config) {nn var $dropdown = {};nn // Common varsn var options = angular.extend({}, defaults, config);n var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();nn $dropdown = $tooltip(element, options);n var parentEl = element.parent();nn // Protected methodsnn $dropdown.$onKeyDown = function(evt) {n if (!/(38|40)/.test(evt.keyCode)) return;n evt.preventDefault();n evt.stopPropagation();nn // Retrieve focused indexn var items = angular.element($dropdown.$element[0].querySelectorAll(‘li:not(.divider) a’));n if(!items.length) return;n var index;n angular.forEach(items, function(el, i) {n if(matchesSelector && matchesSelector.call(el, ‘:focus’)) index = i;n });nn // Navigate with keyboardn if(evt.keyCode === 38 && index > 0) index–;n else if(evt.keyCode === 40 && index < items.length - 1) index++;\n else if(angular.isUndefined(index)) index = 0;\n items.eq(index)[0].focus();\n\n };\n\n // Overrides\n\n var show = $dropdown.show;\n $dropdown.show = function() {\n show();\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);\n bodyEl.on('click', onBodyClick);\n }, 0, false);\n parentEl.hasClass('dropdown') && parentEl.addClass('open');\n };\n\n var hide = $dropdown.hide;\n $dropdown.hide = function() {\n if(!$dropdown.$isShown) return;\n options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);\n bodyEl.off('click', onBodyClick);\n parentEl.hasClass('dropdown') && parentEl.removeClass('open');\n hide();\n };\n\n var destroy = $dropdown.destroy;\n $dropdown.destroy = function() {\n bodyEl.off('click', onBodyClick);\n destroy();\n };\n\n // Private functions\n\n function onBodyClick(evt) {\n if(evt.target === element[0]) return;\n return evt.target !== element[0] && $dropdown.hide();\n }\n\n return $dropdown;\n\n }\n\n return DropdownFactory;\n\n };\n\n })\n\n .directive('bsDropdown', function($window, $sce, $dropdown) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as an object\n attr.bsDropdown && scope.$watch(attr.bsDropdown, function(newValue, oldValue) {\n scope.content = newValue;\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!dropdown || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(dropdown),?/i);\n newValue === true ? dropdown.show() : dropdown.hide();\n });\n\n // Initialize dropdown\n var dropdown = $dropdown(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (dropdown) dropdown.destroy();\n options = null;\n dropdown = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.dateFormatter', [])\n\n .service('$dateFormatter', function($locale, dateFilter) {\n\n // The unused `lang` arguments are on purpose. The default implementation does not\n // use them and it always uses the locale loaded into the `$locale` service.\n // Custom implementations might use it, thus allowing different directives to\n // have different languages.\n\n this.getDefaultLocale = function() {\n return $locale.id;\n };\n\n // Format is either a data format name, e.g. \"shortTime\" or \"fullDate\", or a date format\n // Return either the corresponding date format or the given date format.\n this.getDatetimeFormat = function(format, lang) {\n return $locale.DATETIME_FORMATS[format] || format;\n };\n\n this.weekdaysShort = function(lang) {\n return $locale.DATETIME_FORMATS.SHORTDAY;\n };\n\n function splitTimeFormat(format) {\n return /(h+)([:\\.])?(m+)[ ]?(a?)/i.exec(format).slice(1);\n }\n\n // h:mm a => hn this.hoursFormat = function(timeFormat) {n return splitTimeFormat(timeFormat)[0];n };nn // h:mm a => mmn this.minutesFormat = function(timeFormat) {n return splitTimeFormat(timeFormat)[2];n };nn // h:mm a => :n this.timeSeparator = function(timeFormat) {n return splitTimeFormat(timeFormat)[1];n };nn // h:mm a => true, H.mm => falsen this.showAM = function(timeFormat) {n return !!splitTimeFormat(timeFormat)[3];n };nn this.formatDate = function(date, format, lang){n return dateFilter(date, format);n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.helpers.dateParser’, [])nn.provider(‘$dateParser’, function($localeProvider) {nn // define a custom ParseDate object to use instead of native Daten // to avoid date values wrapping when setting date component valuesn function ParseDate() {n this.year = 1970;n this.month = 0;n this.day = 1;n this.hours = 0;n this.minutes = 0;n this.seconds = 0;n this.milliseconds = 0;n }nn ParseDate.prototype.setMilliseconds = function(value) { this.milliseconds = value; };n ParseDate.prototype.setSeconds = function(value) { this.seconds = value; };n ParseDate.prototype.setMinutes = function(value) { this.minutes = value; };n ParseDate.prototype.setHours = function(value) { this.hours = value; };n ParseDate.prototype.getHours = function() { return this.hours; };n ParseDate.prototype.setDate = function(value) { this.day = value; };n ParseDate.prototype.setMonth = function(value) { this.month = value; };n ParseDate.prototype.setFullYear = function(value) { this.year = value; };n ParseDate.prototype.fromDate = function(value) {n this.year = value.getFullYear();n this.month = value.getMonth();n this.day = value.getDate();n this.hours = value.getHours();n this.minutes = value.getMinutes();n this.seconds = value.getSeconds();n this.milliseconds = value.getMilliseconds();n return this;n };nn ParseDate.prototype.toDate = function() {n return new Date(this.year, this.month, this.day, this.hours, this.minutes, this.seconds, this.milliseconds);n };nn var proto = ParseDate.prototype;nn function noop() {n }nn function isNumeric(n) {n return !isNaN(parseFloat(n)) && isFinite(n);n }nn function indexOfCaseInsensitive(array, value) {n var len = array.length, str=value.toString().toLowerCase();n for (var i=0; i{3}‘,n ’yy’ : ‘[0-9]{2}’,n ‘y’ : options.strict ? ‘-?(0|[0-9]{0,3})’ : ‘-?0*{1,4}’,n };nn var setFnMap = {n ‘sss’ : proto.setMilliseconds,n ‘ss’ : proto.setSeconds,n ‘s’ : proto.setSeconds,n ‘mm’ : proto.setMinutes,n ‘m’ : proto.setMinutes,n ‘HH’ : proto.setHours,n ‘H’ : proto.setHours,n ‘hh’ : proto.setHours,n ‘h’ : proto.setHours,n ‘EEEE’ : noop,n ‘EEE’ : noop,n ‘dd’ : proto.setDate,n ‘d’ : proto.setDate,n ‘a’ : function(value) { var hours = this.getHours() % 12; return this.setHours(value.match(/pm/i) ? hours + 12 : hours); },n ‘MMMM’ : function(value) { return this.setMonth(indexOfCaseInsensitive($locale.DATETIME_FORMATS.MONTH, value)); },n ‘MMM’ : function(value) { return this.setMonth(indexOfCaseInsensitive($locale.DATETIME_FORMATS.SHORTMONTH, value)); },n ‘MM’ : function(value) { return this.setMonth(1 * value - 1); },n ‘M’ : function(value) { return this.setMonth(1 * value - 1); },n ‘yyyy’ : proto.setFullYear,n ‘yy’ : function(value) { return this.setFullYear(2000 + 1 * value); },n ‘y’ : proto.setFullYearn };nn var regex, setMap;nn $dateParser.init = function() {n $dateParser.$format = $locale.DATETIME_FORMATS || options.format;n regex = regExpForFormat($dateParser.$format);n setMap = setMapForFormat($dateParser.$format);n };nn $dateParser.isValid = function(date) {n if(angular.isDate(date)) return !isNaN(date.getTime());n return regex.test(date);n };nn $dateParser.parse = function(value, baseDate, format) {n // check for date format special namesn if(format) format = $locale.DATETIME_FORMATS || format;n if(angular.isDate(value)) value = dateFilter(value, format || $dateParser.$format);n var formatRegex = format ? regExpForFormat(format) : regex;n var formatSetMap = format ? setMapForFormat(format) : setMap;n var matches = formatRegex.exec(value);n if(!matches) return false;n // use custom ParseDate object to set parsed valuesn var date = baseDate && !isNaN(baseDate.getTime()) ? new ParseDate().fromDate(baseDate) : new ParseDate().fromDate(new Date(1970, 0, 1, 0));n for(var i = 0; i < matches.length - 1; i++) {n formatSetMap && formatSetMap.call(date, matches);n }n // convert back to native Date objectn var newDate = date.toDate();nn // check new native Date object for day values overflown if (parseInt(date.day, 10) !== newDate.getDate()) {n return false;n }nn return newDate;n };nn $dateParser.getDateForAttribute = function(key, value) {n var date;nn if(value === ‘today’) {n var today = new Date();n date = new Date(today.getFullYear(), today.getMonth(), today.getDate() + (key === ‘maxDate’ ? 1 : 0), 0, 0, 0, (key === ‘minDate’ ? 0 : -1));n } else if(angular.isString(value) && value.match(/^".+"$/)) { // Support {{ dateObj }}n date = new Date(value.substr(1, value.length - 2));n } else if(isNumeric(value)) {n date = new Date(parseInt(value, 10));n } else if (angular.isString(value) && 0 === value.length) { // Reset daten date = key === ‘minDate’ ? -Infinity : +Infinity;n } else {n date = new Date(value);n }nn return date;n };nn $dateParser.getTimeForAttribute = function(key, value) {n var time;nn if(value === ‘now’) {n time = new Date().setFullYear(1970, 0, 1);n } else if(angular.isString(value) && value.match(/^".+"$/)) {n time = new Date(value.substr(1, value.length - 2)).setFullYear(1970, 0, 1);n } else if(isNumeric(value)) {n time = new Date(parseInt(value, 10)).setFullYear(1970, 0, 1);n } else if (angular.isString(value) && 0 === value.length) { // Reset timen time = key === ‘minTime’ ? -Infinity : +Infinity;n } else {n time = $dateParser.parse(value, new Date(1970, 0, 1, 0));n }nn return time;n };nn /* Handle switch to/from daylight saving.n * Hours may be non-zero on daylight saving cut-over:n * > 12 when midnight changeover, but then cannot generaten * midnight datetime, so jump to 1AM, otherwise reset.n * @param date (Date) the date to checkn * @return (Date) the corrected daten *n * __ copied from jquery ui datepicker __n */n $dateParser.daylightSavingAdjust = function(date) {n if (!date) {n return null;n }n date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);n return date;n };nn // Private functionsnn function setMapForFormat(format) {n var keys = Object.keys(setFnMap), i;n var map = [], sortedMap = [];n // Map to setFnn var clonedFormat = format;n for(i = 0; i < keys.length; i++) {n if(format.split(keys).length > 1) {n var index = clonedFormat.search(keys);n format = format.split(keys).join(”);n if(setFnMap[keys]) {n map = setFnMap[keys];n }n }n }n // Sort result mapn angular.forEach(map, function(v) {n // conditional required since angular.forEach broke around v1.2.21n // related pr: github.com/angular/angular.js/pull/8525n if(v) sortedMap.push(v);n });n return sortedMap;n }nn function escapeReservedSymbols(text) {n return text.replace(/\//g, ‘[\\/]’).replace(‘/-/g’, ‘[-]’).replace(/\./g, ‘[.]’).replace(/\\s/g, ‘[\\s]’);n }nn function regExpForFormat(format) {n var keys = Object.keys(regExpMap), i;nn var re = format;n // Abstract replaces to avoid collisionsn for(i = 0; i < keys.length; i++) {n re = re.split(keys).join(‘${’ + i + ‘}’);n }n // Replace abstracted valuesn for(i = 0; i < keys.length; i++) {n re = re.split(‘${’ + i + ‘}’).join(‘(’ + regExpMap[keys] + ‘)’);n }n format = escapeReservedSymbols(format);nn return new RegExp(‘^’ + re + ‘$’, [‘i’]);n }nn $dateParser.init();n return $dateParser;nn };nn return DateParserFactory;nn };nn});n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.helpers.debounce’, [])nn// @source jashkenas/underscoren// @url github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L693n.factory(‘debounce’, function($timeout) {n return function(func, wait, immediate) {n var timeout = null;n return function() {n var context = this,n args = arguments,n callNow = immediate && !timeout;n if(timeout) {n $timeout.cancel(timeout);n }n timeout = $timeout(function later() {n timeout = null;n if(!immediate) {n func.apply(context, args);n }n }, wait, false);n if(callNow) {n func.apply(context, args);n }n return timeout;n };n };n})nnn// @source jashkenas/underscoren// @url github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L661n.factory(‘throttle’, function($timeout) {n return function(func, wait, options) {n var timeout = null;n options || (options = {});n return function() {n var context = this,n args = arguments;n if(!timeout) {n if(options.leading !== false) {n func.apply(context, args);n }n timeout = $timeout(function later() {n timeout = null;n if(options.trailing !== false) {n func.apply(context, args);n }n }, wait, false);n }n };n };n});nn”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.helpers.dimensions’, [])nn .factory(‘dimensions’, function($document, $window) {nn var jqLite = angular.element;n var fn = {};nn /**n * Test the element nodeNamen * @param elementn * @param namen */n var nodeName = fn.nodeName = function(element, name) {n return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();n };nn /**n * Returns the element computed stylen * @param elementn * @param propn * @param extran */n fn.css = function(element, prop, extra) {n var value;n if (element.currentStyle) { //IEn value = element.currentStyle;n } else if (window.getComputedStyle) {n value = window.getComputedStyle(element);n } else {n value = element.style;n }n return extra === true ? parseFloat(value) || 0 : value;n };nn /**n * Provides read-only equivalent of jQuery’s offset function:n * @required-by bootstrap-tooltip, bootstrap-affixn * @url api.jquery.com/offset/n * @param elementn */n fn.offset = function(element) {n var boxRect = element.getBoundingClientRect();n var docElement = element.ownerDocument;n return {n width: boxRect.width || element.offsetWidth,n height: boxRect.height || element.offsetHeight,n top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0),n left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0)n };n };nn /**n * Provides read-only equivalent of jQuery’s position functionn * @required-by bootstrap-tooltip, bootstrap-affixn * @url api.jquery.com/offset/n * @param elementn */n fn.position = function(element) {nn var offsetParentRect = {top: 0, left: 0},n offsetParentElement,n offset;nn // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it’s only offset parentn if (fn.css(element, ‘position’) === ‘fixed’) {nn // We assume that getBoundingClientRect is available when computed position is fixedn offset = element.getBoundingClientRect();nn } else {nn // Get real offsetParentElementn offsetParentElement = offsetParent(element);nn // Get correct offsetsn offset = fn.offset(element);n if (!nodeName(offsetParentElement, ‘html’)) {n offsetParentRect = fn.offset(offsetParentElement);n }nn // Add offsetParent bordersn offsetParentRect.top += fn.css(offsetParentElement, ‘borderTopWidth’, true);n offsetParentRect.left += fn.css(offsetParentElement, ‘borderLeftWidth’, true);n }nn // Subtract parent offsets and element marginsn return {n width: element.offsetWidth,n height: element.offsetHeight,n top: offset.top - offsetParentRect.top - fn.css(element, ‘marginTop’, true),n left: offset.left - offsetParentRect.left - fn.css(element, ‘marginLeft’, true)n };nn };nn /**n * Returns the closest, non-statically positioned offsetParent of a given elementn * @required-by fn.positionn * @param elementn */n var offsetParent = function offsetParentElement(element) {n var docElement = element.ownerDocument;n var offsetParent = element.offsetParent || docElement;n if(nodeName(offsetParent, ‘#document’)) return docElement.documentElement;n while(offsetParent && !nodeName(offsetParent, ‘html’) && fn.css(offsetParent, ‘position’) === ‘static’) {n offsetParent = offsetParent.offsetParent;n }n return offsetParent || docElement.documentElement;n };nn /**n * Provides equivalent of jQuery’s height functionn * @required-by bootstrap-affixn * @url api.jquery.com/height/n * @param elementn * @param outern */n fn.height = function(element, outer) {n var value = element.offsetHeight;n if(outer) {n value += fn.css(element, ‘marginTop’, true) + fn.css(element, ‘marginBottom’, true);n } else {n value -= fn.css(element, ‘paddingTop’, true) + fn.css(element, ‘paddingBottom’, true) + fn.css(element, ‘borderTopWidth’, true) + fn.css(element, ‘borderBottomWidth’, true);n }n return value;n };nn /**n * Provides equivalent of jQuery’s width functionn * @required-by bootstrap-affixn * @url api.jquery.com/width/n * @param elementn * @param outern */n fn.width = function(element, outer) {n var value = element.offsetWidth;n if(outer) {n value += fn.css(element, ‘marginLeft’, true) + fn.css(element, ‘marginRight’, true);n } else {n value -= fn.css(element, ‘paddingLeft’, true) + fn.css(element, ‘paddingRight’, true) + fn.css(element, ‘borderLeftWidth’, true) + fn.css(element, ‘borderRightWidth’, true);n }n return value;n };nn return fn;nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.helpers.parseOptions’, [])nn .provider(‘$parseOptions’, function() {nn var defaults = this.defaults = {n regexp: /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w]*)|(?:\(\s*([\$\w]*)\s*,\s*([\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/n };nn this.$get = function($parse, $q) {nn function ParseOptionsFactory(attr, config) {nn var $parseOptions = {};nn // Common varsn var options = angular.extend({}, defaults, config);n $parseOptions.$values = [];nn // Private varsn var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn;nn $parseOptions.init = function() {n $parseOptions.$match = match = attr.match(options.regexp);n displayFn = $parse(match || match),n valueName = match || match,n keyName = match,n groupByFn = $parse(match || ”),n valueFn = $parse(match ? match : valueName),n valuesFn = $parse(match);n };nn $parseOptions.valuesFn = function(scope, controller) {n return $q.when(valuesFn(scope, controller))n .then(function(values) {n $parseOptions.$values = values ? parseValues(values, scope) : {};n return $parseOptions.$values;n });n };nn $parseOptions.displayValue = function(modelValue) {n var scope = {};n scope = modelValue;n return displayFn(scope);n };nn // Private functionsnn function parseValues(values, scope) {n return values.map(function(match, index) {n var locals = {}, label, value;n locals = match;n label = displayFn(scope, locals);n value = valueFn(scope, locals);n return {label: label, value: value, index: index};n });n }nn $parseOptions.init();n return $parseOptions;nn }nn return ParseOptionsFactory;nn };nn });n”,“‘use strict’;nn(angular.version.minor < 3 && angular.version.dot < 14) && angular.module(‘ng’)nn.factory(‘$$rAF’, function($window, $timeout) {nn var requestAnimationFrame = $window.requestAnimationFrame ||n $window.webkitRequestAnimationFrame ||n $window.mozRequestAnimationFrame;nn var cancelAnimationFrame = $window.cancelAnimationFrame ||n $window.webkitCancelAnimationFrame ||n $window.mozCancelAnimationFrame ||n $window.webkitCancelRequestAnimationFrame;nn var rafSupported = !!requestAnimationFrame;n var raf = rafSupported ?n function(fn) {n var id = requestAnimationFrame(fn);n return function() {n cancelAnimationFrame(id);n };n } :n function(fn) {n var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666n return function() {n $timeout.cancel(timer);n };n };nn raf.supported = rafSupported;nn return raf;nn});nn// .factory(‘$$animateReflow’, function($$rAF, $document) {nn// var bodyEl = $document.body;nn// return function(fn) {n// //the returned function acts as the cancellation functionn// return $$rAF(function() {n// //the line below will force the browser to perform a repaintn// //so that all the animated elements within the animation framen// //will be properly updated and drawn on screen. This isn// //required to perform multi-class CSS based animations withn// //Firefox. DO NOT REMOVE THIS LINE.n// var a = bodyEl.offsetWidth + 1;n// fn();n// });n// };nn// });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.modal’, [‘mgcrea.ngStrap.helpers.dimensions’])nn .provider(‘$modal’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n backdropAnimation: ‘am-fade’,n prefixClass: ‘modal’,n prefixEvent: ‘modal’,n placement: ‘top’,n template: ‘modal/modal.tpl.html’,n contentTemplate: false,n container: false,n element: null,n backdrop: true,n keyboard: true,n html: false,n show: truen };nn this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, $sce, dimensions) {nn var forEach = angular.forEach;n var trim = String.prototype.trim;n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;n var bodyElement = angular.element($window.document.body);n var htmlReplaceRegExp = /ng-bind="/ig;nn function ModalFactory(config) {nn var $modal = {};nn // Common varsn var options = $modal.$options = angular.extend({}, defaults, config);n $modal.$promise = fetchTemplate(options.template);n var scope = $modal.$scope = options.scope && options.scope.$new() || $rootScope.$new();n if(!options.element && !options.container) {n options.container = ‘body’;n }nn // store $id to identify the triggering element in eventsn // give priority to options.id, otherwise, try to usen // element id if definedn $modal.$id = options.id || options.element && options.element.attr(‘id’) || ”;nn // Support scope as string optionsn forEach([‘title’, ‘content’], function(key) {n if(options) scope = $sce.trustAsHtml(options);n });nn // Provide scope helpersn scope.$hide = function() {n scope.$$postDigest(function() {n $modal.hide();n });n };n scope.$show = function() {n scope.$$postDigest(function() {n $modal.show();n });n };n scope.$toggle = function() {n scope.$$postDigest(function() {n $modal.toggle();n });n };n // Publish isShown as a protected var on scopen $modal.$isShown = scope.$isShown = false;nn // Support contentTemplate optionn if(options.contentTemplate) {n $modal.$promise = $modal.$promise.then(function(template) {n var templateEl = angular.element(template);n return fetchTemplate(options.contentTemplate)n .then(function(contentTemplate) {n var contentEl = findElement(‘’, templateEl).removeAttr(‘ng-bind’).html(contentTemplate);n // Drop the default footer as you probably don’t want it if you use a custom contentTemplaten if(!config.template) contentEl.next().remove();n return templateEl.outerHTML;n });n });n }nn // Fetch, compile then initialize modaln var modalLinker, modalElement;n var backdropElement = angular.element(‘<div class="’ + options.prefixClass + ‘-backdrop"/>’);n $modal.$promise.then(function(template) {n if(angular.isObject(template)) template = template.data;n if(options.html) template = template.replace(htmlReplaceRegExp, ‘ng-bind-html="’);n template = trim.apply(template);n modalLinker = $compile(template);n $modal.init();n });nn $modal.init = function() {nn // Options: shown if(options.show) {n scope.$$postDigest(function() {n $modal.show();n });n }nn };nn $modal.destroy = function() {nn // Remove elementn if(modalElement) {n modalElement.remove();n modalElement = null;n }n if(backdropElement) {n backdropElement.remove();n backdropElement = null;n }nn // Destroy scopen scope.$destroy();nn };nn $modal.show = function() {n if($modal.$isShown) return;nn if(scope.$emit(options.prefixEvent + ‘.show.before’, $modal).defaultPrevented) {n return;n }n var parent, after;n if(angular.isElement(options.container)) {n parent = options.container;n after = options.container.lastChild ? angular.element(options.container.lastChild) : null;n } else {n if (options.container) {n parent = findElement(options.container);n after = parent.lastChild ? angular.element(parent.lastChild) : null;n } else {n parent = null;n after = options.element;n }n }nn // Fetch a cloned element linked from templaten modalElement = $modal.$element = modalLinker(scope, function(clonedElement, scope) {});nn // Set the initial positioning.n modalElement.css({display: ‘block’}).addClass(options.placement);nn // Options: animationn if(options.animation) {n if(options.backdrop) {n backdropElement.addClass(options.backdropAnimation);n }n modalElement.addClass(options.animation);n }nn if(options.backdrop) {n $animate.enter(backdropElement, bodyElement, null);n }n // Support v1.3+ $animaten // github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9n var promise = $animate.enter(modalElement, parent, after, enterAnimateCallback);n if(promise && promise.then) promise.then(enterAnimateCallback);nn $modal.$isShown = scope.$isShown = true;n safeDigest(scope);n // Focus once the enter-animation has startedn // Weird PhantomJS bug hackn var el = modalElement;n requestAnimationFrame(function() {n el.focus();n });nn bodyElement.addClass(options.prefixClass + ‘-open’);n if(options.animation) {n bodyElement.addClass(options.prefixClass + ‘-with-’ + options.animation);n }nn // Bind eventsn if(options.backdrop) {n modalElement.on(‘click’, hideOnBackdropClick);n backdropElement.on(‘click’, hideOnBackdropClick);n backdropElement.on(‘wheel’, preventEventDefault);n }n if(options.keyboard) {n modalElement.on(‘keyup’, $modal.$onKeyUp);n }n };nn function enterAnimateCallback() {n scope.$emit(options.prefixEvent + ‘.show’, $modal);n }nn $modal.hide = function() {n if(!$modal.$isShown) return;nn if(scope.$emit(options.prefixEvent + ‘.hide.before’, $modal).defaultPrevented) {n return;n }n var promise = $animate.leave(modalElement, leaveAnimateCallback);n // Support v1.3+ $animaten // github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9n if(promise && promise.then) promise.then(leaveAnimateCallback);nn if(options.backdrop) {n $animate.leave(backdropElement);n }n $modal.$isShown = scope.$isShown = false;n safeDigest(scope);nn // Unbind eventsn if(options.backdrop) {n modalElement.off(‘click’, hideOnBackdropClick);n backdropElement.off(‘click’, hideOnBackdropClick);n backdropElement.off(‘wheel’, preventEventDefault);n }n if(options.keyboard) {n modalElement.off(‘keyup’, $modal.$onKeyUp);n }n };nn function leaveAnimateCallback() {n scope.$emit(options.prefixEvent + ‘.hide’, $modal);n bodyElement.removeClass(options.prefixClass + ‘-open’);n if(options.animation) {n bodyElement.removeClass(options.prefixClass + ‘-with-’ + options.animation);n }n }nn $modal.toggle = function() {nn $modal.$isShown ? $modal.hide() : $modal.show();nn };nn $modal.focus = function() {n modalElement.focus();n };nn // Protected methodsnn $modal.$onKeyUp = function(evt) {nn if (evt.which === 27 && $modal.$isShown) {n $modal.hide();n evt.stopPropagation();n }nn };nn // Private methodsnn function hideOnBackdropClick(evt) {n if(evt.target !== evt.currentTarget) return;n options.backdrop === ‘static’ ? $modal.focus() : $modal.hide();n }nn function preventEventDefault(evt) {n evt.preventDefault();n }nn return $modal;nn }nn // Helper functionsnn function safeDigest(scope) {n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();n }nn function findElement(query, element) {n return angular.element((element || document).querySelectorAll(query));n }nn var fetchPromises = {};n function fetchTemplate(template) {n if(fetchPromises) return fetchPromises;n return (fetchPromises = $q.when($templateCache.get(template) || $http.get(template))n .then(function(res) {n if(angular.isObject(res)) {n $templateCache.put(template, res.data);n return res.data;n }n return res;n }));n }nn return ModalFactory;nn };nn })nn .directive(‘bsModal’, function($window, $sce, $modal) {nn return {n restrict: ‘EAC’,n scope: true,n link: function postLink(scope, element, attr, transclusion) {nn // Directive optionsn var options = {scope: scope, element: element, show: false};n angular.forEach([‘template’, ‘contentTemplate’, ‘placement’, ‘backdrop’, ‘keyboard’, ‘html’, ‘container’, ‘animation’, ‘id’], function(key) {n if(angular.isDefined(attr)) options = attr;n });nn // Support scope as data-attrsn angular.forEach([‘title’, ‘content’], function(key) {n attr && attr.$observe(key, function(newValue, oldValue) {n scope = $sce.trustAsHtml(newValue);n });n });nn // Support scope as an objectn attr.bsModal && scope.$watch(attr.bsModal, function(newValue, oldValue) {n if(angular.isObject(newValue)) {n angular.extend(scope, newValue);n } else {n scope.content = newValue;n }n }, true);nn // Initialize modaln var modal = $modal(options);nn // Triggern element.on(attr.trigger || ‘click’, modal.toggle);nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if (modal) modal.destroy();n options = null;n modal = null;n });nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.navbar’, [])nn .provider(‘$navbar’, function() {nn var defaults = this.defaults = {n activeClass: ‘active’,n routeAttr: ‘data-match-route’,n strict: falsen };nn this.$get = function() {n return {defaults: defaults};n };nn })nn .directive(‘bsNavbar’, function($window, $location, $navbar) {nn var defaults = $navbar.defaults;nn return {n restrict: ‘A’,n link: function postLink(scope, element, attr, controller) {nn // Directive optionsn var options = angular.copy(defaults);n angular.forEach(Object.keys(defaults), function(key) {n if(angular.isDefined(attr)) options = attr;n });nn // Watch for the $locationn scope.$watch(function() {nn return $location.path();nn }, function(newValue, oldValue) {nn var liElements = element.querySelectorAll(‘li[’ + options.routeAttr + ‘]’);nn angular.forEach(liElements, function(li) {nn var liElement = angular.element(li);n var pattern = liElement.attr(options.routeAttr).replace(‘/’, ‘\\/’);n if(options.strict) {n pattern = ‘^’ + pattern + ‘$’;n }n var regexp = new RegExp(pattern, [‘i’]);nn if(regexp.test(newValue)) {n liElement.addClass(options.activeClass);n } else {n liElement.removeClass(options.activeClass);n }nn });nn });nn }nn };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.popover’, [‘mgcrea.ngStrap.tooltip’])nn .provider(‘$popover’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n customClass: ”,n container: false,n target: false,n placement: ‘right’,n template: ‘popover/popover.tpl.html’,n contentTemplate: false,n trigger: ‘click’,n keyboard: true,n html: false,n title: ”,n content: ”,n delay: 0,n autoClose: falsen };nn this.$get = function($tooltip) {nn function PopoverFactory(element, config) {nn // Common varsn var options = angular.extend({}, defaults, config);nn var $popover = $tooltip(element, options);nn // Support scope as string options [/*title, */content]n if(options.content) {n $popover.$scope.content = options.content;n }nn return $popover;nn }nn return PopoverFactory;nn };nn })nn .directive(‘bsPopover’, function($window, $sce, $popover) {nn var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;nn return {n restrict: ‘EAC’,n scope: true,n link: function postLink(scope, element, attr) {nn // Directive optionsn var options = {scope: scope};n angular.forEach([‘template’, ‘contentTemplate’, ‘placement’, ‘container’, ‘target’, ‘delay’, ‘trigger’, ‘keyboard’, ‘html’, ‘animation’, ‘customClass’, ‘autoClose’, ‘id’], function(key) {n if(angular.isDefined(attr)) options = attr;n });nn // Support scope as data-attrsn angular.forEach([‘title’, ‘content’], function(key) {n attr && attr.$observe(key, function(newValue, oldValue) {n scope = $sce.trustAsHtml(newValue);n angular.isDefined(oldValue) && requestAnimationFrame(function() {n popover && popover.$applyPlacement();n });n });n });nn // Support scope as an objectn attr.bsPopover && scope.$watch(attr.bsPopover, function(newValue, oldValue) {n if(angular.isObject(newValue)) {n angular.extend(scope, newValue);n } else {n scope.content = newValue;n }n angular.isDefined(oldValue) && requestAnimationFrame(function() {n popover && popover.$applyPlacement();n });n }, true);nn // Visibility binding supportn attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {n if(!popover || !angular.isDefined(newValue)) return;n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(popover),?/i);n newValue === true ? popover.show() : popover.hide();n });nn // Initialize popovern var popover = $popover(element, options);nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if (popover) popover.destroy();n options = null;n popover = null;n });nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.select’, [‘mgcrea.ngStrap.tooltip’, ‘mgcrea.ngStrap.helpers.parseOptions’])nn .provider(‘$select’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n prefixClass: ‘select’,n prefixEvent: ‘$select’,n placement: ‘bottom-left’,n template: ‘select/select.tpl.html’,n trigger: ‘focus’,n container: false,n keyboard: true,n html: false,n delay: 0,n multiple: false,n allNoneButtons: false,n sort: true,n caretHtml: ‘ <span class="caret"></span>’,n placeholder: ‘Choose among the following…’,n allText: ‘All’,n noneText: ‘None’,n maxLength: 3,n maxLengthHtml: ‘selected’,n iconCheckmark: ‘glyphicon glyphicon-ok’n };nn this.$get = function($window, $document, $rootScope, $tooltip, $timeout) {nn var bodyEl = angular.element($window.document.body);n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);n var isTouch = (‘createTouch’ in $window.document) && isNative;nn function SelectFactory(element, controller, config) {nn var $select = {};nn // Common varsn var options = angular.extend({}, defaults, config);nn $select = $tooltip(element, options);n var scope = $select.$scope;nn scope.$matches = [];n scope.$activeIndex = 0;n scope.$isMultiple = options.multiple;n scope.$showAllNoneButtons = options.allNoneButtons && options.multiple;n scope.$iconCheckmark = options.iconCheckmark;n scope.$allText = options.allText;n scope.$noneText = options.noneText;nn scope.$activate = function(index) {n scope.$$postDigest(function() {n $select.activate(index);n });n };nn scope.$select = function(index, evt) {n scope.$$postDigest(function() {n $select.select(index);n });n };nn scope.$isVisible = function() {n return $select.$isVisible();n };nn scope.$isActive = function(index) {n return $select.$isActive(index);n };nn scope.$selectAll = function () {n for (var i = 0; i < scope.$matches.length; i++) {n if (!scope.$isActive(i)) {n scope.$select(i);n }n }n };nn scope.$selectNone = function () {n for (var i = 0; i < scope.$matches.length; i++) {n if (scope.$isActive(i)) {n scope.$select(i);n }n }n };nn // Public methodsnn $select.update = function(matches) {n scope.$matches = matches;n $select.$updateActiveIndex();n };nn $select.activate = function(index) {n if(options.multiple) {n scope.$activeIndex.sort();n $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index);n if(options.sort) scope.$activeIndex.sort();n } else {n scope.$activeIndex = index;n }n return scope.$activeIndex;n };nn $select.select = function(index) {n var value = scope.$matches.value;n scope.$apply(function() {n $select.activate(index);n if(options.multiple) {n controller.$setViewValue(scope.$activeIndex.map(function(index) {n return scope.$matches.value;n }));n } else {n controller.$setViewValue(value);n // Hide if single selectn $select.hide();n }n });n // Emit eventn scope.$emit(options.prefixEvent + ‘.select’, value, index, $select);n };nn // Protected methodsnn $select.$updateActiveIndex = function() {n if(controller.$modelValue && scope.$matches.length) {n if(options.multiple && angular.isArray(controller.$modelValue)) {n scope.$activeIndex = controller.$modelValue.map(function(value) {n return $select.$getIndex(value);n });n } else {n scope.$activeIndex = $select.$getIndex(controller.$modelValue);n }n } else if(scope.$activeIndex >= scope.$matches.length) {n scope.$activeIndex = options.multiple ? [] : 0;n }n };nn $select.$isVisible = function() {n if(!options.minLength || !controller) {n return scope.$matches.length;n }n // minLength supportn return scope.$matches.length && controller.$viewValue.length >= options.minLength;n };nn $select.$isActive = function(index) {n if(options.multiple) {n return scope.$activeIndex.indexOf(index) !== -1;n } else {n return scope.$activeIndex === index;n }n };nn $select.$getIndex = function(value) {n var l = scope.$matches.length, i = l;n if(!l) return;n for(i = l; i–;) {n if(scope.$matches.value === value) break;n }n if(i < 0) return;n return i;n };nn $select.$onMouseDown = function(evt) {n // Prevent blur on mousedown on .dropdown-menun evt.preventDefault();n evt.stopPropagation();n // Emulate click for mobile devicesn if(isTouch) {n var targetEl = angular.element(evt.target);n targetEl.triggerHandler(‘click’);n }n };nn $select.$onKeyDown = function(evt) {n if (!/(9|13|38|40)/.test(evt.keyCode)) return;n evt.preventDefault();n evt.stopPropagation();nn // Select with entern if(!options.multiple && (evt.keyCode === 13 || evt.keyCode === 9)) {n return $select.select(scope.$activeIndex);n }nn // Navigate with keyboardn if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex–;n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;n scope.$digest();n };nn // Overridesnn var _show = $select.show;n $select.show = function() {n _show();n if(options.multiple) {n $select.$element.addClass(‘select-multiple’);n }n // use timeout to hookup the events to preventn // event bubbling from being processed imediately.n $timeout(function() {n $select.$element.on(isTouch ? ‘touchstart’ : ‘mousedown’, $select.$onMouseDown);n if(options.keyboard) {n element.on(‘keydown’, $select.$onKeyDown);n }n }, 0, false);n };nn var _hide = $select.hide;n $select.hide = function() {n $select.$element.off(isTouch ? ‘touchstart’ : ‘mousedown’, $select.$onMouseDown);n if(options.keyboard) {n element.off(‘keydown’, $select.$onKeyDown);n }n _hide(true);n };nn return $select;nn }nn SelectFactory.defaults = defaults;n return SelectFactory;nn };nn })nn .directive(‘bsSelect’, function($window, $parse, $q, $select, $parseOptions) {nn var defaults = $select.defaults;nn return {n restrict: ‘EAC’,n require: ‘ngModel’,n link: function postLink(scope, element, attr, controller) {nn // Directive optionsn var options = {scope: scope, placeholder: defaults.placeholder};n angular.forEach([‘placement’, ‘container’, ‘delay’, ‘trigger’, ‘keyboard’, ‘html’, ‘animation’, ‘template’, ‘placeholder’, ‘multiple’, ‘allNoneButtons’, ‘maxLength’, ‘maxLengthHtml’, ‘allText’, ‘noneText’, ‘iconCheckmark’, ‘autoClose’, ‘id’], function(key) {n if(angular.isDefined(attr)) options = attr;n });nn // Add support for select markupn if(element.nodeName.toLowerCase() === ‘select’) {n var inputEl = element;n inputEl.css(‘display’, ‘none’);n element = angular.element(‘<button type="button" class="btn btn-default"></button>’);n inputEl.after(element);n }nn // Build proper ngOptionsn var parsedOptions = $parseOptions(attr.ngOptions);nn // Initialize selectn var select = $select(element, controller, options);nn // Watch ngOptions values before filtering for changesn var watchedOptions = parsedOptions.$match.replace(/\|.+/, ”).trim();n scope.$watch(watchedOptions, function(newValue, oldValue) {n // console.warn(‘scope.$watch(%s)’, watchedOptions, newValue, oldValue);n parsedOptions.valuesFn(scope, controller)n .then(function(values) {n select.update(values);n controller.$render();n });n }, true);nn // Watch model for changesn scope.$watch(attr.ngModel, function(newValue, oldValue) {n // console.warn(‘scope.$watch(%s)’, attr.ngModel, newValue, oldValue);n select.$updateActiveIndex();n controller.$render();n }, true);nn // Model rendering in viewn controller.$render = function () {n // console.warn(‘$render’, element.attr(‘ng-model’), ‘controller.$modelValue’, typeof controller.$modelValue, controller.$modelValue, ‘controller.$viewValue’, typeof controller.$viewValue, controller.$viewValue);n var selected, index;n if(options.multiple && angular.isArray(controller.$modelValue)) {n selected = controller.$modelValue.map(function(value) {n index = select.$getIndex(value);n return angular.isDefined(index) ? select.$scope.$matches.label : false;n }).filter(angular.isDefined);n if(selected.length > (options.maxLength || defaults.maxLength)) {n selected = selected.length + ‘ ’ + (options.maxLengthHtml || defaults.maxLengthHtml);n } else {n selected = selected.join(‘, ’);n }n } else {n index = select.$getIndex(controller.$modelValue);n selected = angular.isDefined(index) ? select.$scope.$matches.label : false;n }n element.html((selected ? selected : options.placeholder) + defaults.caretHtml);n };nn if(options.multiple){n controller.$isEmpty = function(value){n return !value || value.length === 0;n };n }nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if (select) select.destroy();n options = null;n select = null;n });nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.tab’, [])nn .provider(‘$tab’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n template: ‘tab/tab.tpl.html’,n navClass: ‘nav-tabs’,n activeClass: ‘active’n };nn var controller = this.controller = function($scope, $element, $attrs) {n var self = this;nn // Attributes optionsn self.$options = angular.copy(defaults);n angular.forEach([‘animation’, ‘navClass’, ‘activeClass’], function(key) {n if(angular.isDefined($attrs)) self.$options = $attrs;n });nn // Publish options on scopen $scope.$navClass = self.$options.navClass;n $scope.$activeClass = self.$options.activeClass;nn self.$panes = $scope.$panes = [];nn // DEPRECATED: $viewChangeListeners, please use $activePaneChangeListenersn // Because we deprecated ngModel usage, we rename viewChangeListeners to n // activePaneChangeListeners to make more sense.n self.$activePaneChangeListeners = self.$viewChangeListeners = [];nn self.$push = function(pane) {n self.$panes.push(pane);n };nn self.$remove = function(pane) {n var index = self.$panes.indexOf(pane);n var activeIndex = self.$panes.$active;nn // remove pane from $panes arrayn self.$panes.splice(index, 1);nn if (index < activeIndex) {n // we removed a pane before the active pane, so we need to n // decrement the active pane indexn activeIndex–;n }n else if (index === activeIndex && activeIndex === self.$panes.length) {n // we remove the active pane and it was the one at the end,n // so select the previous onen activeIndex–;n }n self.$setActive(activeIndex);n };nn self.$panes.$active = 0;n self.$setActive = $scope.$setActive = function(value) {n self.$panes.$active = value;n self.$activePaneChangeListeners.forEach(function(fn) {n fn();n });n };nn };nn this.$get = function() {n var $tab = {};n $tab.defaults = defaults;n $tab.controller = controller;n return $tab;n };nn })nn .directive(‘bsTabs’, function($window, $animate, $tab, $parse) {nn var defaults = $tab.defaults;nn return {n require: [‘?ngModel’, ‘bsTabs’],n transclude: true,n scope: true,n controller: [‘$scope’, ‘$element’, ‘$attrs’, $tab.controller],n templateUrl: function(element, attr) {n return attr.template || defaults.template;n },n link: function postLink(scope, element, attrs, controllers) {nn var ngModelCtrl = controllers;n var bsTabsCtrl = controllers;nn // DEPRECATED: ngModel, please use bsActivePanen // ‘ngModel’ is deprecated bacause if interferes with form validationn // and status, so avoid using it here.n if(ngModelCtrl) {n console.warn(‘Usage of ngModel is deprecated, please use bsActivePane instead!’);nn // Update the modelValue followingn bsTabsCtrl.$activePaneChangeListeners.push(function() {n ngModelCtrl.$setViewValue(bsTabsCtrl.$panes.$active);n });nn // modelValue -> $formatters -> viewValuen ngModelCtrl.$formatters.push(function(modelValue) {n // console.warn(‘$formatter("%s"): modelValue=%o (%o)’, element.attr(‘ng-model’), modelValue, typeof modelValue);n bsTabsCtrl.$setActive(modelValue * 1);n return modelValue;n });nn }nn if (attrs.bsActivePane) {n // adapted from angularjs ngModelController bindingsn // github.com/angular/angular.js/blob/v1.3.1/src%2Fng%2Fdirective%2Finput.js#L1730n var parsedBsActivePane = $parse(attrs.bsActivePane);nn // Update bsActivePane value with changen bsTabsCtrl.$activePaneChangeListeners.push(function() {n parsedBsActivePane.assign(scope, bsTabsCtrl.$panes.$active);n });nn // watch bsActivePane for value changesn scope.$watch(attrs.bsActivePane, function(newValue, oldValue) {n bsTabsCtrl.$setActive(newValue * 1);n }, true);n }n }n };nn })nn .directive(‘bsPane’, function($window, $animate, $sce) {nn return {n require: [‘^?ngModel’, ‘^bsTabs’],n scope: true,n link: function postLink(scope, element, attrs, controllers) {nn var ngModelCtrl = controllers;n var bsTabsCtrl = controllers;nn // Add base classn element.addClass(‘tab-pane’);nn // Observe title attribute for changen attrs.$observe(‘title’, function(newValue, oldValue) {n scope.title = $sce.trustAsHtml(newValue);n });nn // Add animation classn if(bsTabsCtrl.$options.animation) {n element.addClass(bsTabsCtrl.$options.animation);n }nn // Push pane to parent bsTabs controllern bsTabsCtrl.$push(scope);nn // remove pane from tab controller when pane is destroyedn scope.$on(‘$destroy’, function() {n bsTabsCtrl.$remove(scope);n });nn function render() {n var index = bsTabsCtrl.$panes.indexOf(scope);n var active = bsTabsCtrl.$panes.$active;n $animate[index === active ? ‘addClass’ : ‘removeClass’](element, bsTabsCtrl.$options.activeClass);n }nn bsTabsCtrl.$activePaneChangeListeners.push(function() {n render();n });n render();nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.scrollspy’, [‘mgcrea.ngStrap.helpers.debounce’, ‘mgcrea.ngStrap.helpers.dimensions’])nn .provider(‘$scrollspy’, function() {nn // Pool of registered spiesn var spies = this.$$spies = {};nn var defaults = this.defaults = {n debounce: 150,n throttle: 100,n offset: 100n };nn this.$get = function($window, $document, $rootScope, dimensions, debounce, throttle) {nn var windowEl = angular.element($window);n var docEl = angular.element($document.prop(‘documentElement’));n var bodyEl = angular.element($window.document.body);nn // Helper functionsnn function nodeName(element, name) {n return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();n }nn function ScrollSpyFactory(config) {nn // Common varsn var options = angular.extend({}, defaults, config);n if(!options.element) options.element = bodyEl;n var isWindowSpy = nodeName(options.element, ‘body’);n var scrollEl = isWindowSpy ? windowEl : options.element;n var scrollId = isWindowSpy ? ‘window’ : options.id;nn // Use existing spyn if(spies) {n spies.$$count++;n return spies;n }nn var $scrollspy = {};nn // Private varsn var unbindViewContentLoaded, unbindIncludeContentLoaded;n var trackedElements = $scrollspy.$trackedElements = [];n var sortedElements = [];n var activeTarget;n var debouncedCheckPosition;n var throttledCheckPosition;n var debouncedCheckOffsets;n var viewportHeight;n var scrollTop;nn $scrollspy.init = function() {nn // Setup internal ref countern this.$$count = 1;nn // Bind eventsn debouncedCheckPosition = debounce(this.checkPosition, options.debounce);n throttledCheckPosition = throttle(this.checkPosition, options.throttle);n scrollEl.on(‘click’, this.checkPositionWithEventLoop);n windowEl.on(‘resize’, debouncedCheckPosition);n scrollEl.on(‘scroll’, throttledCheckPosition);nn debouncedCheckOffsets = debounce(this.checkOffsets, options.debounce);n unbindViewContentLoaded = $rootScope.$on(‘$viewContentLoaded’, debouncedCheckOffsets);n unbindIncludeContentLoaded = $rootScope.$on(‘$includeContentLoaded’, debouncedCheckOffsets);n debouncedCheckOffsets();nn // Register spy for reusen if(scrollId) {n spies = $scrollspy;n }nn };nn $scrollspy.destroy = function() {nn // Check internal ref countern this.$$count–;n if(this.$$count > 0) {n return;n }nn // Unbind eventsn scrollEl.off(‘click’, this.checkPositionWithEventLoop);n windowEl.off(‘resize’, debouncedCheckPosition);n scrollEl.off(‘scroll’, throttledCheckPosition);n unbindViewContentLoaded();n unbindIncludeContentLoaded();n if (scrollId) {n delete spies;n }n };nn $scrollspy.checkPosition = function() {nn // Not ready yetn if(!sortedElements.length) return;nn // Calculate the scroll positionn scrollTop = (isWindowSpy ? $window.pageYOffset : scrollEl.prop(‘scrollTop’)) || 0;nn // Calculate the viewport height for use by the componentsn viewportHeight = Math.max($window.innerHeight, docEl.prop(‘clientHeight’));nn // Activate first element if scroll is smallern if(scrollTop < sortedElements.offsetTop && activeTarget !== sortedElements.target) {n return $scrollspy.$activateElement(sortedElements);n }nn // Activate proper elementn for (var i = sortedElements.length; i–;) {n if(angular.isUndefined(sortedElements.offsetTop) || sortedElements.offsetTop === null) continue;n if(activeTarget === sortedElements.target) continue;n if(scrollTop < sortedElements.offsetTop) continue;n if(sortedElements[i + 1] && scrollTop > sortedElements[i + 1].offsetTop) continue;n return $scrollspy.$activateElement(sortedElements);n }nn };nn $scrollspy.checkPositionWithEventLoop = function() {n // IE 9 throws an error if we use ‘this’ instead of ‘$scrollspy’n // in this setTimeout calln setTimeout($scrollspy.checkPosition, 1);n };nn // Protected methodsnn $scrollspy.$activateElement = function(element) {n if(activeTarget) {n var activeElement = $scrollspy.$getTrackedElement(activeTarget);n if(activeElement) {n activeElement.source.removeClass(‘active’);n if(nodeName(activeElement.source, ‘li’) && nodeName(activeElement.source.parent().parent(), ‘li’)) {n activeElement.source.parent().parent().removeClass(‘active’);n }n }n }n activeTarget = element.target;n element.source.addClass(‘active’);n if(nodeName(element.source, ‘li’) && nodeName(element.source.parent().parent(), ‘li’)) {n element.source.parent().parent().addClass(‘active’);n }n };nn $scrollspy.$getTrackedElement = function(target) {n return trackedElements.filter(function(obj) {n return obj.target === target;n })[0];n };nn // Track offsets behaviornn $scrollspy.checkOffsets = function() {nn angular.forEach(trackedElements, function(trackedElement) {n var targetElement = document.querySelector(trackedElement.target);n trackedElement.offsetTop = targetElement ? dimensions.offset(targetElement).top : null;n if(options.offset && trackedElement.offsetTop !== null) trackedElement.offsetTop -= options.offset * 1;n });nn sortedElements = trackedElementsn .filter(function(el) {n return el.offsetTop !== null;n })n .sort(function(a, b) {n return a.offsetTop - b.offsetTop;n });nn debouncedCheckPosition();nn };nn $scrollspy.trackElement = function(target, source) {n trackedElements.push({target: target, source: source});n };nn $scrollspy.untrackElement = function(target, source) {n var toDelete;n for (var i = trackedElements.length; i–;) {n if(trackedElements.target === target && trackedElements.source === source) {n toDelete = i;n break;n }n }n trackedElements = trackedElements.splice(toDelete, 1);n };nn $scrollspy.activate = function(i) {n trackedElements.addClass(‘active’);n };nn // Initialize pluginnn $scrollspy.init();n return $scrollspy;nn }nn return ScrollSpyFactory;nn };nn })nn .directive(‘bsScrollspy’, function($rootScope, debounce, dimensions, $scrollspy) {nn return {n restrict: ‘EAC’,n link: function postLink(scope, element, attr) {nn var options = {scope: scope};n angular.forEach([‘offset’, ‘target’], function(key) {n if(angular.isDefined(attr)) options = attr;n });nn var scrollspy = $scrollspy(options);n scrollspy.trackElement(options.target, element);nn scope.$on(‘$destroy’, function() {n if (scrollspy) {n scrollspy.untrackElement(options.target, element);n scrollspy.destroy();n }n options = null;n scrollspy = null;n });nn }n };nn })nnn .directive(‘bsScrollspyList’, function($rootScope, debounce, dimensions, $scrollspy) {nn return {n restrict: ‘A’,n compile: function postLink(element, attr) {n var children = element.querySelectorAll(‘li > a’);n angular.forEach(children, function(child) {n var childEl = angular.element(child);n childEl.parent().attr(‘bs-scrollspy’, ”).attr(‘data-target’, childEl.attr(‘href’));n });n }nn };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.timepicker’, [n ‘mgcrea.ngStrap.helpers.dateParser’,n ‘mgcrea.ngStrap.helpers.dateFormatter’,n ‘mgcrea.ngStrap.tooltip’])nn .provider(‘$timepicker’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n prefixClass: ‘timepicker’,n placement: ‘bottom-left’,n template: ‘timepicker/timepicker.tpl.html’,n trigger: ‘focus’,n container: false,n keyboard: true,n html: false,n delay: 0,n // lang: $locale.id,n useNative: true,n timeType: ‘date’,n timeFormat: ‘shortTime’,n modelTimeFormat: null,n autoclose: false,n minTime: -Infinity,n maxTime: +Infinity,n length: 5,n hourStep: 1,n minuteStep: 5,n iconUp: ‘glyphicon glyphicon-chevron-up’,n iconDown: ‘glyphicon glyphicon-chevron-down’,n arrowBehavior: ‘pager’n };nn this.$get = function($window, $document, $rootScope, $sce, $dateFormatter, $tooltip, $timeout) {nn var bodyEl = angular.element($window.document.body);n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);n var isTouch = (‘createTouch’ in $window.document) && isNative;n if(!defaults.lang) defaults.lang = $dateFormatter.getDefaultLocale();nn function timepickerFactory(element, controller, config) {nn var $timepicker = $tooltip(element, angular.extend({}, defaults, config));n var parentScope = config.scope;n var options = $timepicker.$options;n var scope = $timepicker.$scope;nn var lang = options.lang;n var formatDate = function(date, format) {n return $dateFormatter.formatDate(date, format, lang);n };nn // View varsnn var selectedIndex = 0;n var startDate = controller.$dateValue || new Date();n var viewDate = {hour: startDate.getHours(), meridian: startDate.getHours() < 12, minute: startDate.getMinutes(), second: startDate.getSeconds(), millisecond: startDate.getMilliseconds()};nn var format = $dateFormatter.getDatetimeFormat(options.timeFormat, lang);nn var hoursFormat = $dateFormatter.hoursFormat(format),n timeSeparator = $dateFormatter.timeSeparator(format),n minutesFormat = $dateFormatter.minutesFormat(format),n showAM = $dateFormatter.showAM(format);nn scope.$iconUp = options.iconUp;n scope.$iconDown = options.iconDown;nn // Scope methodsnn scope.$select = function(date, index) {n $timepicker.select(date, index);n };n scope.$moveIndex = function(value, index) {n $timepicker.$moveIndex(value, index);n };n scope.$switchMeridian = function(date) {n $timepicker.switchMeridian(date);n };nn // Public methodsnn $timepicker.update = function(date) {n // console.warn(‘$timepicker.update() newValue=%o’, date);n if(angular.isDate(date) && !isNaN(date.getTime())) {n $timepicker.$date = date;n angular.extend(viewDate, {hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds(), millisecond: date.getMilliseconds()});n $timepicker.$build();n } else if(!$timepicker.$isBuilt) {n $timepicker.$build();n }n };nn $timepicker.select = function(date, index, keep) {n // console.warn(‘$timepicker.select’, date, scope.$mode);n if(!controller.$dateValue || isNaN(controller.$dateValue.getTime())) controller.$dateValue = new Date(1970, 0, 1);n if(!angular.isDate(date)) date = new Date(date);n if(index === 0) controller.$dateValue.setHours(date.getHours());n else if(index === 1) controller.$dateValue.setMinutes(date.getMinutes());n controller.$setViewValue(angular.copy(controller.$dateValue));n controller.$render();n if(options.autoclose && !keep) {n $timeout(function() { $timepicker.hide(true); });n }n };nn $timepicker.switchMeridian = function(date) {n if (!controller.$dateValue || isNaN(controller.$dateValue.getTime())) {n return;n }n var hours = (date || controller.$dateValue).getHours();n controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12);n controller.$setViewValue(angular.copy(controller.$dateValue));n controller.$render();n };nn // Protected methodsnn $timepicker.$build = function() {n // console.warn(‘$timepicker.$build() viewDate=%o’, viewDate);n var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10);n var hours = [], hour;n for(i = 0; i < options.length; i++) {n hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep);n hours.push({date: hour, label: formatDate(hour, hoursFormat), selected: $timepicker.$date && $timepicker.$isSelected(hour, 0), disabled: $timepicker.$isDisabled(hour, 0)});n }n var minutes = [], minute;n for(i = 0; i < options.length; i++) {n minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep);n minutes.push({date: minute, label: formatDate(minute, minutesFormat), selected: $timepicker.$date && $timepicker.$isSelected(minute, 1), disabled: $timepicker.$isDisabled(minute, 1)});n }nn var rows = [];n for(i = 0; i < options.length; i++) {n rows.push([hours, minutes]);n }n scope.rows = rows;n scope.showAM = showAM;n scope.isAM = ($timepicker.$date || hours.date).getHours() < 12;n scope.timeSeparator = timeSeparator;n $timepicker.$isBuilt = true;n };nn $timepicker.$isSelected = function(date, index) {n if(!$timepicker.$date) return false;n else if(index === 0) {n return date.getHours() === $timepicker.$date.getHours();n } else if(index === 1) {n return date.getMinutes() === $timepicker.$date.getMinutes();n }n };nn $timepicker.$isDisabled = function(date, index) {n var selectedTime;n if(index === 0) {n selectedTime = date.getTime() + viewDate.minute * 6e4;n } else if(index === 1) {n selectedTime = date.getTime() + viewDate.hour * 36e5;n }n return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1;n };nn scope.$arrowAction = function (value, index) {n if (options.arrowBehavior === ‘picker’) {n $timepicker.$setTimeByStep(value,index);n } else {n $timepicker.$moveIndex(value,index);n }n };nn $timepicker.$setTimeByStep = function(value, index) {n var newDate = new Date($timepicker.$date);n var hours = newDate.getHours(), hoursLength = formatDate(newDate, hoursFormat).length;n var minutes = newDate.getMinutes(), minutesLength = formatDate(newDate, minutesFormat).length;n if (index === 0) {n newDate.setHours(hours - (parseInt(options.hourStep, 10) * value));n }n else {n newDate.setMinutes(minutes - (parseInt(options.minuteStep, 10) * value));n }n $timepicker.select(newDate, index, true);n };nn $timepicker.$moveIndex = function(value, index) {n var targetDate;n if(index === 0) {n targetDate = new Date(1970, 0, 1, viewDate.hour + (value * options.length), viewDate.minute);n angular.extend(viewDate, {hour: targetDate.getHours()});n } else if(index === 1) {n targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + (value * options.length * options.minuteStep));n angular.extend(viewDate, {minute: targetDate.getMinutes()});n }n $timepicker.$build();n };nn $timepicker.$onMouseDown = function(evt) {n // Prevent blur on mousedown on .dropdown-menun if(evt.target.nodeName.toLowerCase() !== ‘input’) evt.preventDefault();n evt.stopPropagation();n // Emulate click for mobile devicesn if(isTouch) {n var targetEl = angular.element(evt.target);n if(targetEl.nodeName.toLowerCase() !== ‘button’) {n targetEl = targetEl.parent();n }n targetEl.triggerHandler(‘click’);n }n };nn $timepicker.$onKeyDown = function(evt) {n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;n evt.preventDefault();n evt.stopPropagation();nn // Close on entern if(evt.keyCode === 13) return $timepicker.hide(true);nn // Navigate with keyboardn var newDate = new Date($timepicker.$date);n var hours = newDate.getHours(), hoursLength = formatDate(newDate, hoursFormat).length;n var minutes = newDate.getMinutes(), minutesLength = formatDate(newDate, minutesFormat).length;n var lateralMove = /(37|39)/.test(evt.keyCode);n var count = 2 + showAM * 1;nn // Navigate indexes (left, right)n if (lateralMove) {n if(evt.keyCode === 37) selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1;n else if(evt.keyCode === 39) selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0;n }nn // Update values (up, down)n var selectRange = [0, hoursLength];n if(selectedIndex === 0) {n if(evt.keyCode === 38) newDate.setHours(hours - parseInt(options.hourStep, 10));n else if(evt.keyCode === 40) newDate.setHours(hours + parseInt(options.hourStep, 10));n // re-calculate hours length because we have changed hours valuen hoursLength = formatDate(newDate, hoursFormat).length;n selectRange = [0, hoursLength];n } else if(selectedIndex === 1) {n if(evt.keyCode === 38) newDate.setMinutes(minutes - parseInt(options.minuteStep, 10));n else if(evt.keyCode === 40) newDate.setMinutes(minutes + parseInt(options.minuteStep, 10));n // re-calculate minutes length because we have changes minutes valuen minutesLength = formatDate(newDate, minutesFormat).length;n selectRange = [hoursLength + 1, hoursLength + 1 + minutesLength];n } else if(selectedIndex === 2) {n if(!lateralMove) $timepicker.switchMeridian();n selectRange = [hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3];n }n $timepicker.select(newDate, selectedIndex, true);n createSelection(selectRange, selectRange);n parentScope.$digest();n };nn // Privatenn function createSelection(start, end) {n if(element.createTextRange) {n var selRange = element.createTextRange();n selRange.collapse(true);n selRange.moveStart(‘character’, start);n selRange.moveEnd(‘character’, end);n selRange.select();n } else if(element.setSelectionRange) {n element.setSelectionRange(start, end);n } else if(angular.isUndefined(element.selectionStart)) {n element.selectionStart = start;n element.selectionEnd = end;n }n }nn function focusElement() {n element.focus();n }nn // Overridesnn var _init = $timepicker.init;n $timepicker.init = function() {n if(isNative && options.useNative) {n element.prop(‘type’, ‘time’);n element.css(‘-webkit-appearance’, ‘textfield’);n return;n } else if(isTouch) {n element.prop(‘type’, ‘text’);n element.attr(‘readonly’, ‘true’);n element.on(‘click’, focusElement);n }n _init();n };nn var _destroy = $timepicker.destroy;n $timepicker.destroy = function() {n if(isNative && options.useNative) {n element.off(‘click’, focusElement);n }n _destroy();n };nn var _show = $timepicker.show;n $timepicker.show = function() {n _show();n // use timeout to hookup the events to preventn // event bubbling from being processed imediately.n $timeout(function() {n $timepicker.$element.on(isTouch ? ‘touchstart’ : ‘mousedown’, $timepicker.$onMouseDown);n if(options.keyboard) {n element.on(‘keydown’, $timepicker.$onKeyDown);n }n }, 0, false);n };nn var _hide = $timepicker.hide;n $timepicker.hide = function(blur) {n if(!$timepicker.$isShown) return;n $timepicker.$element.off(isTouch ? ‘touchstart’ : ‘mousedown’, $timepicker.$onMouseDown);n if(options.keyboard) {n element.off(‘keydown’, $timepicker.$onKeyDown);n }n _hide(blur);n };nn return $timepicker;nn }nn timepickerFactory.defaults = defaults;n return timepickerFactory;nn };nn })nnn .directive(‘bsTimepicker’, function($window, $parse, $q, $dateFormatter, $dateParser, $timepicker) {nn var defaults = $timepicker.defaults;n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;nn return {n restrict: ‘EAC’,n require: ‘ngModel’,n link: function postLink(scope, element, attr, controller) {nn // Directive optionsn var options = {scope: scope, controller: controller};n angular.forEach([‘placement’, ‘container’, ‘delay’, ‘trigger’, ‘keyboard’, ‘html’, ‘animation’, ‘template’, ‘autoclose’, ‘timeType’, ‘timeFormat’, ‘modelTimeFormat’, ‘useNative’, ‘hourStep’, ‘minuteStep’, ‘length’, ‘arrowBehavior’, ‘iconUp’, ‘iconDown’, ‘id’], function(key) {n if(angular.isDefined(attr)) options = attr;n });nn // Visibility binding supportn attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {n if(!timepicker || !angular.isDefined(newValue)) return;n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(timepicker),?/i);n newValue === true ? timepicker.show() : timepicker.hide();n });nn // Initialize timepickern if(isNative && (options.useNative || defaults.useNative)) options.timeFormat = ‘HH:mm’;n var timepicker = $timepicker(element, controller, options);n options = timepicker.$options;nn var lang = options.lang;n var formatDate = function(date, format) {n return $dateFormatter.formatDate(date, format, lang);n };nn // Initialize parsern var dateParser = $dateParser({format: options.timeFormat, lang: lang});nn // Observe attributes for changesn angular.forEach([‘minTime’, ‘maxTime’], function(key) {n // console.warn(‘attr.$observe(%s)’, key, attr);n angular.isDefined(attr) && attr.$observe(key, function(newValue) {n timepicker.$options = dateParser.getTimeForAttribute(key, newValue);n !isNaN(timepicker.$options) && timepicker.$build();n validateAgainstMinMaxTime(controller.$dateValue);n });n });nn // Watch model for changesn scope.$watch(attr.ngModel, function(newValue, oldValue) {n // console.warn(‘scope.$watch(%s)’, attr.ngModel, newValue, oldValue, controller.$dateValue);n timepicker.update(controller.$dateValue);n }, true);nn function validateAgainstMinMaxTime(parsedTime) {n if (!angular.isDate(parsedTime)) return;n var isMinValid = isNaN(options.minTime) || new Date(parsedTime.getTime()).setFullYear(1970, 0, 1) >= options.minTime;n var isMaxValid = isNaN(options.maxTime) || new Date(parsedTime.getTime()).setFullYear(1970, 0, 1) <= options.maxTime;n var isValid = isMinValid && isMaxValid;n controller.$setValidity(‘date’, isValid);n controller.$setValidity(‘min’, isMinValid);n controller.$setValidity(‘max’, isMaxValid);n // Only update the model when we have a valid daten if(!isValid) {n return;n }n controller.$dateValue = parsedTime;n }nn // viewValue -> $parsers -> modelValuen controller.$parsers.unshift(function(viewValue) {n // console.warn(‘$parser("%s"): viewValue=%o’, element.attr(‘ng-model’), viewValue);n // Null values should correctly reset the model value & validityn if(!viewValue) {n // BREAKING CHANGE:n // return null (not undefined) when input value is empty, so angularjs 1.3n // ngModelController can go ahead and run validators, like ngRequiredn controller.$setValidity(‘date’, true);n return null;n }n var parsedTime = angular.isDate(viewValue) ? viewValue : dateParser.parse(viewValue, controller.$dateValue);n if(!parsedTime || isNaN(parsedTime.getTime())) {n controller.$setValidity(‘date’, false);n // return undefined, causes ngModelController ton // invalidate model valuen return;n } else {n validateAgainstMinMaxTime(parsedTime);n }n if(options.timeType === ‘string’) {n return formatDate(parsedTime, options.modelTimeFormat || options.timeFormat);n } else if(options.timeType === ‘number’) {n return controller.$dateValue.getTime();n } else if(options.timeType === ‘unix’) {n return controller.$dateValue.getTime() / 1000;n } else if(options.timeType === ‘iso’) {n return controller.$dateValue.toISOString();n } else {n return new Date(controller.$dateValue);n }n });nn // modelValue -> $formatters -> viewValuen controller.$formatters.push(function(modelValue) {n // console.warn(‘$formatter("%s"): modelValue=%o (%o)’, element.attr(‘ng-model’), modelValue, typeof modelValue);n var date;n if(angular.isUndefined(modelValue) || modelValue === null) {n date = NaN;n } else if(angular.isDate(modelValue)) {n date = modelValue;n } else if(options.timeType === ‘string’) {n date = dateParser.parse(modelValue, null, options.modelTimeFormat);n } else if(options.timeType === ‘unix’) {n date = new Date(modelValue * 1000);n } else {n date = new Date(modelValue);n }n // Setup default value?n // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5);n controller.$dateValue = date;n return getTimeFormattedString();n });nn // viewValue -> elementn controller.$render = function() {n // console.warn(‘$render("%s"): viewValue=%o’, element.attr(‘ng-model’), controller.$viewValue);n element.val(getTimeFormattedString());n };nn function getTimeFormattedString() {n return !controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? ” : formatDate(controller.$dateValue, options.timeFormat);n }nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if (timepicker) timepicker.destroy();n options = null;n timepicker = null;n });nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.tooltip’, [‘mgcrea.ngStrap.helpers.dimensions’])nn .provider(‘$tooltip’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n customClass: ”,n prefixClass: ‘tooltip’,n prefixEvent: ‘tooltip’,n container: false,n target: false,n placement: ‘top’,n template: ‘tooltip/tooltip.tpl.html’,n contentTemplate: false,n trigger: ‘hover focus’,n keyboard: false,n html: false,n show: false,n title: ”,n type: ”,n delay: 0,n autoClose: false,n bsEnabled: truen };nn this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $sce, dimensions, $$rAF, $timeout) {nn var trim = String.prototype.trim;n var isTouch = ‘createTouch’ in $window.document;n var htmlReplaceRegExp = /ng-bind="/ig;n var $body = angular.element($window.document);nn function TooltipFactory(element, config) {nn var $tooltip = {};nn // Common varsn var nodeName = element.nodeName.toLowerCase();n var options = $tooltip.$options = angular.extend({}, defaults, config);n $tooltip.$promise = fetchTemplate(options.template);n var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new();n if(options.delay && angular.isString(options.delay)) {n var split = options.delay.split(‘,’).map(parseFloat);n options.delay = split.length > 1 ? {show: split, hide: split} : split;n }nn // store $id to identify the triggering element in eventsn // give priority to options.id, otherwise, try to usen // element id if definedn $tooltip.$id = options.id || element.attr(‘id’) || ”;nn // Support scope as string optionsn if(options.title) {n scope.title = $sce.trustAsHtml(options.title);n }nn // Provide scope helpersn scope.$setEnabled = function(isEnabled) {n scope.$$postDigest(function() {n $tooltip.setEnabled(isEnabled);n });n };n scope.$hide = function() {n scope.$$postDigest(function() {n $tooltip.hide();n });n };n scope.$show = function() {n scope.$$postDigest(function() {n $tooltip.show();n });n };n scope.$toggle = function() {n scope.$$postDigest(function() {n $tooltip.toggle();n });n };n // Publish isShown as a protected var on scopen $tooltip.$isShown = scope.$isShown = false;nn // Private varsn var timeout, hoverState;nn // Support contentTemplate optionn if(options.contentTemplate) {n $tooltip.$promise = $tooltip.$promise.then(function(template) {n var templateEl = angular.element(template);n return fetchTemplate(options.contentTemplate)n .then(function(contentTemplate) {n var contentEl = findElement(‘’, templateEl);n if(!contentEl.length) contentEl = findElement(‘’, templateEl);n contentEl.removeAttr(‘ng-bind’).html(contentTemplate);n return templateEl.outerHTML;n });n });n }nn // Fetch, compile then initialize tooltipn var tipLinker, tipElement, tipTemplate, tipContainer, tipScope;n $tooltip.$promise.then(function(template) {n if(angular.isObject(template)) template = template.data;n if(options.html) template = template.replace(htmlReplaceRegExp, ‘ng-bind-html="’);n template = trim.apply(template);n tipTemplate = template;n tipLinker = $compile(template);n $tooltip.init();n });nn $tooltip.init = function() {nn // Options: delayn if (options.delay && angular.isNumber(options.delay)) {n options.delay = {n show: options.delay,n hide: options.delayn };n }nn // Replace trigger on touch devices ?n // if(isTouch && options.trigger === defaults.trigger) {n // options.trigger.replace(/hover/g, ‘click’);n // }nn // Options : containern if(options.container === ‘self’) {n tipContainer = element;n } else if(angular.isElement(options.container)) {n tipContainer = options.container;n } else if(options.container) {n tipContainer = findElement(options.container);n }nn // Options: triggern bindTriggerEvents();nn // Options: targetn if(options.target) {n options.target = angular.isElement(options.target) ? options.target : findElement(options.target);n }nn // Options: shown if(options.show) {n scope.$$postDigest(function() {n options.trigger === ‘focus’ ? element.focus() : $tooltip.show();n });n }nn };nn $tooltip.destroy = function() {nn // Unbind eventsn unbindTriggerEvents();nn // Remove elementn destroyTipElement();nn // Destroy scopen scope.$destroy();nn };nn $tooltip.enter = function() {nn clearTimeout(timeout);n hoverState = ‘in’;n if (!options.delay || !options.delay.show) {n return $tooltip.show();n }nn timeout = setTimeout(function() {n if (hoverState ===‘in’) $tooltip.show();n }, options.delay.show);nn };nn $tooltip.show = function() {n if (!options.bsEnabled || $tooltip.$isShown) return;nn scope.$emit(options.prefixEvent + ‘.show.before’, $tooltip);n var parent, after;n if (options.container) {n parent = tipContainer;n if (tipContainer.lastChild) {n after = angular.element(tipContainer.lastChild);n } else {n after = null;n }n } else {n parent = null;n after = element;n }nnn // Hide any existing tipElementn if(tipElement) destroyTipElement();n // Fetch a cloned element linked from templaten tipScope = $tooltip.$scope.$new();n tipElement = $tooltip.$element = tipLinker(tipScope, function(clonedElement, scope) {});nn // Set the initial positioning. Make the tooltip invisiblen // so IE doesn’t try to focus on it off screen.n tipElement.css({top: ‘-9999px’, left: ‘-9999px’, display: ‘block’, visibility: ‘hidden’});nn // Options: animationn if(options.animation) tipElement.addClass(options.animation);n // Options: typen if(options.type) tipElement.addClass(options.prefixClass + ‘-’ + options.type);n // Options: custom classesn if(options.customClass) tipElement.addClass(options.customClass);nn // Support v1.3+ $animaten // github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9n var promise = $animate.enter(tipElement, parent, after, enterAnimateCallback);n if(promise && promise.then) promise.then(enterAnimateCallback);nn $tooltip.$isShown = scope.$isShown = true;n safeDigest(scope);n $$rAF(function () {n $tooltip.$applyPlacement();nn // Once placed, make the tooltip visiblen if(tipElement) tipElement.css({visibility: ‘visible’});n }); // var a = bodyEl.offsetWidth + 1; ?nn // Bind eventsn if(options.keyboard) {n if(options.trigger !== ‘focus’) {n $tooltip.focus();n }n bindKeyboardEvents();n }nn if(options.autoClose) {n bindAutoCloseEvents();n }nn };nn function enterAnimateCallback() {n scope.$emit(options.prefixEvent + ‘.show’, $tooltip);n }nn $tooltip.leave = function() {nn clearTimeout(timeout);n hoverState = ‘out’;n if (!options.delay || !options.delay.hide) {n return $tooltip.hide();n }n timeout = setTimeout(function () {n if (hoverState === ‘out’) {n $tooltip.hide();n }n }, options.delay.hide);nn };nn var _blur;n var _tipToHide;n $tooltip.hide = function(blur) {nn if(!$tooltip.$isShown) return;n scope.$emit(options.prefixEvent + ‘.hide.before’, $tooltip);nn // store blur value for leaveAnimateCallback to usen _blur = blur;nn // store current tipElement reference to usen // in leaveAnimateCallbackn _tipToHide = tipElement;nn // Support v1.3+ $animaten // github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9n var promise = $animate.leave(tipElement, leaveAnimateCallback);n if(promise && promise.then) promise.then(leaveAnimateCallback);nn $tooltip.$isShown = scope.$isShown = false;n safeDigest(scope);nn // Unbind eventsn if(options.keyboard && tipElement !== null) {n unbindKeyboardEvents();n }nn if(options.autoClose && tipElement !== null) {n unbindAutoCloseEvents();n }n };nn function leaveAnimateCallback() {n scope.$emit(options.prefixEvent + ‘.hide’, $tooltip);nn // check if current tipElement still referencesn // the same element when hide was calledn if (tipElement === _tipToHide) {n // Allow to blur the input when hidden, like when pressing enter keyn if(_blur && options.trigger === ‘focus’) {n return element.blur();n }nn // clean up child scopesn destroyTipElement();n }n }nn $tooltip.toggle = function() {n $tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();n };nn $tooltip.focus = function() {n tipElement.focus();n };nn $tooltip.setEnabled = function(isEnabled) {n options.bsEnabled = isEnabled;n };nn // Protected methodsnn $tooltip.$applyPlacement = function() {n if(!tipElement) return;nn // Determine if we’re doing an auto or normal placementn var placement = options.placement,n autoToken = /\s?auto?\s?/i,n autoPlace = autoToken.test(placement);nn if (autoPlace) {n placement = placement.replace(autoToken, ”) || defaults.placement;n }nn // Need to add the position class before we getn // the offsetsn tipElement.addClass(options.placement);nn // Get the position of the target elementn // and the height and width of the tooltip so we can center it.n var elementPosition = getPosition(),n tipWidth = tipElement.prop(‘offsetWidth’),n tipHeight = tipElement.prop(‘offsetHeight’);nn // If we’re auto placing, we need to check the positioningn if (autoPlace) {n var originalPlacement = placement;n var container = options.container ? angular.element(document.querySelector(options.container)) : element.parent();n var containerPosition = getPosition(container);nn // Determine if the vertical placementn if (originalPlacement.indexOf(‘bottom’) >= 0 && elementPosition.bottom + tipHeight > containerPosition.bottom) {n placement = originalPlacement.replace(‘bottom’, ‘top’);n } else if (originalPlacement.indexOf(‘top’) >= 0 && elementPosition.top - tipHeight < containerPosition.top) {n placement = originalPlacement.replace(‘top’, ‘bottom’);n }nn // Determine the horizontal placementn // The exotic placements of left and right are opposite of the standard placements. Their arrows are put on the left/rightn // and flow in the opposite direction of their placement.n if ((originalPlacement === ‘right’ || originalPlacement === ‘bottom-left’ || originalPlacement === ‘top-left’) &&n elementPosition.right + tipWidth > containerPosition.width) {nn placement = originalPlacement === ‘right’ ? ‘left’ : placement.replace(‘left’, ‘right’);n } else if ((originalPlacement === ‘left’ || originalPlacement === ‘bottom-right’ || originalPlacement === ‘top-right’) &&n elementPosition.left - tipWidth < containerPosition.left) {nn placement = originalPlacement === ‘left’ ? ‘right’ : placement.replace(‘right’, ‘left’);n }nn tipElement.removeClass(originalPlacement).addClass(placement);n }nn // Get the tooltip’s top and left coordinates to center it with this directive.n var tipPosition = getCalculatedOffset(placement, elementPosition, tipWidth, tipHeight);n applyPlacementCss(tipPosition.top, tipPosition.left);n };nn $tooltip.$onKeyUp = function(evt) {n if (evt.which === 27 && $tooltip.$isShown) {n $tooltip.hide();n evt.stopPropagation();n }n };nn $tooltip.$onFocusKeyUp = function(evt) {n if (evt.which === 27) {n element.blur();n evt.stopPropagation();n }n };nn $tooltip.$onFocusElementMouseDown = function(evt) {n evt.preventDefault();n evt.stopPropagation();n // Some browsers do not auto-focus buttons (eg. Safari)n $tooltip.$isShown ? element.blur() : element.focus();n };nn // bind/unbind eventsn function bindTriggerEvents() {n var triggers = options.trigger.split(‘ ’);n angular.forEach(triggers, function(trigger) {n if(trigger === ‘click’) {n element.on(‘click’, $tooltip.toggle);n } else if(trigger !== ‘manual’) {n element.on(trigger === ‘hover’ ? ‘mouseenter’ : ‘focus’, $tooltip.enter);n element.on(trigger === ‘hover’ ? ‘mouseleave’ : ‘blur’, $tooltip.leave);n nodeName === ‘button’ && trigger !== ‘hover’ && element.on(isTouch ? ‘touchstart’ : ‘mousedown’, $tooltip.$onFocusElementMouseDown);n }n });n }nn function unbindTriggerEvents() {n var triggers = options.trigger.split(‘ ’);n for (var i = triggers.length; i–;) {n var trigger = triggers;n if(trigger === ‘click’) {n element.off(‘click’, $tooltip.toggle);n } else if(trigger !== ‘manual’) {n element.off(trigger === ‘hover’ ? ‘mouseenter’ : ‘focus’, $tooltip.enter);n element.off(trigger === ‘hover’ ? ‘mouseleave’ : ‘blur’, $tooltip.leave);n nodeName === ‘button’ && trigger !== ‘hover’ && element.off(isTouch ? ‘touchstart’ : ‘mousedown’, $tooltip.$onFocusElementMouseDown);n }n }n }nn function bindKeyboardEvents() {n if(options.trigger !== ‘focus’) {n tipElement.on(‘keyup’, $tooltip.$onKeyUp);n } else {n element.on(‘keyup’, $tooltip.$onFocusKeyUp);n }n }nn function unbindKeyboardEvents() {n if(options.trigger !== ‘focus’) {n tipElement.off(‘keyup’, $tooltip.$onKeyUp);n } else {n element.off(‘keyup’, $tooltip.$onFocusKeyUp);n }n }nn var _autoCloseEventsBinded = false;n function bindAutoCloseEvents() {n // use timeout to hookup the events to preventn // event bubbling from being processed imediately.n $timeout(function() {n // Stop propagation when clicking inside tooltipn tipElement.on(‘click’, stopEventPropagation);nn // Hide when clicking outside tooltipn $body.on(‘click’, $tooltip.hide);nn _autoCloseEventsBinded = true;n }, 0, false);n }nn function unbindAutoCloseEvents() {n if (_autoCloseEventsBinded) {n tipElement.off(‘click’, stopEventPropagation);n $body.off(‘click’, $tooltip.hide);n _autoCloseEventsBinded = false;n }n }nn function stopEventPropagation(event) {n event.stopPropagation();n }nn // Private methodsnn function getPosition($element) {n $element = $element || (options.target || element);nn var el = $element;nn var elRect = el.getBoundingClientRect();n if (elRect.width === null) {n // width and height are missing in IE8, so compute them manually; see github.com/twbs/bootstrap/issues/14093n elRect = angular.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top });n }nn var elPos;n if (options.container === ‘body’) {n elPos = dimensions.offset(el);n } else {n elPos = dimensions.position(el);n }nn return angular.extend({}, elRect, elPos);n }nn function getCalculatedOffset(placement, position, actualWidth, actualHeight) {n var offset;n var split = placement.split(‘-’);nn switch (split) {n case ‘right’:n offset = {n top: position.top + position.height / 2 - actualHeight / 2,n left: position.left + position.widthn };n break;n case ‘bottom’:n offset = {n top: position.top + position.height,n left: position.left + position.width / 2 - actualWidth / 2n };n break;n case ‘left’:n offset = {n top: position.top + position.height / 2 - actualHeight / 2,n left: position.left - actualWidthn };n break;n default:n offset = {n top: position.top - actualHeight,n left: position.left + position.width / 2 - actualWidth / 2n };n break;n }nn if(!split) {n return offset;n }nn // Add support for corners @todo cssn if(split === ‘top’ || split === ‘bottom’) {n switch (split) {n case ‘left’:n offset.left = position.left;n break;n case ‘right’:n offset.left = position.left + position.width - actualWidth;n }n } else if(split === ‘left’ || split === ‘right’) {n switch (split) {n case ‘top’:n offset.top = position.top - actualHeight;n break;n case ‘bottom’:n offset.top = position.top + position.height;n }n }nn return offset;n }nn function applyPlacementCss(top, left) {n tipElement.css({ top: top + ‘px’, left: left + ‘px’ });n }nn function destroyTipElement() {n // Cancel pending callbacksn clearTimeout(timeout);nn if($tooltip.$isShown && tipElement !== null) {n if(options.autoClose) {n unbindAutoCloseEvents();n }nn if(options.keyboard) {n unbindKeyboardEvents();n }n }nn if(tipScope) {n tipScope.$destroy();n tipScope = null;n }nn if(tipElement) {n tipElement.remove();n tipElement = $tooltip.$element = null;n }n }nn return $tooltip;nn }nn // Helper functionsnn function safeDigest(scope) {n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();n }nn function findElement(query, element) {n return angular.element((element || document).querySelectorAll(query));n }nn var fetchPromises = {};n function fetchTemplate(template) {n if(fetchPromises) return fetchPromises;n return (fetchPromises = $q.when($templateCache.get(template) || $http.get(template))n .then(function(res) {n if(angular.isObject(res)) {n $templateCache.put(template, res.data);n return res.data;n }n return res;n }));n }nn return TooltipFactory;nn };nn })nn .directive(‘bsTooltip’, function($window, $location, $sce, $tooltip, $$rAF) {nn return {n restrict: ‘EAC’,n scope: true,n link: function postLink(scope, element, attr, transclusion) {nn // Directive optionsn var options = {scope: scope};n angular.forEach([‘template’, ‘contentTemplate’, ‘placement’, ‘container’, ‘target’, ‘delay’, ‘trigger’, ‘keyboard’, ‘html’, ‘animation’, ‘backdropAnimation’, ‘type’, ‘customClass’, ‘id’], function(key) {n if(angular.isDefined(attr)) options = attr;n });nn // overwrite inherited title value when no value specifiedn // fix for angular 1.3.1 531a8de72c439d8ddd064874bf364c00cedabb11n if (!scope.hasOwnProperty(‘title’)){n scope.title = ”;n }nn // Observe scope attributes for changen attr.$observe(‘title’, function(newValue) {n if (angular.isDefined(newValue) || !scope.hasOwnProperty(‘title’)) {n var oldValue = scope.title;n scope.title = $sce.trustAsHtml(newValue);n angular.isDefined(oldValue) && $$rAF(function() {n tooltip && tooltip.$applyPlacement();n });n }n });nn // Support scope as an objectn attr.bsTooltip && scope.$watch(attr.bsTooltip, function(newValue, oldValue) {n if(angular.isObject(newValue)) {n angular.extend(scope, newValue);n } else {n scope.title = newValue;n }n angular.isDefined(oldValue) && $$rAF(function() {n tooltip && tooltip.$applyPlacement();n });n }, true);nn // Visibility binding supportn attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {n if(!tooltip || !angular.isDefined(newValue)) return;n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(tooltip),?/i);n newValue === true ? tooltip.show() : tooltip.hide();n });nn // Enabled binding supportn attr.bsEnabled && scope.$watch(attr.bsEnabled, function(newValue, oldValue) {n // console.warn(‘scope.$watch(%s)’, attr.bsEnabled, newValue, oldValue);n if(!tooltip || !angular.isDefined(newValue)) return;n if(angular.isString(newValue)) newValue = !!newValue.match(/true|1|,?(tooltip),?/i);n newValue === false ? tooltip.setEnabled(false) : tooltip.setEnabled(true);n });nn // Initialize popovern var tooltip = $tooltip(element, options);nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if(tooltip) tooltip.destroy();n options = null;n tooltip = null;n });nn }n };nn });n”,“‘use strict’;nnangular.module(‘mgcrea.ngStrap.typeahead’, [‘mgcrea.ngStrap.tooltip’, ‘mgcrea.ngStrap.helpers.parseOptions’])nn .provider(‘$typeahead’, function() {nn var defaults = this.defaults = {n animation: ‘am-fade’,n prefixClass: ‘typeahead’,n prefixEvent: ‘$typeahead’,n placement: ‘bottom-left’,n template: ‘typeahead/typeahead.tpl.html’,n trigger: ‘focus’,n container: false,n keyboard: true,n html: false,n delay: 0,n minLength: 1,n filter: ‘filter’,n limit: 6,n comparator: ”n };nn this.$get = function($window, $rootScope, $tooltip, $timeout) {nn var bodyEl = angular.element($window.document.body);nn function TypeaheadFactory(element, controller, config) {nn var $typeahead = {};nn // Common varsn var options = angular.extend({}, defaults, config);nn $typeahead = $tooltip(element, options);n var parentScope = config.scope;n var scope = $typeahead.$scope;nn scope.$resetMatches = function(){n scope.$matches = [];n scope.$activeIndex = 0;n };n scope.$resetMatches();nn scope.$activate = function(index) {n scope.$$postDigest(function() {n $typeahead.activate(index);n });n };nn scope.$select = function(index, evt) {n scope.$$postDigest(function() {n $typeahead.select(index);n });n };nn scope.$isVisible = function() {n return $typeahead.$isVisible();n };nn // Public methodsnn $typeahead.update = function(matches) {n scope.$matches = matches;n if(scope.$activeIndex >= matches.length) {n scope.$activeIndex = 0;n }n };nn $typeahead.activate = function(index) {n scope.$activeIndex = index;n };nn $typeahead.select = function(index) {n var value = scope.$matches.value;n // console.log(‘$setViewValue’, value);n controller.$setViewValue(value);n controller.$render();n scope.$resetMatches();n if(parentScope) parentScope.$digest();n // Emit eventn scope.$emit(options.prefixEvent + ‘.select’, value, index, $typeahead);n };nn // Protected methodsnn $typeahead.$isVisible = function() {n if(!options.minLength || !controller) {n return !!scope.$matches.length;n }n // minLength supportn return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength;n };nn $typeahead.$getIndex = function(value) {n var l = scope.$matches.length, i = l;n if(!l) return;n for(i = l; i–;) {n if(scope.$matches.value === value) break;n }n if(i < 0) return;n return i;n };nn $typeahead.$onMouseDown = function(evt) {n // Prevent blur on mousedownn evt.preventDefault();n evt.stopPropagation();n };nn $typeahead.$onKeyDown = function(evt) {n if(!/(38|40|13)/.test(evt.keyCode)) return;nn // Let ngSubmit pass if the typeahead tip is hiddenn if($typeahead.$isVisible()) {n evt.preventDefault();n evt.stopPropagation();n }nn // Select with entern if(evt.keyCode === 13 && scope.$matches.length) {n $typeahead.select(scope.$activeIndex);n }nn // Navigate with keyboardn else if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex–;n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;n scope.$digest();n };nn // Overridesnn var show = $typeahead.show;n $typeahead.show = function() {n show();n // use timeout to hookup the events to preventn // event bubbling from being processed imediately.n $timeout(function() {n $typeahead.$element.on(‘mousedown’, $typeahead.$onMouseDown);n if(options.keyboard) {n element.on(‘keydown’, $typeahead.$onKeyDown);n }n }, 0, false);n };nn var hide = $typeahead.hide;n $typeahead.hide = function() {n $typeahead.$element.off(‘mousedown’, $typeahead.$onMouseDown);n if(options.keyboard) {n element.off(‘keydown’, $typeahead.$onKeyDown);n }n hide();n };nn return $typeahead;nn }nn TypeaheadFactory.defaults = defaults;n return TypeaheadFactory;nn };nn })nn .directive(‘bsTypeahead’, function($window, $parse, $q, $typeahead, $parseOptions) {nn var defaults = $typeahead.defaults;nn return {n restrict: ‘EAC’,n require: ‘ngModel’,n link: function postLink(scope, element, attr, controller) {nn // Directive optionsn var options = {scope: scope};n angular.forEach([‘placement’, ‘container’, ‘delay’, ‘trigger’, ‘keyboard’, ‘html’, ‘animation’, ‘template’, ‘filter’, ‘limit’, ‘minLength’, ‘watchOptions’, ‘selectMode’, ‘comparator’, ‘id’], function(key) {n if(angular.isDefined(attr)) options = attr;n });nn // Build proper ngOptionsn var filter = options.filter || defaults.filter;n var limit = options.limit || defaults.limit;n var comparator = options.comparator || defaults.comparator;nn var ngOptions = attr.ngOptions;n if(filter) ngOptions += ‘ | ’ + filter + ‘:$viewValue’;n if (comparator) ngOptions += ‘:’ + comparator;n if(limit) ngOptions += ‘ | limitTo:’ + limit;n var parsedOptions = $parseOptions(ngOptions);nn // Initialize typeaheadn var typeahead = $typeahead(element, controller, options);nn // Watch options on demandn if(options.watchOptions) {n // Watch ngOptions values before filtering for changes, drop function callsn var watchedOptions = parsedOptions.$match.replace(/\|.+/, ”).replace(/\(.*\)/g, ”).trim();n scope.$watch(watchedOptions, function (newValue, oldValue) {n // console.warn(‘scope.$watch(%s)’, watchedOptions, newValue, oldValue);n parsedOptions.valuesFn(scope, controller).then(function (values) {n typeahead.update(values);n controller.$render();n });n }, true);n }nn // Watch model for changesn scope.$watch(attr.ngModel, function(newValue, oldValue) {n // console.warn(‘$watch’, element.attr(‘ng-model’), newValue);n scope.$modelValue = newValue; // Publish modelValue on scope for custom templatesn parsedOptions.valuesFn(scope, controller)n .then(function(values) {n // Prevent input with no future prospect if selectMode is truthyn // @TODO test selectModen if(options.selectMode && !values.length && newValue.length > 0) {n controller.$setViewValue(controller.$viewValue.substring(0, controller.$viewValue.length - 1));n return;n }n if(values.length > limit) values = values.slice(0, limit);n var isVisible = typeahead.$isVisible();n isVisible && typeahead.update(values);n // Do not re-queue an update if a correct value has been selectedn if(values.length === 1 && values.value === newValue) return;n !isVisible && typeahead.update(values);n // Queue a new rendering that will leverage collection loadingn controller.$render();n });n });nn // modelValue -> $formatters -> viewValuen controller.$formatters.push(function(modelValue) {n // console.warn(‘$formatter("%s"): modelValue=%o (%o)’, element.attr(‘ng-model’), modelValue, typeof modelValue);n var displayValue = parsedOptions.displayValue(modelValue);n return displayValue === undefined ? ” : displayValue;n });nn // Model rendering in viewn controller.$render = function () {n // console.warn(‘$render’, element.attr(‘ng-model’), ‘controller.$modelValue’, typeof controller.$modelValue, controller.$modelValue, ‘controller.$viewValue’, typeof controller.$viewValue, controller.$viewValue);n if(controller.$isEmpty(controller.$viewValue)) return element.val(”);n var index = typeahead.$getIndex(controller.$modelValue);n var selected = angular.isDefined(index) ? typeahead.$scope.$matches.label : controller.$viewValue;n selected = angular.isObject(selected) ? parsedOptions.displayValue(selected) : selected;n element.val(selected ? selected.toString().replace(/<(?:.|\n)*?>/gm, ”).trim() : ”);n };nn // Garbage collectionn scope.$on(‘$destroy’, function() {n if (typeahead) typeahead.destroy();n options = null;n typeahead = null;n });nn }n };nn });n”],“sourceRoot”:“/source/”}