From 3f568bdde8d97f3ad440ef2ad96aa01b0a1751a1 Mon Sep 17 00:00:00 2001 From: korelstar Date: Mon, 2 Jul 2018 19:24:00 +0200 Subject: [PATCH] update/remove obsolete JS dependencies --- css/vendor/bootstrap/tooltip.css | 114 - js/bower.json | 12 +- js/vendor/angular-mocks/.bower.json | 19 - js/vendor/angular-mocks/README.md | 63 - js/vendor/angular-mocks/angular-mocks.js | 2470 -- js/vendor/angular-mocks/bower.json | 9 - js/vendor/angular-mocks/ngAnimateMock.js | 2 - js/vendor/angular-mocks/ngMock.js | 2 - js/vendor/angular-mocks/ngMockE2E.js | 2 - js/vendor/angular-mocks/package.json | 27 - js/vendor/angular-route/.bower.json | 15 +- js/vendor/angular-route/LICENSE.md | 21 + js/vendor/angular-route/angular-route.js | 224 +- js/vendor/angular-route/angular-route.min.js | 23 +- .../angular-route/angular-route.min.js.map | 6 +- js/vendor/angular-route/bower.json | 5 +- js/vendor/angular-route/package.json | 11 +- js/vendor/angular/.bower.json | 13 +- js/vendor/angular/LICENSE.md | 21 + js/vendor/angular/angular.js | 9207 +++-- js/vendor/angular/angular.min.js | 610 +- js/vendor/angular/angular.min.js.gzip | Bin 46451 -> 58216 bytes js/vendor/angular/angular.min.js.map | 6 +- js/vendor/angular/bower.json | 3 +- js/vendor/angular/package.json | 2 +- js/vendor/bootstrap/tooltip.js | 361 - js/vendor/jquery/.bower.json | 38 - js/vendor/jquery/MIT-LICENSE.txt | 21 - js/vendor/jquery/bower.json | 28 - js/vendor/jquery/dist/jquery.js | 9210 ----- js/vendor/jquery/dist/jquery.min.js | 5 - js/vendor/jquery/dist/jquery.min.map | 1 - js/vendor/jquery/src/ajax.js | 786 - js/vendor/jquery/src/ajax/jsonp.js | 89 - js/vendor/jquery/src/ajax/load.js | 75 - js/vendor/jquery/src/ajax/parseJSON.js | 13 - js/vendor/jquery/src/ajax/parseXML.js | 28 - js/vendor/jquery/src/ajax/script.js | 64 - js/vendor/jquery/src/ajax/var/nonce.js | 5 - js/vendor/jquery/src/ajax/var/rquery.js | 3 - js/vendor/jquery/src/ajax/xhr.js | 136 - js/vendor/jquery/src/attributes.js | 11 - js/vendor/jquery/src/attributes/attr.js | 141 - js/vendor/jquery/src/attributes/classes.js | 158 - js/vendor/jquery/src/attributes/prop.js | 94 - js/vendor/jquery/src/attributes/support.js | 35 - js/vendor/jquery/src/attributes/val.js | 161 - js/vendor/jquery/src/callbacks.js | 205 - js/vendor/jquery/src/core.js | 502 - js/vendor/jquery/src/core/access.js | 60 - js/vendor/jquery/src/core/init.js | 123 - js/vendor/jquery/src/core/parseHTML.js | 39 - js/vendor/jquery/src/core/ready.js | 97 - js/vendor/jquery/src/core/var/rsingleTag.js | 4 - js/vendor/jquery/src/css.js | 450 - js/vendor/jquery/src/css/addGetHookIf.js | 22 - js/vendor/jquery/src/css/curCSS.js | 57 - js/vendor/jquery/src/css/defaultDisplay.js | 70 - .../jquery/src/css/hiddenVisibleSelectors.js | 15 - js/vendor/jquery/src/css/support.js | 96 - js/vendor/jquery/src/css/swap.js | 28 - js/vendor/jquery/src/css/var/cssExpand.js | 3 - js/vendor/jquery/src/css/var/getStyles.js | 12 - js/vendor/jquery/src/css/var/isHidden.js | 13 - js/vendor/jquery/src/css/var/rmargin.js | 3 - js/vendor/jquery/src/css/var/rnumnonpx.js | 5 - js/vendor/jquery/src/data.js | 178 - js/vendor/jquery/src/data/Data.js | 181 - js/vendor/jquery/src/data/accepts.js | 20 - js/vendor/jquery/src/data/var/data_priv.js | 5 - js/vendor/jquery/src/data/var/data_user.js | 5 - js/vendor/jquery/src/deferred.js | 149 - js/vendor/jquery/src/deprecated.js | 13 - js/vendor/jquery/src/dimensions.js | 50 - js/vendor/jquery/src/effects.js | 648 - js/vendor/jquery/src/effects/Tween.js | 114 - .../jquery/src/effects/animatedSelector.js | 13 - js/vendor/jquery/src/event.js | 868 - js/vendor/jquery/src/event/ajax.js | 13 - js/vendor/jquery/src/event/alias.js | 39 - js/vendor/jquery/src/event/support.js | 9 - js/vendor/jquery/src/exports/amd.js | 24 - js/vendor/jquery/src/exports/global.js | 32 - js/vendor/jquery/src/intro.js | 44 - js/vendor/jquery/src/jquery.js | 37 - js/vendor/jquery/src/manipulation.js | 580 - js/vendor/jquery/src/manipulation/_evalUrl.js | 18 - js/vendor/jquery/src/manipulation/support.js | 32 - .../src/manipulation/var/rcheckableType.js | 3 - js/vendor/jquery/src/offset.js | 207 - js/vendor/jquery/src/outro.js | 1 - js/vendor/jquery/src/queue.js | 142 - js/vendor/jquery/src/queue/delay.js | 22 - js/vendor/jquery/src/selector-native.js | 172 - js/vendor/jquery/src/selector-sizzle.js | 14 - js/vendor/jquery/src/selector.js | 1 - js/vendor/jquery/src/serialize.js | 111 - js/vendor/jquery/src/sizzle/dist/sizzle.js | 2067 - .../jquery/src/sizzle/dist/sizzle.min.js | 3 - .../jquery/src/sizzle/dist/sizzle.min.map | 1 - js/vendor/jquery/src/traversing.js | 199 - js/vendor/jquery/src/traversing/findFilter.js | 100 - .../src/traversing/var/rneedsContext.js | 6 - js/vendor/jquery/src/var/arr.js | 3 - js/vendor/jquery/src/var/class2type.js | 4 - js/vendor/jquery/src/var/concat.js | 5 - js/vendor/jquery/src/var/hasOwn.js | 5 - js/vendor/jquery/src/var/indexOf.js | 5 - js/vendor/jquery/src/var/pnum.js | 3 - js/vendor/jquery/src/var/push.js | 5 - js/vendor/jquery/src/var/rnotwhite.js | 3 - js/vendor/jquery/src/var/slice.js | 5 - js/vendor/jquery/src/var/strundefined.js | 3 - js/vendor/jquery/src/var/support.js | 4 - js/vendor/jquery/src/var/toString.js | 5 - js/vendor/jquery/src/wrap.js | 79 - js/vendor/lodash/.bower.json | 31 +- js/vendor/lodash/.editorconfig | 12 + js/vendor/lodash/.gitattributes | 1 + js/vendor/lodash/.github/CONTRIBUTING.md | 78 + js/vendor/lodash/.gitignore | 4 + js/vendor/lodash/.jscsrc | 97 + js/vendor/lodash/.markdown-doctest-setup.js | 11 + js/vendor/lodash/.travis.yml | 135 + js/vendor/lodash/CHANGELOG | 1 + js/vendor/lodash/{LICENSE.txt => LICENSE} | 31 +- js/vendor/lodash/README.md | 80 + js/vendor/lodash/bower.json | 23 - js/vendor/lodash/dist/lodash.compat.js | 7158 ---- js/vendor/lodash/dist/lodash.compat.min.js | 92 - js/vendor/lodash/dist/lodash.core.js | 3854 ++ js/vendor/lodash/dist/lodash.core.min.js | 29 + js/vendor/lodash/dist/lodash.fp.js | 1045 + js/vendor/lodash/dist/lodash.fp.min.js | 21 + js/vendor/lodash/dist/lodash.js | 21451 ++++++++--- js/vendor/lodash/dist/lodash.min.js | 218 +- js/vendor/lodash/dist/lodash.underscore.js | 4979 --- .../lodash/dist/lodash.underscore.min.js | 39 - js/vendor/lodash/dist/mapping.fp.js | 430 + js/vendor/lodash/doc/README.md | 11304 ++++++ js/vendor/lodash/fp/_baseConvert.js | 573 + js/vendor/lodash/fp/_convertBrowser.js | 18 + js/vendor/lodash/fp/_mapping.js | 368 + js/vendor/lodash/fp/placeholder.js | 6 + js/vendor/lodash/lib/common/file.js | 71 + js/vendor/lodash/lib/common/mapping.js | 9 + js/vendor/lodash/lib/common/minify.js | 39 + js/vendor/lodash/lib/common/uglify.options.js | 22 + js/vendor/lodash/lib/common/util.js | 40 + js/vendor/lodash/lib/fp/build-dist.js | 56 + js/vendor/lodash/lib/fp/build-doc.js | 78 + js/vendor/lodash/lib/fp/build-modules.js | 150 + js/vendor/lodash/lib/fp/template/doc/wiki.jst | 228 + .../lib/fp/template/modules/_falseOptions.jst | 7 + .../lodash/lib/fp/template/modules/_util.jst | 16 + .../lodash/lib/fp/template/modules/alias.jst | 1 + .../lib/fp/template/modules/category.jst | 2 + .../lib/fp/template/modules/convert.jst | 18 + .../lodash/lib/fp/template/modules/fp.jst | 2 + .../lodash/lib/fp/template/modules/module.jst | 5 + .../lodash/lib/fp/template/modules/thru.jst | 5 + js/vendor/lodash/lib/main/build-dist.js | 31 + js/vendor/lodash/lib/main/build-doc.js | 83 + js/vendor/lodash/lib/main/build-modules.js | 34 + js/vendor/lodash/lib/main/build-site.js | 224 + js/vendor/lodash/lodash.js | 17105 +++++++++ js/vendor/lodash/package.json | 66 + js/vendor/lodash/perf/asset/perf-ui.js | 112 + js/vendor/lodash/perf/index.html | 80 + js/vendor/lodash/perf/perf.js | 1978 + js/vendor/lodash/test/asset/test-ui.js | 155 + js/vendor/lodash/test/asset/worker.js | 17 + js/vendor/lodash/test/backbone.html | 170 + js/vendor/lodash/test/fp.html | 41 + js/vendor/lodash/test/index.html | 341 + js/vendor/lodash/test/remove.js | 27 + js/vendor/lodash/test/saucelabs.js | 908 + js/vendor/lodash/test/test-fp.js | 2324 ++ js/vendor/lodash/test/test.js | 26802 +++++++++++++ js/vendor/lodash/test/underscore.html | 466 + js/vendor/lodash/vendor/backbone/LICENSE | 22 + js/vendor/lodash/vendor/backbone/backbone.js | 1946 + .../lodash/vendor/backbone/test/collection.js | 2023 + .../lodash/vendor/backbone/test/events.js | 706 + .../lodash/vendor/backbone/test/model.js | 1448 + .../lodash/vendor/backbone/test/noconflict.js | 13 + .../lodash/vendor/backbone/test/router.js | 1081 + .../vendor/backbone/test/setup/dom-setup.js | 4 + .../vendor/backbone/test/setup/environment.js | 45 + js/vendor/lodash/vendor/backbone/test/sync.js | 239 + js/vendor/lodash/vendor/backbone/test/view.js | 516 + .../lodash/vendor/firebug-lite/license.txt | 30 + .../vendor/firebug-lite/skin/xp/blank.gif | Bin 0 -> 43 bytes .../vendor/firebug-lite/skin/xp/buttonBg.png | Bin 0 -> 167 bytes .../firebug-lite/skin/xp/buttonBgHover.png | Bin 0 -> 171 bytes .../vendor/firebug-lite/skin/xp/debugger.css | 331 + .../vendor/firebug-lite/skin/xp/detach.png | Bin 0 -> 655 bytes .../firebug-lite/skin/xp/detachHover.png | Bin 0 -> 586 bytes .../vendor/firebug-lite/skin/xp/disable.gif | Bin 0 -> 340 bytes .../vendor/firebug-lite/skin/xp/disable.png | Bin 0 -> 543 bytes .../firebug-lite/skin/xp/disableHover.gif | Bin 0 -> 344 bytes .../firebug-lite/skin/xp/disableHover.png | Bin 0 -> 512 bytes .../vendor/firebug-lite/skin/xp/down.png | Bin 0 -> 637 bytes .../firebug-lite/skin/xp/downActive.png | Bin 0 -> 543 bytes .../vendor/firebug-lite/skin/xp/downHover.png | Bin 0 -> 526 bytes .../firebug-lite/skin/xp/errorIcon-sm.png | Bin 0 -> 447 bytes .../vendor/firebug-lite/skin/xp/errorIcon.gif | Bin 0 -> 365 bytes .../vendor/firebug-lite/skin/xp/errorIcon.png | Bin 0 -> 457 bytes .../firebug-lite/skin/xp/firebug-1.3a2.css | 817 + .../firebug-lite/skin/xp/firebug.IE6.css | 20 + .../vendor/firebug-lite/skin/xp/firebug.css | 3147 ++ .../vendor/firebug-lite/skin/xp/firebug.html | 215 + .../vendor/firebug-lite/skin/xp/firebug.png | Bin 0 -> 1167 bytes .../vendor/firebug-lite/skin/xp/group.gif | Bin 0 -> 158 bytes .../vendor/firebug-lite/skin/xp/html.css | 272 + .../vendor/firebug-lite/skin/xp/infoIcon.gif | Bin 0 -> 359 bytes .../vendor/firebug-lite/skin/xp/infoIcon.png | Bin 0 -> 524 bytes .../firebug-lite/skin/xp/loading_16.gif | Bin 0 -> 1553 bytes .../vendor/firebug-lite/skin/xp/min.png | Bin 0 -> 552 bytes .../vendor/firebug-lite/skin/xp/minHover.png | Bin 0 -> 485 bytes .../vendor/firebug-lite/skin/xp/off.png | Bin 0 -> 742 bytes .../vendor/firebug-lite/skin/xp/offHover.png | Bin 0 -> 680 bytes .../skin/xp/pixel_transparent.gif | Bin 0 -> 43 bytes .../firebug-lite/skin/xp/roundCorner.svg | 6 + .../vendor/firebug-lite/skin/xp/search.gif | Bin 0 -> 550 bytes .../vendor/firebug-lite/skin/xp/search.png | Bin 0 -> 685 bytes .../vendor/firebug-lite/skin/xp/shadow.gif | Bin 0 -> 4364 bytes .../vendor/firebug-lite/skin/xp/shadow2.gif | Bin 0 -> 3093 bytes .../firebug-lite/skin/xp/shadowAlpha.png | Bin 0 -> 3403 bytes .../vendor/firebug-lite/skin/xp/sprite.png | Bin 0 -> 40027 bytes .../firebug-lite/skin/xp/tabHoverLeft.png | Bin 0 -> 438 bytes .../firebug-lite/skin/xp/tabHoverMid.png | Bin 0 -> 261 bytes .../firebug-lite/skin/xp/tabHoverRight.png | Bin 0 -> 436 bytes .../vendor/firebug-lite/skin/xp/tabLeft.png | Bin 0 -> 449 bytes .../firebug-lite/skin/xp/tabMenuCheckbox.png | Bin 0 -> 220 bytes .../firebug-lite/skin/xp/tabMenuPin.png | Bin 0 -> 207 bytes .../firebug-lite/skin/xp/tabMenuRadio.png | Bin 0 -> 192 bytes .../firebug-lite/skin/xp/tabMenuTarget.png | Bin 0 -> 142 bytes .../skin/xp/tabMenuTargetHover.png | Bin 0 -> 148 bytes .../vendor/firebug-lite/skin/xp/tabMid.png | Bin 0 -> 262 bytes .../vendor/firebug-lite/skin/xp/tabRight.png | Bin 0 -> 448 bytes .../skin/xp/textEditorBorders.gif | Bin 0 -> 117 bytes .../skin/xp/textEditorBorders.png | Bin 0 -> 3144 bytes .../skin/xp/textEditorCorners.gif | Bin 0 -> 1821 bytes .../skin/xp/textEditorCorners.png | Bin 0 -> 3960 bytes .../firebug-lite/skin/xp/titlebarMid.png | Bin 0 -> 273 bytes .../firebug-lite/skin/xp/toolbarMid.png | Bin 0 -> 242 bytes .../firebug-lite/skin/xp/tree_close.gif | Bin 0 -> 300 bytes .../vendor/firebug-lite/skin/xp/tree_open.gif | Bin 0 -> 202 bytes .../firebug-lite/skin/xp/twistyClosed.png | Bin 0 -> 334 bytes .../firebug-lite/skin/xp/twistyOpen.png | Bin 0 -> 309 bytes .../lodash/vendor/firebug-lite/skin/xp/up.png | Bin 0 -> 619 bytes .../vendor/firebug-lite/skin/xp/upActive.png | Bin 0 -> 551 bytes .../vendor/firebug-lite/skin/xp/upHover.png | Bin 0 -> 526 bytes .../firebug-lite/skin/xp/warningIcon.gif | Bin 0 -> 357 bytes .../firebug-lite/skin/xp/warningIcon.png | Bin 0 -> 516 bytes .../firebug-lite/src/firebug-lite-debug.js | 31176 ++++++++++++++++ js/vendor/lodash/vendor/json-js/json2.js | 519 + .../{ => lodash/vendor}/underscore/LICENSE | 2 +- .../lodash/vendor/underscore/test/arrays.js | 563 + .../lodash/vendor/underscore/test/chaining.js | 99 + .../vendor/underscore/test/collections.js | 896 + .../vendor/underscore/test/cross-document.js | 141 + .../vendor/underscore/test/functions.js | 765 + .../lodash/vendor/underscore/test/objects.js | 1105 + .../lodash/vendor/underscore/test/utility.js | 421 + .../vendor/underscore/underscore-min.js | 6 + .../vendor}/underscore/underscore.js | 1095 +- js/vendor/lodash/yarn.lock | 3346 ++ js/vendor/restangular/.bower.json | 16 +- js/vendor/restangular/.editorconfig | 10 + .../restangular/.github/ISSUE_TEMPLATE.md | 24 + js/vendor/restangular/.gitignore | 2 + js/vendor/restangular/.jshintrc | 23 + js/vendor/restangular/.travis.yml | 6 +- js/vendor/restangular/CHANGELOG.md | 209 +- js/vendor/restangular/CONTRIBUTE.md | 17 - js/vendor/restangular/CONTRIBUTING.md | 67 + js/vendor/restangular/Gruntfile.js | 78 +- js/vendor/restangular/README.md | 579 +- js/vendor/restangular/bower.json | 7 +- js/vendor/restangular/dist/restangular.js | 2605 +- js/vendor/restangular/dist/restangular.min.js | 4 +- js/vendor/restangular/dist/restangular.zip | Bin 72880 -> 74515 bytes js/vendor/restangular/karma.conf.js | 32 +- .../restangular/karma.underscore.conf.js | 18 +- js/vendor/restangular/license.md | 2 +- js/vendor/restangular/package.json | 34 +- js/vendor/restangular/src/restangular.js | 2603 +- js/vendor/restangular/test/restangularSpec.js | 1300 +- js/vendor/simplemde/.bower.json | 5 +- js/vendor/underscore/.bower.json | 31 - js/vendor/underscore/.eslintrc | 35 - js/vendor/underscore/.gitignore | 2 - js/vendor/underscore/README.md | 22 - js/vendor/underscore/bower.json | 7 - js/vendor/underscore/component.json | 10 - js/vendor/underscore/package.json | 41 - js/vendor/underscore/underscore-min.js | 6 - js/vendor/underscore/underscore-min.map | 1 - templates/main.php | 3 - 301 files changed, 150019 insertions(+), 47001 deletions(-) delete mode 100644 css/vendor/bootstrap/tooltip.css delete mode 100644 js/vendor/angular-mocks/.bower.json delete mode 100644 js/vendor/angular-mocks/README.md delete mode 100644 js/vendor/angular-mocks/angular-mocks.js delete mode 100644 js/vendor/angular-mocks/bower.json delete mode 100644 js/vendor/angular-mocks/ngAnimateMock.js delete mode 100644 js/vendor/angular-mocks/ngMock.js delete mode 100644 js/vendor/angular-mocks/ngMockE2E.js delete mode 100644 js/vendor/angular-mocks/package.json create mode 100644 js/vendor/angular-route/LICENSE.md create mode 100644 js/vendor/angular/LICENSE.md delete mode 100644 js/vendor/bootstrap/tooltip.js delete mode 100644 js/vendor/jquery/.bower.json delete mode 100644 js/vendor/jquery/MIT-LICENSE.txt delete mode 100644 js/vendor/jquery/bower.json delete mode 100644 js/vendor/jquery/dist/jquery.js delete mode 100644 js/vendor/jquery/dist/jquery.min.js delete mode 100644 js/vendor/jquery/dist/jquery.min.map delete mode 100644 js/vendor/jquery/src/ajax.js delete mode 100644 js/vendor/jquery/src/ajax/jsonp.js delete mode 100644 js/vendor/jquery/src/ajax/load.js delete mode 100644 js/vendor/jquery/src/ajax/parseJSON.js delete mode 100644 js/vendor/jquery/src/ajax/parseXML.js delete mode 100644 js/vendor/jquery/src/ajax/script.js delete mode 100644 js/vendor/jquery/src/ajax/var/nonce.js delete mode 100644 js/vendor/jquery/src/ajax/var/rquery.js delete mode 100644 js/vendor/jquery/src/ajax/xhr.js delete mode 100644 js/vendor/jquery/src/attributes.js delete mode 100644 js/vendor/jquery/src/attributes/attr.js delete mode 100644 js/vendor/jquery/src/attributes/classes.js delete mode 100644 js/vendor/jquery/src/attributes/prop.js delete mode 100644 js/vendor/jquery/src/attributes/support.js delete mode 100644 js/vendor/jquery/src/attributes/val.js delete mode 100644 js/vendor/jquery/src/callbacks.js delete mode 100644 js/vendor/jquery/src/core.js delete mode 100644 js/vendor/jquery/src/core/access.js delete mode 100644 js/vendor/jquery/src/core/init.js delete mode 100644 js/vendor/jquery/src/core/parseHTML.js delete mode 100644 js/vendor/jquery/src/core/ready.js delete mode 100644 js/vendor/jquery/src/core/var/rsingleTag.js delete mode 100644 js/vendor/jquery/src/css.js delete mode 100644 js/vendor/jquery/src/css/addGetHookIf.js delete mode 100644 js/vendor/jquery/src/css/curCSS.js delete mode 100644 js/vendor/jquery/src/css/defaultDisplay.js delete mode 100644 js/vendor/jquery/src/css/hiddenVisibleSelectors.js delete mode 100644 js/vendor/jquery/src/css/support.js delete mode 100644 js/vendor/jquery/src/css/swap.js delete mode 100644 js/vendor/jquery/src/css/var/cssExpand.js delete mode 100644 js/vendor/jquery/src/css/var/getStyles.js delete mode 100644 js/vendor/jquery/src/css/var/isHidden.js delete mode 100644 js/vendor/jquery/src/css/var/rmargin.js delete mode 100644 js/vendor/jquery/src/css/var/rnumnonpx.js delete mode 100644 js/vendor/jquery/src/data.js delete mode 100644 js/vendor/jquery/src/data/Data.js delete mode 100644 js/vendor/jquery/src/data/accepts.js delete mode 100644 js/vendor/jquery/src/data/var/data_priv.js delete mode 100644 js/vendor/jquery/src/data/var/data_user.js delete mode 100644 js/vendor/jquery/src/deferred.js delete mode 100644 js/vendor/jquery/src/deprecated.js delete mode 100644 js/vendor/jquery/src/dimensions.js delete mode 100644 js/vendor/jquery/src/effects.js delete mode 100644 js/vendor/jquery/src/effects/Tween.js delete mode 100644 js/vendor/jquery/src/effects/animatedSelector.js delete mode 100644 js/vendor/jquery/src/event.js delete mode 100644 js/vendor/jquery/src/event/ajax.js delete mode 100644 js/vendor/jquery/src/event/alias.js delete mode 100644 js/vendor/jquery/src/event/support.js delete mode 100644 js/vendor/jquery/src/exports/amd.js delete mode 100644 js/vendor/jquery/src/exports/global.js delete mode 100644 js/vendor/jquery/src/intro.js delete mode 100644 js/vendor/jquery/src/jquery.js delete mode 100644 js/vendor/jquery/src/manipulation.js delete mode 100644 js/vendor/jquery/src/manipulation/_evalUrl.js delete mode 100644 js/vendor/jquery/src/manipulation/support.js delete mode 100644 js/vendor/jquery/src/manipulation/var/rcheckableType.js delete mode 100644 js/vendor/jquery/src/offset.js delete mode 100644 js/vendor/jquery/src/outro.js delete mode 100644 js/vendor/jquery/src/queue.js delete mode 100644 js/vendor/jquery/src/queue/delay.js delete mode 100644 js/vendor/jquery/src/selector-native.js delete mode 100644 js/vendor/jquery/src/selector-sizzle.js delete mode 100644 js/vendor/jquery/src/selector.js delete mode 100644 js/vendor/jquery/src/serialize.js delete mode 100644 js/vendor/jquery/src/sizzle/dist/sizzle.js delete mode 100644 js/vendor/jquery/src/sizzle/dist/sizzle.min.js delete mode 100644 js/vendor/jquery/src/sizzle/dist/sizzle.min.map delete mode 100644 js/vendor/jquery/src/traversing.js delete mode 100644 js/vendor/jquery/src/traversing/findFilter.js delete mode 100644 js/vendor/jquery/src/traversing/var/rneedsContext.js delete mode 100644 js/vendor/jquery/src/var/arr.js delete mode 100644 js/vendor/jquery/src/var/class2type.js delete mode 100644 js/vendor/jquery/src/var/concat.js delete mode 100644 js/vendor/jquery/src/var/hasOwn.js delete mode 100644 js/vendor/jquery/src/var/indexOf.js delete mode 100644 js/vendor/jquery/src/var/pnum.js delete mode 100644 js/vendor/jquery/src/var/push.js delete mode 100644 js/vendor/jquery/src/var/rnotwhite.js delete mode 100644 js/vendor/jquery/src/var/slice.js delete mode 100644 js/vendor/jquery/src/var/strundefined.js delete mode 100644 js/vendor/jquery/src/var/support.js delete mode 100644 js/vendor/jquery/src/var/toString.js delete mode 100644 js/vendor/jquery/src/wrap.js create mode 100644 js/vendor/lodash/.editorconfig create mode 100644 js/vendor/lodash/.gitattributes create mode 100644 js/vendor/lodash/.github/CONTRIBUTING.md create mode 100644 js/vendor/lodash/.gitignore create mode 100644 js/vendor/lodash/.jscsrc create mode 100644 js/vendor/lodash/.markdown-doctest-setup.js create mode 100644 js/vendor/lodash/.travis.yml create mode 100644 js/vendor/lodash/CHANGELOG rename js/vendor/lodash/{LICENSE.txt => LICENSE} (53%) create mode 100644 js/vendor/lodash/README.md delete mode 100644 js/vendor/lodash/bower.json delete mode 100644 js/vendor/lodash/dist/lodash.compat.js delete mode 100644 js/vendor/lodash/dist/lodash.compat.min.js create mode 100644 js/vendor/lodash/dist/lodash.core.js create mode 100644 js/vendor/lodash/dist/lodash.core.min.js create mode 100644 js/vendor/lodash/dist/lodash.fp.js create mode 100644 js/vendor/lodash/dist/lodash.fp.min.js delete mode 100644 js/vendor/lodash/dist/lodash.underscore.js delete mode 100644 js/vendor/lodash/dist/lodash.underscore.min.js create mode 100644 js/vendor/lodash/dist/mapping.fp.js create mode 100644 js/vendor/lodash/doc/README.md create mode 100644 js/vendor/lodash/fp/_baseConvert.js create mode 100644 js/vendor/lodash/fp/_convertBrowser.js create mode 100644 js/vendor/lodash/fp/_mapping.js create mode 100644 js/vendor/lodash/fp/placeholder.js create mode 100644 js/vendor/lodash/lib/common/file.js create mode 100644 js/vendor/lodash/lib/common/mapping.js create mode 100644 js/vendor/lodash/lib/common/minify.js create mode 100644 js/vendor/lodash/lib/common/uglify.options.js create mode 100644 js/vendor/lodash/lib/common/util.js create mode 100644 js/vendor/lodash/lib/fp/build-dist.js create mode 100644 js/vendor/lodash/lib/fp/build-doc.js create mode 100644 js/vendor/lodash/lib/fp/build-modules.js create mode 100644 js/vendor/lodash/lib/fp/template/doc/wiki.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/_falseOptions.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/_util.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/alias.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/category.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/convert.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/fp.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/module.jst create mode 100644 js/vendor/lodash/lib/fp/template/modules/thru.jst create mode 100644 js/vendor/lodash/lib/main/build-dist.js create mode 100644 js/vendor/lodash/lib/main/build-doc.js create mode 100644 js/vendor/lodash/lib/main/build-modules.js create mode 100644 js/vendor/lodash/lib/main/build-site.js create mode 100644 js/vendor/lodash/lodash.js create mode 100644 js/vendor/lodash/package.json create mode 100644 js/vendor/lodash/perf/asset/perf-ui.js create mode 100644 js/vendor/lodash/perf/index.html create mode 100644 js/vendor/lodash/perf/perf.js create mode 100644 js/vendor/lodash/test/asset/test-ui.js create mode 100644 js/vendor/lodash/test/asset/worker.js create mode 100644 js/vendor/lodash/test/backbone.html create mode 100644 js/vendor/lodash/test/fp.html create mode 100644 js/vendor/lodash/test/index.html create mode 100644 js/vendor/lodash/test/remove.js create mode 100644 js/vendor/lodash/test/saucelabs.js create mode 100644 js/vendor/lodash/test/test-fp.js create mode 100644 js/vendor/lodash/test/test.js create mode 100644 js/vendor/lodash/test/underscore.html create mode 100644 js/vendor/lodash/vendor/backbone/LICENSE create mode 100644 js/vendor/lodash/vendor/backbone/backbone.js create mode 100644 js/vendor/lodash/vendor/backbone/test/collection.js create mode 100644 js/vendor/lodash/vendor/backbone/test/events.js create mode 100644 js/vendor/lodash/vendor/backbone/test/model.js create mode 100644 js/vendor/lodash/vendor/backbone/test/noconflict.js create mode 100644 js/vendor/lodash/vendor/backbone/test/router.js create mode 100644 js/vendor/lodash/vendor/backbone/test/setup/dom-setup.js create mode 100644 js/vendor/lodash/vendor/backbone/test/setup/environment.js create mode 100644 js/vendor/lodash/vendor/backbone/test/sync.js create mode 100644 js/vendor/lodash/vendor/backbone/test/view.js create mode 100644 js/vendor/lodash/vendor/firebug-lite/license.txt create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/blank.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/buttonBg.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/buttonBgHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/debugger.css create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/detach.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/detachHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/disable.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/disable.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/disableHover.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/disableHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/down.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/downActive.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/downHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/errorIcon-sm.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/errorIcon.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/errorIcon.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/firebug-1.3a2.css create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/firebug.IE6.css create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/firebug.css create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/firebug.html create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/firebug.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/group.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/html.css create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/infoIcon.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/infoIcon.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/loading_16.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/min.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/minHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/off.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/offHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/pixel_transparent.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/roundCorner.svg create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/search.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/search.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/shadow.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/shadow2.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/shadowAlpha.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/sprite.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabHoverLeft.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabHoverMid.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabHoverRight.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabLeft.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabMenuCheckbox.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabMenuPin.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabMenuRadio.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabMenuTarget.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabMenuTargetHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabMid.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tabRight.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/textEditorBorders.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/textEditorBorders.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/textEditorCorners.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/textEditorCorners.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/titlebarMid.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/toolbarMid.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tree_close.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/tree_open.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/twistyClosed.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/twistyOpen.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/up.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/upActive.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/upHover.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/warningIcon.gif create mode 100644 js/vendor/lodash/vendor/firebug-lite/skin/xp/warningIcon.png create mode 100644 js/vendor/lodash/vendor/firebug-lite/src/firebug-lite-debug.js create mode 100644 js/vendor/lodash/vendor/json-js/json2.js rename js/vendor/{ => lodash/vendor}/underscore/LICENSE (94%) create mode 100644 js/vendor/lodash/vendor/underscore/test/arrays.js create mode 100644 js/vendor/lodash/vendor/underscore/test/chaining.js create mode 100644 js/vendor/lodash/vendor/underscore/test/collections.js create mode 100644 js/vendor/lodash/vendor/underscore/test/cross-document.js create mode 100644 js/vendor/lodash/vendor/underscore/test/functions.js create mode 100644 js/vendor/lodash/vendor/underscore/test/objects.js create mode 100644 js/vendor/lodash/vendor/underscore/test/utility.js create mode 100644 js/vendor/lodash/vendor/underscore/underscore-min.js rename js/vendor/{ => lodash/vendor}/underscore/underscore.js (56%) create mode 100644 js/vendor/lodash/yarn.lock create mode 100644 js/vendor/restangular/.editorconfig create mode 100644 js/vendor/restangular/.github/ISSUE_TEMPLATE.md create mode 100644 js/vendor/restangular/.jshintrc delete mode 100644 js/vendor/restangular/CONTRIBUTE.md create mode 100644 js/vendor/restangular/CONTRIBUTING.md delete mode 100644 js/vendor/underscore/.bower.json delete mode 100644 js/vendor/underscore/.eslintrc delete mode 100644 js/vendor/underscore/.gitignore delete mode 100644 js/vendor/underscore/README.md delete mode 100644 js/vendor/underscore/bower.json delete mode 100644 js/vendor/underscore/component.json delete mode 100644 js/vendor/underscore/package.json delete mode 100644 js/vendor/underscore/underscore-min.js delete mode 100644 js/vendor/underscore/underscore-min.map diff --git a/css/vendor/bootstrap/tooltip.css b/css/vendor/bootstrap/tooltip.css deleted file mode 100644 index a5bf3055..00000000 --- a/css/vendor/bootstrap/tooltip.css +++ /dev/null @@ -1,114 +0,0 @@ -/*! - * Bootstrap v2.3.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; - line-height: 0; -} -.clearfix:after { - clear: both; -} -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.tooltip { - position: fixed; - z-index: 1030; - display: block; - visibility: visible; - font-size: 11px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - white-space: nowrap; - overflow: visible; -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -3px; - padding: 5px 0; -} -.tooltip.right { - margin-left: 3px; - padding: 0 5px; -} -.tooltip.bottom { - margin-top: 3px; - padding: 5px 0; -} -.tooltip.left { - margin-left: -3px; - padding: 0 5px; -} -.tooltip-inner { - max-width: 200px; - padding: 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000000; -} diff --git a/js/bower.json b/js/bower.json index aa23433d..79ddd63a 100644 --- a/js/bower.json +++ b/js/bower.json @@ -1,14 +1,10 @@ { - "name": "Nextcloud notes", + "name": "notes", "version": "0.0.1", "dependencies": { - "angular": "1.4.*", - "restangular": "1.3.*", - "jquery": "2.1.*", - "underscore": "1.7.*", - "angular-mocks": "1.4.*", - "angular-route": "1.4.*", - "prism": "~1.0.1", + "angular": "1.5.*", + "restangular": "1.6.*", + "angular-route": "1.5.*", "simplemde": "^1.11.2" } } diff --git a/js/vendor/angular-mocks/.bower.json b/js/vendor/angular-mocks/.bower.json deleted file mode 100644 index 54501030..00000000 --- a/js/vendor/angular-mocks/.bower.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "angular-mocks", - "version": "1.4.7", - "main": "./angular-mocks.js", - "ignore": [], - "dependencies": { - "angular": "1.4.7" - }, - "homepage": "https://github.com/angular/bower-angular-mocks", - "_release": "1.4.7", - "_resolution": { - "type": "version", - "tag": "v1.4.7", - "commit": "74c65a6a54f39516be40b0afdd99efb461595fd9" - }, - "_source": "git://github.com/angular/bower-angular-mocks.git", - "_target": "1.4.*", - "_originalSource": "angular-mocks" -} \ No newline at end of file diff --git a/js/vendor/angular-mocks/README.md b/js/vendor/angular-mocks/README.md deleted file mode 100644 index 440cce9b..00000000 --- a/js/vendor/angular-mocks/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# packaged angular-mocks - -This repo is for distribution on `npm` and `bower`. The source for this module is in the -[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngMock). -Please file issues and pull requests against that repo. - -## Install - -You can install this package either with `npm` or with `bower`. - -### npm - -```shell -npm install angular-mocks -``` - -You can `require` ngMock modules: - -```js -var angular = require('angular'); -angular.module('myMod', [ - require('angular-animate'), - require('angular-mocks/ngMock') - require('angular-mocks/ngAnimateMock') -]); -``` - -### bower - -```shell -bower install angular-mocks -``` - -The mocks are then available at `bower_components/angular-mocks/angular-mocks.js`. - -## Documentation - -Documentation is available on the -[AngularJS docs site](https://docs.angularjs.org/guide/unit-testing). - -## License - -The MIT License - -Copyright (c) 2010-2015 Google, Inc. http://angularjs.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/js/vendor/angular-mocks/angular-mocks.js b/js/vendor/angular-mocks/angular-mocks.js deleted file mode 100644 index febfd0d6..00000000 --- a/js/vendor/angular-mocks/angular-mocks.js +++ /dev/null @@ -1,2470 +0,0 @@ -/** - * @license AngularJS v1.4.7 - * (c) 2010-2015 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, angular, undefined) { - -'use strict'; - -/** - * @ngdoc object - * @name angular.mock - * @description - * - * Namespace from 'angular-mocks.js' which contains testing related code. - */ -angular.mock = {}; - -/** - * ! This is a private undocumented service ! - * - * @name $browser - * - * @description - * This service is a mock implementation of {@link ng.$browser}. It provides fake - * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr, - * cookies, etc... - * - * The api of this service is the same as that of the real {@link ng.$browser $browser}, except - * that there are several helper methods available which can be used in tests. - */ -angular.mock.$BrowserProvider = function() { - this.$get = function() { - return new angular.mock.$Browser(); - }; -}; - -angular.mock.$Browser = function() { - var self = this; - - this.isMock = true; - self.$$url = "http://server/"; - self.$$lastUrl = self.$$url; // used by url polling fn - self.pollFns = []; - - // TODO(vojta): remove this temporary api - self.$$completeOutstandingRequest = angular.noop; - self.$$incOutstandingRequestCount = angular.noop; - - - // register url polling fn - - self.onUrlChange = function(listener) { - self.pollFns.push( - function() { - if (self.$$lastUrl !== self.$$url || self.$$state !== self.$$lastState) { - self.$$lastUrl = self.$$url; - self.$$lastState = self.$$state; - listener(self.$$url, self.$$state); - } - } - ); - - return listener; - }; - - self.$$applicationDestroyed = angular.noop; - self.$$checkUrlChange = angular.noop; - - self.deferredFns = []; - self.deferredNextId = 0; - - self.defer = function(fn, delay) { - delay = delay || 0; - self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId}); - self.deferredFns.sort(function(a, b) { return a.time - b.time;}); - return self.deferredNextId++; - }; - - - /** - * @name $browser#defer.now - * - * @description - * Current milliseconds mock time. - */ - self.defer.now = 0; - - - self.defer.cancel = function(deferId) { - var fnIndex; - - angular.forEach(self.deferredFns, function(fn, index) { - if (fn.id === deferId) fnIndex = index; - }); - - if (angular.isDefined(fnIndex)) { - self.deferredFns.splice(fnIndex, 1); - return true; - } - - return false; - }; - - - /** - * @name $browser#defer.flush - * - * @description - * Flushes all pending requests and executes the defer callbacks. - * - * @param {number=} number of milliseconds to flush. See {@link #defer.now} - */ - self.defer.flush = function(delay) { - if (angular.isDefined(delay)) { - self.defer.now += delay; - } else { - if (self.deferredFns.length) { - self.defer.now = self.deferredFns[self.deferredFns.length - 1].time; - } else { - throw new Error('No deferred tasks to be flushed'); - } - } - - while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) { - self.deferredFns.shift().fn(); - } - }; - - self.$$baseHref = '/'; - self.baseHref = function() { - return this.$$baseHref; - }; -}; -angular.mock.$Browser.prototype = { - -/** - * @name $browser#poll - * - * @description - * run all fns in pollFns - */ - poll: function poll() { - angular.forEach(this.pollFns, function(pollFn) { - pollFn(); - }); - }, - - url: function(url, replace, state) { - if (angular.isUndefined(state)) { - state = null; - } - if (url) { - this.$$url = url; - // Native pushState serializes & copies the object; simulate it. - this.$$state = angular.copy(state); - return this; - } - - return this.$$url; - }, - - state: function() { - return this.$$state; - }, - - notifyWhenNoOutstandingRequests: function(fn) { - fn(); - } -}; - - -/** - * @ngdoc provider - * @name $exceptionHandlerProvider - * - * @description - * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors - * passed to the `$exceptionHandler`. - */ - -/** - * @ngdoc service - * @name $exceptionHandler - * - * @description - * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed - * to it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration - * information. - * - * - * ```js - * describe('$exceptionHandlerProvider', function() { - * - * it('should capture log messages and exceptions', function() { - * - * module(function($exceptionHandlerProvider) { - * $exceptionHandlerProvider.mode('log'); - * }); - * - * inject(function($log, $exceptionHandler, $timeout) { - * $timeout(function() { $log.log(1); }); - * $timeout(function() { $log.log(2); throw 'banana peel'; }); - * $timeout(function() { $log.log(3); }); - * expect($exceptionHandler.errors).toEqual([]); - * expect($log.assertEmpty()); - * $timeout.flush(); - * expect($exceptionHandler.errors).toEqual(['banana peel']); - * expect($log.log.logs).toEqual([[1], [2], [3]]); - * }); - * }); - * }); - * ``` - */ - -angular.mock.$ExceptionHandlerProvider = function() { - var handler; - - /** - * @ngdoc method - * @name $exceptionHandlerProvider#mode - * - * @description - * Sets the logging mode. - * - * @param {string} mode Mode of operation, defaults to `rethrow`. - * - * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log` - * mode stores an array of errors in `$exceptionHandler.errors`, to allow later - * assertion of them. See {@link ngMock.$log#assertEmpty assertEmpty()} and - * {@link ngMock.$log#reset reset()} - * - `rethrow`: If any errors are passed to the handler in tests, it typically means that there - * is a bug in the application or test, so this mock will make these tests fail. - * For any implementations that expect exceptions to be thrown, the `rethrow` mode - * will also maintain a log of thrown errors. - */ - this.mode = function(mode) { - - switch (mode) { - case 'log': - case 'rethrow': - var errors = []; - handler = function(e) { - if (arguments.length == 1) { - errors.push(e); - } else { - errors.push([].slice.call(arguments, 0)); - } - if (mode === "rethrow") { - throw e; - } - }; - handler.errors = errors; - break; - default: - throw new Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!"); - } - }; - - this.$get = function() { - return handler; - }; - - this.mode('rethrow'); -}; - - -/** - * @ngdoc service - * @name $log - * - * @description - * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays - * (one array per logging level). These arrays are exposed as `logs` property of each of the - * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`. - * - */ -angular.mock.$LogProvider = function() { - var debug = true; - - function concat(array1, array2, index) { - return array1.concat(Array.prototype.slice.call(array2, index)); - } - - this.debugEnabled = function(flag) { - if (angular.isDefined(flag)) { - debug = flag; - return this; - } else { - return debug; - } - }; - - this.$get = function() { - var $log = { - log: function() { $log.log.logs.push(concat([], arguments, 0)); }, - warn: function() { $log.warn.logs.push(concat([], arguments, 0)); }, - info: function() { $log.info.logs.push(concat([], arguments, 0)); }, - error: function() { $log.error.logs.push(concat([], arguments, 0)); }, - debug: function() { - if (debug) { - $log.debug.logs.push(concat([], arguments, 0)); - } - } - }; - - /** - * @ngdoc method - * @name $log#reset - * - * @description - * Reset all of the logging arrays to empty. - */ - $log.reset = function() { - /** - * @ngdoc property - * @name $log#log.logs - * - * @description - * Array of messages logged using {@link ng.$log#log `log()`}. - * - * @example - * ```js - * $log.log('Some Log'); - * var first = $log.log.logs.unshift(); - * ``` - */ - $log.log.logs = []; - /** - * @ngdoc property - * @name $log#info.logs - * - * @description - * Array of messages logged using {@link ng.$log#info `info()`}. - * - * @example - * ```js - * $log.info('Some Info'); - * var first = $log.info.logs.unshift(); - * ``` - */ - $log.info.logs = []; - /** - * @ngdoc property - * @name $log#warn.logs - * - * @description - * Array of messages logged using {@link ng.$log#warn `warn()`}. - * - * @example - * ```js - * $log.warn('Some Warning'); - * var first = $log.warn.logs.unshift(); - * ``` - */ - $log.warn.logs = []; - /** - * @ngdoc property - * @name $log#error.logs - * - * @description - * Array of messages logged using {@link ng.$log#error `error()`}. - * - * @example - * ```js - * $log.error('Some Error'); - * var first = $log.error.logs.unshift(); - * ``` - */ - $log.error.logs = []; - /** - * @ngdoc property - * @name $log#debug.logs - * - * @description - * Array of messages logged using {@link ng.$log#debug `debug()`}. - * - * @example - * ```js - * $log.debug('Some Error'); - * var first = $log.debug.logs.unshift(); - * ``` - */ - $log.debug.logs = []; - }; - - /** - * @ngdoc method - * @name $log#assertEmpty - * - * @description - * Assert that all of the logging methods have no logged messages. If any messages are present, - * an exception is thrown. - */ - $log.assertEmpty = function() { - var errors = []; - angular.forEach(['error', 'warn', 'info', 'log', 'debug'], function(logLevel) { - angular.forEach($log[logLevel].logs, function(log) { - angular.forEach(log, function(logItem) { - errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + - (logItem.stack || '')); - }); - }); - }); - if (errors.length) { - errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " + - "an expected log message was not checked and removed:"); - errors.push(''); - throw new Error(errors.join('\n---------\n')); - } - }; - - $log.reset(); - return $log; - }; -}; - - -/** - * @ngdoc service - * @name $interval - * - * @description - * Mock implementation of the $interval service. - * - * Use {@link ngMock.$interval#flush `$interval.flush(millis)`} to - * move forward by `millis` milliseconds and trigger any functions scheduled to run in that - * time. - * - * @param {function()} fn A function that should be called repeatedly. - * @param {number} delay Number of milliseconds between each function call. - * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat - * indefinitely. - * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise - * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. - * @param {...*=} Pass additional parameters to the executed function. - * @returns {promise} A promise which will be notified on each iteration. - */ -angular.mock.$IntervalProvider = function() { - this.$get = ['$browser', '$rootScope', '$q', '$$q', - function($browser, $rootScope, $q, $$q) { - var repeatFns = [], - nextRepeatId = 0, - now = 0; - - var $interval = function(fn, delay, count, invokeApply) { - var hasParams = arguments.length > 4, - args = hasParams ? Array.prototype.slice.call(arguments, 4) : [], - iteration = 0, - skipApply = (angular.isDefined(invokeApply) && !invokeApply), - deferred = (skipApply ? $$q : $q).defer(), - promise = deferred.promise; - - count = (angular.isDefined(count)) ? count : 0; - promise.then(null, null, (!hasParams) ? fn : function() { - fn.apply(null, args); - }); - - promise.$$intervalId = nextRepeatId; - - function tick() { - deferred.notify(iteration++); - - if (count > 0 && iteration >= count) { - var fnIndex; - deferred.resolve(iteration); - - angular.forEach(repeatFns, function(fn, index) { - if (fn.id === promise.$$intervalId) fnIndex = index; - }); - - if (angular.isDefined(fnIndex)) { - repeatFns.splice(fnIndex, 1); - } - } - - if (skipApply) { - $browser.defer.flush(); - } else { - $rootScope.$apply(); - } - } - - repeatFns.push({ - nextTime:(now + delay), - delay: delay, - fn: tick, - id: nextRepeatId, - deferred: deferred - }); - repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;}); - - nextRepeatId++; - return promise; - }; - /** - * @ngdoc method - * @name $interval#cancel - * - * @description - * Cancels a task associated with the `promise`. - * - * @param {promise} promise A promise from calling the `$interval` function. - * @returns {boolean} Returns `true` if the task was successfully cancelled. - */ - $interval.cancel = function(promise) { - if (!promise) return false; - var fnIndex; - - angular.forEach(repeatFns, function(fn, index) { - if (fn.id === promise.$$intervalId) fnIndex = index; - }); - - if (angular.isDefined(fnIndex)) { - repeatFns[fnIndex].deferred.reject('canceled'); - repeatFns.splice(fnIndex, 1); - return true; - } - - return false; - }; - - /** - * @ngdoc method - * @name $interval#flush - * @description - * - * Runs interval tasks scheduled to be run in the next `millis` milliseconds. - * - * @param {number=} millis maximum timeout amount to flush up until. - * - * @return {number} The amount of time moved forward. - */ - $interval.flush = function(millis) { - now += millis; - while (repeatFns.length && repeatFns[0].nextTime <= now) { - var task = repeatFns[0]; - task.fn(); - task.nextTime += task.delay; - repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;}); - } - return millis; - }; - - return $interval; - }]; -}; - - -/* jshint -W101 */ -/* The R_ISO8061_STR regex is never going to fit into the 100 char limit! - * This directive should go inside the anonymous function but a bug in JSHint means that it would - * not be enacted early enough to prevent the warning. - */ -var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/; - -function jsonStringToDate(string) { - var match; - if (match = string.match(R_ISO8061_STR)) { - var date = new Date(0), - tzHour = 0, - tzMin = 0; - if (match[9]) { - tzHour = toInt(match[9] + match[10]); - tzMin = toInt(match[9] + match[11]); - } - date.setUTCFullYear(toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); - date.setUTCHours(toInt(match[4] || 0) - tzHour, - toInt(match[5] || 0) - tzMin, - toInt(match[6] || 0), - toInt(match[7] || 0)); - return date; - } - return string; -} - -function toInt(str) { - return parseInt(str, 10); -} - -function padNumber(num, digits, trim) { - var neg = ''; - if (num < 0) { - neg = '-'; - num = -num; - } - num = '' + num; - while (num.length < digits) num = '0' + num; - if (trim) { - num = num.substr(num.length - digits); - } - return neg + num; -} - - -/** - * @ngdoc type - * @name angular.mock.TzDate - * @description - * - * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`. - * - * Mock of the Date type which has its timezone specified via constructor arg. - * - * The main purpose is to create Date-like instances with timezone fixed to the specified timezone - * offset, so that we can test code that depends on local timezone settings without dependency on - * the time zone settings of the machine where the code is running. - * - * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored) - * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC* - * - * @example - * !!!! WARNING !!!!! - * This is not a complete Date object so only methods that were implemented can be called safely. - * To make matters worse, TzDate instances inherit stuff from Date via a prototype. - * - * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is - * incomplete we might be missing some non-standard methods. This can result in errors like: - * "Date.prototype.foo called on incompatible Object". - * - * ```js - * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z'); - * newYearInBratislava.getTimezoneOffset() => -60; - * newYearInBratislava.getFullYear() => 2010; - * newYearInBratislava.getMonth() => 0; - * newYearInBratislava.getDate() => 1; - * newYearInBratislava.getHours() => 0; - * newYearInBratislava.getMinutes() => 0; - * newYearInBratislava.getSeconds() => 0; - * ``` - * - */ -angular.mock.TzDate = function(offset, timestamp) { - var self = new Date(0); - if (angular.isString(timestamp)) { - var tsStr = timestamp; - - self.origDate = jsonStringToDate(timestamp); - - timestamp = self.origDate.getTime(); - if (isNaN(timestamp)) { - throw { - name: "Illegal Argument", - message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string" - }; - } - } else { - self.origDate = new Date(timestamp); - } - - var localOffset = new Date(timestamp).getTimezoneOffset(); - self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60; - self.date = new Date(timestamp + self.offsetDiff); - - self.getTime = function() { - return self.date.getTime() - self.offsetDiff; - }; - - self.toLocaleDateString = function() { - return self.date.toLocaleDateString(); - }; - - self.getFullYear = function() { - return self.date.getFullYear(); - }; - - self.getMonth = function() { - return self.date.getMonth(); - }; - - self.getDate = function() { - return self.date.getDate(); - }; - - self.getHours = function() { - return self.date.getHours(); - }; - - self.getMinutes = function() { - return self.date.getMinutes(); - }; - - self.getSeconds = function() { - return self.date.getSeconds(); - }; - - self.getMilliseconds = function() { - return self.date.getMilliseconds(); - }; - - self.getTimezoneOffset = function() { - return offset * 60; - }; - - self.getUTCFullYear = function() { - return self.origDate.getUTCFullYear(); - }; - - self.getUTCMonth = function() { - return self.origDate.getUTCMonth(); - }; - - self.getUTCDate = function() { - return self.origDate.getUTCDate(); - }; - - self.getUTCHours = function() { - return self.origDate.getUTCHours(); - }; - - self.getUTCMinutes = function() { - return self.origDate.getUTCMinutes(); - }; - - self.getUTCSeconds = function() { - return self.origDate.getUTCSeconds(); - }; - - self.getUTCMilliseconds = function() { - return self.origDate.getUTCMilliseconds(); - }; - - self.getDay = function() { - return self.date.getDay(); - }; - - // provide this method only on browsers that already have it - if (self.toISOString) { - self.toISOString = function() { - return padNumber(self.origDate.getUTCFullYear(), 4) + '-' + - padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' + - padNumber(self.origDate.getUTCDate(), 2) + 'T' + - padNumber(self.origDate.getUTCHours(), 2) + ':' + - padNumber(self.origDate.getUTCMinutes(), 2) + ':' + - padNumber(self.origDate.getUTCSeconds(), 2) + '.' + - padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z'; - }; - } - - //hide all methods not implemented in this mock that the Date prototype exposes - var unimplementedMethods = ['getUTCDay', - 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', - 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear', - 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', - 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString', - 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf']; - - angular.forEach(unimplementedMethods, function(methodName) { - self[methodName] = function() { - throw new Error("Method '" + methodName + "' is not implemented in the TzDate mock"); - }; - }); - - return self; -}; - -//make "tzDateInstance instanceof Date" return true -angular.mock.TzDate.prototype = Date.prototype; -/* jshint +W101 */ - -angular.mock.animate = angular.module('ngAnimateMock', ['ng']) - - .config(['$provide', function($provide) { - - $provide.factory('$$forceReflow', function() { - function reflowFn() { - reflowFn.totalReflows++; - } - reflowFn.totalReflows = 0; - return reflowFn; - }); - - $provide.factory('$$animateAsyncRun', function() { - var queue = []; - var queueFn = function() { - return function(fn) { - queue.push(fn); - }; - }; - queueFn.flush = function() { - if (queue.length === 0) return false; - - for (var i = 0; i < queue.length; i++) { - queue[i](); - } - queue = []; - - return true; - }; - return queueFn; - }); - - $provide.decorator('$animate', ['$delegate', '$timeout', '$browser', '$$rAF', - '$$forceReflow', '$$animateAsyncRun', '$rootScope', - function($delegate, $timeout, $browser, $$rAF, - $$forceReflow, $$animateAsyncRun, $rootScope) { - var animate = { - queue: [], - cancel: $delegate.cancel, - on: $delegate.on, - off: $delegate.off, - pin: $delegate.pin, - get reflows() { - return $$forceReflow.totalReflows; - }, - enabled: $delegate.enabled, - flush: function() { - $rootScope.$digest(); - - var doNextRun, somethingFlushed = false; - do { - doNextRun = false; - - if ($$rAF.queue.length) { - $$rAF.flush(); - doNextRun = somethingFlushed = true; - } - - if ($$animateAsyncRun.flush()) { - doNextRun = somethingFlushed = true; - } - } while (doNextRun); - - if (!somethingFlushed) { - throw new Error('No pending animations ready to be closed or flushed'); - } - - $rootScope.$digest(); - } - }; - - angular.forEach( - ['animate','enter','leave','move','addClass','removeClass','setClass'], function(method) { - animate[method] = function() { - animate.queue.push({ - event: method, - element: arguments[0], - options: arguments[arguments.length - 1], - args: arguments - }); - return $delegate[method].apply($delegate, arguments); - }; - }); - - return animate; - }]); - - }]); - - -/** - * @ngdoc function - * @name angular.mock.dump - * @description - * - * *NOTE*: this is not an injectable instance, just a globally available function. - * - * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for - * debugging. - * - * This method is also available on window, where it can be used to display objects on debug - * console. - * - * @param {*} object - any object to turn into string. - * @return {string} a serialized string of the argument - */ -angular.mock.dump = function(object) { - return serialize(object); - - function serialize(object) { - var out; - - if (angular.isElement(object)) { - object = angular.element(object); - out = angular.element('
'); - angular.forEach(object, function(element) { - out.append(angular.element(element).clone()); - }); - out = out.html(); - } else if (angular.isArray(object)) { - out = []; - angular.forEach(object, function(o) { - out.push(serialize(o)); - }); - out = '[ ' + out.join(', ') + ' ]'; - } else if (angular.isObject(object)) { - if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) { - out = serializeScope(object); - } else if (object instanceof Error) { - out = object.stack || ('' + object.name + ': ' + object.message); - } else { - // TODO(i): this prevents methods being logged, - // we should have a better way to serialize objects - out = angular.toJson(object, true); - } - } else { - out = String(object); - } - - return out; - } - - function serializeScope(scope, offset) { - offset = offset || ' '; - var log = [offset + 'Scope(' + scope.$id + '): {']; - for (var key in scope) { - if (Object.prototype.hasOwnProperty.call(scope, key) && !key.match(/^(\$|this)/)) { - log.push(' ' + key + ': ' + angular.toJson(scope[key])); - } - } - var child = scope.$$childHead; - while (child) { - log.push(serializeScope(child, offset + ' ')); - child = child.$$nextSibling; - } - log.push('}'); - return log.join('\n' + offset); - } -}; - -/** - * @ngdoc service - * @name $httpBackend - * @description - * Fake HTTP backend implementation suitable for unit testing applications that use the - * {@link ng.$http $http service}. - * - * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less - * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}. - * - * During unit testing, we want our unit tests to run quickly and have no external dependencies so - * we don’t want to send [XHR](https://developer.mozilla.org/en/xmlhttprequest) or - * [JSONP](http://en.wikipedia.org/wiki/JSONP) requests to a real server. All we really need is - * to verify whether a certain request has been sent or not, or alternatively just let the - * application make requests, respond with pre-trained responses and assert that the end result is - * what we expect it to be. - * - * This mock implementation can be used to respond with static or dynamic responses via the - * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc). - * - * When an Angular application needs some data from a server, it calls the $http service, which - * sends the request to a real server using $httpBackend service. With dependency injection, it is - * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify - * the requests and respond with some testing data without sending a request to a real server. - * - * There are two ways to specify what test data should be returned as http responses by the mock - * backend when the code under test makes http requests: - * - * - `$httpBackend.expect` - specifies a request expectation - * - `$httpBackend.when` - specifies a backend definition - * - * - * # Request Expectations vs Backend Definitions - * - * Request expectations provide a way to make assertions about requests made by the application and - * to define responses for those requests. The test will fail if the expected requests are not made - * or they are made in the wrong order. - * - * Backend definitions allow you to define a fake backend for your application which doesn't assert - * if a particular request was made or not, it just returns a trained response if a request is made. - * The test will pass whether or not the request gets made during testing. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
Request expectationsBackend definitions
Syntax.expect(...).respond(...).when(...).respond(...)
Typical usagestrict unit testsloose (black-box) unit testing
Fulfills multiple requestsNOYES
Order of requests mattersYESNO
Request requiredYESNO
Response requiredoptional (see below)YES
- * - * In cases where both backend definitions and request expectations are specified during unit - * testing, the request expectations are evaluated first. - * - * If a request expectation has no response specified, the algorithm will search your backend - * definitions for an appropriate response. - * - * If a request didn't match any expectation or if the expectation doesn't have the response - * defined, the backend definitions are evaluated in sequential order to see if any of them match - * the request. The response from the first matched definition is returned. - * - * - * # Flushing HTTP requests - * - * The $httpBackend used in production always responds to requests asynchronously. If we preserved - * this behavior in unit testing, we'd have to create async unit tests, which are hard to write, - * to follow and to maintain. But neither can the testing mock respond synchronously; that would - * change the execution of the code under test. For this reason, the mock $httpBackend has a - * `flush()` method, which allows the test to explicitly flush pending requests. This preserves - * the async api of the backend, while allowing the test to execute synchronously. - * - * - * # Unit testing with mock $httpBackend - * The following code shows how to setup and use the mock backend when unit testing a controller. - * First we create the controller under test: - * - ```js - // The module code - angular - .module('MyApp', []) - .controller('MyController', MyController); - - // The controller code - function MyController($scope, $http) { - var authToken; - - $http.get('/auth.py').success(function(data, status, headers) { - authToken = headers('A-Token'); - $scope.user = data; - }); - - $scope.saveMessage = function(message) { - var headers = { 'Authorization': authToken }; - $scope.status = 'Saving...'; - - $http.post('/add-msg.py', message, { headers: headers } ).success(function(response) { - $scope.status = ''; - }).error(function() { - $scope.status = 'Failed...'; - }); - }; - } - ``` - * - * Now we setup the mock backend and create the test specs: - * - ```js - // testing controller - describe('MyController', function() { - var $httpBackend, $rootScope, createController, authRequestHandler; - - // Set up the module - beforeEach(module('MyApp')); - - beforeEach(inject(function($injector) { - // Set up the mock http service responses - $httpBackend = $injector.get('$httpBackend'); - // backend definition common for all tests - authRequestHandler = $httpBackend.when('GET', '/auth.py') - .respond({userId: 'userX'}, {'A-Token': 'xxx'}); - - // Get hold of a scope (i.e. the root scope) - $rootScope = $injector.get('$rootScope'); - // The $controller service is used to create instances of controllers - var $controller = $injector.get('$controller'); - - createController = function() { - return $controller('MyController', {'$scope' : $rootScope }); - }; - })); - - - afterEach(function() { - $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); - }); - - - it('should fetch authentication token', function() { - $httpBackend.expectGET('/auth.py'); - var controller = createController(); - $httpBackend.flush(); - }); - - - it('should fail authentication', function() { - - // Notice how you can change the response even after it was set - authRequestHandler.respond(401, ''); - - $httpBackend.expectGET('/auth.py'); - var controller = createController(); - $httpBackend.flush(); - expect($rootScope.status).toBe('Failed...'); - }); - - - it('should send msg to server', function() { - var controller = createController(); - $httpBackend.flush(); - - // now you don’t care about the authentication, but - // the controller will still send the request and - // $httpBackend will respond without you having to - // specify the expectation and response for this request - - $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, ''); - $rootScope.saveMessage('message content'); - expect($rootScope.status).toBe('Saving...'); - $httpBackend.flush(); - expect($rootScope.status).toBe(''); - }); - - - it('should send auth header', function() { - var controller = createController(); - $httpBackend.flush(); - - $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) { - // check if the header was sent, if it wasn't the expectation won't - // match the request and the test will fail - return headers['Authorization'] == 'xxx'; - }).respond(201, ''); - - $rootScope.saveMessage('whatever'); - $httpBackend.flush(); - }); - }); - ``` - */ -angular.mock.$HttpBackendProvider = function() { - this.$get = ['$rootScope', '$timeout', createHttpBackendMock]; -}; - -/** - * General factory function for $httpBackend mock. - * Returns instance for unit testing (when no arguments specified): - * - passing through is disabled - * - auto flushing is disabled - * - * Returns instance for e2e testing (when `$delegate` and `$browser` specified): - * - passing through (delegating request to real backend) is enabled - * - auto flushing is enabled - * - * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified) - * @param {Object=} $browser Auto-flushing enabled if specified - * @return {Object} Instance of $httpBackend mock - */ -function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) { - var definitions = [], - expectations = [], - responses = [], - responsesPush = angular.bind(responses, responses.push), - copy = angular.copy; - - function createResponse(status, data, headers, statusText) { - if (angular.isFunction(status)) return status; - - return function() { - return angular.isNumber(status) - ? [status, data, headers, statusText] - : [200, status, data, headers]; - }; - } - - // TODO(vojta): change params to: method, url, data, headers, callback - function $httpBackend(method, url, data, callback, headers, timeout, withCredentials) { - var xhr = new MockXhr(), - expectation = expectations[0], - wasExpected = false; - - function prettyPrint(data) { - return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp) - ? data - : angular.toJson(data); - } - - function wrapResponse(wrapped) { - if (!$browser && timeout) { - timeout.then ? timeout.then(handleTimeout) : $timeout(handleTimeout, timeout); - } - - return handleResponse; - - function handleResponse() { - var response = wrapped.response(method, url, data, headers); - xhr.$$respHeaders = response[2]; - callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(), - copy(response[3] || '')); - } - - function handleTimeout() { - for (var i = 0, ii = responses.length; i < ii; i++) { - if (responses[i] === handleResponse) { - responses.splice(i, 1); - callback(-1, undefined, ''); - break; - } - } - } - } - - if (expectation && expectation.match(method, url)) { - if (!expectation.matchData(data)) { - throw new Error('Expected ' + expectation + ' with different data\n' + - 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data); - } - - if (!expectation.matchHeaders(headers)) { - throw new Error('Expected ' + expectation + ' with different headers\n' + - 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' + - prettyPrint(headers)); - } - - expectations.shift(); - - if (expectation.response) { - responses.push(wrapResponse(expectation)); - return; - } - wasExpected = true; - } - - var i = -1, definition; - while ((definition = definitions[++i])) { - if (definition.match(method, url, data, headers || {})) { - if (definition.response) { - // if $browser specified, we do auto flush all requests - ($browser ? $browser.defer : responsesPush)(wrapResponse(definition)); - } else if (definition.passThrough) { - $delegate(method, url, data, callback, headers, timeout, withCredentials); - } else throw new Error('No response defined !'); - return; - } - } - throw wasExpected ? - new Error('No response defined !') : - new Error('Unexpected request: ' + method + ' ' + url + '\n' + - (expectation ? 'Expected ' + expectation : 'No more request expected')); - } - - /** - * @ngdoc method - * @name $httpBackend#when - * @description - * Creates a new backend definition. - * - * @param {string} method HTTP method. - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives - * data string and returns true if the data is as expected. - * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header - * object and returns true if the headers match the current definition. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - * - * - respond – - * `{function([status,] data[, headers, statusText]) - * | function(function(method, url, data, headers)}` - * – The respond method takes a set of static data to be returned or a function that can - * return an array containing response status (number), response data (string), response - * headers (Object), and the text for the status (string). The respond method returns the - * `requestHandler` object for possible overrides. - */ - $httpBackend.when = function(method, url, data, headers) { - var definition = new MockHttpExpectation(method, url, data, headers), - chain = { - respond: function(status, data, headers, statusText) { - definition.passThrough = undefined; - definition.response = createResponse(status, data, headers, statusText); - return chain; - } - }; - - if ($browser) { - chain.passThrough = function() { - definition.response = undefined; - definition.passThrough = true; - return chain; - }; - } - - definitions.push(definition); - return chain; - }; - - /** - * @ngdoc method - * @name $httpBackend#whenGET - * @description - * Creates a new backend definition for GET requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#whenHEAD - * @description - * Creates a new backend definition for HEAD requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#whenDELETE - * @description - * Creates a new backend definition for DELETE requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#whenPOST - * @description - * Creates a new backend definition for POST requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives - * data string and returns true if the data is as expected. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#whenPUT - * @description - * Creates a new backend definition for PUT requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives - * data string and returns true if the data is as expected. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#whenJSONP - * @description - * Creates a new backend definition for JSONP requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - createShortMethods('when'); - - - /** - * @ngdoc method - * @name $httpBackend#expect - * @description - * Creates a new request expectation. - * - * @param {string} method HTTP method. - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that - * receives data string and returns true if the data is as expected, or Object if request body - * is in JSON format. - * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header - * object and returns true if the headers match the current expectation. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - * - * - respond – - * `{function([status,] data[, headers, statusText]) - * | function(function(method, url, data, headers)}` - * – The respond method takes a set of static data to be returned or a function that can - * return an array containing response status (number), response data (string), response - * headers (Object), and the text for the status (string). The respond method returns the - * `requestHandler` object for possible overrides. - */ - $httpBackend.expect = function(method, url, data, headers) { - var expectation = new MockHttpExpectation(method, url, data, headers), - chain = { - respond: function(status, data, headers, statusText) { - expectation.response = createResponse(status, data, headers, statusText); - return chain; - } - }; - - expectations.push(expectation); - return chain; - }; - - - /** - * @ngdoc method - * @name $httpBackend#expectGET - * @description - * Creates a new request expectation for GET requests. For more info see `expect()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {Object=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. See #expect for more info. - */ - - /** - * @ngdoc method - * @name $httpBackend#expectHEAD - * @description - * Creates a new request expectation for HEAD requests. For more info see `expect()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {Object=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#expectDELETE - * @description - * Creates a new request expectation for DELETE requests. For more info see `expect()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {Object=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#expectPOST - * @description - * Creates a new request expectation for POST requests. For more info see `expect()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that - * receives data string and returns true if the data is as expected, or Object if request body - * is in JSON format. - * @param {Object=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#expectPUT - * @description - * Creates a new request expectation for PUT requests. For more info see `expect()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that - * receives data string and returns true if the data is as expected, or Object if request body - * is in JSON format. - * @param {Object=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#expectPATCH - * @description - * Creates a new request expectation for PATCH requests. For more info see `expect()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that - * receives data string and returns true if the data is as expected, or Object if request body - * is in JSON format. - * @param {Object=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - - /** - * @ngdoc method - * @name $httpBackend#expectJSONP - * @description - * Creates a new request expectation for JSONP requests. For more info see `expect()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives an url - * and returns true if the url matches the current definition. - * @returns {requestHandler} Returns an object with `respond` method that controls how a matched - * request is handled. You can save this object for later use and invoke `respond` again in - * order to change how a matched request is handled. - */ - createShortMethods('expect'); - - - /** - * @ngdoc method - * @name $httpBackend#flush - * @description - * Flushes all pending requests using the trained responses. - * - * @param {number=} count Number of responses to flush (in the order they arrived). If undefined, - * all pending requests will be flushed. If there are no pending requests when the flush method - * is called an exception is thrown (as this typically a sign of programming error). - */ - $httpBackend.flush = function(count, digest) { - if (digest !== false) $rootScope.$digest(); - if (!responses.length) throw new Error('No pending request to flush !'); - - if (angular.isDefined(count) && count !== null) { - while (count--) { - if (!responses.length) throw new Error('No more pending request to flush !'); - responses.shift()(); - } - } else { - while (responses.length) { - responses.shift()(); - } - } - $httpBackend.verifyNoOutstandingExpectation(digest); - }; - - - /** - * @ngdoc method - * @name $httpBackend#verifyNoOutstandingExpectation - * @description - * Verifies that all of the requests defined via the `expect` api were made. If any of the - * requests were not made, verifyNoOutstandingExpectation throws an exception. - * - * Typically, you would call this method following each test case that asserts requests using an - * "afterEach" clause. - * - * ```js - * afterEach($httpBackend.verifyNoOutstandingExpectation); - * ``` - */ - $httpBackend.verifyNoOutstandingExpectation = function(digest) { - if (digest !== false) $rootScope.$digest(); - if (expectations.length) { - throw new Error('Unsatisfied requests: ' + expectations.join(', ')); - } - }; - - - /** - * @ngdoc method - * @name $httpBackend#verifyNoOutstandingRequest - * @description - * Verifies that there are no outstanding requests that need to be flushed. - * - * Typically, you would call this method following each test case that asserts requests using an - * "afterEach" clause. - * - * ```js - * afterEach($httpBackend.verifyNoOutstandingRequest); - * ``` - */ - $httpBackend.verifyNoOutstandingRequest = function() { - if (responses.length) { - throw new Error('Unflushed requests: ' + responses.length); - } - }; - - - /** - * @ngdoc method - * @name $httpBackend#resetExpectations - * @description - * Resets all request expectations, but preserves all backend definitions. Typically, you would - * call resetExpectations during a multiple-phase test when you want to reuse the same instance of - * $httpBackend mock. - */ - $httpBackend.resetExpectations = function() { - expectations.length = 0; - responses.length = 0; - }; - - return $httpBackend; - - - function createShortMethods(prefix) { - angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) { - $httpBackend[prefix + method] = function(url, headers) { - return $httpBackend[prefix](method, url, undefined, headers); - }; - }); - - angular.forEach(['PUT', 'POST', 'PATCH'], function(method) { - $httpBackend[prefix + method] = function(url, data, headers) { - return $httpBackend[prefix](method, url, data, headers); - }; - }); - } -} - -function MockHttpExpectation(method, url, data, headers) { - - this.data = data; - this.headers = headers; - - this.match = function(m, u, d, h) { - if (method != m) return false; - if (!this.matchUrl(u)) return false; - if (angular.isDefined(d) && !this.matchData(d)) return false; - if (angular.isDefined(h) && !this.matchHeaders(h)) return false; - return true; - }; - - this.matchUrl = function(u) { - if (!url) return true; - if (angular.isFunction(url.test)) return url.test(u); - if (angular.isFunction(url)) return url(u); - return url == u; - }; - - this.matchHeaders = function(h) { - if (angular.isUndefined(headers)) return true; - if (angular.isFunction(headers)) return headers(h); - return angular.equals(headers, h); - }; - - this.matchData = function(d) { - if (angular.isUndefined(data)) return true; - if (data && angular.isFunction(data.test)) return data.test(d); - if (data && angular.isFunction(data)) return data(d); - if (data && !angular.isString(data)) { - return angular.equals(angular.fromJson(angular.toJson(data)), angular.fromJson(d)); - } - return data == d; - }; - - this.toString = function() { - return method + ' ' + url; - }; -} - -function createMockXhr() { - return new MockXhr(); -} - -function MockXhr() { - - // hack for testing $http, $httpBackend - MockXhr.$$lastInstance = this; - - this.open = function(method, url, async) { - this.$$method = method; - this.$$url = url; - this.$$async = async; - this.$$reqHeaders = {}; - this.$$respHeaders = {}; - }; - - this.send = function(data) { - this.$$data = data; - }; - - this.setRequestHeader = function(key, value) { - this.$$reqHeaders[key] = value; - }; - - this.getResponseHeader = function(name) { - // the lookup must be case insensitive, - // that's why we try two quick lookups first and full scan last - var header = this.$$respHeaders[name]; - if (header) return header; - - name = angular.lowercase(name); - header = this.$$respHeaders[name]; - if (header) return header; - - header = undefined; - angular.forEach(this.$$respHeaders, function(headerVal, headerName) { - if (!header && angular.lowercase(headerName) == name) header = headerVal; - }); - return header; - }; - - this.getAllResponseHeaders = function() { - var lines = []; - - angular.forEach(this.$$respHeaders, function(value, key) { - lines.push(key + ': ' + value); - }); - return lines.join('\n'); - }; - - this.abort = angular.noop; -} - - -/** - * @ngdoc service - * @name $timeout - * @description - * - * This service is just a simple decorator for {@link ng.$timeout $timeout} service - * that adds a "flush" and "verifyNoPendingTasks" methods. - */ - -angular.mock.$TimeoutDecorator = ['$delegate', '$browser', function($delegate, $browser) { - - /** - * @ngdoc method - * @name $timeout#flush - * @description - * - * Flushes the queue of pending tasks. - * - * @param {number=} delay maximum timeout amount to flush up until - */ - $delegate.flush = function(delay) { - $browser.defer.flush(delay); - }; - - /** - * @ngdoc method - * @name $timeout#verifyNoPendingTasks - * @description - * - * Verifies that there are no pending tasks that need to be flushed. - */ - $delegate.verifyNoPendingTasks = function() { - if ($browser.deferredFns.length) { - throw new Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' + - formatPendingTasksAsString($browser.deferredFns)); - } - }; - - function formatPendingTasksAsString(tasks) { - var result = []; - angular.forEach(tasks, function(task) { - result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}'); - }); - - return result.join(', '); - } - - return $delegate; -}]; - -angular.mock.$RAFDecorator = ['$delegate', function($delegate) { - var rafFn = function(fn) { - var index = rafFn.queue.length; - rafFn.queue.push(fn); - return function() { - rafFn.queue.splice(index, 1); - }; - }; - - rafFn.queue = []; - rafFn.supported = $delegate.supported; - - rafFn.flush = function() { - if (rafFn.queue.length === 0) { - throw new Error('No rAF callbacks present'); - } - - var length = rafFn.queue.length; - for (var i = 0; i < length; i++) { - rafFn.queue[i](); - } - - rafFn.queue = rafFn.queue.slice(i); - }; - - return rafFn; -}]; - -/** - * - */ -angular.mock.$RootElementProvider = function() { - this.$get = function() { - return angular.element('
'); - }; -}; - -/** - * @ngdoc service - * @name $controller - * @description - * A decorator for {@link ng.$controller} with additional `bindings` parameter, useful when testing - * controllers of directives that use {@link $compile#-bindtocontroller- `bindToController`}. - * - * - * ## Example - * - * ```js - * - * // Directive definition ... - * - * myMod.directive('myDirective', { - * controller: 'MyDirectiveController', - * bindToController: { - * name: '@' - * } - * }); - * - * - * // Controller definition ... - * - * myMod.controller('MyDirectiveController', ['log', function($log) { - * $log.info(this.name); - * })]; - * - * - * // In a test ... - * - * describe('myDirectiveController', function() { - * it('should write the bound name to the log', inject(function($controller, $log) { - * var ctrl = $controller('MyDirectiveController', { /* no locals */ }, { name: 'Clark Kent' }); - * expect(ctrl.name).toEqual('Clark Kent'); - * expect($log.info.logs).toEqual(['Clark Kent']); - * }); - * }); - * - * ``` - * - * @param {Function|string} constructor If called with a function then it's considered to be the - * controller constructor function. Otherwise it's considered to be a string which is used - * to retrieve the controller constructor using the following steps: - * - * * check if a controller with given name is registered via `$controllerProvider` - * * check if evaluating the string on the current scope returns a constructor - * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global - * `window` object (not recommended) - * - * The string can use the `controller as property` syntax, where the controller instance is published - * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this - * to work correctly. - * - * @param {Object} locals Injection locals for Controller. - * @param {Object=} bindings Properties to add to the controller before invoking the constructor. This is used - * to simulate the `bindToController` feature and simplify certain kinds of tests. - * @return {Object} Instance of given controller. - */ -angular.mock.$ControllerDecorator = ['$delegate', function($delegate) { - return function(expression, locals, later, ident) { - if (later && typeof later === 'object') { - var create = $delegate(expression, locals, true, ident); - angular.extend(create.instance, later); - return create(); - } - return $delegate(expression, locals, later, ident); - }; -}]; - - -/** - * @ngdoc module - * @name ngMock - * @packageName angular-mocks - * @description - * - * # ngMock - * - * The `ngMock` module provides support to inject and mock Angular services into unit tests. - * In addition, ngMock also extends various core ng services such that they can be - * inspected and controlled in a synchronous manner within test code. - * - * - *
- * - */ -angular.module('ngMock', ['ng']).provider({ - $browser: angular.mock.$BrowserProvider, - $exceptionHandler: angular.mock.$ExceptionHandlerProvider, - $log: angular.mock.$LogProvider, - $interval: angular.mock.$IntervalProvider, - $httpBackend: angular.mock.$HttpBackendProvider, - $rootElement: angular.mock.$RootElementProvider -}).config(['$provide', function($provide) { - $provide.decorator('$timeout', angular.mock.$TimeoutDecorator); - $provide.decorator('$$rAF', angular.mock.$RAFDecorator); - $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator); - $provide.decorator('$controller', angular.mock.$ControllerDecorator); -}]); - -/** - * @ngdoc module - * @name ngMockE2E - * @module ngMockE2E - * @packageName angular-mocks - * @description - * - * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing. - * Currently there is only one mock present in this module - - * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock. - */ -angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) { - $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator); -}]); - -/** - * @ngdoc service - * @name $httpBackend - * @module ngMockE2E - * @description - * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of - * applications that use the {@link ng.$http $http service}. - * - * *Note*: For fake http backend implementation suitable for unit testing please see - * {@link ngMock.$httpBackend unit-testing $httpBackend mock}. - * - * This implementation can be used to respond with static or dynamic responses via the `when` api - * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the - * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch - * templates from a webserver). - * - * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application - * is being developed with the real backend api replaced with a mock, it is often desirable for - * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch - * templates or static files from the webserver). To configure the backend with this behavior - * use the `passThrough` request handler of `when` instead of `respond`. - * - * Additionally, we don't want to manually have to flush mocked out requests like we do during unit - * testing. For this reason the e2e $httpBackend flushes mocked out requests - * automatically, closely simulating the behavior of the XMLHttpRequest object. - * - * To setup the application to run with this http backend, you have to create a module that depends - * on the `ngMockE2E` and your application modules and defines the fake backend: - * - * ```js - * myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']); - * myAppDev.run(function($httpBackend) { - * phones = [{name: 'phone1'}, {name: 'phone2'}]; - * - * // returns the current list of phones - * $httpBackend.whenGET('/phones').respond(phones); - * - * // adds a new phone to the phones array - * $httpBackend.whenPOST('/phones').respond(function(method, url, data) { - * var phone = angular.fromJson(data); - * phones.push(phone); - * return [200, phone, {}]; - * }); - * $httpBackend.whenGET(/^\/templates\//).passThrough(); - * //... - * }); - * ``` - * - * Afterwards, bootstrap your app with this new module. - */ - -/** - * @ngdoc method - * @name $httpBackend#when - * @module ngMockE2E - * @description - * Creates a new backend definition. - * - * @param {string} method HTTP method. - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp)=} data HTTP request body. - * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header - * object and returns true if the headers match the current definition. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - * - * - respond – - * `{function([status,] data[, headers, statusText]) - * | function(function(method, url, data, headers)}` - * – The respond method takes a set of static data to be returned or a function that can return - * an array containing response status (number), response data (string), response headers - * (Object), and the text for the status (string). - * - passThrough – `{function()}` – Any request matching a backend definition with - * `passThrough` handler will be passed through to the real backend (an XHR request will be made - * to the server.) - * - Both methods return the `requestHandler` object for possible overrides. - */ - -/** - * @ngdoc method - * @name $httpBackend#whenGET - * @module ngMockE2E - * @description - * Creates a new backend definition for GET requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - */ - -/** - * @ngdoc method - * @name $httpBackend#whenHEAD - * @module ngMockE2E - * @description - * Creates a new backend definition for HEAD requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - */ - -/** - * @ngdoc method - * @name $httpBackend#whenDELETE - * @module ngMockE2E - * @description - * Creates a new backend definition for DELETE requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - */ - -/** - * @ngdoc method - * @name $httpBackend#whenPOST - * @module ngMockE2E - * @description - * Creates a new backend definition for POST requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp)=} data HTTP request body. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - */ - -/** - * @ngdoc method - * @name $httpBackend#whenPUT - * @module ngMockE2E - * @description - * Creates a new backend definition for PUT requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp)=} data HTTP request body. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - */ - -/** - * @ngdoc method - * @name $httpBackend#whenPATCH - * @module ngMockE2E - * @description - * Creates a new backend definition for PATCH requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @param {(string|RegExp)=} data HTTP request body. - * @param {(Object|function(Object))=} headers HTTP headers. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - */ - -/** - * @ngdoc method - * @name $httpBackend#whenJSONP - * @module ngMockE2E - * @description - * Creates a new backend definition for JSONP requests. For more info see `when()`. - * - * @param {string|RegExp|function(string)} url HTTP url or function that receives a url - * and returns true if the url matches the current definition. - * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that - * control how a matched request is handled. You can save this object for later use and invoke - * `respond` or `passThrough` again in order to change how a matched request is handled. - */ -angular.mock.e2e = {}; -angular.mock.e2e.$httpBackendDecorator = - ['$rootScope', '$timeout', '$delegate', '$browser', createHttpBackendMock]; - - -/** - * @ngdoc type - * @name $rootScope.Scope - * @module ngMock - * @description - * {@link ng.$rootScope.Scope Scope} type decorated with helper methods useful for testing. These - * methods are automatically available on any {@link ng.$rootScope.Scope Scope} instance when - * `ngMock` module is loaded. - * - * In addition to all the regular `Scope` methods, the following helper methods are available: - */ -angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) { - - var $rootScopePrototype = Object.getPrototypeOf($delegate); - - $rootScopePrototype.$countChildScopes = countChildScopes; - $rootScopePrototype.$countWatchers = countWatchers; - - return $delegate; - - // ------------------------------------------------------------------------------------------ // - - /** - * @ngdoc method - * @name $rootScope.Scope#$countChildScopes - * @module ngMock - * @description - * Counts all the direct and indirect child scopes of the current scope. - * - * The current scope is excluded from the count. The count includes all isolate child scopes. - * - * @returns {number} Total number of child scopes. - */ - function countChildScopes() { - // jshint validthis: true - var count = 0; // exclude the current scope - var pendingChildHeads = [this.$$childHead]; - var currentScope; - - while (pendingChildHeads.length) { - currentScope = pendingChildHeads.shift(); - - while (currentScope) { - count += 1; - pendingChildHeads.push(currentScope.$$childHead); - currentScope = currentScope.$$nextSibling; - } - } - - return count; - } - - - /** - * @ngdoc method - * @name $rootScope.Scope#$countWatchers - * @module ngMock - * @description - * Counts all the watchers of direct and indirect child scopes of the current scope. - * - * The watchers of the current scope are included in the count and so are all the watchers of - * isolate child scopes. - * - * @returns {number} Total number of watchers. - */ - function countWatchers() { - // jshint validthis: true - var count = this.$$watchers ? this.$$watchers.length : 0; // include the current scope - var pendingChildHeads = [this.$$childHead]; - var currentScope; - - while (pendingChildHeads.length) { - currentScope = pendingChildHeads.shift(); - - while (currentScope) { - count += currentScope.$$watchers ? currentScope.$$watchers.length : 0; - pendingChildHeads.push(currentScope.$$childHead); - currentScope = currentScope.$$nextSibling; - } - } - - return count; - } -}]; - - -if (window.jasmine || window.mocha) { - - var currentSpec = null, - annotatedFunctions = [], - isSpecRunning = function() { - return !!currentSpec; - }; - - angular.mock.$$annotate = angular.injector.$$annotate; - angular.injector.$$annotate = function(fn) { - if (typeof fn === 'function' && !fn.$inject) { - annotatedFunctions.push(fn); - } - return angular.mock.$$annotate.apply(this, arguments); - }; - - - (window.beforeEach || window.setup)(function() { - annotatedFunctions = []; - currentSpec = this; - }); - - (window.afterEach || window.teardown)(function() { - var injector = currentSpec.$injector; - - annotatedFunctions.forEach(function(fn) { - delete fn.$inject; - }); - - angular.forEach(currentSpec.$modules, function(module) { - if (module && module.$$hashKey) { - module.$$hashKey = undefined; - } - }); - - currentSpec.$injector = null; - currentSpec.$modules = null; - currentSpec = null; - - if (injector) { - injector.get('$rootElement').off(); - } - - // clean up jquery's fragment cache - angular.forEach(angular.element.fragments, function(val, key) { - delete angular.element.fragments[key]; - }); - - MockXhr.$$lastInstance = null; - - angular.forEach(angular.callbacks, function(val, key) { - delete angular.callbacks[key]; - }); - angular.callbacks.counter = 0; - }); - - /** - * @ngdoc function - * @name angular.mock.module - * @description - * - * *NOTE*: This function is also published on window for easy access.
- * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha - * - * This function registers a module configuration code. It collects the configuration information - * which will be used when the injector is created by {@link angular.mock.inject inject}. - * - * See {@link angular.mock.inject inject} for usage example - * - * @param {...(string|Function|Object)} fns any number of modules which are represented as string - * aliases or as anonymous module initialization functions. The modules are used to - * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. If an - * object literal is passed they will be registered as values in the module, the key being - * the module name and the value being what is returned. - */ - window.module = angular.mock.module = function() { - var moduleFns = Array.prototype.slice.call(arguments, 0); - return isSpecRunning() ? workFn() : workFn; - ///////////////////// - function workFn() { - if (currentSpec.$injector) { - throw new Error('Injector already created, can not register a module!'); - } else { - var modules = currentSpec.$modules || (currentSpec.$modules = []); - angular.forEach(moduleFns, function(module) { - if (angular.isObject(module) && !angular.isArray(module)) { - modules.push(function($provide) { - angular.forEach(module, function(value, key) { - $provide.value(key, value); - }); - }); - } else { - modules.push(module); - } - }); - } - } - }; - - /** - * @ngdoc function - * @name angular.mock.inject - * @description - * - * *NOTE*: This function is also published on window for easy access.
- * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha - * - * The inject function wraps a function into an injectable function. The inject() creates new - * instance of {@link auto.$injector $injector} per test, which is then used for - * resolving references. - * - * - * ## Resolving References (Underscore Wrapping) - * Often, we would like to inject a reference once, in a `beforeEach()` block and reuse this - * in multiple `it()` clauses. To be able to do this we must assign the reference to a variable - * that is declared in the scope of the `describe()` block. Since we would, most likely, want - * the variable to have the same name of the reference we have a problem, since the parameter - * to the `inject()` function would hide the outer variable. - * - * To help with this, the injected parameters can, optionally, be enclosed with underscores. - * These are ignored by the injector when the reference name is resolved. - * - * For example, the parameter `_myService_` would be resolved as the reference `myService`. - * Since it is available in the function body as _myService_, we can then assign it to a variable - * defined in an outer scope. - * - * ``` - * // Defined out reference variable outside - * var myService; - * - * // Wrap the parameter in underscores - * beforeEach( inject( function(_myService_){ - * myService = _myService_; - * })); - * - * // Use myService in a series of tests. - * it('makes use of myService', function() { - * myService.doStuff(); - * }); - * - * ``` - * - * See also {@link angular.mock.module angular.mock.module} - * - * ## Example - * Example of what a typical jasmine tests looks like with the inject method. - * ```js - * - * angular.module('myApplicationModule', []) - * .value('mode', 'app') - * .value('version', 'v1.0.1'); - * - * - * describe('MyApp', function() { - * - * // You need to load modules that you want to test, - * // it loads only the "ng" module by default. - * beforeEach(module('myApplicationModule')); - * - * - * // inject() is used to inject arguments of all given functions - * it('should provide a version', inject(function(mode, version) { - * expect(version).toEqual('v1.0.1'); - * expect(mode).toEqual('app'); - * })); - * - * - * // The inject and module method can also be used inside of the it or beforeEach - * it('should override a version and test the new version is injected', function() { - * // module() takes functions or strings (module aliases) - * module(function($provide) { - * $provide.value('version', 'overridden'); // override version here - * }); - * - * inject(function(version) { - * expect(version).toEqual('overridden'); - * }); - * }); - * }); - * - * ``` - * - * @param {...Function} fns any number of functions which will be injected using the injector. - */ - - - - var ErrorAddingDeclarationLocationStack = function(e, errorForStack) { - this.message = e.message; - this.name = e.name; - if (e.line) this.line = e.line; - if (e.sourceId) this.sourceId = e.sourceId; - if (e.stack && errorForStack) - this.stack = e.stack + '\n' + errorForStack.stack; - if (e.stackArray) this.stackArray = e.stackArray; - }; - ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString; - - window.inject = angular.mock.inject = function() { - var blockFns = Array.prototype.slice.call(arguments, 0); - var errorForStack = new Error('Declaration Location'); - return isSpecRunning() ? workFn.call(currentSpec) : workFn; - ///////////////////// - function workFn() { - var modules = currentSpec.$modules || []; - var strictDi = !!currentSpec.$injectorStrict; - modules.unshift('ngMock'); - modules.unshift('ng'); - var injector = currentSpec.$injector; - if (!injector) { - if (strictDi) { - // If strictDi is enabled, annotate the providerInjector blocks - angular.forEach(modules, function(moduleFn) { - if (typeof moduleFn === "function") { - angular.injector.$$annotate(moduleFn); - } - }); - } - injector = currentSpec.$injector = angular.injector(modules, strictDi); - currentSpec.$injectorStrict = strictDi; - } - for (var i = 0, ii = blockFns.length; i < ii; i++) { - if (currentSpec.$injectorStrict) { - // If the injector is strict / strictDi, and the spec wants to inject using automatic - // annotation, then annotate the function here. - injector.annotate(blockFns[i]); - } - try { - /* jshint -W040 *//* Jasmine explicitly provides a `this` object when calling functions */ - injector.invoke(blockFns[i] || angular.noop, this); - /* jshint +W040 */ - } catch (e) { - if (e.stack && errorForStack) { - throw new ErrorAddingDeclarationLocationStack(e, errorForStack); - } - throw e; - } finally { - errorForStack = null; - } - } - } - }; - - - angular.mock.inject.strictDi = function(value) { - value = arguments.length ? !!value : true; - return isSpecRunning() ? workFn() : workFn; - - function workFn() { - if (value !== currentSpec.$injectorStrict) { - if (currentSpec.$injector) { - throw new Error('Injector already created, can not modify strict annotations'); - } else { - currentSpec.$injectorStrict = value; - } - } - } - }; -} - - -})(window, window.angular); diff --git a/js/vendor/angular-mocks/bower.json b/js/vendor/angular-mocks/bower.json deleted file mode 100644 index 1158b54c..00000000 --- a/js/vendor/angular-mocks/bower.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "angular-mocks", - "version": "1.4.7", - "main": "./angular-mocks.js", - "ignore": [], - "dependencies": { - "angular": "1.4.7" - } -} diff --git a/js/vendor/angular-mocks/ngAnimateMock.js b/js/vendor/angular-mocks/ngAnimateMock.js deleted file mode 100644 index 6f99e62e..00000000 --- a/js/vendor/angular-mocks/ngAnimateMock.js +++ /dev/null @@ -1,2 +0,0 @@ -require('./angular-mocks'); -module.exports = 'ngAnimateMock'; diff --git a/js/vendor/angular-mocks/ngMock.js b/js/vendor/angular-mocks/ngMock.js deleted file mode 100644 index 7944de7d..00000000 --- a/js/vendor/angular-mocks/ngMock.js +++ /dev/null @@ -1,2 +0,0 @@ -require('./angular-mocks'); -module.exports = 'ngMock'; diff --git a/js/vendor/angular-mocks/ngMockE2E.js b/js/vendor/angular-mocks/ngMockE2E.js deleted file mode 100644 index fc2e539d..00000000 --- a/js/vendor/angular-mocks/ngMockE2E.js +++ /dev/null @@ -1,2 +0,0 @@ -require('./angular-mocks'); -module.exports = 'ngMockE2E'; diff --git a/js/vendor/angular-mocks/package.json b/js/vendor/angular-mocks/package.json deleted file mode 100644 index 4369e173..00000000 --- a/js/vendor/angular-mocks/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "angular-mocks", - "version": "1.4.7", - "description": "AngularJS mocks for testing", - "main": "angular-mocks.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "https://github.com/angular/angular.js.git" - }, - "keywords": [ - "angular", - "framework", - "browser", - "mocks", - "testing", - "client-side" - ], - "author": "Angular Core Team ", - "license": "MIT", - "bugs": { - "url": "https://github.com/angular/angular.js/issues" - }, - "homepage": "http://angularjs.org" -} diff --git a/js/vendor/angular-route/.bower.json b/js/vendor/angular-route/.bower.json index 2a0fbaed..59f80b0e 100644 --- a/js/vendor/angular-route/.bower.json +++ b/js/vendor/angular-route/.bower.json @@ -1,19 +1,20 @@ { "name": "angular-route", - "version": "1.4.7", + "version": "1.5.11", + "license": "MIT", "main": "./angular-route.js", "ignore": [], "dependencies": { - "angular": "1.4.7" + "angular": "1.5.11" }, "homepage": "https://github.com/angular/bower-angular-route", - "_release": "1.4.7", + "_release": "1.5.11", "_resolution": { "type": "version", - "tag": "v1.4.7", - "commit": "f6f9c6760d15a993776afd5d2fafb456ee1e09d9" + "tag": "v1.5.11", + "commit": "cdb9db456ece8b3f80a638bb7bd69dc2dcd4eee9" }, - "_source": "git://github.com/angular/bower-angular-route.git", - "_target": "1.4.*", + "_source": "https://github.com/angular/bower-angular-route.git", + "_target": "1.5.*", "_originalSource": "angular-route" } \ No newline at end of file diff --git a/js/vendor/angular-route/LICENSE.md b/js/vendor/angular-route/LICENSE.md new file mode 100644 index 00000000..2c395eef --- /dev/null +++ b/js/vendor/angular-route/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Angular + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/js/vendor/angular-route/angular-route.js b/js/vendor/angular-route/angular-route.js index f212064d..835d8633 100644 --- a/js/vendor/angular-route/angular-route.js +++ b/js/vendor/angular-route/angular-route.js @@ -1,9 +1,43 @@ /** - * @license AngularJS v1.4.7 - * (c) 2010-2015 Google, Inc. http://angularjs.org + * @license AngularJS v1.5.11 + * (c) 2010-2017 Google, Inc. http://angularjs.org * License: MIT */ -(function(window, angular, undefined) {'use strict'; +(function(window, angular) {'use strict'; + +/* global shallowCopy: true */ + +/** + * Creates a shallow copy of an object, an array or a primitive. + * + * Assumes that there are no proto properties for objects. + */ +function shallowCopy(src, dst) { + if (isArray(src)) { + dst = dst || []; + + for (var i = 0, ii = src.length; i < ii; i++) { + dst[i] = src[i]; + } + } else if (isObject(src)) { + dst = dst || {}; + + for (var key in src) { + if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { + dst[key] = src[key]; + } + } + } + + return dst || src; +} + +/* global shallowCopy: false */ + +// There are necessary for `shallowCopy()` (included via `src/shallowCopy.js`). +// They are initialized inside the `$RouteProvider`, to ensure `window.angular` is available. +var isArray; +var isObject; /** * @ngdoc module @@ -28,6 +62,7 @@ var ngRouteModule = angular.module('ngRoute', ['ng']). /** * @ngdoc provider * @name $routeProvider + * @this * * @description * @@ -40,6 +75,9 @@ var ngRouteModule = angular.module('ngRoute', ['ng']). * Requires the {@link ngRoute `ngRoute`} module to be installed. */ function $RouteProvider() { + isArray = angular.isArray; + isObject = angular.isObject; + function inherit(parent, extra) { return angular.extend(Object.create(parent), extra); } @@ -105,8 +143,17 @@ function $RouteProvider() { * If all the promises are resolved successfully, the values of the resolved promises are * injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is * fired. If any of the promises are rejected the - * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object - * is: + * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. + * For easier access to the resolved dependencies from the template, the `resolve` map will + * be available on the scope of the route, under `$resolve` (by default) or a custom name + * specified by the `resolveAs` property (see below). This can be particularly useful, when + * working with {@link angular.Module#component components} as route templates.
+ *
+ * **Note:** If your scope already contains a property with this name, it will be hidden + * or overwritten. Make sure, you specify an appropriate name for this property, that + * does not collide with other properties on the scope. + *
+ * The map object is: * * - `key` – `{string}`: a name of a dependency to be injected into the controller. * - `factory` - `{string|function}`: If `string` then it is an alias for a service. @@ -116,7 +163,10 @@ function $RouteProvider() { * `ngRoute.$routeParams` will still refer to the previous route within these resolve * functions. Use `$route.current.params` to access the new route parameters, instead. * - * - `redirectTo` – {(string|function())=} – value to update + * - `resolveAs` - `{string=}` - The name under which the `resolve` map will be available on + * the scope of the route. If omitted, defaults to `$resolve`. + * + * - `redirectTo` – `{(string|function())=}` – value to update * {@link ng.$location $location} path with and trigger route redirection. * * If `redirectTo` is a function, it will be called with the following parameters: @@ -129,13 +179,13 @@ function $RouteProvider() { * The custom `redirectTo` function is expected to return a string which will be used * to update `$location.path()` and `$location.search()`. * - * - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()` + * - `[reloadOnSearch=true]` - `{boolean=}` - reload route when only `$location.search()` * or `$location.hash()` changes. * * If the option is set to `false` and url in the browser changes, then * `$routeUpdate` event is broadcasted on the root scope. * - * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive + * - `[caseInsensitiveMatch=false]` - `{boolean=}` - match routes without being case sensitive * * If the option is set to `true`, then the particular route can be matched without being * case sensitive @@ -147,7 +197,7 @@ function $RouteProvider() { */ this.when = function(path, route) { //copy original route object to preserve params inherited from proto chain - var routeCopy = angular.copy(route); + var routeCopy = shallowCopy(route); if (angular.isUndefined(routeCopy.reloadOnSearch)) { routeCopy.reloadOnSearch = true; } @@ -161,7 +211,7 @@ function $RouteProvider() { // create redirection for trailing slashes if (path) { - var redirectPath = (path[path.length - 1] == '/') + var redirectPath = (path[path.length - 1] === '/') ? path.substr(0, path.length - 1) : path + '/'; @@ -206,9 +256,9 @@ function $RouteProvider() { path = path .replace(/([().])/g, '\\$1') - .replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option) { - var optional = option === '?' ? option : null; - var star = option === '*' ? option : null; + .replace(/(\/)?:(\w+)(\*\?|[?*])?/g, function(_, slash, key, option) { + var optional = (option === '?' || option === '*?') ? '?' : null; + var star = (option === '*' || option === '*?') ? '*' : null; keys.push({ name: key, optional: !!optional }); slash = slash || ''; return '' @@ -220,7 +270,7 @@ function $RouteProvider() { + ')' + (optional || ''); }) - .replace(/([\/$\*])/g, '\\$1'); + .replace(/([/$*])/g, '\\$1'); ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : ''); return ret; @@ -265,7 +315,7 @@ function $RouteProvider() { * @property {Object} current Reference to the current route definition. * The route definition contains: * - * - `controller`: The controller constructor as define in route definition. + * - `controller`: The controller constructor as defined in the route definition. * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for * controller instantiation. The `locals` contain * the resolved values of the `resolve` map. Additionally the `locals` also contain: @@ -273,6 +323,10 @@ function $RouteProvider() { * - `$scope` - The current route scope. * - `$template` - The current route template HTML. * + * The `locals` will be assigned to the route scope's `$resolve` property. You can override + * the property name, using `resolveAs` in the route definition. See + * {@link ngRoute.$routeProvider $routeProvider} for more info. + * * @property {Object} routes Object with all route configuration Objects as its properties. * * @description @@ -335,12 +389,12 @@ function $RouteProvider() { * }) * * .controller('BookController', function($scope, $routeParams) { - * $scope.name = "BookController"; + * $scope.name = 'BookController'; * $scope.params = $routeParams; * }) * * .controller('ChapterController', function($scope, $routeParams) { - * $scope.name = "ChapterController"; + * $scope.name = 'ChapterController'; * $scope.params = $routeParams; * }) * @@ -373,15 +427,15 @@ function $RouteProvider() { * it('should load and compile correct template', function() { * element(by.linkText('Moby: Ch1')).click(); * var content = element(by.css('[ng-view]')).getText(); - * expect(content).toMatch(/controller\: ChapterController/); - * expect(content).toMatch(/Book Id\: Moby/); - * expect(content).toMatch(/Chapter Id\: 1/); + * expect(content).toMatch(/controller: ChapterController/); + * expect(content).toMatch(/Book Id: Moby/); + * expect(content).toMatch(/Chapter Id: 1/); * * element(by.partialLinkText('Scarlet')).click(); * * content = element(by.css('[ng-view]')).getText(); - * expect(content).toMatch(/controller\: BookController/); - * expect(content).toMatch(/Book Id\: Scarlet/); + * expect(content).toMatch(/controller: BookController/); + * expect(content).toMatch(/Book Id: Scarlet/); * }); * * @@ -468,10 +522,18 @@ function $RouteProvider() { */ reload: function() { forceReload = true; + + var fakeLocationEvent = { + defaultPrevented: false, + preventDefault: function fakePreventDefault() { + this.defaultPrevented = true; + forceReload = false; + } + }; + $rootScope.$evalAsync(function() { - // Don't support cancellation of a reload for now... - prepareRoute(); - commitRoute(); + prepareRoute(fakeLocationEvent); + if (!fakeLocationEvent.defaultPrevented) commitRoute(); }); }, @@ -580,38 +642,10 @@ function $RouteProvider() { } $q.when(nextRoute). - then(function() { - if (nextRoute) { - var locals = angular.extend({}, nextRoute.resolve), - template, templateUrl; - - angular.forEach(locals, function(value, key) { - locals[key] = angular.isString(value) ? - $injector.get(value) : $injector.invoke(value, null, null, key); - }); - - if (angular.isDefined(template = nextRoute.template)) { - if (angular.isFunction(template)) { - template = template(nextRoute.params); - } - } else if (angular.isDefined(templateUrl = nextRoute.templateUrl)) { - if (angular.isFunction(templateUrl)) { - templateUrl = templateUrl(nextRoute.params); - } - if (angular.isDefined(templateUrl)) { - nextRoute.loadedTemplateUrl = $sce.valueOf(templateUrl); - template = $templateRequest(templateUrl); - } - } - if (angular.isDefined(template)) { - locals['$template'] = template; - } - return $q.all(locals); - } - }). + then(resolveLocals). then(function(locals) { // after route change - if (nextRoute == $route.current) { + if (nextRoute === $route.current) { if (nextRoute) { nextRoute.locals = locals; angular.copy(nextRoute.params, $routeParams); @@ -619,13 +653,48 @@ function $RouteProvider() { $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute); } }, function(error) { - if (nextRoute == $route.current) { + if (nextRoute === $route.current) { $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error); } }); } } + function resolveLocals(route) { + if (route) { + var locals = angular.extend({}, route.resolve); + angular.forEach(locals, function(value, key) { + locals[key] = angular.isString(value) ? + $injector.get(value) : + $injector.invoke(value, null, null, key); + }); + var template = getTemplateFor(route); + if (angular.isDefined(template)) { + locals['$template'] = template; + } + return $q.all(locals); + } + } + + + function getTemplateFor(route) { + var template, templateUrl; + if (angular.isDefined(template = route.template)) { + if (angular.isFunction(template)) { + template = template(route.params); + } + } else if (angular.isDefined(templateUrl = route.templateUrl)) { + if (angular.isFunction(templateUrl)) { + templateUrl = templateUrl(route.params); + } + if (angular.isDefined(templateUrl)) { + route.loadedTemplateUrl = $sce.valueOf(templateUrl); + template = $templateRequest(templateUrl); + } + } + return template; + } + /** * @returns {Object} the current active route, by matching it against the URL @@ -673,6 +742,7 @@ ngRouteModule.provider('$routeParams', $RouteParamsProvider); * @ngdoc service * @name $routeParams * @requires $route + * @this * * @description * The `$routeParams` service allows you to retrieve the current set of route parameters. @@ -725,11 +795,20 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory); * Requires the {@link ngRoute `ngRoute`} module to be installed. * * @animations - * enter - animation is used to bring new content into the browser. - * leave - animation is used to animate existing content away. + * | Animation | Occurs | + * |----------------------------------|-------------------------------------| + * | {@link ng.$animate#enter enter} | when the new element is inserted to the DOM | + * | {@link ng.$animate#leave leave} | when the old element is removed from to the DOM | * * The enter and leave animation occur concurrently. * + * @knownIssue If `ngView` is contained in an asynchronously loaded template (e.g. in another + * directive's templateUrl or in a template loaded using `ngInclude`), then you need to + * make sure that `$route` is instantiated in time to capture the initial + * `$locationChangeStart` event and load the appropriate view. One way to achieve this + * is to have it as a dependency in a `.run` block: + * `myModule.run(['$route', function() {}]);` + * * @scope * @priority 400 * @param {string=} onload Expression to evaluate whenever the view updates. @@ -840,17 +919,17 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory); $locationProvider.html5Mode(true); }]) .controller('MainCtrl', ['$route', '$routeParams', '$location', - function($route, $routeParams, $location) { + function MainCtrl($route, $routeParams, $location) { this.$route = $route; this.$location = $location; this.$routeParams = $routeParams; }]) - .controller('BookCtrl', ['$routeParams', function($routeParams) { - this.name = "BookCtrl"; + .controller('BookCtrl', ['$routeParams', function BookCtrl($routeParams) { + this.name = 'BookCtrl'; this.params = $routeParams; }]) - .controller('ChapterCtrl', ['$routeParams', function($routeParams) { - this.name = "ChapterCtrl"; + .controller('ChapterCtrl', ['$routeParams', function ChapterCtrl($routeParams) { + this.name = 'ChapterCtrl'; this.params = $routeParams; }]); @@ -860,15 +939,15 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory); it('should load and compile correct template', function() { element(by.linkText('Moby: Ch1')).click(); var content = element(by.css('[ng-view]')).getText(); - expect(content).toMatch(/controller\: ChapterCtrl/); - expect(content).toMatch(/Book Id\: Moby/); - expect(content).toMatch(/Chapter Id\: 1/); + expect(content).toMatch(/controller: ChapterCtrl/); + expect(content).toMatch(/Book Id: Moby/); + expect(content).toMatch(/Chapter Id: 1/); element(by.partialLinkText('Scarlet')).click(); content = element(by.css('[ng-view]')).getText(); - expect(content).toMatch(/controller\: BookCtrl/); - expect(content).toMatch(/Book Id\: Scarlet/); + expect(content).toMatch(/controller: BookCtrl/); + expect(content).toMatch(/Book Id: Scarlet/); }); @@ -911,8 +990,8 @@ function ngViewFactory($route, $anchorScroll, $animate) { } if (currentElement) { previousLeaveAnimation = $animate.leave(currentElement); - previousLeaveAnimation.then(function() { - previousLeaveAnimation = null; + previousLeaveAnimation.done(function(response) { + if (response !== false) previousLeaveAnimation = null; }); currentElement = null; } @@ -933,8 +1012,8 @@ function ngViewFactory($route, $anchorScroll, $animate) { // function is called before linking the content, which would apply child // directives to non existing elements. var clone = $transclude(newScope, function(clone) { - $animate.enter(clone, null, currentElement || $element).then(function onNgViewEnter() { - if (angular.isDefined(autoScrollExp) + $animate.enter(clone, null, currentElement || $element).done(function onNgViewEnter(response) { + if (response !== false && angular.isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) { $anchorScroll(); } @@ -981,6 +1060,7 @@ function ngViewFillContentFactory($compile, $controller, $route) { $element.data('$ngControllerController', controller); $element.children().data('$ngControllerController', controller); } + scope[current.resolveAs || '$resolve'] = locals; link(scope); } diff --git a/js/vendor/angular-route/angular-route.min.js b/js/vendor/angular-route/angular-route.min.js index 4fe8359b..3d38b601 100644 --- a/js/vendor/angular-route/angular-route.min.js +++ b/js/vendor/angular-route/angular-route.min.js @@ -1,15 +1,16 @@ /* - AngularJS v1.4.7 - (c) 2010-2015 Google, Inc. http://angularjs.org + AngularJS v1.5.11 + (c) 2010-2017 Google, Inc. http://angularjs.org License: MIT */ -(function(p,c,C){'use strict';function v(r,h,g){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,f,b,d,y){function z(){k&&(g.cancel(k),k=null);l&&(l.$destroy(),l=null);m&&(k=g.leave(m),k.then(function(){k=null}),m=null)}function x(){var b=r.current&&r.current.locals;if(c.isDefined(b&&b.$template)){var b=a.$new(),d=r.current;m=y(b,function(b){g.enter(b,null,m||f).then(function(){!c.isDefined(t)||t&&!a.$eval(t)||h()});z()});l=d.scope=b;l.$emit("$viewContentLoaded"); -l.$eval(w)}else z()}var l,m,k,t=b.autoscroll,w=b.onload||"";a.$on("$routeChangeSuccess",x);x()}}}function A(c,h,g){return{restrict:"ECA",priority:-400,link:function(a,f){var b=g.current,d=b.locals;f.html(d.$template);var y=c(f.contents());b.controller&&(d.$scope=a,d=h(b.controller,d),b.controllerAs&&(a[b.controllerAs]=d),f.data("$ngControllerController",d),f.children().data("$ngControllerController",d));y(a)}}}p=c.module("ngRoute",["ng"]).provider("$route",function(){function r(a,f){return c.extend(Object.create(a), -f)}function h(a,c){var b=c.caseInsensitiveMatch,d={originalPath:a,regexp:a},g=d.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,c,b,d){a="?"===d?d:null;d="*"===d?d:null;g.push({name:b,optional:!!a});c=c||"";return""+(a?"":c)+"(?:"+(a?c:"")+(d&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");d.regexp=new RegExp("^"+a+"$",b?"i":"");return d}var g={};this.when=function(a,f){var b=c.copy(f);c.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0); -c.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);g[a]=c.extend(b,a&&h(a,b));if(a){var d="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";g[d]=c.extend({redirectTo:a},h(d,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(a,f,b,d,h,p,x){function l(b){var e=s.current; -(v=(n=k())&&e&&n.$$route===e.$$route&&c.equals(n.pathParams,e.pathParams)&&!n.reloadOnSearch&&!w)||!e&&!n||a.$broadcast("$routeChangeStart",n,e).defaultPrevented&&b&&b.preventDefault()}function m(){var u=s.current,e=n;if(v)u.params=e.params,c.copy(u.params,b),a.$broadcast("$routeUpdate",u);else if(e||u)w=!1,(s.current=e)&&e.redirectTo&&(c.isString(e.redirectTo)?f.path(t(e.redirectTo,e.params)).search(e.params).replace():f.url(e.redirectTo(e.pathParams,f.path(),f.search())).replace()),d.when(e).then(function(){if(e){var a= -c.extend({},e.resolve),b,f;c.forEach(a,function(b,e){a[e]=c.isString(b)?h.get(b):h.invoke(b,null,null,e)});c.isDefined(b=e.template)?c.isFunction(b)&&(b=b(e.params)):c.isDefined(f=e.templateUrl)&&(c.isFunction(f)&&(f=f(e.params)),c.isDefined(f)&&(e.loadedTemplateUrl=x.valueOf(f),b=p(f)));c.isDefined(b)&&(a.$template=b);return d.all(a)}}).then(function(f){e==s.current&&(e&&(e.locals=f,c.copy(e.params,b)),a.$broadcast("$routeChangeSuccess",e,u))},function(b){e==s.current&&a.$broadcast("$routeChangeError", -e,u,b)})}function k(){var a,b;c.forEach(g,function(d,g){var q;if(q=!b){var h=f.path();q=d.keys;var l={};if(d.regexp)if(h=d.regexp.exec(h)){for(var k=1,m=h.length;k= 0 && ((length - 1) in obj || obj instanceof Array) || typeof obj.item === 'function'); - return isString(obj) || isArray(obj) || length === 0 || - typeof length === 'number' && length > 0 && (length - 1) in obj; } /** @@ -300,7 +289,7 @@ function isArrayLike(obj) { * * Unlike ES262's * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18), - * Providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just + * providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just * return the value provided. * ```js @@ -325,7 +314,7 @@ function forEach(obj, iterator, context) { for (key in obj) { // Need to check if hasOwnProperty exists, // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function - if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + if (key !== 'prototype' && key !== 'length' && key !== 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { iterator.call(context, obj[key], key, obj); } } @@ -377,7 +366,7 @@ function forEachSorted(obj, iterator, context) { * @returns {function(*, string)} */ function reverseParams(iteratorFn) { - return function(value, key) { iteratorFn(key, value); }; + return function(value, key) {iteratorFn(key, value);}; } /** @@ -425,6 +414,10 @@ function baseExtend(dst, objs, deep) { dst[key] = new Date(src.valueOf()); } else if (isRegExp(src)) { dst[key] = new RegExp(src); + } else if (src.nodeName) { + dst[key] = src.cloneNode(true); + } else if (isElement(src)) { + dst[key] = src.clone(); } else { if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {}; baseExtend(dst[key], [src], true); @@ -490,6 +483,11 @@ function toInt(str) { return parseInt(str, 10); } +var isNumberNaN = Number.isNaN || function isNumberNaN(num) { + // eslint-disable-next-line no-self-compare + return num !== num; +}; + function inherit(parent, extra) { return extend(Object.create(parent), extra); @@ -526,21 +524,31 @@ noop.$inject = []; * functional style. * ```js - function transformer(transformationFn, value) { - return (transformationFn || angular.identity)(value); - }; + function transformer(transformationFn, value) { + return (transformationFn || angular.identity)(value); + }; + + // E.g. + function getResult(fn, input) { + return (fn || angular.identity)(input); + }; + + getResult(function(n) { return n * 2; }, 21); // returns 42 + getResult(null, 21); // returns 21 + getResult(undefined, 21); // returns 21 ``` - * @param {*} value to be returned. - * @returns {*} the value passed in. + * + * @param {*} value to be returned. + * @returns {*} the value passed in. */ function identity($) {return $;} identity.$inject = []; -function valueFn(value) {return function() {return value;};} +function valueFn(value) {return function valueRef() {return value;};} function hasCustomToString(obj) { - return isFunction(obj.toString) && obj.toString !== Object.prototype.toString; + return isFunction(obj.toString) && obj.toString !== toString; } @@ -663,7 +671,7 @@ function isDate(value) { * @kind function * * @description - * Determines if a reference is an `Array`. + * Determines if a reference is an `Array`. Alias of Array.isArray. * * @param {*} value Reference to check. * @returns {boolean} True if `value` is an `Array`. @@ -739,9 +747,13 @@ function isPromiseLike(obj) { } -var TYPED_ARRAY_REGEXP = /^\[object (Uint8(Clamped)?)|(Uint16)|(Uint32)|(Int8)|(Int16)|(Int32)|(Float(32)|(64))Array\]$/; +var TYPED_ARRAY_REGEXP = /^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/; function isTypedArray(value) { - return TYPED_ARRAY_REGEXP.test(toString.call(value)); + return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value)); +} + +function isArrayBuffer(obj) { + return toString.call(obj) === '[object ArrayBuffer]'; } @@ -753,8 +765,10 @@ var trim = function(value) { // http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021 // Prereq: s is a string. var escapeForRegexp = function(s) { - return s.replace(/([-()\[\]{}+?*.$\^|,:# + *
+ * Only enumerable properties are taken into account. Non-enumerable properties (both on `source` + * and on `destination`) will be ignored. + *
* * @param {*} source The source that will be used to make a copy. * Can be any type, including primitives, `null`, and `undefined`. @@ -827,161 +847,181 @@ function arrayRemove(array, value) { * @returns {*} The copy or updated `destination`, if `destination` was specified. * * @example - - -
-
- Name:
- E-mail:
- Gender: male - female
- - -
-
form = {{user | json}}
-
master = {{master | json}}
-
+ + +
+
+
+
+ Gender: +
+ + +
+
form = {{user | json}}
+
master = {{master | json}}
+
+
+ + // Module: copyExample + angular. + module('copyExample', []). + controller('ExampleController', ['$scope', function($scope) { + $scope.master = {}; - - -
+ $scope.reset(); + }]); +
+
*/ -function copy(source, destination, stackSource, stackDest) { - if (isWindow(source) || isScope(source)) { - throw ngMinErr('cpws', - "Can't copy! Making copies of Window or Scope instances is not supported."); - } - if (isTypedArray(destination)) { - throw ngMinErr('cpta', - "Can't copy! TypedArray destination cannot be mutated."); - } +function copy(source, destination) { + var stackSource = []; + var stackDest = []; - if (!destination) { - destination = source; - if (isObject(source)) { - var index; - if (stackSource && (index = stackSource.indexOf(source)) !== -1) { - return stackDest[index]; - } - - // TypedArray, Date and RegExp have specific copy functionality and must be - // pushed onto the stack before returning. - // Array and other objects create the base object and recurse to copy child - // objects. The array/object will be pushed onto the stack when recursed. - if (isArray(source)) { - return copy(source, [], stackSource, stackDest); - } else if (isTypedArray(source)) { - destination = new source.constructor(source); - } else if (isDate(source)) { - destination = new Date(source.getTime()); - } else if (isRegExp(source)) { - destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); - destination.lastIndex = source.lastIndex; - } else if (isFunction(source.cloneNode)) { - destination = source.cloneNode(true); - } else { - var emptyObject = Object.create(getPrototypeOf(source)); - return copy(source, emptyObject, stackSource, stackDest); - } - - if (stackDest) { - stackSource.push(source); - stackDest.push(destination); - } + if (destination) { + if (isTypedArray(destination) || isArrayBuffer(destination)) { + throw ngMinErr('cpta', 'Can\'t copy! TypedArray destination cannot be mutated.'); } - } else { - if (source === destination) throw ngMinErr('cpi', - "Can't copy! Source and destination are identical."); - - stackSource = stackSource || []; - stackDest = stackDest || []; - - if (isObject(source)) { - stackSource.push(source); - stackDest.push(destination); + if (source === destination) { + throw ngMinErr('cpi', 'Can\'t copy! Source and destination are identical.'); } - var result, key; - if (isArray(source)) { + // Empty the destination object + if (isArray(destination)) { destination.length = 0; - for (var i = 0; i < source.length; i++) { - destination.push(copy(source[i], null, stackSource, stackDest)); + } else { + forEach(destination, function(value, key) { + if (key !== '$$hashKey') { + delete destination[key]; + } + }); + } + + stackSource.push(source); + stackDest.push(destination); + return copyRecurse(source, destination); + } + + return copyElement(source); + + function copyRecurse(source, destination) { + var h = destination.$$hashKey; + var key; + if (isArray(source)) { + for (var i = 0, ii = source.length; i < ii; i++) { + destination.push(copyElement(source[i])); + } + } else if (isBlankObject(source)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in source) { + destination[key] = copyElement(source[key]); + } + } else if (source && typeof source.hasOwnProperty === 'function') { + // Slow path, which must rely on hasOwnProperty + for (key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = copyElement(source[key]); + } } } else { - var h = destination.$$hashKey; - if (isArray(destination)) { - destination.length = 0; - } else { - forEach(destination, function(value, key) { - delete destination[key]; - }); - } - if (isBlankObject(source)) { - // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty - for (key in source) { - destination[key] = copy(source[key], null, stackSource, stackDest); - } - } else if (source && typeof source.hasOwnProperty === 'function') { - // Slow path, which must rely on hasOwnProperty - for (key in source) { - if (source.hasOwnProperty(key)) { - destination[key] = copy(source[key], null, stackSource, stackDest); - } - } - } else { - // Slowest path --- hasOwnProperty can't be called as a method - for (key in source) { - if (hasOwnProperty.call(source, key)) { - destination[key] = copy(source[key], null, stackSource, stackDest); - } + // Slowest path --- hasOwnProperty can't be called as a method + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = copyElement(source[key]); } } - setHashKey(destination,h); - } - } - return destination; -} - -/** - * Creates a shallow copy of an object, an array or a primitive. - * - * Assumes that there are no proto properties for objects. - */ -function shallowCopy(src, dst) { - if (isArray(src)) { - dst = dst || []; - - for (var i = 0, ii = src.length; i < ii; i++) { - dst[i] = src[i]; - } - } else if (isObject(src)) { - dst = dst || {}; - - for (var key in src) { - if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { - dst[key] = src[key]; - } } + setHashKey(destination, h); + return destination; } - return dst || src; + function copyElement(source) { + // Simple values + if (!isObject(source)) { + return source; + } + + // Already copied values + var index = stackSource.indexOf(source); + if (index !== -1) { + return stackDest[index]; + } + + if (isWindow(source) || isScope(source)) { + throw ngMinErr('cpws', + 'Can\'t copy! Making copies of Window or Scope instances is not supported.'); + } + + var needsRecurse = false; + var destination = copyType(source); + + if (destination === undefined) { + destination = isArray(source) ? [] : Object.create(getPrototypeOf(source)); + needsRecurse = true; + } + + stackSource.push(source); + stackDest.push(destination); + + return needsRecurse + ? copyRecurse(source, destination) + : destination; + } + + function copyType(source) { + switch (toString.call(source)) { + case '[object Int8Array]': + case '[object Int16Array]': + case '[object Int32Array]': + case '[object Float32Array]': + case '[object Float64Array]': + case '[object Uint8Array]': + case '[object Uint8ClampedArray]': + case '[object Uint16Array]': + case '[object Uint32Array]': + return new source.constructor(copyElement(source.buffer), source.byteOffset, source.length); + + case '[object ArrayBuffer]': + // Support: IE10 + if (!source.slice) { + // If we're in this case we know the environment supports ArrayBuffer + /* eslint-disable no-undef */ + var copied = new ArrayBuffer(source.byteLength); + new Uint8Array(copied).set(new Uint8Array(source)); + /* eslint-enable */ + return copied; + } + return source.slice(0); + + case '[object Boolean]': + case '[object Number]': + case '[object String]': + case '[object Date]': + return new source.constructor(source.valueOf()); + + case '[object RegExp]': + var re = new RegExp(source.source, source.toString().match(/[^/]*$/)[0]); + re.lastIndex = source.lastIndex; + return re; + + case '[object Blob]': + return new source.constructor([source], {type: source.type}); + } + + if (isFunction(source.cloneNode)) { + return source.cloneNode(true); + } + } } @@ -1013,44 +1053,78 @@ function shallowCopy(src, dst) { * @param {*} o1 Object or value to compare. * @param {*} o2 Object or value to compare. * @returns {boolean} True if arguments are equal. + * + * @example + + +
+
+

User 1

+ Name: + Age: + +

User 2

+ Name: + Age: + +
+
+ +
+ User 1:
{{user1 | json}}
+ User 2:
{{user2 | json}}
+ Equal:
{{result}}
+
+
+
+ + angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) { + $scope.user1 = {}; + $scope.user2 = {}; + $scope.compare = function() { + $scope.result = angular.equals($scope.user1, $scope.user2); + }; + }]); + +
*/ function equals(o1, o2) { if (o1 === o2) return true; if (o1 === null || o2 === null) return false; + // eslint-disable-next-line no-self-compare if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN var t1 = typeof o1, t2 = typeof o2, length, key, keySet; - if (t1 == t2) { - if (t1 == 'object') { - if (isArray(o1)) { - if (!isArray(o2)) return false; - if ((length = o1.length) == o2.length) { - for (key = 0; key < length; key++) { - if (!equals(o1[key], o2[key])) return false; - } - return true; - } - } else if (isDate(o1)) { - if (!isDate(o2)) return false; - return equals(o1.getTime(), o2.getTime()); - } else if (isRegExp(o1)) { - return isRegExp(o2) ? o1.toString() == o2.toString() : false; - } else { - if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || - isArray(o2) || isDate(o2) || isRegExp(o2)) return false; - keySet = createMap(); - for (key in o1) { - if (key.charAt(0) === '$' || isFunction(o1[key])) continue; + if (t1 === t2 && t1 === 'object') { + if (isArray(o1)) { + if (!isArray(o2)) return false; + if ((length = o1.length) === o2.length) { + for (key = 0; key < length; key++) { if (!equals(o1[key], o2[key])) return false; - keySet[key] = true; - } - for (key in o2) { - if (!(key in keySet) && - key.charAt(0) !== '$' && - isDefined(o2[key]) && - !isFunction(o2[key])) return false; } return true; } + } else if (isDate(o1)) { + if (!isDate(o2)) return false; + return equals(o1.getTime(), o2.getTime()); + } else if (isRegExp(o1)) { + if (!isRegExp(o2)) return false; + return o1.toString() === o2.toString(); + } else { + if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || + isArray(o2) || isDate(o2) || isRegExp(o2)) return false; + keySet = createMap(); + for (key in o1) { + if (key.charAt(0) === '$' || isFunction(o1[key])) continue; + if (!equals(o1[key], o2[key])) return false; + keySet[key] = true; + } + for (key in o2) { + if (!(key in keySet) && + key.charAt(0) !== '$' && + isDefined(o2[key]) && + !isFunction(o2[key])) return false; + } + return true; } } return false; @@ -1060,8 +1134,8 @@ var csp = function() { if (!isDefined(csp.rules)) { - var ngCspElement = (document.querySelector('[ng-csp]') || - document.querySelector('[data-ng-csp]')); + var ngCspElement = (window.document.querySelector('[ng-csp]') || + window.document.querySelector('[data-ng-csp]')); if (ngCspElement) { var ngCspAttribute = ngCspElement.getAttribute('ng-csp') || @@ -1082,9 +1156,8 @@ var csp = function() { function noUnsafeEval() { try { - /* jshint -W031, -W054 */ + // eslint-disable-next-line no-new, no-new-func new Function(''); - /* jshint +W031, +W054 */ return false; } catch (e) { return true; @@ -1136,7 +1209,8 @@ var jq = function() { var i, ii = ngAttrPrefixes.length, prefix, name; for (i = 0; i < ii; ++i) { prefix = ngAttrPrefixes[i]; - if (el = document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { + el = window.document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]'); + if (el) { name = el.getAttribute(prefix + 'jq'); break; } @@ -1154,7 +1228,6 @@ function sliceArgs(args, startIndex) { } -/* jshint -W101 */ /** * @ngdoc function * @name angular.bind @@ -1172,7 +1245,6 @@ function sliceArgs(args, startIndex) { * @param {...*} args Optional arguments to be prebound to the `fn` function call. * @returns {function()} Function that wraps the `fn` with all the specified bindings. */ -/* jshint +W101 */ function bind(self, fn) { var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; if (isFunction(fn) && !(fn instanceof RegExp)) { @@ -1188,7 +1260,7 @@ function bind(self, fn) { : fn.call(self); }; } else { - // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) + // In IE, native methods are not functions so they cannot be bound (note: they don't need to be). return fn; } } @@ -1201,7 +1273,7 @@ function toJsonReplacer(key, value) { val = undefined; } else if (isWindow(value)) { val = '$WINDOW'; - } else if (value && document === value) { + } else if (value && window.document === value) { val = '$DOCUMENT'; } else if (isScope(value)) { val = '$SCOPE'; @@ -1221,13 +1293,34 @@ function toJsonReplacer(key, value) { * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be * stripped since angular uses this notation internally. * - * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. + * @param {Object|Array|Date|string|number|boolean} obj Input to be serialized into JSON. * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace. * If set to an integer, the JSON output will contain that many spaces per indentation. * @returns {string|undefined} JSON-ified string representing `obj`. + * @knownIssue + * + * The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date` + * object with an invalid date value. The only reliable way to prevent this is to monkeypatch the + * `Date.prototype.toJSON` method as follows: + * + * ``` + * var _DatetoJSON = Date.prototype.toJSON; + * Date.prototype.toJSON = function() { + * try { + * return _DatetoJSON.call(this); + * } catch(e) { + * if (e instanceof RangeError) { + * return null; + * } + * throw e; + * } + * }; + * ``` + * + * See https://github.com/angular/angular.js/pull/14221 for more information. */ function toJson(obj, pretty) { - if (typeof obj === 'undefined') return undefined; + if (isUndefined(obj)) return undefined; if (!isNumber(pretty)) { pretty = pretty ? 2 : null; } @@ -1254,9 +1347,12 @@ function fromJson(json) { } +var ALL_COLONS = /:/g; function timezoneToOffset(timezone, fallback) { + // IE/Edge do not "understand" colon (`:`) in timezone + timezone = timezone.replace(ALL_COLONS, ''); var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; - return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; + return isNumberNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; } @@ -1269,8 +1365,9 @@ function addDateMinutes(date, minutes) { function convertTimezoneToLocal(date, timezone, reverse) { reverse = reverse ? -1 : 1; - var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); - return addDateMinutes(date, reverse * (timezoneOffset - date.getTimezoneOffset())); + var dateTimezoneOffset = date.getTimezoneOffset(); + var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset); + return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset)); } @@ -1283,13 +1380,13 @@ function startingTag(element) { // turns out IE does not let you set .html() on elements which // are not allowed to have children. So we just ignore it. element.empty(); - } catch (e) {} + } catch (e) { /* empty */ } var elemHtml = jqLite('
').append(element).html(); try { return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : elemHtml. match(/^(<[^>]+>)/)[1]. - replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); + replace(/^<([\w-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);}); } catch (e) { return lowercase(elemHtml); } @@ -1311,7 +1408,7 @@ function tryDecodeURIComponent(value) { try { return decodeURIComponent(value); } catch (e) { - // Ignore any invalid uri component + // Ignore any invalid uri component. } } @@ -1322,7 +1419,7 @@ function tryDecodeURIComponent(value) { */ function parseKeyValue(/**string*/keyValue) { var obj = {}; - forEach((keyValue || "").split('&'), function(keyValue) { + forEach((keyValue || '').split('&'), function(keyValue) { var splitPoint, key, val; if (keyValue) { key = keyValue = keyValue.replace(/\+/g,'%20'); @@ -1417,6 +1514,40 @@ function getNgAttribute(element, ngAttr) { return null; } +function allowAutoBootstrap(document) { + var script = document.currentScript; + var src = script && script.getAttribute('src'); + + if (!src) { + return true; + } + + var link = document.createElement('a'); + link.href = src; + + if (document.location.origin === link.origin) { + // Same-origin resources are always allowed, even for non-whitelisted schemes. + return true; + } + // Disabled bootstrapping unless angular.js was loaded from a known scheme used on the web. + // This is to prevent angular.js bundled with browser extensions from being used to bypass the + // content security policy in web pages and other browser extensions. + switch (link.protocol) { + case 'http:': + case 'https:': + case 'ftp:': + case 'blob:': + case 'file:': + case 'data:': + return true; + default: + return false; + } +} + +// Cached as it has to run during loading so that document.currentScript is available. +var isAutoBootstrapAllowed = allowAutoBootstrap(window.document); + /** * @ngdoc directive * @name ngApp @@ -1437,10 +1568,17 @@ function getNgAttribute(element, ngAttr) { * designates the **root element** of the application and is typically placed near the root element * of the page - e.g. on the `` or `` tags. * - * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` - * found in the document will be used to define the root element to auto-bootstrap as an - * application. To run multiple applications in an HTML document you must manually bootstrap them using - * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other. + * There are a few things to keep in mind when using `ngApp`: + * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` + * found in the document will be used to define the root element to auto-bootstrap as an + * application. To run multiple applications in an HTML document you must manually bootstrap them using + * {@link angular.bootstrap} instead. + * - AngularJS applications cannot be nested within each other. + * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`. + * This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and + * {@link ngRoute.ngView `ngView`}. + * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector}, + * causing animations to stop working and making the injector inaccessible from outside the app. * * You can specify an **AngularJS module** to be used as the root module for the application. This * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It @@ -1453,7 +1591,7 @@ function getNgAttribute(element, ngAttr) { * * `ngApp` is the easiest, and most common way to bootstrap an application. * - +
I can add: {{a}} + {{b}} = {{ a+b }} @@ -1469,7 +1607,7 @@ function getNgAttribute(element, ngAttr) { * * Using `ngStrictDi`, you would see something like this: * - +
@@ -1518,7 +1656,7 @@ function getNgAttribute(element, ngAttr) { }]) .controller('GoodController2', GoodController2); function GoodController2($scope) { - $scope.name = "World"; + $scope.name = 'World'; } GoodController2.$inject = ['$scope']; @@ -1549,7 +1687,7 @@ function angularInit(element, bootstrap) { module, config = {}; - // The element `element` has priority over any other element + // The element `element` has priority over any other element. forEach(ngAttrPrefixes, function(prefix) { var name = prefix + 'app'; @@ -1568,7 +1706,12 @@ function angularInit(element, bootstrap) { } }); if (appElement) { - config.strictDi = getNgAttribute(appElement, "strict-di") !== null; + if (!isAutoBootstrapAllowed) { + window.console.error('Angular: disabling automatic bootstrap. -
+
//demo.label//
@@ -10903,6 +12460,15 @@ function $InterpolateProvider() { return value; } + // TODO: this is the same as the constantWatchDelegate in parse.js + function constantWatchDelegate(scope, listener, objectEquality, constantInterp) { + var unwatch = scope.$watch(function constantInterpolateWatch(scope) { + unwatch(); + return constantInterp(scope); + }, listener, objectEquality); + return unwatch; + } + /** * @ngdoc service * @name $interpolate @@ -10946,7 +12512,7 @@ function $InterpolateProvider() { * * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. * - * ####Escaped Interpolation + * #### Escaped Interpolation * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). * It will be rendered as a regular start/end marker, and will not be interpreted as an expression @@ -10967,7 +12533,7 @@ function $InterpolateProvider() { * this is typically useful only when user-data is used in rendering a template from the server, or * when otherwise untrusted data is used by a directive. * - * + * * *
*

{{apptitle}}: \{\{ username = "defaced value"; \}\} @@ -10982,6 +12548,30 @@ function $InterpolateProvider() { * * * + * @knownIssue + * It is currently not possible for an interpolated expression to contain the interpolation end + * symbol. For example, `{{ '}}' }}` will be incorrectly interpreted as `{{ ' }}` + `' }}`, i.e. + * an interpolated expression consisting of a single-quote (`'`) and the `' }}` string. + * + * @knownIssue + * All directives and components must use the standard `{{` `}}` interpolation symbols + * in their templates. If you change the application interpolation symbols the {@link $compile} + * service will attempt to denormalize the standard symbols to the custom symbols. + * The denormalization process is not clever enough to know not to replace instances of the standard + * symbols where they would not normally be treated as interpolation symbols. For example in the following + * code snippet the closing braces of the literal object will get incorrectly denormalized: + * + * ``` + *

+ * ``` + * + * See https://github.com/angular/angular.js/pull/14610#issuecomment-219401099 for more information. + * * @param {string} text The text with markup to interpolate. * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have * embedded expression in order to return an interpolation function. Strings with no @@ -10998,6 +12588,19 @@ function $InterpolateProvider() { * - `context`: evaluation context for all expressions embedded in the interpolated text */ function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { + // Provide a quick exit and simplified result function for text with no interpolation + if (!text.length || text.indexOf(startSymbol) === -1) { + var constantInterp; + if (!mustHaveExpression) { + var unescapedText = unescapeText(text); + constantInterp = valueFn(unescapedText); + constantInterp.exp = text; + constantInterp.expressions = []; + constantInterp.$$watchDelegate = constantWatchDelegate; + } + return constantInterp; + } + allOrNothing = !!allOrNothing; var startIndex, endIndex, @@ -11010,8 +12613,8 @@ function $InterpolateProvider() { expressionPositions = []; while (index < textLength) { - if (((startIndex = text.indexOf(startSymbol, index)) != -1) && - ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { + if (((startIndex = text.indexOf(startSymbol, index)) !== -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) !== -1)) { if (index !== startIndex) { concat.push(unescapeText(text.substring(index, startIndex))); } @@ -11076,7 +12679,7 @@ function $InterpolateProvider() { expressions: expressions, $$watchDelegate: function(scope, listener) { var lastValue; - return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { + return scope.$watchGroup(parseFns, /** @this */ function interpolateFnWatcher(values, oldValues) { var currValue = compute(values); if (isFunction(listener)) { listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); @@ -11133,9 +12736,10 @@ function $InterpolateProvider() { }]; } +/** @this */ function $IntervalProvider() { - this.$get = ['$rootScope', '$window', '$q', '$$q', - function($rootScope, $window, $q, $$q) { + this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser', + function($rootScope, $window, $q, $$q, $browser) { var intervals = {}; @@ -11165,7 +12769,8 @@ function $IntervalProvider() { * appropriate moment. See the example below for more details on how and when to do this. *
* - * @param {function()} fn A function that should be called repeatedly. + * @param {function()} fn A function that should be called repeatedly. If no additional arguments + * are passed (see below), the function is called with the current iteration count. * @param {number} delay Number of milliseconds between each function call. * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat * indefinitely. @@ -11175,7 +12780,7 @@ function $IntervalProvider() { * @returns {promise} A promise which will be notified on each iteration. * * @example - * + * * *
- +
@@ -19282,58 +21605,78 @@ function limitToFilter() {
Name Phone Number
+ + angular.module('orderByExample1', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.friends = [ + {name: 'John', phone: '555-1212', age: 10}, + {name: 'Mary', phone: '555-9876', age: 19}, + {name: 'Mike', phone: '555-4321', age: 21}, + {name: 'Adam', phone: '555-5678', age: 35}, + {name: 'Julie', phone: '555-8765', age: 29} + ]; + }]); + + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + + // Element locators + var names = element.all(by.repeater('friends').column('friend.name')); + + it('should sort friends by age in reverse order', function() { + expect(names.get(0).getText()).toBe('Adam'); + expect(names.get(1).getText()).toBe('Julie'); + expect(names.get(2).getText()).toBe('Mike'); + expect(names.get(3).getText()).toBe('Mary'); + expect(names.get(4).getText()).toBe('John'); + }); +
+ *
* - * The predicate and reverse parameters can be controlled dynamically through scope properties, - * as shown in the next example. * @example - + * ### Changing parameters dynamically + * + * All parameters can be changed dynamically. The next example shows how you can make the columns of + * a table sortable, by binding the `expression` and `reverse` parameters to scope properties. + * + - -
-
Sorting predicate = {{predicate}}; reverse = {{reverse}}
+
Sort by = {{propertyName}}; reverse = {{reverse}}

- [ unsorted ] - + +
+
- + @@ -19341,67 +21684,351 @@ function limitToFilter() {
- Name - + + - Phone Number - + + - Age - + +
{{friend.name}} {{friend.phone}} {{friend.age}}
+ + angular.module('orderByExample2', []) + .controller('ExampleController', ['$scope', function($scope) { + var friends = [ + {name: 'John', phone: '555-1212', age: 10}, + {name: 'Mary', phone: '555-9876', age: 19}, + {name: 'Mike', phone: '555-4321', age: 21}, + {name: 'Adam', phone: '555-5678', age: 35}, + {name: 'Julie', phone: '555-8765', age: 29} + ]; + + $scope.propertyName = 'age'; + $scope.reverse = true; + $scope.friends = friends; + + $scope.sortBy = function(propertyName) { + $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false; + $scope.propertyName = propertyName; + }; + }]); + + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + .sortorder:after { + content: '\25b2'; // BLACK UP-POINTING TRIANGLE + } + .sortorder.reverse:after { + content: '\25bc'; // BLACK DOWN-POINTING TRIANGLE + } + + + // Element locators + var unsortButton = element(by.partialButtonText('unsorted')); + var nameHeader = element(by.partialButtonText('Name')); + var phoneHeader = element(by.partialButtonText('Phone')); + var ageHeader = element(by.partialButtonText('Age')); + var firstName = element(by.repeater('friends').column('friend.name').row(0)); + var lastName = element(by.repeater('friends').column('friend.name').row(4)); + + it('should sort friends by some property, when clicking on the column header', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + phoneHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Mary'); + + nameHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('Mike'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + }); + + it('should sort friends in reverse order, when clicking on the same column', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + + ageHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + }); + + it('should restore the original order, when clicking "Set to unsorted"', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + unsortButton.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Julie'); + }); +
- * - * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the - * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the - * desired parameters. - * - * Example: + *
* * @example - - -
- - - - - - - - - - - -
Name - (^)Phone NumberAge
{{friend.name}}{{friend.phone}}{{friend.age}}
-
-
+ * ### Using `orderBy` inside a controller + * + * It is also possible to call the `orderBy` filter manually, by injecting `orderByFilter`, and + * calling it with the desired parameters. (Alternatively, you could inject the `$filter` factory + * and retrieve the `orderBy` filter with `$filter('orderBy')`.) + * + + +
+
Sort by = {{propertyName}}; reverse = {{reverse}}
+
+ +
+ + + + + + + + + + + +
+ + + + + + + + +
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+ + angular.module('orderByExample3', []) + .controller('ExampleController', ['$scope', 'orderByFilter', function($scope, orderBy) { + var friends = [ + {name: 'John', phone: '555-1212', age: 10}, + {name: 'Mary', phone: '555-9876', age: 19}, + {name: 'Mike', phone: '555-4321', age: 21}, + {name: 'Adam', phone: '555-5678', age: 35}, + {name: 'Julie', phone: '555-8765', age: 29} + ]; - - angular.module('orderByExample', []) - .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) { - var orderBy = $filter('orderBy'); - $scope.friends = [ - { name: 'John', phone: '555-1212', age: 10 }, - { name: 'Mary', phone: '555-9876', age: 19 }, - { name: 'Mike', phone: '555-4321', age: 21 }, - { name: 'Adam', phone: '555-5678', age: 35 }, - { name: 'Julie', phone: '555-8765', age: 29 } - ]; - $scope.order = function(predicate, reverse) { - $scope.friends = orderBy($scope.friends, predicate, reverse); - }; - $scope.order('-age',false); - }]); - -
+ $scope.propertyName = 'age'; + $scope.reverse = true; + $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse); + + $scope.sortBy = function(propertyName) { + $scope.reverse = (propertyName !== null && $scope.propertyName === propertyName) + ? !$scope.reverse : false; + $scope.propertyName = propertyName; + $scope.friends = orderBy(friends, $scope.propertyName, $scope.reverse); + }; + }]); + + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + .sortorder:after { + content: '\25b2'; // BLACK UP-POINTING TRIANGLE + } + .sortorder.reverse:after { + content: '\25bc'; // BLACK DOWN-POINTING TRIANGLE + } + + + // Element locators + var unsortButton = element(by.partialButtonText('unsorted')); + var nameHeader = element(by.partialButtonText('Name')); + var phoneHeader = element(by.partialButtonText('Phone')); + var ageHeader = element(by.partialButtonText('Age')); + var firstName = element(by.repeater('friends').column('friend.name').row(0)); + var lastName = element(by.repeater('friends').column('friend.name').row(4)); + + it('should sort friends by some property, when clicking on the column header', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + phoneHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Mary'); + + nameHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('Mike'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + }); + + it('should sort friends in reverse order, when clicking on the same column', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + ageHeader.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Adam'); + + ageHeader.click(); + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + }); + + it('should restore the original order, when clicking "Set to unsorted"', function() { + expect(firstName.getText()).toBe('Adam'); + expect(lastName.getText()).toBe('John'); + + unsortButton.click(); + expect(firstName.getText()).toBe('John'); + expect(lastName.getText()).toBe('Julie'); + }); + +
+ *
+ * + * @example + * ### Using a custom comparator + * + * If you have very specific requirements about the way items are sorted, you can pass your own + * comparator function. For example, you might need to compare some strings in a locale-sensitive + * way. (When specifying a custom comparator, you also need to pass a value for the `reverse` + * argument - passing `false` retains the default sorting order, i.e. ascending.) + * + + +
+
+

Locale-sensitive Comparator

+ + + + + + + + + +
NameFavorite Letter
{{friend.name}}{{friend.favoriteLetter}}
+
+
+

Default Comparator

+ + + + + + + + + +
NameFavorite Letter
{{friend.name}}{{friend.favoriteLetter}}
+
+
+
+ + angular.module('orderByExample4', []) + .controller('ExampleController', ['$scope', function($scope) { + $scope.friends = [ + {name: 'John', favoriteLetter: 'Ä'}, + {name: 'Mary', favoriteLetter: 'Ü'}, + {name: 'Mike', favoriteLetter: 'Ö'}, + {name: 'Adam', favoriteLetter: 'H'}, + {name: 'Julie', favoriteLetter: 'Z'} + ]; + + $scope.localeSensitiveComparator = function(v1, v2) { + // If we don't get strings, just compare by index + if (v1.type !== 'string' || v2.type !== 'string') { + return (v1.index < v2.index) ? -1 : 1; + } + + // Compare strings alphabetically, taking locale into account + return v1.value.localeCompare(v2.value); + }; + }]); + + + .friends-container { + display: inline-block; + margin: 0 30px; + } + + .friends { + border-collapse: collapse; + } + + .friends th { + border-bottom: 1px solid; + } + .friends td, .friends th { + border-left: 1px solid; + padding: 5px 10px; + } + .friends td:first-child, .friends th:first-child { + border-left: none; + } + + + // Element locators + var container = element(by.css('.custom-comparator')); + var names = container.all(by.repeater('friends').column('friend.name')); + + it('should sort friends by favorite letter (in correct alphabetical order)', function() { + expect(names.get(0).getText()).toBe('John'); + expect(names.get(1).getText()).toBe('Adam'); + expect(names.get(2).getText()).toBe('Mike'); + expect(names.get(3).getText()).toBe('Mary'); + expect(names.get(4).getText()).toBe('Julie'); + }); + +
+ * */ orderByFilter.$inject = ['$parse']; function orderByFilter($parse) { - return function(array, sortPredicate, reverseOrder) { + return function(array, sortPredicate, reverseOrder, compareFn) { - if (!(isArrayLike(array))) return array; + if (array == null) return array; + if (!isArrayLike(array)) { + throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array); + } if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } if (sortPredicate.length === 0) { sortPredicate = ['+']; } - var predicates = processPredicates(sortPredicate, reverseOrder); - // Add a predicate at the end that evaluates to the element index. This makes the - // sort stable as it works as a tie-breaker when all the input predicates cannot - // distinguish between two elements. - predicates.push({ get: function() { return {}; }, descending: reverseOrder ? -1 : 1}); + var predicates = processPredicates(sortPredicate); + + var descending = reverseOrder ? -1 : 1; + + // Define the `compare()` function. Use a default comparator if none is specified. + var compare = isFunction(compareFn) ? compareFn : defaultCompare; // The next three lines are a version of a Swartzian Transform idiom from Perl // (sometimes called the Decorate-Sort-Undecorate idiom) @@ -19413,8 +22040,12 @@ function orderByFilter($parse) { return array; function getComparisonObject(value, index) { + // NOTE: We are adding an extra `tieBreaker` value based on the element's index. + // This will be used to keep the sort stable when none of the input predicates can + // distinguish between two elements. return { value: value, + tieBreaker: {value: index, type: 'number', index: index}, predicateValues: predicates.map(function(predicate) { return getPredicateValue(predicate.get(value), index); }) @@ -19422,25 +22053,26 @@ function orderByFilter($parse) { } function doComparison(v1, v2) { - var result = 0; - for (var index=0, length = predicates.length; index < length; ++index) { - result = compare(v1.predicateValues[index], v2.predicateValues[index]) * predicates[index].descending; - if (result) break; + for (var i = 0, ii = predicates.length; i < ii; i++) { + var result = compare(v1.predicateValues[i], v2.predicateValues[i]); + if (result) { + return result * predicates[i].descending * descending; + } } - return result; + + return compare(v1.tieBreaker, v2.tieBreaker) * descending; } }; - function processPredicates(sortPredicate, reverseOrder) { - reverseOrder = reverseOrder ? -1 : 1; - return sortPredicate.map(function(predicate) { + function processPredicates(sortPredicates) { + return sortPredicates.map(function(predicate) { var descending = 1, get = identity; if (isFunction(predicate)) { get = predicate; } else if (isString(predicate)) { - if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { - descending = predicate.charAt(0) == '-' ? -1 : 1; + if ((predicate.charAt(0) === '+' || predicate.charAt(0) === '-')) { + descending = predicate.charAt(0) === '-' ? -1 : 1; predicate = predicate.substring(1); } if (predicate !== '') { @@ -19451,7 +22083,7 @@ function orderByFilter($parse) { } } } - return { get: get, descending: descending * reverseOrder }; + return {get: get, descending: descending}; }); } @@ -19466,9 +22098,9 @@ function orderByFilter($parse) { } } - function objectValue(value, index) { + function objectValue(value) { // If `valueOf` is a valid function use that - if (typeof value.valueOf === 'function') { + if (isFunction(value.valueOf)) { value = value.valueOf(); if (isPrimitive(value)) return value; } @@ -19477,8 +22109,8 @@ function orderByFilter($parse) { value = value.toString(); if (isPrimitive(value)) return value; } - // We have a basic object so we use the position of the object in the collection - return index; + + return value; } function getPredicateValue(value, index) { @@ -19486,23 +22118,39 @@ function orderByFilter($parse) { if (value === null) { type = 'string'; value = 'null'; - } else if (type === 'string') { - value = value.toLowerCase(); } else if (type === 'object') { - value = objectValue(value, index); + value = objectValue(value); } - return { value: value, type: type }; + return {value: value, type: type, index: index}; } - function compare(v1, v2) { + function defaultCompare(v1, v2) { var result = 0; - if (v1.type === v2.type) { - if (v1.value !== v2.value) { - result = v1.value < v2.value ? -1 : 1; + var type1 = v1.type; + var type2 = v2.type; + + if (type1 === type2) { + var value1 = v1.value; + var value2 = v2.value; + + if (type1 === 'string') { + // Compare strings case-insensitively + value1 = value1.toLowerCase(); + value2 = value2.toLowerCase(); + } else if (type1 === 'object') { + // For basic objects, use the position of the object + // in the collection instead of the value + if (isObject(value1)) value1 = v1.index; + if (isObject(value2)) value2 = v2.index; + } + + if (value1 !== value2) { + result = value1 < value2 ? -1 : 1; } } else { - result = v1.type < v2.type ? -1 : 1; + result = type1 < type2 ? -1 : 1; } + return result; } } @@ -19523,12 +22171,10 @@ function ngDirective(directive) { * @restrict E * * @description - * Modifies the default behavior of the html A tag so that the default action is prevented when + * Modifies the default behavior of the html a tag so that the default action is prevented when * the href attribute is empty. * - * This change permits the easy creation of action links with the `ngClick` directive - * without changing the location or causing page reloads, e.g.: - * `Add Item` + * For dynamically creating `href` attributes for a tags, see the {@link ng.ngHref `ngHref`} directive. */ var htmlAnchorDirective = valueFn({ restrict: 'E', @@ -19582,7 +22228,7 @@ var htmlAnchorDirective = valueFn({ * @example * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes * in links and their different behaviors: - +
link 1 (link, don't reload)
@@ -19715,23 +22361,10 @@ var htmlAnchorDirective = valueFn({ * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy. * * A special directive is necessary because we cannot use interpolation inside the `disabled` - * attribute. The following example would make the button enabled on Chrome/Firefox - * but not on older IEs: - * - * ```html - * - *
- * - *
- * ``` - * - * This is because the HTML specification does not require browsers to preserve the values of - * boolean attributes such as `disabled` (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. + * attribute. See the {@link guide/interpolation interpolation guide} for more info. * * @example - +
@@ -19763,17 +22396,11 @@ var htmlAnchorDirective = valueFn({ * Note that this directive should not be used together with {@link ngModel `ngModel`}, * as this can lead to unexpected behavior. * - * ### Why do we need `ngChecked`? + * A special directive is necessary because we cannot use interpolation inside the `checked` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. * - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as checked. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngChecked` directive solves this problem for the `checked` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. * @example - +
@@ -19800,15 +22427,16 @@ var htmlAnchorDirective = valueFn({ * @priority 100 * * @description - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as readonly. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngReadonly` directive solves this problem for the `readonly` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. + * + * Sets the `readonly` attribute on the element, if the expression inside `ngReadonly` is truthy. + * Note that `readonly` applies only to `input` elements with specific types. [See the input docs on + * MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) for more information. + * + * A special directive is necessary because we cannot use interpolation inside the `readonly` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * * @example - +
@@ -19835,16 +22463,21 @@ var htmlAnchorDirective = valueFn({ * @priority 100 * * @description - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as selected. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngSelected` directive solves this problem for the `selected` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. + * + * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy. + * + * A special directive is necessary because we cannot use interpolation inside the `selected` + * attribute. See the {@link guide/interpolation interpolation guide} for more info. + * + *
+ * **Note:** `ngSelected` does not interact with the `select` and `ngModel` directives, it only + * sets the `selected` attribute on the element. If you are using `ngModel` on the select, you + * should not use `ngSelected` on the options, as `ngModel` will set the select value and + * selected options. + *
* * @example - +

@@ -19907,7 +22544,7 @@ var ngAttributeAliasDirectives = {}; // boolean attrs are evaluated forEach(BOOLEAN_ATTR, function(propName, attrName) { // binding to multiple is not supported - if (propName == "multiple") return; + if (propName === 'multiple') return; function defaultLinkFn(scope, element, attr) { scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { @@ -19944,10 +22581,10 @@ forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { link: function(scope, element, attr) { //special case ngPattern when a literal regular expression value //is used as the expression (this way we don't have to watch anything). - if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { + if (ngAttr === 'ngPattern' && attr.ngPattern.charAt(0) === '/') { var match = attr.ngPattern.match(REGEX_STRING_REGEXP); if (match) { - attr.$set("ngPattern", new RegExp(match[1], match[2])); + attr.$set('ngPattern', new RegExp(match[1], match[2])); return; } } @@ -20125,7 +22762,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * * However, if the method is used programmatically, for example by adding dynamically created controls, * or controls that have been previously removed without destroying their corresponding DOM element, - * it's the developers responsiblity to make sure the current state propagates to the parent form. + * it's the developers responsibility to make sure the current state propagates to the parent form. * * For example, if an input control is added that is already `$dirty` and has `$error` properties, * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form. @@ -20250,9 +22887,11 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * @description * Sets the form to its pristine state. * - * This method can be called to remove the 'ng-dirty' class and set the form to its pristine - * state (ng-pristine class). This method will also propagate to all the controls contained - * in this form. + * This method sets the form's `$pristine` state to true, the `$dirty` state to false, removes + * the `ng-dirty` class and adds the `ng-pristine` class. Additionally, it sets the `$submitted` + * state to false. + * + * This method will also propagate to all the controls contained in this form. * * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after * saving or resetting it. @@ -20335,13 +22974,9 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * * In Angular, forms can be nested. This means that the outer form is valid when all of the child * forms are valid as well. However, browsers do not allow nesting of `
` elements, so - * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to - * `` but can be nested. This allows you to have nested forms, which is very useful when - * using Angular validation directives in forms that are dynamically generated using the - * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name` - * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an - * `ngForm` directive and nest these in an outer `form` element. - * + * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to + * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group + * of controls needs to be determined. * * # CSS classes * - `ng-valid` is set if the form is valid. @@ -20412,7 +23047,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) { * * * @example - + - +
@@ -20944,7 +23595,6 @@ var inputType = { var value = element(by.binding('example.value | date: "HH:mm:ss"')); var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls @@ -21049,7 +23699,6 @@ var inputType = { var value = element(by.binding('example.value | date: "yyyy-Www"')); var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls @@ -21153,7 +23802,6 @@ var inputType = { var value = element(by.binding('example.value | date: "yyyy-MM"')); var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); // currently protractor/webdriver does not support // sending keys to all known HTML5 input controls @@ -21229,8 +23877,8 @@ var inputType = { * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string * that contains the regular expression body that will be converted to a regular expression * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to @@ -21327,8 +23975,8 @@ var inputType = { * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string * that contains the regular expression body that will be converted to a regular expression * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to @@ -21426,8 +24074,8 @@ var inputType = { * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string * that contains the regular expression body that will be converted to a regular expression * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to @@ -21548,19 +24196,164 @@ var inputType = { it('should change state', function() { + var inputs = element.all(by.model('color.name')); var color = element(by.binding('color.name')); expect(color.getText()).toContain('blue'); - element.all(by.model('color.name')).get(0).click(); - + inputs.get(0).click(); expect(color.getText()).toContain('red'); + + inputs.get(1).click(); + expect(color.getText()).toContain('green'); }); */ 'radio': radioInputType, + /** + * @ngdoc input + * @name input[range] + * + * @description + * Native range input with validation and transformation. + * + *
+ *

+ * In v1.5.9+, in order to avoid interfering with already existing, custom directives for + * `input[range]`, you need to let Angular know that you want to enable its built-in support. + * You can do this by adding the `ng-input-range` attribute to the input element. E.g.: + * `` + *


+ *

+ * Input elements without the `ng-input-range` attibute will continue to be treated the same + * as in previous versions (e.g. their model value will be a string not a number and Angular + * will not take `min`/`max`/`step` attributes and properties into account). + *


+ *

+ * **Note:** From v1.6.x onwards, the support for `input[range]` will be always enabled and + * the `ng-input-range` attribute will have no effect. + *


+ *

+ * This documentation page refers to elements which have the built-in support enabled; i.e. + * elements _with_ the `ng-input-range` attribute. + *

+ *
+ * + * The model for the range input must always be a `Number`. + * + * IE9 and other browsers that do not support the `range` type fall back + * to a text input without any default values for `min`, `max` and `step`. Model binding, + * validation and number parsing are nevertheless supported. + * + * Browsers that support range (latest Chrome, Safari, Firefox, Edge) treat `input[range]` + * in a way that never allows the input to hold an invalid value. That means: + * - any non-numerical value is set to `(max + min) / 2`. + * - any numerical value that is less than the current min val, or greater than the current max val + * is set to the min / max val respectively. + * - additionally, the current `step` is respected, so the nearest value that satisfies a step + * is used. + * + * See the [HTML Spec on input[type=range]](https://www.w3.org/TR/html5/forms.html#range-state-(type=range)) + * for more info. + * + * This has the following consequences for Angular: + * + * Since the element value should always reflect the current model value, a range input + * will set the bound ngModel expression to the value that the browser has set for the + * input element. For example, in the following input ``, + * if the application sets `model.value = null`, the browser will set the input to `'50'`. + * Angular will then set the model to `50`, to prevent input and model value being out of sync. + * + * That means the model for range will immediately be set to `50` after `ngModel` has been + * initialized. It also means a range input can never have the required error. + * + * This does not only affect changes to the model value, but also to the values of the `min`, + * `max`, and `step` attributes. When these change in a way that will cause the browser to modify + * the input value, Angular will also update the model value. + * + * Automatic value adjustment also means that a range input element can never have the `required`, + * `min`, or `max` errors. + * + * However, `step` is currently only fully implemented by Firefox. Other browsers have problems + * when the step value changes dynamically - they do not adjust the element value correctly, but + * instead may set the `stepMismatch` error. If that's the case, the Angular will set the `step` + * error on the input, and set the model to `undefined`. + * + * Note that `input[range]` is not compatible with `ngMax`, `ngMin`, and `ngStep`, because they do + * not set the `min` and `max` attributes, which means that the browser won't automatically adjust + * the input value based on their values, and will always assume min = 0, max = 100, and step = 1. + * + * @param ngInputRange The presense of this attribute enables the built-in support for + * `input[range]`. + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} min Sets the `min` validation to ensure that the value entered is greater + * than `min`. Can be interpolated. + * @param {string=} max Sets the `max` validation to ensure that the value entered is less than `max`. + * Can be interpolated. + * @param {string=} step Sets the `step` validation to ensure that the value entered matches the `step` + * Can be interpolated. + * @param {string=} ngChange Angular expression to be executed when the ngModel value changes due + * to user interaction with the input element. + * @param {expression=} ngChecked If the expression is truthy, then the `checked` attribute will be set on the + * element. **Note** : `ngChecked` should not be used alongside `ngModel`. + * Checkout {@link ng.directive:ngChecked ngChecked} for usage. + * + * @example + + + + + + Model as range: +
+ Model as number:
+ Min:
+ Max:
+ value = {{value}}
+ myForm.range.$valid = {{myForm.range.$valid}}
+ myForm.range.$error = {{myForm.range.$error}} + +
+
+ + * ## Range Input with ngMin & ngMax attributes + + * @example + + + +
+ Model as range: +
+ Model as number:
+ Min:
+ Max:
+ value = {{value}}
+ myForm.range.$valid = {{myForm.range.$valid}}
+ myForm.range.$error = {{myForm.range.$error}} +
+
+
+ + */ + 'range': rangeInputType, /** * @ngdoc input @@ -21640,13 +24433,13 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { var type = lowercase(element[0].type); - // In composition mode, users are still inputing intermediate text buffer, + // In composition mode, users are still inputting intermediate text buffer, // hold the listener until composition is done. // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent if (!$sniffer.android) { var composing = false; - element.on('compositionstart', function(data) { + element.on('compositionstart', function() { composing = true; }); @@ -21656,6 +24449,8 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { }); } + var timeout; + var listener = function(ev) { if (timeout) { $browser.defer.cancel(timeout); @@ -21685,8 +24480,6 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { if ($sniffer.hasEvent('input')) { element.on('input', listener); } else { - var timeout; - var deferListener = function(ev, input, origValue) { if (!timeout) { timeout = $browser.defer(function() { @@ -21698,7 +24491,7 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { } }; - element.on('keydown', function(event) { + element.on('keydown', /** @this */ function(event) { var key = event.keyCode; // ignore @@ -21718,6 +24511,26 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { // or form autocomplete on newer browser, we need "change" event to catch it element.on('change', listener); + // Some native input types (date-family) have the ability to change validity without + // firing any input/change events. + // For these event types, when native validators are present and the browser supports the type, + // check for validity changes on various DOM events. + if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) { + element.on(PARTIAL_VALIDATION_EVENTS, /** @this */ function(ev) { + if (!timeout) { + var validity = this[VALIDITY_STATE_PROPERTY]; + var origBadInput = validity.badInput; + var origTypeMismatch = validity.typeMismatch; + timeout = $browser.defer(function() { + timeout = null; + if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) { + listener(ev); + } + }); + } + }); + } + ctrl.$render = function() { // Workaround for Firefox validation #12102. var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue; @@ -21771,7 +24584,7 @@ function createDateParser(regexp, mapping) { // When a date is JSON'ified to wraps itself inside of an extra // set of double quotes. This makes the date parsing code unable // to match the date string and parse it as a date. - if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { + if (iso.charAt(0) === '"' && iso.charAt(iso.length - 1) === '"') { iso = iso.substring(1, iso.length - 1); } if (ISO_DATE_REGEXP.test(iso)) { @@ -21887,19 +24700,12 @@ function badInputChecker(scope, element, attr, ctrl) { if (nativeValidation) { ctrl.$parsers.push(function(value) { var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; - // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430): - // - also sets validity.badInput (should only be validity.typeMismatch). - // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email) - // - can ignore this case as we can still read out the erroneous email... - return validity.badInput && !validity.typeMismatch ? undefined : value; + return validity.badInput || validity.typeMismatch ? undefined : value; }); } } -function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { - badInputChecker(scope, element, attr, ctrl); - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - +function numberFormatterParser(ctrl) { ctrl.$$parserName = 'number'; ctrl.$parsers.push(function(value) { if (ctrl.$isEmpty(value)) return null; @@ -21916,40 +24722,229 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { } return value; }); +} + +function parseNumberAttrVal(val) { + if (isDefined(val) && !isNumber(val)) { + val = parseFloat(val); + } + return !isNumberNaN(val) ? val : undefined; +} + +function isNumberInteger(num) { + // See http://stackoverflow.com/questions/14636536/how-to-check-if-a-variable-is-an-integer-in-javascript#14794066 + // (minus the assumption that `num` is a number) + + // eslint-disable-next-line no-bitwise + return (num | 0) === num; +} + +function countDecimals(num) { + var numString = num.toString(); + var decimalSymbolIndex = numString.indexOf('.'); + + if (decimalSymbolIndex === -1) { + if (-1 < num && num < 1) { + // It may be in the exponential notation format (`1e-X`) + var match = /e-(\d+)$/.exec(numString); + + if (match) { + return Number(match[1]); + } + } + + return 0; + } + + return numString.length - decimalSymbolIndex - 1; +} + +function isValidForStep(viewValue, stepBase, step) { + // At this point `stepBase` and `step` are expected to be non-NaN values + // and `viewValue` is expected to be a valid stringified number. + var value = Number(viewValue); + + // Due to limitations in Floating Point Arithmetic (e.g. `0.3 - 0.2 !== 0.1` or + // `0.5 % 0.1 !== 0`), we need to convert all numbers to integers. + if (!isNumberInteger(value) || !isNumberInteger(stepBase) || !isNumberInteger(step)) { + var decimalCount = Math.max(countDecimals(value), countDecimals(stepBase), countDecimals(step)); + var multiplier = Math.pow(10, decimalCount); + + value = value * multiplier; + stepBase = stepBase * multiplier; + step = step * multiplier; + } + + return (value - stepBase) % step === 0; +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + numberFormatterParser(ctrl); + + var minVal; + var maxVal; if (isDefined(attr.min) || attr.ngMin) { - var minVal; ctrl.$validators.min = function(value) { return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; }; attr.$observe('min', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val, 10); - } - minVal = isNumber(val) && !isNaN(val) ? val : undefined; + minVal = parseNumberAttrVal(val); // TODO(matsko): implement validateLater to reduce number of validations ctrl.$validate(); }); } if (isDefined(attr.max) || attr.ngMax) { - var maxVal; ctrl.$validators.max = function(value) { return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; }; attr.$observe('max', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val, 10); - } - maxVal = isNumber(val) && !isNaN(val) ? val : undefined; + maxVal = parseNumberAttrVal(val); // TODO(matsko): implement validateLater to reduce number of validations ctrl.$validate(); }); } } +function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) { + badInputChecker(scope, element, attr, ctrl); + numberFormatterParser(ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + + var supportsRange = ctrl.$$hasNativeValidators && element[0].type === 'range', + minVal = supportsRange ? 0 : undefined, + maxVal = supportsRange ? 100 : undefined, + stepVal = supportsRange ? 1 : undefined, + validity = element[0].validity, + hasMinAttr = isDefined(attr.min), + hasMaxAttr = isDefined(attr.max), + hasStepAttr = isDefined(attr.step); + + var originalRender = ctrl.$render; + + ctrl.$render = supportsRange && isDefined(validity.rangeUnderflow) && isDefined(validity.rangeOverflow) ? + //Browsers that implement range will set these values automatically, but reading the adjusted values after + //$render would cause the min / max validators to be applied with the wrong value + function rangeRender() { + originalRender(); + ctrl.$setViewValue(element.val()); + } : + originalRender; + + if (hasMinAttr) { + ctrl.$validators.min = supportsRange ? + // Since all browsers set the input to a valid value, we don't need to check validity + function noopMinValidator() { return true; } : + // non-support browsers validate the min val + function minValidator(modelValue, viewValue) { + return ctrl.$isEmpty(viewValue) || isUndefined(minVal) || viewValue >= minVal; + }; + + setInitialValueAndObserver('min', minChange); + } + + if (hasMaxAttr) { + ctrl.$validators.max = supportsRange ? + // Since all browsers set the input to a valid value, we don't need to check validity + function noopMaxValidator() { return true; } : + // non-support browsers validate the max val + function maxValidator(modelValue, viewValue) { + return ctrl.$isEmpty(viewValue) || isUndefined(maxVal) || viewValue <= maxVal; + }; + + setInitialValueAndObserver('max', maxChange); + } + + if (hasStepAttr) { + ctrl.$validators.step = supportsRange ? + function nativeStepValidator() { + // Currently, only FF implements the spec on step change correctly (i.e. adjusting the + // input element value to a valid value). It's possible that other browsers set the stepMismatch + // validity error instead, so we can at least report an error in that case. + return !validity.stepMismatch; + } : + // ngStep doesn't set the setp attr, so the browser doesn't adjust the input value as setting step would + function stepValidator(modelValue, viewValue) { + return ctrl.$isEmpty(viewValue) || isUndefined(stepVal) || + isValidForStep(viewValue, minVal || 0, stepVal); + }; + + setInitialValueAndObserver('step', stepChange); + } + + function setInitialValueAndObserver(htmlAttrName, changeFn) { + // interpolated attributes set the attribute value only after a digest, but we need the + // attribute value when the input is first rendered, so that the browser can adjust the + // input value based on the min/max value + element.attr(htmlAttrName, attr[htmlAttrName]); + attr.$observe(htmlAttrName, changeFn); + } + + function minChange(val) { + minVal = parseNumberAttrVal(val); + // ignore changes before model is initialized + if (isNumberNaN(ctrl.$modelValue)) { + return; + } + + if (supportsRange) { + var elVal = element.val(); + // IE11 doesn't set the el val correctly if the minVal is greater than the element value + if (minVal > elVal) { + elVal = minVal; + element.val(elVal); + } + ctrl.$setViewValue(elVal); + } else { + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + } + } + + function maxChange(val) { + maxVal = parseNumberAttrVal(val); + // ignore changes before model is initialized + if (isNumberNaN(ctrl.$modelValue)) { + return; + } + + if (supportsRange) { + var elVal = element.val(); + // IE11 doesn't set the el val correctly if the maxVal is less than the element value + if (maxVal < elVal) { + element.val(maxVal); + // IE11 and Chrome don't set the value to the minVal when max < min + elVal = maxVal < minVal ? minVal : maxVal; + } + ctrl.$setViewValue(elVal); + } else { + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + } + } + + function stepChange(val) { + stepVal = parseNumberAttrVal(val); + // ignore changes before model is initialized + if (isNumberNaN(ctrl.$modelValue)) { + return; + } + + // Some browsers don't adjust the input value correctly, but set the stepMismatch error + if (supportsRange && ctrl.$viewValue !== element.val()) { + ctrl.$setViewValue(element.val()); + } else { + // TODO(matsko): implement validateLater to reduce number of validations + ctrl.$validate(); + } + } +} + function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { // Note: no badInputChecker here by purpose as `url` is only a validation // in browsers, i.e. we can always read out input.value even if it is not valid! @@ -21992,6 +24987,8 @@ function radioInputType(scope, element, attr, ctrl) { ctrl.$render = function() { var value = attr.value; + // We generally use strict comparison. This is behavior we cannot change without a BC. + // eslint-disable-next-line eqeqeq element[0].checked = (value == ctrl.$viewValue); }; @@ -22063,8 +25060,8 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any * length. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. + * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue} + * does not match a RegExp found by evaluating the Angular expression given in the attribute value. * If the expression evaluates to a RegExp object, then this is used directly. * If the expression evaluates to a string, then it will be converted to a RegExp * after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to @@ -22075,6 +25072,20 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt * @param {string=} ngChange Angular expression to be executed when input changes due to user * interaction with the input element. * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. + * + * @knownIssue + * + * When specifying the `placeholder` attribute of `
- {{text}} -
-
- - it('should have transcluded', function() { - var titleElement = element(by.model('title')); - titleElement.clear(); - titleElement.sendKeys('TITLE'); - var textElement = element(by.model('text')); - textElement.clear(); - textElement.sendKeys('TEXT'); - expect(element(by.binding('title')).getText()).toEqual('TITLE'); - expect(element(by.binding('text')).getText()).toEqual('TEXT'); - }); - -
+ * @param {string} ngTransclude|ngTranscludeSlot the name of the slot to insert at this point. If this is not provided, is empty + * or its value is the same as the name of the attribute then the default slot is used. * + * @example + * ### Basic transclusion + * This example demonstrates basic transclusion of content into a component directive. + * + * + * + *
+ *
+ *
+ * {{text}} + *
+ *
+ * + * it('should have transcluded', function() { + * var titleElement = element(by.model('title')); + * titleElement.clear(); + * titleElement.sendKeys('TITLE'); + * var textElement = element(by.model('text')); + * textElement.clear(); + * textElement.sendKeys('TEXT'); + * expect(element(by.binding('title')).getText()).toEqual('TITLE'); + * expect(element(by.binding('text')).getText()).toEqual('TEXT'); + * }); + * + *
+ * + * @example + * ### Transclude fallback content + * This example shows how to use `NgTransclude` with fallback content, that + * is displayed if no transcluded content is provided. + * + * + * + * + * + * + * + * + * Button2 + * + * + * + * it('should have different transclude element content', function() { + * expect(element(by.id('fallback')).getText()).toBe('Button1'); + * expect(element(by.id('modified')).getText()).toBe('Button2'); + * }); + * + * + * + * @example + * ### Multi-slot transclusion + * This example demonstrates using multi-slot transclusion in a component directive. + * + * + * + *
+ *
+ *
+ * + * {{title}} + *

{{text}}

+ *
+ *
+ *
+ * + * angular.module('multiSlotTranscludeExample', []) + * .directive('pane', function() { + * return { + * restrict: 'E', + * transclude: { + * 'title': '?paneTitle', + * 'body': 'paneBody', + * 'footer': '?paneFooter' + * }, + * template: '
' + + * '
Fallback Title
' + + * '
' + + * '' + + * '
' + * }; + * }) + * .controller('ExampleController', ['$scope', function($scope) { + * $scope.title = 'Lorem Ipsum'; + * $scope.link = 'https://google.com'; + * $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...'; + * }]); + *
+ * + * it('should have transcluded the title and the body', function() { + * var titleElement = element(by.model('title')); + * titleElement.clear(); + * titleElement.sendKeys('TITLE'); + * var textElement = element(by.model('text')); + * textElement.clear(); + * textElement.sendKeys('TEXT'); + * expect(element(by.css('.title')).getText()).toEqual('TITLE'); + * expect(element(by.binding('text')).getText()).toEqual('TEXT'); + * expect(element(by.css('.footer')).getText()).toEqual('Fallback Footer'); + * }); + * + *
*/ -var ngTranscludeDirective = ngDirective({ - restrict: 'EAC', - link: function($scope, $element, $attrs, controller, $transclude) { - if (!$transclude) { - throw minErr('ngTransclude')('orphan', - 'Illegal use of ngTransclude directive in the template! ' + - 'No parent directive that requires a transclusion found. ' + - 'Element: {0}', - startingTag($element)); - } +var ngTranscludeMinErr = minErr('ngTransclude'); +var ngTranscludeDirective = ['$compile', function($compile) { + return { + restrict: 'EAC', + terminal: true, + compile: function ngTranscludeCompile(tElement) { - $transclude(function(clone) { - $element.empty(); - $element.append(clone); - }); - } -}); + // Remove and cache any original content to act as a fallback + var fallbackLinkFn = $compile(tElement.contents()); + tElement.empty(); + + return function ngTranscludePostLink($scope, $element, $attrs, controller, $transclude) { + + if (!$transclude) { + throw ngTranscludeMinErr('orphan', + 'Illegal use of ngTransclude directive in the template! ' + + 'No parent directive that requires a transclusion found. ' + + 'Element: {0}', + startingTag($element)); + } + + + // If the attribute is of the form: `ng-transclude="ng-transclude"` then treat it like the default + if ($attrs.ngTransclude === $attrs.$attr.ngTransclude) { + $attrs.ngTransclude = ''; + } + var slotName = $attrs.ngTransclude || $attrs.ngTranscludeSlot; + + // If the slot is required and no transclusion content is provided then this call will throw an error + $transclude(ngTranscludeCloneAttachFn, null, slotName); + + // If the slot is optional and no transclusion content is provided then use the fallback content + if (slotName && !$transclude.isSlotFilled(slotName)) { + useFallbackContent(); + } + + function ngTranscludeCloneAttachFn(clone, transcludedScope) { + if (clone.length) { + $element.append(clone); + } else { + useFallbackContent(); + // There is nothing linked against the transcluded scope since no content was available, + // so it should be safe to clean up the generated scope. + transcludedScope.$destroy(); + } + } + + function useFallbackContent() { + // Since this is the fallback content rather than the transcluded content, + // we link against the scope of this directive rather than the transcluded scope + fallbackLinkFn($scope, function(clone) { + $element.append(clone); + }); + } + }; + } + }; +}]; /** * @ngdoc directive @@ -28161,7 +31578,7 @@ var ngTranscludeDirective = ngDirective({ * @param {string} id Cache name of the template. * * @example - + + *
+ *
+ * + * + *
+ * + *
+ *
+ * required error set? = {{form.input.$error.required}}
+ * model = {{model}} + *
+ *
+ *
+ * + var required = element(by.binding('form.input.$error.required')); + var model = element(by.binding('model')); + var input = element(by.id('input')); + it('should set the required error', function() { + expect(required.getText()).toContain('true'); + + input.sendKeys('123'); + expect(required.getText()).not.toContain('true'); + expect(model.getText()).toContain('123'); + }); + * + *
+ */ var requiredDirective = function() { return { restrict: 'A', @@ -28683,7 +32180,81 @@ var requiredDirective = function() { }; }; +/** + * @ngdoc directive + * @name ngPattern + * + * @description + * + * ngPattern adds the pattern {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}. + * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls. + * + * The validator sets the `pattern` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`} + * does not match a RegExp which is obtained by evaluating the Angular expression given in the + * `ngPattern` attribute value: + * * If the expression evaluates to a RegExp object, then this is used directly. + * * If the expression evaluates to a string, then it will be converted to a RegExp after wrapping it + * in `^` and `$` characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`. + * + *
+ * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to + * start at the index of the last search's match, thus not taking the whole input value into + * account. + *
+ * + *
+ * **Note:** This directive is also added when the plain `pattern` attribute is used, with two + * differences: + *
    + *
  1. + * `ngPattern` does not set the `pattern` attribute and therefore HTML5 constraint validation is + * not available. + *
  2. + *
  3. + * The `ngPattern` attribute must be an expression, while the `pattern` value must be + * interpolated. + *
  4. + *
+ *
+ * + * @example + * + * + * + *
+ *
+ * + * + *
+ * + *
+ *
+ * input valid? = {{form.input.$valid}}
+ * model = {{model}} + *
+ *
+ *
+ * + var model = element(by.binding('model')); + var input = element(by.id('input')); + it('should validate the input with the default pattern', function() { + input.sendKeys('aaa'); + expect(model.getText()).not.toContain('aaa'); + + input.clear().then(function() { + input.sendKeys('123'); + expect(model.getText()).toContain('123'); + }); + }); + * + *
+ */ var patternDirective = function() { return { restrict: 'A', @@ -28715,7 +32286,72 @@ var patternDirective = function() { }; }; +/** + * @ngdoc directive + * @name ngMaxlength + * + * @description + * + * ngMaxlength adds the maxlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}. + * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls. + * + * The validator sets the `maxlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`} + * is longer than the integer obtained by evaluating the Angular expression given in the + * `ngMaxlength` attribute value. + * + *
+ * **Note:** This directive is also added when the plain `maxlength` attribute is used, with two + * differences: + *
    + *
  1. + * `ngMaxlength` does not set the `maxlength` attribute and therefore HTML5 constraint + * validation is not available. + *
  2. + *
  3. + * The `ngMaxlength` attribute must be an expression, while the `maxlength` value must be + * interpolated. + *
  4. + *
+ *
+ * + * @example + * + * + * + *
+ *
+ * + * + *
+ * + *
+ *
+ * input valid? = {{form.input.$valid}}
+ * model = {{model}} + *
+ *
+ *
+ * + var model = element(by.binding('model')); + var input = element(by.id('input')); + it('should validate the input with the default maxlength', function() { + input.sendKeys('abcdef'); + expect(model.getText()).not.toContain('abcdef'); + + input.clear().then(function() { + input.sendKeys('abcde'); + expect(model.getText()).toContain('abcde'); + }); + }); + * + *
+ */ var maxlengthDirective = function() { return { restrict: 'A', @@ -28726,7 +32362,7 @@ var maxlengthDirective = function() { var maxlength = -1; attr.$observe('maxlength', function(value) { var intVal = toInt(value); - maxlength = isNaN(intVal) ? -1 : intVal; + maxlength = isNumberNaN(intVal) ? -1 : intVal; ctrl.$validate(); }); ctrl.$validators.maxlength = function(modelValue, viewValue) { @@ -28736,6 +32372,70 @@ var maxlengthDirective = function() { }; }; +/** + * @ngdoc directive + * @name ngMinlength + * + * @description + * + * ngMinlength adds the minlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}. + * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls. + * + * The validator sets the `minlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`} + * is shorter than the integer obtained by evaluating the Angular expression given in the + * `ngMinlength` attribute value. + * + *
+ * **Note:** This directive is also added when the plain `minlength` attribute is used, with two + * differences: + *
    + *
  1. + * `ngMinlength` does not set the `minlength` attribute and therefore HTML5 constraint + * validation is not available. + *
  2. + *
  3. + * The `ngMinlength` value must be an expression, while the `minlength` value must be + * interpolated. + *
  4. + *
+ *
+ * + * @example + * + * + * + *
+ *
+ * + * + *
+ * + *
+ *
+ * input valid? = {{form.input.$valid}}
+ * model = {{model}} + *
+ *
+ *
+ * + var model = element(by.binding('model')); + var input = element(by.id('input')); + + it('should validate the input with the default minlength', function() { + input.sendKeys('ab'); + expect(model.getText()).not.toContain('ab'); + + input.sendKeys('abc'); + expect(model.getText()).toContain('abc'); + }); + * + *
+ */ var minlengthDirective = function() { return { restrict: 'A', @@ -28757,7 +32457,9 @@ var minlengthDirective = function() { if (window.angular.bootstrap) { //AngularJS is already loaded, so we can return here... - console.log('WARNING: Tried to load angular more than once.'); + if (window.console) { + console.log('WARNING: Tried to load angular more than once.'); + } return; } @@ -28848,6 +32550,20 @@ $provide.value("$locale", { "Nov", "Dec" ], + "STANDALONEMONTH": [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ], "WEEKENDRANGE": [ 5, 6 @@ -28891,14 +32607,15 @@ $provide.value("$locale", { ] }, "id": "en-us", + "localeID": "en_US", "pluralCat": function(n, opt_precision) { var i = n | 0; var vf = getVF(n, opt_precision); if (i == 1 && vf.v == 0) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;} }); }]); - jqLite(document).ready(function() { - angularInit(document, bootstrap); + jqLite(window.document).ready(function() { + angularInit(window.document, bootstrap); }); -})(window, document); +})(window); !window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend(''); \ No newline at end of file diff --git a/js/vendor/angular/angular.min.js b/js/vendor/angular/angular.min.js index 272101ec..c8d650bd 100644 --- a/js/vendor/angular/angular.min.js +++ b/js/vendor/angular/angular.min.js @@ -1,294 +1,324 @@ /* - AngularJS v1.4.7 - (c) 2010-2015 Google, Inc. http://angularjs.org + AngularJS v1.5.11 + (c) 2010-2017 Google, Inc. http://angularjs.org License: MIT */ -(function(Q,X,w){'use strict';function I(b){return function(){var a=arguments[0],c;c="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.4.7/"+(b?b+"/":"")+a;for(a=1;a").append(b).html();try{return b[0].nodeType===Pa?F(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+F(b)})}catch(d){return F(c)}}function xc(b){try{return decodeURIComponent(b)}catch(a){}} -function yc(b){var a={};m((b||"").split("&"),function(b){var d,e,f;b&&(e=b=b.replace(/\+/g,"%20"),d=b.indexOf("="),-1!==d&&(e=b.substring(0,d),f=b.substring(d+1)),e=xc(e),A(e)&&(f=A(f)?xc(f):!0,ta.call(a,e)?J(a[e])?a[e].push(f):a[e]=[a[e],f]:a[e]=f))});return a}function Pb(b){var a=[];m(b,function(b,d){J(b)?m(b,function(b){a.push(la(d,!0)+(!0===b?"":"="+la(b,!0)))}):a.push(la(d,!0)+(!0===b?"":"="+la(b,!0)))});return a.length?a.join("&"):""}function ob(b){return la(b,!0).replace(/%26/gi,"&").replace(/%3D/gi, -"=").replace(/%2B/gi,"+")}function la(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Yd(b,a){var c,d,e=Qa.length;for(d=0;d/,">"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");d=fb(a,c.strictDi);d.invoke(["$rootScope", -"$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;Q&&e.test(Q.name)&&(c.debugInfoEnabled=!0,Q.name=Q.name.replace(e,""));if(Q&&!f.test(Q.name))return d();Q.name=Q.name.replace(f,"");da.resumeBootstrap=function(b){m(b,function(b){a.push(b)});return d()};x(da.resumeDeferredBootstrap)&&da.resumeDeferredBootstrap()}function $d(){Q.name="NG_ENABLE_DEBUG_INFO!"+Q.name;Q.location.reload()} -function ae(b){b=da.element(b).injector();if(!b)throw Ea("test");return b.get("$$testability")}function Ac(b,a){a=a||"_";return b.replace(be,function(b,d){return(d?a:"")+b.toLowerCase()})}function ce(){var b;if(!Bc){var a=pb();(ra=v(a)?Q.jQuery:a?Q[a]:w)&&ra.fn.on?(B=ra,P(ra.fn,{scope:Ra.scope,isolateScope:Ra.isolateScope,controller:Ra.controller,injector:Ra.injector,inheritedData:Ra.inheritedData}),b=ra.cleanData,ra.cleanData=function(a){var d;if(Qb)Qb=!1;else for(var e=0,f;null!=(f=a[e]);e++)(d= -ra._data(f,"events"))&&d.$destroy&&ra(f).triggerHandler("$destroy");b(a)}):B=R;da.element=B;Bc=!0}}function qb(b,a,c){if(!b)throw Ea("areq",a||"?",c||"required");return b}function Sa(b,a,c){c&&J(b)&&(b=b[b.length-1]);qb(x(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ta(b,a){if("hasOwnProperty"===b)throw Ea("badname",a);}function Cc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,h=0;h")+d[2];for(d=d[0];d--;)c=c.lastChild;f=db(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";m(f,function(a){e.appendChild(a)});return e}function R(b){if(b instanceof R)return b;var a;G(b)&&(b=T(b), -a=!0);if(!(this instanceof R)){if(a&&"<"!=b.charAt(0))throw Tb("nosel");return new R(b)}if(a){a=X;var c;b=(c=Ef.exec(b))?[a.createElement(c[1])]:(c=Mc(b,a))?c.childNodes:[]}Nc(this,b)}function Ub(b){return b.cloneNode(!0)}function ub(b,a){a||vb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;dk&&this.remove(r.key);return b}},get:function(a){if(k").parent()[0])});var f= -S(a,b,a,c,d,e);W.$$addScopeClass(a);var g=null;return function(b,c,d){qb(b,"scope");d=d||{};var e=d.parentBoundTranscludeFn,h=d.transcludeControllers;d=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==wa(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?B(Xb(g,B("
").append(a).html())):c?Ra.clone.call(a):a;if(h)for(var k in h)d.data("$"+k+"Controller",h[k].instance);W.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,e);return d}}function S(a, -b,c,d,e,f){function g(a,c,d,e){var f,k,l,r,n,t,O;if(q)for(O=Array(c.length),r=0;rD.priority)break;if(M=D.scope)D.templateUrl||(C(M)?(Q("new/isolated scope", -u||S,D,v),u=D):Q("new/isolated scope",u,D,v)),S=S||D;y=D.name;!D.templateUrl&&D.controller&&(M=D.controller,ba=ba||fa(),Q("'"+y+"' controller",ba[y],D,v),ba[y]=D);if(M=D.transclude)N=!0,D.$$tlb||(Q("transclusion",z,D,v),z=D),"element"==M?(ia=!0,H=D.priority,M=v,v=d.$$element=B(X.createComment(" "+y+": "+d[y]+" ")),b=v[0],U(f,ua.call(M,0),b),Ka=W(M,e,H,g&&g.name,{nonTlbTranscludeDirective:z})):(M=B(Ub(b)).contents(),v.empty(),Ka=W(M,e));if(D.template)if(m=!0,Q("template",L,D,v),L=D,M=x(D.template)? -D.template(v,d):D.template,M=ha(M),D.replace){g=D;M=Sb.test(M)?Xc(Xb(D.templateNamespace,T(M))):[];b=M[0];if(1!=M.length||b.nodeType!==pa)throw ga("tplrt",y,"");U(f,v,b);F={$attr:{}};M=ca(b,[],F);var Lf=a.splice(I+1,a.length-(I+1));u&&A(M);a=a.concat(M).concat(Lf);Yc(d,F);F=a.length}else v.html(M);if(D.templateUrl)m=!0,Q("template",L,D,v),L=D,D.replace&&(g=D),K=Mf(a.splice(I,a.length-I),v,d,f,N&&Ka,h,k,{controllerDirectives:ba,newScopeDirective:S!==D&&S,newIsolateScopeDirective:u,templateDirective:L, -nonTlbTranscludeDirective:z}),F=a.length;else if(D.compile)try{na=D.compile(v,d,Ka),x(na)?n(null,na,P,R):na&&n(na.pre,na.post,P,R)}catch(V){c(V,xa(v))}D.terminal&&(K.terminal=!0,H=Math.max(H,D.priority))}K.scope=S&&!0===S.scope;K.transcludeOnThisElement=N;K.templateOnThisElement=m;K.transclude=Ka;r.hasElementTranscludeDirective=ia;return K}function A(a){for(var b=0,c=a.length;bn.priority)&&-1!=n.restrict.indexOf(f)&&(k&&(n=Nb(n,{$$start:k,$$end:l})),b.push(n),h=n)}catch(H){c(H)}}return h}function I(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function R(a,b){if("srcdoc"==b)return ia.HTML;var c=wa(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b|| -"ngSrc"==b))return ia.RESOURCE_URL}function V(a,c,d,e,f){var h=R(a,e);f=g[e]||f;var l=b(d,!0,h,f);if(l){if("multiple"===e&&"select"===wa(a))throw ga("selmulti",xa(a));c.push({priority:100,compile:function(){return{pre:function(a,c,g){c=g.$$observers||(g.$$observers=fa());if(k.test(e))throw ga("nodomevents");var r=g[e];r!==d&&(l=r&&b(r,!0,h,f),d=r);l&&(g[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope||a).$watch(l,function(a,b){"class"===e&&a!=b?g.$updateClass(a,b):g.$set(e, -a)}))}}}})}}function U(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=a)return b;for(;a--;)8===b[a].nodeType&&Nf.call(b,a,1);return b}function Xe(){var b={},a=!1;this.register=function(a,d){Ta(a,"controller");C(a)?P(b,a):b[a]=d};this.allowGlobals=function(){a=!0};this.$get=["$injector","$window",function(c,d){function e(a,b,c,d){if(!a||!C(a.$scope))throw I("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,h,g,l){var k,n,p;g=!0===g;l&&G(l)&&(p=l);if(G(f)){l=f.match(Vc);if(!l)throw Of("ctrlfmt",f); -n=l[1];p=p||l[3];f=b.hasOwnProperty(n)?b[n]:Cc(h.$scope,n,!0)||(a?Cc(d,n,!0):w);Sa(f,n,!0)}if(g)return g=(J(f)?f[f.length-1]:f).prototype,k=Object.create(g||null),p&&e(h,p,k,n||f.name),P(function(){var a=c.invoke(f,k,h,n);a!==k&&(C(a)||x(a))&&(k=a,p&&e(h,p,k,n||f.name));return k},{instance:k,identifier:p});k=c.instantiate(f,h,n);p&&e(h,p,k,n||f.name);return k}}]}function Ye(){this.$get=["$window",function(b){return B(b.document)}]}function Ze(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b, -arguments)}}]}function Yb(b){return C(b)?ea(b)?b.toISOString():eb(b):b}function df(){this.$get=function(){return function(b){if(!b)return"";var a=[];nc(b,function(b,d){null===b||v(b)||(J(b)?m(b,function(b,c){a.push(la(d)+"="+la(Yb(b)))}):a.push(la(d)+"="+la(Yb(b))))});return a.join("&")}}}function ef(){this.$get=function(){return function(b){function a(b,e,f){null===b||v(b)||(J(b)?m(b,function(b,c){a(b,e+"["+(C(b)?c:"")+"]")}):C(b)&&!ea(b)?nc(b,function(b,c){a(b,e+(f?"":"[")+c+(f?"":"]"))}):c.push(la(e)+ -"="+la(Yb(b))))}if(!b)return"";var c=[];a(b,"",!0);return c.join("&")}}}function Zb(b,a){if(G(b)){var c=b.replace(Pf,"").trim();if(c){var d=a("Content-Type");(d=d&&0===d.indexOf(ad))||(d=(d=c.match(Qf))&&Rf[d[0]].test(c));d&&(b=vc(c))}}return b}function bd(b){var a=fa(),c;G(b)?m(b.split("\n"),function(b){c=b.indexOf(":");var e=F(T(b.substr(0,c)));b=T(b.substr(c+1));e&&(a[e]=a[e]?a[e]+", "+b:b)}):C(b)&&m(b,function(b,c){var f=F(c),h=T(b);f&&(a[f]=a[f]?a[f]+", "+h:h)});return a}function cd(b){var a; -return function(c){a||(a=bd(b));return c?(c=a[F(c)],void 0===c&&(c=null),c):a}}function dd(b,a,c,d){if(x(d))return d(b,a,c);m(d,function(d){b=d(b,a,c)});return b}function cf(){var b=this.defaults={transformResponse:[Zb],transformRequest:[function(a){return C(a)&&"[object File]"!==va.call(a)&&"[object Blob]"!==va.call(a)&&"[object FormData]"!==va.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ja($b),put:ja($b),patch:ja($b)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN", -paramSerializer:"$httpParamSerializer"},a=!1;this.useApplyAsync=function(b){return A(b)?(a=!!b,this):a};var c=!0;this.useLegacyPromiseExtensions=function(a){return A(a)?(c=!!a,this):c};var d=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,h,g,l,k){function n(a){function d(a){var b=P({},a);b.data=a.data?dd(a.data,a.headers,a.status,f.transformResponse):a.data;a=a.status;return 200<=a&&300>a?b:l.reject(b)}function e(a,b){var c, -d={};m(a,function(a,e){x(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!da.isObject(a))throw I("$http")("badreq",a);var f=P({method:"get",transformRequest:b.transformRequest,transformResponse:b.transformResponse,paramSerializer:b.paramSerializer},a);f.headers=function(a){var c=b.headers,d=P({},a.headers),f,g,h,c=P({},c.common,c[F(a.method)]);a:for(f in c){g=F(f);for(h in d)if(F(h)===g)continue a;d[f]=c[f]}return e(d,ja(a))}(a);f.method=sb(f.method);f.paramSerializer=G(f.paramSerializer)?k.get(f.paramSerializer): -f.paramSerializer;var g=[function(a){var c=a.headers,e=dd(a.data,cd(c),w,a.transformRequest);v(e)&&m(c,function(a,b){"content-type"===F(b)&&delete c[b]});v(a.withCredentials)&&!v(b.withCredentials)&&(a.withCredentials=b.withCredentials);return p(a,e).then(d,d)},w],h=l.when(f);for(m(E,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){a=g.shift();var r=g.shift(),h=h.then(a,r)}c?(h.success=function(a){Sa(a, -"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Sa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=ed("success"),h.error=ed("error"));return h}function p(c,d){function h(b,c,d,e){function f(){k(c,b,d,e)}L&&(200<=b&&300>b?L.put(ba,[b,c,bd(d),e]):L.remove(ba));a?g.$applyAsync(f):(f(),g.$$phase||g.$apply())}function k(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?O.resolve:O.reject)({data:a,status:b,headers:cd(d),config:c,statusText:e})} -function p(a){k(a.data,a.status,ja(a.headers()),a.statusText)}function E(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var O=l.defer(),H=O.promise,L,m,S=c.headers,ba=r(c.url,c.paramSerializer(c.params));n.pendingRequests.push(c);H.then(E,E);!c.cache&&!b.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(L=C(c.cache)?c.cache:C(b.cache)?b.cache:t);L&&(m=L.get(ba),A(m)?m&&x(m.then)?m.then(p,p):J(m)?k(m[1],m[0],ja(m[2]),m[3]):k(m,200,{},"OK"):L.put(ba,H));v(m)&&((m= -fd(c.url)?f()[c.xsrfCookieName||b.xsrfCookieName]:w)&&(S[c.xsrfHeaderName||b.xsrfHeaderName]=m),e(c.method,ba,d,h,S,c.timeout,c.withCredentials,c.responseType));return H}function r(a,b){0=l&&(u.resolve(E), -t(q.$$intervalId),delete f[q.$$intervalId]);K||b.$apply()},g);f[q.$$intervalId]=u;return q}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]}function ac(b){b=b.split("/");for(var a=b.length;a--;)b[a]=ob(b[a]);return b.join("/")}function gd(b,a){var c=Aa(b);a.$$protocol=c.protocol;a.$$host=c.hostname;a.$$port=Y(c.port)||Tf[c.protocol]||null}function hd(b,a){var c="/"!==b.charAt(0); -c&&(b="/"+b);var d=Aa(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search=yc(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function sa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ja(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Cb(b){return b.replace(/(#.+)|#$/,"$1")}function bc(b,a,c){this.$$html5=!0;c=c||"";gd(b,this);this.$$parse=function(b){var c=sa(a, -b);if(!G(c))throw Db("ipthprfx",b,a);hd(c,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var b=Pb(this.$$search),c=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=ac(this.$$path)+(b?"?"+b:"")+c;this.$$absUrl=a+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,h;A(f=sa(b,d))?(h=f,h=A(f=sa(c,f))?a+(sa("/",f)||f):b+h):A(f=sa(a,d))?h=a+f:a==d+"/"&&(h=a);h&&this.$$parse(h);return!!h}}function cc(b,a,c){gd(b,this); -this.$$parse=function(d){var e=sa(b,d)||sa(a,d),f;v(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",v(e)&&(b=d,this.replace())):(f=sa(c,e),v(f)&&(f=e));hd(f,this);d=this.$$path;var e=b,h=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));h.exec(f)||(d=(f=h.exec(d))?f[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var a=Pb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=ac(this.$$path)+(a?"?"+a:"")+e;this.$$absUrl=b+(this.$$url?c+this.$$url:"")};this.$$parseLinkUrl= -function(a,c){return Ja(b)==Ja(a)?(this.$$parse(a),!0):!1}}function id(b,a,c){this.$$html5=!0;cc.apply(this,arguments);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,h;b==Ja(d)?f=d:(h=sa(a,d))?f=b+c+h:a===d+"/"&&(f=a);f&&this.$$parse(f);return!!f};this.$$compose=function(){var a=Pb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=ac(this.$$path)+(a?"?"+a:"")+e;this.$$absUrl=b+c+this.$$url}}function Eb(b){return function(){return this[b]}}function jd(b, -a){return function(c){if(v(c))return this[b];this[b]=a(c);this.$$compose();return this}}function hf(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return A(a)?(b=a,this):b};this.html5Mode=function(b){return bb(b)?(a.enabled=b,this):C(b)?(bb(b.enabled)&&(a.enabled=b.enabled),bb(b.requireBase)&&(a.requireBase=b.requireBase),bb(b.rewriteLinks)&&(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(c, -d,e,f,h){function g(a,b,c){var e=k.url(),f=k.$$state;try{d.url(a,b,c),k.$$state=d.state()}catch(g){throw k.url(e),k.$$state=f,g;}}function l(a,b){c.$broadcast("$locationChangeSuccess",k.absUrl(),a,k.$$state,b)}var k,n;n=d.baseHref();var p=d.url(),r;if(a.enabled){if(!n&&a.requireBase)throw Db("nobase");r=p.substring(0,p.indexOf("/",p.indexOf("//")+2))+(n||"/");n=e.history?bc:id}else r=Ja(p),n=cc;var t=r.substr(0,Ja(r).lastIndexOf("/")+1);k=new n(r,t,"#"+b);k.$$parseLinkUrl(p,p);k.$$state=d.state(); -var E=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&!b.shiftKey&&2!=b.which&&2!=b.button){for(var e=B(b.target);"a"!==wa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop("href"),l=e.attr("href")||e.attr("xlink:href");C(g)&&"[object SVGAnimatedString]"===g.toString()&&(g=Aa(g.animVal).href);E.test(g)||!g||e.attr("target")||b.isDefaultPrevented()||!k.$$parseLinkUrl(g,l)||(b.preventDefault(),k.absUrl()!=d.url()&&(c.$apply(),h.angular["ff-684208-preventDefault"]= -!0))}});Cb(k.absUrl())!=Cb(p)&&d.url(k.absUrl(),!0);var K=!0;d.onUrlChange(function(a,b){v(sa(t,a))?h.location.href=a:(c.$evalAsync(function(){var d=k.absUrl(),e=k.$$state,f;k.$$parse(a);k.$$state=b;f=c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented;k.absUrl()===a&&(f?(k.$$parse(d),k.$$state=e,g(d,!1,e)):(K=!1,l(d,e)))}),c.$$phase||c.$digest())});c.$watch(function(){var a=Cb(d.url()),b=Cb(k.absUrl()),f=d.state(),h=k.$$replace,r=a!==b||k.$$html5&&e.history&&f!==k.$$state;if(K||r)K=!1, -c.$evalAsync(function(){var b=k.absUrl(),d=c.$broadcast("$locationChangeStart",b,a,k.$$state,f).defaultPrevented;k.absUrl()===b&&(d?(k.$$parse(a),k.$$state=f):(r&&g(b,h,f===k.$$state?null:k.$$state),l(a,f)))});k.$$replace=!1});return k}]}function jf(){var b=!0,a=this;this.debugEnabled=function(a){return A(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a= -a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||y;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a=[];m(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function Xa(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"=== -b||"__proto__"===b)throw Z("isecfld",a);return b}function kd(b,a){b+="";if(!G(b))throw Z("iseccst",a);return b}function Ba(b,a){if(b){if(b.constructor===b)throw Z("isecfn",a);if(b.window===b)throw Z("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw Z("isecdom",a);if(b===Object)throw Z("isecobj",a);}return b}function ld(b,a){if(b){if(b.constructor===b)throw Z("isecfn",a);if(b===Uf||b===Vf||b===Wf)throw Z("isecff",a);}}function md(b,a){if(b&&(b===(0).constructor||b===(!1).constructor|| -b==="".constructor||b==={}.constructor||b===[].constructor||b===Function.constructor))throw Z("isecaf",a);}function Xf(b,a){return"undefined"!==typeof b?b:a}function nd(b,a){return"undefined"===typeof b?a:"undefined"===typeof a?b:b+a}function U(b,a){var c,d;switch(b.type){case s.Program:c=!0;m(b.body,function(b){U(b.expression,a);c=c&&b.expression.constant});b.constant=c;break;case s.Literal:b.constant=!0;b.toWatch=[];break;case s.UnaryExpression:U(b.argument,a);b.constant=b.argument.constant;b.toWatch= -b.argument.toWatch;break;case s.BinaryExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;b.toWatch=b.left.toWatch.concat(b.right.toWatch);break;case s.LogicalExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;b.toWatch=b.constant?[]:[b];break;case s.ConditionalExpression:U(b.test,a);U(b.alternate,a);U(b.consequent,a);b.constant=b.test.constant&&b.alternate.constant&&b.consequent.constant;b.toWatch=b.constant?[]:[b];break;case s.Identifier:b.constant= -!1;b.toWatch=[b];break;case s.MemberExpression:U(b.object,a);b.computed&&U(b.property,a);b.constant=b.object.constant&&(!b.computed||b.property.constant);b.toWatch=[b];break;case s.CallExpression:c=b.filter?!a(b.callee.name).$stateful:!1;d=[];m(b.arguments,function(b){U(b,a);c=c&&b.constant;b.constant||d.push.apply(d,b.toWatch)});b.constant=c;b.toWatch=b.filter&&!a(b.callee.name).$stateful?d:[b];break;case s.AssignmentExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant; -b.toWatch=[b];break;case s.ArrayExpression:c=!0;d=[];m(b.elements,function(b){U(b,a);c=c&&b.constant;b.constant||d.push.apply(d,b.toWatch)});b.constant=c;b.toWatch=d;break;case s.ObjectExpression:c=!0;d=[];m(b.properties,function(b){U(b.value,a);c=c&&b.value.constant;b.value.constant||d.push.apply(d,b.value.toWatch)});b.constant=c;b.toWatch=d;break;case s.ThisExpression:b.constant=!1,b.toWatch=[]}}function od(b){if(1==b.length){b=b[0].expression;var a=b.toWatch;return 1!==a.length?a:a[0]!==b?a:w}} -function pd(b){return b.type===s.Identifier||b.type===s.MemberExpression}function qd(b){if(1===b.body.length&&pd(b.body[0].expression))return{type:s.AssignmentExpression,left:b.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function rd(b){return 0===b.body.length||1===b.body.length&&(b.body[0].expression.type===s.Literal||b.body[0].expression.type===s.ArrayExpression||b.body[0].expression.type===s.ObjectExpression)}function sd(b,a){this.astBuilder=b;this.$filter=a}function td(b, -a){this.astBuilder=b;this.$filter=a}function Fb(b){return"constructor"==b}function dc(b){return x(b.valueOf)?b.valueOf():Yf.call(b)}function kf(){var b=fa(),a=fa();this.$get=["$filter",function(c){function d(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=dc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function e(a,b,c,e,f){var g=e.inputs,h;if(1===g.length){var k=d,g=g[0];return a.$watch(function(a){var b=g(a);d(b,k)||(h=e(a,w,w,[b]),k=b&&dc(b));return h},b,c,f)}for(var l=[],n=[],p=0, -m=g.length;p=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;fa)for(b in l++,f)ta.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1 -t&&(D=4-t,u[D]||(u[D]=[]),u[D].push({msg:x(b.exp)?"fn: "+(b.exp.name||b.exp.toString()):b.exp,newVal:f,oldVal:g}));else if(b===d){r=!1;break a}}catch(y){h(y)}if(!(k=m.$$watchersCount&&m.$$childHead||m!==this&&m.$$nextSibling))for(;m!==this&&!(k=m.$$nextSibling);)m=m.$parent}while(m=k);if((r||z.length)&&!t--)throw q.$$phase=null,c("infdig",a,u);}while(r||z.length);for(q.$$phase=null;N.length;)try{N.shift()()}catch(A){h(A)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"); -this.$$destroyed=!0;this===q&&l.$$applicationDestroyed();r(this,-this.$$watchersCount);for(var b in this.$$listenerCount)t(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=y;this.$on= -this.$watch=this.$watchGroup=function(){return y};this.$$listeners={};this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){q.$$phase||z.length||l.defer(function(){z.length&&q.$digest()});z.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){N.push(a)},$apply:function(a){try{p("$apply");try{return this.$eval(a)}finally{q.$$phase=null}}catch(b){h(b)}finally{try{q.$digest()}catch(c){throw h(c), -c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&w.push(b);u()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,t(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,f=!1,g={name:a,targetScope:e,stopPropagation:function(){f=!0},preventDefault:function(){g.defaultPrevented=!0},defaultPrevented:!1}, -k=db([g],arguments,1),l,n;do{d=e.$$listeners[a]||c;g.currentScope=e;l=0;for(n=d.length;lWa)throw Ca("iequirks");var d=ja(oa);d.isEnabled=function(){return b};d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=$a);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs,f=d.getTrusted,h=d.trustAs;m(oa,function(a,b){var c=F(b);d[gb("parse_as_"+c)]=function(b){return e(a,b)};d[gb("get_trusted_"+c)]=function(b){return f(a,b)};d[gb("trust_as_"+ -c)]=function(b){return h(a,b)}});return d}]}function qf(){this.$get=["$window","$document",function(b,a){var c={},d=Y((/android (\d+)/.exec(F((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},h,g=/^(Moz|webkit|ms)(?=[A-Z])/,l=f.body&&f.body.style,k=!1,n=!1;if(l){for(var p in l)if(k=g.exec(p)){h=k[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");k=!!("transition"in l||h+"Transition"in l);n=!!("animation"in l||h+"Animation"in -l);!d||k&&n||(k=G(l.webkitTransition),n=G(l.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"===a&&11>=Wa)return!1;if(v(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:Fa(),vendorPrefix:h,transitions:k,animations:n,android:d}}]}function sf(){this.$get=["$templateCache","$http","$q","$sce",function(b,a,c,d){function e(f,h){e.totalPendingRequests++;G(f)&&b.get(f)||(f=d.getTrustedResourceUrl(f));var g=a.defaults&&a.defaults.transformResponse; -J(g)?g=g.filter(function(a){return a!==Zb}):g===Zb&&(g=null);return a.get(f,{cache:b,transformResponse:g})["finally"](function(){e.totalPendingRequests--}).then(function(a){b.put(f,a.data);return a.data},function(a){if(!h)throw ga("tpload",f,a.status,a.statusText);return c.reject(a)})}e.totalPendingRequests=0;return e}]}function tf(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var h=[];m(a,function(a){var d= -da.element(a).data("$binding");d&&m(d,function(d){c?(new RegExp("(^|\\s)"+vd(b)+"(\\s|\\||$)")).test(d)&&h.push(a):-1!=d.indexOf(b)&&h.push(a)})});return h},findModels:function(a,b,c){for(var h=["ng-","data-ng-","ng\\:"],g=0;gb;b=Math.abs(b);var h=Infinity===b;if(!h&&!isFinite(b))return"";var g=b+"",l="",k=!1,n=[];h&&(l="\u221e");if(!h&&-1!==g.indexOf("e")){var p=g.match(/([\d\.]+)e(-?)(\d+)/);p&&"-"==p[2]&&p[3]>e+1?b=0:(l=g,k=!0)}if(h||k)0b&&(l=b.toFixed(e),b=parseFloat(l),l=l.replace(hc,d));else{h=(g.split(hc)[1]||"").length;v(e)&&(e=Math.min(Math.max(a.minFrac,h),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);var h=(""+b).split(hc),g=h[0],h=h[1]||"",p=0, -r=a.lgSize,t=a.gSize;if(g.length>=r+t)for(p=g.length-r,k=0;kb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Gb(e,a,d)}}function Hb(b,a){return function(c,d){var e=c["get"+b](),f=sb(a?"SHORT"+b:b);return d[f][e]}}function Ed(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function Fd(b){return function(a){var c=Ed(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Gb(a,b)}}function ic(b,a){return 0>=b.getFullYear()?a.ERAS[0]:a.ERAS[1]}function Ad(b){function a(a){var b;if(b= -a.match(c)){a=new Date(0);var f=0,h=0,g=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=Y(b[9]+b[10]),h=Y(b[9]+b[11]));g.call(a,Y(b[1]),Y(b[2])-1,Y(b[3]));f=Y(b[4]||0)-f;h=Y(b[5]||0)-h;g=Y(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,f,h,g,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var h="",g=[],l,k;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;G(c)&&(c= -fg.test(c)?Y(c):a(c));V(c)&&(c=new Date(c));if(!ea(c)||!isFinite(c.getTime()))return c;for(;e;)(k=gg.exec(e))?(g=db(g,k,1),e=g.pop()):(g.push(e),e=null);var n=c.getTimezoneOffset();f&&(n=wc(f,c.getTimezoneOffset()),c=Ob(c,f,!0));m(g,function(a){l=hg[a];h+=l?l(c,b.DATETIME_FORMATS,n):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return h}}function ag(){return function(b,a){v(a)&&(a=2);return eb(b,a)}}function bg(){return function(b,a,c){a=Infinity===Math.abs(Number(a))?Number(a):Y(a);if(isNaN(a))return b; -V(b)&&(b=b.toString());if(!J(b)&&!G(b))return b;c=!c||isNaN(c)?0:Y(c);c=0>c&&c>=-b.length?b.length+c:c;return 0<=a?b.slice(c,c+a):0===c?b.slice(a,b.length):b.slice(Math.max(0,c+a),c)}}function Cd(b){function a(a,c){c=c?-1:1;return a.map(function(a){var d=1,g=$a;if(x(a))g=a;else if(G(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))d="-"==a.charAt(0)?-1:1,a=a.substring(1);if(""!==a&&(g=b(a),g.constant))var l=g(),g=function(a){return a[l]}}return{get:g,descending:d*c}})}function c(a){switch(typeof a){case "number":case "boolean":case "string":return!0; -default:return!1}}return function(b,e,f){if(!Da(b))return b;J(e)||(e=[e]);0===e.length&&(e=["+"]);var h=a(e,f);h.push({get:function(){return{}},descending:f?-1:1});b=Array.prototype.map.call(b,function(a,b){return{value:a,predicateValues:h.map(function(d){var e=d.get(a);d=typeof e;if(null===e)d="string",e="null";else if("string"===d)e=e.toLowerCase();else if("object"===d)a:{if("function"===typeof e.valueOf&&(e=e.valueOf(),c(e)))break a;if(qc(e)&&(e=e.toString(),c(e)))break a;e=b}return{value:e,type:d}})}}); -b.sort(function(a,b){for(var c=0,d=0,e=h.length;db||37<=b&&40>=b||n(a,this,this.value)});if(e.hasEvent("paste"))a.on("paste cut",n)}a.on("change",l);d.$render=function(){var b=d.$isEmpty(d.$viewValue)? -"":d.$viewValue;a.val()!==b&&a.val(b)}}function Kb(b,a){return function(c,d){var e,f;if(ea(c))return c;if(G(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(ig.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},m(e,function(b,c){c=s};h.$observe("min",function(a){s=r(a);g.$validate()})}if(A(h.max)||h.ngMax){var u;g.$validators.max=function(a){return!p(a)||v(u)||c(a)<=u};h.$observe("max",function(a){u=r(a);g.$validate()})}}}function Id(b,a,c,d){(d.$$hasNativeValidators=C(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{};return c.badInput&&!c.typeMismatch?w:b})}function Jd(b,a,c,d,e){if(A(d)){b= -b(d);if(!b.constant)throw lb("constexpr",c,d);return b(a)}return e}function kc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Sb=/<|&#?\w+;/,Cf=/<([\w:-]+)/,Df=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, -ma={option:[1,'"],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option;ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead;ma.th=ma.td;var Ra=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(Q).on("load",a))}, -toString:function(){var b=[];m(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?B(this[b]):B(this[this.length+b])},length:0,push:kg,sort:[].sort,splice:[].splice},Bb={};m("multiple selected checked disabled readOnly required open".split(" "),function(b){Bb[F(b)]=b});var Sc={};m("input select option textarea button form details".split(" "),function(b){Sc[b]=!0});var $c={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"}; -m({data:Vb,removeData:vb,hasData:function(b){for(var a in hb[b.ng339])return!0;return!1}},function(b,a){R[a]=b});m({data:Vb,inheritedData:Ab,scope:function(b){return B.data(b,"$scope")||Ab(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return B.data(b,"$isolateScope")||B.data(b,"$isolateScopeNoTemplate")},controller:Pc,injector:function(b){return Ab(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:xb,css:function(b,a,c){a=gb(a);if(A(c))b.style[a]=c;else return b.style[a]}, -attr:function(b,a,c){var d=b.nodeType;if(d!==Pa&&2!==d&&8!==d)if(d=F(a),Bb[d])if(A(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||y).specified?d:w;else if(A(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?w:b},prop:function(b,a,c){if(A(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(v(b)){var d=a.nodeType;return d===pa||d===Pa?a.textContent:""}a.textContent=b}b.$dv="";return b}(), -val:function(b,a){if(v(a)){if(b.multiple&&"select"===wa(b)){var c=[];m(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(v(a))return b.innerHTML;ub(b,!0);b.innerHTML=a},empty:Qc},function(b,a){R.prototype[a]=function(a,d){var e,f,h=this.length;if(b!==Qc&&v(2==b.length&&b!==xb&&b!==Pc?a:d)){if(C(a)){for(e=0;e <= >= && || ! = |".split(" "),function(a){Lb[a]=!0});var rg={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},ec=function(a){this.options=a};ec.prototype={constructor:ec,lex:function(a){this.text=a;this.index=0;for(this.tokens= -[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"=== -a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=A(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw Z("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index","<=",">=");)a={type:s.BinaryExpression,operator:c.text, -left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a={type:s.BinaryExpression,operator:c.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a={type:s.BinaryExpression,operator:c.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()}, -primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=ha(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var c;c=this.expect("(","[",".");)"("===c.text?(a={type:s.CallExpression,callee:a,arguments:this.parseArguments()}, -this.consume(")")):"["===c.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===c.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var c={type:s.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return c},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.expression()); -while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:s.ArrayExpression,elements:a}},object:function(){var a=[],c;if("}"!==this.peekToken().text){do{if(this.peek("}"))break; -c={type:s.Property,kind:"init"};this.peek().constant?c.key=this.constant():this.peek().identifier?c.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");c.value=this.expression();a.push(c)}while(this.expect(","))}this.consume("}");return{type:s.ObjectExpression,properties:a}},throwError:function(a,c){throw Z("syntax",c.text,a,c.index+1,this.text,this.text.substring(c.index));},consume:function(a){if(0===this.tokens.length)throw Z("ueoe",this.text);var c=this.expect(a); -c||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return c},peekToken:function(){if(0===this.tokens.length)throw Z("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){return this.peekAhead(0,a,c,d,e)},peekAhead:function(a,c,d,e,f){if(this.tokens.length>a){a=this.tokens[a];var h=a.text;if(h===c||h===d||h===e||h===f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},constants:{"true":{type:s.Literal,value:!0}, -"false":{type:s.Literal,value:!1},"null":{type:s.Literal,value:null},undefined:{type:s.Literal,value:w},"this":{type:s.ThisExpression}}};sd.prototype={compile:function(a,c){var d=this,e=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:c,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};U(e,d.$filter);var f="",h;this.stage="assign";if(h=qd(e))this.state.computing="assign",f=this.nextId(),this.recurse(h,f),this.return_(f),f="fn.assign="+this.generateFunction("assign", -"s,v,l");h=od(e.body);d.stage="inputs";m(h,function(a,c){var e="fn"+c;d.state[e]={vars:[],body:[],own:{}};d.state.computing=e;var f=d.nextId();d.recurse(a,f);d.return_(f);d.state.inputs.push(e);a.watchId=c});this.state.computing="fn";this.stage="main";this.recurse(e);f='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+f+this.watchFns()+"return fn;";f=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue", -"ensureSafeAssignContext","ifDefined","plus","text",f))(this.$filter,Xa,Ba,ld,kd,md,Xf,nd,a);this.state=this.stage=w;f.literal=rd(e);f.constant=e.constant;return f},USE:"use",STRICT:"strict",watchFns:function(){var a=[],c=this.state.inputs,d=this;m(c,function(c){a.push("var "+c+"="+d.generateFunction(c,"s"))});c.length&&a.push("fn.inputs=["+c.join(",")+"];");return a.join("")},generateFunction:function(a,c){return"function("+c+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a= -[],c=this;m(this.state.filters,function(d,e){a.push(d+"=$filter("+c.escape(e)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,c,d,e,f,h){var g,l,k=this,n,p;e=e||y;if(!h&&A(a.watchId))c=c||this.nextId(),this.if_("i",this.lazyAssign(c,this.computedMember("i",a.watchId)),this.lazyRecurse(a,c,d,e,f,!0));else switch(a.type){case s.Program:m(a.body, -function(c,d){k.recurse(c.expression,w,w,function(a){l=a});d!==a.body.length-1?k.current().body.push(l,";"):k.return_(l)});break;case s.Literal:p=this.escape(a.value);this.assign(c,p);e(p);break;case s.UnaryExpression:this.recurse(a.argument,w,w,function(a){l=a});p=a.operator+"("+this.ifDefined(l,0)+")";this.assign(c,p);e(p);break;case s.BinaryExpression:this.recurse(a.left,w,w,function(a){g=a});this.recurse(a.right,w,w,function(a){l=a});p="+"===a.operator?this.plus(g,l):"-"===a.operator?this.ifDefined(g, -0)+a.operator+this.ifDefined(l,0):"("+g+")"+a.operator+"("+l+")";this.assign(c,p);e(p);break;case s.LogicalExpression:c=c||this.nextId();k.recurse(a.left,c);k.if_("&&"===a.operator?c:k.not(c),k.lazyRecurse(a.right,c));e(c);break;case s.ConditionalExpression:c=c||this.nextId();k.recurse(a.test,c);k.if_(c,k.lazyRecurse(a.alternate,c),k.lazyRecurse(a.consequent,c));e(c);break;case s.Identifier:c=c||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l", -a.name)+"?l:s"),d.computed=!1,d.name=a.name);Xa(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){f&&1!==f&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(c,k.nonComputedMember("s",a.name))})},c&&k.lazyAssign(c,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Fb(a.name))&&k.addEnsureSafeObject(c);e(c);break;case s.MemberExpression:g=d&&(d.context=this.nextId())|| -this.nextId();c=c||this.nextId();k.recurse(a.object,g,w,function(){k.if_(k.notNull(g),function(){if(a.computed)l=k.nextId(),k.recurse(a.property,l),k.getStringValue(l),k.addEnsureSafeMemberName(l),f&&1!==f&&k.if_(k.not(k.computedMember(g,l)),k.lazyAssign(k.computedMember(g,l),"{}")),p=k.ensureSafeObject(k.computedMember(g,l)),k.assign(c,p),d&&(d.computed=!0,d.name=l);else{Xa(a.property.name);f&&1!==f&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name), -"{}"));p=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Fb(a.property.name))p=k.ensureSafeObject(p);k.assign(c,p);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(c,"undefined")});e(c)},!!f);break;case s.CallExpression:c=c||this.nextId();a.filter?(l=k.filter(a.callee.name),n=[],m(a.arguments,function(a){var c=k.nextId();k.recurse(a,c);n.push(c)}),p=l+"("+n.join(",")+")",k.assign(c,p),e(c)):(l=k.nextId(),g={},n=[],k.recurse(a.callee,l,g,function(){k.if_(k.notNull(l), -function(){k.addEnsureSafeFunction(l);m(a.arguments,function(a){k.recurse(a,k.nextId(),w,function(a){n.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),p=k.member(g.context,g.name,g.computed)+"("+n.join(",")+")"):p=l+"("+n.join(",")+")";p=k.ensureSafeObject(p);k.assign(c,p)},function(){k.assign(c,"undefined")});e(c)}));break;case s.AssignmentExpression:l=this.nextId();g={};if(!pd(a.left))throw Z("lval");this.recurse(a.left,w,g,function(){k.if_(k.notNull(g.context), -function(){k.recurse(a.right,l);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);p=k.member(g.context,g.name,g.computed)+a.operator+l;k.assign(c,p);e(c||p)})},1);break;case s.ArrayExpression:n=[];m(a.elements,function(a){k.recurse(a,k.nextId(),w,function(a){n.push(a)})});p="["+n.join(",")+"]";this.assign(c,p);e(p);break;case s.ObjectExpression:n=[];m(a.properties,function(a){k.recurse(a.value,k.nextId(),w,function(c){n.push(k.escape(a.key.type=== -s.Identifier?a.key.name:""+a.key.value)+":"+c)})});p="{"+n.join(",")+"}";this.assign(c,p);e(p);break;case s.ThisExpression:this.assign(c,"s");e("s");break;case s.NGValueParameter:this.assign(c,"v"),e("v")}},getHasOwnProperty:function(a,c){var d=a+"."+c,e=this.current().own;e.hasOwnProperty(d)||(e[d]=this.nextId(!1,a+"&&("+this.escape(c)+" in "+a+")"));return e[d]},assign:function(a,c){if(a)return this.current().body.push(a,"=",c,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]= -this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,c){return"ifDefined("+a+","+this.escape(c)+")"},plus:function(a,c){return"plus("+a+","+c+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,c,d){if(!0===a)c();else{var e=this.current().body;e.push("if(",a,"){");c();e.push("}");d&&(e.push("else{"),d(),e.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,c){return a+"."+c},computedMember:function(a, -c){return a+"["+c+"]"},member:function(a,c,d){return d?this.computedMember(a,c):this.nonComputedMember(a,c)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+ -a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+",text)")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,c,d,e,f,h){var g=this;return function(){g.recurse(a,c,d,e,f,h)}},lazyAssign:function(a,c){var d=this;return function(){d.assign(a,c)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g, -stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(G(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(V(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw Z("esc");},nextId:function(a,c){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(c?"="+c:""));return d},current:function(){return this.state[this.state.computing]}}; -td.prototype={compile:function(a,c){var d=this,e=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=c;U(e,d.$filter);var f,h;if(f=qd(e))h=this.recurse(f);f=od(e.body);var g;f&&(g=[],m(f,function(a,c){var e=d.recurse(a);a.input=e;g.push(e);a.watchId=c}));var l=[];m(e.body,function(a){l.push(d.recurse(a.expression))});f=0===e.body.length?function(){}:1===e.body.length?l[0]:function(a,c){var d;m(l,function(e){d=e(a,c)});return d};h&&(f.assign=function(a,c,d){return h(a,d,c)});g&&(f.inputs= -g);f.literal=rd(e);f.constant=e.constant;return f},recurse:function(a,c,d){var e,f,h=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,c);case s.UnaryExpression:return f=this.recurse(a.argument),this["unary"+a.operator](f,c);case s.BinaryExpression:return e=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](e,f,c);case s.LogicalExpression:return e=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](e, -f,c);case s.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),c);case s.Identifier:return Xa(a.name,h.expression),h.identifier(a.name,h.expensiveChecks||Fb(a.name),c,d,h.expression);case s.MemberExpression:return e=this.recurse(a.object,!1,!!d),a.computed||(Xa(a.property.name,h.expression),f=a.property.name),a.computed&&(f=this.recurse(a.property)),a.computed?this.computedMember(e,f,c,d,h.expression):this.nonComputedMember(e,f, -h.expensiveChecks,c,d,h.expression);case s.CallExpression:return g=[],m(a.arguments,function(a){g.push(h.recurse(a))}),a.filter&&(f=this.$filter(a.callee.name)),a.filter||(f=this.recurse(a.callee,!0)),a.filter?function(a,d,e,h){for(var r=[],m=0;m":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)>c(e,f,h,g);return d?{value:e}:e}},"binary<=":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)<=c(e,f,h,g);return d?{value:e}:e}},"binary>=":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)>=c(e,f,h,g);return d?{value:e}:e}},"binary&&":function(a,c,d){return function(e, -f,h,g){e=a(e,f,h,g)&&c(e,f,h,g);return d?{value:e}:e}},"binary||":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)||c(e,f,h,g);return d?{value:e}:e}},"ternary?:":function(a,c,d,e){return function(f,h,g,l){f=a(f,h,g,l)?c(f,h,g,l):d(f,h,g,l);return e?{value:f}:f}},value:function(a,c){return function(){return c?{context:w,name:w,value:a}:a}},identifier:function(a,c,d,e,f){return function(h,g,l,k){h=g&&a in g?g:h;e&&1!==e&&h&&!h[a]&&(h[a]={});g=h?h[a]:w;c&&Ba(g,f);return d?{context:h,name:a,value:g}: -g}},computedMember:function(a,c,d,e,f){return function(h,g,l,k){var n=a(h,g,l,k),p,m;null!=n&&(p=c(h,g,l,k),p=kd(p),Xa(p,f),e&&1!==e&&n&&!n[p]&&(n[p]={}),m=n[p],Ba(m,f));return d?{context:n,name:p,value:m}:m}},nonComputedMember:function(a,c,d,e,f,h){return function(g,l,k,n){g=a(g,l,k,n);f&&1!==f&&g&&!g[c]&&(g[c]={});l=null!=g?g[c]:w;(d||Fb(c))&&Ba(l,h);return e?{context:g,name:c,value:l}:l}},inputs:function(a,c){return function(d,e,f,h){return h?h[c]:a(d,e,f)}}};var fc=function(a,c,d){this.lexer= -a;this.$filter=c;this.options=d;this.ast=new s(this.lexer);this.astCompiler=d.csp?new td(this.ast,c):new sd(this.ast,c)};fc.prototype={constructor:fc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};fa();fa();var Yf=Object.prototype.valueOf,Ca=I("$sce"),oa={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},ga=I("$compile"),$=X.createElement("a"),xd=Aa(Q.location.href);yd.$inject=["$document"];Kc.$inject=["$provide"];zd.$inject=["$locale"];Bd.$inject= -["$locale"];var hc=".",hg={yyyy:aa("FullYear",4),yy:aa("FullYear",2,0,!0),y:aa("FullYear",1),MMMM:Hb("Month"),MMM:Hb("Month",!0),MM:aa("Month",2,1),M:aa("Month",1,1),dd:aa("Date",2),d:aa("Date",1),HH:aa("Hours",2),H:aa("Hours",1),hh:aa("Hours",2,-12),h:aa("Hours",1,-12),mm:aa("Minutes",2),m:aa("Minutes",1),ss:aa("Seconds",2),s:aa("Seconds",1),sss:aa("Milliseconds",3),EEEE:Hb("Day"),EEE:Hb("Day",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a,c,d){a=-1*d;return a=(0<= -a?"+":"")+(Gb(Math[0=a.getFullYear()?c.ERANAMES[0]:c.ERANAMES[1]}},gg=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,fg=/^\-?\d+$/;Ad.$inject=["$locale"];var cg=qa(F),dg=qa(sb);Cd.$inject=["$parse"];var he=qa({restrict:"E",compile:function(a,c){if(!c.href&&!c.xlinkHref)return function(a,c){if("a"===c[0].nodeName.toLowerCase()){var f="[object SVGAnimatedString]"=== -va.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}}),tb={};m(Bb,function(a,c){function d(a,d,f){a.$watch(f[e],function(a){f.$set(c,!!a)})}if("multiple"!=a){var e=ya("ng-"+c),f=d;"checked"===a&&(f=function(a,c,f){f.ngModel!==f[e]&&d(a,c,f)});tb[e]=function(){return{restrict:"A",priority:100,link:f}}}});m($c,function(a,c){tb[c]=function(){return{priority:100,link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(jg))){f.$set("ngPattern", -new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});m(["src","srcset","href"],function(a){var c=ya("ng-"+a);tb[c]=function(){return{priority:99,link:function(d,e,f){var h=a,g=a;"href"===a&&"[object SVGAnimatedString]"===va.call(e.prop("href"))&&(g="xlinkHref",f.$attr[g]="xlink:href",h=null);f.$observe(c,function(c){c?(f.$set(g,c),Wa&&h&&e.prop(h,f[g])):"href"===a&&f.$set(g,null)})}}}});var Ib={$addControl:y,$$renameControl:function(a,c){a.$name=c},$removeControl:y,$setValidity:y, -$setDirty:y,$setPristine:y,$setSubmitted:y};Gd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Od=function(a){return["$timeout","$parse",function(c,d){function e(a){return""===a?d('this[""]').assign:d(a).assign||y}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Gd,compile:function(d,h){d.addClass(Ya).addClass(mb);var g=h.name?"name":a&&h.ngForm?"ngForm":!1;return{pre:function(a,d,f,h){var m=h[0];if(!("action"in f)){var t=function(c){a.$apply(function(){m.$commitViewValue(); -m.$setSubmitted()});c.preventDefault()};d[0].addEventListener("submit",t,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",t,!1)},0,!1)})}(h[1]||m.$$parentForm).$addControl(m);var s=g?e(m.$name):y;g&&(s(a,m),f.$observe(g,function(c){m.$name!==c&&(s(a,w),m.$$parentForm.$$renameControl(m,c),s=e(m.$name),s(a,m))}));d.on("$destroy",function(){m.$$parentForm.$removeControl(m);s(a,w);P(m,Ib)})}}}}}]},ie=Od(),ve=Od(!0),ig=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/, -sg=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,tg=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,ug=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Pd=/^(\d{4})-(\d{2})-(\d{2})$/,Qd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,lc=/^(\d{4})-W(\d\d)$/,Rd=/^(\d{4})-(\d\d)$/,Sd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Td={text:function(a,c,d,e,f,h){jb(a,c,d,e,f,h);jc(e)},date:kb("date", -Pd,Kb(Pd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":kb("datetimelocal",Qd,Kb(Qd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:kb("time",Sd,Kb(Sd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:kb("week",lc,function(a,c){if(ea(a))return a;if(G(a)){lc.lastIndex=0;var d=lc.exec(a);if(d){var e=+d[1],f=+d[2],h=d=0,g=0,l=0,k=Ed(e),f=7*(f-1);c&&(d=c.getHours(),h=c.getMinutes(),g=c.getSeconds(),l=c.getMilliseconds());return new Date(e,0,k.getDate()+f,d,h,g,l)}}return NaN},"yyyy-Www"), -month:kb("month",Rd,Kb(Rd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,h){Id(a,c,d,e);jb(a,c,d,e,f,h);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:ug.test(a)?parseFloat(a):w});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!V(a))throw lb("numfmt",a);a=a.toString()}return a});if(A(d.min)||d.ngMin){var g;e.$validators.min=function(a){return e.$isEmpty(a)||v(g)||a>=g};d.$observe("min",function(a){A(a)&&!V(a)&&(a=parseFloat(a,10));g=V(a)&&!isNaN(a)?a:w;e.$validate()})}if(A(d.max)|| -d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)||v(l)||a<=l};d.$observe("max",function(a){A(a)&&!V(a)&&(a=parseFloat(a,10));l=V(a)&&!isNaN(a)?a:w;e.$validate()})}},url:function(a,c,d,e,f,h){jb(a,c,d,e,f,h);jc(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||sg.test(d)}},email:function(a,c,d,e,f,h){jb(a,c,d,e,f,h);jc(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||tg.test(d)}},radio:function(a,c, -d,e){v(d.name)&&c.attr("name",++nb);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,h,g,l){var k=Jd(l,a,"ngTrueValue",d.ngTrueValue,!0),n=Jd(l,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return ka(a, -k)});e.$parsers.push(function(a){return a?k:n})},hidden:y,button:y,submit:y,reset:y,file:y},Ec=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,h,g,l){l[0]&&(Td[F(g.type)]||Td.text)(f,h,g,l[0],c,a,d,e)}}}}],vg=/^(true|false|\d+)$/,Ne=function(){return{restrict:"A",priority:100,compile:function(a,c){return vg.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value", -a)})}}}},ne=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=v(a)?"":a})}}}}],pe=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,h){d=a(f.attr(h.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];h.$observe("ngBindTemplate",function(a){f.textContent=v(a)?"":a})}}}}],oe=["$sce","$parse", -"$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var h=c(f.ngBindHtml),g=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(g,function(){e.html(a.getTrustedHtml(h(c))||"")})}}}}],Me=qa({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),qe=kc("",!0),se=kc("Odd",0),re=kc("Even",1),te=Na({compile:function(a,c){c.$set("ngCloak", -w);a.removeClass("ng-cloak")}}),ue=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Jc={},wg={blur:!0,focus:!0};m("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=ya("ng-"+a);Jc[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,h){var g=d(h[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){g(c,{$event:d})}; -wg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var xe=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,h){var g,l,k;c.$watch(e.ngIf,function(c){c?l||h(function(c,f){l=f;c[c.length++]=X.createComment(" end ngIf: "+e.ngIf+" ");g={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),g&&(k=rb(g.clone),a.leave(k).then(function(){k=null}),g=null))})}}}],ye=["$templateRequest","$anchorScroll", -"$animate",function(a,c,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:da.noop,compile:function(e,f){var h=f.ngInclude||f.src,g=f.onload||"",l=f.autoscroll;return function(e,f,m,r,t){var s=0,v,u,q,z=function(){u&&(u.remove(),u=null);v&&(v.$destroy(),v=null);q&&(d.leave(q).then(function(){u=null}),u=q,q=null)};e.$watch(h,function(h){var m=function(){!A(l)||l&&!e.$eval(l)||c()},p=++s;h?(a(h,!0).then(function(a){if(p===s){var c=e.$new();r.template=a;a=t(c,function(a){z(); -d.enter(a,null,f).then(m)});v=c;q=a;v.$emit("$includeContentLoaded",h);e.$eval(g)}},function(){p===s&&(z(),e.$emit("$includeContentError",h))}),e.$emit("$includeContentRequested",h)):(z(),r.template=null)})}}}}],Pe=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Mc(f.template,X).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}],ze=Na({priority:450, -compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Le=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",h="false"!==d.ngTrim,g=h?T(f):f;e.$parsers.push(function(a){if(!v(a)){var c=[];a&&m(a.split(g),function(a){a&&c.push(h?T(a):a)});return c}});e.$formatters.push(function(a){return J(a)?a.join(f):w});e.$isEmpty=function(a){return!a||!a.length}}}},mb="ng-valid",Kd="ng-invalid",Ya="ng-pristine",Jb="ng-dirty",Md= -"ng-pending",lb=I("ngModel"),xg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,h,g,l,k,n){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=w;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending= -w;this.$name=n(d.name||"",!1)(a);this.$$parentForm=Ib;var p=f(d.ngModel),r=p.assign,t=p,s=r,K=null,u,q=this;this.$$setOptions=function(a){if((q.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");t=function(a){var d=p(a);x(d)&&(d=c(a));return d};s=function(a,c){x(p(a))?g(a,{$$$p:q.$modelValue}):r(a,q.$modelValue)}}else if(!p.assign)throw lb("nonassign",d.ngModel,xa(e));};this.$render=y;this.$isEmpty=function(a){return v(a)||""===a||null===a||a!==a};var z=0;Hd({ctrl:this,$element:e, -set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},$animate:h});this.$setPristine=function(){q.$dirty=!1;q.$pristine=!0;h.removeClass(e,Jb);h.addClass(e,Ya)};this.$setDirty=function(){q.$dirty=!0;q.$pristine=!1;h.removeClass(e,Ya);h.addClass(e,Jb);q.$$parentForm.$setDirty()};this.$setUntouched=function(){q.$touched=!1;q.$untouched=!0;h.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){q.$touched=!0;q.$untouched=!1;h.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue= -function(){g.cancel(K);q.$viewValue=q.$$lastCommittedViewValue;q.$render()};this.$validate=function(){if(!V(q.$modelValue)||!isNaN(q.$modelValue)){var a=q.$$rawModelValue,c=q.$valid,d=q.$modelValue,e=q.$options&&q.$options.allowInvalid;q.$$runValidators(a,q.$$lastCommittedViewValue,function(f){e||c===f||(q.$modelValue=f?a:w,q.$modelValue!==d&&q.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d){function e(){var d=!0;m(q.$validators,function(e,f){var h=e(a,c);d=d&&h;g(f,h)});return d? -!0:(m(q.$asyncValidators,function(a,c){g(c,null)}),!1)}function f(){var d=[],e=!0;m(q.$asyncValidators,function(f,h){var k=f(a,c);if(!k||!x(k.then))throw lb("$asyncValidators",k);g(h,w);d.push(k.then(function(){g(h,!0)},function(a){e=!1;g(h,!1)}))});d.length?k.all(d).then(function(){h(e)},y):h(!0)}function g(a,c){l===z&&q.$setValidity(a,c)}function h(a){l===z&&d(a)}z++;var l=z;(function(){var a=q.$$parserName||"parse";if(v(u))g(a,null);else return u||(m(q.$validators,function(a,c){g(c,null)}),m(q.$asyncValidators, -function(a,c){g(c,null)})),g(a,u),u;return!0})()?e()?f():h(!1):h(!1)};this.$commitViewValue=function(){var a=q.$viewValue;g.cancel(K);if(q.$$lastCommittedViewValue!==a||""===a&&q.$$hasNativeValidators)q.$$lastCommittedViewValue=a,q.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=q.$$lastCommittedViewValue;if(u=v(c)?w:!0)for(var d=0;df||e.$isEmpty(c)||c.length<=f}}}}},Hc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=Y(a)||0;e.$validate()}); -e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}};Q.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(ce(),ee(da),da.module("ngLocale",[],["$provide",function(a){function c(a){a+="";var c=a.indexOf(".");return-1==c?0:a.length-c-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "), -SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3, -maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",pluralCat:function(a,e){var f=a|0,h=e;w===h&&(h=Math.min(c(a),3));Math.pow(10,h);return 1==f&&0==h?"one":"other"}})}]),B(X).ready(function(){Zd(X,zc)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(''); +(function(y){'use strict';function G(a,b){b=b||Error;return function(){var d=arguments[0],c;c="["+(a?a+":":"")+d+"] http://errors.angularjs.org/1.5.11/"+(a?a+"/":"")+d;for(d=1;d").append(a).html();try{return a[0].nodeType===La?Q(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+Q(b)})}catch(c){return Q(d)}}function Ec(a){try{return decodeURIComponent(a)}catch(b){}}function Fc(a){var b={};q((a||"").split("&"),function(a){var c,f,e;a&&(f=a=a.replace(/\+/g,"%20"), +c=a.indexOf("="),-1!==c&&(f=a.substring(0,c),e=a.substring(c+1)),f=Ec(f),x(f)&&(e=x(e)?Ec(e):!0,ua.call(b,f)?I(b[f])?b[f].push(e):b[f]=[b[f],e]:b[f]=e))});return b}function Vb(a){var b=[];q(a,function(a,c){I(a)?q(a,function(a){b.push(oa(c,!0)+(!0===a?"":"="+oa(a,!0)))}):b.push(oa(c,!0)+(!0===a?"":"="+oa(a,!0)))});return b.length?b.join("&"):""}function tb(a){return oa(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function oa(a,b){return encodeURIComponent(a).replace(/%40/gi, +"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function re(a,b){var d,c,f=Oa.length;for(c=0;c protocol indicates an extension, document.location.href does not match."))}function Gc(a,b,d){E(d)||(d={});d=R({strictDi:!1},d);var c=function(){a=F(a);if(a.injector()){var c=a[0]===y.document?"document":ya(a);throw xa("btstrpd",c.replace(//,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]); +b.unshift("ng");c=fb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},f=/^NG_ENABLE_DEBUG_INFO!/,e=/^NG_DEFER_BOOTSTRAP!/;y&&f.test(y.name)&&(d.debugInfoEnabled=!0,y.name=y.name.replace(f,""));if(y&&!e.test(y.name))return c();y.name=y.name.replace(e,"");$.resumeBootstrap=function(a){q(a,function(a){b.push(a)});return c()};C($.resumeDeferredBootstrap)&&$.resumeDeferredBootstrap()}function ue(){y.name= +"NG_ENABLE_DEBUG_INFO!"+y.name;y.location.reload()}function ve(a){a=$.element(a).injector();if(!a)throw xa("test");return a.get("$$testability")}function Hc(a,b){b=b||"_";return a.replace(we,function(a,c){return(c?b:"")+a.toLowerCase()})}function xe(){var a;if(!Ic){var b=ub();(za=z(b)?y.jQuery:b?y[b]:void 0)&&za.fn.on?(F=za,R(za.fn,{scope:Pa.scope,isolateScope:Pa.isolateScope,controller:Pa.controller,injector:Pa.injector,inheritedData:Pa.inheritedData}),a=za.cleanData,za.cleanData=function(b){for(var c, +f=0,e;null!=(e=b[f]);f++)(c=za._data(e,"events"))&&c.$destroy&&za(e).triggerHandler("$destroy");a(b)}):F=W;$.element=F;Ic=!0}}function gb(a,b,d){if(!a)throw xa("areq",b||"?",d||"required");return a}function Qa(a,b,d){d&&I(a)&&(a=a[a.length-1]);gb(C(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ra(a,b){if("hasOwnProperty"===a)throw xa("badname",b);}function Jc(a,b,d){if(!b)return a;b=b.split(".");for(var c,f=a,e=b.length,g=0;g")+c[2];for(c=c[0];c--;)d=d.lastChild;e=cb(e,d.childNodes);d=f.firstChild;d.textContent=""}else e.push(b.createTextNode(a));f.textContent="";f.innerHTML="";q(e,function(a){f.appendChild(a)});return f}function Uc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function W(a){if(a instanceof W)return a;var b;D(a)&&(a=Y(a),b=!0);if(!(this instanceof W)){if(b&&"<"!==a.charAt(0))throw Yb("nosel");return new W(a)}if(b){b=y.document;var d;a=(d=ag.exec(a))? +[b.createElement(d[1])]:(d=Tc(a,b))?d.childNodes:[]}Vc(this,a)}function Zb(a){return a.cloneNode(!0)}function yb(a,b){b||ib(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,f=d.length;c=Ia?!1:"function"===typeof a&&/^(?:class\b|constructor\()/.test(Function.prototype.toString.call(a)+" ");return d?(c.unshift(null),new (Function.prototype.bind.apply(a, +c))):a.apply(b,c)},instantiate:function(a,b,c){var d=I(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,a))},get:d,annotate:fb.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Sa([],!0),n={$provide:{provider:d(c),factory:d(e),service:d(function(a,b){return e(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return e(a,ha(b),!1)}),constant:d(function(a,b){Ra(a,"constant"); +n[a]=b;s[a]=b}),decorator:function(a,b){var c=r.get(a+"Provider"),d=c.$get;c.$get=function(){var a=u.invoke(d,c);return u.invoke(b,null,{$delegate:a})}}}},r=n.$injector=h(n,function(a,b){$.isString(b)&&l.push(b);throw Ba("unpr",l.join(" <- "));}),s={},H=h(s,function(a,b){var c=r.get(a+"Provider",b);return u.invoke(c.$get,c,void 0,a)}),u=H;n.$injectorProvider={$get:ha(H)};var p=g(a),u=H.get("$injector");u.strictDi=b;q(p,function(a){a&&u.invoke(a)});return u}function kf(){var a=!0;this.disableAutoScrolling= +function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function f(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===wa(a))return b=a,!0});return b}function e(a){if(a){a.scrollIntoView();var c;c=g.yOffset;C(c)?c=c():Sb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):ba(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=D(a)?a:ba(a)?a.toString():d.hash();var b;a?(b=h.getElementById(a))? +e(b):(b=f(h.getElementsByName(a)))?e(b):"top"===a&&e(null):e(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||cg(function(){c.$evalAsync(g)})});return g}]}function kb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;I(a)&&(a=a.join(" "));I(b)&&(b=b.join(" "));return a+" "+b}function lg(a){D(a)&&(a=a.split(" "));var b=V();q(a,function(a){a.length&&(b[a]=!0)});return b}function Ca(a){return E(a)?a:{}}function mg(a,b,d,c){function f(a){try{a.apply(null, +va.call(arguments,1))}finally{if(H--,0===H)for(;u.length;)try{u.pop()()}catch(b){d.error(b)}}}function e(){N=null;g();h()}function g(){p=L();p=z(p)?null:p;na(p,J)&&(p=J);J=p}function h(){if(A!==k.url()||K!==p)A=k.url(),K=p,q(O,function(a){a(k.url(),p)})}var k=this,l=a.location,m=a.history,n=a.setTimeout,r=a.clearTimeout,s={};k.isMock=!1;var H=0,u=[];k.$$completeOutstandingRequest=f;k.$$incOutstandingRequestCount=function(){H++};k.notifyWhenNoOutstandingRequests=function(a){0===H?a():u.push(a)};var p, +K,A=l.href,v=b.find("base"),N=null,L=c.history?function(){try{return m.state}catch(a){}}:w;g();K=p;k.url=function(b,d,e){z(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=K===e;if(A===b&&(!c.history||f))return k;var h=A&&Ga(A)===Ga(b);A=b;K=e;!c.history||h&&f?(h||(N=b),d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b,l.href!==b&&(N=b)):(m[d?"replaceState":"pushState"](e,"",b),g(),K=p);N&&(N=b);return k}return N||l.href.replace(/%27/g, +"'")};k.state=function(){return p};var O=[],M=!1,J=null;k.onUrlChange=function(b){if(!M){if(c.history)F(a).on("popstate",e);F(a).on("hashchange",e);M=!0}O.push(b);return b};k.$$applicationDestroyed=function(){F(a).off("hashchange popstate",e)};k.$$checkUrlChange=h;k.baseHref=function(){var a=v.attr("href");return a?a.replace(/^(https?:)?\/\/[^/]*/,""):""};k.defer=function(a,b){var c;H++;c=n(function(){delete s[c];f(a)},b||0);s[c]=!0;return c};k.defer.cancel=function(a){return s[a]?(delete s[a],r(a), +f(w),!0):!1}}function rf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new mg(a,c,b,d)}]}function sf(){this.$get=function(){function a(a,c){function f(a){a!==n&&(r?r===a&&(r=a.n):r=a,e(a.n,a.p),e(a,n),n=a,n.n=null)}function e(a,b){a!==b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw G("$cacheFactory")("iid",a);var g=0,h=R({},c,{id:a}),k=V(),l=c&&c.capacity||Number.MAX_VALUE,m=V(),n=null,r=null;return b[a]={put:function(a,b){if(!z(b)){if(ll&&this.remove(r.key);return b}},get:function(a){if(l";b=ta.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function Ja(a,b){try{a.addClass(b)}catch(c){}}function ca(a,b,c,d,e){a instanceof F||(a=F(a));for(var f=/\S+/,g=0,h=a.length;g").append(a).html())):c?Pa.clone.call(a):a;if(g)for(var h in g)d.data("$"+ +h+"Controller",g[h].instance);ca.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function Ma(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,n,s,A;if(p)for(A=Array(c.length),m=0;mv.priority)break; +if(w=v.scope)v.templateUrl||(E(w)?($("new/isolated scope",u||A,v,B),u=v):$("new/isolated scope",u,v,B)),A=A||v;S=v.name;if(!x&&(v.replace&&(v.templateUrl||v.template)||v.transclude&&!v.$$tlb)){for(w=y+1;x=a[w++];)if(x.transclude&&!x.$$tlb||x.replace&&(x.templateUrl||x.template)){Ja=!0;break}x=!0}!v.templateUrl&&v.controller&&(r=r||V(),$("'"+S+"' controller",r[S],v,B),r[S]=v);if(w=v.transclude)if(T=!0,v.$$tlb||($("transclusion",M,v,B),M=v),"element"===w)H=!0,p=v.priority,P=B,B=d.$$element=F(ca.$$createComment(S, +d[S])),b=B[0],ga(f,va.call(P,0),b),P[0].$$parentNode=P[0].parentNode,L=dc(Ja,P,e,p,g&&g.name,{nonTlbTranscludeDirective:M});else{var G=V();P=F(Zb(b)).contents();if(E(w)){P=[];var Q=V(),bc=V();q(w,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Q[a]=b;G[b]=null;bc[b]=c});q(B.contents(),function(a){var b=Q[Da(wa(a))];b?(bc[b]=!0,G[b]=G[b]||[],G[b].push(a)):P.push(a)});q(bc,function(a,b){if(!a)throw fa("reqslot",b);});for(var U in G)G[U]&&(G[U]=dc(Ja,G[U],e))}B.empty();L=dc(Ja,P,e,void 0, +void 0,{needsNewScope:v.$$isolateScope||v.$$newScope});L.$$slots=G}if(v.template)if(J=!0,$("template",O,v,B),O=v,w=C(v.template)?v.template(B,d):v.template,w=Ca(w),v.replace){g=v;P=Xb.test(w)?ed(ha(v.templateNamespace,Y(w))):[];b=P[0];if(1!==P.length||1!==b.nodeType)throw fa("tplrt",S,"");ga(f,B,b);D={$attr:{}};w=cc(b,[],D);var og=a.splice(y+1,a.length-(y+1));(u||A)&&aa(w,u,A);a=a.concat(w).concat(og);ea(d,D);D=a.length}else B.html(w);if(v.templateUrl)J=!0,$("template",O,v,B),O=v,v.replace&&(g=v), +n=ia(a.splice(y,a.length-y),B,d,f,T&&L,h,k,{controllerDirectives:r,newScopeDirective:A!==v&&A,newIsolateScopeDirective:u,templateDirective:O,nonTlbTranscludeDirective:M}),D=a.length;else if(v.compile)try{qa=v.compile(B,d,L);var Z=v.$$originalDirective||v;C(qa)?m(null,db(Z,qa),Ta,Ma):qa&&m(db(Z,qa.pre),db(Z,qa.post),Ta,Ma)}catch(da){c(da,ya(B))}v.terminal&&(n.terminal=!0,p=Math.max(p,v.priority))}n.scope=A&&!0===A.scope;n.transcludeOnThisElement=T;n.templateOnThisElement=J;n.transclude=L;l.hasElementTranscludeDirective= +H;return n}function X(a,b,c,d){var e;if(D(b)){var f=b.match(l);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw fa("ctreq",b,a);}else if(I(b))for(e=[],g=0,f=b.length;gc.priority)&&-1!==c.restrict.indexOf(f)){k&&(c=Tb(c,{$$start:k,$$end:l}));if(!c.$$bindings){var s= +m=c,r=c.name,v={isolateScope:null,bindToController:null};E(s.scope)&&(!0===s.bindToController?(v.bindToController=d(s.scope,r,!0),v.isolateScope={}):v.isolateScope=d(s.scope,r,!1));E(s.bindToController)&&(v.bindToController=d(s.bindToController,r,!0));if(v.bindToController&&!s.controller)throw fa("noctrl",r);m=m.$$bindings=v;E(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);m=c}}return m}function Z(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function oa(a,b){if("srcdoc"=== +b)return B.HTML;var c=wa(a);if("src"===b||"ngSrc"===b){if(-1===["img","video","audio","source","track"].indexOf(c))return B.RESOURCE_URL}else if("xlinkHref"===b||"form"===c&&"action"===b)return B.RESOURCE_URL}function pa(a,c,d,e,f){var g=oa(a,e),h=k[e]||f,l=b(d,!f,g,h);if(l){if("multiple"===e&&"select"===wa(a))throw fa("selmulti",ya(a));c.push({priority:100,compile:function(){return{pre:function(a,c,f){c=f.$$observers||(f.$$observers=V());if(m.test(e))throw fa("nodomevents");var k=f[e];k!==d&&(l= +k&&b(k,!0,g,h),d=k);l&&(f[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(f.$$observers&&f.$$observers[e].$$scope||a).$watch(l,function(a,b){"class"===e&&a!==b?f.$updateClass(a,b):f.$set(e,a)}))}}}})}}function ga(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===La&&""===d.nodeValue.trim())&& +pg.call(a,b,1)}return a}function ng(a,b){if(b&&D(b))return b;if(D(a)){var d=hd.exec(a);if(d)return d[3]}}function tf(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Ra(b,"controller");E(b)?R(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function f(a,b,c,d){if(!a||!E(a.$scope))throw G("$controller")("noscp",d,b);a.$scope[b]=c}return function(e,g,h,k){var l,m,n;h=!0===h;k&&D(k)&&(n=k);if(D(e)){k=e.match(hd); +if(!k)throw id("ctrlfmt",e);m=k[1];n=n||k[3];e=a.hasOwnProperty(m)?a[m]:Jc(g.$scope,m,!0)||(b?Jc(c,m,!0):void 0);if(!e)throw id("ctrlreg",m);Qa(e,m,!0)}if(h)return h=(I(e)?e[e.length-1]:e).prototype,l=Object.create(h||null),n&&f(g,n,l,m||e.name),R(function(){var a=d.invoke(e,l,g,m);a!==l&&(E(a)||C(a))&&(l=a,n&&f(g,n,l,m||e.name));return l},{instance:l,identifier:n});l=d.instantiate(e,g,m);n&&f(g,n,l,m||e.name);return l}}]}function uf(){this.$get=["$window",function(a){return F(a.document)}]}function vf(){this.$get= +["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function fc(a){return E(a)?ja(a)?a.toISOString():eb(a):a}function Af(){this.$get=function(){return function(a){if(!a)return"";var b=[];yc(a,function(a,c){null===a||z(a)||(I(a)?q(a,function(a){b.push(oa(c)+"="+oa(fc(a)))}):b.push(oa(c)+"="+oa(fc(a))))});return b.join("&")}}}function Bf(){this.$get=function(){return function(a){function b(a,f,e){null===a||z(a)||(I(a)?q(a,function(a,c){b(a,f+"["+(E(a)?c:"")+"]")}):E(a)&&!ja(a)?yc(a, +function(a,c){b(a,f+(e?"":"[")+c+(e?"":"]"))}):d.push(oa(f)+"="+oa(fc(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function gc(a,b){if(D(a)){var d=a.replace(qg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(jd))||(c=(c=d.match(rg))&&sg[c[0]].test(d));c&&(a=Cc(d))}}return a}function kd(a){var b=V(),d;D(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var f=Q(Y(a.substr(0,d)));a=Y(a.substr(d+1));f&&(b[f]=b[f]?b[f]+", "+a:a)}):E(a)&&q(a,function(a,d){var e=Q(d),g=Y(a);e&& +(b[e]=b[e]?b[e]+", "+g:g)});return b}function ld(a){var b;return function(d){b||(b=kd(a));return d?(d=b[Q(d)],void 0===d&&(d=null),d):b}}function md(a,b,d,c){if(C(c))return c(a,b,d);q(c,function(c){a=c(a,b,d)});return a}function zf(){var a=this.defaults={transformResponse:[gc],transformRequest:[function(a){return E(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ka(hc),put:ka(hc), +patch:ka(hc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return x(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return x(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(f,e,g,h,k,l){function m(b){function c(a,b){for(var d=0,e=b.length;da?b:k.reject(b)}if(!E(b))throw G("$http")("badreq",b);if(!D(b.url))throw G("$http")("badreq",b.url);var g=R({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);g.headers=function(b){var c=a.headers,d=R({},b.headers), +f,g,h,c=R({},c.common,c[Q(b.method)]);a:for(f in c){g=Q(f);for(h in d)if(Q(h)===g)continue a;d[f]=c[f]}return e(d,ka(b))}(b);g.method=wb(g.method);g.paramSerializer=D(g.paramSerializer)?l.get(g.paramSerializer):g.paramSerializer;var h=[],m=[],s=k.when(g);q(H,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&m.push(a.response,a.responseError)});s=c(s,h);s=s.then(function(b){var c=b.headers,d=md(b.data,ld(c),void 0,b.transformRequest);z(d)&& +q(c,function(a,b){"content-type"===Q(b)&&delete c[b]});z(b.withCredentials)&&!z(a.withCredentials)&&(b.withCredentials=a.withCredentials);return n(b,d).then(f,f)});s=c(s,m);d?(s.success=function(a){Qa(a,"fn");s.then(function(b){a(b.data,b.status,b.headers,g)});return s},s.error=function(a){Qa(a,"fn");s.then(null,function(b){a(b.data,b.status,b.headers,g)});return s}):(s.success=nd("success"),s.error=nd("error"));return s}function n(c,d){function g(a){if(a){var c={};q(a,function(a,d){c[d]=function(c){function d(){a(c)} +b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function l(a,c,d,e){function f(){n(c,a,d,e)}J&&(200<=a&&300>a?J.put(S,[a,c,kd(d),e]):J.remove(S));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function n(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?O.resolve:O.reject)({data:a,status:b,headers:ld(d),config:c,statusText:e})}function H(a){n(a.data,a.status,ka(a.headers()),a.statusText)}function L(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var O=k.defer(),M=O.promise, +J,B,T=c.headers,S=r(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);M.then(L,L);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(J=E(c.cache)?c.cache:E(a.cache)?a.cache:s);J&&(B=J.get(S),x(B)?B&&C(B.then)?B.then(H,H):I(B)?n(B[1],B[0],ka(B[2]),B[3]):n(B,200,{},"OK"):J.put(S,M));z(B)&&((B=od(c.url)?e()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(T[c.xsrfHeaderName||a.xsrfHeaderName]=B),f(c.method,S,d,l,T,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers), +g(c.uploadEventHandlers)));return M}function r(a,b){0=l&&(A.resolve(p),u(v.$$intervalId),delete g[v.$$intervalId]);K||a.$apply()},k);g[v.$$intervalId]=A;return v}var g={};e.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return e}]}function ic(a){a=a.split("/");for(var b=a.length;b--;)a[b]=tb(a[b]);return a.join("/")}function pd(a,b){var d=ta(a);b.$$protocol= +d.protocol;b.$$host=d.hostname;b.$$port=Z(d.port)||ug[d.protocol]||null}function qd(a,b){if(vg.test(a))throw lb("badpath",a);var d="/"!==a.charAt(0);d&&(a="/"+a);var c=ta(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=Fc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function ra(a,b){if(b.slice(0,a.length)===a)return b.substr(a.length)}function Ga(a){var b=a.indexOf("#");return-1=== +b?a:a.substr(0,b)}function mb(a){return a.replace(/(#.+)|#$/,"$1")}function jc(a,b,d){this.$$html5=!0;d=d||"";pd(a,this);this.$$parse=function(a){var d=ra(b,a);if(!D(d))throw lb("ipthprfx",a,b);qd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Vb(this.$$search),d=this.$$hash?"#"+tb(this.$$hash):"";this.$$url=ic(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,f){if(f&&"#"===f[0])return this.hash(f.slice(1)), +!0;var e,g;x(e=ra(a,c))?(g=e,g=d&&x(e=ra(d,e))?b+(ra("/",e)||e):a+g):x(e=ra(b,c))?g=b+e:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function kc(a,b,d){pd(a,this);this.$$parse=function(c){var f=ra(a,c)||ra(b,c),e;z(f)||"#"!==f.charAt(0)?this.$$html5?e=f:(e="",z(f)&&(a=c,this.replace())):(e=ra(d,f),z(e)&&(e=f));qd(e,this);c=this.$$path;var f=a,g=/^\/[A-Z]:(\/.*)/;e.slice(0,f.length)===f&&(e=e.replace(f,""));g.exec(e)||(c=(e=g.exec(c))?e[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b= +Vb(this.$$search),f=this.$$hash?"#"+tb(this.$$hash):"";this.$$url=ic(this.$$path)+(b?"?"+b:"")+f;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=function(b,d){return Ga(a)===Ga(b)?(this.$$parse(b),!0):!1}}function rd(a,b,d){this.$$html5=!0;kc.apply(this,arguments);this.$$parseLinkUrl=function(c,f){if(f&&"#"===f[0])return this.hash(f.slice(1)),!0;var e,g;a===Ga(c)?e=c:(g=ra(b,c))?e=a+d+g:b===c+"/"&&(e=b);e&&this.$$parse(e);return!!e};this.$$compose=function(){var b=Vb(this.$$search), +f=this.$$hash?"#"+tb(this.$$hash):"";this.$$url=ic(this.$$path)+(b?"?"+b:"")+f;this.$$absUrl=a+d+this.$$url}}function Ib(a){return function(){return this[a]}}function sd(a,b){return function(d){if(z(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Ff(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return x(b)?(a=b,this):a};this.html5Mode=function(a){if(Ka(a))return b.enabled=a,this;if(E(a)){Ka(a.enabled)&&(b.enabled=a.enabled);Ka(a.requireBase)&& +(b.requireBase=a.requireBase);if(Ka(a.rewriteLinks)||D(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,f,e,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var n=c.url(),r;if(b.enabled){if(!m&&b.requireBase)throw lb("nobase"); +r=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/");m=f.history?jc:rd}else r=Ga(n),m=kc;var s=r.substr(0,Ga(r).lastIndexOf("/")+1);l=new m(r,s,"#"+a);l.$$parseLinkUrl(n,n);l.$$state=c.state();var H=/^\s*(javascript|mailto):/i;e.on("click",function(a){var f=b.rewriteLinks;if(f&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var h=F(a.target);"a"!==wa(h[0]);)if(h[0]===e[0]||!(h=h.parent())[0])return;if(!D(f)||!z(h.attr(f))){var f=h.prop("href"),k=h.attr("href")||h.attr("xlink:href"); +E(f)&&"[object SVGAnimatedString]"===f.toString()&&(f=ta(f.animVal).href);H.test(f)||!f||h.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(f,k)||(a.preventDefault(),l.absUrl()!==c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}});mb(l.absUrl())!==mb(n)&&c.url(l.absUrl(),!0);var u=!0;c.onUrlChange(function(a,b){z(ra(s,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=mb(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented; +l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(u=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=mb(c.url()),b=mb(l.absUrl()),e=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&f.history&&e!==l.$$state;if(u||m)u=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,e).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=e):(m&&h(b,g,e===l.$$state?null:l.$$state),k(a,e)))});l.$$replace=!1});return l}]}function Gf(){var a=!0,b= +this;this.debugEnabled=function(b){return x(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function f(a){var b=d.console||{},f=b[a]||b.log||w;a=!1;try{a=!!f.apply}catch(k){}return a?function(){var a=[];q(arguments,function(b){a.push(c(b))});return f.apply(b,a)}:function(a,b){f(a,null==b?"":b)}}return{log:f("log"), +info:f("info"),warn:f("warn"),error:f("error"),debug:function(){var c=f("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Ua(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw ea("isecfld",b);return a}function wg(a){return a+""}function Ea(a,b){if(a){if(a.constructor===a)throw ea("isecfn",b);if(a.window===a)throw ea("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ea("isecdom",b);if(a=== +Object)throw ea("isecobj",b);}return a}function td(a,b){if(a){if(a.constructor===a)throw ea("isecfn",b);if(a===xg||a===yg||a===zg)throw ea("isecff",b);}}function Jb(a,b){if(a&&(a===ud||a===vd||a===wd||a===xd||a===yd||a===zd||a===Ag||a===Bg||a===Kb||a===Cg||a===Ad||a===Dg))throw ea("isecaf",b);}function Eg(a,b){return"undefined"!==typeof a?a:b}function Bd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function X(a,b){var d,c,f;switch(a.type){case t.Program:d=!0;q(a.body,function(a){X(a.expression, +b);d=d&&a.expression.constant});a.constant=d;break;case t.Literal:a.constant=!0;a.toWatch=[];break;case t.UnaryExpression:X(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case t.BinaryExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case t.LogicalExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case t.ConditionalExpression:X(a.test, +b);X(a.alternate,b);X(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case t.Identifier:a.constant=!1;a.toWatch=[a];break;case t.MemberExpression:X(a.object,b);a.computed&&X(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case t.CallExpression:d=f=a.filter?!b(a.callee.name).$stateful:!1;c=[];q(a.arguments,function(a){X(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)}); +a.constant=d;a.toWatch=f?c:[a];break;case t.AssignmentExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case t.ArrayExpression:d=!0;c=[];q(a.elements,function(a){X(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case t.ObjectExpression:d=!0;c=[];q(a.properties,function(a){X(a.value,b);d=d&&a.value.constant&&!a.computed;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case t.ThisExpression:a.constant= +!1;a.toWatch=[];break;case t.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Cd(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Dd(a){return a.type===t.Identifier||a.type===t.MemberExpression}function Ed(a){if(1===a.body.length&&Dd(a.body[0].expression))return{type:t.AssignmentExpression,left:a.body[0].expression,right:{type:t.NGValueParameter},operator:"="}}function Fd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type=== +t.Literal||a.body[0].expression.type===t.ArrayExpression||a.body[0].expression.type===t.ObjectExpression)}function Gd(a,b){this.astBuilder=a;this.$filter=b}function Hd(a,b){this.astBuilder=a;this.$filter=b}function Lb(a){return"constructor"===a}function lc(a){return C(a.valueOf)?a.valueOf():Fg.call(a)}function Hf(){var a=V(),b=V(),d={"true":!0,"false":!1,"null":null,undefined:void 0},c,f;this.addLiteral=function(a,b){d[a]=b};this.setIdentifierFns=function(a,b){c=a;f=b;return this};this.$get=["$filter", +function(e){function g(c,d,f){var g,k,H;f=f||K;switch(typeof c){case "string":H=c=c.trim();var q=f?b:a;g=q[H];if(!g){":"===c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2));g=f?p:u;var B=new mc(g);g=(new nc(B,e,g)).parse(c);g.constant?g.$$watchDelegate=r:k?g.$$watchDelegate=g.literal?n:m:g.inputs&&(g.$$watchDelegate=l);f&&(g=h(g));q[H]=g}return s(g,d);case "function":return s(c,d);default:return s(w,d)}}function h(a){function b(c,d,e,f){var g=K;K=!0;try{return a(c,d,e,f)}finally{K=g}}if(!a)return a; +b.$$watchDelegate=a.$$watchDelegate;b.assign=h(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&c=this.promise.$$state.status&& +d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;fa)for(b in l++,f)ua.call(e,b)||(s--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1s&&(N=4-s,t[N]||(t[N]=[]),t[N].push({msg:C(a.exp)?"fn: "+(a.exp.name||a.exp.toString()): +a.exp,newVal:g,oldVal:k}));else if(a===c){p=!1;break a}}catch(w){e(w)}if(!(r=q.$$watchersCount&&q.$$childHead||q!==this&&q.$$nextSibling))for(;q!==this&&!(r=q.$$nextSibling);)q=q.$parent}while(q=r);if((p||A.length)&&!s--)throw K.$$phase=null,d("infdig",b,t);}while(p||A.length);for(K.$$phase=null;LIa)throw Fa("iequirks");var c=ka(ga);c.isEnabled=function(){return a}; +c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=$a);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var f=c.parseAs,e=c.getTrusted,g=c.trustAs;q(ga,function(a,b){var d=Q(b);c[hb("parse_as_"+d)]=function(b){return f(a,b)};c[hb("get_trusted_"+d)]=function(b){return e(a,b)};c[hb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function Nf(){this.$get=["$window", +"$document",function(a,b){var d={},c=!(a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,f=Z((/android (\d+)/.exec(Q((a.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h,k=/^(Moz|webkit|ms)(?=[A-Z])/,l=g.body&&g.body.style,m=!1,n=!1;if(l){for(var r in l)if(m=k.exec(r)){h=m[0];h=h[0].toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");m=!!("transition"in l|| +h+"Transition"in l);n=!!("animation"in l||h+"Animation"in l);!f||m&&n||(m=D(l.webkitTransition),n=D(l.webkitAnimation))}return{history:!(!c||4>f||e),hasEvent:function(a){if("input"===a&&11>=Ia)return!1;if(z(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:da(),vendorPrefix:h,transitions:m,animations:n,android:f}}]}function Pf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,f){function e(g,h){e.totalPendingRequests++; +if(!D(g)||z(b.get(g)))g=f.getTrustedResourceUrl(g);var k=d.defaults&&d.defaults.transformResponse;I(k)?k=k.filter(function(a){return a!==gc}):k===gc&&(k=null);return d.get(g,R({cache:b,transformResponse:k},a))["finally"](function(){e.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw Hg("tpload",g,a.status,a.statusText);return c.reject(a)})}e.totalPendingRequests=0;return e}]}function Qf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a, +b,d){a=a.getElementsByClassName("ng-binding");var g=[];q(a,function(a){var c=$.element(a).data("$binding");c&&q(c,function(c){d?(new RegExp("(^|\\s)"+Jd(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;hc&&(c=f),c+=+a.slice(f+1),a=a.substring(0,f)):0>c&&(c=a.length);for(f=0;a.charAt(f)===pc;f++);if(f===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===pc;)g--;c-=f;d=[];for(e=0;f<=g;f++,e++)d[e]=+a.charAt(f)}c>Td&&(d=d.splice(0,Td-1),b=c-1,c=1);return{d:d,e:b,i:c}}function Pg(a,b,d,c){var f=a.d,e= +f.length-a.i;b=z(b)?Math.min(Math.max(d,e),c):+b;d=b+a.i;c=f[d];if(0d-1){for(c=0;c>d;c--)f.unshift(0),a.i++;f.unshift(1);a.i++}else f[d-1]++;for(;eh;)k.unshift(0),h++;0=b.lgSize&&h.unshift(k.splice(-b.lgSize,k.length).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize,k.length).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);e.length&&(k+=c+e.join(""));f&&(k+="e+"+f)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+ +k+b.posSuf}function Mb(a,b,d,c){var f="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,f="-");for(a=""+a;a.length-d)e+=d;0===e&&-12===d&&(e=12);return Mb(e,b,c,f)}}function nb(a,b,d){return function(c,f){var e=c["get"+a](),g=wb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return f[g][e]}}function Ud(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Vd(a){return function(b){var d= +Ud(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Mb(b,a)}}function qc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Od(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var e=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(e=Z(b[9]+b[10]),g=Z(b[9]+b[11]));h.call(a,Z(b[1]),Z(b[2])-1,Z(b[3]));e=Z(b[4]||0)-e;g=Z(b[5]||0)-g;h=Z(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]|| +0)));k.call(a,e,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,e){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;D(c)&&(c=Qg.test(c)?Z(c):b(c));ba(c)&&(c=new Date(c));if(!ja(c)||!isFinite(c.getTime()))return c;for(;d;)(l=Rg.exec(d))?(h=cb(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();e&&(m=Dc(e,m),c=Ub(c,e,!0));q(h,function(b){k=Sg[b];g+=k?k(c,a.DATETIME_FORMATS,m): +"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Jg(){return function(a,b){z(b)&&(b=2);return eb(a,b)}}function Kg(){return function(a,b,d){b=Infinity===Math.abs(Number(b))?Number(b):Z(b);if(ia(b))return a;ba(a)&&(a=a.toString());if(!la(a))return a;d=!d||isNaN(d)?0:Z(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?rc(a,d,d+b):0===d?rc(a,b,a.length):rc(a,Math.max(0,d+b),d)}}function rc(a,b,d){return D(a)?a.slice(b,d):va.call(a,b,d)}function Qd(a){function b(b){return b.map(function(b){var c= +1,d=$a;if(C(b))d=b;else if(D(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var f=d(),d=function(a){return a[f]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,k=b.type;if(d===k){var k=a.value,l=b.value;"string"===d?(k=k.toLowerCase(),l=l.toLowerCase()):"object"===d&&(E(k)&&(k=a.index),E(l)&&(l=b.index));k!==l&&(c= +kb||37<=b&&40>=b||m(a,this,this.value)});if(f.hasEvent("paste"))b.on("paste cut",m)}b.on("change",l);if(Yd[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b= +this.validity,c=b.badInput,d=b.typeMismatch;k=e.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Pb(a,b){return function(d,c){var f,e;if(ja(d))return d;if(D(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(Tg.test(d))return new Date(d);a.lastIndex=0;if(f=a.exec(d))return f.shift(),e=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(), +mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},q(f,function(a,c){c=u};g.$observe("min",function(a){u=r(a);h.$validate()})}if(x(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!n(a)||z(p)||d(a)<=p};g.$observe("max",function(a){p=r(a);h.$validate()})}}}function tc(a,b,d,c){(c.$$hasNativeValidators= +E(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?void 0:a})}function Zd(a){a.$$parserName="number";a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(Ug.test(b))return parseFloat(b)});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!ba(b))throw pb("numfmt",b);b=b.toString()}return b})}function qb(a){x(a)&&!ba(a)&&(a=parseFloat(a));return ia(a)?void 0:a}function uc(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1 +a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function $d(a,b,d,c,f){if(x(c)){a=a(c);if(!a.constant)throw pb("constexpr",d,c);return a(b)}return f}function vc(a,b){a="ngClass"+a;return["$animate",function(d){function c(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Xb=/<|&#?\w+;/,Zf=/<([\w:-]+)/,$f=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,pa={option:[1,'"],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};pa.optgroup=pa.option;pa.tbody=pa.tfoot=pa.colgroup=pa.caption=pa.thead;pa.th=pa.td;var gg=y.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Pa=W.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===y.document.readyState?y.setTimeout(b): +(this.on("DOMContentLoaded",b),W(y).on("load",b))},toString:function(){var a=[];q(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?F(this[a]):F(this[this.length+a])},length:0,push:Wg,sort:[].sort,splice:[].splice},Gb={};q("multiple selected checked disabled readOnly required open".split(" "),function(a){Gb[Q(a)]=a});var $c={};q("input select option textarea button form details".split(" "),function(a){$c[a]=!0});var gd={ngMinlength:"minlength",ngMaxlength:"maxlength", +ngMin:"min",ngMax:"max",ngPattern:"pattern"};q({data:$b,removeData:ib,hasData:function(a){for(var b in jb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b/,jg=/^[^(]*\(\s*([^)]*)\)/m,Xg=/,/,Yg=/^\s*(_?)(\S+?)\1\s*$/,hg=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ba=G("$injector");fb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw D(d)&&d||(d=a.name||kg(a)),Ba("strictdi",d);b= +ad(a);q(b[1].split(Xg),function(a){a.replace(Yg,function(a,b,d){c.push(d)})})}a.$inject=c}}else I(a)?(b=a.length-1,Qa(a[b],"fn"),c=a.slice(0,b)):Qa(a,"fn",!0);return c};var de=G("$animate"),nf=function(){this.$get=w},of=function(){var a=new Sa,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function f(a,b,c){var d=!1;b&&(b=D(b)?b.split(" "):I(b)?b:[],q(b,function(b){b&&(d=!0,a[b]=c)}));return d}function e(){q(b,function(b){var c=a.get(b);if(c){var d=lg(b.attr("class")),e="",f="";q(c, +function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});q(b,function(a){e&&Db(a,e);f&&Cb(a,f)});a.remove(b)}});b.length=0}return{enabled:w,on:w,off:w,pin:w,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=f(k,h,!0),l=f(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(e);g=new d;g.complete();return g}}}]},lf=["$provide",function(a){var b=this;this.$$registeredAnimations= +Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw de("notcsel",d);var f=d+"-animation";b.$$registeredAnimations[d.substr(1)]=f;a.factory(f,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw de("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h <= >= && || ! = |".split(" "), +function(a){Qb[a]=!0});var bh={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},mc=function(a){this.options=a};mc.prototype={constructor:mc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"=== +typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)}, +isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b= +x(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ea("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:t.BinaryExpression,operator:b.text, +left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:t.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()}, +primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=sa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:t.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression", +this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:t.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:t.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:t.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:t.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression()); +return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:t.Identifier,name:a.text}},constant:function(){return{type:t.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]"); +return{type:t.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:t.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"), +b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:t.ObjectExpression,properties:a}},throwError:function(a,b){throw ea("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ea("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ea("ueoe", +this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,f){if(this.tokens.length>a){a=this.tokens[a];var e=a.text;if(e===b||e===d||e===c||e===f||!(b||d||c||f))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:t.ThisExpression},$locals:{type:t.LocalsExpression}}};Gd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{}, +expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};X(c,d.$filter);var f="",e;this.stage="assign";if(e=Ed(c))this.state.computing="assign",f=this.nextId(),this.recurse(e,f),this.return_(f),f="fn.assign="+this.generateFunction("assign","s,v,l");e=Cd(c.body);d.stage="inputs";q(e,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing= +"fn";this.stage="main";this.recurse(c);f='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+f+this.watchFns()+"return fn;";f=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",f))(this.$filter,Ua,Ea,td,wg,Jb,Eg,Bd,a);this.state=this.stage=void 0;f.literal=Fd(c);f.constant=c.constant;return f},USE:"use",STRICT:"strict",watchFns:function(){var a= +[],b=this.state.inputs,d=this;q(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;q(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+ +";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,f,e){var g,h,k=this,l,m,n;c=c||w;if(!e&&x(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,f,!0));else switch(a.type){case t.Program:q(a.body,function(b,c){k.recurse(b.expression,void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case t.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break; +case t.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});m=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,m);c(m);break;case t.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){h=a});m="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case t.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b); +k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case t.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case t.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Ua(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage|| +"s",function(){f&&1!==f&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Lb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case t.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){f&&1!==f&&k.addEnsureSafeAssignContext(g);if(a.computed)h= +k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),f&&1!==f&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Ua(a.property.name);f&&1!==f&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Lb(a.property.name))m=k.ensureSafeObject(m); +k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!f);break;case t.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],q(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+l.join(",")+")",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);q(a.arguments,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(k.ensureSafeObject(a))})}); +g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):m=h+"("+l.join(",")+")";m=k.ensureSafeObject(m);k.assign(b,m)},function(){k.assign(b,"undefined")});c(b)}));break;case t.AssignmentExpression:h=this.nextId();g={};this.recurse(a.left,void 0,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context, +g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case t.ArrayExpression:l=[];q(a.elements,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case t.ObjectExpression:l=[];n=!1;q(a.properties,function(a){a.computed&&(n=!0)});n?(b=b||this.nextId(),this.assign(b,"{}"),q(a.properties,function(a){a.computed?(g=k.nextId(),k.recurse(a.key,g)):g=a.key.type===t.Identifier?a.key.name:""+a.key.value;h=k.nextId();k.recurse(a.value, +h);k.assign(k.member(b,g,a.computed),h)})):(q(a.properties,function(b){k.recurse(b.value,a.constant?void 0:k.nextId(),void 0,function(a){l.push(k.escape(b.key.type===t.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case t.ThisExpression:this.assign(b,"s");c("s");break;case t.LocalsExpression:this.assign(b,"l");c("l");break;case t.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)|| +(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body; +c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a), +";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"}, +getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,f,e){var g=this;return function(){g.recurse(a,b,d,c,f,e)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(D(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+ +"'";if(ba(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ea("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Hd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;X(c,d.$filter);var f,e;if(f=Ed(c))e=this.recurse(f);f=Cd(c.body); +var g;f&&(g=[],q(f,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];q(c.body,function(a){h.push(d.recurse(a.expression))});f=0===c.body.length?w:1===c.body.length?h[0]:function(a,b){var c;q(h,function(d){c=d(a,b)});return c};e&&(f.assign=function(a,b,c){return e(a,c,b)});g&&(f.inputs=g);f.literal=Fd(c);f.constant=c.constant;return f},recurse:function(a,b,d){var c,f,e=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case t.Literal:return this.value(a.value, +b);case t.UnaryExpression:return f=this.recurse(a.argument),this["unary"+a.operator](f,b);case t.BinaryExpression:return c=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](c,f,b);case t.LogicalExpression:return c=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](c,f,b);case t.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case t.Identifier:return Ua(a.name,e.expression),e.identifier(a.name, +e.expensiveChecks||Lb(a.name),b,d,e.expression);case t.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Ua(a.property.name,e.expression),f=a.property.name),a.computed&&(f=this.recurse(a.property)),a.computed?this.computedMember(c,f,b,d,e.expression):this.nonComputedMember(c,f,e.expensiveChecks,b,d,e.expression);case t.CallExpression:return g=[],q(a.arguments,function(a){g.push(e.recurse(a))}),a.filter&&(f=this.$filter(a.callee.name)),a.filter||(f=this.recurse(a.callee,!0)),a.filter? +function(a,c,d,e){for(var n=[],r=0;r":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)>b(c,f,e,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)<=b(c,f,e,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)>=b(c,f,e,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,f,e,g){c= +a(c,f,e,g)&&b(c,f,e,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)||b(c,f,e,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(f,e,g,h){f=a(f,e,g,h)?b(f,e,g,h):d(f,e,g,h);return c?{value:f}:f}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a,b,d,c,f){return function(e,g,h,k){e=g&&a in g?g:e;c&&1!==c&&e&&!e[a]&&(e[a]={});g=e?e[a]:void 0;b&&Ea(g,f);return d?{context:e,name:a, +value:g}:g}},computedMember:function(a,b,d,c,f){return function(e,g,h,k){var l=a(e,g,h,k),m,n;null!=l&&(m=b(e,g,h,k),m+="",Ua(m,f),c&&1!==c&&(Jb(l),l&&!l[m]&&(l[m]={})),n=l[m],Ea(n,f));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,f,e){return function(g,h,k,l){g=a(g,h,k,l);f&&1!==f&&(Jb(g),g&&!g[b]&&(g[b]={}));h=null!=g?g[b]:void 0;(d||Lb(b))&&Ea(h,e);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,f,e){return e?e[b]:a(d,c,f)}}};var nc= +function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new t(a,d);this.astCompiler=d.csp?new Hd(this.ast,b):new Gd(this.ast,b)};nc.prototype={constructor:nc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var Fa=G("$sce"),ga={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Hg=G("$compile"),aa=y.document.createElement("a"),Ld=ta(y.location.href);Md.$inject=["$document"];Rc.$inject=["$provide"];var Td=22,Sd=".",pc="0";Nd.$inject=["$locale"]; +Pd.$inject=["$locale"];var Sg={yyyy:U("FullYear",4,0,!1,!0),yy:U("FullYear",2,0,!0,!0),y:U("FullYear",1,0,!1,!0),MMMM:nb("Month"),MMM:nb("Month",!0),MM:U("Month",2,1),M:U("Month",1,1),LLLL:nb("Month",!1,!0),dd:U("Date",2),d:U("Date",1),HH:U("Hours",2),H:U("Hours",1),hh:U("Hours",2,-12),h:U("Hours",1,-12),mm:U("Minutes",2),m:U("Minutes",1),ss:U("Seconds",2),s:U("Seconds",1),sss:U("Milliseconds",3),EEEE:nb("Day"),EEE:nb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a, +b,d){a=-1*d;return a=(0<=a?"+":"")+(Mb(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},Rg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,Qg=/^-?\d+$/;Od.$inject=["$locale"];var Lg=ha(Q),Mg=ha(wb);Qd.$inject=["$parse"];var Ce=ha({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var f= +"[object SVGAnimatedString]"===ma.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(f)||a.preventDefault()})}}}}),xb={};q(Gb,function(a,b){function d(a,d,f){a.$watch(f[c],function(a){f.$set(b,!!a)})}if("multiple"!==a){var c=Da("ng-"+b),f=d;"checked"===a&&(f=function(a,b,f){f.ngModel!==f[c]&&d(a,b,f)});xb[c]=function(){return{restrict:"A",priority:100,link:f}}}});q(gd,function(a,b){xb[b]=function(){return{priority:100,link:function(a,c,f){if("ngPattern"===b&&"/"===f.ngPattern.charAt(0)&& +(c=f.ngPattern.match(Vg))){f.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(f[b],function(a){f.$set(b,a)})}}}});q(["src","srcset","href"],function(a){var b=Da("ng-"+a);xb[b]=function(){return{priority:99,link:function(d,c,f){var e=a,g=a;"href"===a&&"[object SVGAnimatedString]"===ma.call(c.prop("href"))&&(g="xlinkHref",f.$attr[g]="xlink:href",e=null);f.$observe(b,function(b){b?(f.$set(g,b),Ia&&e&&c.prop(e,f[g])):"href"===a&&f.$set(g,null)})}}}});var Nb={$addControl:w,$$renameControl:function(a, +b){a.$name=b},$removeControl:w,$setValidity:w,$setDirty:w,$setPristine:w,$setSubmitted:w};Wd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var ee=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||w}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Wd,compile:function(d,e){d.addClass(Wa).addClass(rb);var g=e.name?"name":a&&e.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in +e)){var r=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",r,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",r,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var s=g?c(n.$name):w;g&&(s(a,n),e.$observe(g,function(b){n.$name!==b&&(s(a,void 0),n.$$parentForm.$$renameControl(n,b),s=c(n.$name),s(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);s(a,void 0);R(n,Nb)})}}}}}]},De= +ee(),Pe=ee(!0),Tg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,ch=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,dh=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Ug=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,fe=/^(\d{4,})-(\d{2})-(\d{2})$/,ge=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/, +wc=/^(\d{4,})-W(\d\d)$/,he=/^(\d{4,})-(\d\d)$/,ie=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Yd=V();q(["date","datetime-local","month","time","week"],function(a){Yd[a]=!0});var je={text:function(a,b,d,c,f,e){Xa(a,b,d,c,f,e);sc(c)},date:ob("date",fe,Pb(fe,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ob("datetimelocal",ge,Pb(ge,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:ob("time",ie,Pb(ie,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ob("week",wc,function(a,b){if(ja(a))return a; +if(D(a)){wc.lastIndex=0;var d=wc.exec(a);if(d){var c=+d[1],f=+d[2],e=d=0,g=0,h=0,k=Ud(c),f=7*(f-1);b&&(d=b.getHours(),e=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+f,d,e,g,h)}}return NaN},"yyyy-Www"),month:ob("month",he,Pb(he,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,f,e){tc(a,b,d,c);Xa(a,b,d,c,f,e);Zd(c);var g,h;if(x(d.min)||d.ngMin)c.$validators.min=function(a){return c.$isEmpty(a)||z(g)||a>=g},d.$observe("min",function(a){g=qb(a);c.$validate()}); +if(x(d.max)||d.ngMax)c.$validators.max=function(a){return c.$isEmpty(a)||z(h)||a<=h},d.$observe("max",function(a){h=qb(a);c.$validate()})},url:function(a,b,d,c,f,e){Xa(a,b,d,c,f,e);sc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||ch.test(d)}},email:function(a,b,d,c,f,e){Xa(a,b,d,c,f,e);sc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||dh.test(d)}},radio:function(a,b,d,c){z(d.name)&&b.attr("name",++sb);b.on("click", +function(a){b[0].checked&&c.$setViewValue(d.value,a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,f,e){function g(a,c){b.attr(a,d[a]);d.$observe(a,c)}function h(a){n=qb(a);ia(c.$modelValue)||(m?(a=b.val(),n>a&&(a=n,b.val(a)),c.$setViewValue(a)):c.$validate())}function k(a){r=qb(a);ia(c.$modelValue)||(m?(a=b.val(),r=n},g("min",h));f&&(c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)|| +z(r)||b<=r},g("max",k));e&&(c.$validators.step=m?function(){return!q.stepMismatch}:function(a,b){var d;if(!(d=c.$isEmpty(b)||z(s))){d=n||0;var e=s,f=Number(b);if((f|0)!==f||(d|0)!==d||(e|0)!==e){var g=Math.max(uc(f),uc(d),uc(e)),g=Math.pow(10,g),f=f*g;d*=g;e*=g}d=0===(f-d)%e}return d},g("step",l))},checkbox:function(a,b,d,c,f,e,g,h){var k=$d(h,a,"ngTrueValue",d.ngTrueValue,!0),l=$d(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked= +c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return na(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:w,button:w,submit:w,reset:w,file:w},Lc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,e,g,h){if(h[0]){var k=Q(g.type);"range"!==k||g.hasOwnProperty("ngInputRange")||(k="text");(je[k]||je.text)(f,e,g,h[0],b,a,d,c)}}}}}],eh=/^(true|false|\d+)$/,gf=function(){return{restrict:"A", +priority:100,compile:function(a,b){return eh.test(b.ngValue)?function(a,b,f){f.$set("value",a.$eval(f.ngValue))}:function(a,b,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},He=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,f){a.$$addBindingInfo(c,f.ngBind);c=c[0];b.$watch(f.ngBind,function(a){c.textContent=z(a)?"":a})}}}}],Je=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c, +d,e){c=a(d.attr(e.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];e.$observe("ngBindTemplate",function(a){d.textContent=z(a)?"":a})}}}}],Ie=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,f){var e=b(f.ngBindHtml),g=b(f.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,f){d.$$addBindingInfo(c,f.ngBindHtml);b.$watch(g,function(){var d=e(b);c.html(a.getTrustedHtml(d)||"")})}}}}],ff=ha({restrict:"A",require:"ngModel", +link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ke=vc("",!0),Me=vc("Odd",0),Le=vc("Even",1),Ne=Va({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Oe=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Qc={},fh={blur:!0,focus:!0};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=Da("ng-"+a); +Qc[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(f,e){var g=d(e[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};fh[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var Re=["$animate","$compile",function(a,b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,f,e,g){var h,k,l;d.$watch(f.ngIf,function(d){d?k||g(function(d,e){k=e;d[d.length++]=b.$$createComment("end ngIf", +f.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=vb(h.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),h=null))})}}}],Se=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:$.noop,compile:function(c,f){var e=f.ngInclude||f.src,g=f.onload||"",h=f.autoscroll;return function(c,f,m,n,r){var q=0,t,u,p,z=function(){u&&(u.remove(),u=null);t&&(t.$destroy(),t=null); +p&&(d.leave(p).done(function(a){!1!==a&&(u=null)}),u=p,p=null)};c.$watch(e,function(e){var m=function(a){!1===a||!x(h)||h&&!c.$eval(h)||b()},u=++q;e?(a(e,!0).then(function(a){if(!c.$$destroyed&&u===q){var b=c.$new();n.template=a;a=r(b,function(a){z();d.enter(a,null,f).done(m)});t=b;p=a;t.$emit("$includeContentLoaded",e);c.$eval(g)}},function(){c.$$destroyed||u!==q||(z(),c.$emit("$includeContentError",e))}),c.$emit("$includeContentRequested",e)):(z(),n.template=null)})}}}}],jf=["$compile",function(a){return{restrict:"ECA", +priority:-400,require:"ngInclude",link:function(b,d,c,f){ma.call(d[0]).match(/SVG/)?(d.empty(),a(Tc(f.template,y.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(b))}}}],Te=Va({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),ef=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var f=b.attr(d.$attr.ngList)||", ",e="false"!==d.ngTrim,g=e?Y(f):f;c.$parsers.push(function(a){if(!z(a)){var b= +[];a&&q(a.split(g),function(a){a&&b.push(e?Y(a):a)});return b}});c.$formatters.push(function(a){if(I(a))return a.join(f)});c.$isEmpty=function(a){return!a||!a.length}}}},rb="ng-valid",ae="ng-invalid",Wa="ng-pristine",Ob="ng-dirty",ce="ng-pending",pb=G("ngModel"),gh=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,f,e,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={}; +this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=l(d.name||"",!1)(a);this.$$parentForm=Nb;var m=f(d.ngModel),n=m.assign,r=m,s=n,t=null,u,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=f(d.ngModel+"()"),e=f(d.ngModel+"($$$p)");r=function(a){var c=m(a);C(c)&&(c=b(a)); +return c};s=function(a,b){C(m(a))?e(a,{$$$p:b}):n(a,b)}}else if(!m.assign)throw pb("nonassign",d.ngModel,ya(c));};this.$render=w;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){p.$isEmpty(a)?(e.removeClass(c,"ng-not-empty"),e.addClass(c,"ng-empty")):(e.removeClass(c,"ng-empty"),e.addClass(c,"ng-not-empty"))};var y=0;Xd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:e});this.$setPristine=function(){p.$dirty= +!1;p.$pristine=!0;e.removeClass(c,Ob);e.addClass(c,Wa)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;e.removeClass(c,Wa);e.addClass(c,Ob);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;e.setClass(c,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;e.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(t);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!ia(p.$modelValue)){var a= +p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:void 0,p.$modelValue!==c&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c=!0;q(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(q(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;q(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!C(h.then))throw pb("nopromise", +h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},w):g(!0)}function f(a,b){h===y&&p.$setValidity(a,b)}function g(a){h===y&&c(a)}y++;var h=y;(function(){var a=p.$$parserName||"parse";if(z(u))f(a,null);else return u||(q(p.$validators,function(a,b){f(b,null)}),q(p.$asyncValidators,function(a,b){f(b,null)})),f(a,u),u;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(t);if(p.$$lastCommittedViewValue!== +a||""===a&&p.$$hasNativeValidators)p.$$updateEmptyClasses(a),p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;if(u=z(b)?void 0:!0)for(var c=0;cf||c.$isEmpty(b)||b.length<=f}}}}},Oc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b, +d,c){if(c){var f=0;d.$observe("minlength",function(a){f=Z(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=f}}}}};y.angular.bootstrap?y.console&&console.log("WARNING: Tried to load angular more than once."):(xe(),ze($),$.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), +ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a", +mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,c){var f=a|0,e=c;void 0===e&&(e=Math.min(b(a),3));Math.pow(10,e);return 1==f&&0== +e?"one":"other"}})}]),F(y.document).ready(function(){se(y.document,Gc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(''); //# sourceMappingURL=angular.min.js.map diff --git a/js/vendor/angular/angular.min.js.gzip b/js/vendor/angular/angular.min.js.gzip index ede8ca32658dde9a1f3b56bf8944e090bfb929bc..362cc06cad92dce54faa468c5caf5c1e7881c200 100644 GIT binary patch literal 58216 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
!S+osP8b7DJ7~ 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

s<10;45 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

Plb zOJZuh)ItL_SK?Db_%?p7Wo|ARTocVfp1_#`UkDoP$QV823{GgrG?9Pw!XFCrO$&b{ z)Oh*50-=3t2(1R2T+ZIG@mi%LPi1%%J(;WQ-j?ZjHsYW~BvR;T&IYl+7yw0~^cP%K zGZOQM-d#o;)G{2sEe2Jq*A?gT~Z3&A)=WJ^Fj4XMxe!_|$;wG^2> z-+sD3qJ!nHrZLgVfgE(F-%&p$+KA3C=LzK*r&>je?{A-u!o>oC99?IU9YyjzM>F6O z-D3;?F%D`68jA#CI=YY;`26j-6nhtzbL~P{ME8&N<>kV2>gSM1>yArzl(JqQcqUFF zJRCBu$@f|5Ypa2+hZ{?*&S)?x6Ods?+Z~YW@H+Tlgao92_RU7_S#O(09d&TDxbaTER!|ak9K83JIdRGXVG~7z&^wq_9E5K#YU!;38ka zAVfOd?~h0ja3{r(A;4AD5pAzp2s*NLEX8g-Cf-LO;>p-}*}w@akKrzQ_7RYYk1;2P zURma!C*93tD;7v0LvYo~;KDo8b9nxj!hx7_3eiCF>URYLv2s+z0x87$$g_&5XfslH z>Un-`R~QhEa&gB7*>MQ8k0(nKt)kU3Re-BRnaS`PbnmO|LdWbtf{9UQ zUFQlzU-@=AMAoN^C6_?ILV|z$TrIBJ<|=>pkIQ!ca=75!j1jJWt(^ZT)WWA1swP|u zxFK*`=~w759li?k5mrX|$WxK8Zr$6ycS^4o1{{c$JKYak5#2_78+m?|Z+<3L3cM-x z4YRihmV!iFe~d1nJ4mrGev&4BFxUxtIxbCXkKG@bpT-7YbPza^$*4K~ zu7Js-(O?sS7bmAf=4&E1Df%IsussK!yHf14OH@*@@}zfwpArE=%Qmz$7@3WpjOOYlb?3Q4(uuu|(hp}iJemj5 zXH~ov5cPJ@7qEMgsQ{pqt%#@&9~H&7j;OsPp_@_?RzSRxHyYUINyfJvC{cVbZ$^VL z$u3hzJXQD8n{*BU1V=oRDU%ftuN?7O7B-zH>HK@D>W#c#&1U+Av&@>yPqK=`6BFMS z{Pif*=Nbx5C_nU&`jJSY2ze?U*t!@^Gr(>8ojZE3K8mg!N!l4-dKK++Ix%M|If3$ zf8;!TE@5G?ErqT96Aru+1+&msX63e`ob5-HCuTtqR7y+()|4ww8F;B>e4k})`@ckm z62joE>o7ceB(IDXj2X(%Vkj%@k8_t=;G4rVwEaT}`^^q^Li*PIrsvBP_32iJ{1E2c zjW+Gif@=no>IXd7w(2)vt6XQlgh--4MV3~G@T7;33VCWBXyF8FoK^{Bc8l=2YTjjf z&gmJ#%r5&MNRD~PLkLwW%~=R_Hed=0?F_rB-2J@8M$}0GlV#NnOd^z(18UX!Rz(pi zN`nZ6?tkJyGy5vuOcua+l1iY`GC;>7Ps)X6(C_BsuG?TV0um*$8XJZ3mli-$p550r znwp-IZM6V39+;)6wGIZu#_JESzCU~S=kqu3UOjn#u{Fz-75+!*(;d_3KmG9T-P!A> zzx{df+bgf7V)DSR|Lv3a@6X=7zUVZ&jdA$#`8>>lkQ5oBZh6biw=>h-5AWW5c>CwY z*;~4PcJ}oA)svTe*RxMkS0^V=zCO;16Z!RD{FpM%T1AUaiY=-Yn^aszSzh~zFfl7y zN6k|=wifVDtfX`8fZ;zSGMdoIDfW8B&bi0w@c?n1P9DoZ$2jY&2X!5itXGF~Ne~vc z^B%FbI)7NOCGEjpS+9p4AjfZFMhf8dL$_|0zu_eTK0OYa%DA5j$c~Qk0y0&Aht&8e z=(Q3^;mDWbaO5;#7y^+}1?ve ziy?pOhM9LLlc>?qS>`oKD?2qV9~nm-&AP!!Zd9KJ=JgX)No54h-1)*hYzj1kJ|7{7 z7|)?eMJHC7XxKNWK@5^}@)%vkV-nMo_;ErbaOCxj6VnOTRIj)4q$WH=DM_`hLnXk- zjSXhfQ>&E-Q-oTj%0h;Pru~nmYO;#ccR<1{L`9IG3sIeYXu!GsvuWrl7uy?6;fZnF zJRymah;H7dNHx<^XC}6sEtP}3S^mZ_af8L{@O8d{IF7Q&+aD~R4<>^pgXSxHIj%d5 zpc$x>a5Dr~4sz|$)#d8Zqh{*JshtJ1aA}RujLK-mMwlreSGdxIs|I#DX+eEGXaOD& z#wcpK6RB67Q;HUm3%~o(hNDcJJnpx=p*>8*vD2dOw^J&_*hLxT3j&!zqrmY*`np2> z_%Y59vx~u}6o%EhP*cv4ewvqOV(h}nO%)O~I8)23F5>eg6f3u$2Yq=5+`asOZ&(lF zdTQnC$wViuJN2GH137t&e#_cXW0GcX=V^Ud=gW&#&nF3Ry3lEKNom%G7L^Hu9C#{l zy(YSN@|YOlxE%&ZVZG_Q_=U)Jq+)$S_^O93O$bkGQOgU7&{0~Vh;}Kcym|Lt-de~9 zM45=RTeV(T8!)R;pTXlZ6eogYNC;KW!dtgs9AGlIU(vR}-q} z_}i1O|9$q2-SrH@k+=3^F?uK_Td@H&q0inu0bk*(tEQ!UdR3vA;NFx}I8;_{kf6iB zeB+6>Ovc7>LbNaH{JYy`wbY0APj%fsC+Itv^xC;zOjq-T%)*zgsPkQyr`qo>F6&XJ zNmPg`$nTq7k8NkAjD>WZ4dVAv*P~q=S6?BIEadAhEdcK*ZOJmek+&HUHr#&8x76iU zhd0l@ddMfp&qvd6={hG3hh}5vU!0XmkgA(87{CV`u~5#A<3HTXPKBqKGxar=-}8`7+Gs9$ptB>*4X`6j8v%AaheQP zV~m~C0`kJMC-2YRpT9cOyecsw>vht4ruppiOdm9~e|Hr$o7ehHKQTK#&BiEb2}PkQM4TWYUiMP9S!1G?Gq|70f;@ZiEWFq)B9B&s9*ZCPEM&eZ$Y#Yk<_U**lQA*5}8*#pA)RY zkQb0dmT_%d+HhE}t7R2D@Xc8W=gVJxQ>J>>fi=}PbIW9(!~>dwzq8RUBgql>YFpJ%0D7wQpZRJsnozBGEvrJG$|F8v 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 BuN(jX literal 46451 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","binary<=","binary>=","binary&&","binary||","ternary?:","astCompiler","yy","y","MMMM","MMM","M","H","hh","EEEE","EEE","ampmGetter","AMPMS","Z","timeZoneGetter","zone","paddedZone","ww","w","G","GG","GGG","GGGG","longEraGetter","ERANAMES","xlinkHref","propName","defaultLinkFn","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","getSetter","ngFormCompile","formElement","nameAttr","ngFormPreLink","ctrls","handleFormSubmission","setter","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","tElement","ngBindHtmlGetter","ngBindHtmlWatch","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","$viewChangeListeners","forceAsyncEvents","ngEventHandler","previousElements","ngIfWatchAction","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","trimValues","NgModelController","$modelValue","$$rawModelValue","$asyncValidators","$untouched","$touched","parsedNgModel","parsedNgModelAssign","ngModelGet","ngModelSet","pendingDebounce","parserValid","$$setOptions","this.$$setOptions","getterSetter","invokeModelGetter","invokeModelSetter","$$$p","this.$isEmpty","currentValidationRunId","this.$setPristine","this.$setDirty","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","prevValid","prevModelValue","allowInvalid","$$runValidators","allValid","$$writeModelToScope","this.$$runValidators","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","$$parseAndValidate","this.$$parseAndValidate","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","DEFAULT_REGEXP","that","ngOptionsMinErr","NG_OPTIONS_REGEXP","parseOptionsExpression","optionsExp","selectElement","Option","selectValue","label","disabled","getOptionValuesKeys","optionValues","optionValuesKeys","keyName","itemKey","valueName","selectAs","trackBy","viewValueFn","trackByFn","getTrackByValueFn","getHashOfValue","getTrackByValue","getLocals","displayFn","groupByFn","disableWhenFn","valuesFn","getWatchables","watchedArray","optionValuesLength","disableWhen","getOptions","optionItems","selectValueMap","optionItem","getOptionFromViewValue","getViewValueFromOption","optionTemplate","optGroupTemplate","updateOptionElement","addOrReuseElement","removeExcessElements","skipEmptyAndUnknownOptions","emptyOption_","emptyOption","unknownOption_","unknownOption","updateOptions","previousValue","selectCtrl","readValue","groupMap","providedEmptyOption","updateOption","optionElement","groupElement","currentOptionElement","ngModelCtrl","nextValue","ngModelCtrl.$isEmpty","writeValue","selectCtrl.writeValue","selectCtrl.readValue","selectedValues","selections","selectedOption","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","pluralCat","whenExpFn","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","noopNgModelController","SelectController","optionsMap","renderUnknownOption","self.renderUnknownOption","unknownVal","removeUnknownOption","self.removeUnknownOption","self.readValue","self.writeValue","hasOption","addOption","self.addOption","removeOption","self.removeOption","self.hasOption","ngModelCtrl.$render","lastView","lastViewRef","selectMultipleWatch","valueInterpolated","optionValue","selectCtrlName","valueAttributeObserveAction","interpolateWatchAction","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","intVal","ctrl.$validators.maxlength","ctrl.$validators.minlength","getDecimals","opt_precision","pow","ONE","OTHER","$$csp","head"] +"names":["window","minErr","isArrayLike","obj","isWindow","isArray","isString","jqLite","length","Object","isNumber","Array","item","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","isBlankObject","forEachSorted","keys","sort","i","reverseParams","iteratorFn","value","nextUid","uid","baseExtend","dst","objs","deep","h","$$hashKey","ii","isObject","j","jj","src","isDate","Date","valueOf","isRegExp","RegExp","nodeName","cloneNode","isElement","clone","extend","slice","arguments","merge","toInt","str","parseInt","inherit","parent","extra","create","noop","identity","$","valueFn","valueRef","hasCustomToString","toString","isUndefined","isDefined","getPrototypeOf","isScope","$evalAsync","$watch","isBoolean","isTypedArray","TYPED_ARRAY_REGEXP","test","node","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","copyRecurse","push","copyElement","stackSource","stackDest","ngMinErr","needsRecurse","copyType","undefined","constructor","buffer","byteOffset","copied","ArrayBuffer","byteLength","set","Uint8Array","re","match","lastIndex","type","equals","o1","o2","t1","t2","getTime","keySet","createMap","charAt","concat","array1","array2","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","document","toJson","pretty","JSON","stringify","fromJson","json","parse","timezoneToOffset","timezone","fallback","replace","ALL_COLONS","requestedTimezoneOffset","isNumberNaN","convertTimezoneToLocal","date","reverse","dateTimezoneOffset","getTimezoneOffset","timezoneOffset","setMinutes","getMinutes","minutes","startingTag","empty","e","elemHtml","append","html","nodeType","NODE_TYPE_TEXT","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","splitPoint","substring","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","getAttribute","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","candidate","querySelector","isAutoBootstrapAllowed","strictDi","console","error","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","resumeDeferredBootstrap","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jqName","jq","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","invokeLaterAndSetModuleName","recipeName","factoryFunction","$$moduleName","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","decorator","animation","filter","directive","component","run","block","shallowCopy","publishExternalAPI","version","uppercase","$$counter","csp","angularModule","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$animateCss","$CoreAnimateCssProvider","$$animateJs","$$CoreAnimateJsProvider","$$animateQueue","$$CoreAnimateQueueProvider","$$AnimateRunner","$$AnimateRunnerFactoryProvider","$$animateAsyncRun","$$AnimateAsyncRunFactoryProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$$forceReflow","$$ForceReflowProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpParamSerializer","$HttpParamSerializerProvider","$httpParamSerializerJQLike","$HttpParamSerializerJQLikeProvider","$httpBackend","$HttpBackendProvider","$xhrFactory","$xhrFactoryProvider","$jsonpCallbacks","$jsonpCallbacksProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$jqLite","$$jqLiteProvider","$$HashMap","$$HashMapProvider","$$cookieReader","$$CookieReaderProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_ELEMENT","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","jqLiteWrapNode","wrapper","parentNode","replaceChild","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","unsupported","expandoStore","jqLiteExpandoStore","handle","removeHandler","listenerFns","removeEventListener","MOUSE_EVENT_MAP","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","handlerWrapper","specialHandlerWrapper","defaultHandlerWrapper","handler","specialMouseHandlerWrapper","target","related","relatedTarget","jqLiteContains","$get","this.$get","hasClass","classes","addClass","removeClass","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","extractArgs","fnText","Function","prototype","STRIP_COMMENTS","ARROW_ARG","FN_ARGS","anonFn","args","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","result","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","caller","INSTANTIATING","err","shift","injectionArgs","locals","$inject","$$annotate","msie","Type","ctor","annotate","has","$injector","instanceCache","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","protoInstanceInjector","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","style","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","mergeClasses","b","splitClasses","klass","prepareAnimateOptions","options","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","cacheStateAndFireUrlChange","pendingLocation","cacheState","fireUrlChange","cachedState","getCurrentState","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","history","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","href","baseElement","state","self.url","sameState","sameBase","stripHash","substr","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$applicationDestroyed","self.$$applicationDestroyed","off","$$checkUrlChange","baseHref","self.baseHref","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","cacheFactory","cacheId","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","isController","LOCAL_REGEXP","bindings","definition","scopeName","bindingCache","$compileMinErr","mode","collection","optional","attrName","assertValidDirectiveName","getDirectiveRequire","require","REQUIRE_PREFIX_REGEXP","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","restrict","this.component","makeInjectable","tElement","tAttrs","$element","$attrs","template","templateUrl","ddo","controllerAs","identifierForController","transclude","bindToController","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","preAssignBindingsEnabled","this.preAssignBindingsEnabled","TTL","onChangesTtl","this.onChangesTtl","commentDirectivesEnabledConfig","commentDirectivesEnabled","this.commentDirectivesEnabled","cssClassDirectivesEnabledConfig","cssClassDirectivesEnabled","this.cssClassDirectivesEnabled","flushOnChangesQueue","onChangesQueue","errors","Attributes","attributesToCopy","$attr","$$element","setSpecialAttr","specialAttrHolder","attributes","attribute","removeNamedItem","setNamedItem","safeAddClass","className","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","NOT_EMPTY","domNode","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","needsNewScope","$parent","$new","parentBoundTranscludeFn","transcludeControllers","futureParentElement","$$boundTransclude","$linkNode","wrapTemplate","controllerName","instance","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","transcludeOnThisElement","createBoundTranscludeFn","templateOnThisElement","attrs","linkFnFound","collectDirectives","applyDirectivesToNode","terminal","previousBoundTranscludeFn","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","boundSlots","$$slots","slotName","attrsMap","addDirective","directiveNormalize","isNgAttr","nAttrs","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","PREFIX_REGEXP","multiElementMatch","MULTI_ELEMENT_DIR_RE","directiveIsMultiElement","nName","addAttrInterpolateDirective","animVal","addTextInterpolateDirective","NODE_TYPE_COMMENT","collectCommentDirectives","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","groupedElementsLink","compilationGenerator","eager","compiled","lazyCompilation","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","elementControllers","slotTranscludeFn","scopeToChild","controllerScope","newScopeDirective","isSlotFilled","transcludeFn.isSlotFilled","controllerDirectives","setupControllers","templateDirective","$$originalDirective","$$isolateBindings","scopeBindingInfo","initializeDirectiveBindings","removeWatches","$on","controllerDirective","$$bindings","bindingInfo","controllerResult","getControllers","controllerInstance","$onChanges","initialChanges","$onInit","$doCheck","$onDestroy","callOnDestroyHook","invokeLinkFn","$postLink","terminalPriority","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","didScanForMultipleTransclusion","mightHaveMultipleTransclusionError","directiveValue","$$start","$$end","assertNoDuplicate","$$tlb","scanningIndex","candidateDirective","$$createComment","replaceWith","$$parentNode","replaceDirective","slots","contents","slotMap","filledSlots","elementSelector","filled","$$newScope","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectiveScope","mergeTemplateAttributes","compileTemplateUrl","Math","max","inheritType","dataName","property","controllerKey","$scope","$transclude","newScope","tDirectives","startAttrName","endAttrName","multiElement","srcAttr","dstAttr","$set","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","wrapModuleNameIfDefined","moduleName","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","trustedContext","allOrNothing","mustHaveExpression","attrInterpolatePreLinkFn","$$observers","newValue","$$inter","$$scope","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","hasData","annotation","recordChanges","currentValue","previousValue","$$postDigest","changes","triggerOnChangesHook","SimpleChange","removeWatchCollection","initializeBinding","lastValue","parentGet","parentSet","compare","removeWatch","$observe","_UNINITIALIZED_VALUE","literal","assign","parentValueWatch","parentValue","$stateful","$watchCollection","deepWatch","initialValue","parentValueWatchAction","SIMPLE_ATTR_NAME","$normalize","$addClass","classVal","$removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","ALIASED_ATTR","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","compile.$$createComment","comment","createComment","previous","current","str1","str2","values","tokens1","tokens2","token","jqNodes","ident","CNTRL_REG","globals","this.has","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","identifier","expression","later","$controllerMinErr","controllerPrototype","$controllerInit","exception","cause","serializeValue","v","toISOString","ngParamSerializer","params","jQueryLikeParamSerializer","serialize","toSerialize","topLevel","defaultHttpResponseTransform","headers","tempData","JSON_PROTECTION_PREFIX","contentType","jsonStart","JSON_START","JSON_ENDS","parseHeaders","line","headerVal","headerKey","headersGetter","headersObj","transformData","status","fns","defaults","transformResponse","transformRequest","d","common","CONTENT_TYPE_APPLICATION_JSON","patch","xsrfCookieName","xsrfHeaderName","paramSerializer","useApplyAsync","this.useApplyAsync","useLegacyPromise","useLegacyPromiseExtensions","this.useLegacyPromiseExtensions","interceptorFactories","interceptors","requestConfig","chainInterceptors","promise","thenFn","rejectFn","executeHeaderFns","headerContent","processedHeaders","headerFn","header","response","resp","reject","mergeHeaders","defHeaders","reqHeaders","defHeaderName","lowercaseDefHeaderName","reqHeaderName","requestInterceptors","responseInterceptors","when","reversedInterceptors","interceptor","request","requestError","responseError","serverRequest","reqData","withCredentials","sendReq","success","promise.success","promise.error","$httpMinErrLegacyFn","createApplyHandlers","eventHandlers","applyHandlers","callEventHandler","$applyAsync","$$phase","done","headersString","statusText","resolveHttpPromise","resolvePromise","deferred","resolve","resolvePromiseWithResult","removePendingReq","pendingRequests","cachedResp","buildUrl","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","uploadEventHandlers","serializedParams","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","$browserDefer","callbacks","rawDocument","jsonpReq","callbackPath","async","body","wasCalled","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","createCallback","getResponse","removeCallback","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","ontimeout","upload","send","this.startSymbol","this.endSymbol","escape","ch","unescapeText","escapedStartRegexp","escapedEndRegexp","constantWatchDelegate","objectEquality","constantInterp","unwatch","constantInterpolateWatch","parseStringifyInterceptor","getTrusted","$interpolateMinErr","interr","unescapedText","exp","$$watchDelegate","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","endSymbolLength","throwNoconcat","compute","interpolationFn","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","interval","count","invokeApply","hasParams","iteration","setInterval","clearInterval","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","DOUBLE_SLASH_REGEX","$locationMinErr","prefixed","$$path","pathname","$$search","search","$$hash","stripBaseUrl","base","trimEmptyHash","LocationHtml5Url","appBase","appBaseNoFile","basePrefix","$$html5","$$parse","this.$$parse","pathUrl","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","lastIndexOf","IGNORE_URI_REGEXP","ctrlKey","metaKey","shiftKey","which","button","absHref","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","logFn","log","hasApply","arg1","arg2","warn","ensureSafeMemberName","fullExpression","$parseMinErr","getStringValue","ensureSafeObject","children","ensureSafeFunction","CALL","APPLY","BIND","ensureSafeAssignContext","ARRAY_CTOR","BOOLEAN_CTOR","FUNCTION_CTOR","NUMBER_CTOR","OBJECT_CTOR","STRING_CTOR","ARRAY_CTOR_PROTO","BOOLEAN_CTOR_PROTO","FUNCTION_CTOR_PROTO","NUMBER_CTOR_PROTO","OBJECT_CTOR_PROTO","STRING_CTOR_PROTO","ifDefined","plusFn","r","findConstantAndWatchExpressions","ast","allConstants","argsToWatch","isStatelessFilter","AST","Program","expr","Literal","toWatch","UnaryExpression","argument","BinaryExpression","left","right","LogicalExpression","ConditionalExpression","alternate","consequent","Identifier","MemberExpression","object","computed","CallExpression","callee","AssignmentExpression","ArrayExpression","ObjectExpression","properties","ThisExpression","LocalsExpression","getInputs","lastExpression","isAssignable","assignableAST","NGValueParameter","operator","isLiteral","ASTCompiler","astBuilder","ASTInterpreter","isPossiblyDangerousMemberName","getValueOf","objectValueOf","cacheDefault","cacheExpensive","literals","identStart","identContinue","addLiteral","this.addLiteral","literalName","literalValue","setIdentifierFns","this.setIdentifierFns","identifierStart","identifierContinue","interceptorFn","expensiveChecks","parsedExpression","oneTime","cacheKey","runningChecksEnabled","parseOptions","$parseOptionsExpensive","$parseOptions","lexer","Lexer","parser","Parser","oneTimeLiteralWatchDelegate","oneTimeWatchDelegate","inputs","inputsWatchDelegate","expensiveChecksInterceptor","addInterceptor","expensiveCheckFn","expensiveCheckOldValue","expressionInputDirtyCheck","oldValueOfValue","prettyPrintExpression","inputExpressions","lastResult","oldInputValueOf","expressionInputWatch","newInputValue","oldInputValueOfValues","oldInputValues","expressionInputsWatch","changed","oneTimeWatch","oneTimeListener","old","isAllDefined","allDefined","constantWatch","watchDelegate","useInputs","regularInterceptedExpression","oneTimeInterceptedExpression","noUnsafeEval","isIdentifierStart","isIdentifierContinue","$$runningExpensiveChecks","$parse.$$runningExpensiveChecks","qFactory","nextTick","exceptionHandler","Deferred","simpleBind","Promise","scheduleProcessQueue","processScheduled","pending","handleCallback","resolver","callbackOutput","errback","progressBack","$Q","$qMinErr","resolveFn","TypeError","onFulfilled","onRejected","catch","finally","$$reject","$$resolve","that","rejectPromise","progress","all","promises","counter","results","race","requestAnimationFrame","webkitRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","supported","createChildScopeClass","ChildScope","$$watchers","$$nextSibling","$$childHead","$$childTail","$$listeners","$$listenerCount","$$watchersCount","$id","$$ChildScope","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","destroyChildScope","$event","currentScope","cleanUpScope","$$prevSibling","$root","Scope","beginPhase","phase","incrementWatchersCount","decrementListenerCount","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","child","watchExp","watcher","last","eq","$$digestWatchIndex","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","unwatchFn","watchGroupSubAction","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","asyncTask","asyncQueuePosition","asyncQueue","$eval","msg","next","postDigestQueuePosition","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","indexOfListener","$emit","targetScope","listenerArgs","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","escapeForRegexp","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","Constructor","maybeTrusted","allowed","this.enabled","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","hasHistoryPushState","chrome","app","runtime","pushState","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","hasEvent","divElm","httpOptions","this.httpOptions","handleRequestFn","tpl","ignoreRequestError","totalPendingRequests","getTrustedResourceUrl","transformer","handleError","$templateRequestMinErr","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","urlParsingNode","requestUrl","originUrl","$$CookieReader","safeDecodeURIComponent","lastCookies","lastCookieString","cookieArray","cookie","currentCookieString","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","anyPropertyKey","matchAgainstAnyProp","getTypeForFilter","expressionType","predicateFn","createPredicateFn","shouldMatchPrimitives","actual","expected","deepCompare","dontMatchWholeObject","actualType","expectedType","expectedVal","matchAnyProperty","actualVal","$locale","formats","NUMBER_FORMATS","amount","currencySymbol","fractionSize","CURRENCY_SYM","PATTERNS","maxFrac","formatNumber","GROUP_SEP","DECIMAL_SEP","number","numStr","exponent","digits","numberOfIntegerDigits","zeros","ZERO_CHAR","MAX_DIGITS","roundNumber","parsedNumber","minFrac","fractionLen","min","roundAt","digit","k","carry","reduceRight","groupSep","decimalSep","isNaN","isInfinity","isFinite","isZero","abs","formattedText","integerLen","decimals","reduce","groups","lgSize","gSize","negPre","negSuf","posPre","posSuf","padNumber","num","negWrap","neg","dateGetter","dateStrGetter","shortForm","standAlone","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","round","eraGetter","ERAS","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","DATETIME_FORMATS","NUMBER_STRING","DATE_FORMATS_SPLIT","DATE_FORMATS","spacing","limit","begin","Infinity","sliceFn","end","processPredicates","sortPredicates","map","predicate","descending","defaultCompare","v1","v2","type1","type2","value1","value2","sortPredicate","reverseOrder","compareFn","predicates","compareValues","getComparisonObject","tieBreaker","predicateValues","doComparison","ngDirective","FormController","controls","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$$parentForm","nullFormCtrl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","$addControl","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","origValue","keyCode","PARTIAL_VALIDATION_TYPES","PARTIAL_VALIDATION_EVENTS","validity","origBadInput","badInput","origTypeMismatch","typeMismatch","$render","ctrl.$render","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","isValidDate","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","ngModelMinErr","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","VALIDITY_STATE_PROPERTY","numberFormatterParser","NUMBER_REGEXP","parseNumberAttrVal","countDecimals","numString","decimalSymbolIndex","parseConstantExpr","parseFn","classDirective","arrayDifference","arrayClasses","addClasses","digestClassCounts","classCounts","classesToUpdate","updateClasses","ngClassWatchAction","$index","old$index","mod","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","REGEX_STRING_REGEXP","documentMode","rules","ngCspElement","ngCspAttribute","noInlineStyle","name_","el","allowAutoBootstrap","currentScript","origin","full","major","minor","dot","codeName","expando","JQLite._data","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","Node","contains","compareDocumentPosition","ready","trigger","fired","removeData","jqLiteHasData","jqLiteCleanData","removeAttribute","css","NODE_TYPE_ATTRIBUTE","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","addHandler","noEventListener","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","FN_ARG_SPLIT","FN_ARG","argDecl","underscore","$animateMinErr","postDigestElements","updateData","handleCSSClassChanges","existing","pin","domOperation","from","to","classesAdded","add","classesRemoved","runner","complete","$$registeredAnimations","classNameFilter","this.classNameFilter","$$classNameFilter","reservedRegex","NG_ANIMATE_CLASSNAME","domInsert","parentElement","afterElement","afterNode","ELEMENT_NODE","previousElementSibling","enter","move","leave","addclass","animate","tempClasses","waitForTick","waitQueue","passed","AnimateRunner","setHost","rafTick","_doneCallbacks","_tick","this._tick","doc","hidden","_state","chain","AnimateRunner.chain","AnimateRunner.all","runners","onProgress","DONE_COMPLETE_STATE","getPromise","resolveHandler","rejectHandler","pause","resume","_resolve","INITIAL_STATE","DONE_PENDING_STATE","initialOptions","closed","$$prepared","cleanupStyles","start","UNINITIALIZED_VALUE","isFirstChange","SimpleChange.prototype.isFirstChange","offsetWidth","APPLICATION_JSON","$httpMinErr","$interpolateMinErr.throwNoconcat","$interpolateMinErr.interr","callbackId","called","callbackMap","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","OPERATORS","ESCAPE","lex","tokens","readString","peek","readNumber","peekMultichar","readIdent","is","isWhitespace","ch2","ch3","op2","op3","op1","throwError","chars","codePointAt","isValidIdentifierStart","isValidIdentifierContinue","cp","charCodeAt","cp1","cp2","isExpOperator","colStr","peekCh","quote","rawString","hex","String","fromCharCode","rep","ExpressionStatement","Property","program","expressionStatement","expect","filterChain","assignment","ternary","logicalOR","consume","logicalAND","equality","relational","additive","multiplicative","unary","primary","arrayDeclaration","selfReferential","parseArguments","baseExpression","peekToken","kind","e1","e2","e3","e4","peekAhead","t","nextId","vars","own","assignable","stage","computing","recurse","return_","generateFunction","fnKey","intoId","watchId","fnString","USE","STRICT","filterPrefix","watchFns","varsPrefix","section","nameId","recursionFn","skipWatchIdCheck","if_","lazyAssign","computedMember","lazyRecurse","plus","not","getHasOwnProperty","nonComputedMember","addEnsureSafeObject","notNull","addEnsureSafeAssignContext","addEnsureSafeMemberName","addEnsureSafeFunction","member","filterName","defaultValue","UNSAFE_CHARACTERS","SAFE_IDENTIFIER","stringEscapeFn","stringEscapeRegex","c","skip","init","fn.assign","rhs","lhs","unary+","unary-","unary!","binary+","binary-","binary*","binary/","binary%","binary===","binary!==","binary==","binary!=","binary<","binary>","binary<=","binary>=","binary&&","binary||","ternary?:","astCompiler","yy","y","MMMM","MMM","M","LLLL","H","hh","EEEE","EEE","ampmGetter","AMPMS","Z","timeZoneGetter","zone","paddedZone","ww","w","G","GG","GGG","GGGG","longEraGetter","ERANAMES","xlinkHref","propName","defaultLinkFn","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","getSetter","ngFormCompile","formElement","nameAttr","ngFormPreLink","ctrls","handleFormSubmission","setter","URL_REGEXP","EMAIL_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","rangeInputType","setInitialValueAndObserver","htmlAttrName","changeFn","minChange","$modelValue","supportsRange","elVal","maxChange","stepChange","stepVal","hasMinAttr","hasMaxAttr","hasStepAttr","step","originalRender","rangeUnderflow","rangeOverflow","rangeRender","noopMinValidator","minValidator","noopMaxValidator","maxValidator","nativeStepValidator","stepMismatch","stepValidator","stepBase","decimalCount","multiplier","pow","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","ngBindHtmlGetter","ngBindHtmlWatch","sceValueOf","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","$viewChangeListeners","forceAsyncEvents","ngEventHandler","previousElements","ngIfWatchAction","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","trimValues","NgModelController","$$rawModelValue","$asyncValidators","$untouched","$touched","parsedNgModel","parsedNgModelAssign","ngModelGet","ngModelSet","pendingDebounce","parserValid","$$setOptions","this.$$setOptions","getterSetter","invokeModelGetter","invokeModelSetter","$$$p","this.$isEmpty","$$updateEmptyClasses","this.$$updateEmptyClasses","NOT_EMPTY_CLASS","EMPTY_CLASS","currentValidationRunId","this.$setPristine","this.$setDirty","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","prevValid","prevModelValue","allowInvalid","$$runValidators","allValid","$$writeModelToScope","this.$$runValidators","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","$$parseAndValidate","this.$$parseAndValidate","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","DEFAULT_REGEXP","NgModelOptionsController","ngOptionsMinErr","NG_OPTIONS_REGEXP","parseOptionsExpression","optionsExp","selectElement","Option","selectValue","label","group","disabled","getOptionValuesKeys","optionValues","optionValuesKeys","keyName","itemKey","valueName","selectAs","trackBy","viewValueFn","trackByFn","getTrackByValueFn","getHashOfValue","getTrackByValue","getLocals","displayFn","groupByFn","disableWhenFn","valuesFn","getWatchables","watchedArray","optionValuesLength","disableWhen","getOptions","optionItems","selectValueMap","optionItem","getOptionFromViewValue","getViewValueFromOption","optionTemplate","optGroupTemplate","ngOptionsPreLink","registerOption","ngOptionsPostLink","updateOptionElement","updateOptions","selectCtrl","readValue","groupElementMap","providedEmptyOption","emptyOption","addOption","groupElement","listFragment","optionElement","ngModelCtrl","nextValue","emptyOptionRendered","unknownOption","removeEmptyOption","ngModelCtrl.$isEmpty","writeValue","selectCtrl.writeValue","selectCtrl.readValue","selectedValues","selections","selectedOption","selectCtrl.registerOption","optionScope","optionEl","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","pluralCat","whenExpFn","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","NgSwitchController","cases","ngSwitchController","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngSwitchWhenSeparator","whenCase","ngTranscludeMinErr","ngTranscludeCompile","fallbackLinkFn","ngTranscludePostLink","useFallbackContent","ngTranscludeSlot","ngTranscludeCloneAttachFn","noopNgModelController","SelectController","optionsMap","renderUnknownOption","self.renderUnknownOption","unknownVal","removeUnknownOption","self.removeUnknownOption","self.readValue","self.writeValue","hasOption","self.addOption","removeOption","self.removeOption","self.hasOption","self.registerOption","optionAttrs","hasDynamicValueAttr","interpolateTextFn","valueAttributeObserveAction","interpolateWatchAction","selectPreLink","lastView","lastViewRef","selectMultipleWatch","selectPostLink","ngModelCtrl.$render","selectCtrlName","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","intVal","ctrl.$validators.maxlength","ctrl.$validators.minlength","getDecimals","opt_precision","ONE","OTHER","$$csp","head"] } diff --git a/js/vendor/angular/bower.json b/js/vendor/angular/bower.json index 12b4e8cf..a737d9be 100644 --- a/js/vendor/angular/bower.json +++ b/js/vendor/angular/bower.json @@ -1,6 +1,7 @@ { "name": "angular", - "version": "1.4.7", + "version": "1.5.11", + "license": "MIT", "main": "./angular.js", "ignore": [], "dependencies": { diff --git a/js/vendor/angular/package.json b/js/vendor/angular/package.json index c39a534c..bf193710 100644 --- a/js/vendor/angular/package.json +++ b/js/vendor/angular/package.json @@ -1,6 +1,6 @@ { "name": "angular", - "version": "1.4.7", + "version": "1.5.11", "description": "HTML enhanced for web apps", "main": "index.js", "scripts": { diff --git a/js/vendor/bootstrap/tooltip.js b/js/vendor/bootstrap/tooltip.js deleted file mode 100644 index 835abbe6..00000000 --- a/js/vendor/bootstrap/tooltip.js +++ /dev/null @@ -1,361 +0,0 @@ -/* =========================================================== - * bootstrap-tooltip.js v2.3.1 - * http://twitter.github.com/bootstrap/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init('tooltip', element, options) - } - - Tooltip.prototype = { - - constructor: Tooltip - - , init: function (type, element, options) { - var eventIn - , eventOut - , triggers - , trigger - , i - - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.enabled = true - - triggers = this.options.trigger.split(' ') - - for (i = triggers.length; i--;) { - trigger = triggers[i] - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - , getOptions: function (options) { - options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - , enter: function (e) { - var defaults = $.fn[this.type].defaults - , options = {} - , self - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }, this) - - self = $(e.currentTarget)[this.type](options).data(this.type) - - if (!self.options.delay || !self.options.delay.show) return self.show() - - clearTimeout(this.timeout) - self.hoverState = 'in' - this.timeout = setTimeout(function() { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - , leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (this.timeout) clearTimeout(this.timeout) - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.hoverState = 'out' - this.timeout = setTimeout(function() { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - , show: function () { - var $tip - , pos - , actualWidth - , actualHeight - , placement - , tp - , e = $.Event('show') - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $tip = this.tip() - this.setContent() - - if (this.options.animation) { - $tip.addClass('fade') - } - - placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - pos = this.getPosition() - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - switch (placement) { - case 'bottom': - tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'top': - tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'left': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} - break - case 'right': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} - break - } - - this.applyPlacement(tp, placement) - this.$element.trigger('shown') - } - } - - , applyPlacement: function(offset, placement){ - var $tip = this.tip() - , width = $tip[0].offsetWidth - , height = $tip[0].offsetHeight - , actualWidth - , actualHeight - , delta - , replace - - $tip - .offset(offset) - .addClass(placement) - .addClass('in') - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - replace = true - } - - if (placement == 'bottom' || placement == 'top') { - delta = 0 - - if (offset.left < 0){ - delta = offset.left * -2 - offset.left = 0 - $tip.offset(offset) - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - } - - this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') - } else { - this.replaceArrow(actualHeight - height, actualHeight, 'top') - } - - if (replace) $tip.offset(offset) - } - - , replaceArrow: function(delta, dimension, position){ - this - .arrow() - .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') - } - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - , hide: function () { - var that = this - , $tip = this.tip() - , e = $.Event('hide') - - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).detach() - }, 500) - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout) - $tip.detach() - }) - } - - $.support.transition && this.$tip.hasClass('fade') ? - removeWithAnimation() : - $tip.detach() - - this.$element.trigger('hidden') - - return this - } - - , fixTitle: function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - , hasContent: function () { - return this.getTitle() - } - - , getPosition: function () { - var el = this.$element[0] - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { - width: el.offsetWidth - , height: el.offsetHeight - }, this.$element.offset()) - } - - , getTitle: function () { - var title - , $e = this.$element - , o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - , tip: function () { - return this.$tip = this.$tip || $(this.options.template) - } - - , arrow: function(){ - return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") - } - - , validate: function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - , enable: function () { - this.enabled = true - } - - , disable: function () { - this.enabled = false - } - - , toggleEnabled: function () { - this.enabled = !this.enabled - } - - , toggle: function (e) { - var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this - self.tip().hasClass('in') ? self.hide() : self.show() - } - - , destroy: function () { - this.hide().$element.off('.' + this.type).removeData(this.type) - } - - } - - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - var old = $.fn.tooltip - - $.fn.tooltip = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tooltip') - , options = typeof option == 'object' && option - if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - $.fn.tooltip.defaults = { - animation: true - , placement: 'top' - , selector: false - , template: '

' - , trigger: 'hover focus' - , title: '' - , delay: 0 - , html: false - , container: false - } - - - /* TOOLTIP NO CONFLICT - * =================== */ - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(window.jQuery); diff --git a/js/vendor/jquery/.bower.json b/js/vendor/jquery/.bower.json deleted file mode 100644 index 1bf9c03a..00000000 --- a/js/vendor/jquery/.bower.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "jquery", - "version": "2.1.4", - "main": "dist/jquery.js", - "license": "MIT", - "ignore": [ - "**/.*", - "build", - "dist/cdn", - "speed", - "test", - "*.md", - "AUTHORS.txt", - "Gruntfile.js", - "package.json" - ], - "devDependencies": { - "sizzle": "2.1.1-jquery.2.1.2", - "requirejs": "2.1.10", - "qunit": "1.14.0", - "sinon": "1.8.1" - }, - "keywords": [ - "jquery", - "javascript", - "library" - ], - "homepage": "https://github.com/jquery/jquery", - "_release": "2.1.4", - "_resolution": { - "type": "version", - "tag": "2.1.4", - "commit": "7751e69b615c6eca6f783a81e292a55725af6b85" - }, - "_source": "git://github.com/jquery/jquery.git", - "_target": "2.1.*", - "_originalSource": "jquery" -} \ No newline at end of file diff --git a/js/vendor/jquery/MIT-LICENSE.txt b/js/vendor/jquery/MIT-LICENSE.txt deleted file mode 100644 index cdd31b5c..00000000 --- a/js/vendor/jquery/MIT-LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2014 jQuery Foundation and other contributors -http://jquery.com/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/js/vendor/jquery/bower.json b/js/vendor/jquery/bower.json deleted file mode 100644 index 0c80cd53..00000000 --- a/js/vendor/jquery/bower.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "jquery", - "version": "2.1.4", - "main": "dist/jquery.js", - "license": "MIT", - "ignore": [ - "**/.*", - "build", - "dist/cdn", - "speed", - "test", - "*.md", - "AUTHORS.txt", - "Gruntfile.js", - "package.json" - ], - "devDependencies": { - "sizzle": "2.1.1-jquery.2.1.2", - "requirejs": "2.1.10", - "qunit": "1.14.0", - "sinon": "1.8.1" - }, - "keywords": [ - "jquery", - "javascript", - "library" - ] -} diff --git a/js/vendor/jquery/dist/jquery.js b/js/vendor/jquery/dist/jquery.js deleted file mode 100644 index eed17778..00000000 --- a/js/vendor/jquery/dist/jquery.js +++ /dev/null @@ -1,9210 +0,0 @@ -/*! - * jQuery JavaScript Library v2.1.4 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2015-04-28T16:01Z - */ - -(function( global, factory ) { - - if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Support: Firefox 18+ -// Can't be in strict mode, several libs including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// - -var arr = []; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var support = {}; - - - -var - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - - version = "2.1.4", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android<4.1 - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.constructor && - !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - // Support: Android<4.0, iOS<6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE9-11+ - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Support: Android<4.1 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - - // Support: iOS 8.2 (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.2.0-pre - * http://sizzlejs.com/ - * - * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-12-16 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + characterEncoding + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - nodeType = context.nodeType; - - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - if ( !seed && documentIsHTML ) { - - // Try to shortcut find operations when possible (e.g., not under DocumentFragment) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType !== 1 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, - doc = node ? node.ownerDocument || node : preferredDoc; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - parent = doc.defaultView; - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); - } - } - - /* Support tests - ---------------------------------------------------------------------- */ - documentIsHTML = !isXML( doc ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context !== document && context; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is no seed and only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); -}; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -}); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Support: Blackberry 4.6 - // gEBID returns nodes no longer in the document (#6963) - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -jQuery.fn.extend({ - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.unique( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); -var rnotwhite = (/\S+/g); - - - -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // Add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // If we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -}); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // We once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[0], key ) : emptyGet; -}; - - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - -function Data() { - // Support: Android<4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; -Data.accepts = jQuery.acceptData; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android<4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; -var data_priv = new Data(); - -var data_user = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend({ - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - - -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); - }; - -var rcheckableType = (/^(?:checkbox|radio)$/i); - - - -(function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Safari<=5.1 - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari<=5.1, Android<4.2 - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<=11+ - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -})(); -var strundefined = typeof undefined; - - - -support.focusinBubbles = "onfocusin" in window; - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome<28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - // Support: Android<4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && e.stopImmediatePropagation ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Support: Firefox, Chrome, Safari -// Create "bubbling" focus and blur events -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - data_priv.remove( doc, fix ); - - } else { - data_priv.access( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE9 - option: [ 1, "" ], - - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - -// Support: IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, type, key, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( jQuery.acceptData( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - } -}); - -jQuery.fn.extend({ - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each(function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - }); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var arg = arguments[ 0 ]; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; - - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - - -var iframe, - elemdisplay = {}; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var style, - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - - // Use of this method is a temporary fix (more like optimization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery( "