From 102d9a877de18d72c837caca42069c5eab82fbbd Mon Sep 17 00:00:00 2001 From: Rockford Lhotka Date: Sat, 7 May 2016 10:49:01 -0500 Subject: [PATCH] Revert "#133 xamarin project" --- .../App_Start/Startup.MobileApp.cs | 66 + .../Controllers/EmailController.cs | 47 + .../Controllers/TodoItemController.cs | 52 + .../Controllers/ValuesController.cs | 23 + .../DataObjects/TodoItem.cs | 11 + .../MCM.KidsIdApp.MobileApi.csproj | 249 + .../Models/MobileServiceContext.cs | 38 + .../Properties/AssemblyInfo.cs | 19 +- src/MCM.KidsIdApp.MobileApi/Startup.cs | 16 + src/MCM.KidsIdApp.MobileApi/Web.Debug.config | 30 + .../Web.Release.config | 31 + src/MCM.KidsIdApp.MobileApi/Web.config | 80 + src/MCM.KidsIdApp.MobileApi/packages.config | 32 + src/MCM.KidsIdApp.sln | 122 + src/MCM.KidsIdApp/.bowerrc | 3 + src/MCM.KidsIdApp/.editorconfig | 14 + src/MCM.KidsIdApp/.gitignore | 6 + src/MCM.KidsIdApp/MCM.KidsIdApp.jsproj | 110 + src/MCM.KidsIdApp/bower.json | 11 + src/MCM.KidsIdApp/build.json | 11 + src/MCM.KidsIdApp/config.xml | 50 + src/MCM.KidsIdApp/gulpfile.js | 267 + src/MCM.KidsIdApp/hooks/README.md | 83 + .../after_prepare/010_add_platform_class.js | 94 + src/MCM.KidsIdApp/ionic.project | 4 + src/MCM.KidsIdApp/ios-install-certs.sh | 34 + .../lib/jasmine_examples/Player.js | 24 + .../lib/jasmine_examples/Song.js | 9 + src/MCM.KidsIdApp/package.json | 33 + src/MCM.KidsIdApp/release.keystore.enc | Bin 0 -> 2232 bytes .../android/icon/drawable-hdpi-icon.png | Bin 0 -> 2875 bytes .../android/icon/drawable-ldpi-icon.png | Bin 0 -> 1155 bytes .../android/icon/drawable-mdpi-icon.png | Bin 0 -> 1802 bytes .../android/icon/drawable-xhdpi-icon.png | Bin 0 -> 4317 bytes .../android/icon/drawable-xxhdpi-icon.png | Bin 0 -> 7793 bytes .../android/icon/drawable-xxxhdpi-icon.png | Bin 0 -> 11783 bytes .../splash/drawable-land-hdpi-screen.png | Bin 0 -> 13657 bytes .../splash/drawable-land-ldpi-screen.png | Bin 0 -> 3740 bytes .../splash/drawable-land-mdpi-screen.png | Bin 0 -> 7116 bytes .../splash/drawable-land-xhdpi-screen.png | Bin 0 -> 39781 bytes .../splash/drawable-land-xxhdpi-screen.png | Bin 0 -> 58987 bytes .../splash/drawable-land-xxxhdpi-screen.png | Bin 0 -> 89363 bytes .../splash/drawable-port-hdpi-screen.png | Bin 0 -> 13298 bytes .../splash/drawable-port-ldpi-screen.png | Bin 0 -> 3628 bytes .../splash/drawable-port-mdpi-screen.png | Bin 0 -> 7214 bytes .../splash/drawable-port-xhdpi-screen.png | Bin 0 -> 38625 bytes .../splash/drawable-port-xxhdpi-screen.png | Bin 0 -> 55504 bytes .../splash/drawable-port-xxxhdpi-screen.png | Bin 0 -> 81831 bytes src/MCM.KidsIdApp/resources/icon.png | Bin 0 -> 60857 bytes .../resources/ios/icon/icon-40.png | Bin 0 -> 1248 bytes .../resources/ios/icon/icon-40@2x.png | Bin 0 -> 3564 bytes .../resources/ios/icon/icon-50.png | Bin 0 -> 1902 bytes .../resources/ios/icon/icon-50@2x.png | Bin 0 -> 4691 bytes .../resources/ios/icon/icon-60.png | Bin 0 -> 2452 bytes .../resources/ios/icon/icon-60@2x.png | Bin 0 -> 6042 bytes .../resources/ios/icon/icon-60@3x.png | Bin 0 -> 10875 bytes .../resources/ios/icon/icon-72.png | Bin 0 -> 2866 bytes .../resources/ios/icon/icon-72@2x.png | Bin 0 -> 7793 bytes .../resources/ios/icon/icon-76.png | Bin 0 -> 3319 bytes .../resources/ios/icon/icon-76@2x.png | Bin 0 -> 8305 bytes .../resources/ios/icon/icon-small.png | Bin 0 -> 818 bytes .../resources/ios/icon/icon-small@2x.png | Bin 0 -> 2287 bytes .../resources/ios/icon/icon-small@3x.png | Bin 0 -> 3856 bytes src/MCM.KidsIdApp/resources/ios/icon/icon.png | Bin 0 -> 2112 bytes .../resources/ios/icon/icon@2x.png | Bin 0 -> 5718 bytes .../ios/splash/Default-568h@2x~iphone.png | Bin 0 -> 31992 bytes .../resources/ios/splash/Default-667h.png | Bin 0 -> 40444 bytes .../resources/ios/splash/Default-736h.png | Bin 0 -> 45098 bytes .../ios/splash/Default-Landscape-736h.png | Bin 0 -> 44906 bytes .../ios/splash/Default-Landscape@2x~ipad.png | Bin 0 -> 102289 bytes .../ios/splash/Default-Landscape~ipad.png | Bin 0 -> 22655 bytes .../ios/splash/Default-Portrait@2x~ipad.png | Bin 0 -> 99461 bytes .../ios/splash/Default-Portrait~ipad.png | Bin 0 -> 22692 bytes .../ios/splash/Default@2x~iphone.png | Bin 0 -> 18852 bytes .../resources/ios/splash/Default~iphone.png | Bin 0 -> 7214 bytes src/MCM.KidsIdApp/resources/splash.png | Bin 0 -> 62210 bytes src/MCM.KidsIdApp/scss/ionic.app.scss | 23 + src/MCM.KidsIdApp/spec/angularexample.spec.ts | 25 + src/MCM.KidsIdApp/spec/appFake.ts | 7 + .../helpers/jasmine_examples/SpecHelper.js | 15 + .../spec/jasmine_examples/PlayerSpec.js | 60 + .../services/applicationDataService.spec.ts | 45 + src/MCM.KidsIdApp/spec/support/jasmine.json | 11 + src/MCM.KidsIdApp/taco.json | 3 + src/MCM.KidsIdApp/www/css/ionic.app.css | 9732 +++ src/MCM.KidsIdApp/www/css/ionic.app.min.css | 1 + src/MCM.KidsIdApp/www/css/style.css | 16 + .../www/img/bckgrnd-placeholder.png | Bin 0 -> 202824 bytes src/MCM.KidsIdApp/www/img/ionic.png | Bin 0 -> 4757 bytes .../www/img/login-header-img.png | Bin 0 -> 4058 bytes src/MCM.KidsIdApp/www/index.html | 36 + .../www/lib/angular-animate/.bower.json | 19 + .../www/lib/angular-animate/README.md | 68 + .../lib/angular-animate/angular-animate.js | 3721 + .../angular-animate/angular-animate.min.js | 52 + .../angular-animate.min.js.map | 8 + .../www/lib/angular-animate/bower.json | 9 + .../www/lib/angular-animate/index.js | 2 + .../www/lib/angular-animate/package.json | 26 + .../www/lib/angular-sanitize/.bower.json | 19 + .../www/lib/angular-sanitize/README.md | 68 + .../lib/angular-sanitize/angular-sanitize.js | 683 + .../angular-sanitize/angular-sanitize.min.js | 16 + .../angular-sanitize.min.js.map | 8 + .../www/lib/angular-sanitize/bower.json | 9 + .../www/lib/angular-sanitize/index.js | 2 + .../www/lib/angular-sanitize/package.json | 26 + .../www/lib/angular-ui-router/.bower.json | 33 + .../www/lib/angular-ui-router/CHANGELOG.md | 197 + .../www/lib/angular-ui-router/CONTRIBUTING.md | 65 + .../www/lib/angular-ui-router/LICENSE | 21 + .../www/lib/angular-ui-router/README.md | 243 + .../api/angular-ui-router.d.ts | 126 + .../www/lib/angular-ui-router/bower.json | 23 + .../www/lib/angular-ui-router/src/common.js | 292 + .../www/lib/angular-ui-router/src/resolve.js | 252 + .../www/lib/angular-ui-router/src/state.js | 1373 + .../angular-ui-router/src/stateDirectives.js | 268 + .../lib/angular-ui-router/src/stateFilters.js | 39 + .../angular-ui-router/src/templateFactory.js | 110 + .../src/urlMatcherFactory.js | 1036 + .../lib/angular-ui-router/src/urlRouter.js | 413 + .../www/lib/angular-ui-router/src/view.js | 71 + .../angular-ui-router/src/viewDirective.js | 302 + .../lib/angular-ui-router/src/viewScroll.js | 52 + src/MCM.KidsIdApp/www/lib/angular/.bower.json | 17 + src/MCM.KidsIdApp/www/lib/angular/README.md | 64 + .../www/lib/angular/angular-csp.css | 21 + src/MCM.KidsIdApp/www/lib/angular/angular.js | 28364 +++++++ .../www/lib/angular/angular.min.js | 290 + .../www/lib/angular/angular.min.js.gzip | Bin 0 -> 51629 bytes .../www/lib/angular/angular.min.js.map | 8 + src/MCM.KidsIdApp/www/lib/angular/bower.json | 8 + src/MCM.KidsIdApp/www/lib/angular/index.js | 2 + .../www/lib/angular/package.json | 25 + src/MCM.KidsIdApp/www/lib/ionic/.bower.json | 46 + src/MCM.KidsIdApp/www/lib/ionic/README.md | 15 + src/MCM.KidsIdApp/www/lib/ionic/bower.json | 37 + src/MCM.KidsIdApp/www/lib/ionic/css/ionic.css | 9729 +++ .../www/lib/ionic/css/ionic.min.css | 23 + .../www/lib/ionic/fonts/ionicons.eot | Bin 0 -> 120724 bytes .../www/lib/ionic/fonts/ionicons.svg | 2230 + .../www/lib/ionic/fonts/ionicons.ttf | Bin 0 -> 188508 bytes .../www/lib/ionic/fonts/ionicons.woff | Bin 0 -> 67904 bytes .../www/lib/ionic/js/ionic-angular.js | 14044 ++++ .../www/lib/ionic/js/ionic-angular.min.js | 18 + .../www/lib/ionic/js/ionic.bundle.js | 64386 ++++++++++++++++ .../www/lib/ionic/js/ionic.bundle.min.js | 448 + src/MCM.KidsIdApp/www/lib/ionic/js/ionic.js | 13298 ++++ .../www/lib/ionic/js/ionic.min.js | 20 + .../www/lib/ionic/scss/_action-sheet.scss | 170 + .../www/lib/ionic/scss/_animations.scss | 48 + .../www/lib/ionic/scss/_backdrop.scss | 24 + .../www/lib/ionic/scss/_badge.scss | 62 + .../www/lib/ionic/scss/_bar.scss | 404 + .../www/lib/ionic/scss/_button-bar.scss | 64 + .../www/lib/ionic/scss/_button.scss | 252 + .../www/lib/ionic/scss/_checkbox.scss | 180 + .../www/lib/ionic/scss/_form.scss | 327 + .../www/lib/ionic/scss/_grid.scss | 159 + .../www/lib/ionic/scss/_items.scss | 815 + .../www/lib/ionic/scss/_list.scss | 125 + .../www/lib/ionic/scss/_loading.scss | 51 + .../www/lib/ionic/scss/_menu.scss | 70 + .../www/lib/ionic/scss/_mixins.scss | 640 + .../www/lib/ionic/scss/_modal.scss | 102 + .../www/lib/ionic/scss/_platform.scss | 77 + .../www/lib/ionic/scss/_popover.scss | 168 + .../www/lib/ionic/scss/_popup.scss | 110 + .../www/lib/ionic/scss/_progress.scss | 11 + .../www/lib/ionic/scss/_radio.scss | 47 + .../www/lib/ionic/scss/_range.scss | 160 + .../www/lib/ionic/scss/_refresher.scss | 113 + .../www/lib/ionic/scss/_reset.scss | 365 + .../www/lib/ionic/scss/_scaffolding.scss | 295 + .../www/lib/ionic/scss/_select.scss | 142 + .../www/lib/ionic/scss/_slide-box.scss | 71 + .../www/lib/ionic/scss/_slides.scss | 529 + .../www/lib/ionic/scss/_spinner.scss | 100 + .../www/lib/ionic/scss/_tabs.scss | 528 + .../www/lib/ionic/scss/_toggle.scss | 198 + .../www/lib/ionic/scss/_transitions.scss | 188 + .../www/lib/ionic/scss/_type.scss | 166 + .../www/lib/ionic/scss/_util.scss | 296 + .../www/lib/ionic/scss/_variables.scss | 761 + .../www/lib/ionic/scss/ionic.scss | 54 + .../ionic/scss/ionicons/_ionicons-font.scss | 28 + .../ionic/scss/ionicons/_ionicons-icons.scss | 1473 + .../scss/ionicons/_ionicons-variables.scss | 741 + .../www/lib/ionic/scss/ionicons/ionicons.scss | 16 + .../www/lib/ionic/scss/tsconfig.json | 18 + .../DescriptionDetailsController.ts | 82 + .../DistinguishingFeaturesController.ts | 37 + .../Controllers/IdChecklistController.ts | 53 + .../Controllers/PhysicalDetailsController.ts | 80 + src/MCM.KidsIdApp/www/scripts/app.js | 150 + .../scripts/controllers/AboutController.ts | 21 + .../controllers/BasicDetailsController.ts | 147 + .../controllers/ChildProfileItemController.ts | 44 + .../controllers/ChildProfileListController.ts | 63 + .../controllers/ForgotPasswordController.ts | 21 + .../controllers/InstructionIndexController.ts | 18 + .../scripts/controllers/LandingController.ts | 33 + .../scripts/controllers/LoginController.ts | 50 + .../www/scripts/controllers/NavigationLink.ts | 16 + .../scripts/controllers/PhotosController.ts | 73 + .../scripts/controllers/SettingsController.ts | 18 + .../scripts/controllers/StaticContentCtrl.ts | 17 + .../AzureMobileServicesClient.d.ts | 107 + .../www/scripts/definitions/FileSystem.d.ts | 373 + .../scripts/definitions/angular-mocks.d.ts | 318 + .../definitions/angular-ui-router.d.ts | 363 + .../www/scripts/definitions/angular.d.ts | 1877 + .../www/scripts/definitions/contacts.d.ts | 273 + .../www/scripts/definitions/ionic/ionic.d.ts | 391 + .../www/scripts/definitions/jasmine.d.ts | 496 + .../www/scripts/definitions/jquery.d.ts | 3210 + .../www/scripts/directives/FileSelectDir.ts | 40 + .../www/scripts/directives/PhoneContactDir.ts | 23 + .../scripts/directives/StaticContentDir.ts | 20 + .../www/scripts/models/models.ts | 131 + .../www/scripts/models/shareSettings.ts | 14 + .../services/ApplicationDataService.ts | 48 + .../www/scripts/services/ChildDataService.ts | 145 + .../www/scripts/services/ContactsService.ts | 41 + .../www/scripts/services/DocumentService.ts | 189 + .../scripts/services/FileStorageService.ts | 124 + .../services/InMemoryStorageService.ts | 54 + .../www/scripts/services/UserService.ts | 26 + .../www/scripts/services/serviceInterfaces.ts | 19 + .../www/templates/aboutpage.html | 8 + .../www/templates/basicdetails.html | 62 + .../www/templates/childprofileitem.html | 15 + .../www/templates/childprofilelist.html | 22 + .../www/templates/distinguishingfeatures.html | 15 + .../www/templates/forgotpassword.html | 5 + .../www/templates/idchecklist.html | 25 + .../www/templates/instructionindex.html | 12 + .../instructions/abduction.partial.html | 21 + .../instructions/amberalert.partial.html | 12 + .../instructions/disasterprep.partial.html | 19 + .../templates/instructions/dna.partial.html | 24 + .../templates/instructions/intl.partial.html | 29 + .../instructions/missing.partial.html | 20 + .../instructions/runaway.partial.html | 26 + .../instructions/safety.partial.html | 80 + .../www/templates/landingpage.html | 16 + src/MCM.KidsIdApp/www/templates/login.html | 41 + .../www/templates/phonecontact.html | 31 + src/MCM.KidsIdApp/www/templates/photos.html | 24 + .../www/templates/physicaldetails.html | 60 + .../www/templates/settingspage.html | 6 + .../www/templates/static-content.html | 4 + src/MobileKidsIdApp/MobileKidsIdApp.sln | 408 - .../Assets/AboutAssets.txt | 19 - .../MobileKidsIdApp.Droid/MainActivity.cs | 24 - .../MobileKidsIdApp.Droid.csproj | 151 - .../Properties/AndroidManifest.xml | 5 - .../Properties/AssemblyInfo.cs | 34 - .../Resources/AboutResources.txt | 50 - .../Resources/Resource.Designer.cs | 5915 -- .../Resources/drawable-hdpi/icon.png | Bin 1431 -> 0 bytes .../Resources/drawable-xhdpi/icon.png | Bin 1789 -> 0 bytes .../Resources/drawable-xxhdpi/icon.png | Bin 2353 -> 0 bytes .../Resources/drawable/icon.png | Bin 1431 -> 0 bytes .../MobileKidsIdApp.Droid/packages.config | 12 - .../MobileKidsIdApp.UWP/App.xaml | 8 - .../MobileKidsIdApp.UWP/App.xaml.cs | 107 - .../Assets/LockScreenLogo.scale-200.png | Bin 1430 -> 0 bytes .../Assets/SplashScreen.scale-200.png | Bin 7700 -> 0 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 2937 -> 0 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 1647 -> 0 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 1255 -> 0 bytes .../MobileKidsIdApp.UWP/Assets/StoreLogo.png | Bin 1451 -> 0 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 3204 -> 0 bytes .../MobileKidsIdApp.UWP/MainPage.xaml | 14 - .../MobileKidsIdApp.UWP/MainPage.xaml.cs | 27 - .../MobileKidsIdApp.UWP.csproj | 146 - .../MobileKidsIdApp.UWP/Package.appxmanifest | 49 - .../Properties/AssemblyInfo.cs | 29 - .../Properties/Default.rd.xml | 31 - .../MobileKidsIdApp.UWP/project.json | 17 - .../MobileKidsIdApp.WinPhone/App.xaml | 7 - .../MobileKidsIdApp.WinPhone/App.xaml.cs | 133 - .../Assets/Logo.scale-240.png | Bin 2516 -> 0 bytes .../Assets/SmallLogo.scale-240.png | Bin 753 -> 0 bytes .../Assets/SplashScreen.scale-240.png | Bin 14715 -> 0 bytes .../Assets/Square71x71Logo.scale-240.png | Bin 1122 -> 0 bytes .../Assets/StoreLogo.scale-240.png | Bin 2200 -> 0 bytes .../Assets/WideLogo.scale-240.png | Bin 4530 -> 0 bytes .../MobileKidsIdApp.WinPhone/MainPage.xaml | 12 - .../MobileKidsIdApp.WinPhone/MainPage.xaml.cs | 50 - .../MobileKidsIdApp.WinPhone.csproj | 166 - .../Package.appxmanifest | 44 - .../Properties/AssemblyInfo.cs | 29 - .../MobileKidsIdApp.WinPhone/packages.config | 4 - .../MobileKidsIdApp.Windows/App.xaml | 7 - .../MobileKidsIdApp.Windows/App.xaml.cs | 106 - .../Assets/Logo.scale-100.png | Bin 801 -> 0 bytes .../Assets/SmallLogo.scale-100.png | Bin 329 -> 0 bytes .../Assets/SplashScreen.scale-100.png | Bin 2146 -> 0 bytes .../Assets/StoreLogo.scale-100.png | Bin 429 -> 0 bytes .../MobileKidsIdApp.Windows/MainPage.xaml | 14 - .../MobileKidsIdApp.Windows/MainPage.xaml.cs | 27 - .../MobileKidsIdApp.Windows.csproj | 183 - .../Package.appxmanifest | 41 - .../Properties/AssemblyInfo.cs | 29 - .../MobileKidsIdApp.Windows/packages.config | 4 - .../MobileKidsIdApp.iOS/AppDelegate.cs | 31 - .../MobileKidsIdApp.iOS/Entitlements.plist | 7 - .../MobileKidsIdApp.iOS/Info.plist | 52 - .../MobileKidsIdApp.iOS/Main.cs | 20 - .../MobileKidsIdApp.iOS.csproj | 153 - .../Resources/Default-568h@2x.png | Bin 8884 -> 0 bytes .../Resources/Default-Portrait.png | Bin 10710 -> 0 bytes .../Resources/Default-Portrait@2x.png | Bin 34540 -> 0 bytes .../MobileKidsIdApp.iOS/Resources/Default.png | Bin 7243 -> 0 bytes .../Resources/Default@2x.png | Bin 8368 -> 0 bytes .../Resources/Icon-60@2x.png | Bin 1712 -> 0 bytes .../Resources/Icon-60@3x.png | Bin 21641 -> 0 bytes .../MobileKidsIdApp.iOS/Resources/Icon-76.png | Bin 1200 -> 0 bytes .../Resources/Icon-76@2x.png | Bin 2262 -> 0 bytes .../Resources/Icon-Small-40.png | Bin 729 -> 0 bytes .../Resources/Icon-Small-40@2x.png | Bin 1245 -> 0 bytes .../Resources/Icon-Small-40@3x.png | Bin 12610 -> 0 bytes .../Resources/Icon-Small.png | Bin 1144 -> 0 bytes .../Resources/Icon-Small@2x.png | Bin 955 -> 0 bytes .../Resources/Icon-Small@3x.png | Bin 7309 -> 0 bytes .../Resources/LaunchScreen.storyboard | 39 - .../MobileKidsIdApp.iOS/iTunesArtwork | Bin 16867 -> 0 bytes .../MobileKidsIdApp.iOS/iTunesArtwork@2x | Bin 20666 -> 0 bytes .../MobileKidsIdApp.iOS/packages.config | 4 - .../MobileKidsIdApp/MobileKidsIdApp/App.cs | 33 - .../MobileKidsIdApp/GettingStarted.Xamarin | 4 - .../MobileKidsIdApp/LandingPage.xaml | 6 - .../MobileKidsIdApp/LandingPage.xaml.cs | 18 - .../MobileKidsIdApp/MobileKidsIdApp.csproj | 83 - .../Properties/AssemblyInfo.cs | 30 - .../MobileKidsIdApp/packages.config | 4 - ...drenMinnesota_Wildcard.mobileprovision.enc | Bin 0 -> 7568 bytes ...drenMinnesota_Wildcard.mobileprovision.enc | Bin 0 -> 7560 bytes src/Signing/dev.p12.enc | Bin 0 -> 3288 bytes src/Signing/distro.p12.enc | Bin 0 -> 3224 bytes 343 files changed, 174208 insertions(+), 8396 deletions(-) create mode 100644 src/MCM.KidsIdApp.MobileApi/App_Start/Startup.MobileApp.cs create mode 100644 src/MCM.KidsIdApp.MobileApi/Controllers/EmailController.cs create mode 100644 src/MCM.KidsIdApp.MobileApi/Controllers/TodoItemController.cs create mode 100644 src/MCM.KidsIdApp.MobileApi/Controllers/ValuesController.cs create mode 100644 src/MCM.KidsIdApp.MobileApi/DataObjects/TodoItem.cs create mode 100644 src/MCM.KidsIdApp.MobileApi/MCM.KidsIdApp.MobileApi.csproj create mode 100644 src/MCM.KidsIdApp.MobileApi/Models/MobileServiceContext.cs rename src/{MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS => MCM.KidsIdApp.MobileApi}/Properties/AssemblyInfo.cs (72%) create mode 100644 src/MCM.KidsIdApp.MobileApi/Startup.cs create mode 100644 src/MCM.KidsIdApp.MobileApi/Web.Debug.config create mode 100644 src/MCM.KidsIdApp.MobileApi/Web.Release.config create mode 100644 src/MCM.KidsIdApp.MobileApi/Web.config create mode 100644 src/MCM.KidsIdApp.MobileApi/packages.config create mode 100644 src/MCM.KidsIdApp.sln create mode 100644 src/MCM.KidsIdApp/.bowerrc create mode 100644 src/MCM.KidsIdApp/.editorconfig create mode 100644 src/MCM.KidsIdApp/.gitignore create mode 100644 src/MCM.KidsIdApp/MCM.KidsIdApp.jsproj create mode 100644 src/MCM.KidsIdApp/bower.json create mode 100644 src/MCM.KidsIdApp/build.json create mode 100644 src/MCM.KidsIdApp/config.xml create mode 100644 src/MCM.KidsIdApp/gulpfile.js create mode 100644 src/MCM.KidsIdApp/hooks/README.md create mode 100755 src/MCM.KidsIdApp/hooks/after_prepare/010_add_platform_class.js create mode 100644 src/MCM.KidsIdApp/ionic.project create mode 100644 src/MCM.KidsIdApp/ios-install-certs.sh create mode 100644 src/MCM.KidsIdApp/lib/jasmine_examples/Player.js create mode 100644 src/MCM.KidsIdApp/lib/jasmine_examples/Song.js create mode 100644 src/MCM.KidsIdApp/package.json create mode 100644 src/MCM.KidsIdApp/release.keystore.enc create mode 100644 src/MCM.KidsIdApp/resources/android/icon/drawable-hdpi-icon.png create mode 100644 src/MCM.KidsIdApp/resources/android/icon/drawable-ldpi-icon.png create mode 100644 src/MCM.KidsIdApp/resources/android/icon/drawable-mdpi-icon.png create mode 100644 src/MCM.KidsIdApp/resources/android/icon/drawable-xhdpi-icon.png create mode 100644 src/MCM.KidsIdApp/resources/android/icon/drawable-xxhdpi-icon.png create mode 100644 src/MCM.KidsIdApp/resources/android/icon/drawable-xxxhdpi-icon.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-land-hdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-land-ldpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-land-mdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-land-xhdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-land-xxhdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-land-xxxhdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-port-hdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-port-ldpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-port-mdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-port-xhdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-port-xxhdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/android/splash/drawable-port-xxxhdpi-screen.png create mode 100644 src/MCM.KidsIdApp/resources/icon.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-40.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-40@2x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-50.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-50@2x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-60.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-60@2x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-60@3x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-72.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-72@2x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-76.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-76@2x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-small.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-small@2x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon-small@3x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon.png create mode 100644 src/MCM.KidsIdApp/resources/ios/icon/icon@2x.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-568h@2x~iphone.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-667h.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-736h.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-Landscape-736h.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-Landscape@2x~ipad.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-Landscape~ipad.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-Portrait@2x~ipad.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default-Portrait~ipad.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default@2x~iphone.png create mode 100644 src/MCM.KidsIdApp/resources/ios/splash/Default~iphone.png create mode 100644 src/MCM.KidsIdApp/resources/splash.png create mode 100644 src/MCM.KidsIdApp/scss/ionic.app.scss create mode 100644 src/MCM.KidsIdApp/spec/angularexample.spec.ts create mode 100644 src/MCM.KidsIdApp/spec/appFake.ts create mode 100644 src/MCM.KidsIdApp/spec/helpers/jasmine_examples/SpecHelper.js create mode 100644 src/MCM.KidsIdApp/spec/jasmine_examples/PlayerSpec.js create mode 100644 src/MCM.KidsIdApp/spec/services/applicationDataService.spec.ts create mode 100644 src/MCM.KidsIdApp/spec/support/jasmine.json create mode 100644 src/MCM.KidsIdApp/taco.json create mode 100644 src/MCM.KidsIdApp/www/css/ionic.app.css create mode 100644 src/MCM.KidsIdApp/www/css/ionic.app.min.css create mode 100644 src/MCM.KidsIdApp/www/css/style.css create mode 100644 src/MCM.KidsIdApp/www/img/bckgrnd-placeholder.png create mode 100644 src/MCM.KidsIdApp/www/img/ionic.png create mode 100644 src/MCM.KidsIdApp/www/img/login-header-img.png create mode 100644 src/MCM.KidsIdApp/www/index.html create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/.bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/README.md create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.min.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.min.js.map create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/index.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-animate/package.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/.bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/README.md create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js.map create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/index.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-sanitize/package.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/.bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/CHANGELOG.md create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/CONTRIBUTING.md create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/LICENSE create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/README.md create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/api/angular-ui-router.d.ts create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/common.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/resolve.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/state.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateDirectives.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateFilters.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/templateFactory.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlMatcherFactory.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlRouter.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/view.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewDirective.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewScroll.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular/.bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular/README.md create mode 100644 src/MCM.KidsIdApp/www/lib/angular/angular-csp.css create mode 100644 src/MCM.KidsIdApp/www/lib/angular/angular.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular/angular.min.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular/angular.min.js.gzip create mode 100644 src/MCM.KidsIdApp/www/lib/angular/angular.min.js.map create mode 100644 src/MCM.KidsIdApp/www/lib/angular/bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/angular/index.js create mode 100644 src/MCM.KidsIdApp/www/lib/angular/package.json create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/.bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/README.md create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/bower.json create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/css/ionic.css create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/css/ionic.min.css create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/fonts/ionicons.eot create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/fonts/ionicons.svg create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/fonts/ionicons.ttf create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/fonts/ionicons.woff create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/js/ionic-angular.js create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/js/ionic-angular.min.js create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/js/ionic.bundle.js create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/js/ionic.bundle.min.js create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/js/ionic.js create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/js/ionic.min.js create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_action-sheet.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_animations.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_backdrop.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_badge.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_bar.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_button-bar.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_button.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_checkbox.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_form.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_grid.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_items.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_list.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_loading.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_menu.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_mixins.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_modal.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_platform.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_popover.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_popup.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_progress.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_radio.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_range.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_refresher.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_reset.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_scaffolding.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_select.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_slide-box.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_slides.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_spinner.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_tabs.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_toggle.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_transitions.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_type.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_util.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/_variables.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/ionic.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/ionicons/_ionicons-font.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/ionicons/_ionicons-icons.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/ionicons/_ionicons-variables.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/ionicons/ionicons.scss create mode 100644 src/MCM.KidsIdApp/www/lib/ionic/scss/tsconfig.json create mode 100644 src/MCM.KidsIdApp/www/scripts/Controllers/DescriptionDetailsController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/Controllers/DistinguishingFeaturesController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/Controllers/IdChecklistController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/Controllers/PhysicalDetailsController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/app.js create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/AboutController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/BasicDetailsController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/ChildProfileItemController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/ChildProfileListController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/ForgotPasswordController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/InstructionIndexController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/LandingController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/LoginController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/NavigationLink.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/PhotosController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/SettingsController.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/controllers/StaticContentCtrl.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/AzureMobileServicesClient.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/FileSystem.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/angular-mocks.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/angular-ui-router.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/angular.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/contacts.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/ionic/ionic.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/jasmine.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/definitions/jquery.d.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/directives/FileSelectDir.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/directives/PhoneContactDir.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/directives/StaticContentDir.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/models/models.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/models/shareSettings.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/ApplicationDataService.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/ChildDataService.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/ContactsService.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/DocumentService.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/FileStorageService.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/InMemoryStorageService.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/UserService.ts create mode 100644 src/MCM.KidsIdApp/www/scripts/services/serviceInterfaces.ts create mode 100644 src/MCM.KidsIdApp/www/templates/aboutpage.html create mode 100644 src/MCM.KidsIdApp/www/templates/basicdetails.html create mode 100644 src/MCM.KidsIdApp/www/templates/childprofileitem.html create mode 100644 src/MCM.KidsIdApp/www/templates/childprofilelist.html create mode 100644 src/MCM.KidsIdApp/www/templates/distinguishingfeatures.html create mode 100644 src/MCM.KidsIdApp/www/templates/forgotpassword.html create mode 100644 src/MCM.KidsIdApp/www/templates/idchecklist.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructionindex.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/abduction.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/amberalert.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/disasterprep.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/dna.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/intl.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/missing.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/runaway.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/instructions/safety.partial.html create mode 100644 src/MCM.KidsIdApp/www/templates/landingpage.html create mode 100644 src/MCM.KidsIdApp/www/templates/login.html create mode 100644 src/MCM.KidsIdApp/www/templates/phonecontact.html create mode 100644 src/MCM.KidsIdApp/www/templates/photos.html create mode 100644 src/MCM.KidsIdApp/www/templates/physicaldetails.html create mode 100644 src/MCM.KidsIdApp/www/templates/settingspage.html create mode 100644 src/MCM.KidsIdApp/www/templates/static-content.html delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp.sln delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Assets/AboutAssets.txt delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/MainActivity.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/MobileKidsIdApp.Droid.csproj delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Properties/AndroidManifest.xml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Properties/AssemblyInfo.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Resources/AboutResources.txt delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Resources/Resource.Designer.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Resources/drawable-hdpi/icon.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Resources/drawable-xhdpi/icon.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Resources/drawable-xxhdpi/icon.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/Resources/drawable/icon.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Droid/packages.config delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/App.xaml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/App.xaml.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Assets/LockScreenLogo.scale-200.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Assets/SplashScreen.scale-200.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Assets/Square150x150Logo.scale-200.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Assets/Square44x44Logo.scale-200.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Assets/StoreLogo.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Assets/Wide310x150Logo.scale-200.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/MainPage.xaml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/MainPage.xaml.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/MobileKidsIdApp.UWP.csproj delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Package.appxmanifest delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Properties/AssemblyInfo.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/Properties/Default.rd.xml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.UWP/project.json delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/App.xaml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/App.xaml.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Assets/Logo.scale-240.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Assets/SmallLogo.scale-240.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Assets/SplashScreen.scale-240.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Assets/Square71x71Logo.scale-240.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Assets/StoreLogo.scale-240.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Assets/WideLogo.scale-240.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/MainPage.xaml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/MainPage.xaml.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/MobileKidsIdApp.WinPhone.csproj delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Package.appxmanifest delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/Properties/AssemblyInfo.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.WinPhone/packages.config delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/App.xaml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/App.xaml.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/Assets/Logo.scale-100.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/Assets/SmallLogo.scale-100.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/Assets/SplashScreen.scale-100.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/Assets/StoreLogo.scale-100.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/MainPage.xaml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/MainPage.xaml.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/MobileKidsIdApp.Windows.csproj delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/Package.appxmanifest delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/Properties/AssemblyInfo.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.Windows/packages.config delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/AppDelegate.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Entitlements.plist delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Info.plist delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Main.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/MobileKidsIdApp.iOS.csproj delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Default-568h@2x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Default-Portrait.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Default-Portrait@2x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Default.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Default@2x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-60@2x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-60@3x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-76.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-76@2x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-Small-40.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-Small-40@2x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-Small-40@3x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-Small.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-Small@2x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/Icon-Small@3x.png delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Resources/LaunchScreen.storyboard delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/iTunesArtwork delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/iTunesArtwork@2x delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/packages.config delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp/App.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp/GettingStarted.Xamarin delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp/LandingPage.xaml delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp/LandingPage.xaml.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.csproj delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp/Properties/AssemblyInfo.cs delete mode 100644 src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp/packages.config create mode 100644 src/Signing/Ad_Hoc__MissingChildrenMinnesota_Wildcard.mobileprovision.enc create mode 100644 src/Signing/Dev__MissingChildrenMinnesota_Wildcard.mobileprovision.enc create mode 100644 src/Signing/dev.p12.enc create mode 100644 src/Signing/distro.p12.enc diff --git a/src/MCM.KidsIdApp.MobileApi/App_Start/Startup.MobileApp.cs b/src/MCM.KidsIdApp.MobileApi/App_Start/Startup.MobileApp.cs new file mode 100644 index 0000000..c36bd4c --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/App_Start/Startup.MobileApp.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data.Entity; +using System.Web.Http; +using Microsoft.Azure.Mobile.Server; +using Microsoft.Azure.Mobile.Server.Authentication; +using Microsoft.Azure.Mobile.Server.Config; +using MCM.KidsIdApp.MobileApp.DataObjects; +using MCM.KidsIdApp.MobileApp.Models; +using Owin; + +namespace MCM.KidsIdApp.MobileApp +{ + public partial class Startup + { + public static void ConfigureMobileApp(IAppBuilder app) + { + HttpConfiguration config = new HttpConfiguration(); + + new MobileAppConfiguration() + .UseDefaultConfiguration() + .ApplyTo(config); + + // Use Entity Framework Code First to create database tables based on your DbContext + Database.SetInitializer(new MobileServiceInitializer()); + + MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings(); + + if (string.IsNullOrEmpty(settings.HostName)) + { + app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions + { + // This middleware is intended to be used locally for debugging. By default, HostName will + // only have a value when running in an App Service application. + SigningKey = ConfigurationManager.AppSettings["SigningKey"], + ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] }, + ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] }, + TokenHandler = config.GetAppServiceTokenHandler() + }); + } + + app.UseWebApi(config); + } + } + + public class MobileServiceInitializer : CreateDatabaseIfNotExists + { + protected override void Seed(MobileServiceContext context) + { + List todoItems = new List + { + new TodoItem { Id = Guid.NewGuid().ToString(), Text = "First item", Complete = false }, + new TodoItem { Id = Guid.NewGuid().ToString(), Text = "Second item", Complete = false } + }; + + foreach (TodoItem todoItem in todoItems) + { + context.Set().Add(todoItem); + } + + base.Seed(context); + } + } +} + diff --git a/src/MCM.KidsIdApp.MobileApi/Controllers/EmailController.cs b/src/MCM.KidsIdApp.MobileApi/Controllers/EmailController.cs new file mode 100644 index 0000000..cf35f20 --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Controllers/EmailController.cs @@ -0,0 +1,47 @@ +using MCM.KidsIdApp.MobileApp.DataObjects; +using Microsoft.Azure.Mobile.Server.Config; +using SendGrid; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Mail; +using System.Web.Http; +using System.Threading.Tasks; +using System.Configuration; + +namespace MCM.KidsIdApp.MobileApp.Controllers +{ + [MobileAppController] + public class EmailController : ApiController + { + // POST: api/Email + public HttpResponseMessage Post([FromBody]dynamic value) + { + var myMessage = new SendGridMessage(); + myMessage.AddTo(value.emailAddress.ToString()); + myMessage.From = new MailAddress( + ConfigurationManager.AppSettings["EmailFromAddress"], + ConfigurationManager.AppSettings["EmailFromName"] + ); + myMessage.Subject = "Your KidsID Profile Details"; + myMessage.Text = GetFormattedBody(value.profile); + + var transportWeb = new Web(ConfigurationManager.AppSettings["SendGridApiKey"]); + transportWeb.DeliverAsync(myMessage); + //this seems awfully happy-path to me, y'know + HttpResponseMessage m = new HttpResponseMessage(HttpStatusCode.OK); + return m; + } + + private string GetFormattedBody(dynamic profile) + { + string body = "You are recieving this email because a user of the KidsID app is sending you profile information for a child." + Environment.NewLine + Environment.NewLine; + body += "Profile details have been attached, but only those that you selected." + Environment.NewLine + Environment.NewLine; + body += "Authorities can use this data to communicate or create alerts for a child. Forward this email to authorities if necessary." + Environment.NewLine + Environment.NewLine; + body += profile.ToString() + Environment.NewLine + Environment.NewLine; + return body; + } + } +} diff --git a/src/MCM.KidsIdApp.MobileApi/Controllers/TodoItemController.cs b/src/MCM.KidsIdApp.MobileApi/Controllers/TodoItemController.cs new file mode 100644 index 0000000..789e646 --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Controllers/TodoItemController.cs @@ -0,0 +1,52 @@ +using System.Linq; +using System.Threading.Tasks; +using System.Web.Http; +using System.Web.Http.Controllers; +using System.Web.Http.OData; +using Microsoft.Azure.Mobile.Server; +using MCM.KidsIdApp.MobileApp.DataObjects; +using MCM.KidsIdApp.MobileApp.Models; + +namespace MCM.KidsIdApp.MobileApp.Controllers +{ + public class TodoItemController : TableController + { + protected override void Initialize(HttpControllerContext controllerContext) + { + base.Initialize(controllerContext); + MobileServiceContext context = new MobileServiceContext(); + DomainManager = new EntityDomainManager(context, Request); + } + + // GET tables/TodoItem + public IQueryable GetAllTodoItems() + { + return Query(); + } + + // GET tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959 + public SingleResult GetTodoItem(string id) + { + return Lookup(id); + } + + // PATCH tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959 + public Task PatchTodoItem(string id, Delta patch) + { + return UpdateAsync(id, patch); + } + + // POST tables/TodoItem + public async Task PostTodoItem(TodoItem item) + { + TodoItem current = await InsertAsync(item); + return CreatedAtRoute("Tables", new { id = current.Id }, current); + } + + // DELETE tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959 + public Task DeleteTodoItem(string id) + { + return DeleteAsync(id); + } + } +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp.MobileApi/Controllers/ValuesController.cs b/src/MCM.KidsIdApp.MobileApi/Controllers/ValuesController.cs new file mode 100644 index 0000000..4e40d2f --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Controllers/ValuesController.cs @@ -0,0 +1,23 @@ +using System.Web.Http; +using Microsoft.Azure.Mobile.Server.Config; + +namespace MCM.KidsIdApp.MobileApp.Controllers +{ + // Use the MobileAppController attribute for each ApiController you want to use + // from your mobile clients + [MobileAppController] + public class ValuesController : ApiController + { + // GET api/values + public string Get() + { + return "Hello World!"; + } + + // POST api/values + public string Post() + { + return "Hello World!"; + } + } +} diff --git a/src/MCM.KidsIdApp.MobileApi/DataObjects/TodoItem.cs b/src/MCM.KidsIdApp.MobileApi/DataObjects/TodoItem.cs new file mode 100644 index 0000000..aebc7dd --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/DataObjects/TodoItem.cs @@ -0,0 +1,11 @@ +using Microsoft.Azure.Mobile.Server; + +namespace MCM.KidsIdApp.MobileApp.DataObjects +{ + public class TodoItem : EntityData + { + public string Text { get; set; } + + public bool Complete { get; set; } + } +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp.MobileApi/MCM.KidsIdApp.MobileApi.csproj b/src/MCM.KidsIdApp.MobileApi/MCM.KidsIdApp.MobileApi.csproj new file mode 100644 index 0000000..a22162f --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/MCM.KidsIdApp.MobileApi.csproj @@ -0,0 +1,249 @@ + + + + + Debug + AnyCPU + + + 2.0 + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + MCM.KidsIdApp.MobileApp + MCM.KidsIdApp.MobileApp + v4.5 + false + true + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll + True + + + ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll + True + + + ..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll + True + + + ..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.Authentication.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.Authentication.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.CrossDomain.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.CrossDomain.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.Entity.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.Entity.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.Home.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.Home.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.Notifications.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.Notifications.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.Quickstart.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.Quickstart.dll + True + + + ..\packages\Microsoft.Azure.Mobile.Server.Tables.1.0.119.0\lib\net45\Microsoft.Azure.Mobile.Server.Tables.dll + True + + + ..\packages\Microsoft.Azure.NotificationHubs.1.0.2\lib\net45-full\Microsoft.Azure.NotificationHubs.dll + True + + + ..\packages\Microsoft.Data.Edm.5.6.4\lib\net40\Microsoft.Data.Edm.dll + True + + + ..\packages\Microsoft.Data.OData.5.6.4\lib\net40\Microsoft.Data.OData.dll + True + + + ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll + True + + + ..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll + True + + + ..\packages\Microsoft.Owin.Security.3.0.1\lib\net45\Microsoft.Owin.Security.dll + True + + + ..\packages\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\lib\net40\Microsoft.WindowsAzure.Configuration.dll + True + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + ..\packages\Owin.1.0\lib\net40\Owin.dll + True + + + ..\packages\Sendgrid.6.3.4\lib\SendGrid.dll + True + + + ..\packages\SendGrid.SmtpApi.1.3.1\lib\net40\SendGrid.SmtpApi.dll + True + + + ..\packages\Sendgrid.6.3.4\lib\SendGridMail.dll + True + + + ..\packages\System.IdentityModel.Tokens.Jwt.4.0.2.205111437\lib\net45\System.IdentityModel.Tokens.Jwt.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll + True + + + + + ..\packages\System.Spatial.5.6.4\lib\net40\System.Spatial.dll + True + + + ..\packages\Microsoft.AspNet.Cors.5.2.3\lib\net45\System.Web.Cors.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll + True + + + + + + + + + + + + + ..\packages\Microsoft.AspNet.WebApi.Cors.5.2.3\lib\net45\System.Web.Http.Cors.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.OData.5.5.1\lib\net45\System.Web.Http.OData.dll + True + + + ..\packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + Web.config + + + Web.config + + + + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + + + + True + True + 5762 + / + http://localhost:5762/ + False + False + + + False + + + + + + \ No newline at end of file diff --git a/src/MCM.KidsIdApp.MobileApi/Models/MobileServiceContext.cs b/src/MCM.KidsIdApp.MobileApi/Models/MobileServiceContext.cs new file mode 100644 index 0000000..226bcdc --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Models/MobileServiceContext.cs @@ -0,0 +1,38 @@ +using System.Data.Entity; +using System.Data.Entity.ModelConfiguration.Conventions; +using System.Linq; +using Microsoft.Azure.Mobile.Server; +using Microsoft.Azure.Mobile.Server.Tables; +using MCM.KidsIdApp.MobileApp.DataObjects; + +namespace MCM.KidsIdApp.MobileApp.Models +{ + public class MobileServiceContext : DbContext + { + // You can add custom code to this file. Changes will not be overwritten. + // + // If you want Entity Framework to alter your database + // automatically whenever you change your model schema, please use data migrations. + // For more information refer to the documentation: + // http://msdn.microsoft.com/en-us/data/jj591621.aspx + // + // To enable Entity Framework migrations in the cloud, please ensure that the + // service name, set by the 'MS_MobileServiceName' AppSettings in the local + // Web.config, is the same as the service name when hosted in Azure. + + private const string connectionStringName = "Name=MS_TableConnectionString"; + + public MobileServiceContext() : base(connectionStringName) + { + } + + public DbSet TodoItems { get; set; } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + modelBuilder.Conventions.Add( + new AttributeToColumnAnnotationConvention( + "ServiceTableColumn", (property, attributes) => attributes.Single().ColumnType.ToString())); + } + } +} diff --git a/src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Properties/AssemblyInfo.cs b/src/MCM.KidsIdApp.MobileApi/Properties/AssemblyInfo.cs similarity index 72% rename from src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Properties/AssemblyInfo.cs rename to src/MCM.KidsIdApp.MobileApi/Properties/AssemblyInfo.cs index c0285a7..3ec047c 100644 --- a/src/MobileKidsIdApp/MobileKidsIdApp/MobileKidsIdApp.iOS/Properties/AssemblyInfo.cs +++ b/src/MCM.KidsIdApp.MobileApi/Properties/AssemblyInfo.cs @@ -2,35 +2,34 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("MobileKidsIdApp.iOS")] +[assembly: AssemblyTitle("MCM.KidsIdApp.MobileApp")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MobileKidsIdApp.iOS")] -[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyProduct("MCM.KidsIdApp.MobileApp")] +[assembly: AssemblyCopyright("Copyright © 2016")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")] +[assembly: Guid("bdffba00-5196-4f34-88f2-63198c559a46")] // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/MCM.KidsIdApp.MobileApi/Startup.cs b/src/MCM.KidsIdApp.MobileApi/Startup.cs new file mode 100644 index 0000000..48d7acc --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Startup.cs @@ -0,0 +1,16 @@ +using Microsoft.Owin; +using Owin; + +[assembly: OwinStartup(typeof(MCM.KidsIdApp.MobileApp.Startup))] + +namespace MCM.KidsIdApp.MobileApp +{ + public partial class Startup + { + public void Configuration(IAppBuilder app) + { + + ConfigureMobileApp(app); + } + } +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp.MobileApi/Web.Debug.config b/src/MCM.KidsIdApp.MobileApi/Web.Debug.config new file mode 100644 index 0000000..680849f --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/src/MCM.KidsIdApp.MobileApi/Web.Release.config b/src/MCM.KidsIdApp.MobileApi/Web.Release.config new file mode 100644 index 0000000..943c9c0 --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/src/MCM.KidsIdApp.MobileApi/Web.config b/src/MCM.KidsIdApp.MobileApi/Web.config new file mode 100644 index 0000000..4e49dff --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/Web.config @@ -0,0 +1,80 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MCM.KidsIdApp.MobileApi/packages.config b/src/MCM.KidsIdApp.MobileApi/packages.config new file mode 100644 index 0000000..e5bfa14 --- /dev/null +++ b/src/MCM.KidsIdApp.MobileApi/packages.config @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MCM.KidsIdApp.sln b/src/MCM.KidsIdApp.sln new file mode 100644 index 0000000..0977253 --- /dev/null +++ b/src/MCM.KidsIdApp.sln @@ -0,0 +1,122 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.24720.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{262852C6-CD72-467D-83FE-5EEB1973A190}") = "MCM.KidsIdApp", "MCM.KidsIdApp\MCM.KidsIdApp.jsproj", "{7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MCM.KidsIdApp.MobileApi", "MCM.KidsIdApp.MobileApi\MCM.KidsIdApp.MobileApi.csproj", "{37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Android = Debug|Android + Debug|Any CPU = Debug|Any CPU + Debug|iOS = Debug|iOS + Debug|Windows Phone (Universal) = Debug|Windows Phone (Universal) + Debug|Windows Phone 8 = Debug|Windows Phone 8 + Debug|Windows-AnyCPU = Debug|Windows-AnyCPU + Debug|Windows-ARM = Debug|Windows-ARM + Debug|Windows-x64 = Debug|Windows-x64 + Debug|Windows-x86 = Debug|Windows-x86 + Release|Android = Release|Android + Release|Any CPU = Release|Any CPU + Release|iOS = Release|iOS + Release|Windows Phone (Universal) = Release|Windows Phone (Universal) + Release|Windows Phone 8 = Release|Windows Phone 8 + Release|Windows-AnyCPU = Release|Windows-AnyCPU + Release|Windows-ARM = Release|Windows-ARM + Release|Windows-x64 = Release|Windows-x64 + Release|Windows-x86 = Release|Windows-x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Android.ActiveCfg = Debug|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Android.Build.0 = Debug|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Android.Deploy.0 = Debug|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Any CPU.ActiveCfg = Debug|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|iOS.ActiveCfg = Debug|iOS + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|iOS.Build.0 = Debug|iOS + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|iOS.Deploy.0 = Debug|iOS + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows Phone (Universal).ActiveCfg = Debug|Windows Phone (Universal) + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows Phone (Universal).Build.0 = Debug|Windows Phone (Universal) + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows Phone (Universal).Deploy.0 = Debug|Windows Phone (Universal) + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows Phone 8.ActiveCfg = Debug|Windows Phone 8 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows Phone 8.Build.0 = Debug|Windows Phone 8 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows Phone 8.Deploy.0 = Debug|Windows Phone 8 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-AnyCPU.ActiveCfg = Debug|Windows-AnyCPU + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-AnyCPU.Build.0 = Debug|Windows-AnyCPU + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-AnyCPU.Deploy.0 = Debug|Windows-AnyCPU + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-ARM.ActiveCfg = Debug|Windows-ARM + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-ARM.Build.0 = Debug|Windows-ARM + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-ARM.Deploy.0 = Debug|Windows-ARM + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-x64.ActiveCfg = Debug|Windows-x64 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-x64.Build.0 = Debug|Windows-x64 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-x64.Deploy.0 = Debug|Windows-x64 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-x86.ActiveCfg = Debug|Windows-x86 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-x86.Build.0 = Debug|Windows-x86 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Debug|Windows-x86.Deploy.0 = Debug|Windows-x86 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Android.ActiveCfg = Release|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Android.Build.0 = Release|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Android.Deploy.0 = Release|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Any CPU.ActiveCfg = Release|Android + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|iOS.ActiveCfg = Release|iOS + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|iOS.Build.0 = Release|iOS + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|iOS.Deploy.0 = Release|iOS + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows Phone (Universal).ActiveCfg = Release|Windows Phone (Universal) + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows Phone (Universal).Build.0 = Release|Windows Phone (Universal) + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows Phone (Universal).Deploy.0 = Release|Windows Phone (Universal) + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows Phone 8.ActiveCfg = Release|Windows Phone 8 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows Phone 8.Build.0 = Release|Windows Phone 8 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows Phone 8.Deploy.0 = Release|Windows Phone 8 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-AnyCPU.ActiveCfg = Release|Windows-AnyCPU + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-AnyCPU.Build.0 = Release|Windows-AnyCPU + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-AnyCPU.Deploy.0 = Release|Windows-AnyCPU + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-ARM.ActiveCfg = Release|Windows-ARM + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-ARM.Build.0 = Release|Windows-ARM + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-ARM.Deploy.0 = Release|Windows-ARM + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-x64.ActiveCfg = Release|Windows-x64 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-x64.Build.0 = Release|Windows-x64 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-x64.Deploy.0 = Release|Windows-x64 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-x86.ActiveCfg = Release|Windows-x86 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-x86.Build.0 = Release|Windows-x86 + {7FC82490-3FFE-47BE-B5F6-F52ED8B78E38}.Release|Windows-x86.Deploy.0 = Release|Windows-x86 + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Android.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Android.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|iOS.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|iOS.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows Phone (Universal).ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows Phone (Universal).Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows Phone 8.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows Phone 8.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-AnyCPU.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-AnyCPU.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-ARM.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-ARM.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-x64.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-x64.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-x86.ActiveCfg = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Debug|Windows-x86.Build.0 = Debug|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Android.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Android.Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Any CPU.Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|iOS.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|iOS.Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows Phone (Universal).ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows Phone (Universal).Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows Phone 8.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows Phone 8.Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-AnyCPU.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-AnyCPU.Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-ARM.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-ARM.Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-x64.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-x64.Build.0 = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-x86.ActiveCfg = Release|Any CPU + {37FF08DC-36E5-41F6-B8C3-0BDBFDBA90A4}.Release|Windows-x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal + diff --git a/src/MCM.KidsIdApp/.bowerrc b/src/MCM.KidsIdApp/.bowerrc new file mode 100644 index 0000000..e28246d --- /dev/null +++ b/src/MCM.KidsIdApp/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "www/lib" +} diff --git a/src/MCM.KidsIdApp/.editorconfig b/src/MCM.KidsIdApp/.editorconfig new file mode 100644 index 0000000..aca2523 --- /dev/null +++ b/src/MCM.KidsIdApp/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false \ No newline at end of file diff --git a/src/MCM.KidsIdApp/.gitignore b/src/MCM.KidsIdApp/.gitignore new file mode 100644 index 0000000..8f7ddd3 --- /dev/null +++ b/src/MCM.KidsIdApp/.gitignore @@ -0,0 +1,6 @@ +# Specifies intentionally untracked files to ignore when using Git +# http://git-scm.com/docs/gitignore + +node_modules/ +platforms/ +plugins/ diff --git a/src/MCM.KidsIdApp/MCM.KidsIdApp.jsproj b/src/MCM.KidsIdApp/MCM.KidsIdApp.jsproj new file mode 100644 index 0000000..e2f173a --- /dev/null +++ b/src/MCM.KidsIdApp/MCM.KidsIdApp.jsproj @@ -0,0 +1,110 @@ + + + + + + Debug + Android + + + Debug + iOS + + + Debug + Windows-AnyCPU + + + Debug + Windows-x64 + + + Debug + Windows-x86 + + + Debug + Windows-ARM + + + Debug + Windows Phone 8 + + + Debug + Windows Phone (Universal) + + + Release + Android + + + Release + iOS + + + Release + Windows-AnyCPU + + + Release + Windows-x64 + + + Release + Windows-x86 + + + Release + Windows-ARM + + + Release + Windows Phone 8 + + + Release + Windows Phone (Universal) + + + + + + + 7fc82490-3ffe-47be-b5f6-f52ed8b78e38 + + + + 14.0 + + + false + + + + + Tools for Apache Cordova + + + MDD + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MCM.KidsIdApp/bower.json b/src/MCM.KidsIdApp/bower.json new file mode 100644 index 0000000..474c58b --- /dev/null +++ b/src/MCM.KidsIdApp/bower.json @@ -0,0 +1,11 @@ +{ + "name": "HelloIonic", + "private": "true", + "devDependencies": { + "ionic": "driftyco/ionic-bower#1.2.4" + }, + "dependencies": { + "ionic-datepicker": "~0.9.0", + "blob-util": "1.2.1" + } +} diff --git a/src/MCM.KidsIdApp/build.json b/src/MCM.KidsIdApp/build.json new file mode 100644 index 0000000..539a1a1 --- /dev/null +++ b/src/MCM.KidsIdApp/build.json @@ -0,0 +1,11 @@ +{ + "android": { + "debug": { + "keystore": "" + }, + "release": { + "keystore": "release.keystore", + "alias": "droid-mkid" + } + } +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp/config.xml b/src/MCM.KidsIdApp/config.xml new file mode 100644 index 0000000..a7e9290 --- /dev/null +++ b/src/MCM.KidsIdApp/config.xml @@ -0,0 +1,50 @@ + + + Kids Id App + + An Ionic Framework and Cordova project. + + + Your Name Here + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/MCM.KidsIdApp/gulpfile.js b/src/MCM.KidsIdApp/gulpfile.js new file mode 100644 index 0000000..e72aee7 --- /dev/null +++ b/src/MCM.KidsIdApp/gulpfile.js @@ -0,0 +1,267 @@ +/// +"use strict"; + +var gulp = require('gulp'); +var fs = require("fs"); +var del = require('del'); +var sourcemaps = require('gulp-sourcemaps'); +var ts = require("gulp-typescript"); +var cordovaBuild = require("taco-team-build"); +var gutil = require('gulp-util'); +var bower = require('bower'); +var concat = require('gulp-concat'); +var sass = require('gulp-sass'); +var minifyCss = require('gulp-minify-css'); +var rename = require('gulp-rename'); +var sh = require('shelljs'); +var watch = require('gulp-watch'); + +var jasmine = require('gulp-jasmine'); +require('any-promise/register')('es6-promise'); +var jasmineBrowser = require('gulp-jasmine-browser'); + +var appName = "Kids Id App"; +var paths = { + sass: ['./scss/**/*.scss'], + ipaPath: "./platforms/ios/build/device/" + appName + ".ipa", + dsymPath: "./platforms/ios/build/device/" + appName + ".app.dSYM", + releaseApkPath: "./platforms/android/build/outputs/apk/android-release.apk", + debugApkPath: "./platforms/android/build/outputs/apk/android-debug.apk", + appPackagesPath: "./platforms/windows/AppPackages/**/*", + typeScriptSources: "./www/scripts/**/*.ts", + specSources: 'spec/**/*.ts', + specOut: 'spec-out/' +}; + +// Signing releated vars +var androidKeystorePwd = process.env["ANDROID_PWD"], + encryptionPwd = process.env["ENC_PWD"], + iosP12Pwd = process.env["P12_PWD"], + iosCodeSignIdentityRelease = "iPhone Distribution: Rockford Lhotka", + iosCodeSignIdentityDebug = "iPhone Developer"; + +// HockeyApp vars +var hockeyappApiToken = process.env["HOCKEYAPP_API_TOKEN"], + hockeyappAppIdiOS = "8411945a0f2c48b4bc5184304ef110a2", // TODO: UPDATE WITH CORRECT APP ID FROM HOCKEYAPP ACCOUNT + hockeyappAppIdAndroid = "149a28f8df374b18a9df3dbb15c57b6e"; + +// build settings +var winPlatforms = ["android", "windows"], + linuxPlatforms = ["android"], + osxPlatforms = ["ios"], + buildArgs = { + android: ["--debug", + "--device", + "--gradleArg=--no-daemon"], + ios: ["--debug", "--device", "--codeSignIdentity=" + iosCodeSignIdentityDebug], + windows: ["--debug", "--device"], + wp8: ["--debug", "--device"] + }, + buildArgsRelease = { + android: ["--release", + "--device", + "--gradleArg=--no-daemon", + "--storePassword=" + androidKeystorePwd, + "--password=" + androidKeystorePwd], + ios: ["--release", + "--device", + "--codeSignIdentity=" + iosCodeSignIdentityRelease], + windows: ["--release", "--device"] + }, + platformsToBuild = process.platform === "darwin" ? osxPlatforms : + (process.platform === "linux" ? linuxPlatforms : winPlatforms), + tsconfigPath = "tsconfig.json"; + + +gulp.task('default', ['sass', 'build', 'spec'], function() { + // Copy results to bin folder + // Android + gulp.src(paths.debugApkPath).pipe(gulp.dest("./bin/Android/Debug")); + // iOS + gulp.src(paths.ipaPath).pipe(gulp.dest("./bin/iOS/Debug")); + gulp.src(paths.dsymPath).pipe(gulp.dest("./bin/iOS/Debug")); + // Windows + gulp.src(paths.appPackagesPath).pipe(gulp.dest("./bin/Windows/Debug/AppPackages")); +}); + +gulp.task('sass', function(done) { + gulp.src('./scss/ionic.app.scss') + .pipe(sass()) + .on('error', sass.logError) + .pipe(gulp.dest('./www/css/')) + .pipe(minifyCss({ + keepSpecialComments: 0 + })) + .pipe(rename({ extname: '.min.css' })) + .pipe(gulp.dest('./www/css/')) + .on('end', done); +}); + +gulp.task('watch', function() { + gulp.watch(paths.sass, ['sass']); + gulp.watch(paths.typeScriptSources, ['scripts']); + gulp.watch(paths.specSources, ['spec-compile']); +}); + +gulp.task('install', ['git-check'], function() { + return bower.commands.install() + .on('log', function(data) { + gutil.log('bower', gutil.colors.cyan(data.id), data.message); + }); +}); + +gulp.task('git-check', function(done) { + if (!sh.which('git')) { + console.log( + ' ' + gutil.colors.red('Git is not installed.'), + '\n Git, the version control system, is required to download Ionic.', + '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.', + '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.' + ); + process.exit(1); + } + done(); +}); + + +gulp.task("scripts", function () { + // Compile TypeScript code - This sample is designed to compile anything under the "scripts" folder using settings + // in scripts/tsconfig.json if present or this gulpfile if not. Adjust as appropriate for your use case. + var tsConfig; + if (fs.existsSync(tsconfigPath)) { + // Use settings from scripts/tsconfig.json + tsConfig = ts(ts.createProject(tsconfigPath)); + } else { + // Otherwise use these default settings + tsConfig = ts({ + noImplicitAny: false, + noEmitOnError: true, + removeComments: false, + sourceMap: true, + out: "appBundle.js", + target: "es5" + }); + } + gulp.src(paths.typeScriptSources) + .pipe(sourcemaps.init()) + .pipe(tsConfig) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest("./www/scripts")); +}); + +gulp.task("build", ["sass","scripts"], function () { + return cordovaBuild.buildProject(platformsToBuild, buildArgs); +}); + +gulp.task("build-win", ["sass", "scripts"], function() { + return cordovaBuild.buildProject("windows", buildArgs); +}); + +gulp.task("build-android", ["sass","scripts"], function() { + return cordovaBuild.buildProject("android", buildArgs); +}); + +gulp.task("build-ios", ["sass","scripts"], function() { + return cordovaBuild.buildProject("ios", buildArgs); +}); + +gulp.task("build-android-release", ["sass","scripts"], function() { + // ** NOTE: You may need to remove the android platform (cordova platform remove android) when switching between debug and release builds. + // Build artifacts may expect release.keystore to be present after a release build and the script cleans it up to not leave + // an unencrypted version on the build server. + + var openssl = sh.which("openssl"); + if(!openssl) { + console.error("\"openssl\" not found in path. Download and install git command line tools at http://git-scm.com/downloads, ensure openssl is in the path, and try again."); + } + if(!androidKeystorePwd || !encryptionPwd) { + console.error("Set environment variables ANDROID_PWD to the keystore password and ENC_PWD to the openssl encryption password."); + process.exit(1); + } + sh.exec('"' + openssl + '" des3 -d -in release.keystore.enc -out release.keystore -pass pass:' + encryptionPwd); + return cordovaBuild.buildProject("android", buildArgsRelease) + .then(function() { + sh.rm("release.keystore"); + gulp.src(paths.releaseApkPath).pipe(gulp.dest("./bin/Android/Release")); + }); +}); + +gulp.task("build-ios-release", ["sass","scripts"], function() { + if(!iosP12Pwd || !encryptionPwd) { + console.error("Set environment variables P12_PWD to the p12 signing cert password and ENC_PWD to the openssl encryption password."); + process.exit(1); + } + sh.exec("sh ios-install-certs.sh"); + return cordovaBuild.buildProject("ios", buildArgsRelease) + .then(function() { + gulp.src(paths.ipaPath).pipe(gulp.dest("./bin/iOS/Release")); + gulp.src(paths.dsymPath).pipe(gulp.dest("./bin/iOS/Release")); + }); +}); + +gulp.task("hockeyapp-android-release", function() { + var curl = sh.which("curl"); + if(!curl) { + console.error("\"curl\" not found in path. Download and install git command line tools at http://git-scm.com/downloads, ensure openssl is in the path, and try again."); + process.exit(1); + } + if(!hockeyappApiToken) { + console.error("Set environment variable HOCKEYAPP_API_TOKEN to your API key and try again."); + process.exit(1); + } + // Upload - See http://support.hockeyapp.net/kb/api/api-apps + sh.exec('"' + curl + '" -F "status=2" -F "notify=0" -F "ipa=@' + paths.releaseApkPath + '" -H "X-HockeyAppToken: ' + hockeyappApiToken + '" https://rink.hockeyapp.net/api/2/apps/' + hockeyappAppIdAndroid + '/app_versions/upload'); +}); + +gulp.task("hockeyapp-ios-release", function() { + if(!hockeyappApiToken) { + console.error("Set environment variable HOCKEYAPP_API_TOKEN to your API key and try again."); + process.exit(1); + } + var curl = sh.which("curl"); + var zip = sh.which("zip"); + var zipfile = "hockey-dsym-upload.dsym.zip"; + // Compress dsym - Required for upload if you install cordova-plugin-hockeyapp + var zipcmd=zip + ' -r "' + zipfile + '" "' + paths.dsymPath + '"'; + sh.exec(zipcmd); + // Upload - See http://support.hockeyapp.net/kb/api/api-apps + var curlString = curl + ' -F "status=2" -F "notify=0" -F "ipa=@' + paths.ipaPath + '" -F "dsym=@' + zipfile + '" -H "X-HockeyAppToken: ' + hockeyappApiToken + '" https://rink.hockeyapp.net/api/2/apps/' + hockeyappAppIdiOS + '/app_versions/upload'; + sh.exec(curlString); + sh.rm(zipfile); +}); + + +// Test JS +gulp.task("spec-clean", function () { + return del(paths.specOut + "/**/*"); +}) +gulp.task('spec-compile', ['spec-clean'], function () { + var tsConfig = ts({ + noImplicitAny: false, + noEmitOnError: true, + removeComments: false, + sourceMap: true, + target: "es5" + }); + return gulp.src([paths.specSources]) + .pipe(sourcemaps.init()) + .pipe(tsConfig) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest(paths.specOut)); +}) +var testFiles = ['www/lib/ionic/js/ionic.bundle.js', + 'node_modules/angular-mocks/angular-mocks.js', + 'spec-out/appFake.js', + 'www/scripts/appBundle.js', + 'spec-out/**/*spec.js']; +gulp.task('spec', ['spec-compile'], function () { + gulp.src(testFiles) + .pipe(jasmineBrowser.specRunner({ console: true })) + .pipe(jasmineBrowser.headless()); +}) +gulp.task('spec-browser', ['spec-compile'], function () { + gulp.src(testFiles) + .pipe(watch(testFiles)) + .pipe(jasmineBrowser.specRunner()) + .pipe(jasmineBrowser.server({ port: 8888 })); +}) \ No newline at end of file diff --git a/src/MCM.KidsIdApp/hooks/README.md b/src/MCM.KidsIdApp/hooks/README.md new file mode 100644 index 0000000..d2563ea --- /dev/null +++ b/src/MCM.KidsIdApp/hooks/README.md @@ -0,0 +1,83 @@ + +# Cordova Hooks + +This directory may contain scripts used to customize cordova commands. This +directory used to exist at `.cordova/hooks`, but has now been moved to the +project root. Any scripts you add to these directories will be executed before +and after the commands corresponding to the directory name. Useful for +integrating your own build systems or integrating with version control systems. + +__Remember__: Make your scripts executable. + +## Hook Directories +The following subdirectories will be used for hooks: + + after_build/ + after_compile/ + after_docs/ + after_emulate/ + after_platform_add/ + after_platform_rm/ + after_platform_ls/ + after_plugin_add/ + after_plugin_ls/ + after_plugin_rm/ + after_plugin_search/ + after_prepare/ + after_run/ + after_serve/ + before_build/ + before_compile/ + before_docs/ + before_emulate/ + before_platform_add/ + before_platform_rm/ + before_platform_ls/ + before_plugin_add/ + before_plugin_ls/ + before_plugin_rm/ + before_plugin_search/ + before_prepare/ + before_run/ + before_serve/ + pre_package/ <-- Windows 8 and Windows Phone only. + +## Script Interface + +All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables: + +* CORDOVA_VERSION - The version of the Cordova-CLI. +* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios). +* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer) +* CORDOVA_HOOK - Path to the hook that is being executed. +* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate) + +If a script returns a non-zero exit code, then the parent cordova command will be aborted. + + +## Writing hooks + +We highly recommend writting your hooks using Node.js so that they are +cross-platform. Some good examples are shown here: + +[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/) + diff --git a/src/MCM.KidsIdApp/hooks/after_prepare/010_add_platform_class.js b/src/MCM.KidsIdApp/hooks/after_prepare/010_add_platform_class.js new file mode 100755 index 0000000..bda3e41 --- /dev/null +++ b/src/MCM.KidsIdApp/hooks/after_prepare/010_add_platform_class.js @@ -0,0 +1,94 @@ +#!/usr/bin/env node + +// Add Platform Class +// v1.0 +// Automatically adds the platform class to the body tag +// after the `prepare` command. By placing the platform CSS classes +// directly in the HTML built for the platform, it speeds up +// rendering the correct layout/style for the specific platform +// instead of waiting for the JS to figure out the correct classes. + +var fs = require('fs'); +var path = require('path'); + +var rootdir = process.argv[2]; + +function addPlatformBodyTag(indexPath, platform) { + // add the platform class to the body tag + try { + var platformClass = 'platform-' + platform; + var cordovaClass = 'platform-cordova platform-webview'; + + var html = fs.readFileSync(indexPath, 'utf8'); + + var bodyTag = findBodyTag(html); + if(!bodyTag) return; // no opening body tag, something's wrong + + if(bodyTag.indexOf(platformClass) > -1) return; // already added + + var newBodyTag = bodyTag; + + var classAttr = findClassAttr(bodyTag); + if(classAttr) { + // body tag has existing class attribute, add the classname + var endingQuote = classAttr.substring(classAttr.length-1); + var newClassAttr = classAttr.substring(0, classAttr.length-1); + newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote; + newBodyTag = bodyTag.replace(classAttr, newClassAttr); + + } else { + // add class attribute to the body tag + newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">'); + } + + html = html.replace(bodyTag, newBodyTag); + + fs.writeFileSync(indexPath, html, 'utf8'); + + process.stdout.write('add to body class: ' + platformClass + '\n'); + } catch(e) { + process.stdout.write(e); + } +} + +function findBodyTag(html) { + // get the body tag + try{ + return html.match(/])(.*?)>/gi)[0]; + }catch(e){} +} + +function findClassAttr(bodyTag) { + // get the body tag's class attribute + try{ + return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0]; + }catch(e){} +} + +if (rootdir) { + + // go through each of the platform directories that have been prepared + var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []); + + for(var x=0; xm@Mk66Ir40l2cv4!h?yjyKd`^W&BlP z4B@ZryziosZuoNZGZs0O(!^@To(~CUVl#}Vc0RkJ!?u*IKBbttT3sVn!i8-OP5=XoT+&RpX>0=VMI>f<3!-L@N~iWD731qY-wB`ij3Ucjc0}H zav!bnqUgi7jJ|TrxpZ0-=!14QywkvUJG`e)nTmv8Yy-8@ZD4FGd))zapxCd3W@3i&*TJS`r*n% z94j-DyQ2XWrLCchM243hjvxg!yWzd#x-T37Fw)f4g~O45xe<05n%@!876H)?)8+L%Pk zJ7eNEl^>1#gU$HPH8FP^WyqowC*xkk_Jk584eB5^R6`M>a2bsP*;)1M$gQfXY|(wI zPhj=TS+z|$;ne_2ndACW^ubl}6`lBfF_kAFz zv+*s$9S^=rW#&}n1oC;znpgDo8yzP`+1u!)!0Bp@!NPPyUPaJ{?}Wxc zUnlsMZw4DiEL^gXEsDEkVHM|@*g>tUF2D}TZwFolknmq=4$SNhSXlT?v?A*)EiZ;S zbm!;2`pAv3H$q~IkB}scfAn4)aszf_6Ys*hrS(0*Kdx1>SMZ(3YHjhC<%~}M4GayI zwp^!m>mF8QuSEsFd6%(ICN!panY~s#-AtV{cX(FmW$~X9)<3TQxOpl8BoBzXWJzPr z4Kvzf+G}4KO%Vyz39K-4o5sMqH{Wb8$q8NG3S;vcWV0u3*p#}q4+4kw(s$UA^^y9X zPORXka>#rbHiETeor*hV5^u8z#9 ziAV`h*-sri=n9bHH3MlNNL1BBz*2hXj9Pr8#fi&qT`H4gCmWatw|OSguKe&c0N$`N zzj)*P=u`o?`Rpuqqq}|G-HQ`%bFhvF;A~n{eHV3gv*A#b|1k^PDj5@bVvSxe$2&{3^YJ%?-dtRE#yEF?8`xG1+_iGI3LR=Km#!g3Jb z`I`CL7sp~cz5%$@Iqym+18O(#J^L6@x?+==>s#uPT|blFVznh6RxV1^4)w@k{W%OpJoN#2YLM)Fk#}45wbfY8W>a5z zqq`nEx!jAF>&K1*qk2Ut721>7c||dYe04PKxXoGto}vE5o(B>M?z$LOsAo9eKH)Jf zfbK({EY-MegTHrvGs!u*5&KFJS*Hdm0DRn}hVgxNqW8 z(m!I-RoB3e*avm=W;zy`0)HQ<)$t7ajg_iW_vFOFwiZ0`uJ)j_l>}1> zH>wvL90~xV4NuV6z7*4$K5mdleBsYYg6;vc6Lf6OuLtl?@o8T6Kt3m^>RZnV^veZ4 zy|ADQ@j{%$e@lmo=xecK)0Ye=1?YH%ULu5rPylOe$(hEJTXp$$Kq{XM{f<>%sky5{ zXmis03*L6U^i-Yv3ifMTv)V+PRb?-UYH-eCRxoiuD9c9^9W4f4neEd@u^$MWAdZoN zrG9a!SN%Ll$hT2RA#{tCCDth$q)#E=L9!Erc)-p8SIRV5-)UpKd z9)n~vd!ziYB5)-bI06_tBI@EVOH4)?$D5ew>G`&4vV&tL4xNge^zGEsL1W*rh&6n= G0`c)-XJcpp literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/icon/drawable-hdpi-icon.png b/src/MCM.KidsIdApp/resources/android/icon/drawable-hdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9100934dac7ce92fd44c4c90aa50b1469d67c04 GIT binary patch literal 2875 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/icon/drawable-ldpi-icon.png b/src/MCM.KidsIdApp/resources/android/icon/drawable-ldpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..16cd5dba33faeda3f256eaba98fab310ba722778 GIT binary patch literal 1155 zcmV-}1bq96P)+IR_U)hrQpZkgDu!*Y1Zm{gYI7jmFJso)@ zrJhpSIcJQCT^2&nO&3ng=8}n@yMP6}E;Gi0N2tfYeOclG^^c7fYhA5WjIel$wtlbT zqOcSks?rVs7~oD4r4$m*`<}Iy%6h#qjahSVIu-A=Qq^p2K91GdP`$s_A8-A|jiumF zrI9WGzyQlA87_o4kRyRmk1&zfSl2vE)}cQ%zkUw$B3jomjl@P50APS=316)O+=NI~ z#JovLb*=an#ZrZzfA^pMa=XerTpl`E0!nzikiY;lq}0JWhQ~|@d0R}Js#cIpH{tEj zZL5e+$Sq#hhSGWhV7Nscf4p?BFWs9fcQIBHXQ!AjhS5~LA30%nUa}GE7Rv^VXmR@2 z{`1oBOO0Nsq^nCz7U>Knr%_Gv-yz16;d~goUq&^0gvg3^L?(>8I=me)gq9|iL$WkK zF+USlRW$`CvtYo|YKO8`AI6@=LyU!Qx;n+qMt-#qIgymsB9J68W7DHLXDK+=c^c`E zEO5>@Ly%0i+y@9BiOJ4o-foxS;>MvuXbiwW5J6d1vSD*N6qTdk$w|`WArG{WA0kV2 z-yiB$SO!Z;!NM?I1aY_ZlZ7H6#3(pa(W47Me^^66aI97rOawL*ia9mDY8SEcIv8iAwk1Z)q;*k!`I-!xu zcv_67JMn3x3ji>{-Zujw5FQAjg&YZlo-J13NI6ApDPrF_jp3vlA1fGxc4Q`sR@Omxt6xk5Fbg^|vYY>sIQ!?$kfBsd<33sR!TQ)P-#7>FJwV zj;q_Rjw^!0(s9L^bmX|w-NzNQ`M5giAXXd1>u>m1(*zk1S$w$>V*fe z3}HAVP*FYdDtA3mXU}?-11uyAha~AfB^JKCqz<0*lFASUG8`W&2u1A0UcXfkB(xBA zh@JFd;ZORoh);Z2!ZC~hPkdbsDfuBEf?f>wZ`!BPG Vw>q6-My3D&002ovPDHLkV1m}399{qb literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/icon/drawable-mdpi-icon.png b/src/MCM.KidsIdApp/resources/android/icon/drawable-mdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..64a6cbc52de2a6cad2d8a0f23c19ede85d62b7a5 GIT binary patch literal 1802 zcmV+l2le=gP)JE*h*^4PMX*bY*~&inY1Kw$-T_7A30)8&}?j= zT?~lb*)wyFW^Wp0c^+eQb@SC%oAcf}*Y(6$NvvX3mDXc)7~(Tqh@iP7*qJV@9s8yOy#CnXC{h=rHU>u z+(lxKFT?wbI6iS09fmlW0sss!A-QID0}VQ+j4=qH&tSwS1j&s_lGHa1Z?Ay?pTh1_UzVSd_Rlp@}4CF01Pl81h#qlO(a69%c7o*AYByHa1rPrh1&K6IXw#sGBxNQHIu3QH1?M( zraUP14;>TVb1IAw0tqL{;kg8%a&j_{K_bfpou1!rh5Bbfg-es~x+z zLD~qh?bNFe;oFyP`-o!uM{f*Nz4JRPh!&&RvUvQC4XdTnv!=6L;4_D@5yG-#qutlj;Bl>Ws*I5-C_^~Dq8y@J@1 z*jEH;Kh5O3S2>!f(>Ghrh3Y{S`twwN`w&!|?s1XW+j_JhQr{FsNn2+bMyDQH8$uo4 zJ1!xx4NRH~b=o@<_7lhDUj^CrElcyrafqGs*&a^9Hk;aqz_kuH9@WaW#TszLiK^z_ z54x#uFBHyHr#%{b=o-;O$6hl&+m~t5xiDHya1f)de}4{Li~!2^#^Xx}TDun*4I=3D z_uN*9OjMZXCb;74Iy~L8hLX80M07kaKvU$Z9OrIw%it9bG3_+9nYQAU}u6|jcye)p%E}rk# z?-xdgAx@?MG)eq?z90}ajCwgCf(}xs5uo?=X2~SD#mYZz3K-+y{bt!V&9?;d$8r2| zC;W90m!>kdy2%_yhapa;0009FanS_c&8b9?LM@@QhZ?_ob7c3Yaqwk8J6l+PCGekj z@~ugLp66+?ii>r1kvNPFL!3;#n0R1-2_caE-f*W?;C8UdELki z?DwMx*>YW6E#-P0u_UW5Q-{%MJQY*i#aj~(m=NolQ)Y&D(+<(i4=dBTlB!1Pm}C1QK1>ID|n8sPm!~qzlP5+?v?I^=i($ zR@*-w7i8Uf9)6?8Zg9d_(9pdhFbun|-?7u5K3{ij&3 zMCWde)#8z|uEucnaoKRZIZ#@XFYWi!G(DQ8T_*+%Fd+mIPLetm8GR>z!wxk9=pg2Q z5QKd?`@1>wX=xaY!T9(8Jc1r~^{59u?IsLSaHr9iw_EU+r3nD1YOC3in*YuFgMK1Uj3n`n#~=r|0aW24Z4OYMFkbkN7amd)$& zaeILdjO3vs1+HZPuE1FeT#Ydv&)`~X9$fSEqfVk9O-DaUNz;!MK{E;g&w_2$nk8sv z1AfMfxJVMTJcVsxqL}8}<|%9`D)jK8naWVuB*~Yi$Jn`*gkWVlSg5N=O!DI~Nbce> zNPG<9M#rF{{6=Ij2JxsrOg9F#KgS>u4@iPBC_5+y8U=rLBA~%=P~jvehOX-B#uBB33L?(9OFhX zh^~V1e$})Y!3r&5b-@Z#7&PI*3MC9ENIm{vL(;>Pe;(^9vFJ%OR}eih;sygSwyaFyXQWMT?wNODEVw$;H*j-i&yP2y6l8FFp s0c6XUQvQ1RLIhkQ@{iV2q%XmI13E<~2UyF)asU7T07*qoM6N<$g3Y%^s{jB1 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/icon/drawable-xhdpi-icon.png b/src/MCM.KidsIdApp/resources/android/icon/drawable-xhdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1605f695fa85116686adfcc5bb760879c6b40dd8 GIT binary patch literal 4317 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 LNkvXXu0mjfw_ymi literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/icon/drawable-xxhdpi-icon.png b/src/MCM.KidsIdApp/resources/android/icon/drawable-xxhdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..56fb29e64e62d8afc5488de5f4ab6119becc6901 GIT binary patch literal 7793 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/icon/drawable-xxxhdpi-icon.png b/src/MCM.KidsIdApp/resources/android/icon/drawable-xxxhdpi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a915254b11c257a9803d2e543b9f8358911e1e GIT binary patch literal 11783 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 W@l9$|DDsyn;FzhUNgmNX`u_mu$}1uO literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/splash/drawable-land-ldpi-screen.png b/src/MCM.KidsIdApp/resources/android/splash/drawable-land-ldpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..7dceec7b7839e6dff6dca211af6e54d696ca7762 GIT binary patch literal 3740 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/splash/drawable-land-xhdpi-screen.png b/src/MCM.KidsIdApp/resources/android/splash/drawable-land-xhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..39ae00c33dd22b801a78f305bcdb99f9ec7a5a44 GIT binary patch literal 39781 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

3=x{ezq7jw-I=cPA2mnpHJi zlY+eNL_W#@ZhrSL$k_-)YuT>Bs=e65t-xlaxD7>Wf>wl}B```O9)h}!qH2+No3F>< zGEp3Jgka=sF0FREifM{|#YkEqv6!3d4TAg#=k+P56CbT@fp(-D(i!{)o9K(q4Ueh{pwER#SUV%&3tOR z-!CsVT9WDNR*}Kon_q_T5#N+1v_A%ZoNYUN{~Dqg)i?5S<{ICamSB0BMa#~u%RgTe zrB5*{Q+LJWcX-0gSNzc>w4uKte5`iTMbGty1kaE6r{5pP?|RjkH!p=<(%Jrl-A(q{pjG))#3e=>2gY^-jM%(dl3wxqV_ws1qm97peaT zFEExgZMw`ITrHbY3$reBy`|z;>oOMhtEE>qL+Hze@KtZ>uJi2LhOM|(t-}FhJU!y?wRJE~ z2bD`#rv=WE9i}Pl!mmy{+t3^UtOsCNI_FvPQ?|NF-gws)W9_}Ym_rH0E**6r)FoHn zt7$4nn)!?!`v|!MFfN6h$u0C~CQ)RgFMXmxvUr zKU>nuUl(>cAl~8yH<>({b_xaM(OQ(}X!rXo8-bXaBp+7K zmjf{0qocR$!y`1$q`+?8=w6s4-*9b;O^*h&w(fN$FYO2I>MoFu@*gvCS-A7g$z8!Y z>bYKo;ib!Z%jPO9)$s7~D;3cwQv;iB`8y@F(SGQcS9y0!AP+blaa#ilip*`O3^gps zS10*>U)-lKDJbHY$+uCqpMS3SM@Zt~fmbvXCBo+L>50#jZbr+qtw)XDg%hUGp{PDr zYX$bZgPZ-v__KMmX>qzbC63y3kDKHZCl9}GIrIGqospD?x?Q2eHd(#aqx>^!EwQpSmWX-AnDp+Bd^CqQR3^v*RID9lO^B1*u2^~A%}k`nrrh_zCm*gccj<-MgBXuCisqKjb>1P~)}lChO*n#`Q60GOv-z1$`RV3pPVJAzN0 zkW|>JO=a&YNxGdCWQ86UC!)1tj~M`2`!}wcbX4r|BiV6E+g` zg;HEcKK|00+&omrrdYS;pKl1IrB+eF`o!3l3CVhQQujDTZ)hZn-BC@Zue(9(@ynf( z+R(lv3#&1&a{>dXzL=iP21RSlrV@*voRbmO7Z^L@^tx-ONW#~LnvQ(hn45u^7z;^^bOY8I=(~$@Av3tGo8os4~fs- zfbpF;qx<~|q4+*PBNX(NX{~(rS&cpInv`Ln!B@!wI2#c4hRWWyS9R=hfo)BpR-?J{ z)Dxh(A{kuVhNiuE?FO1C7O@qGfU;BVA_+SJ2w4rJrBMGc?K7?5WO!C={eaYOsNEEq z|B5f3>tvlc*T1`C{NfqRMFqGF|2X3sQ7aPTh`6J{*AIuv1vze9e)WiE zAyZu07?w}}RnwA{{KePLams&|yr*FN(o$cUaD7{gNXm66Cv(l-cj+`t@t>J46@VrZ zaoItEzvJoOF^9hU9@g0NA*O{(q8_1d(3bbpg8P)9egF0AnFi6j-B(EA7CXI%QIp|- zx7nSd?T_kmzR@6zev05yJ%q64XW=W2-mg0|IRv$P#f|Wjk}YzFUzb>)(b!XX-5^dr z*;z}Bw=bAq%@gkt@S%3^0BLqAryFJHWRvVY^sMoR57n%~f-je3Tm$epXOusno#=izW3Buc=l%_6A^`Mt|P|g zXRs%t>sXh)%X6ni8u2iL(Mnz*Fp9IZ<`i zN)YeR7j}zods4eqx3smw3pNd}j~%@7^^?q}f+)n89fTMt-`w8aVg(MUf2+^DovkiR zmqZGc{6p;+tcnfu<7jKdW0uq47D1$g>t+P58XAfyv5%p;rVuq{p^dPU44?CpyyEdR zRz585J3!zh&>D;;N>w-=26&O@hNjEEtLuEkbS#(t09l8-XS4Yi?k7!wao#a)FL0#f z9*XHk+}StMq~wU7CZA$eXEMc7QJ$$PwHqpZ6EKR#WE)8&q7`*iM~r2ay$ zaTy*ozB+qpb%Xb%K^`s#OGuUEEd>!p`0X3r&i>brXOd{anS!vI8e2j;^*kz{|C4h^ z%9A%2ftl%|_0B4J1CB**(X|}^pfvWIM$>sroxO*7iQ}J`0fU@VmXc8JQhup`H9$?* z`_ouj)+Q>V^L8T0`8$G;nIxfc&cjJ8*^!4_;PMQtxhd;?#6Z@ttv_lu-39hb4nDU; z<^WFRT%^0A`yB#UnRvs#!9c&>7-p{g?PStSP5 zfA!90Q%@Up1+xs-kDH$izI<_A5F&={g+xRWGLwp(U{DyMI_ZlXNke3Q`qJ@u{^=sk zl^vStiEVSbIy%U~qvHEzXJ}yd(wO!`?@~ZcLFJ-ld?JiC>_EX*#a-5)t`ICx*VxlO zfUvm4UN-=GP=xCzT=M-+LRFlIr3{X$4ltOY#+Uc?K&d>Zq2$}7qL;$Ueev`6wr|d* zTFAgxZ%?kwrm+8*kSj0rjOJgOkbo`dW&WBvd8BR|EVkf-Bw4W4#Z+Jneg=6vX1L}* zniQrN$rN%~OzAS@8_ekLvWH=FO%Yb9^9{mtS3TDMtevvuybLmcO$%jGIVL)C;XWTB z>8-k^-TOV*O+bGg78h~L%94h((WU!x+;bUfJ7yBgtBbK?57bkA8*y`f(11SH$nTcDX&aCUUKQ*ON!&?j~z9 zdZnk9wiSvkObj{>gXu}YCV{1AWv! z`8ba@GxobYXqxRNed&;b?T zSGu#6KwV{fL!ZgqDi`AyNjd0%mx8}CU%8P~ski8z>il7OT+bE+yy`XxAu0=SQg@EL z5BZbukbtns2;#uvzL`V)q0qiMNsA&uuRYlK#dM)u64zWhadpr=pD#_1+P-f$NHtD= z+?%UP1csE&q{IM@z>UTcpI5VHd}-R*5;<_HlOA}~w*utCO#Mdvxk3nAASdPh| zg>$5*&>EJK_J=wn9(Eej=-V1I6ZI_C`9_L!0wq+YF8uA>x_6!b0b8CM9*>$Tk`Zw6 zd`3vSHmF|k(H_ge9eH32u+ppC*$-HOX3k|s>La1BufpQMKRq2zD6ytT%^pvaD5HFy zurSeiJ127Yjc}+7nqKqPKP~|mUmOS+N?hV*Y6`*Gv8-!cNR%pI6Aa54L>nhtXe$(R z9ECsR?7-UW=#2%kIq>U{X(QD;1r<1yJ}mkwWQc!&Q&h?dL~K5xVo zNmQs-hiIgo`I?o9h@%V`)V;|wZl3bl-Zp&Al&y~|eC+~Mor3d%yN*C!Ajy1=o4d98 z=C2FHKT_ZJOY1b#`(OqxPR_+>DImJkTHVl#Xu#W@bvtWd-@W2<9W-~9fp!FM;rnt# z^@m39p}U8WN@vXXDf(1_d$O)Z#C;$_cMIhk?nIu97dR<~8R)m+NXKQr&rAAJq&NKT zLw`-04=q%DRc?h+UASDa+KxPb#pDBN?fZUco{u1#c<|pP9{KB{@-C8f?Rmw`>=^@S zmONz1G0PuAUhFa3v>Xc4v|_o5zT7B4d^8#HSeD<{Xv+W4ReqRBzV)35tF!YgHwTNW zH1s>_@;N%7?Zd>hMvOGkh9s`#QcbDZX(! zpvw>%)RItt7%RBp^Y?t4M{P5YdZV!I{_#1Ic&fWw7>Bm6V5nHV9V68guK^kpSdeE( zGfz}vs=2WiW=L;uQ1Jtm>32}?=nV)=g-v>jgU&j2^quj_=2J(cI1kiV6nP7SRe}X8 zNe2^R>OrsXN;XgS6I;pf1|4GNE1WlcbQb!RP+0|)zX4pKjHv3`NLJm)apBLiXf6% zWX0+(v3EcXKK!zoO;yl>JpAnp+ufd-D+MHbUk)wCzGt`~(%{YpeJYpt4n#`I&b9}X zJntc1$2htF4MO1-u9N3(l17V|mXCJ^O1@6&^)hr#D+8;a{ zR#l(mh`lOLW%jJyMz5B1`{uM1wNgAT;j5}eC)E!n$Tw&_bAgurj&ZpY?j7C(XfrCZ zXXcqc{GpK(;Czn;V!@{=WD7k`jpPlemScKiPp-{aTvB zkqsL2WZPMX3_ZNNN;1+g)cf%L^7GKW~bZ= z|6Fe@3In)Hr4xxSi#mMiqagB#x5Rx80`Z&7{r}W4bcx)O*VG5|i7$@RiIRJU>bo{` zJS~%IYC!ohVPOXK-?uQC&reclP!;3l|H}@V1G=hVuL&`=?=C=f)d{DV@W?%n331#y z5F+;Pggj*?%4I)+NG?OsU6{nc32Rd{m>)Y|_7ViY7jP=- zX;6Diyj|3BY};vedCL57@x=01VuG(dZqBzN~NT5b>!{x=vuCbTvOEsw)| zQsb|HflpZ=4Qr;DGPD8HY_KYgU--WE-Vknxh~c=z&FRC<%yhQL0aV1V)`<6z^*gES zL9&lHH4^unwhcvuPA6%zs$4?4=L24)&1H{0XUmxuzp3Khu}MbQeU>Y%H)Ik40s(}m zjg4qrI0*&E$6DNxbYb5hY@R^4GE^T@=SV*X`?QYKK`%Q33#09mPaw`FX*0N&wOPlS z;QwBX0!$0=8jqdP2Cs3in{A;c&8Iro)HKd#GwPumsG{{oX6jMHYdI?q5&3)d7# zDzx`)ieWbF&L(QJlB|VpH1>h&dd?BU(F;sQd-utp%vUXakg%hZebAN&)3Ptk9S>l9 zdPbQcd(NFb&*I}ANTmddIIgJyQo43H2OtDZ%`Lh^R__I$q%-Ns1*FJ7M}Ri}p~?{t ziAQosSq!9|h-#;-xaLfETGld_MF{3)T_^?rQZil&h{{1ZoMZg5wc{F{Qw^3Q4RCkh zy4to6zcB*FPID)Xl*Apc!`h44y~`190^$=A$|RwRLl0SJX%buJ==9t z*DQelks~IK{0F98lHru=nbaSelk!Wpf1 zr#!J^fU&Fw;?or3V+g!kzLG?ZjEBLN8~r9|U|DN9HVKED3oPe?Ajto}AgJJiK~765 z$8YfA3{2AbO+-x`aZY0oUB{^d5#HVeMz;b!Yz?BTR7IVdYhX~FrhQGj>Pxr68T4w_ zL0$+=lm_HkrqU135lvz_sy(+t&h5nIc3^hHnWDE0#dkhofld*7ZD+}bqqn?6B94X6 zv4lw#@AB%k(xH!9_r~*>xiMV|+pfaN1aO%i7jnoaS$niP1Rto}99aO_DyhXEBJ@6U zzaSU$P0O4q^@a=BGdHW`FBmlC!q__aOMC$QTPO6&+jyz%qCIDwu)e`{o!H#zs6qQ3 z$tdx9zE=3g1Q_+)d$o-Mg0euFO~rtB43X}y6q8SsZeBgsSNdq&|664KLLvS)+qq6H zgls04kCw)3)GW#HYvj(-tdDArv3H>f9!BsCeGMt|0JKAuIGv=7i+=f{h;4b8P8_V)r?2TAP<` zF%PkDc8E*EB7_~nRXlssvW6%~sB%H)J0toX)D~DEe>#D<1Hd_pmZChTu=4XuQC)#? z-GFg%|S6ZqCvN8PnYO%#U5kJIO-T*T=Iz+~(TV_1&EnkYQ$E(ggVz_d>>a z|M_sRP%X;4nD6x)HM_C>0nK-3_bXy0lsW)m5A5TBd@7rnJ*^|KbeucDKEf~KZF3j(H2}=Q&eq)!#Q*m-k0=)Rs3>MX zFiJJ$5bCnM;BJ7=vHtSo$ykYQ~F~LoB)~T{`}HfI4!T95=aC zy>r3^$!Kg7&NVcdQ&8XhVB|5VxbA5cm491AHNQ!Bt1e zdrLX0fCM_X)WE!^m5_}s&8WGyfo6iQ79fTn;15Wu1;9S2O28BsloSx~wx4EWmmx~3 z*cmjqRM|wBTLm(|JVe3PFtg{hIY$GO9tCUirdd z81dT0Gt^>Pi?RN^#EMn}}P~Km|aqiH-D>o@aEZrF2xS*xuURV=H&6rG%CnxT| z`5*GqoQt#Z&IjXT9QC8`opBqv(j~v8#Cg0<{L8QADkulUZg9Ur^QK&A+52v)EUpez zyy(KDWEvVw;O|8t6P)uf9O;WUp&u^0p8~HK455zoVr&nBx$%o6s&ca%AIRij{p*c&>VZ#eqynf!T1VdH(!dS~F| zoxc*C6^MvZ?o{KHtrOzWqvAV9sgOHC7O~bdACBFa?b93N(lyAVyQ5>GVsoIoHfXul zw?q3X^jeG1S-3r3X;p=euiRf&iYF%px2kdDq)HQq{`5OY`ke}Pv`H4}Zz5lL=`3>i z@i+Se{JZN^6{I{u=P}=|uo^AUGk;*Ci?y|A+T6=>obm4ORI{NKRP7qUBQp2*nW+l2 zq{6a4LXrNXzaF;rF1*V&?XjxY)fq7rFPrZATg}FZR?3J3f2fnVuc}ys@Qy~TWNj6r zrMx!sUF^0_ZIpaN&}&RI@xyfE?lQvVd3beb9({UEeJlFhCR@LwjWy@OWjLa7;nG?v z?D^d@5T<`YXLqTVUde%t9G%(c%1K(SQZDT zo#)93A|D`oG(a624G&|R55t-$v4m59m9T+4{8Hc8*5J5`g4~!gYZX5)j6#ZuK$H-5v@-@|XUa_`mhi0p8zw`_C;6 zSWQ!9K|MLS7ghB&&=!fx?Q5Ms6UD(SM0C+m$d^-akpL;W>Ve@Wl*XT593>%pLREir zCh#~A{5*13I0q(Ne>qr*CG3Ik=r@!3S--|NM4I(xI52Nh{)PFaq2J5SAw2ShiUW^0 zmO~DDNK+~Q+DfpSFc3eCzGZ4NZc3Zg^`#D^YGa24SxFdsutPEu3Hq#3TK)lrUdmA% zKI#wpikH{lij>4sgg$_$p<2U+oJs`NIMJ29wPDbI013W3H`n08nX!HhyRCVJ;Dj*~nuV zcAh)-f+V;epo?x7%bpu8rnu2jbXgbXD`{yd|8;YhC0Pf9=>dmIeGHroxUh#l^o)5h zgIZ{ArxE=9RGc0rcN8&^IOCslMf=7)nU=h)$67|))N}!qEQbTTq;SbMRmIQuJA4V6 zMDA?f~a~_EV#Z7kZQDUDzYg+(t@|hM0c;VORoAFI9?r z&tE|Im=hOYWPyk&L;74G5RPr?**<=j*)pb$9}^s2I>c9yO9br?E2dHJdz-=NNMrow z7zS@+9P5!qw0@jpP+k6bKNgp9``!~~zHjhV20Pfq4FVyJKh(9N#eEmu@?YL|h&biI z;88Ciff-&?%QK`doOUG1B9HW1q;;dmxkFd}jCKDWf&*JlyXfQ-p)BBapm9u`4L=mA zYFT8(GI_S{_vhF<`Cd+y_jxL54d&;Ei696!-OzL!c+gl`z!K)iZ6vE#v>J~U;j)`n z1hEjTyiteY4aGLe+jRj0e_8P%p9F|}Ly;;=w*;k?*d~0gj@_ ztnFt5;0CYhbH`wsP5_?;DY!tM;B0W8q`m=DdNA0byX)shUPO&tFXmKKjrCDx{C%x~ zvT-d*kG1qv$By4V5IJi+U}gG$ZXw-1)9=g{=ctvawHMP9$KZe|o0$6(ObI`svF9HB zm%3`IN~pJAzKK*m$;?LQ6OZUCoo^o|h2bc5VqB!)jrZn*hHJP*4r4 ziy~Qv^Y=;AWkaRMs;0%^r)PhqE zL1~f|kM=X4D>Bwj8D)pyKeVi75!?j5^$SiVG_T1V%P#O0so66@2UzYLx#O8dEqmvM zT8Wi!n6QFFnS#i`_!M3>2%W6K4EWQkuIrAmL;W$a*X3c_-&7Y-?y`nnkC_4X8Ik1) zAV)1NSzlZC58qm{g?s_S>YKt+ramvYk`*7ArGw{2Ln?kv^N_keox&Fa(o7gRQdE_zk5`9o&G?+5DqM{T`L-3XSDJ!9;63bM}`jy3+be?##H z#B)1a2kHh4K^S;S#1UX8&9bTC9eu6MgtM&g0pe{=rm7UsZlmY$)?Z;9nyse$SfOQO z1*+XkUZ9e9j>@og)UrFZuS6~GaXSj8*{Pd++B8nGB9#J-WUfFi4L#KT*fP9&`V=?< z($0qmti$@R)5FBT`Q6mEaYVme6vO^<`jyaf0=D$mAHb^vmt=oXfN4y7$5crx_uwS$ z%b*(jH1_hD-;iwCr^H$qp$LBzTtL_|?%p0(iFZA%NOiId|D-|l)aNg}`I4?m^;Ct-R+ZaHpvb2K$O0R0V`w-OiApQgqbQ-)o zY`sBP#KwdC=UqO--otc*aF4P2A5_tQ7LiLb_^Ph`E|#^#r(8gH7vM4z9{+$ymPsDu z57H3p?L?av=du76AcYd^`I?zb5^AXGf3ezg%(dVe2VwT|JKQnfuC^3HlXE=rT;L)@ z3MX*bom0d7_pV$8?f|x`SKDPZAGEb@BN1>aDnjGAHp6m$iEP;g^5;CdD9%qFi<{+7 z75KEx`wB}#l>F0VzijtK9&Bs?UjzOxn7V)i1G6yCH*w4;IvX%svpe5+ThD8SM_7No zD(RS~FURq*jT?XhRmDEDv1$eg2xN_#wGYkVR2slH;#|ZL+!lUZ`RK-U4!vJvo|=6TN)K?H?yP@ zGJje;)`ZWJ6ZLlY7~`vATl9%WC${bzieYVVFvUH6+#tkF3T6eyc=YOi-Q9!dbf(Xa zS!^H1&L_0EeVxArru2EP)6LI=xW72$9phwtK1~`_7Yg_eu^>pd`Pa)Fd9ZT|;NY16 zO_StR%k?9m?5hM=%;%ru9P{8mP~mI!X0{;Q0Q0C=r;3eAdQrLXmS^R(>4-KlKM`Gd zOC;mD1MEtt*?;L|{HpgWq9$uy{UuMyL(tmQq}!Q-A$R>x-2#4?4;X^%{HPq#>nY)y z1a2r#5V_*BE(C2F{}&h-!u8|LBG`|@k9V4>u%y|7`ny#opghW7;2@KKUj<+I>-;a5xn@gyGzz%ozcl7gAu(dk0;q&FD$R9+RU@H+HXoQ}@fp`(sO zru=??Dr4fqTXDFT77rzw*`cNEn%W~bA&S+?X27%Rekwd40gI#-eWPyaPtRu|vW6^`5i z6gGrhS1k;13a)yL2s}$!9{lh3DTfG27N&dn7{}@=dJ@oLd$4#)$FNp52Q#igAcYsU z_8t9V_%)Bq$7@c$;j|Ib9?Wydm+iS28}m#3uKS?teI0Mf5_yi42c}q?=Ht$r8g&#a zMTN0+5Tk*~TgVVl-4RT%cmlb+#5u-k=}V!d*DL`H?58k^G1{2npA95aUyT{!6drQ> zcx5Ih1@OTZ1dt~QL)=VHXn{0CLR-g!O0NnH=fS@Ww3;uxZt1qx5LtHV+@>!9B?M(Y zgnmakOP0Gke*%tWn6vY#)B9>j_vIm|i6`XEeb(U-P!GTswJDxier$SU^;BPBWeLp3=u_XO=KCWOZo}mpUK?HkB+9hA_ z{=58>T~z`p`>kQ&Qa&;Wu=NZO`pk>!eSjZ#JBwwwZ2K@sP_5@A;VtG14RXB4q9W2I zdi*LIDQPN2kr=%lF~y0ilrwLL+Pj5X!F%6(?piI6_3G+^=pxA`9VM;nDvQ<2LP zan~<-zB{GEr?{In@z-H@gRZixU$u4Xa=HF^;cT9x2k;Sdd691Jk$N;6|97LA!xN0?fuUo9!6{)sk&-_9Wbws zINnIk)CuB9?<{;%{MZY9^-Q%j-C1w192`XNhHjuFgWXl!HkxP^P`HnZPT}2k}KKz4TePzqpH&}g4 zqGA8?f-}$AhQEMiBwjqPT`31aAAkm$`ge(`)IFK6lx z&U|>Qq;tm{zsSfZ9Q$F+L)-ChEtG&$*Bq_AC}9=W%{Rox(0sSL*ORI|ALCF`tEyA} zF7#pCD;wEw;dY@8VqCpY&a~78=FE+16Y)oLqlX|^Kt|c61F>Ae*E&&8(%2p2{dqSA zgAZJYrp|;U9+N`T+)0w@qX#FwcI3z8Zu1hUdMd1hw{BB~|^Czi6QJbH(QzNbHU zQtAVBJaxIG9(v1va`%Fxzx z!|OZ)xJSm1axlWPbXAKk`F^ujbL6})bFL2#XY;{1?_JWczIGbvL4Cukz%pr&iHgol z06xbM*ZVt>X8{dECBtF#CqTF}x!R487$#MwJf25A*fGxLwM-StG#?r47rc7zhUq6T zUFn%*@MXr8BTIPtoc)i9N{JF_pfCBEYYXxhq%NGiU)&+tDuz3DyNLBBdX7Hk?w@GudQootwe6q3vK-JiSg&| z{M!8Mus-!6#lpaeXDC8H*%`1utDh`aBx*Z+$ukIMAne%yH|MKZA8g^7DAN)_6_!e{ z1yc^eB;((43jS-aF2}Yy6BsAo{!wO%1H&UR^4HPXA!Ic7IWc*FXN+-gQuxo!Z|)y5 ze~piq^0tpZ9n2l}i@78_S5pvmIl)(sSn3;3b7CR5R|qgg0_LE3V~)f2650YJ>(t6I zcT0l4ue!K;APtjKTL=>+Z8j4VGJbM3pTI)=SQm2L4*l$3w@mPu- zo32t_Eq&@}y|Y^!9Ng+TQ+}`!wos2-+9|BeEtNc=dgq6=f3E;ssW9iox7T;;F?e=`+m>#&1 z0edBXo@Y@RglD>UzFLjd!UT2c$Gf4t6S8hEF6(hC{6S<)|m2A~5>T zEu=|5D^GkUs*4Ysy!Bosbf1uUPsMAodFBQ=6u{2ifGx+1hJrhHtXi;clhqZ=;;O!g zJ*2Y#HPro)R1`fJR| zC~wY>%6zUJ8G3K6QkccA(323HvIolxGOBqVKutF=-aEaT*p7~FV^H=)HV$zyVFlhSmjo0aq-)!Ek{&URet86BnhG@$$y$yrYG3i!4jSc7s#DYdtcS z!cDGA-k!85YNGAa5)br{g?mYc7c4533rU^lA{4S`l{N^n)x9SkKv>*8%yhhP1CSd- z;4WDOv2HZT_FT(H#q+>6;E0ULAB<(sm)%x9$Iielf}%*DDm2zDUp&Y zs!+%fW?pTKq%!}`Wu#fG`$A)y-+cIN$kwR-ka<73V>66fze8$0Z{+y^l-{3SzE2g= z^=fpR>E!oCL)PZLFPB9YnkhBf{>NjaD1I@vp7Y4|moLM(fiGt&fG*h!B(g=V}rLuu6muGB@@j zQgT$58AHGN8L)qtb3>&7%z`V&%!fbIN$uyURP~dSs05#LtjQO>a|(gEd-pV`__rLw zwwL52De!)wG`!JlS5M*_R5xB~*mw11l9?d}%$n?mxfApapvjw7KGlana3`&56~XfH z-j!&U$uq~WL6@aIydGB0na=ytB#{7$$x|hUX@gqX)zcYBWQ}M{&Eq%zErZ*>rRR;l zHom7;SZ57*w@T~1eeg&6zZLzWZqeyW8> zTg6x8CZTF`>L-dWjWRj*pt{YQFY0kAt?^bM@(- z2(#7szgpN-VNM4;jkT^&00P5emIpl#^k-Q3)%-C366=~D8QH&+q2z{XokEB#zcveI z_&VjU#Fn?vK6h0gQ`uAcJ-ue)SuSs8TgrJIw2DK9(3(ZpD@k~!v~7Z)gZzP$_6%hkV>ZfpXbWKdGWHi-uy20 z`=z}o)1*Xe3hCyy2w+(zuLvQ9ZZeGXF8SpWh#}~X2sa6EL!sgiQ+X?@SJ*C|(k~zp zr&McvV^h+1DwUN|!j`5G7AXCWr?G4rI2^IzI25qdz|G{5#Ofifpfua>^>GQvnXW4E z(YLAnFh!Ao_Obiv(PTzr<2;#>AM}nU8Pu3)+#Y2*@vhp5KCJh{<$V&xVoiwS8Vuoo z%A2)aNbCSV{8%lMhHemx$$3rOi_K0Szcw`l9OET}c>k11_V)Ts#AM)C$2-bjEX_&D zQ5i~efLrD3~1s@PPOImQP3xO*Hm=^)h_tc?UFD6H))9&7A;iUWNJ_}J6kc%Wh^7L<6rnOhZp{SUbe608S)Q1OyQw*bXV)tTi z&3Y+Is(h6rmkBvGCnV^_<9B~@l79e7L*`5E)PAY=Azzd87!o4O>k3JKvZ=;W6`cAV zzw}iu^mE7%zpyc_WOa*{m6hSx9$ogBoY!`H7cRXzQgu;`h%#xf$V-p*QZ+%-lo9@14f+<3#pE4&IKuaE*4c`iLTH?YLK#K3t!Dcw`ShmQFQ z46EHc2t5J6h6fzrhxiZhqoq?=`s=qNZkyy~`b+iHm$|!VcM@55Z0iOZ-=umSI(kCm zZ06S^S4eL*FMMRhaDBMPaWEZz{v>o#0DPSDR@QOo_H7nX%w5K@2@NiS@1XjmTFUMw zHPT&nVB7o2(eaW@kKC4ktXTxxX-+)8JiRZAon=HfGP_OaD zlOUgr-s3vs;X6gllc>&KuCOg41;|aa_>19029~?HuQavnQW}yZD=bV4HVCWj}v*r{#v7#|=&*vEq(SaAY-|M|46m zgENDAh(N1UnDo_xpXcRu*PrImbL2!E>DR|T(25>m85RRJ;-bNaVJMkP1)w}5;^OGA zhVq!@3X&I^^wa4il_q?r{luJB)X8vOMw+S3)KalxVKj~u#3!O?)7CpN6EV>)xyMI8)eQ(CA=Y`r^TxVZ-0zA z7Y&IDCuv33onf+oWFe4+2fk>%#~h@yKD_=%>Wk@m_(s@VQ~~29kY2a{{L=jUBoitA zK9bt#r z*d+LB*St23aM-ARpC)^P;poy~EcJnC$@(<><-@sS-ppCMz+y750fyD}W9JHC`*3V5 z_?(wkrj_Z{b=EUc?G<8?r;gcj?j8-dw|d_mvOb8>SUrCpr7Ck?4igDO2wdd@d}v_P zfJX$jZPe@>q)uo5 zY?=SomkKP+!eQ)4V zdeSy=%=!-a2-h!@vhkJj^g}r( z1xBi-2A;2N@r`6Z=6RLG$Tr_nP0Zc-h`Iho%<2QVZC#zNv(u4N0?Te2PT`Mgt~j)R zHob?lLtHL+k(qSj15r~7LTMf+JugYysxCBqvU>oYx_kHB-!#Pvw;~*#-R-pu+M3$l zerp;x_3_AokR1EdRQQU0>iV{an#C~@$1VP9-ruTfDqeIkus zi6R!Cj2|v@Z}9x z1qA`D;I{M|OULvA-tOR!&RV5jb+i>tPsHVcUpqHD)$iEHJVne{JvV!vITxPse`LLN zRFqpAHa-julF}&+(hMoBw3IZ`f4sRlN@whqBp_b z>M8}xSA6IB_?qgS5&MyJ&7^Y}k(1p|ffDfyDpcq#=4ysI8yGqs6Z(K2^R90BKwdX6 zLZHGUTo@lC)y}H#Iv1kCb#<%LmH4y5IYyt2Y)O=Y=8jSFihszBo6G8VwBZk1 z4m04ZOsfVtQhQxO)2q;}GrDW)mt!2O{BYH0A|5B{Mh>BJ=c0} zaD}+^e&e&BrPp%{Nd=D>O0jd?v-i&51q%nB_HS{lie~ug#TWnbm&-=_EAkfoNsoh4jMs-Hi0^-BQPvAF_h``W$(7JJWLM+);j~ zm}R#R;O2H?a&c;Mk%`%KB{OTZ`iE$}ZPk$nalP{G~C@w)6Zr?9#O@!c>L# zOUgv_4q0=YQ(@ZnBu;ieS5UlwFEkwXvYSRIMB3Okx3;$N^mn?@bDuRa+FD|a)r<}8 zD$6p%U#rJy3d6T^ty2Vp$C!`&qQ8s1dyKGCm4x7*FH*q!EA0q_oh_Lij>{6YtAmwH zB*cgtMt1mX_J7(Ix#>@NsO0QT9O0&Kz13DJ5mfl1dOhL1e0t@5w$OS;h)?snp>Kjb zPhUdZaWSfgx56xA3uV+&F<71MPK*eW zcym2B^KjM;Xrs-!Wxp1_Hr>|Cg2wZiuQzKwGH3Oti6G%lRU0cob6Tigf6&~%(QKML zQhW2Jt6G`KS5E!9Ip7+L?>uqtzAKs+?%2 zSgg_*_59?K=9TX8x{c;1^&?IZ?H8sd7tKaT;m!joSqY}6rS2C^dmBF|RP?fTWbG<_ zy*GT*&Jv%V1((rsa+ObcLAQ-tMpl4J(!e8DlW;5;|2c{Q=IFYr;Mw)Q76f}H}SN~Q{PKCo72ho?P1$u)^UV}x?YPk-sg}uX{PWXer ziLLSiDyCihSl+zs%}LWDQc=!Cqy5G^_@?sGCOHSAZ3DFEseRi(KNN6YG-v-O*?x?- zy?p-g`WiP^JI4w~L-w%_dTAwT>-+2=8&RsC@%mXp7a72)5m#k;9zO2+I=zs$)SHP$ zp);Y5m;wm0CiHL^?g(@Nv409rVDpIT14e$1ZQyeQ zzsa>J&P;c12yqCD;xtv9mMh+YT;pc4axKC*@I8zrmHQCi1|p4X^$1N^$~oWzNpM~F zY*w1Tu5R>fmVP5f*+<{*o9rt}vj9-XUDY~)R2*{t+mxB%%{KMy_8w#?qPhEJ-hY2> z;`;&=yVRSQNN)8L^A&xjRgbdXN$1HGRvXXdH`F$1m7D9uX)sTjG;S3NJ_y7THx3N7 zWUSHQ=$Zt_xA{vG7Go=*>CL@)?qK36YKsT&%rR_5vfiFzUS)M83`=p|&ZHG*c_|zD zWENFT+G0^fy#Fj~YeSX&zNpLYyF`vQra1g`;)hquG~r7x<|=3-h*qt@TooD@jHa9l zgEfI1`%usjG0cG^LHsb6NBJZ~?3pK5H*;%UryF*p_D1tgMxmM681v45V&|{tKMDq1 z&q#r#PpY?5%*;%DoE$b+ta6uaG^yYi5rG&b4E9Sm(CTfsGHkP6Hl1iS*Mz$3%C}ya zf^4%Wj;0a|=VDf5OCUhZ!Zk87h&d2dgc3zKWmmdeEpe2!m^Nu=Vs4pKMZHsl(G=~6 zae~Y5#bbi*F2)QxG>_JBG$G<8~Erab)j)(XoL>%C-nsm2u!JcQ!n(r;7H}|zCvXy-={BN&5ZV)VV z4-6}J{Q0$wnMJ=No=Qhm`o1*C{v3{`)~hCdQB-lT=vRADMj(8*?KfD_QE?G_CgR+o zo}qk5+j8`@qD;z@{7Ndt!fW&OID2i(is1v*Ph2$-Z)Q(Z2Q%WoRCdbF4o>uICpI{QFkMPJOd_6}v zVy0r(Y>}Z5LzDkdK=kJjz7fV~eXkYDV=+c1YhC4DI<&udiPu~%?)wzaC+8!<0{pIr z4c-?1=gjoeZCCWzhq6>C)$PZ2c1h%x%UzFz$3y@1qzNN4gSPFluiW^#7$(%%s)hAOu4Y9r9m!#<6gKSAlQ02xq5>Y?>nuZvhB zl!V0;BRW2>Q0E9E`2szt_mZ5SSByJiIMO^;yDMQjVo)PIoZPb zg(&dVEOZEY_TZNRc@YRPaon|N%s?t7DtoF>nZGVxgETp3a|olL+x`g|KFuKV_SJ1P z_2GxI1L->%k3IRSa@4BX{Z&bVLza|0i2B7)$7H<0RId z+nh1Pqa&3*t8*-F!P@KQjD#zhol#XSF+CvoFVmVAFwNt&;OKi5o6H z!@d7-n?->PpnY>zv`mIQ(|UR^chjVz`&e4Lr+rxDu%}^ltma^x*LLXFm|Lu?F`59; zr(oQXqL&XdvbnXuBYZs$RtKRqQwZa?d~PVe5MZcO=qHL2^l-}lxwQx-BKFkrpU#&= zamAr4+=5<SAxW21BR+P4a>v{N{hOzzmsP&!2LVdJdmftA{ z3wgFtQ-AQv1x>fhxYauC$SblOU~XwD;Lz90RiXY63Y%FOk`*&ri>^k-qx@n5zd+*ci@Yklhw`-6Y+=Rp&9$~J?BfaBLRlY zv-^|vS&P;DY2YbcL=p`6vd?Cs`c9pApP{t=-aZBr5S4TMf3v1-`w?$G?3B!zce4X4 z#Yf|Viw?IH9s764fQ!u&OnPVhp+h+Cc$}EAr~TwtaQ;*_Il0~PHJQiIR|*6ea994s zO5o7Hro#n>3d>TC##o_gsj#OuNE2K+XPYaoAKa#S@9?xQ|2SSW&Y1N0BS(}&Tq_0N zDwicF8HR^C%{Q&*Zj+lD+4h`kvrrmA+ci{*60itObgIs$9fgbz4YO(-YK|v{^fC^M!BZx2f97ojJSBgs?~ZFk>zh(# z;Jl8CNYsL8P6?H+(T*S}!VN<|R*=+yuBA%UM5g8uN{z0s6i{-}YlvP5Flin(yP!1x zxus^_Ul@?SYgw;VI{=bB+cbXnYpPnQ!{d_>Q<_6_@OGi^z90;)rB+&?pP-t&5cb)m zT+bEdNvCSeps#QK*-%;*`Z>e>8NQMmm_0*a1;zxHIL;zT32Y*Ol^eHvKy9T zZZkDj4M+XCvnuwze=Q)xZrsF3jWtsi91tTnog+D0{IcVE<$Mg0I(@y+2niU5tauE^ zKCzG^8r`dx-|VG2{;88?kLP=(oDU-BtOz-D*~cPKT%}p@k6hzMxmsGUDQ} z(&AzS+MZ8D)~%0}rIF7>KL5C3b+bW((ZIRTW_-zT9R?|p0nT4>m?Tt?WJ_>_kvT$f z_3{$?_PZ^}mYdTIW$xn@1VUZXXOXN7BEr_QLVswbg8h3-q|t>9IUSo~OuQk*4Svqv zJiq_Xq9%_j<-jAM_P>NKRDy_KWG51T7jUy4Rbhr;*AU5rWP@f%a2wGalg))EHgEHx z4!p0ppiW&c9>=RCXme_2&SM?`Iq62mdvX&R2rXBWQ-k&tEzbrlG(%-dAoGdnZfj1E zd6DhCFnsf6BH1-n;L>ohD6AQ7}MGXDYbB@=D&|mo1S{NUVj~A zl<>a|#x-J{EYkYmDZ;=`fstDK!z3_E?qcE`2E6j{obYLy3|cGnD}p=b>tB)4Kc%=2 zV&`hnj4qEbG*eN(omW+?LF!k2MSnK3ggqE$-p!Q3YwowxiPi9nMP94kc1X`%rx5@t z@c!tIXSw~tK~>&!X@hHdzhEh~tWw@la$)boZ8y(SZOm_lwo_}I=qjOOLEWK^Ukxj< zB5Eu@N28>|X58;{0(p^CqE&uN+#o^&3pgv2rukj0>RdbSnRHAEuPS*aoej4$-b;G# zbpH{w4@0ZS{dHu3#N8w&@ZiV6`n;J#dsTSGV;)I1Q#V7O9o&*EAHx%E-ofT$)Ek|S zFL(JGBZXTDCoCbn2p^(068`w!N8$s?qFg6*>M_b4nxcTy$bfekSbHrZ6H4 z;a~u`avWM147sdrHcZ{zcp1DoY2ZY}Z(|kY-%)tDuiEe~ zU98{X`LM`BPsh#6c6(leVb`l!&v_dF(aR}B5+HSIFj}AqIu58 z89Gn;CCPW*JAT(`v+&_XN^)cb((i5aW%smb2+8O4C(~P80VjrnWcf=FGv{%az21pS zo~U?ctsy+IbUed-QsL!+GlEQDlo}UL8O6>Y36KE? zkl$Iz_2JFMR$(uYc|_^{z)-xXT13(pVo0_G&b~dk5fL$49DLHtV%>MdtMr)OIW@BR zDbDwYAMNl=f^>3>EP5W)GrV<(9T@5=;r*;KEwZ;J^7g1?aa(!^;We&1;Wiw5GQX;y zwIlp9DVM}y5hs6jA9MWm2AT>ns+hGw&cwze*+=HW@IQU@N6!dR&gaE}SX1TmSQ+DK!wR~jTN==O$MqSVPT$VO>LEPG$k)zE12ZHlOg|N>-wnp zaSk5={j%fPLG9pyBsr#@@$78w{-0UE7(~ujB!4ak{krl6suD|H73qVO?XjBA<%B^G ziBSIEKI)Y7zr|`-ls01`K8t*jtVL}g>ay_2Yn-nJzpZONVZ+}54FVvz?V~uZV|KOL z82j;P4ynnJOoJ{t7rWbgylyYHeyRnLitJ*ReO#}iI(8tSZx-rU{X95yb5WO47;rwe z4Ug6`v9R4jKdJU{nSUxWw&$)r?_=Pn$CuIDKFp~esre+4B)>qghfY9Dq;e%R5ERLu z8kQ16`8RYU9N_Ob2rVI&Xg^jTVm}h|!7F{ADRq@0TB2YymkV8Jj?anl>E;3O@8rZGLcWF>&l^-~klgBQk##1@U z=UULILL8*rPz@)7Lhqg3&qI7E2!N)7?b9y^pE4QzTBQlXB-lcGN-I5`xl4{>2xJEi z9Y_1re-_e?3=5YEF{!hxpM3v%*dO{o-O;|sdRZ)BmGJo7pX{huGB0RjY=A3$$V#bSw-G^ zI_TX#H6Ugwzc#nt(MKYSJOas@8oKmVojkcb(fKpMfZaO(ht^2nqS zl?4v4uhWfCWHpUelCst`KE%>CM>0tK!76X(lXTQJKk?nMxV|{K*rZu}^SXKI7&Nk_ zY8sN+cv+eT)&$`^>tbg{ua5#0PXSvCu9fJC&w$NIf)3q3gbGJtJ(>&axeq=yMGAxw zrvlVOFP7l^$@+oGl9-KWguDxM)Yg?R*WWenPhQ8)U%bmoDEIY=>incKk}#FcRwOk= z5pl0+ILbjBtrNNb{1Tld3pHj2J!89W7-b4k=-;lJ@E{n@NQP)v?8W-^~AXW{Y&VXwpMwg`eLW&nJG{%{(ylKi^O-#Q|*h zMQ|c3O9>6bt>RUF6h*+pEJ_REIxruQ(7<2~s;|@_^s+V%Nl7VKG#MW;=^|@1B5Uf= z^}=6uzH|NoGP_2IIzANO7gWIWQ3jqmfC1ab&hFO!RPyh_oM80GM+5U{d!K6&3M42U zwibWS0Y=GB24OUR-46o+Wsm|WeB;-8_l5*_z2k#Y46w*tPX%&4X`^mXMBrflYvWD! zH{=zKSFkD|{DMCu%vDbS-Bq&Hss^Jgb8z!Ga1vMu7lUNF5%<|rniew?=sp<}WCkVI zLt_viEwmp*q5|QV1mSQA0N~SgaiGgOS1Es3-o)Bhu|+ zO}oTL`O5uIvuQY9xmXwlNoFf|JLsSQji+VjG{Dq>L&#)DsTutwhlXGyq@#}vadTOs zP@f^(d164?fc$Z`yIM0GWt~Z66Z;~>bbtHk6Ij~|M=R%*&|l@uvx<`nAIW@)*7phu zg(g1&{`yKRF!cz5zR9|p!xRGjmiB_BwADX^8o9h|XzC$L#UJQ$Df@Bc%p2_&Az-}|h5LKwnCVL4TX$Zad7KvUtAIlG(=5Unr&xMu_| zu^5(}s|s(v>J?YWOywV9rdj>jwF;=5_9vjzU4b)i0!Y;7<`8GZ;0S?mW`#AOSpaEb zFIG2V^J#9`&EBv=E?*lBrnM!2lcshR18@|*MCe9l%A_Y>t*_8#fAR3MfBN+?6WM4S zYAVTE>tT)>3_#!>^^OjKMHAdxAUXo!KzYg!JD~!w*;q)9z3z6h_}T9sw^kd>ZK`S# zq0RgXspx<9lwjc9L&IUH0-HJLU1C%M6!M=nV6Yj1eZ>a`%2*b1*%UVz;n1q~SyN8r z2+do`P)F)jgkv0dHJUA5S#+f+B#1vh@E;VVqSfLrQ`78L;9?!}Xbp>9Da^W%YY8t!gDM20(}YY7tgo=#1d! ztl+q~7_0{uM%JA;&t#PaMu(Mh>^(ln>!N^;4z^^tM!5k`ijcT$L(AX||{( zIbN2QMdv(`Z2HZ@%if0puU~w^5wd1?K<_y0*Mh?lvX5$dDQ-`7x{K*}0>i$IN&Xfj zg-2&*@(=f|lD(JgMQXyod}}97YdYtPMGzzI|Lpe52clu}b>!@XsGRT@ipeA_4Ldhlqr%*dFc8Rz?R{V3%qV6WQwO1fphUOyyn zsIsx-6+>#&NxHC2a*YcgPk7AJju0Gc->k&9HUcWiAqxO|NgByxI{6f6)$J5LiBa~|&wJA$>J&5Yivvkde^9S~QCAAe z4egjum+N5gp+nT5r%nZ!zl5=<0;kW^XHE79@qriY5nEtekUl!$2a>30{stNRuPz zK%mT{zimZW6KePj1#&T|H@6Y<3Co1w?2m%-B+nlOq8{42Qr~CjfYN@>J6@jt(u~bC zMDKsCJ5iH@(R^Xl4p0GY-TMms?qrk;XKv661v@!0wYfX_B-O+Q5YKDcAxToq53Xk@ z&`htB3orFbj0|kxmyuR>oBrdw48@edMEBnLZ$ruUtPlnZyLvxs^Mn+jo{V~Lzf21A z>DsbAYHobTdwB!+K3)sFm;X3P;oO_n{XWPoYrZ+z1)l z($+k8;)e2#I5C>EZ^eyXia@7sc7LFz?cvsyL~-PmET_c%Zus;%0I#Z3-x&%+Qh+c96dp${2bOmyoiTg552D%k zWy^`x=R-*V*h|ecgY~Dr8AaOEw?T2Y1UBI3+5<(n=6!g4yp%MxCM?VG%SyMX73_}Y z5Zi%nyWX7!17KAcOu5qmo0D)I`0w@QtMzzZYZMzk2BaxjX*?2=?WZ8*bPo`J224Wq z%>TxqQjEVDT4E^{d3H)7H9xHBBJgkWL`KAuohl#W@%X(VR%EV$9QaeT%7ZFf+Ir{p z5KI>@{E}Ba4@|vnx2@;ic>sW!1YVV@L{ak31Ez2_YMP*9ydjmzJrBM!=#2fFhw7ASpykn@`aR3A#E%bk~v1mD2 z1J|T+Fm$zUJm_8=k`sss{?w+}&xVN?&XwH3TqSt!h24g;l^)N&^gpZUDpm^G$fT}l z7xddRx=1i{T=$9as%{^Cj%+y%`S9OlmBfJbZ<-H?MNe${ajn(sH7^)H6AD^E5~anx z!omz2^FPO4707=wg-C_JVYYUNrZrkA$MklmD|uZI0`!)7#2`0&`m+i&Yw>efK z;t=0f3JvN!7Fb=1?{pUcJ`xiMi;fJ1UA?dHCc>5(dR-T^P)`J)O}Ku$QXt|I7WB*j z|LZ?OTTA?{S4gf2Vbb{2>&D-ZD$z}1`b;Z=T zXNuty8%dx4ThS>nlriQ%yZC!Q60k0z(1>>hSz4L#k#&++3fV}<< z_Am8dODt{-l^t+KB(4UK8vglhA|d>7LP&cQ zt-mCg+9>ZA_l3R!HscH8_^`JzbyeDy3aPNWX@_KUD9~V#RPX)4^^&EWa)TwG{SU90 zZujqv-uJNcu{MP9;I>G|Mok5ZNKg!TW2ngkT- z?yP@X8bw->0nar!&{$mW@M03EAmE73M1j9foY8zeijg;`^EwR} zPc7I}dpj#v60!asp-O@qD@-e_n<6r(QxwtafcOhp0U^lZyTi474_WDVH!KLw5rCh} z9lg4<@L%RBS2=-+O@(Z`$#G>Wp9kZv23+56tLf{u(5+ITUOJ>`W{BUR*dhJwb`!-~7ag2QeL}zl{Cy zRk_;SB+DIzu{u?QZ?F)zLD&Nl1M$xNK+kiEE*P z6IiC$wc_IpI!*fT_Gi<6njUsersT5?OIMjjMVqDkPN}j>MIJ4*k1lUA!FrNDO%EGJ z!nLxSn*jSwWW{wW+?GR&viwO3hUjMxD)gO3g%-UA3K_#slzc~TCxL!b-QCT2@#7Pp z?=W^%9Akf;A#W?craJ zF56wDKMc8*e=`k9e;AkuR}b^Z7)b&0x0H0EjSM)Cs3gxEopna=V+)$mt)D1drAm00 znSMGrfCVt2t0X{VNoGO61Ym^Vnir#Zq6j50w)Vh30Wejq7L_V-><1wks#WC7Og)3C zpY7$xEX34eFW}0Y+K4AMuvv3dM9*|ga-Lq~h)KAHVtyzB;gJHs19amZXmZ$nTM>7J zid=n$#AuS?)nO@z4p#s`79mi(%?vq5n#LvKlf1u&ooWJ~#w5`~d zWAsg&)L8Q>a4c~XuHp|da)ZEfPGj%(532(Kp8Ed%kd+n4tBXr1PqLC>wntAhMBLHo zNI{pllrr;b&of2QRkIh7wpfq>?T~h7X`zcJL@$6YrphzdX-QT_^RWFTH~!H+69^D- zf~S%(*Ng$2c0PDH=O+&J6M#J1XR&aX|gs+KfVxxK1q(pIAJ`_M-l3Ov< zWFD6P1A)i|xei4rapXuSY%})FbXhA%{21s1LiBwyvwvMYtKc>w^@$wU*xTd>9x~%eqi#cO&S}7xQ>C?fvYH)`-meHc_(V zTnx3R+GW^N09K?egX09s&}1Hf5n0x2^D!}+Lx}*0)TbEMvwe7mS(7h-XadZ|T#T~6;OjjOM#8ay5t47@ zfFGM@#4(MQVbp4aAPBza$MIwX+)P$}3x-i&teo;ggQ&ccDJ1!ojoCYw=JoF5-zL{T z^_4SiPMVB7kBNxbX0!`rJv17DT_=qbc)s6-L$)Cir5{0F3>kt}ZbYC#u#3!@2o!Mm14@pWAGNVSSk)7>#$Ir

E5ul9^Wrhn(Tb;k%?qM^33CN7 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/splash/drawable-port-hdpi-screen.png b/src/MCM.KidsIdApp/resources/android/splash/drawable-port-hdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..e0dbb62f2ba12fc0fcc462b9f48207af683efbcb GIT binary patch literal 13298 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 MIv;&~1ibTq0AsO%?EnA( literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/splash/drawable-port-ldpi-screen.png b/src/MCM.KidsIdApp/resources/android/splash/drawable-port-ldpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..8e93c2d642ef802e83195f67ee3132a59e27dcd5 GIT binary patch literal 3628 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/splash/drawable-port-xhdpi-screen.png b/src/MCM.KidsIdApp/resources/android/splash/drawable-port-xhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..64c27f8a66ec53a569741e5726f19cf2bdd35bf2 GIT binary patch literal 38625 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/android/splash/drawable-port-xxhdpi-screen.png b/src/MCM.KidsIdApp/resources/android/splash/drawable-port-xxhdpi-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..f605e6a3d58fdd63e472b4820d079450ff3ad2a9 GIT binary patch literal 55504 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%0A`&-DP)mPOt~ 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À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 JR-)k;{y(#CKb8Oh literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/icon.png b/src/MCM.KidsIdApp/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bee77667f603fb18bded673bb3820e7af33cbe37 GIT binary patch literal 60857 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

wN)_?i#aZHj68_|*P2;( z2>UUPVQ}t8hklo9+%f4{KXlOaC}?Vno30B2!FL#yR^JTRoXnIKVDJVNSeQN-6!EPe zhX7bhBO^&Xk%*(HBR=kR(1t+C@^Q!D=Tr9SzsLUVa@PQn7}0Bv!C7p5F*`U{mGg@? z->{Uv#VV}Y6z|qOicZTwQHA@$cLa9)5fu+_Nt}<4O>N<0Emg>(Y8`^Mw7h-K&5a{# zpR@Iy2Sf_G@)m^E^>h!IHR*Bo4YBs#A(URKo_yNG-Uz^7UuVs(@6#8{w%IYkrr`79 z;bhDQ02giFq*Q>Y;j308G@%pFBKVUB^ z?qOJ6myL?)0{2nh3_q~NC>~PX6qTA!Ch#hqXacMNRc{Fo?+-@`Sqq?FZGRlfspeHW z)*S=&`KOE`Fgxj)-tFB&NHxT9mMjR`w1set}36 z_P=fb?yHeO(V^vZ#^))?7D?SG)MF8}&GuUASl-+UY((uD3w!d5*6rPlN)e~rF1rH3 zSAKa9Qt}HS2I){U`CR(KY}yRdo4jw{5a4mVr%sQ7D8D-1x{(SN92b|=es%0Dx+V3J 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�i)q-T~26C+f>2i&`Nw#o+ulrLx{L>Yx z${V|>A(uLS{@ivls);RrGk$w!mSc1M2hRU7{9vuei;-sbt!$dXI=A^J4KIl^Xg0l2 z0o}_5Di`tv&J-(sx@Cd{SdpVUXU;T;N7F9tfSsd`AFR`M(hN%42^n<>lwFE%G+nJk zvwQoSLTDL~&04(%Lwd)!(nowHx*X&pVi_d%<2?dZXa^t}S7aT7mnbm6irBAo*TNs@HK zp-QGh#Wy4xIP+$Mll}ZGHZ4{@`WOaE4rPyLz6&?{EQov|5lJCK(@RUU4rf78riX|7 z=ci)!v@QI<`~CVD`tru5n#r!Ub4&bwcgIsc_rDpz33n!Z{2XU9eW;OHr>LlO2Ru+N z2Q35L6E+PP@WCz=#|JGvqkO$!T6Nd0t!?93f8`WTnGF0Dx|DCtai0;+}7Jtc0r!yleFPi*&!x^d>vb6%bes6+t10KA1}*#aG?DP z(ZBBN7A-a(#yqWSH|?u7E&1m*=0vfJYR6YQ-_70H;lVoQ@;$U#8NJI; z-D>}{NjhxN>sX`ap)*3Soc4Vsws&@T=@%3ZPlF$C1j`E0e7U=|Udt`=d1D~k~os2907iC4hO;T0hiWh4<*op z@X+wkh}P-r_-Knld*7^15)?Mee@< zdR6woNx~3k5Sxfipy)P{64+Bn%{}Ko9(#@Tb(TR`!^%G&eM=r82S9ZK{(;q;!n|t& z&eEdEVO}sV)PE&`cfcth&7z}92&4eOvqnY>@b3bYjhX)hUC|@@h;QWDe_#!#u(dzl z*3&W9r0)Qv^5CO|e(vL0FM;@Rwnn zvS^}5l86ldKao*PX`_JG-fyCuyGxCPcVL7BQ@fLH^^gv}N6b1&7v(*aLP*NcV>B_* z#Q_wgWx%w&CxU_v3mnWGR{l=73_V8^^JBPy=uZ^K090BXR_HWeh|v5obao2-8`r5^ zNck;JSnfa04spQMhZvLJY8i{pkhEj}k8Vofgr)xDJIEikY>Hz#)egn<b^olqgA*=7=S zLYX!Msyp Yy*En5WV5637yw^tN;egY6)Xe)2W3c4djJ3c literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-40.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..76cc53c34ba6dcdce46005ff17d9b9b1ee26be80 GIT binary patch literal 1248 zcmV<61Rwi}P)N>_~t!*A}=HJznnwZ)v&EL0dQo)Zkh@gXXz)#&a(}S*!jVa|OoTq1# zzySA{f(SB52i7_U)7gzNhQGswAMIG7o4QER-Y)ELWDZX1H$%IB8s7{Z9f2W}EZr_G zFu>rt{RNm zXlMuPp@&?#QJ~G1X>S+~PR*juLoLMFBrw3JpvX{lVoYKjXCDybJ=c3~qqp;qi@0|j z3e$LJlO|CYv3Mpf0!9VyqpLW+O~0MR>qYX;z^z0rah8g38`E;{9Y-`ZxiGqo$G{Z) z`Y3$+F8nnK-~3u#FJil@L^-io4DpBe)%i3^z;$&SVgZZR+tWCiw;_ZZzr|W7v1Aib ziWjrkMB@YFU5Lfb$5FrmxbgdPmU53X^t(^-@G>HV5H-(@QDWwUZJR60ijKg*hrm*n zF3y^dqj>OVB<6>sD2{a}*W|9vVU4inIi|(M8k}?73rslg=?Dy+b1X>!0HcB;*`$g6 z(=cFMiE`o}kHWlM%Oc@6(kzrIJsN6Opa%w?4y#sE+Pq2_e?W{usZD1SyMJPuWUG3; z+&HXUjVDD}wgocUqOu?Urg*v6hiyk-$RtYu%Cfu~f0o*$MG%9S#W)lYNl_a}U{kO^ zpM;wttrsi}Mp2YiZCE*-r0+lY-_OGNG>vASj=+#fmH+_b#uJ~-3W#wiAc|=%)U$D8g1FU@ojr;9XOHj}xhBQRu=CAfhB#t4dBGh!$plHouc=g&&kt@C;xB%c?B z{qDWLD;o;XXj(&aQ#6xXPe))VlK_ALMg_mK)T2QGk=)#s$9qS%vK^(s`G7$Ba3cxn zbeV*PcYuT%fuV!}05HH({*1{jLIKgrW0`t;BKe=E)%`4JcQH#iL||_Uu5moGuukR< z0d6K)0ssuKyaYFiF$R&y0|J6yJQX4MtdXC@D@D&^Ljt!<^jn8Okk78}=*-Aa1Ym$s zK@s)LAQTWmN85pTB?vL{Zp6EVIuT*wjQ6{Tx<9#mmRyS$ORoOMsjVLCkJB`NoZRk@ z(~|`xB`qMKyMQdyb$0p}x4ZSL! zPXngZfj(klOCoW7&Jjjr)Om2#U?;KO7~Ky)_t1tS>bghPLe`mF!upcORE#Kh_c2wD z%<-iU<{M{&wS&2}PQMU5_fy28_frH!wGz4i{^Lt6G5_B_H~j;`zbli6oUyI|0000< KMNUMnLSTZ8+*A($ literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-40@2x.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..64b490691b6a2977516667744a5da5dd3da7387a GIT binary patch literal 3564 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-50@2x.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2676f8f6942516888cfd8cca5eaa0b80b18f0cc0 GIT binary patch literal 4691 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 Sk$NTo0000r6m>5mq+@A>1*G}m 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 JQOP#u{{fjJsFMHy literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-60@3x.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc830308dcded4555effe7e99c9a14601322796 GIT binary patch literal 10875 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 ScciHlMOj{5u2RM%@P7fF?$eC` literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-72.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5a82761108b5eb1ee082df6a743ac1df667886 GIT binary patch literal 2866 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-72@2x.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..56fb29e64e62d8afc5488de5f4ab6119becc6901 GIT binary patch literal 7793 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-76.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..e66a90ed64a22af5253377e7ad195985e1b1a3c4 GIT binary patch literal 3319 zcmVFzkc0X83uv1b~Jh7B$4__pES*s(oH1uqM$U91Q6I3 z%0K}kQa8p7hrx>0ItU}-7RUc5Bq1UUgD~X(3JrK-Pv;yTfUXlEGK&96nkuF0-j1vr z8T;SDljQ}4O4W$~Vs#`Hu+L7_sEPF^8^7{Ux; zAj1Ix3P50+Ya(iEt)T!<@mqPdGHqzSLs=>$nma8kil@layigBcxessYKi<%5PtD5% zr_2f56=8-jkl}y;1t738Mf25&@+@YEO!prnDbW?tAPA`}q$ktoYINyQ{?1x)@uAr{ zbe@ca7K#($yr5JusS=oe009a>U;!7Lg;XoGCA!WgIgYMY;_ZB%Oez0wJTqsn>eYv7 zoari}g2DghTS)Cd0D%RZDXQtFgEs#?hO+3O0Fiklh1eXPKuh1ozCF99K7XW3Gj>;; zgjba1_esG45Lm#Of{B=pSDx9adkiJIHYHihv!cPozrCjR0w?`Z@{1$`z)GEon2t%M zxz%_7T(>{&T1dieSTSrt(&H(gEy~C9U49~%usw?nNh_I%N`!m~X|>3FuIUi&mU zj7`;Znk0n)e)Pdjl`EF0dDRW!i9Ihq(5z41+SVjx~pUfz~8tpKNK# zLc6nTnh(9T7s3;J;6SzqKi)Pci97-nP6wpUQm3;yNjWMNS#(GUE@smMw95d@WCpq^Ol<8D~0}&`)!gyUMwN;Ry2|K#!!CwRy_O zr$y%eir&=?Qpxm1RMhBOs;#3X_6N zF%1s4sEWdKSH87>y<1SI(4;fVQUnk~m?45mFF2jUt&42!B*3wR=d(i9C;-Rxtnu0s`Lv`VP z{??W3z3ch;`|9R%d;3{Vp+fWA_3`tX}r5+td1%(PtI(dZv zVhB&~0YDW+fhhpj4Q@$gTGU2)S`e9jTSM~woBHQo6;u~Ia(jzMX|1Uo4nq+7u{(1` z{q3G+D}&51alOd(LN|y%0*4!_?@tJz^vo(g}0!-j01xlmtprBBxIuSq&;U}B+_0QB# z9f+FgEkqV-L!KxP1&Gv>9LwnR)^ox`BVV=75$mgrhvh_tr1|xW<&%v#FYQ4jOy-lU zsFI5s2Er2%9sq%z@)z60V^JOo5OK3eI-P!er(EA}Go(u;>G9F;7i%iyi6HB7}M|VnyxH)U`z3bzs(BvUIsdn3F?6hRL z_V4#Jj)z$eLd}s+c+Mj!3_~*!HVkAqAV2{KtUukN2j!tqzb0ik%jx|aMU(qn!gM^* zKqh9R+Yb~$k`U5AQvD$Cc-D}t81i4l7!C+f00KLG23U9y6}6!N5g~Pqq`c;5iSzf% zS*e_t803w zvLqHzadQJK6d+PVQoaHAww>YP{ezk0)K>v<*GxKEYHWhX`UNIIhLO$Ie$pM}oqk3I zZb8bc8hJo~0ub0~T?srq3wIGHK;+n(WFRFYaG8RiNBQy4XwJ2C))e|-h_4dRsnAR_ zX60ZpPP<7;JAIa1UFqk$gL0>reZR3!>Cl{X)(Qgx6o9}2&J;3lSj{_IJ(S<-L4=?+ zCMErCNQSLQ3afvw??F;JPmkm&xobLJds}-6#IPssI*9G??i2z~+btw+vW56LO;BwinU@bW+Cn(D>K0qbDI^2a`=OT%R6Ls}15DaB z8EBE##fcmsnRHfK=P`tgpVs+2>(jc?@@ZYW1idKAWKn`%F`S>ES3DOa=)}4_Z;_z4 zKWZ`Y{G(Pc@)*{W^mrc3J!%mP+8wppADZRzs`k*#+4rZN5T4Bs&740uH0Pz|-lXQx z%*ifpe`sFf`or2Fth@f;f@dR!XYYj9A8D=`_{Qh8*B_BFrv3HD5*Jx=#pGRN8E&G+ zJU821WW9E=WH<^RSu(Az%i3RLEq^7+eIX_#Dk!a~47ieXhLnZ-#Wq)x$;esFl_UX)Ue{h8qH z89x)y`F8Ek1jcZr0I$p&-~H|ufV3BgTWTE9K2@dwm%9M%iA;~SZ2y;?&KxI5t{K(xLfX01 z(oXLOMobNixUA6Z^wVyLkB5d3LQJWhs7AF>Z!h)bcSjfV7&gpb6LFQr#kr+#^d3&wd{O&z3^ECIG@#N>6ESsK*5yb zNysv^Z>C8EI z6r^o7b=Fmy8oR^N!Wa`b`luC|VoRe)6nRuw(kSQ5H?AVlpZkY%MWUF8i*rSyH0BV0 zkti1l2|NQdibSnSmK{{dqVulHeHnF_4MvF2ejTfHMRe`Pp>Q09+x&AP&$LWz7K5*l zKAIAI);4c4u{REk?_~=1o`{K9{jt6lKlgRN*yp@BXUE#ty4GIb&)P9s8Y(12G(;E}7$mAth|a@1^Is#tdU$4hYW2pz z0EwwW1ZfMZN@!;%|ZPxV!QWQBN#u3yC{E;YLn@jj=?mEcw_A_=45&N1SesTiYzP}93}*pMW;T0Yni3CV4L3)+ z%_`Z)v+yT@7{7@wg&xfMcyb(f=3oqW_@OdU9l&}I7F2Lt59XiSy}jS#&wHk=hHkss z@M~Xdzuav!cSrLd3`j6P(G`RSU6~)>tR!%}rpunXn7mOc5D>?X(f^dTMxt zE0S)>OIfdiL)-hkZh(o<6zeh>`;jH4^4IiEdYFie744<+f?=zbs$gN(Ue=yv$y7%r z`XIP6{-Wrrxw~6PxwbN@$ z82dg#9jI17PRdB0mU5$KshE{x>U+QPE^+tG<59e|Dt#4u%nK@sj3Lbr%ErOJSwm3X zWcJ6`E0>%W#+L$nhQ_a6m2-R1zz+S7Z@L=ern=wwyB=?nek@zNu)ED!eq|cm zbA3>~wi|pD6kLgZciqXmb{vv)d`BqTK5V+unN(Iu3(OfWJI+Tw#vSydbCItboOK8 z>@~br>gh@g^Ua9hbm8?@SIWuf-4wxMt6=f!W@Jf*dr14s-HnKk#@oEk8zRm-cy+kP0DKIZBqlx19|6;QsBs zy7(stH&m|s-~1p(3lK3AVX)I3U}w*hiHqsY*c!lRU9Wz(On zd_JA@+^xEBqrX(vOR6%_M7?CBj9=>J6wL-iHarR!y;7JxEI6sswj1xop9bCSt{E^8 z2cNx~c(kc63Un@LM9D)TN@fGff5rGkx8vMXMQ)r9JJ4Ub*vJBkhbQJvr6unO0X)cyUAHTVvP40$ggQR`1Qsc#3q3-e{e3;HA{rpOLZz2oZZBXQSIAJ3rK|u2#4y>j z)xQ+CLi+(@Yvd)&?X})im8=IBEo=p&jhPlyUHuOMmW25*Gbm7%IgDk->~WczqGo9( zGc>PQCs%_m_TC}|JtLj}szaLR&}#KziRUd7wUMD3P{2@HEbRB4CsG<`Mg>yg#Re_0JBIZ2C?WOy}5poc@JlY zYp$*y6ocnxG!Xvg-+vaVlmwIvy>5x9W#IPFU5CEJcvyPA??#~ena%Ns-M-nkSjH}( z>ZY?7Q#jYxf!x-~co%3jW^Pgc^}M>}lbeLkZ|jU5qnngMXN|I3-KUcNPThZQyq04j zC|)!o1+f-)4up8s`uNK*GV|0F&9UJFQ&8SM-8AYSJ{B^GlG_I>S-wAf zFVk7y&xf`9b+oxgE;z)t?j#G*#5*r5=VmVMdps@$9?3|ppUv=;dsN0uRo(pk8I4(J zz)#fAor%1ZvluO7gT|joSY$Zw>hTwEfg>DXX(cBQPgJhQyQ}0D(nCXSy%SJENpfA6 zz0ctcI#L%kOVC;)rzX|YPZ8kBX73L&R^lg%T~S<)@&*SbR}vHrpZtD)!hUqYK9x?W zsFrz7nCwQ;K^Ik;oSu<>kdePQRmgdnCPR2Th9$=Z3~ByiP@tjTq5UmC020*xft^Fw zMkWY!syI3~rnUX)8SG=k9ZGVSqTJ{a9w(3;FeK{qM`MyTw^Z%kebrO;D1`s!+Vo0W zo%UP+Xg`ExPhymkO&)F5LNEzkl#<>Sot4-Zz6whA!bR$(eC!yyKcwwat*fgNX-|e4 zxYxVTeF}-GHrriBN4mG8Tz`LTG-!3llnY1iShi65@02gU>LsE@b@^^^Sc$GVdKPjGongAQ;J5 zzqPLIE;>|{On)#M=7{_AFhCMZ7HIt#U#Ee&(SArG&h(^(CKp?P~5uNTfn0g_vUExY+Sm zlRVCfWhwFkb#j|SIklB>v4S@ApV(KnS&zcpBU;0Y`a0M;j$lMW!*BOocai)d0-BHaKiL?HneN$bhZb= zAMgA&RQQXPR(p?EfcbbPa6-2XI9On!?RBJdut5KZKk>jRw+ifJ)DHEC1YrAcJ*5lR zb43CbCP4&FsCYST1}`&jXt%h|mEz(L!?%=%$|mgK7niCkSod#{q3Sc?FFa2{xZoop znu(Isiw56WhL{3pHpMOuBcO~3)F@R_%Rf_CcaiObxR8SP>@HQ4HvaA~k+y%-4J33N z^`nRArN%F+F@_t_#@tLmnZQUM0p~$fsjZ_X=a!AytixADyfF{gh^<{{%vMb6$Y1$n ziQ&W+&8PO$TC^v5`n-Ftegjc*^QEbp?Jo2Mi@S)v`8jssv<1ap4TmzLsid!!Q9Etn z*eQ?I*cR@u=3Y5iyVY#3xebp0TG6J9$(0@=Z7-8%Rk-L1`fWcKF!X0-^R6)MS*@^$ z=HGFR>v`V5mo$QXJ-z>bdNk7*cM4>{Vk~>^Ce2h!qo6@A&7RS`qf zOj*8pIzUHTGmxep@+L&eZP+%fl;NUtBckSZn8jW#$?J5MdY{ohw##=;Y+zX<`vS+o zvp`n;>i*>Og>9>l%PR6KB>dS&+ygKq=)|xAZI%M340ccY(iXPdmZjp07$S`LG|->O z!(ROS-O%i~l3{^NFjJ{zh$4qnytXir3SUtN1v|u`;ZH6v|1fSz{r-(^ttgABdtVNH zWu#-H@0TXz>J?Vw$w~f}OK#7Uih!=_>tL7dH(&4j+CFQQd${&#@|->q9oN(SzbTnu zXkma_ezuh%uJ%ZF+S`eCF7-32cR3yF@|F7OCylxH=>gJ>M3aY$yvJhIwB=KNTM~I; zcPPXlm3ms6hvskv#D+&&mfC=(2i668V_%w^aWMYw2lQ?AQF}WcKKso!Q-~XOtDE3^ z*UA5-o@|d_Yn;4S>xPKfH&31?_&KXoPe@1u6TjnzVIxk%H?qU@#gd_|3~C8`-QIYg z84kxTBlzROvN|+|E*a?0`5pYsM;RM4pE5Gt_8{PAX&UIhKsY=_KjdMO-=8An{!4G2 z(**%%?zEA}B9%eakZ;pIm6QdK^E?Q!L~o&MrYjS4ZHR5mY#wbI+WKh#QIzAmw7df{2=h?~r}qZ)YXOzL1|FJ63E44Rea5+h9Si3yL6)@UfH zUnLft=9iO35M?mTPOd=6EjO(d6(-HPo}Ve+4Ov+&WTQfWrnhn3ldb!oGo_V$g-%RTKh+Bf-` zv{3Ubz3ir9Y^HZ8hD0`|_@jvEH3I9ZqTwI-D0nEPYdr3$>_=k5lKoEO!vHJ*5c^AK zvbu0#^s;2uY)&3?DJ)G{U8NwI9oqPP=XbfEVKOf{20w(wDV|q#I5qGy_Zw{)0%iOq z^z(Lz;bQA}Ux)$2_$Is>o3<#+TsdST$)KM@qq6$QvEAcOm3bEa@SH=*a0Vm+BRY(a zDRc8hEZC@e&bZk>UJ{E81B*^>gqXsTDltNH(nt1M&>oXHcZ?^>#ae}y<dk(8Ejs zrmFEKA)Mz~9;Ob{dBLQ+6@o~~{u+ewFVBzRazwy|ix>Ur8gP0iTPa;J9%Ms2@yeZE z(>bm!RnZ<8X*k!~!Xc{b?@k%T$ zq118au9l0^O?5G7+mPros$ah{-xXsCU@J-LGCln_0vAcJKykk~HV9*&(IqWfbOK9< zrkkJE;^xdU-+ZGev8bz}vy^zgwy9w1wo_C96-D!q4Fhya%R(V6IEqpc5WQ8qLB7QP z3jnAG6Zp*vZ)AtfG497VV2?yXZ|~ddLx*bcq4c;E4ny_aD;lMLee=s09%Ny36e2ns z;POqoNhe0k@%X_NXrRS*)`i)ocl_yfblmhNKeV{sKj@K6#XJ71cKC~Ex0DSw_?gcDz^6UCJr8} ze7g$Oo#+QS%9W<^RATu+GnJI!A{0w4@@wMo*FTR%5LYvP8E|^AyfsadMWTiKa`kHo zuvI=Ok3T~S3N-A-kqu5Xi$-U0KZDE(D+=!o9C2x5Y>uG=3Oe;L?QH=qp8fY@S;>Nk zqS&Ur<7bpqS)22x6LNEgU{oxoIK2`jEcTyBWNJaOf9?25#PV;)FjFyEc!E#%9dlO` z?(?ZszI!5a*!%^l6_xLc!|5`tiMTOGM*afD$%s#ao1V+fnuChz^AiW2?p4eY5x8Qo zVnh9K7vCn$VgBr+f=->KU6N67QbseZ4H-sdqP|)i)eL!&BD@kK*WZ*Sz_h-A1-DS0^`Lg~=VkE8}l3Rn8AewQw;u|Z4;sgMLw zNx9Yq?VG@4+fb_^syC2N|dC|VTQM$faViP`r>#!6F#?r@pad&q%^E37J z!HVaNZ*w#B?2{;YJrYbL()qG7X%gdwPcf@Y*17e&bakm3wwB_Wb)Sr){1<;;I#eOZ ziBHHVw8;$_Ji3I;LC@CPupbPywoBZuHu9=#_WV}fn8)2XKlaCg*2}M5S;jY4Pg~xC zXE);G1xa9Z9JyWzT9E%{g^p_3aOm>#YFy!9R_`(oJ?YVt97s6J4_D$FQ2eK-WyTbd z%ggUxA`j#O&fS{Yt^2?d9{WIx|rB%v`!G)EU5o^2nnN5VTz z;$Et0kLsxDJp@KhONZ*Bqc`|U4nGp|=Ceh-?H0auV0=Nj3iSI9Uq1S4;Z8ovTm zFcb1_J~Pn2dEUB88Wc#Lz731j-5)E_lx(Sv_p?3Kyq3BMu1YB{t? zlb54Db9W}=uq3nFwIXYyf8j}_v<$Ibw)7C0#=Xq^87q=KMq#&VcSmh0#E?_qBxGP{ zVyb+06ICyDOcYtKG0Zn_2uw2v=M}@v!A9b`qYh6i|AwKypEej)|3z7u8Rd%+7fmAP zdIXv+!?4HZ_1@#? z$`J!1CETJuJ@tK;l~jf+I zm&lVuDq(m?STVq3Jl0eIvCj12$V}o~Ns1(Z{Jn;oCxQ#+K(481I?!)=TJrcyG&|bb z3oK!3*tA@8)gY0u`4>c$Zj>=MZ6f^WTb$|3477s5d|s4xs#kuc+Cy(57>CWPpG2_7 z9Tr_&!TAnruqjqz2_qr=2C#Hgtim)2G>5gDeRB!J#VA@OeQm#S+TfQr44@+z1~!Q|LpO;PUg(`nf=<1sm_Bbnue{J;UzJ`Jq7OP| zM)pL5E31tg0R?N0l$>`#<9Ndz0gpR5h5&3rrIWiveE#nyZ7&L;tqtp=9B!A>aGM0~Bg(f$ecw;A0Z zVMCwkCgroM1qaYxs$j{-gZha+KBzrkpNvD_1q*wyq|S_>e4Xpi=fTf?kDm*&VU^oo zIqxZMq0(t>Uxh_x0hrP-11s$IxnPX>A(6%|AFTQ3eB{BA$S)#&C|1~p8#Wc|w zHs;t(+ctbR4y3nTll9r|vdm@n(V%Vnw69Y_VqBBVoyGy9){kOUhzr`TSk;Lkv>G0n zBp6R&4gr2CM$R>kP#@BGKRU?S8!L-6FuCD+6eRnpnwL0snV`u5 zuYZqx`nE2u@ObMenEBgg>yAF>cQ%R3bf^815-triXrh`dSp>lT;40q?JJz#X|4uYe z#VRVx@_4P<8R}K&U$I1L1%oD>a)$v^V!K+YTM@-e;Oq526Af|e-6n-)!*AbSo4h8^ zRgc0fO*uSBd++&pkIkZ)QNsG#A0Hg|y?ZTn=Sy(mLffgrhy=6lIOw^A_3xJ#pp3qk zj1{4J^hLX??+YNnT+@1YWn0eaLgmyLwFLiFxL(2iJoDWSA$6&zoOXt=u-HthNcFF+ zF(LTaS}iZ;mnyjPsOFMu#->mrC39mLDXa@Sut@DdrzZUVv`_4Gw~Qx?CsG1N(`c7)i0~ph$o>Hr z9>H-)^f=JVs2SryKk+v`ijhfH!s->nu@qoh#jC#%e(e-I+C=lf)$1Q6mnyN~=2zrS z8?j*v;%XOa+aH0_TIPLPt}niY{fjjn$P^ZmK17wWHletf_A3kZ{x;?#7cG7Zt<|^k z*7)Uhv-qxBd24r53`Jo;uP>*eAqytu;709nfDSynx!!UvGfO^kTnG3Lsg;*Gg2a-~ zMn@~3sffmz6Owzy0^~YGrrYt$8-Y~$JgJfU@icKb_5=QC-57lH{7q+fBU%IWT=psFN=??B0@Y5#3j2XrGH;!)mlqf+K z-qh`rSud>Qx_6KNVeym!uG*?e0d@q@pixeN$%YxT4F_HAq#iBX?Orpnz%yTF)&KCh zZY{(!peg{N!SVe?=+OE;^_`okhLQ!JX&i`zi$cNu0kY5JcrBe42OyR>_XmFkhP)H4 zq{wm`2+chKP@6mgkt2PhAil|R|H!>g>RY1?6eYHrnL!okV4&l`)%%XFVCHbmpKd;wDvK;=*DU z=^KiHg}n&cqc2i(GtRZiTX?8=fQhWab`uv0QQi`EsLhrFIg0a7LFE5x9^_PE6WN?f z3iy{uLTLD8%qED7(4$3f&13lf;$kB`pp!xN8C{kJ9+g#kKZ*nio}wLy;rpLf;PL@j zOvbPp(1m)!v>C80!)k^fsymtvV(jL{CoMrgvfd30ILxwBIqhRvas5u7dxkd|LxV|% zZB9nm3lWdb?wF4>`I-pONyoTSt6e{jA}oXRsM4CmE(>_)_a!VWv|gfR7zE;b2FJX0 zP>5KrwEpZs)&&&(S#%yp0f?!9S*O6JSHgn$YaAl_ZEy_<%rzcMfVh7Rxx#0`U2k-m z-ncT%wMzOY2axVK_xQt)g5{4yzwzYW)4Fh>yP`?o|F2HQ`8?h0@_{Uwh?7%-!zgjd z$)6=roSQ8rnjvrHW}Bx8ElsRgCP$JUba8TPs83k?AB_t$hNYe_YMR8@`B{V0KfCzU*9f!N6@ktsGx@&4d71ioQi%<{U9vgD_)s;oc)gi|2x!HzD`K>!KE}n zI7*>7unkD>ZR}HOJcnn88GW<9fnbhnN5cmlLl9K>(F1{jPG|ROu#n_3I-F!DNJQP}eejZ2 z?779K1DoWx#HBzgnengV!t=m^bK!bz*(K$k3QMoDA824UUbV(i1rBH8RkDWdx7{*a zB)uuI;**B8%!U0U=IVKK?~f#SRrzIO{@7M0qxD9kHM=dPskETlSBU;!^|X;j8#Oiv zQTL(=ckIVv!30XGKS>Yz(%wINKx$wy;eTr=t+eY(Ru-^aO+A R!&L$dRV58bje=SD{{cQO-vs~w literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-small.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..de3146dc7f5b63c155829d75ae9d8676c79a9621 GIT binary patch literal 818 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 JPDHLkV1jm)Mgaf- literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/icon/icon-small@3x.png b/src/MCM.KidsIdApp/resources/ios/icon/icon-small@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0efa99d8626ebc43f4bcc9ac6f1f188bfe5cb133 GIT binary patch literal 3856 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%0A#XkDo?_vI; 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 r|77bQyZ_17KX(6=mmXf7J7|b9kJ6TF&-%4-7 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/splash/Default-736h.png b/src/MCM.KidsIdApp/resources/ios/splash/Default-736h.png new file mode 100644 index 0000000000000000000000000000000000000000..71b16ca4d0873fe69cce7b353f785e03363a7861 GIT binary patch literal 45098 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

pb@@aqU5 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­iWj2lT!2`T;{4j4o0w@{ zMgFGlCF{filGDx374Zq%sg8~_HxCUm-W-4^>6eOa%EOH;Z5V5R^7?1!0p_QOOGXM# z+_;7LD<^|h5rh8}{^uqmqj;hTsQ~A{L zuqUx(SL4=9ATDJ}?34FM@&F|A> z)ne{EE2kG8EvE+=r`Z*SEYR4`l9-BTK}*R* z-R5TVp^hR=Vyn9LLLX*@*PX8DAHAWADWClBn`PsS2pk!bfjO)-o)|&rOC$Ye|Y7@1ovZ=mxpixlcY} zXqL?c1|4s}MZA=3?Wq8|M^oJqarSHG@GHa=Xt>Hu^PLwMD!Ua}UKM=m(&Z1Hr#gEN zGP>w-CIG^o{tf8hi-O`_+9-fl2?juizL~My*I;+;<(8w)<40~24I=2%zkZH?zh?>- zl*RfKmB{}q{(=L-048Mpu=hQbH}<^5W|rm9lxvc|e>^YI9*8Oq(;l z&zxa})mc|*CI*&4)~bk7dXO6SW=_32M213N+EM05r9hlKXKV+m3#VV%ZvA#A0|KjPzn8K$pk2=XWIlP|7i5rIv`W?L`eeRX8V(w=)84&23I+cx zStdLn^RNt5hP>M&{Wk;U%Pk5-Rl1@S6yE)ja|r?))w?c0aGA=pci=9)x0hS|hq+yc zyyo8sE>TK{i{I58??YRaA!1CF1h#Q&eeQ`PMB$PE5dyar@=tnb~5pj2884pv$f1%(qjo$N)ZC11@RK zPjGy#=1%i$XXEP`oLQr}jevIQtG;U{%i_SDiyvd$D{k)RqaXO>xG>t7k!&4%L`ZG$hI(|N5zj`>!WtF% zn-M_xH92_&kC0Rz7(Qv;KWzz#jJsSP`J6P&N~$PSTZQ*hKe%qtp|3dY_w^yOQdcRb zLGR7GUcwYI`6_8>v~erv+Zlz`8xQ}zwYM#X#yEy;Ipf<<87NZ&YH_Yp!(|25XV6f@ z!{nhqa1J{FEcE1r(DR^XAR=@AWl*kR-q$T}6vvEiplXI&k<{x)F|zhA~& zB`yE}QA+=Bc<1Z+%JKbyz}?eVg|$9Tt3o0BzgV05vf?75wdca9l(LN-h^E@fblNxN zF06p;jP88XqlxWRAByEPyZ$l7O3Crzj!)r%fhveUV=y!7 zR3^@AUM%6S-4*IN@1ji0=@B?$!RO-7^n8y;O!sP2!kw;J(4Mm^B3fiu^CJ;#rl)r6 z2QKGmfspy1EGco`S6XZQ{}A=&@lfvX|M)$q(WywQk|k0}Su2hGoRp#{8nUGliYytD zEHj-pMMTz`q9UQ8(%6|fDa05>MrG|-ChI86V9ea#>z?!e{C@xR=uvau_v>}NuKjvm z*ULgF>ni@JRj$3CwM)v(@1UeV%_pJN=+IHQxyq>Y&Ye(b3@aECO#HPd52z65(s9R&?Hz1hIrH!_auT1`@Y++gl+X_mA2^^kR0N z2di4Rw>|FaZ=Ws5a9q{~i%?I+CwV&SXieE9> zWO5~R_akpp`qh0j*2RSW%d42n0aECd9~~QQcL&+~RVA}1%xlG`OnDHT4%|A6w!tuL9Ws*5p-(K*{Ksw_+bV z&^!A}^dQFRfh&%d^7cqe|5`d^c1~imW1;>T)w-H|O?|q7W#p!dU(xNiqUHbb*LWTv zH4DXmz2ts(pRM02xCLU|!TmexCS7e?K3o9eznG+dN z%pYb*?LfU)%59)$^~H zy4_V?z3?o7#~q&ceW>A>cZN5S|A!%kyFt{tKU-PuH1sV0sX1au#mvwU9Zz0OC| z?IQ^kj;d&*$ez`I5V5%I6&t!AQvow>lBa07;a?uW>SgxiXj%pHIDQZEC{xO|<>s@6 zg7bY3&eaWf#o?U#F1RpUD+45tPtUQZ8L|s%L2K5H#OJ+uS?hH}f6vaokzgn=Dv9Z> z*J@(%HmT}A*Gh-8ro8SuZZ$5j@=x+E_!Dc3MgJaEZg6f8n5u9B^!4=Y z?K<~uF8Ebi(CsewiBYAInRm;C&1k3;F;&9kI_UOov1B%MZ(4#HXflukQPul{w9P_~7LQB_rs4+38e^Q_9kEeNNIr87Aj5+Zju z7Xc~V%T|`&%a2%D^Y8ad(ppGHum0+j%D-xqWx9U(;jc55{r*=7z2>t&=-7BQMvqH9~d2iq2g$NAGFKX{b&bqk9bw zPMIm-guhUQ-;ohRGMP<9Q7~G%(_>dc>noP5??kGCI(@oJc;gkFoox)GSKUkpe6F}q0iyzH_a5)Hb8@*dVb z4=7D$OzpXm-;Zq5N&bt>*CC@4^N$D2p5P6C&^s;c`U0o?O zeBONsa3~bsI8q!x%QZw|3Hk54I^8Ie9;mJFkv0rWO!3gO*KcxEM`SiC@30P_HLdqJ zT&4w|LKKl&dEI@)aGpf(3q4JJ{_#IC=Y8+_)&VT$_X_X9G-ZQJS*Yfa8KlD$5reB{#oER@ zam zx^n5>Cw9m%4~O#`&d7a=sRtk&LM@ZbWT&z=l8zJ2;C?-XxSP9Ljz3977m1xyXKeeA zTl`n8_lV8AGX4z(I481~gx67>{N{)@uTQV4s8~YLr=oteN4W)(n4F4!Jtj2}5Gi~? zo(KCPxuRxJ8RDiz!PPa4$s4)l8KF0@++ge8Esa`<}>IS(FU-~fahC3VVy$h{(k zoQnUDt@RBz>PS9>X5c}JU1zpTbjaRK6f%w@)c4e)JQmvwz>rYBthoI)+PGcsA_5vy zWGw9(v?d{3`mcG^0s$PNHbZUl$`IMhuP1mN;{CldS+%K4d@du#5|D4qIpdXQ$gO1k z*<0^gGR3$rGFydYO8#`gzdHFs@Spf7}nD2Yg9Iui&-W<}?0`-3t~yP*zWtQ~fuUfG)*W=&$$t0#23keE!mk%dzX_ zw!(bIbg^Jk<+6(%DDa2xtE8xI2aJ1MNZ)?h8w4+C-|Qp7sJmwSMe8CGSBx z#*~3=mdM<8Ddv(f{8eIzqW+o3;6$kk(G@_i%;8;%%vgDk7e2g#Jc-^5dTRQGCgKCl zL_TqxEvn&gOr$$4IJ&C;&JMxJke4Cm_};BU$jm;ABQEaq=e=*?iczk~+7)7oohOf^ zYUfEY31cpy+5JmpB<_PIH^;wH79}T+k9$ede7fT@AWr6EVwwd=RftG{^0xphv%RfPMmr!_qv<&((w3!d)PA( z)spq!O`oM(J`^_BM=p7Ca22xkc>4OX9GsZY`o@)6V-A`nYs#|mT5PH?V@g?nJ>$=~|Fh=;a&WpH4*H$QvP=;q7x^~F-e8X8_ zEQ*lJC8g&~Jy;=%dEdjg?vi4Uh-%z3h8MIk$*YbOaARMtMBrkGDs9y_1s?3#=l^L# zX2v*j;A~X;C@TMq&PnwLQoeoT!-mGu`&%*7c53N8B9ZlCC6Y7fA33C|R~s$82VKy^ zbmD3`kHd0KDK=-Msm{sotA*&2IuyDjkiZ^g94l`%vbAJ@_c+-jqU-IcL^!R9SpX3+ z^n~tp^$la>o<+=b;sDj2*mVTk*X2Fsxp^S5T<&<6iE5pp-X!2(G1M&%G>^Y~8)WX} z^?u|8!OH2 zi(12^COCQdJQtsLYY<;hV~z`q0umb(=?-?|jJFB5s?1s;$jMogmy%ywQC;pXeJ`{S zSE?=W1pLJx6t0&S$cwQ=>Do`Y()5CnG-ckbD(GO4k-R~w$6h zm?Fky-C;l~rwDyscKn3!f} z92EM`GYT*Rgn27Y9hQVi+bmSK_IR7;Q0x--#Vh{7^7Ryk6Qq9CitQ4RXmAA z_cdks<*q^#DKW>MG1VI|cps~Kz_-O{2n|8POSY(}Kq9rwfo3qedY?v_<56=*`K;ExmE6adSq zUIS<tb zdmec9vB%VfH!55q!MU!=M_(TYTMI>$aL|v%RHOJx@Q_Nz-9HY%MM_I>Vs0HN&q2E@ z8gC$_DAijW2T&N^g_orQPpfR1=q{1zWpqg%Y(a}K<~chEtuo$3p6IUv=~D|mhno(I zz1X^V1ojb8Ef*Lg5;MJ- zcc#!Jj8a5$E3UH@75zPhwlHTIWx0FiPz)c7JooWR088VB=w4-nAZq&P0}-6tAsjMW z$^iIV;uQKDG9JsqpKM2$Ag-cS$j_6=%LKXXhWP9G61xAiR3xzo?Zi&M*hBN=OPD_? zmrm;TABk7CP97~3R>HeJT>XXaa5+p|gz>TqQ0qR@tIc)R1Ac@9sCICZ?8O z3}0~xC?Ot6y)lI@p^Txm|5cSTPCq25=?^?bEC$nB50e*891n?2NC$Re?djA(0(+5$>=?~9?P~4%^U$#cO`1^5^4qNW)0ttW#ql)JIaXFX6D>flEi;y8QFLJJt zFDz6b>>?_}BU(^j=(sh6R-~OG13DoPI(S;pc@-hK2iN%%mfXmSKKH%T zP0Z`Ob7Nz+cL-bK5%%&dw1jR719N^NSE|P(tO#1*x(Ey7TTs5Dxo5Y3Fq9K(Q9gMZ z_;F$@Vl43~I#wFTj+tV#n88!gODg%IV!ge8#esrhl{JgnTZH6~I6gq$^5LtiV(OzS zwMQ3WhKkJWP^0v&WKLh5LL>1OXI7;r#gXy!8a{ z`WrX^zy(NXSA`blDe#auh&VwL9Y~%MjSFn>f#=ODt%#liajBAgf~TeWj~eAZ&XG(u z5i&*!U9J2}l1VCH>!0Oq@F*C$msp)p;XZ&ebsd@Af|M>0YVU1{{ASiv;m$*5E?%uqs*%+3KKnfHjS#(xZOm07 z`rsg0RwkMiVvPzi4x*t|e9s};$MOOQO%e;i2^&HUAxk-A9h%z33qc}B5C=mF3F$!l z#zI7D*b)%BV*+7tb#MAT5pSkW>U(fLsI{qN1i2tuKVtZH=uL3weMLZy>>8w|pH~Qz z!Z`a=@oeF3$kR6bLZV~w*{D&ddy4<_@MQ_u^cotB>QG6wT{@A;4yp zj7IWm?9t5U^&w$wG49B34)RT~}&1k=T8D-KPOu z!g@K{?$Cgi{wLUTOp&*x*8xCYE}OeCgxU}VZ!Ytrz_d=YV(gHjc(4gR!jDz2ONW$9WSW`j~!7cq97d$mL(Y zRVsk)%@|@NT_7wNM0EZi-v^|mlWtF~ zhn_p+>k$9UxmHi7D}2sbOFUxyM9}P4EB3W!m5Oio$}#N$i1|p+ar+&iZ}*NDiMF7A z!bNIcX=0u*GDLbcpp^La0FbIz0cR{BPtqG(8X>&i`=kYZlrEfoJ=)f5bz%Y(NcCuV zOUaH#lTo9ic;=B_9y8iQadtIOt$kn1&K3zk0u}blA6Mey^R`gME zF;A=hWk)%ikl!Bw6{YLEnY_a8JwuAT#_CW+cyi1eAnf%l-J8*Aa|Y-?SWJjD-{|S7 z4kREJwXa*z(9?g0YB;t3QY`}YvXJED!J00kguP|9Pg8Zel#N5IwtI7`i0|e>G zrw{tmz=<(dN)sycTG4BvNMnnOug87NvUJymx9i@_(`sx9Uw8hE(Vvhguvc1gY5^7P za}l%IpIQ)TQ|)b}PE9uVjV)cy3T7X|Pe9~mvM+;VHrLU0SP6o-t&3P0C1gk`0Y~qZ z2Gkv)?*<@R(U_fGCs=;$6YX+xke(^J6D>R_YL4sd-)abBlXSgbfb%u5E4 z`OgHiwQaon?f%V*%nXU+ki_Z)elB7X_4dR!EU#KU;EE?%<=fm^SMTp zL%ApyAsw*r??Bz)vlC?DNRNbZ6^#C?3aGoN_HBbKg4@g$x(Bl#3@L3{A-9*f&=pRshE4_P%5`ZK%N0D{&Q!oaw?IA_6`-8obDKY!^eeHVb&4WW z?PmJU7VY54l6nLQpQRo9O1w#eZeFiZ?NW~(ft6a}R=0s004}d-n66FlsxkfGQQ9-) zab#f?!tk6iRehdkY6cR?+iZ(mHX}SLv*fLnTgB9NlACi@%LqDY`(@ImzQNQku`vO0 z)#`S8AL_oa+CoZuSyY6pZue4$sh&EW@IxrchSX3QsX1j!DExfDixGv&_NL`}jwdAc zQwIe&>hnED!bQqIc$epoEuMYucGbh_uzSFz=4R-x8i?TrR|J)xCv=skIU%#^Ue#J3 z7L=-t5JDB8|Fgg3skU~lq-2zMNi|aG!-vZ43EUjNeA@G*+E=@mY^u^+XemhwNX@F) zax0j7z1=J|##cqvBevVpDwkgDx06d9Psros1$8o6gjJLbuD@!L!_Mq1*oRZM0`em7 zpx)#v+=RaB8J>yP3m@OHar}uA=XQ6}{>^fmU=(4U!hCnr4sNG&K5-z5c5@%mL#aep zPNLVlv?4twqW&8Lxi?USGiR4^3_TxwquL{tcMGS?p60>eDBTw+9A}LWT`(xo)c`?C zeA(v*>w=B6voE;V@BEDn-yU{u=!I8p)!MMfljBTcOJKIe|8Jj<8Ws45NVoJvwCKou zhF#*VV^*fWBj5@tHp;X5Xg>|a*?s8)p9zWh5kuB*DitUBRcke7bzhu zJYL*cnwjKkbrG_kh}j8&nG!+hZkOmxr>BsVX7pshG?p&%9gR;_YAQ7klK9&ZbIb$3C! zh=KsP%Uy{ocAq<`u5TRfMl+0;%bVX5p~=+t{_BQ0FAv^WS|1{bw2)UNaK5`g{&5IH z4)zwZMR%oX53JXU#X2T&^GnkHJc@q&xBM*6qv&{`Z0DY#p~6PU7s z4s~#Rgd@8vgApU}1`HZe65H7-akJP=9T=ec64Uiqs()#L=La1;cq@$#j+KUz@5WCn z5Tu|+-lHnn_w(2-5Asjs5*Q9yIbGIZl5?`(KFnwBtPBby@mKV&8A7R9Xn+Df*sguA zir}|8IJ_3`2a+Cqw~-f2_Q{-L^NbM606I9JBL1wFjii=uoTY_ypo-A31#_t))J z(Z62^hAO=<^eJ_+nBMUDQ9!tI`+pCn)}6&sjNprzNl%?&Y$*AMjx7{vvXgRh#-e4t zczxGnmLR>FY{3|bZ5O;ecNMtnW|1?6w{H0mglVz{YLEUG2b1U*tSI=yXn1_+L3F*w za~ho*lWu0lkMD7W%w<`@m|%P`yFbUzW3)No5~ACuD?5!Fq}KIKH2&TTi-wrSoZe5Z zsp$d(Ro#MK&afvRv-(!-kbj3oSDIA&3znez?^n_u3kzS94L^6xj_F@*e%_kNSLgfHY^oz$;JJ3igqAlNx2Y~p^^g6C>@j#)Lp@c`1DqoMHd7O!rA8V3 zyYs5_!W@a~l@MKu^nQ_}>wiVrS%3W7b`%*8iBmr1rSGNXErG;CrKk6#`^biCm&r>M zSI9xwn(Du(p71b?7x~qt7#QNjEUITwkW}fXU>O{B2>+_b1CNw4Hc}jux$yXL?Av7y zkMzGvQH%gbQg|4}PL1RIh!khaiHB6^tmgP@USw08i_u5ftM$Vur9cr zhVc=-pTRRZsF6Etc;RkEM5q0HVSAFOXia9Zp=aFZC7>?JSK7xTU*16T_18v(;4?$N z;1IdjoXkKf+=#YQEF*O)DxvE@K$P!odFx!_@%S3v1$;8?r6|9uB3xtO+FH>y832_K z_T>l7h%~nze zg;JgZ*o|?(l=41voK5034SDyO7C@dZlovVG&861W7G4rqUmQXf3y=ck&MuafR(1rr zN&J#}LT<|D^UGq=ejh@%ps$4IXiIjEa|AyN&>qvOw=i%G45^|u25b}~1A zztQVZqR&UDvS2Y%Mv~oeYnF~0rNS<{!WvCT+_>bJNxEMAvCmyBDJ0N0F4tf1N_W4H z(T`U>MpzRGWn`ns!$Z*^NL5TavO$7cj&bd783_s1GmO?LWerbSNXMR?A8Onk<8Q(W zu7*!}D5P4R`wSikYoV-F<`km=;~w1|ISYMPJ+PNhS}FEc?Uy&`97Or1JOiQSN`lSp z3ogEO#CpMcg~S47WDoalWKWYZ_bq*um#7nJZfY}+WDv*Fg&sSr`I`S72J``~)cx31 zATxw6i;SJhpdGZeeVA9^UB=};x^0dGR_T*DoyD8!!^M6ttEvPty_c_5m&+gT1(wI>?eA|M6>=3vdpAP4SA@%bc)XqTHz=*dfm|suub1|ArOjpR1 z#L^JU`wx*i-@uveDFyistAP5QI>t zBlp>v{OgW5Wso_r83rlsD?kpSxVASbj|QntFZrgB_YVsI7?ga?Ox440jb%G%$#zn+ z!!n4xM`^f*lXXH54s+~Eb8P1(7vpeBHuLcYt`DZ_pA27F=-_wfLWo>tJMX6M3l3{4 z;XuQA$!%Jhboaw7~sxO@=mNB=e{j5Zj4Da`VdhB@KfXOWsL5v`Rf^e=_ zRzXVYJs{c5H3m*RD^IrTbgy+NeF#xv^)Pzjx}`?BgYdqn4`8{GpE#$PUBK%LkK>_? z1=@+=O`HGo8if-5m24!$m+jNYRt&Nktmb+2@W}-`amaXg^UX3YwS-1@_-1*dXB2a_ zBKjwkY4hwFG8SnfZ&&XuU+WruILuN-*dvI@nNqfp&GR%mzcagkT+nT+Jie(%5-F`4 z+23Mso_nl_^eT;CT84g>EjuA*vzHHP z1aICom#}-HzAZkDejUe&iKTOslkDSXkgXfbN##oAWt(%SR}0N@6Q8@886tsW8%XT= zC;!_L^fhmQE2p_hBa2(eDiCc%e&5rks#-Jp0_PAz7|=zS)X9~?hh@=U^3dt2V9llH z|HLCQ+vBB)fMOPFK1*3nz4}7}|JQ8ON69R7wsXU&<)xpJ&cT%;$2gfG5c|u*$ z9A;jK?kgfX+>Ksx$7IAo(L}nXZ%Sept839^1zG6A`|AsGsAcaZ$tlxLq0*Hjhy_|j zRu(!wMf3l}_exaW%}7g5B)r1P-ADust8w1nB41-7b-DFBz#Pal7}98{bxzP-m$|r< zh9MChVyOyYTK-|bWnbWe zEOgBjYFJfCPqX`}VP)MCl%MEkhp=?(g8kMS{hp4|AUrpncvWE!`-L^L+ zag$Jl=14dQLDO z;s(FFKT(c&GysHWoNYyg%0gLeOaq0!&10vrW_BQXW~asbYJOT4YOr|jsMT$07tK$` ztP6Kd)m#OCA#o##?s3~S)bqDbHu$eDqRdn&-wjU*xcbAaPSnWR0Edj3T;kE4a>L^_ zFWa{FK%RE9km0#`wQuw#i?oV|%AU+TT+-Wr??bku?O;RF{ik*GZI3?sNhrdc=mmV* zx7b|o{n&J1qyQf}F(jWJsS594B#L?#`A{52iv99D@1%hcMg1n!Wq_|W=H1n`--4L& zxY)t>^bhoI-;%$G+}KF(wVz7lMINd6!#J3di!hVx32k|By00QubSkuvk4k3QJvdOg zF9~b4}TGS(f zjDzSu8voeZy7+;nI5`1njn2Ag>4GREs)wqtdVtp~=oUmr+XZ!eZ!Nx9tNj&E30D%D z?NIfh#ftDu8PNI%G}MWAQ|Ye{(N`{*o}2Gc?)&1t;=~Jww!S;wO1kqC7YOT!M-Cwi z67LFm?AhdW`|VfkZ2ILW`d7nyzN?K(GFQLu`(9$>{O=|SO#Sxe;c>U?#F@gXmF2PY2gbLWMd)$aK>@|=%gfh#-<3`HX0_^ieLC*Epa+9Jgo-l{gH(( z-K%uU7w*G3=hX3J#>0g7;Jl{Z0H|TJaoyUVk)z=T{G=?0uJ7ynw3()q?uuKD0ElY6 z8CLpuO_`k7n+gwYB0Ri%YrWKaOn4cHhWbuVq2XHx>yMiCU-?mo7Y9A~Y`OTQ9BMh$ zqm5svcGdOq{DB&n<8_Sx3gmTmUD%kv?WbwLQp`o&agDgALG*y~LtU}I8JWRd?~N)8=k41}B+8Jhb&#i(`!&{U=0J|=7bZkq)nJ8GFgYfc3j|1$p}z6jcJvV&6A&B;+Fkz&rQXPNb6 z$P}5D{249z13O3^>4WrAf&8AFUbe-1fP_^Zu}UO4K$r5&)EDP9a{Aya7oDy>mno3^ zd#8IJBW_^DI_r2G9Wr~N2K-l>5`%08%y(RFMa0GX)@ zP!J&FcPbubB?SnMNr?T&M}uDkdq3jK)@7mhr<7+yG`MfI67zIQU%3Wp?6>~0Zh5J5k7%&r^pQEo0atg53_?E5Ce)^phW`}X zlyRo6^fu0Eghs>-nNfJz`+UP}?n;|ox4ay?OKT*$9nFc*Kt|rnm@Sos3ps?7X7Tel zb3A4DJo;7Rq&UmeYq~MlAv~(P>B7$7WQHURZQCayL$Wc8k#^VmrFw+9PNEF;{L)N) z-B98BW_uYL4>f8XlK!eg@kP5gB5#ZrBlUzrI_eP{eb2>Wz9;;ih^)He(u?6@`q)%X zo89j#7rObvFFA3#4g?);lI-Gpg2GRX_>1#nM!F>6iMI|JkJ*f81NH|(;Kg|xCQCK$ z-h21~H1+m1G8mJV?z`e}ruMH}0LI@c(#kkFK zR`!@O!`@^L=K8_i`_3-xL(G2V-bbILScE?C)*jnAdouT1N$7NZieg5K`j0)RW;u|FJB?MuI>=ciak{FKCwva_&oT4m$nKtI(p;Iv$1 zzNQjx_Y-o4jl)bn@9H#p^o?)*_&yTK?O3im+4g;H>v!D&ZgS^dcv+5Qsp)u>@wn$> z4cL^i9n+;Z2%Ljb@qlW?=@r(WHFy zV*=Oi`N2n|c_(VxekJ&yMfAjZ^N6G>1?%oF`>?bwcBlfApWs6|i+7 z!c1ahbH<8!vK~k{iQRpxV&qR7v4HPg@wE%aWNgon0hF1iIf3OAZ_(B_tMBnZcx-Wh zVq^PVTbx!+#L4)gS<|WJq02W4Y9dHhztsUPf#sl+SpP8AVXBK#gA7AZ+DIVDgJ0r^ zyVvr4ZD!C3{lEYH5KLO*Lmm3`xwK2hftK14SyTSCoA}X^xbGGe>|_Y$H{dHGeV3 z20xKIM24(4fS+@xvzJ9T%CAlL_A36XBjR_{vXm(+(PAA&=trTpryaX4r)J&?sf12p z7(!w3tFHX%eN{kBHNYq{qiMDMzfEg7dsn1QDKnFumt4@uF1R|Hzv8lRGAL~#DXBm4 z>+=BP-=!)q)kW*bmBFeU-z|#At;OXG~S#L7Uq(!eU^Q~-Qqoj z{w9}Hlb@#6o{LTQsxN?nMgYw&u)k=TPqoPI_Q=}2QRzc}hQcBh#s0R+dxU*j3X9?@zvi%XM^7y2 zZcodk9=cW7sos-HoY>*1_ps)~$H5pgC2C z-TLl*Lf)IGLqQRJ_NLY`S#L#}JiYcMpa!5!)O_V6NtS4G#a&A<3r!0nc4}o$)lX&H zY1m}&$(;081s;0&Rb5R5=g;{U&zU}zma|wb#mJ%u<3#(R=ScFW-}%Or!`sYMg=Wcw zfL%iTiA(KISP6UF7q9CJYK@T9kJXuRI8_p#Vr?8*#a}pw50;$Ne&?x%e$`AVDkF~; z%uMq_`E?<88=WFv=c0Pjy0rxF(nDajpjkIL2QUdT&d0Cu&E?}T(8S-E2*3~(#`(gHs926GSJ3RbkB!evMikwiMob9F$G>=>?Fm-pmb9Z2W9ywxR zrm=CY$g$ktv>?uM;ddTY*&MGTEZoU@HE`kX;)wz%x+QT4_8RmgNG~j)+@Fv?;{CCp z#f-X0`$T_5cI7>kZ5RIIVym<9Pf^6Lrqv!Zxs z8C=DNSTAe0GVuNN&1M@KqZ z$pGZReM#jaX{40xLj3GIfDcHSWQR;O^N`L3@YcsA5=H!kmiZ8CZ0-tW$$WV&$JuY^ zs5}PUpN*C|6)Sh?%ghD0zV@BEn4W(xPhwxZO)D-^5i0j>#?YwoKM@;4ikngXPA$Q| znzeBI8kBkrDLVtWf70mmnbua+KK=h*Hoj_9xf}PE<3r>AlLEJmF%96ASs`7&_Y8Jw zQbf;MQ9>dBnGw^$kFR%eKol0gl4kj)57&I%?%<^iVcC81>7g>OSKt zffzvDXoUwWeDz6Rqwvuw#^?|_Glv0ge)~+4n_-(>cucA8xXD4(DZeN8)t=o(D0mBKWF%P2-O6yX~EMeow^2+T9%H<`GcU z4f*%ly^kOTBL1E3F~-OggI-;5v2l*Qb_2$f|Gw#uRPAsMpmhbzo52?c5n#cz$v7j* z%u8*-Q;qJvzp(xo^H^POgwmJqKD5vWqOC*dPT<7sXZ-KDFWzIu^@KWk%q654(F=YJ z4YlB)O~n=74y z9m+VJ;_SjJc`QoR!(jMn#&q^fCd?>$|=I1^u=}(-T21u zyj%OjVF)WxBF10wEx0eHwMVkik#c{RJMmQFdzFkR-=nh8I@#r939i-US*|0~%<$1GOb)oya0L;nygv;tSdn5VNV>Qeq#Kh&OX@TVIG-LX;A0!C2 zW0bi?;>%=KGbDdLLrX9Me!@+~A4Gk5S{uaojtw6QV_V`sSx3Th`9rgC*$HIw70t&y zDm8_LbpB(zhHpWAP1yR`xGCom`N>QEBKSq;qFuEw87*jAP@kVzx0Yr|o@j^pJEWT> z@-1jP_7bK`ykhg5H=y$g0lHd0#xS->OX7y`5Ua3#m}nkC-9a*8#%M_}L<%smz@%WL zc);`a4|mKTGmmX7_S3C(%)mMfV89F1VF5y}t$LEdH>*u6;g7*=Q0!M1&5kR$R0JdF zJyEj;OmoJz$eL?bWG0A8fZvj^*rV6?C!#e(P84AcL_d)hB7VYl2!*yCar?3&6RH4) z5KE+jLQ-U^3j@OEGqTYPtcMjYebBA72Ahvwz?4I27HS;}i3LHTL|_0^ldR6uZmfuV z$%sE@wVqea7t@!Dr_=2<2;AMZBU30G!#9jThLjv&8?q?K&6fsarOZ}h>#)+`{`y%( zhsz;=G!Yt#=3x$XJA7k1wg^%92e5`?=oeHWRXw|{$qeZRqh<%AQQcg4G|q~@tl-TU zbO3+P&QR8wM&pOLfy}~zSKBB*n|{oh{`#=hIfHaF6bO<=D(1vH*0ogsdJ!*&9mB+; zsH%CR1MCg}b}5f+aPg%(C^C)U&{7@AeH&1iKTIuot!*BRWXLcTfOYTlMjXk_GX_^( zr2nx-cyMYhXk$KuRNMHF*^LvqA~vAD=U5)I; z0T>V*ORx%E*^=9M#_$fLbZ%>H1icl7yG;V(>8-iOCItKh0ij~B*PL}j=nuUk0W>50 z1mu2UHl}tfIwGTzy^Fi|5mge~MFb#nAhUm-woZ{b0v2_Ov0#O!j!e1Z1I2BJEhu;o zS4OgbA|gO}9z+F=RVbhiVK7(w#4vB91zvY5Mt7#$I@f~*ct(UNUzB7$&u|0&4MDo4 zqQvuPA~)I(gHCBzWR}-F#QO7xy6)dVi) zN)x#oQv4c6%8R?LY4Am)7y34Q{Hh8^%KaRNP#5@59&$$pLa=KI4EmODhA&6+|72$Z=>=0!1S0yhaW)FS<{pItDdWB}PA+TURi z_u#aR;(tPY2$gMI8Ry7&w{jT3`G{=J_`8*`;Z{%j6ETArZy7@OTMcP&J(tjn?S`rP z*pE)Lovdi|oz|Bd2-&Nvs9xJ|-kf^Qv~gOPZUh9NSzf#o}_*zwQ)I~Unau2Jie@pV9t@ADfxAh9WbsizJ1 z|LX#P{9__fxZ0z$xUx2z?l20t2uj8789D&q?=}{@<)F~kc0ogtaY9*)e7}4ua_XTK zDmzjhAmiN5xuQYD2ZD~j2Uhe->`2t4?Xn7m5#$Om(L^Z%9y1NrFYnRK`#D;bYUj*@ z<(IDV%cup%$chk`Z;S=p@waN4KtnkDhR>T7@ANZ($+1f@ zJEfUU^=U8}u~#*G-k5Hbj8Ao!iKiqJMR zO{B~TiEOZKeDjuL4MRUc^<<&h9M1fk9kz4es=TVGkWm>D?;KoG%uCa#lXvlbK3D?m zu=K8jOKkJ1>5#iWX#edh3tgvMOC?$P@`PcpKVO00RJ-~%uln5`Zsm&|YxM&$%cwxY z#u)m*qAz|V1h{PQNO}rnq!edibWC7ptASvwnNdh!0l|4bFaHJ zz}5`C_=4U?c7HI^oy;+I8H8(;OXT}bHdJ#7-Z0@@3FwuRw!vYOagb7B5aiC@R> z$JQFBZ*ZJxAvAy#QFy^UdAW4jnu4&0b7Pu)0Qk1YBbiua2*ny0iW=Y|O~~on*0I)^ zXEt*bT<9#c$3djz33Ck4PAGf-XDKYR&^ee!uaVui*Y0pt{NziISRmNKQjb`(=Ax3v zXN=<#?f)Qu#+?<@0VXp_pNY**TJSsV*a{NJB=4?$L2uF}*<>f-73T}ZS_u$47c~c_ zqfOgi(xb4i()Xe7czB8kOxbEg`413u!)z2Cr<|OLyaAKunlY*r(i^G; z?`I7ZnXZ#>gGN&&F%>cDWRDWK6OW+h4nJWn7VnKMsB((keDT`L zPD>X6i0B~dz7KV9NZ9lRBWep9fvG7K=$JQ*1q`8`XI#3}=Ik=!d&3(9LGwE23YD12{-uu6dF-D)ni35;qIzE*XDc* zB&xdPSpYjXsp}KUhxlF*`a;FhG+EU`J`>Bo&wV{O=cmpDhMX992|ycfnnzRk=I2jP z-d7wIE%@INwS%w7*ELD4y6&q^=>T4cXmk8Pqrdv=TVu6?V6qw*2 z?57YJQI-1$dRMmXng3cmwl~TW&b(f>4O3RYUs*|U&$6hs)98Y3E%yDgySnV6ID&n3 zT!qFWvG$>CJ&fMgRmyhNzSJJZ>3)FmM#SI~bZq|3iE#Fg<>-oA~v{t1Gp`NSDhNRNptvo}pOovNlTSANH)ajyz0BvCsQEmi{fm5qd(a znqyroO!(#oKy<8S|5=A!>-xL)k~q2>TPT{kI#;=FEI*laN>f_5!f(NBjLg6O;Brkf z*MC)jRe&#*odo92FikR@Ug?JAH&}?!7Fy zI;_pj`F+lh%*}*wUrYzgAtA_p^%A(DT!}F7qUD2=_%szV1N2)#AiM| z7^cdvUge}X)JzvM#zK==iV`8|0^lgacfLB6)BwqbwgtOBbH23@O}Oz#LgIK+j%`hE z75|OQ*IF%kdGXMxS{ie>K%LLWLFfz^m5_ZVG9xk+clp<(80IRlRL=&^Mil+(T?;pz&mug%7XFLq6#RNvt zRZY=tG-rfp;>di=hKVR)%|EqQFbR!c7;HD$gCnV1X?s!G8+ejoCHGPu*bPz)5G$}~ z%A4{V&u_VI)@6SJS5z-ggLUMe9mHZ?m|fdLPmcVE`<5m8XX=^6rHl}ljmH@;d27vk zG}>R?h9OSeLNt~oF*JXB+Bl$dK(%d3)M*+kEgH#@wa%=PMYHx%Ls|Ck$)?zLQnswD zaQ>J*aZLS>i3v9h`T+Y85N>*ja6_oNXQRPTURv7r*iZcQynYg|NC{yfgDuP|5w4T$ zwir}tsy|Z3a4$Lpp5QWg@^=UrMJ{>;Sb}$Cv@kkhC?96YQsaAIi+e-GyoKn*Ree9f z#FMK(($`k4#FkjPcv&+&k>rzkPOF8n0~KrMTsn-Yk_y#dzAKfrkKEsJj~@$ij%iH*7aeSfr& z#E<9FhKMGJ<4gksKh47tq8AR-I;>H_1Rx6cEm{-m72VTKk+tE<*NxNx3OXw3*-i9> zx)YkVJ4wAWMbP|p)|5U#g$GA9Y`TVFfaP2uF>*9&|IwfZKET-3vN^0e zd-Pro+)(*AUDy%RvbmysTo5Kjgi2`P4)%IQ6VylHs4cie{#9BAt-}Q;^!$1hwsvS< zj#DJ{WOanGrDiyDBLn;djIW6fH_WK+Z(9%}lSHSGOz%O)ayAAE!~NA^UM+Pn6rfkc zDSFj1BRn^)*IVL24JEdLLxAj2sC&mtSLcgK=yz-`xsqKd^$s)y-NGD76)z9yEFBmq zybVCprPzUn$$l#fT^WFi*LzRWXK!Fs^m?FP|3X2el0u|Pt-fWYKB%(SKF(5?zP3jo z6C~6m3~>Ne&HvilrCQM@zl}L2%@(CE(MEmIP#lrwI%eoERoh9!V!)=my6KSppzdl; zFkY&mSeiJheW$1fH+_pz5EMP5SW+e2AWd4wn+Xq|K?-CI6rB0Mmh^X1a`N$pSdM4% zI)KfATy(boDwR)d_OTz;B2O>X4NxlsoU?^gR<&Z@0gKqrkzk~DkVd}}31ZhcD>&rN zukBO==^-fw8oRIKy(3p#(?R6J%BK-U-YWuJEcoTxfSq|_|w^9Cso@H&TL>z zoB*qiXj8y`F2XGmh%XPfSr;I2iV)FU+Byj1b{s~nwi z>vtVE#J2z=xm%ovmKT*4f2lj?C9B(N1{-y9$^tk?SLPY#<<5gr8D?_%E?{ylF!IHX z5ouKtwwt{)M?&sB2<}AivpSUwemh3UcIznezxIq`cYv@)WG8h8ktUc1&qg<(A-_$j zN8&w5ySkmKj+sX5O*_>fSPMVw*YMewImgY(;>gBpu2BvxgvJ;O$a8WHUyG0^EC{`r z))bKz-&u6YQBe|^1R;EWqK1>aB_v)?@g#S#S^^KlUJ@N|mP*ER7lPgLjN#^`Z{SRA zzw>8S*HHau&OKMN3RyE8#BB9sg`PjN167^u6&L}K#U+4Z5*YO!C8`5a#2f2lGV$AJ z;psiol+Kl4yu5VvhQX@s21QLta$COz`&g{B53BAL=>V|q*5JTZ_5%=~tX3$We5iP} zi~u@Yb<>N)PMFgDhh0{fQ9&vZ=*RL5$3UlD&3=@q`}yoqy*8= zI{kopF~-}1bYP0XZ$X1BIBefTXa=En)NAJ z*NPaj^N|Sk!!SttvBCbT7Ql6f3>cGqB0pY@#yHcz($M}%ADw%|^XiT}yAvqa4{6!uNjoPxRTwWHqQYyj<)?8nI1 z-5R#&Ey5bD2pms_XgDKm$5qa()z*W=1gK_-?5HNGu%8duGD$Kzu81$w{BCs)xJ&ky zDPJGYtZ<780zhCn@S=sSKiGY?#2wM1>y#FZymKJ=@DA5CoQwLA9GxF1hVEyNX3R6qTh< zsO%Zh5Gn2}6UMfqP8K)aRS*bw0i7q}AX6Hy;KV~`(gpb3c`^~Aj+t|X_7Y;ToVAwK zsgTUDkc@PT^(VVb99ISm!%ieE1lrkWvvl5xs0?+7fwxufpPG3{cmt z{-hrfi_O!U=uw6wUMwZtB39RZR`@LK3>y3}J+$Ev^(oBtMfoCiXJ&#w6K4ts^ZY;( zurhxWFg5hiK77@rH=uQ4QtXFg;1xJZ)Wme`$Ow8DV`_{@!juOVf^xNM{xey0 z!)H&5pf$!FKbZp?MLLV{TcosxNztawBWQXfu7E5!K#&)5fAVuwasqE^UgPOTxuHp_ zY}cAwc)^Api^!k95D?T%3HmfrZ`7WjiuQ2Gyn$^DLg2D+j&r4W`Q?|(bg-)$1T$W| zEf?JOl+x-q1Uj4NWx2*F(FC012t_7G2egke_v+rok9+@XT{hgj)Q?^qhf%6CNwQ4+ zj(~hbvq}``CCzX)&G~D^xhb=SfWLc$_)hczO{kzEg2@~MPl~8pbUG4iSUk8ME zsbCbVa5@RE%9~I!B_31!r;1zZYTkx2BY-l7GLLRsgTzgEpzP9NJIIK&k3A>yhdwt0 zwf&YQlg9WrAYHI84$sRPbp|mCCGNJ%`7BPgj^Tq;2c8qTCvB#-7QDpj2|~LyJ!SyP^o7V>h9QH8WlRt)E^EMdirzoyS^K~bBHsL5>3%8jsJz>V@$G) zj!I{O^NFPhVvc;j^mP_2j$G73X)rlFcQO4bE>ISl;=yM|Kq7B}bsU1soQx((s%$4D z-m3-(uzL|>gy^pzkWcGQFDY}d@`s6<0e6wE$h!ZXI5pvrt9r^7p7zt(sy};r$(Yq>h>&m_$w3OCTmIV4i?4Ko1Ld=vo z)MSUjC6iw5u9wM48oKUxB-kEOlhK=Ix=c58pQ@`9&MoRHhy5m@RMs7OHj7Q_^<0Ti z^ozxjHR_|)iXmgD^%y|av0kkKK|n9zx=w~o6_}jdyn9KWHP5*7 zg(2VT{#RQAq=4O_{AXcXXXgXGv=}@zlc&n_Qi7 zNX<=E>X)p@5l&uO;rGrP=tZb;LiP+U_j41vN=-05ZrQj%T;nzv@7-%?lP67f{B5Bw z!-_Nz#3cLFOT&EMMGGdTKUDu~VjvkR-DMHMimTQ(?CjMF9jGyx=v({~a`=`izRmON zHYO=xbgWs+1oINPD8nF?iZqt@nhQv=#OhRm&969^fHp>D_@%x@;S0qZCx3xcePR4p zH11w>%3S%t)uIWCDC5o0QeL{xHUnV3j?z;Gs@pV;O`l~?mVHgE$@0)gD zA+7|X8XP1Hz3-B?%lr$;KaSwvq|tz2%GbMVM2o6ZNxmTwm1kS?N8abdO)y-Yn_wn? z!UI7tO(x*T#2sYk_pvoK+j$dDAeELyWywj%njb->LP1Hk)CZDghVbpOdwGqW$W8~#yrBzy@{p%Wik&EDxg07H1bODUg;-3?sBpCS)7r|v%3jyd;;p;rc^8~M^oso@vb{{xSvZ-W z*1g0|o4XNFA=nzj)dxAFxWd&*72eG^eK{_rDpl^M5+4ICXu6ZLhF4xVDe`PflGdUL z#y#5_1ZR4P#Rkwa$zcJkFeg+1!354o>liaS-s`9EFO9}+Psh*hT#IlO-V?I;g3-{n zxR-AX%XURMK#RK|)((q?Pej5zAYec)T{1NIkXzJAf#=FplIpvn;6exAYgU&?Oh?QV zXz6jyr)n`eINc5%<3HF>T%ZMd<;j2 zMSfED+w|u69$&cu@V+UA7!}esrZo4BMj>T3)ZOa8uB_!iT*pU8WV@P47I`a(NolSP z6T`{Me|_H-4Ziq@^CfBzmE_1tNa=`Wl8$_HKzv(XGV8L2vj?ub)|08f!?L`KF!-?3 zwN#^-%{_j%&UbE(#IvOOk^RG{)Hva^I2%Sgz2PI@cx?!^tyG0O>`dmZMkqQP&rvZ% zHh~EMRP}@u7=E(cu*}ex<2#rScutnA=ljmu#LQs0==mM#^%g%D-caSQ=4F+H$~iOd z;+I4CgP&S=NU8;IeBGks%m@_n1Z`)}Z?)hJEO3~PRG_1J@%8M|;v>mn&qsRfVLiZB zf51^a%#vldGq;@qp`+4 zJ#=z@@n&kZ@ND+zHd%bb{EnXyT46%KZc$OE(9>Y$x2(ZVfvQH5MW-v_0k_Z+^eizK z5oa}(Up|hsE#Z|5YokA~dky26Lgm;K{x0W}*;jr*lQ8h|BNNs{ks_Vn-eAzr&J9;W%XYax{2hBG!S8jJc8 z^(39N$jfS8s-PbR>0kjLD%{%0B(({JLk^;x!ag^TMwbZ4{HLNENT9?pBj;YpJvd1p z_=2N#uW#ZFoqT_#T84UrMP6kMx}Q9%9hg3?qhif84aIS+xbWbYtPi=_d?$CUu6u3Wb&GMBF)L=yKnF5JU-=v0`oetah4r;>XU z))I3HtGD;OhF*)%ivxpcXzS{7NRWvnt>AvR88By0#(^IJi0v~ivyp{YO_gPT2~N?S z4}i`EbDXdS5Yw9J>+hJn`*Jhy^1=P@A4|Mirz2H527x|CPrI8Q)uyjYex&=~kGnk0 zxbf-<2az9iZ5hZV_$&yvFEnajTeO{RKjDcmmVH|pQTEV{+J0oqB44KS3aCMN%`Hz; zC*(jL1CmCvJ`RZCxU|b}k)?B<%^mcqHHN#H@2iK%Lu^%0@^89jSOT&qMhp2Qc%J!_? z4N@?xs)LM{jj7Xr_s-0X)~idbH=WDaA2jx?=zH6vU{4EM6=cKkEj?-2p{nxWCqILF z&FuX3%%Cr??5q|ytz^vh+VeyUpA@y`sW%FX;Pq$ZkNXA5wa2 zf!FwW8q}RyU=Zlw)=aVR>^f-JbDtf{yH9S*H3Aor#&4Mm3Z}*T^nn#~j!9LnMQgvt~La{Hh*n z3-ovrJpbOzaZltPy-KtNUHZ5*|M+a^rZb4>pN2r0y9??s_sX%B#U~$Za_x3|` zHq$}Mh1nHEAV_$md3xOw@)E^GZO&UB4$XX#>@lD*$Gn~##@7mfr>Vw()b)1}z*7xjbQM_^NrU>=>{`X+T z&I1jPufl;iaO~2*UkqRA2F(!&NIQGFF1i0KrSQjzquKT;JMWYR4d1E5N&_ELg4sjQ z66AV*t;1wT^*&Aqmt2p{IUrba$j(L?+p-LKz$0bCJP_C?Yhlz z2UB4L*Lt*;l&lU6IVM_I=HRhUrlq{Qf=_xU!*%WGK1oWcYuw(QW1V*=rLK4maN9^i zah*k-7~33huw)sgAy0H7jXH4uxJ{6%hQ0YB-P2A3Lwk`pp6!C7xxJQqJWn)S{~@f_ zhGb&&21YbTv^#GW;7&b=!@24cPCH-qIB*MI)*aq(xOrXf=?(s~8OCFZ@>Xi_Uu0nYBOB z_wTgm8FPwp_6hqOifIMg641m0ZU29HMA=jLX{O4Q+c|ax!t3HQCI_svOOH7+WMP>l zodfI3#~;;}9%9>U>!KID-grx(Ifa)OyZ0)g%5(h6m0^#;6K$c5r8fA7 zOOI~7%MY>cGfSNz|M2}~MwCj8%pyxd|MIDBgzj2^hc^Sr#p)-3=ux zeGKoWME|z6$YA1|Tn?nSFcYYLYn(Pm0yt25x^G9wZR7eJexXH&h=P+f=r-HO&XJv=zfC4ol zE!pIg}v%A$R?+9ihlnx(D2Z^7Pl z-Ny_vNiLBH?KGlNJ3xgTa1fiL7g`j#-uCeRFDP~`7W|gP8Zq4mvQ);%}&){jw^pu#Qbotb5hueM%wiu3d0Xx5I_+4C#b;Gl+ zcw?TPIj;Kafzj+s$-Jc(nunTG?h+@SD5SpGS(4L|(=*#tUbPfW;SP)I);m2FRF>uQ zPT9ybZIEZU!16y;i}mat-w^0l+aFkIGns>RTGE?LaMOM?!$D44UX{7=!s_dh{>$-4%mc@?CX!$j_hl=ymNatL}IKMa0Kx zi$yrUz~QPF5gGri+t1KL;$}tOHczRqc$dsrAN@^voiHf2T7BtzP}wuzhfjhcSr=>a zN!htw{`7B}565*ZU*IGtyIJ}w{)V}XGnqNjm&wsrU#xqEwlGCKu8!O2mfN?+{Rx%l z+q>HB?+2S`Gbi6kqR-xXeeY52==d9X=vZ#sx$FFjZX}L0x`tT$n^onPtsoHHht!{f zj)$eIK7FC>9elnj3ASOx2hU|=)D`G0vtk3t?l~kzDmsxjw>b<3yuE0ASX)QC7y$@1ag$!qX z3;wR>mv-&j*{Tp*-k_DZg~CNHVB^yXJnm70}mt-A6R7VJ8w-i;H_GR4SlNw1Pt?>J!!uR|0jQ z=Gf6ub!w;n@ntTt%GGjXcjIN-Rg|mObLQeBYr5;}q5EWg!TGfV*YmY)*lq;*?O%yn zv(XpxQlrtx$~&0ji`tNXU__j0G;9HjP2xQ_D&zSMZ~wr5enECJT&`*=_cU)+qM#zh zUMAdcd;iZ#VQ>7OyT$$hKf=)JdVFq#GtXR22h}ya82a3H{qy==8}0(Lj8%q}!YBXx z?-Mg;Bxy~4#(OMX0V^IhZQK6$31oibuoe5{5a|A9PQBTPJ6JIdexzJM2a$Ed)O#=< z?+;i<5pF#!ZR}OAJq_^KrOpY>(VKeXE`AL*Dr8Lw^qi#uUc&1%LYR7QvyyJ6rf;8m z4+s;;Pg=o~H_;=T&}HBi;q@J9??Zfymj8>*6p$vs%aO3=Bd*GBlIYRcvdK8S#~XWd O=eE6D3pe}y{{H|s`#k^v literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/splash/Default-Landscape~ipad.png b/src/MCM.KidsIdApp/resources/ios/splash/Default-Landscape~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe8925527e001c9a4efb8567d38209765cf4aaa GIT binary patch literal 22655 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
mg9ETuQ^`) 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 TF0UNzIRLkno=z2x%)|c&{KBF< literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/splash/Default-Portrait@2x~ipad.png b/src/MCM.KidsIdApp/resources/ios/splash/Default-Portrait@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..3d06d86d8585bbb12fe02c68bacfc1927ffc6287 GIT binary patch literal 99461 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%0ApXA> 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%0Dd87#jsQm)JWw}c-6N1B7#08gM-E7i z1`tpFE-5eQ%`*B5hm_ zUkwV1|M20g?h6u5V{H>zk(jMHcu*se)54&#ld6$^6Hi&c0IDeaR0q;Nf5;1TukpF9 zmCOL<;G)e=B7?*;O(7bYtQWJu+w5`$IO@hFHi7?)S~g=65J z(Ea&XN2K6>miuiy@x>4Fwx>?7BP;d_d-W-I#l#<>mD;^K3y(yvKDm1aK{gjdpp{#x zI)O$g$h&a?_UaQ4tfPuViZ5#b5zAVa;jF+<<^g+>;dF6+TGzCsroMi|?YLj3w`EP9 zD?V@M+t&bvD6y&hAoHnU?D(-O`8?c$i!@7*ql>`>^hI!_FHg9*A>CZpX4b9q0{dTW z!yE(|k45(l@#EkBh|i~Tjx*pfC+7>^=Q(es3tNq_MJ6>7o_;44hWrYa*h@09E&nQzV@oQ59m94{|6s`0{d5h+n-Qlb=1x%T>J5 z);ay8GGAU65g6P(A9LcP*|oyt7lP~fw?q`AKs2*+lw$(!g$u~VRR7#(4!icKbmcV8 zjpxPc=1zptX;=7v zj78~qz<;ZChN*5Fc6n9Z2qGO0jexyv9GWQeObQ~6+f)AJQab(fgdw-drG0Z{{X+!4 z>?r#EQcn>%d>L$gBqJCBEo~?3$={?YvFeR{&!bjyUP^?#)gqS9wCPbQ<<`%0N~T;r zFQMQ*Ap0k4X=IN^9vou9?B=J?+L$ZZ-W_)=@tu`? z$BzH*QE%xFMN{iHW>n8+*i$`{9HuTft1dBEUER|ib4T5~bUdY&E-581^X~%tM7|%W zR$g%mUMtt)fSbsDJ6_h6+}-_2kz3I&K7F>Nq~yz;;VKc|M|*K&XTzAt3=JE9e)bf- zdH1ASk41SQ zUG;&@dvgVKWW>K_pP0U%vX8B79uyynM=eGRV zRx25gb|0KG4s0rBCO9}gax$0umVJiMMd|C?C~%D7ja+9M)|!yTo63E&48~pU?gDgM zfx~dgwTi?=vO{{>12MjE*h6Ph*=0xE=53Sn&}IyY?}Kofp6A{3?e^4>wrd?1?VxUH zkc0gh&vLY4Z9c7=KWaV-Hu8J5_5w&(FHF`O@tkoqqM+Dr0xY-~P9`0|R8@u?sL7A6LRyh{^Ro-FLQH6TGHGTSjO#I%~2Aq z-8UJN;GooA`?!=KH1q;w6a*K4QqNy!1n2HEg$Jk30NGBl7FvBbKW8C`mjAdKQ?Hz6 z_{H7pJeRPCm+(7syct$y@7&hxwFeI(V4C%TjBU-Lh-#bxHDcK)g9gnnoMB2iqJXq0> ze$DNebnB?=-S9j|lYYvZn~sic9Gi!xUl+ApUHZ83#F8UIqTkbx_luTIT{~MiOoGkM z79^+VJ)ZJsv?4L4pIld|Wce~3hq^gF5IKIDqmuu0EEmPP5;@DJ_EPk0#TMU(#%F5| zw&`y5uUrN!le15uEl(}nk*GR0e!=VOPn_HLC0tJD#k5m%RUFV3_b>m25GXU}QOGhi zRkM-FQ}^M?FkjgBo3 zaLpTXc3qkrOQC)|pkOP5l^LX-gBn-jYoMeuQQkA+?sEI+UK`n4f(J*1^kfiTR*$VGEp) z;-c{RC0X$^a6Q#sN+SwFF5Nq?c6g!`w7;BMH#(-R9{752#p?5h?%%W-C`zbEZy z6vORL3NK;WT+i7}e@-8S22^$0w)n+?BJU?!MS<1V(bFg4M~g8GO8|F~ysRtE*CL#@n#(TK(z`Zhfqp+W98P5_zDR6O{`3@l{{3@x$O`OLEp+{TShOd&N!Uc#Lit7; zcnl%A7C72$QTcn$YCw;9K@oq2cx+3h?5%XV`L?XO!Cp#=7x`iTFOfQ< zc1y(Xt`sO+mmMvo=6@982>z-F?6rgqXmYQP8En~z;Z=G&sKraKe)uw=x_3;~RN7wA z@lnJp(Wk+aoGc}C)7;Rc?`e{&Y_-@J*Rfc6u70yGm`iI;Q@z$pWHkQ-L}ka2sudlc|2cJ>p!#)s(y!2UqW7F>0cEg=|ZjuF6?>7f8kAeO$qDD9%H_y zzZJ^QSmv(FLtJ+9)I!#r*h3yimHngN{~WF+ak#-~tdxgcA7srHZYU{T?IzWBKaS>E zEGc%vuA`b-X&AF^j3ht+M2iNMT0eULow0wC7~s;VZ?Q!fluN}AVsJXO)lM?IYmP9) z-XZJEkE3~khiNNgEBL_SnC|DkFH&0LMimCd)zp;GFK=*l_MlfY-fVCWBr;QvKB`%p z*r-@rwz*|gpXY(H{h(4tozN`3)^!JUcs}^}UKXzq>leu^NIs&`A(zwjb4TW)5$f)n+xyaXZ3)?RLcNF= za#~oR!=kNab@2Y$2vuUI;1jJ|F@E6@+hGT4d7|?h4-1XIwmyTpg&>d5HT3!3rq-db zJo|PL)K0G+k#ec(A?v#dci64lpsemN5}DR2s3hC11l8&5WeoK(wD#f!>stq%@~ZV= z){hsIz#vQyfsS{Qrv}~bLW1*$e-|x$238Zi#^k`E3|KYyCj1TWXAwH#;Y#^kXdA{s z4xA5razVFG=6A#{eO>)FP!0=hntvzA+h+ro5&-u^?^gC5azCz zdM0sWn;Z)6MZPg1XUa30wmJQOZvk!9v3knl#b+BKzBn30J zQxol^KWyLe1j@D#^ObKtStKIqTF!&O&NWJ9rRz_-FLxF4z*)(CzY4hry&2|dM4_Pp zt@$$ElDmx?np(rCyqH9WBt#I_HT=!Y!?zm#zVsYiiEd_)tkm)*FajM6WO_=o0(5!j ztK2Qc4A;#K&6*I<2@8(YG#{HMI!> zrr!pWD5d?8Os!j<7aTSqF)}_ae2#T2$UNcD%w6Yg39lwfXp%ncxa_7 z{IO{9g?CFe4b^i{tC8)eX*kT&o2)0jDacWfK=Z=tsWcR|_IHy?jdG9>0jrl`xcfHy zCIFuN)UMF z<6QlqJ!1itv_s7$nWx zYX&e+uf{`j$D353?%ZnjDsntJ1MnUNKe0Mm*qiwNBM{TU%ukqc1yR(Z@k*;RR#ddE zRV6;@77E8$Oq=F&{mzfH4y3UzdZISxhyWqw#zYl24Z8DTZRANe7D50pJQ%ZVd6Pp^D#9ah1>|OR~Lv+l;o@YolxQ zh9IcUW$wYSW;eeY{+n*Xh0(4tlXd|WZp)=Ju@NYN^Ptr77Pfl-NP9hCC8QAd&~rRL~LAQ`I_8*ZG6rl zfh*wlUQIs7*Sqm4rQJ(C|i?LRmlch=^)g6i`}$8cG)fmS%*>iGU%Zc_XxT(YTv=s zsCyjjdaJs`YXa-Cc?a-k(2y@m`oq9XY$X+28=MbsSy&_E)0fhFHzkb08vq-IC2sXK6BLAWxKyK@`*|OvR3W>eu^Sy&G@!P{< zimW#+S@gb@IEG{sN4mm{-Q0`xbrhtE3YP6u{fEu3qwx^%!x6t&Acxe8zXh)M%58oF0-a~_IXHd(ASkiyDs%G7V*zEqzFD`o6Zax0WiRCi8JfcBGL1=Al!`cH{K1CZ^ z78o~4NE7(&qWTXAgv^}XbJsBqEA0S$h_C$jfd8to+s_)R)$m${(o^WN5)X42Hu)Yy z&h?sjt_HoVm5Y>l9--vUJ6DVx^X&!F_C(dI)?k-CVlI6D3uuWxt8=ku?eeHOlnT7c z`&TargdU2+8tv5em{BHio#V#Wz1G3Tqtd@hYL;YG31=5b{dhZI=&t0pJ<2WOu%fcJ zwV#^g#u$<6G1S6;@=*DGm_ao@eZBQbvtZqK?fO9grN-0O2r|ghNAgNvg-&=no#NSezzzps5kU5X5EDS8D6DULK}$C7+)RW zEH2ys&#Clh>1RYIdo+jnR_pI()`55truN@WV}TA^dvY#LEx}o^?$tFcxuO!d26_*v zRWtYB=CqNeFc3E99S3@pE=$3n zm5NQnHn&j4JaL^oiuM}Z`Q|#E)hxL^y7k70^k*q4;H0~~dP20;!z7}C?m`j=b=q!; z=h>H%iw_Exb*$L5GHS>FgQAAy1q3vH28PY$R?MwwDoXv2huSj1r*lAR;LzNJADM8A0dbE3?7Vok-KkbcFazJ2LGYjx zc=@~;dfq?QEN^rWT5l8vWhhu>WohQiwcCM%X3`Ht*%q_#ddHv((d9(Fb9GR5rQW4ngZwn+$`T7%R z>BAo7V=!2f4{G-qS9sgNDrG+evG1MwI_HkR#&|jfjl3B{^6oAu2}s#7?j!$$%5K5E zB6TyOS59$5oId_DvsB3iwg>(VtG#j0?ZE}54W+Q43j4ymAOsP zzt&~ti-a%5tM5teF+@5g$1|Qto4MB@UZE}9Pobct!~WKpI{<>HzxLd%o*8Ei-XZQI zWp2481dvD3z49H5rL43#-hl3To~>6iViPDBUO?m$TH6N317QREX<6c)6>BX^S(k6} z6-|~sr>(403m}q&%2!T^X2*F|`+3z6Ayoaq5&xRzCxV0owC_0+y8!VVN^1_l@k7pG z!h2PK`nmOoM&)}A_f0z#IOgX5=RN7*?T%b}8Vobj9xAf>m(NM$db=>JSK zRthS0<=Os`l!7h@Ca9YDei9WWtaj}vqV;XC3-LV|+Dj>byMYRNLt5yizWuc|5l^DE z8rpn&6BTZtQXt1^P9CPX6I#3WHgd1ToOKY`#{s2NeCm=qd4%v=T-(~T+W(tMxSocb<| zfd^{wrficg2M7*`*R@1HCERVDn?en_Auk0%?~vr0p{Z3D z;jgb;MjXE5?aU61Bj@Cx*R)hz#a-|Ovu5K6ca?X{uLtI0Dl7;=Q#R{+xvR$TzCt8i zV1()Z(m$87dFU`?Vress&J7&|+BZct{!Qv6^~#@L%({FO7}o7_3UUFwx>Ee$02{EV z?9pEm%T`h#gRLR(-92*fKmM}85otUy5Wvm}o9DdV8MzK3;&d+e(a?0Ep-6#vHci3r z8`!aq{^DZYjw&1!m8GKWwpHr(+7y)yFnLF16d=NrH@UcH(Vm4}r2clmwq>?@#Y^-6;l0`ob~-Q!a@Ac8Xjil7yYS|4ixQaS67alSjPNAOi}~-32ZT^( z!7Zv7enYZupwULZrq&2PU7fktEe3Ib4nYu!#EU_Ij~ufc^43$5Dn}awuA`tX{LDbw z{a6V?T#G7>lq)a-H1NiDnel{J(Mg@K&maR?#6Hu)eXlOXJUMb5RX2FvK1fsKv$+WB z47Rf@I_1Y9ap(QGwTvZ?9Ln;LWi#X0(%V>|MI%f`j};g^v{}~CcrRQVb~|LCzLgq* zP=+|-<$o}F{okww1hTm)N=dvUnF&K-;0^_;3kMIn8#mbXph*R_AH(g0b#veX8UTIi zn6ocwFL?B;N=7_R8>b^XvZZ5{RZS#KQ`=_l17H?JNNGc~<Tb;2oW;K+;us*EbjOJUd=4}Zo3g=D*hy1VfKaqs5lE`H z>-8BX#uGqE9G(H(;IAzLBLbZyF0PBTFRQ!XLeI5lYX2ON#$@gXJ>S_y4JN?q@|96M zunEzN*$R__bG&fvc=5Zu+&l8!(X6}Q$GrQ=_K!lid9 zZ9@1bYnGK2@-=#auhBslDMX#T;aX$pjp#uYJ2e3TraspZ9j}+JoT=O3tf@X;3WHEK z?B-TA_K;JaTC<6;;K1v}vE|;Re}1kNz`U3zxQIN~O|#70*|m9Bp!-l=*XBS9I^Dth zyS%*A?WBRh*6$}#(49S}P_~Js+&X&go~rC64={Ga$@Rzlh`TgI7%u-u(1VOK1RlIECb%h2)&=vPaRl zWwLAciy;I&^l>)-uSbLQ3lsm6S~e3dZE`(zy}j80HX@U}wh}qE_FuCaxi5hIGq&f7 z^j}jT$_E?SAVOGAC;a(RH6Vd(A`omwnK)}{wam*M5=fX72p8M*^>M3bpw`*nU8G+9 zCuB=QvM^2(NRv9?X1!}o%CU0WW#b8#VBzb3pF_#zuae9i0l8W<;mLUP8&T1fl|IsH z1P3=N-+_@hCaL*M6oP`QkrPBj;eW2@_BQ(q$#=ZlBDym9m$Z1l1n7_e7*7EPlak?+ z>!I~tMd**Y={g`9Tw2MjIBi^td0h4R>GD0GFu$k=fTD`oVO=UoHiE$QiP?yq^SVIM znlK`5g`nhLnE3hiXYZPHKrC^8?}eaa@RCC<~TBYgFAP>>Tq_7 zbsBD&mxY@FTg3AghwY7D>`f^jxOY3qelSSw26BJ@jSze^_tN1P@wXK=-bDXo`@vnc zYP6Ok%$l0V4P6$W!h%ZcLknKTF7233h@D_+O-!%6L<%TBOVqr8jR^iZ?y{#b%+xxz zHC#M^9V`PKR&mtRR-*@)Z`U`WRr^}{@7}b;Y!n)B4gdRUgchd1EILl3bIZagR2R_RCMq3r1m?r<%jWg|Pab`xaJWdkB= zH`eeQi^z?QsjOz-=P6wF=;$41B5$|bN?84g$6USnQwCg-p?dt-RBWdo%vCpeRnE<2 zX7}zuoyun4^sd?OQ}4&`Fy7?y_Ct2wyS^zc;i8Dfpyorie}1%UX${Jkhi(0VF|yD< zL|^yr$M~vcA_DBcWCaP;yz}MwTU6ZiKcjE0F}g+?69D<{PPg|7p>zE-T>I3H9*k3- z{{Z-A8z%y4wcCry%S>2;#f`fG3|ssVKzab|qq&sOouyh#ff4q_+9%GVGae;`J@f&L*ruN0OPis(0k$ka^6%Hy zsAi)drxZL#5fytSpr0c-fp_$s)Nb^Ll20+~LNtFGKPYeUg^ug$?!{m)mUGe|QOZl= z#}r$^r6&+h$*pQ=B~sI}xsmG^zgQ1SqZbjTQIR{4xHYkw(g2i8ah} z#!5>;E^|Vty>@Lzf_1~%rIqLKmv<^~SA3H~G6?GxfQpD#M8HHsn6IW&`J5gID)XfS zraflAE0kcOg!7gfnaL@+-;ofADr_R}h?)g(>*=_3PWP7my%0p`SMV`4~tFE=W&RZ(MnB zSiXbGz6WcK3}p9tX*d?_f=R`{!&tUE0uLQovXHh!r|UoKr`cM9JokR!QK&9ct2kmf z%S+>Ce<-%9e&ed}QrF--$a;azTgHPZSdo}GZ*Ma3+-LLc)12ZBQ_g*gQE9@pn!eBP zL5d_lL1dsWTMhC)%svtKJOCGH|2mlE74^wMO>r+&p*DWS%Uz>Rr;{YwNpi)C7~IU; zbvEQbQE0`V8JUjm1dSacO0*B1CJW?eXj8; z1#T?2q`(Y8_h!uYo-Xy@RS1w7cY)(``v@FgLju}Momt@JD>tz@j+c?}ceX!pz_>wf zF{)k=n%~!7qw*%9A~it>4j3;Fq2m$sEbr|w zsBWfw_OJzmaVT)L{hR=}`fTi(@085&{bj~tcX+Og)$V79Hs{33b@1xI5xbLqs(mGayuL~@q z<(|oBe^Bz1*#r?PmGrV~&AhPHLFvDS{Pe5J#ctbx>yFsIXq6xW6fINxJ|P%W@1n(C zfK5r#E%4oF%e-APyI$OYz{K;m<%rfCwX7OeknfrbT;Vz@=po9HD)|j4+^dV$=~*Ym zZi}?ej&&+^V@k=rm_aw>Y13M#GI1zl-a|?H2WBv|Ftf>g4^VU_A-6p2>aq^3!{w%V z<=fQM6maNR(?RNTPqvq{1LOBT)oM(}`_&{6!p}ArH_;A!`9XI%OF_q z@bi%`AufWGSdwdHGeHIXO=60A;_9Jd(k8<3Nh}%rb9dId`W|jhQUdS%=I&6jM~FsO zpMx;SnbMe?H}6rc6ITeJj{vA-IuKEP|2lD9m4BX^{vqn_{&xuKRC<>XitWEZ^|e-$ zf(&2JdkjBJNkkiG&x>3~5mHVCds6`X92|3UcHNvLhN>tDDRW`zlAxM14iE zMW7$l@_F;UeGj+u2;!pWdl0Pky2HxQm*yXmzf??mg4OX)uV8NqO;HmQ1QO#1y@!JU zG_%fSLDYVbJveBk#{KiLu{t__V2cSj{`TSu!X*V!XYWU*KWF~^ z3`k_Eh52Ug&>v<;v|IeQdJbMEMJwNo_foHBOIBaMFD`nNtvB?iv6yrciX!5$J%fqw zV-CY`s@!rWIwP_Z-ENyW+M&N0s!xxVxlH*p5XLZ9Epk4rt^9%kS#Ig6cgoWRm^SV< zdKfqvzj^Pz|02}Q1A`J2vyBEqeJQ8D2J0g5(8#gmUvjt@X=(FOk6PZvh3lvnCo)<@ zbZmR#t<;DJLDWh)(U!c=BGq=#)OZsBAdWv|q}|r)(wazK47Iuo0pRf)B^@&5R;&fm z^b!(YeT5Kqwr6h+IOfII!uT@vQr}$w=5PFW?*(swnD8gq#Ph%&znI5zxrcg%p`-S( zMzK0(7-ae9tJLeLv&_mXw|J@8fuE0n_q*8f{JCxVi_=9`fBGA#o#EiT68ko$YXF-wTtXi7q{_;7SPS2Ie#ITN%)yE|z4R&2k5`&Cf^L+I!umSxgukdW}v~xx? zL1W9?#(}p9onG6epwZHN(8x1(Nn}d0#>_H@9r*aJr5fW+&D@6+5gAW6Tei?5c4NqLdWuj7<(n`^e(lID!LuT^KJzWJY1BWuZstHJqy z&7))6Q_vVA08&Z#6ZssbC8OZ#)q0c3KUG%AixN7VTGUed9)+K%OYc1!$GbA<39SGA z-DNGdR%?vhWEZ5&K^)R*v;cMHQZg=Jhjs?N`pSd`X-km|g$VASc!HvYI9x%aWG8W2 z`tKuPD!0NLu?TvP=Xw9Y#WBS7R6pa0+I!Fy3W&&3gOu zz9F|oWss4ySR5-xWI01|Jc#m=)rX+x=Yq31DCd*lP-}R5mXWIs?pLU0rYK4{s_+lZQqpverSwg* z7Ly(n2WyKhfC~&nSW7%Qz1Yjj_TP8jY5{F`PLDM-evQzsnUPS%J61gQ=-c;V{ctfD zG#1(2+Gd8vQoyLC9qS6(%F-$3p=H9$&5iu7Ixlrye8jdxgyS8!c1zWt5AVL-Vpc{(k!NWQpE3DfBjALelWC!p0bmHe%}O6G9GLDv|yB9QyB-RJbehDv|(ik@w~jxvz%Fn_a}S7N!?E208@ zxgh9#apcg}zt2#d;#g&Fh~ycy9!$xLAzMrLlDV;^(iAahL{A5AyjMN*6RWZ7#U$M& z4))(#%?ntyW>jukH~J=zBQA)_A8bYx4&4qhSLSX46By@WkjtvdZS!P_@M zg;?KMZHsdjp>tU}#SU*sL8br*{}l9R+8o8{7^T+!JhNgUO88lBt9otrX8aS8P9-TP z-+l*d;@g-66-o%N6VTW+TbqL4 zk9NI7Dwi{jE^2a`CKf&zA3_{>zBdSherLp<-9onaC)w0pJ_?-v2XC&VQs3u{&>&=q z%#PKw83NG_kDWi}J|EwZKSTv>PV!nEUbnN=nu&{}S6yvqRlxx-5P^v`wBj==gUN;B&ucC`wvWcHCPIJlhXyO9k2Y=ZBbZYVE|GSj!s zyWBLs*CN8M^CT!MIGHXcfvoyonKS>A8$enqZ&M}jIhk_c*D~xZ3z;SU%DCd!saSR0 zIskdyvz58rWMj5>+^%KQ(`;q<7jJ*IUckboYsr7U+}+b54nMKcvDrs>jNv;_;++m~rhdHI*ZVij)RN%Rk(iUi@ezmJ|!47L>!30tH%JgEy$O8(^f#LT%r<|&#j&0ARrN%>bbC07h>ZI@U zx6DjWkSQ0rvVTd=DQnB*?r*q4M(U?vJxMUhB>MDG=@i?xvrO^U2#>L~w3FaeUBbd# z-kb6(Qu{&bx0BF_tXWyEF{ns9Oc^I)y!%yOjts~GXrfzk<$!#0AMub18Q4~V6hjAMJC_}al$ zWyq(S^OkCOb0sIaF@tG!)wBq?(* zIEiEDBG#74?ENaa#~OCVzCT31S~qL-^QWARZJnL^zNu>O;gTVzaToo0gRsv7F1MXj z(vO+z%~wIVRi%IXY$c@(s;_t$;Cgg#_GYh#uSnlG#!`|(>YaxaP2 zZQ&g>GePH4)|*XGgcBJNO8uvIb)3`cdXbV)2>9o<><(`O~FoD0tq8l4(9Ac z&4D_Gj>E2sa5bh3>0qIV#`mRu_bkE@I$b^q^mtn7T{zewGg2rC!U5w4K zAmT`8^LmHjO@yM;8#~ifKoL2rA7|LJ^zfmJeeV+=aFm|c5#Mye>?_XTkvhH6Dn3I~ z(4U0MyBJkCe=N!Q@V|HC-+SdAiuaVbDkkUS*dEfuYemS9;lCNwp1~W-{8Vyfl(1%( z^7ty}-N)u8WKj_pkAGzr*+BlJ?VK2d((Yv$dzt5GP%i8*Z6y6L$(zXH5AW##_X8J^ zoGkX~D04v7MWyYMu0|w(qbs+im`HSjRcPI8vcIL}?*>VU1#TvP4c6_ljNG9wlXtB3= z<|dd_Jpt2iWT!_rTMAok^^O6N?E)b@+kRb0$38JpaF>#fj0M3}c9c0Pf{RsUHv?b# zSEt+z5P7(~>BjvO^39?&k;j!LP?XzH*e-C{wW^%7c>=VYNTANet)x6m$!U=0{qcBI zzx)uwZ{r>L-4tPsF&4@3{{g)8udp{;CV!i6WS{xeFiBc7h4^N6E+G9A4QKt=8XUGz zTenF^9$lmu-1_gNhuWsP+oXDqt~Kpt^}ft?4gCYqq|p7aoibOdX?l(GyFrv#tT=tV zo}lsa1<(1wm2W8QlXZmHiFjp~jlfeU>DF51iUi~%-29^9^=hIiNv7NyOxdAn`so|q ztu+3K5tEDn9aYa3L&rah!z*;#+Y1>YJIBQ>_L`fK{r(#M2uu`8n`Fd4+*{Wc;wU9c zb#NTOm=M#O6M+r}YG<^#xi^koo=6d}pO3zZ!nL!c(0@$gcr*2&?V(J1YTkLLUGHL% zk5~v>CBLHlDJ91Xd(LaU;H`(fZ(6ic?^zlsw>)pBCQL$&kud8G6 z%!S8vQMAAH>Uqm@;v5PLONrq*#s-IT{TzgX9V~P7CWvmW-fP`gQAgQYkw;nb5ZaRd z-J5-!dJ%zmc+zHkhfU{`4_&^3TS=@RO8+U*bVzN*^0NY1YQIVIVSWd0QXO~Em7 zTV!y?#yc;`FE|0cUU(!gwf-$^9P?z|ND8|9f)o6>NQ+L>yrZlO#;xQZm`7VW!5z~D zUb7fgkxuCNMVYYByMZ6VN-V?M*VoBoH8mccpitc2bK~N3P-llk4|Jr?pi;hrnMpuRyE=e=GkdWKWkBNCs;1c6^h&P_elHRFXPS!@B9(ku@yIc zVUxDQt4r;i=4V&|%sr=Mr6~;JIcBA!X;+6>iLs7?x4_RMF zS7tBfRiZIm*K$fl1(!DG(lm1bXp&;T`%of4A?WV-4bPjY`d{S5`VXX-h7-#XQc`hGEkD`kT3u zxmq5nHhB@CX{4~VCYU+Hw|61Yx%afK7aEg+iCf|Er-4g_aQ{W_zEb6LIP6B|Ax(z+ zpBs@&mD|rAZrT*0etq~MabJj9v+Fy3R!8--ELx$gXb@B-qODx={j8*KBE=P4gofo& zDjw#x=TysFT}Li6eGGhd8q^&WC1fvEZ4~cU`>nY{trtCzezOH#9{Gvw%u1}D5XhUC zH>3~Rl6sT~qzH$S_21_9zPo4F&&Lh%=))#Iq!Wiy3-O*Y3m&k^S>?A+#@jZAc;sR0 z`Vu#>ks!qm0}m4&dOqc;pZxkx6jZUp>hm?{k9Rw2-}kTZLZGnk#>}lxc^pQqz-|2^ z+5Cj~NHQ!3>FqJEGq)XHg;Ty0^MOVSljNgO=RXL4nlM}@wME3tV?koz+$P|x27P{> zVk)W-$A?Mjd!mGq4~q(ZO)3@aCXB3fEG3^P#DSYq?xXdQ&m5f4xhbZC@gfSRQ; zv|z4yo{S$3u^MLlTm$fKfS6>>%@LAuKK9(v(=btyJMA}@82ZYtkpL#)`?;HB>~CFK zeoYw~C0GNLq8IjR<9WO>c(Fo?zBIV;98*m7}#@qJM97@*a+o>LwL)7UlWx zZdd3ih_H2XzNR+*9$PC#D3YtmUqcu5Vb-Qu^r~|#x(*+-+Qt=Gmi0xE!A-pARrNg1 zedz1c@dVn(X9%`nckLZ+ifSGbT!KNW=8Htv3K)fk^>%Bg~eOkmaYM(zQhnmViX zP^tv9E|5O)?(p$^KD`7^aRIllM8V`I-8kzuU5cPgU$2IFlUW|&YqorP%3R>N5iuV5 z$o>oX8ov0X{xXvj@7B%GYLGb+F;`8$HDv%Ej?hhtN6(OZ&3(X8Z*i3g zFz7%v8YNi|3y@@1!f(vuC&J)wM>MQ{Nq(e-VrTsrRASIYJfG#Mi+2^zhy6(6c5ZV4 z?+U)7)qu7XeNA(~Ms#pq%zfbV?X^s7A7T2*4wHkKU*+m$P|&@E-&1#PqRw$wzyA~4 zK#X-(JX+ia4iiONX6BpIeaJaTR~h~;$kmaG7rv*WH`@rqM4!cL*AIAkR}Y7Af0euj zOV^D7S{hfG?0b|sr})@fT(G4m>URDyqFV`OZrPdXM)VHHp9h5}u@diym`ZNagac!z zIoD$J(H>~jc_`148F8!M=vanv!+ZW}s`?qT8j2k}*}Ur5fHp=dX`|pS6oo^~`R)pv zqtFm^qaG6P$p2Wlo7n(#sxOQ>T!sa*IrTLOhsa7`=E7LjjYum1uZASDm$jI=ymtvS zJ@X(5LFJlfa&ACtKG6FAzljxK@Lr50tMd>nTC-ul@{x(6S)oB>Po?I3u0lS^(mS~|WcMT(-p19ailD#AZsp_A8>(WU+ zC`t*i#n%aXncIM%Ug>67ahs`^|83{HuVNgqP(l4WQOUi+-Kl&ZWOxmpJ4@m1#CxvD z^DWX}w77@1b{_nn(CCG#j&*Pn#knj}8Iq!?q9dcx+PKRv^)7qRllafNQeaO*$kkUG zX{(6F1rcsmzpyCkctWhMP6J&(!-tPG5BJayR~qYLQ00<1#Zj(6)fLV&xjKsHmE3H> zJ4Oru?EueABMmiHxU)oH(LsyHalRY+GchzW0Ror3fZ(g;Vq0s zj?9L!xW{>pd@<=}^fj)W=jQM+02jDsAZPckq%RPdOYz_eG z8R;6cW{{EaOjwsLKBpC#1K0+fOJ!qh`)W1so!xhZv8~3!g33F;@0$fX8~Q{g5RSoMlZ4;#x7q89O5$`ab8P?bmqS_&R&ajn00FBHgzR|D4j*iWsB=4( zu?Q})O+?KZQ;ok*%=ec+XaOXC`bL>*wG&FIXai%DNd{SopN&MhcqT!&k)- zoMJ}_7^?Ja$ce#M*MWSPx8`)R(_=puzB?PSRXp##;j(c+!>TQYH>*2z&MgWF zym@dM$MCcoqn5|IXz2^!6A-jsqOUk?yUr-AwRCKZgsr}n5N(C-jm<~suvWiGhJ6Ou z!MZhW1ihEIpe@6pw%rxhB%H^$Z`AUf-Ay!q7$}3i>M*D`_AjL_j%#lPR*=_AT0Dj? zS>Sr2F2Ff*5Of~@JCipvbS$IX)k0TUP`SVcM5>MR_#xelzkP%X;iX7mbG)S%%I~bo zQCvID3srg#isCG~0eLW92`^!R+vEPa%%J`);d!FiqA*bw{r0BiYL+)>`~u-K8_D(c z#p`A$qM$F`bk}^OuR@1{+f22u(=Imv3MACZyZQ8I^74~7i+K`FXFY*xZ{r5E@(iY_ z{lW?8nd+YD^WcAxx((R@jOxrKQ|{`wf6=Sb2l%R!)70hq1~xlds{m`EMj0x_=w+1t z+Y#`sSqZd&Lgd^+p#J)M*x+UXscGt{+~`YN;|bVJ6bK&Y@y|4C{VjdzVB?~wd2`ke zmSJ27W@Jql3VI(^SMC zA}|K4pAl$y?htGblOGJ6tP?QCBg6j*J|fSCNjnf#Erx+XJ7ch~j%^eHT*OS! zQyS)ROT|zTZ@o-*X5~r1|Du#J$EAm4YWX2ytF0H=*QtlF8${x18*g%B^0H>_wV#8I z@M)M}M&ajvQm8MBF6DM)O~0bLc5f~%EEpiXQT_M^_7JW;Ge4;m$?hfO1_3=;`O8?A z@Eq(lUFLCa>kb$J!O2Z@tX=A@;yvVyIUN;LK9AqxhfK0^tgktShKB;&cQ#V5)$u#$ zTvd;YDcl6Qx1h|T`)ka-nz9nT+CQy7ssXq{p?T-684t(fYCtD+E$kQaKC~3oO`k(L}H z+VU#Ga<$NR;WQG&{oZp6ac1+KgKqDEAaeun#AAcS=oaFl%|-g}|~*io`i-86re1V~Ko z;qR~i1yFLvXs_O!M79?SznL%FL559aC6lYB*a2)F0Tbm+f^>FhcUxwD%g1n6Nu$3W6&u}NQ0TAu> z!n#Cus7MqPrCG}~v7EXjQ9^x_*I)uV;SO+kI+eSSRkoI+55mPBK!RgdG(fN)w?+ZL zvoU-FdI*weay5HwD#B80rp6imQFg{!6m`_6YLT)0n{g&Xn?5kDuMQ~*17&f0hNeZ# zn}}Cx{vymgsFmT{>Z(;Qsbz}T3%)}KKBQ6VU913NS!De}VQ#+zU3{(TKYg*<8h`i+ zEUI)r^qSYY+QXn;-L!{(=R_hfQawpMJfLQp%4nk7Iu3V}G=~Ti-2|U=kO{YWnyRRl z*)^4L%?rqmKNu34e-b*k5oTQ4hmOgzZC3klPB$YTHmC?>`4HrN`&@VEd!cH9%>&U+ zPpSf0hY(&PfeuPdOY%<}jMT=RjYHo_&jdkynjn%XNgN%1PGb(QI3OSu7@32t4MZgc zq+RtwZGZ?dO(lY%^M%e@AOW5gGKGGB=lFVu_Y#19dJTF7oCXa3Cg+wHU~t-4mPH?| z9Iadv66i?GM!w=KMk45F+BUbmwo8*BL0TH3(r4vXoxi8zw#>bQdGohKDu^xMt(PQp zGA>QtJhF5cf?~pr_gf{P(Uzm2qt=K3ErkH5u2g_@xKCyn7kl@YVET!`CTddUO@Kcx zK{Qq%UvA7ddGMuw2QR1`zItQtc{SVvOddTIWcGxXQ{;g5^Oku z=|r2Xt!}r-J>+F$z=d#Fb!IVSiw_m;h{(%%L5zF zIly^X-*9|6R8bfRgMw=wy{Ts1aJ0@sUH}n0pC8LgS-@9J*`ci?HjuS!{)ySJ1mN7O zSX$^IJW~NIum`A{l$&AV$J(Dn`XbFsZ|mf97$nEBWxx97j5C%8fAPBr>`+UW_ny^g z5wVV}_3pVU0S-L8w|`4|N^5=LrJg7^*W+D{qVvbVVz+`mE(~6pj8Jo*i|EglSOBk# zYl-~{pb>emk?bPbTU`VxLK&4~YMGPpck7J#@Up~$Tl?)sejKPAVq;HH5lPo3V}n~|r-MY)t(al*PsF%Qttu|2Thgl54$_#{J79!_n+L9B;kS11$2 zHM!FHCJ+K3ype>=sYGOt$66LkQ89whr_Ec&g*p=rtPrQ^9d6=2T$PPe__uOnSg zwQ5LNm9GjU?YfA}O%k4`i3cR2p{N5nNSzoCuCVcQZc1hfhCz-P@;eG1xYAx;YtnT# ztar_5_u3m+$}gg>vVc@JvTW5n(1qr!$<>Ly4@`vM=IXYTfOaunmfYMyKtTd55qHjP z{~ndKW`*ijSc;QN&w<~$p z&9%|*_6*~PLPtIE5CjwDg|@A|r71nTpGeG%^(&cRURMVHt-8qZV=o5uCv{_vFSFt# zJY&U<^NA73M$W$0uc>dP1s)Y+FW$O8b_M)9IF_T+aGbh>`JQpV>&U2IP<^SvO_VZp zms1~DEMsWKO&D4b0+FA_c7=PVpGZ*gNNO~1Bfo!2U; zL{C$5MN@@{Z6@Vk4MQH9W?=SHIRlf$uxUBd;yB^z&rA{c?P};XZZ+Ty#+STBy=HBm zb0IUv$$&UdxfJKN_i%`MDS6E84+ygmp`npouA+>(>Pvx9!!aM5Nj8;U-$`Nt(y9g< zQ8!z~*HchW?B?)6-`-N98p1YD!y~bsF*xr2lV=*jM2Pcq9QV{jJomobRGmfd(r6Xe z*w=1ip9axTx7Tr+Hq7?anRSg#qlOzK2m0?Du;8g_7%eVSkvNLd+(7By*;QM@>p_Nl zG?IhZU@26esU#H9`lLQ2hgQ{cxI5EV|H{E-E{xd&O}Uy(3TU)QC_QFxmD7eH1KwguC_E~d#%#Ti}F5;v)J`C zBsI6?vHgg_%?+tz{opM^>wA0_4k0_A=w`s4{fZa%r;F9x-b0jGVXP~c}i(r z-cbHC*78_Zt(p3K2ARgj01~&_#~g|26Wd#T#s+tQ1m2c>OB3fLf*LeMuiVcW<%eBd z55p=>Qqu1G?*-ZN*A^dA6^YjXLdlA&Ehgetz2C0|KM)~03-Tm>BSBms!<)eD;X3OV z&}pLT`mI+AK7Ih5k9F8^bgDXRLsI~9LlZVZwtraU|iU{yM)cS#sM2jt~5~D?{F9oR8h;M})-4Q!*=fSgUC1Wc_njPeB zyZ1+&@sNGYN(q!(Q%Z71)ioDg4P|`@M&`T1pRQs(WpqiUv&`#GcLH0L`Pf@mVBxHCLhe z0`9tRNAJc>{fDqiO}+(rkfKs(d`-|Ph+Si|(})%0!j?yFOtg{@X=vK-cH2`S*OWa0 zKcVd*4m_4$eT{rlM%w3%-~=at+?Y(|jAGTfs@VDVmmz=;^1e+H?3_!=PuoHqEIYr? z_kySLnv2X)uMRr;jzAFdaP=QL`lD28=>g!?c8~A9=>fo2k+@llT<^s%;T-oHr{)w?QOAaiW2S>{Zvtq;_R>M zKj`TB@vBDs3pr9177wGMJ7bo@H+g~V$n$e}ZvERf&kT|S=6TTTea@@dqS%r$n>uzr zsx9->21=R#1E?6CB$@Z}RkXP=W~dJI+9NlD2dCn#--YQU^#@lN5@{I-NhMBYNHq#w zSb=D6$WQXl3#R-m!=GGPr3k+_FH7hJwjjwD=gh(p%IpYUp)18`Vh?HBScDG+xDg)@ zmYSEo)m-d~|JJnBV{sK&bKv|;e`3>;nNqvnGv774q?hrB5O7Aow9O~%u`A=a+r%<{ zw5EFaaNjrAt_sB3;zDAU;NG3^Wpp#Bjd}d-wa2aEB%=jy(Ztz}5zDwfY=br#EVG1- z8Agks{E5kI-+;7bBsf4y9q>dec?GU#MfI^)Upk)|W-v9Q+I=TPrG@2R`l~!5%e9N`nS*dPc`uxYSquGG3u4b8JRQk;u6vH zt9(8Vlg4cLD3Xpr<~SOSbuQ)LRqlPdAX-wLx=Hi|tN@$LWyW zP9gC-?YDtLgd9TO7LeiZVr&f=eKVQ-;o$lv7i82D$Q=t~Cr%yyBFJ{9jFnEAgzhqv zM~rbR{Nyns`5`HQPuj1G;g_#Ew&A~9;Ribj%} zVg4l{>&Uk9>q>EL!E`+y|MPJG(G=8=-vIEcYS%E6tXm!!N;dE{FHuVooC|7;35L?r zn>}n$@4A-;MG@i9l9??_{_KB|n5E25oZYKC=97>5yymzouHJK9SC@K<_a8Wr<|kJc zc{{*Ajeh{^J%nyRQK4qZ;ur}8fXdbxPH*gID`-@Wibg~6185YirYlX}w<+o1lyd%) z;bkd+GGpUYEzV(cI9CmKi$_kS2`nyWhj32mk!j{`5 zEyIHr3g-fKykhCBcN=SdvMAmajXd;RVeNcsn?cAyNvl;+R!pIdsR!7m$;_4zH5?sf zr*R6nWaAUd+HsM%Z(RxT-fOgPbJf`E&? zP4bcipJ%6vyy?XU4a%Kv)wP)SXQ_xe`of@?*ljtFyf58*%0pq-L*a`b995)7Bl)11Jl+56 zM#|sdCcYETv^@Au{MW)#Im@xP;&SxdT>?YCR$puhEQa83o-q1Tu)?Zos*1x%7pk0e z(Qt^9Xiyj(U-VYG_%JVa>8Qf7mmYPn384f_J@L|rqql04EmyE$A$SsV;?-TzmRyl# z=G@H3P%hjvey!o~SdR~;j9lVDyI~CalIT&5GqXr#sFzx;J%BqJIc~Z5d{(``EpC4r zW+p?a6io^kza(YJ-H)xP@+=b3*7Srkd-L^{O=~MUuWtD)j0Y2W~^iamcVW9POX{_}#a-n(j(4=yh1gAv&rX41QYBBvfwy{%;@&LB6SG!||2 z5Lv#eytW0&N=)`yO_BZCE@u*}iXaUt8D$Y>!!gv|aykHRGqkk>50#(kAf?{1FXsJ< zcrw?N&#QB6$bfMR(yKX2wfx#`*(!^~nxW_KnZ%%~soiBlPo#lt1_tsMbM) zu}0T5$#V*VAQuZ;`$ZJm9aEF+&3BUYtM)dZnSHb$(W>;yjfCtRA|W?r7O7QfuQ4cQ z#cd>?T}_w*-HYFt+0#+dciwz>8E(lW0S{GYD@ypp(iNb_%tO-d%R7Z_po&g2`Zq*V zli?_5b(V!Y|H+M8M%O1EKNClkzLBaFAmJWMw*s}KbWiqhV3>*%x5bx|nd>({#BiYz z)ymr$?M_=W`|!1?k!qc{<^GegkVS)(hT9GTcD8Xs1#=eIx!GNN5K_VPTAPYRgjMpw zQq>j&JVdaOBtgmvWORz~a9*gQ`p%=_IWAzUbk3L-$-*7VTn@b`meCWxP87~lN9U*H zEKIFm)eIWED*0CKp`Qd&&J$g)KE0d2ohLG7UAs^Y$=^kvUAfOsT6bnKlK(XB=B)ao zYHpX4=qJ(J_KdqjKLrLy7n*f_CLQP>HTjyn!lnV8?2}T*C7`OFe~FttN))SRpJO@Y zG&~mA#&C)Gu*4eZ)U2$3G%5)-Cd9t)Zws$|6SxbRKGM?9J0_5S;Pp*J&klZh^tREQf;K_xs)8g2NfLg=v}=`_3euv){={GRsej(? z;#i9sDz7p^im$T@BEj;6n)vh$28nHO$g-Hr8a`AqHIp_T7X($3l1fVDR`WUL12`1L-l96ut>TPLSnC11$Z$)C=fujuPDY2<_QP~4@K3u(qn`g(f4Q^hs;z{xMoyKG3$G(=CK*iU6( zD-ph0$@gKOuzr%NlIzQPr}xo{W(AR>5&jePF)0i?0eOX7RIv!K7o;5cNV6;$Ma^Mv z#fDy5nN?6sc2q#3cHj5c2vSJ#j`L}Vx@`W{qF|W^QGbid;kAcIiq|C#)Y`yM@S_ndZh%b$$!*BDz7@qRF*J4t;{vCz9P5TEv0{JhLp z5sQek3BxCm>+dr-5PxE%f-b+jQS1+7zJQ0N1&5hztPlXnT90SH9|%J)55Zm2)*d(Tq_x9@ZyI|PiK%y1wNmqz8Lst;K4Fg zbot3{g~)ERtW+Pmk#w03g1A>~vK39xaiA5&k^Ib^Vc*SOoWeDgXc6Rgh)9hbPJU}I zse(e7hLvXT)kcFtq6(6^K8g^gW0;)G>+Yc#;EBVDiwze-<=d5yB>FRmT5YMMSORz__snZ2-0?@ z(g*6NEM&hd?M0X~GlOg1X-m|JLWL8&`e2@W&A^x=NJa@UJWh>Ik#=ycMBTAkf>6n! zv3yRZpe&rc7BYKAkrTYo>s!FvgJmSBiXOKO8kF&>JEtY5xfmV`ha{yf=~|xAjHsye zYMTO`O_^VYU-j)VXFLb#vE+Ff#_7u;UpJ_I<5ROAW29}X?jx#kYm$w7+VSSNrs5j6 zqXxj6sz0IKhQ(@3BchlGw4Z3~3+xbEDUQbFwq4y;w|GA@4vRiIy=$;tbaqiPFtPX? zLVE11F%vEv%0iqap9`NVNpKkzQXlK6u6F0`k~%#>K+0v+7Ay-HZXH-70a==tB{Zb` z;!KPyG@qnz*U3DL6Xkogb~>wcBeRlx0de+y+RpUoA1^KnDX!sWAmyjg2M^L)Q8g?L zi5L@B7kteHYZJoU*-YHGKhMBlhk!(8)Y~wPI7+w0G#X~iM9ZH=^53GUCQI#2s68wO z&9mCfd>1{Mg==<8@+HI{Y~L4#3}l<(LVOyO7;kQ^L?`9}{=w7NTe6q6SOA`@E?%7~ zcCwj=3C{$dHRK2*>dc4jKaSChc^HQ^$rkJ&lJQsgz1|{!@Q=;0dOPH`M^io#31vbR zxRuT7z7n}($(omhEF8}KWMI|lhsIa(vRNCT{6#oOn*LgX~ zX*XW%p=hqzGNhFHcs8AQ?ABxHIE-~^1~A6JTTXfID48Ui>-gsI_no>1A*a%ES`Hwd zucEyj)dSTh^*x=G7}~j04ERnvjry#Z=QX{(N{Vp{MU#|OUeJ1^k}WEdViwZjooz=r zb7m;2l;>9dGhK~ZCy|=0^qJ*?GV;5ituoSA=lA?n?E2n_h4109E2hFaketpvP}97% zBJ@eGC8o2BK5rXqUF&u%Z|$F}_mICY8ys?QD9AO8aNoPbio1dmsLtvIT9sk}=L-F? zvfvqd&%>jqPpZu-R3}V5qMEm~1ARapKl|~id+rx`Zr8Ve2gf_1R$W;Sz06j>Of3Ba zxV!G+j>lu!g}HxIj2V?x{OW&lpz;pu=VrdtDc>mjr+qAFKRfXlus2oZ4N)60$rxZk zB6f%c=r}l~xrAFA>p$36y%HBGp20nZdz->>(bu5!q)WO}WB7BkM>ju~kUMWqc|+Pv zu4BP-ujF#=*-6SAfUUe;Sm+FWp7Z?Ji%)-FUg66fO67DVHq+3H?*#U53|}`r*us0u zOK50%xTFtihH)rei|-_ORE`t*XkGoJu8;J0cIl4?;nLD7_84+&a|GQCS-}?GZHHSu zqMw^p{b}Dx9_5D622H<@e9Co;wwa_jp^y%FZeb3mE<%)-K}x}`db52_N9;r#)q=G) zIW*J_Y*I4Gk941(SN=Ib5RM(sMZx|){_~LtmxhBwD;ai)kKe#i?Z9~lu8a2I9y56aQv+S)Eqli~r& z$(30tL|Rfvu(D z(zq73sL7m!s-C7-=DxSIDpz)t;>zZKOtW~vwpfI)K2OJOGFYvY5fMqo`)1@5iCu-U zGcKLMN4C%0)XwAW7@MwLQGS<|@Ew1}t(s{M-9G?NHecV*vkA4P^#PU$7!cV3WUlV0 zDxB^0>0j@A*keeSo*&9_&EIt=?QXm2*g2;w{hzIc9^t>(ScJDg5T_UirAWV#*;y%( z=G8%}Z81x0l)H;d?c?#;X`pVGHWT>vgHek6j_Q`AhXJKKn?pJX%`3aFC-&gvH-9LN zh_R$-$fFIGSNrra?LTEM8xZYNAH6ty#D{m1{`wE;X~OO6hc*R6qwph+v$0oADa?KG zQY)WJlco4spRNsBZQ#VR&^x^I#9*hECw}GYkYeFfq5TV;`u%F#w65LdJ>%khrfu%j zhz!0exh-ofmQ$zRyKaO3tI5Q|B@p-kApB33I6#3*m2gqb?qbBq+E?!n@7$ccKRRRT z7G+}(TO2x_^oo;KRBLFzHk?#3(=9{Z%OgAZF=tHEgANuDa=&* z2U6}3qoxieAUg7lkl#(FG8%RtE3U7^=bf3^&N@I0rZ#~o9ab(K=_TFkkyiWZG z!~TN2Ka&K~wRpycEJQ9H**HJfUf`=dWjW$|n6Xl_xJ;Z98~O4kbV@HhEV%kXQR$Ks z=qHYQLYAv<0WJI02Nlzks+Ht#xzL8!(FVDW4U}wr`Au`j{$5eq^v5HUrWNYyo!?E= zJAG`6#{`TWk{UmE=5xV{uDly`<;3k#c zk-!mBI^q~nx~S}!5t3pd(7!$R?=AD^xk!hcHO#}kqDPD3rB2T&>a{HQ(G@85@J%<% zE~#!o$WoVa*MoOd>>GGJIq;3aE7qjUb4Hs`?{qlA5mVss-q9g_A@%+;wGVH9X*y8& z-a_72m%x*4@jZmK+eau$rDFKPh-`g}<+=JxHH+3lFS4+&>Svb%8a}<85F1!FYg&p) zVlZmkx)(5KXZ0zlIgIDx3yLywCwz@yGCFccNa|+^%8qb#!#Mny!s9>x&N+PEW;>$Z zl65#Yp_Z+WIIkVBb+FgAC$((J`pz0oz&q1EzceDR{8k&?+G}EpctMFmtQq61Dm?BM zP7QLa#UIcwYUFxlW{S_9u}pA!Ty|l`jOj2pd!_r)AQJo`Ixl~2Gqv$?j5ecPj9pb= zSVWG0>>?fI{niPzX%D|;-QEBAKS(N*Ie<#j5eHyCvVlpypp+C(<=ZtRB%0mj|q z*T;8|$wO~+&GwJP43(3|FMJlL7De0yxb&7Rw@j6Y3@JOWMOati$NWWY%$9;*?eA|k zIdcUyez)K-+G;mR*jKSfH@ENEvUozdve@;H#`5k~8;V2jXn~mVrh5F&e%sTVcF^Lh zyI0!t1i7qKuYD>f%)kS6QRm4^=z3|Nk>JoT{&8g7s%nqW0#+2M5KVMTUn;=FuKhTKc<%jHQDiDA(<_SH`Rm@k=o4en{>LA4B;_z$ z|MvXJN@$j+D8{{MYvTx`LnaXZgfC9A`srDkX2N)*wt%Igzy<6j>AY6Zlj#P~>h-lu zGD~$L<qW&lbRlM&MtvX4XNAW+ z$2b(zR#4I&1S+c%a!0P?Ao8;G*Bb%#dJb+4@EpAw0{=lMTTB6-|Ld`cF8yCmHj{q7 zm~aoA#;G!ef1a6P^{=z&%qu|gTp~Uquue^|tjRJ9A(*9YTRr~sF@t{aH6Rs=)_I)H zB0&OSjaxNf_^pwRRlY=iVoedGRr0FWtqJpcdz literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/splash/Default-Portrait~ipad.png b/src/MCM.KidsIdApp/resources/ios/splash/Default-Portrait~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..53ad4c4c9ef6c43c9dc455ed4ad03e4d41b5c88f GIT binary patch literal 22692 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/ios/splash/Default@2x~iphone.png b/src/MCM.KidsIdApp/resources/ios/splash/Default@2x~iphone.png new file mode 100644 index 0000000000000000000000000000000000000000..6a133168439fa147727fc478686aa606c4ecb4f0 GIT binary patch literal 18852 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 literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/resources/splash.png b/src/MCM.KidsIdApp/resources/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..cbddba06ab1b118a755a2396bfeed32945ef925a GIT binary patch literal 62210 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 Uc5QB(90>dv>znEo=sHLL1Nm!VxBvhE literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/scss/ionic.app.scss b/src/MCM.KidsIdApp/scss/ionic.app.scss new file mode 100644 index 0000000..9eb2f78 --- /dev/null +++ b/src/MCM.KidsIdApp/scss/ionic.app.scss @@ -0,0 +1,23 @@ +/* +To customize the look and feel of Ionic, you can override the variables +in ionic's _variables.scss file. + +For example, you might change some of the default colors: + +$light: #fff !default; +$stable: #f8f8f8 !default; +$positive: #387ef5 !default; +$calm: #11c1f3 !default; +$balanced: #33cd5f !default; +$energized: #ffc900 !default; +$assertive: #ef473a !default; +$royal: #886aea !default; +$dark: #444 !default; +*/ + +// The path for our ionicons font files, relative to the built CSS in www/css +$ionicons-font-path: "../lib/ionic/fonts" !default; + +// Include all of Ionic +@import "www/lib/ionic/scss/ionic"; + diff --git a/src/MCM.KidsIdApp/spec/angularexample.spec.ts b/src/MCM.KidsIdApp/spec/angularexample.spec.ts new file mode 100644 index 0000000..de298c5 --- /dev/null +++ b/src/MCM.KidsIdApp/spec/angularexample.spec.ts @@ -0,0 +1,25 @@ +/// +/// +/// + +describe("Angular Example", function () { + beforeEach(() => { angular.mock.module('ui.router'); }); + beforeEach(() => { angular.mock.module('mcmapp'); }); + + var $controller: angular.IControllerService; + var $rootScope: angular.IRootScopeService; + + // Store references so they are available to all tests in this describe block + beforeEach(angular.mock.inject(function (_$controller_, _$rootScope_) { + // The injector unwraps the underscores (_) from around the parameter names when matching + $controller = _$controller_; + $rootScope = _$rootScope_; + })); + + it('should create controller', inject(function ($state) { + var scope = $rootScope.$new(), + ctrl = $controller('aboutController', { $scope: scope, $state: $state }); + expect(ctrl).not.toBe(null); + })); + +}); diff --git a/src/MCM.KidsIdApp/spec/appFake.ts b/src/MCM.KidsIdApp/spec/appFake.ts new file mode 100644 index 0000000..fa268ff --- /dev/null +++ b/src/MCM.KidsIdApp/spec/appFake.ts @@ -0,0 +1,7 @@ +//This is a minimal app initialization for testing. It excludes the route configuration because otherwise +// you seem to get errors if you call scope.$digest in a test. + +var app = angular.module('mcmapp', ['ionic']) +app.factory('storageService', function ($window, $injector) { + return $injector.get('inMemoryStorageService'); +}); \ No newline at end of file diff --git a/src/MCM.KidsIdApp/spec/helpers/jasmine_examples/SpecHelper.js b/src/MCM.KidsIdApp/spec/helpers/jasmine_examples/SpecHelper.js new file mode 100644 index 0000000..578b3e8 --- /dev/null +++ b/src/MCM.KidsIdApp/spec/helpers/jasmine_examples/SpecHelper.js @@ -0,0 +1,15 @@ +beforeEach(function () { + jasmine.addMatchers({ + toBePlaying: function () { + return { + compare: function (actual, expected) { + var player = actual; + + return { + pass: player.currentlyPlayingSong === expected && player.isPlaying + } + } + }; + } + }); +}); diff --git a/src/MCM.KidsIdApp/spec/jasmine_examples/PlayerSpec.js b/src/MCM.KidsIdApp/spec/jasmine_examples/PlayerSpec.js new file mode 100644 index 0000000..80f149e --- /dev/null +++ b/src/MCM.KidsIdApp/spec/jasmine_examples/PlayerSpec.js @@ -0,0 +1,60 @@ +describe("Player", function() { + var Player = require('../../lib/jasmine_examples/Player'); + var Song = require('../../lib/jasmine_examples/Song'); + var player; + var song; + + beforeEach(function() { + player = new Player(); + song = new Song(); + }); + + it("should be able to play a Song", function() { + player.play(song); + expect(player.currentlyPlayingSong).toEqual(song); + + //demonstrates use of custom matcher + expect(player).toBePlaying(song); + }); + + describe("when song has been paused", function() { + beforeEach(function() { + player.play(song); + player.pause(); + }); + + it("should indicate that the song is currently paused", function() { + expect(player.isPlaying).toBeFalsy(); + + // demonstrates use of 'not' with a custom matcher + expect(player).not.toBePlaying(song); + }); + + it("should be possible to resume", function() { + player.resume(); + expect(player.isPlaying).toBeTruthy(); + expect(player.currentlyPlayingSong).toEqual(song); + }); + }); + + // demonstrates use of spies to intercept and test method calls + it("tells the current song if the user has made it a favorite", function() { + spyOn(song, 'persistFavoriteStatus'); + + player.play(song); + player.makeFavorite(); + + expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true); + }); + + //demonstrates use of expected exceptions + describe("#resume", function() { + it("should throw an exception if song is already playing", function() { + player.play(song); + + expect(function() { + player.resume(); + }).toThrowError("song is already playing"); + }); + }); +}); diff --git a/src/MCM.KidsIdApp/spec/services/applicationDataService.spec.ts b/src/MCM.KidsIdApp/spec/services/applicationDataService.spec.ts new file mode 100644 index 0000000..84fcc3d --- /dev/null +++ b/src/MCM.KidsIdApp/spec/services/applicationDataService.spec.ts @@ -0,0 +1,45 @@ +/// +/// +/// +/// + + +describe("ApplicationDataService", function () { + beforeEach(() => { angular.mock.module('mcmapp'); }); + + var _applicationDataSvc: MCM.ApplicationDataService; + var $rootScope: angular.IRootScopeService; + + // Store references so they are available to all tests in this describe block + beforeEach(angular.mock.inject(function (_$rootScope_: angular.IRootScopeService, + applicationDataService: MCM.ApplicationDataService) { + // The injector unwraps the underscores (_) from around the parameter names when matching + _applicationDataSvc = applicationDataService; + $rootScope = _$rootScope_; + })); + + it('should return application data', done => { + angular.mock.inject(function ($state) { + _applicationDataSvc.getApplicationData().then(appdata => { + expect(appdata).not.toBe(null); + done(); + }); + $rootScope.$digest(); //Need to call this in order for $q promises to process. + }); + }); + + it('should retain changes to application data after store/retrieve', done => { + angular.mock.inject(function ($state) { + const acknowledged = true; + _applicationDataSvc.getApplicationData().then(appdata => { + appdata.userApplicationProfile.legalAcknowlegeDataSecurityPolicy = acknowledged; + return _applicationDataSvc.saveApplicationData(); + }).then(() => _applicationDataSvc.getApplicationData()).then(appdata => { + expect(appdata.userApplicationProfile.legalAcknowlegeDataSecurityPolicy).toBe(acknowledged); + done(); + }); + $rootScope.$digest(); + }); + }); + +}); diff --git a/src/MCM.KidsIdApp/spec/support/jasmine.json b/src/MCM.KidsIdApp/spec/support/jasmine.json new file mode 100644 index 0000000..3ea3166 --- /dev/null +++ b/src/MCM.KidsIdApp/spec/support/jasmine.json @@ -0,0 +1,11 @@ +{ + "spec_dir": "spec", + "spec_files": [ + "**/*[sS]pec.js" + ], + "helpers": [ + "helpers/**/*.js" + ], + "stopSpecOnExpectationFailure": false, + "random": false +} diff --git a/src/MCM.KidsIdApp/taco.json b/src/MCM.KidsIdApp/taco.json new file mode 100644 index 0000000..641d0d5 --- /dev/null +++ b/src/MCM.KidsIdApp/taco.json @@ -0,0 +1,3 @@ +{ + "cordova-cli": "5.4.1" +} diff --git a/src/MCM.KidsIdApp/www/css/ionic.app.css b/src/MCM.KidsIdApp/www/css/ionic.app.css new file mode 100644 index 0000000..2224e65 --- /dev/null +++ b/src/MCM.KidsIdApp/www/css/ionic.app.css @@ -0,0 +1,9732 @@ +@charset "UTF-8"; +/* +To customize the look and feel of Ionic, you can override the variables +in ionic's _variables.scss file. + +For example, you might change some of the default colors: + +$light: #fff !default; +$stable: #f8f8f8 !default; +$positive: #387ef5 !default; +$calm: #11c1f3 !default; +$balanced: #33cd5f !default; +$energized: #ffc900 !default; +$assertive: #ef473a !default; +$royal: #886aea !default; +$dark: #444 !default; +*/ +/*! + Ionicons, v2.0.1 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/ +@font-face { + font-family: "Ionicons"; + src: url("../lib/ionic/fonts/ionicons.eot?v=2.0.1"); + src: url("../lib/ionic/fonts/ionicons.eot?v=2.0.1#iefix") format("embedded-opentype"), url("../lib/ionic/fonts/ionicons.ttf?v=2.0.1") format("truetype"), url("../lib/ionic/fonts/ionicons.woff?v=2.0.1") format("woff"), url("../lib/ionic/fonts/ionicons.woff") format("woff"), url("../lib/ionic/fonts/ionicons.svg?v=2.0.1#Ionicons") format("svg"); + font-weight: normal; + font-style: normal; } + +.ion, .ionicons, +.ion-alert:before, +.ion-alert-circled:before, +.ion-android-add:before, +.ion-android-add-circle:before, +.ion-android-alarm-clock:before, +.ion-android-alert:before, +.ion-android-apps:before, +.ion-android-archive:before, +.ion-android-arrow-back:before, +.ion-android-arrow-down:before, +.ion-android-arrow-dropdown:before, +.ion-android-arrow-dropdown-circle:before, +.ion-android-arrow-dropleft:before, +.ion-android-arrow-dropleft-circle:before, +.ion-android-arrow-dropright:before, +.ion-android-arrow-dropright-circle:before, +.ion-android-arrow-dropup:before, +.ion-android-arrow-dropup-circle:before, +.ion-android-arrow-forward:before, +.ion-android-arrow-up:before, +.ion-android-attach:before, +.ion-android-bar:before, +.ion-android-bicycle:before, +.ion-android-boat:before, +.ion-android-bookmark:before, +.ion-android-bulb:before, +.ion-android-bus:before, +.ion-android-calendar:before, +.ion-android-call:before, +.ion-android-camera:before, +.ion-android-cancel:before, +.ion-android-car:before, +.ion-android-cart:before, +.ion-android-chat:before, +.ion-android-checkbox:before, +.ion-android-checkbox-blank:before, +.ion-android-checkbox-outline:before, +.ion-android-checkbox-outline-blank:before, +.ion-android-checkmark-circle:before, +.ion-android-clipboard:before, +.ion-android-close:before, +.ion-android-cloud:before, +.ion-android-cloud-circle:before, +.ion-android-cloud-done:before, +.ion-android-cloud-outline:before, +.ion-android-color-palette:before, +.ion-android-compass:before, +.ion-android-contact:before, +.ion-android-contacts:before, +.ion-android-contract:before, +.ion-android-create:before, +.ion-android-delete:before, +.ion-android-desktop:before, +.ion-android-document:before, +.ion-android-done:before, +.ion-android-done-all:before, +.ion-android-download:before, +.ion-android-drafts:before, +.ion-android-exit:before, +.ion-android-expand:before, +.ion-android-favorite:before, +.ion-android-favorite-outline:before, +.ion-android-film:before, +.ion-android-folder:before, +.ion-android-folder-open:before, +.ion-android-funnel:before, +.ion-android-globe:before, +.ion-android-hand:before, +.ion-android-hangout:before, +.ion-android-happy:before, +.ion-android-home:before, +.ion-android-image:before, +.ion-android-laptop:before, +.ion-android-list:before, +.ion-android-locate:before, +.ion-android-lock:before, +.ion-android-mail:before, +.ion-android-map:before, +.ion-android-menu:before, +.ion-android-microphone:before, +.ion-android-microphone-off:before, +.ion-android-more-horizontal:before, +.ion-android-more-vertical:before, +.ion-android-navigate:before, +.ion-android-notifications:before, +.ion-android-notifications-none:before, +.ion-android-notifications-off:before, +.ion-android-open:before, +.ion-android-options:before, +.ion-android-people:before, +.ion-android-person:before, +.ion-android-person-add:before, +.ion-android-phone-landscape:before, +.ion-android-phone-portrait:before, +.ion-android-pin:before, +.ion-android-plane:before, +.ion-android-playstore:before, +.ion-android-print:before, +.ion-android-radio-button-off:before, +.ion-android-radio-button-on:before, +.ion-android-refresh:before, +.ion-android-remove:before, +.ion-android-remove-circle:before, +.ion-android-restaurant:before, +.ion-android-sad:before, +.ion-android-search:before, +.ion-android-send:before, +.ion-android-settings:before, +.ion-android-share:before, +.ion-android-share-alt:before, +.ion-android-star:before, +.ion-android-star-half:before, +.ion-android-star-outline:before, +.ion-android-stopwatch:before, +.ion-android-subway:before, +.ion-android-sunny:before, +.ion-android-sync:before, +.ion-android-textsms:before, +.ion-android-time:before, +.ion-android-train:before, +.ion-android-unlock:before, +.ion-android-upload:before, +.ion-android-volume-down:before, +.ion-android-volume-mute:before, +.ion-android-volume-off:before, +.ion-android-volume-up:before, +.ion-android-walk:before, +.ion-android-warning:before, +.ion-android-watch:before, +.ion-android-wifi:before, +.ion-aperture:before, +.ion-archive:before, +.ion-arrow-down-a:before, +.ion-arrow-down-b:before, +.ion-arrow-down-c:before, +.ion-arrow-expand:before, +.ion-arrow-graph-down-left:before, +.ion-arrow-graph-down-right:before, +.ion-arrow-graph-up-left:before, +.ion-arrow-graph-up-right:before, +.ion-arrow-left-a:before, +.ion-arrow-left-b:before, +.ion-arrow-left-c:before, +.ion-arrow-move:before, +.ion-arrow-resize:before, +.ion-arrow-return-left:before, +.ion-arrow-return-right:before, +.ion-arrow-right-a:before, +.ion-arrow-right-b:before, +.ion-arrow-right-c:before, +.ion-arrow-shrink:before, +.ion-arrow-swap:before, +.ion-arrow-up-a:before, +.ion-arrow-up-b:before, +.ion-arrow-up-c:before, +.ion-asterisk:before, +.ion-at:before, +.ion-backspace:before, +.ion-backspace-outline:before, +.ion-bag:before, +.ion-battery-charging:before, +.ion-battery-empty:before, +.ion-battery-full:before, +.ion-battery-half:before, +.ion-battery-low:before, +.ion-beaker:before, +.ion-beer:before, +.ion-bluetooth:before, +.ion-bonfire:before, +.ion-bookmark:before, +.ion-bowtie:before, +.ion-briefcase:before, +.ion-bug:before, +.ion-calculator:before, +.ion-calendar:before, +.ion-camera:before, +.ion-card:before, +.ion-cash:before, +.ion-chatbox:before, +.ion-chatbox-working:before, +.ion-chatboxes:before, +.ion-chatbubble:before, +.ion-chatbubble-working:before, +.ion-chatbubbles:before, +.ion-checkmark:before, +.ion-checkmark-circled:before, +.ion-checkmark-round:before, +.ion-chevron-down:before, +.ion-chevron-left:before, +.ion-chevron-right:before, +.ion-chevron-up:before, +.ion-clipboard:before, +.ion-clock:before, +.ion-close:before, +.ion-close-circled:before, +.ion-close-round:before, +.ion-closed-captioning:before, +.ion-cloud:before, +.ion-code:before, +.ion-code-download:before, +.ion-code-working:before, +.ion-coffee:before, +.ion-compass:before, +.ion-compose:before, +.ion-connection-bars:before, +.ion-contrast:before, +.ion-crop:before, +.ion-cube:before, +.ion-disc:before, +.ion-document:before, +.ion-document-text:before, +.ion-drag:before, +.ion-earth:before, +.ion-easel:before, +.ion-edit:before, +.ion-egg:before, +.ion-eject:before, +.ion-email:before, +.ion-email-unread:before, +.ion-erlenmeyer-flask:before, +.ion-erlenmeyer-flask-bubbles:before, +.ion-eye:before, +.ion-eye-disabled:before, +.ion-female:before, +.ion-filing:before, +.ion-film-marker:before, +.ion-fireball:before, +.ion-flag:before, +.ion-flame:before, +.ion-flash:before, +.ion-flash-off:before, +.ion-folder:before, +.ion-fork:before, +.ion-fork-repo:before, +.ion-forward:before, +.ion-funnel:before, +.ion-gear-a:before, +.ion-gear-b:before, +.ion-grid:before, +.ion-hammer:before, +.ion-happy:before, +.ion-happy-outline:before, +.ion-headphone:before, +.ion-heart:before, +.ion-heart-broken:before, +.ion-help:before, +.ion-help-buoy:before, +.ion-help-circled:before, +.ion-home:before, +.ion-icecream:before, +.ion-image:before, +.ion-images:before, +.ion-information:before, +.ion-information-circled:before, +.ion-ionic:before, +.ion-ios-alarm:before, +.ion-ios-alarm-outline:before, +.ion-ios-albums:before, +.ion-ios-albums-outline:before, +.ion-ios-americanfootball:before, +.ion-ios-americanfootball-outline:before, +.ion-ios-analytics:before, +.ion-ios-analytics-outline:before, +.ion-ios-arrow-back:before, +.ion-ios-arrow-down:before, +.ion-ios-arrow-forward:before, +.ion-ios-arrow-left:before, +.ion-ios-arrow-right:before, +.ion-ios-arrow-thin-down:before, +.ion-ios-arrow-thin-left:before, +.ion-ios-arrow-thin-right:before, +.ion-ios-arrow-thin-up:before, +.ion-ios-arrow-up:before, +.ion-ios-at:before, +.ion-ios-at-outline:before, +.ion-ios-barcode:before, +.ion-ios-barcode-outline:before, +.ion-ios-baseball:before, +.ion-ios-baseball-outline:before, +.ion-ios-basketball:before, +.ion-ios-basketball-outline:before, +.ion-ios-bell:before, +.ion-ios-bell-outline:before, +.ion-ios-body:before, +.ion-ios-body-outline:before, +.ion-ios-bolt:before, +.ion-ios-bolt-outline:before, +.ion-ios-book:before, +.ion-ios-book-outline:before, +.ion-ios-bookmarks:before, +.ion-ios-bookmarks-outline:before, +.ion-ios-box:before, +.ion-ios-box-outline:before, +.ion-ios-briefcase:before, +.ion-ios-briefcase-outline:before, +.ion-ios-browsers:before, +.ion-ios-browsers-outline:before, +.ion-ios-calculator:before, +.ion-ios-calculator-outline:before, +.ion-ios-calendar:before, +.ion-ios-calendar-outline:before, +.ion-ios-camera:before, +.ion-ios-camera-outline:before, +.ion-ios-cart:before, +.ion-ios-cart-outline:before, +.ion-ios-chatboxes:before, +.ion-ios-chatboxes-outline:before, +.ion-ios-chatbubble:before, +.ion-ios-chatbubble-outline:before, +.ion-ios-checkmark:before, +.ion-ios-checkmark-empty:before, +.ion-ios-checkmark-outline:before, +.ion-ios-circle-filled:before, +.ion-ios-circle-outline:before, +.ion-ios-clock:before, +.ion-ios-clock-outline:before, +.ion-ios-close:before, +.ion-ios-close-empty:before, +.ion-ios-close-outline:before, +.ion-ios-cloud:before, +.ion-ios-cloud-download:before, +.ion-ios-cloud-download-outline:before, +.ion-ios-cloud-outline:before, +.ion-ios-cloud-upload:before, +.ion-ios-cloud-upload-outline:before, +.ion-ios-cloudy:before, +.ion-ios-cloudy-night:before, +.ion-ios-cloudy-night-outline:before, +.ion-ios-cloudy-outline:before, +.ion-ios-cog:before, +.ion-ios-cog-outline:before, +.ion-ios-color-filter:before, +.ion-ios-color-filter-outline:before, +.ion-ios-color-wand:before, +.ion-ios-color-wand-outline:before, +.ion-ios-compose:before, +.ion-ios-compose-outline:before, +.ion-ios-contact:before, +.ion-ios-contact-outline:before, +.ion-ios-copy:before, +.ion-ios-copy-outline:before, +.ion-ios-crop:before, +.ion-ios-crop-strong:before, +.ion-ios-download:before, +.ion-ios-download-outline:before, +.ion-ios-drag:before, +.ion-ios-email:before, +.ion-ios-email-outline:before, +.ion-ios-eye:before, +.ion-ios-eye-outline:before, +.ion-ios-fastforward:before, +.ion-ios-fastforward-outline:before, +.ion-ios-filing:before, +.ion-ios-filing-outline:before, +.ion-ios-film:before, +.ion-ios-film-outline:before, +.ion-ios-flag:before, +.ion-ios-flag-outline:before, +.ion-ios-flame:before, +.ion-ios-flame-outline:before, +.ion-ios-flask:before, +.ion-ios-flask-outline:before, +.ion-ios-flower:before, +.ion-ios-flower-outline:before, +.ion-ios-folder:before, +.ion-ios-folder-outline:before, +.ion-ios-football:before, +.ion-ios-football-outline:before, +.ion-ios-game-controller-a:before, +.ion-ios-game-controller-a-outline:before, +.ion-ios-game-controller-b:before, +.ion-ios-game-controller-b-outline:before, +.ion-ios-gear:before, +.ion-ios-gear-outline:before, +.ion-ios-glasses:before, +.ion-ios-glasses-outline:before, +.ion-ios-grid-view:before, +.ion-ios-grid-view-outline:before, +.ion-ios-heart:before, +.ion-ios-heart-outline:before, +.ion-ios-help:before, +.ion-ios-help-empty:before, +.ion-ios-help-outline:before, +.ion-ios-home:before, +.ion-ios-home-outline:before, +.ion-ios-infinite:before, +.ion-ios-infinite-outline:before, +.ion-ios-information:before, +.ion-ios-information-empty:before, +.ion-ios-information-outline:before, +.ion-ios-ionic-outline:before, +.ion-ios-keypad:before, +.ion-ios-keypad-outline:before, +.ion-ios-lightbulb:before, +.ion-ios-lightbulb-outline:before, +.ion-ios-list:before, +.ion-ios-list-outline:before, +.ion-ios-location:before, +.ion-ios-location-outline:before, +.ion-ios-locked:before, +.ion-ios-locked-outline:before, +.ion-ios-loop:before, +.ion-ios-loop-strong:before, +.ion-ios-medical:before, +.ion-ios-medical-outline:before, +.ion-ios-medkit:before, +.ion-ios-medkit-outline:before, +.ion-ios-mic:before, +.ion-ios-mic-off:before, +.ion-ios-mic-outline:before, +.ion-ios-minus:before, +.ion-ios-minus-empty:before, +.ion-ios-minus-outline:before, +.ion-ios-monitor:before, +.ion-ios-monitor-outline:before, +.ion-ios-moon:before, +.ion-ios-moon-outline:before, +.ion-ios-more:before, +.ion-ios-more-outline:before, +.ion-ios-musical-note:before, +.ion-ios-musical-notes:before, +.ion-ios-navigate:before, +.ion-ios-navigate-outline:before, +.ion-ios-nutrition:before, +.ion-ios-nutrition-outline:before, +.ion-ios-paper:before, +.ion-ios-paper-outline:before, +.ion-ios-paperplane:before, +.ion-ios-paperplane-outline:before, +.ion-ios-partlysunny:before, +.ion-ios-partlysunny-outline:before, +.ion-ios-pause:before, +.ion-ios-pause-outline:before, +.ion-ios-paw:before, +.ion-ios-paw-outline:before, +.ion-ios-people:before, +.ion-ios-people-outline:before, +.ion-ios-person:before, +.ion-ios-person-outline:before, +.ion-ios-personadd:before, +.ion-ios-personadd-outline:before, +.ion-ios-photos:before, +.ion-ios-photos-outline:before, +.ion-ios-pie:before, +.ion-ios-pie-outline:before, +.ion-ios-pint:before, +.ion-ios-pint-outline:before, +.ion-ios-play:before, +.ion-ios-play-outline:before, +.ion-ios-plus:before, +.ion-ios-plus-empty:before, +.ion-ios-plus-outline:before, +.ion-ios-pricetag:before, +.ion-ios-pricetag-outline:before, +.ion-ios-pricetags:before, +.ion-ios-pricetags-outline:before, +.ion-ios-printer:before, +.ion-ios-printer-outline:before, +.ion-ios-pulse:before, +.ion-ios-pulse-strong:before, +.ion-ios-rainy:before, +.ion-ios-rainy-outline:before, +.ion-ios-recording:before, +.ion-ios-recording-outline:before, +.ion-ios-redo:before, +.ion-ios-redo-outline:before, +.ion-ios-refresh:before, +.ion-ios-refresh-empty:before, +.ion-ios-refresh-outline:before, +.ion-ios-reload:before, +.ion-ios-reverse-camera:before, +.ion-ios-reverse-camera-outline:before, +.ion-ios-rewind:before, +.ion-ios-rewind-outline:before, +.ion-ios-rose:before, +.ion-ios-rose-outline:before, +.ion-ios-search:before, +.ion-ios-search-strong:before, +.ion-ios-settings:before, +.ion-ios-settings-strong:before, +.ion-ios-shuffle:before, +.ion-ios-shuffle-strong:before, +.ion-ios-skipbackward:before, +.ion-ios-skipbackward-outline:before, +.ion-ios-skipforward:before, +.ion-ios-skipforward-outline:before, +.ion-ios-snowy:before, +.ion-ios-speedometer:before, +.ion-ios-speedometer-outline:before, +.ion-ios-star:before, +.ion-ios-star-half:before, +.ion-ios-star-outline:before, +.ion-ios-stopwatch:before, +.ion-ios-stopwatch-outline:before, +.ion-ios-sunny:before, +.ion-ios-sunny-outline:before, +.ion-ios-telephone:before, +.ion-ios-telephone-outline:before, +.ion-ios-tennisball:before, +.ion-ios-tennisball-outline:before, +.ion-ios-thunderstorm:before, +.ion-ios-thunderstorm-outline:before, +.ion-ios-time:before, +.ion-ios-time-outline:before, +.ion-ios-timer:before, +.ion-ios-timer-outline:before, +.ion-ios-toggle:before, +.ion-ios-toggle-outline:before, +.ion-ios-trash:before, +.ion-ios-trash-outline:before, +.ion-ios-undo:before, +.ion-ios-undo-outline:before, +.ion-ios-unlocked:before, +.ion-ios-unlocked-outline:before, +.ion-ios-upload:before, +.ion-ios-upload-outline:before, +.ion-ios-videocam:before, +.ion-ios-videocam-outline:before, +.ion-ios-volume-high:before, +.ion-ios-volume-low:before, +.ion-ios-wineglass:before, +.ion-ios-wineglass-outline:before, +.ion-ios-world:before, +.ion-ios-world-outline:before, +.ion-ipad:before, +.ion-iphone:before, +.ion-ipod:before, +.ion-jet:before, +.ion-key:before, +.ion-knife:before, +.ion-laptop:before, +.ion-leaf:before, +.ion-levels:before, +.ion-lightbulb:before, +.ion-link:before, +.ion-load-a:before, +.ion-load-b:before, +.ion-load-c:before, +.ion-load-d:before, +.ion-location:before, +.ion-lock-combination:before, +.ion-locked:before, +.ion-log-in:before, +.ion-log-out:before, +.ion-loop:before, +.ion-magnet:before, +.ion-male:before, +.ion-man:before, +.ion-map:before, +.ion-medkit:before, +.ion-merge:before, +.ion-mic-a:before, +.ion-mic-b:before, +.ion-mic-c:before, +.ion-minus:before, +.ion-minus-circled:before, +.ion-minus-round:before, +.ion-model-s:before, +.ion-monitor:before, +.ion-more:before, +.ion-mouse:before, +.ion-music-note:before, +.ion-navicon:before, +.ion-navicon-round:before, +.ion-navigate:before, +.ion-network:before, +.ion-no-smoking:before, +.ion-nuclear:before, +.ion-outlet:before, +.ion-paintbrush:before, +.ion-paintbucket:before, +.ion-paper-airplane:before, +.ion-paperclip:before, +.ion-pause:before, +.ion-person:before, +.ion-person-add:before, +.ion-person-stalker:before, +.ion-pie-graph:before, +.ion-pin:before, +.ion-pinpoint:before, +.ion-pizza:before, +.ion-plane:before, +.ion-planet:before, +.ion-play:before, +.ion-playstation:before, +.ion-plus:before, +.ion-plus-circled:before, +.ion-plus-round:before, +.ion-podium:before, +.ion-pound:before, +.ion-power:before, +.ion-pricetag:before, +.ion-pricetags:before, +.ion-printer:before, +.ion-pull-request:before, +.ion-qr-scanner:before, +.ion-quote:before, +.ion-radio-waves:before, +.ion-record:before, +.ion-refresh:before, +.ion-reply:before, +.ion-reply-all:before, +.ion-ribbon-a:before, +.ion-ribbon-b:before, +.ion-sad:before, +.ion-sad-outline:before, +.ion-scissors:before, +.ion-search:before, +.ion-settings:before, +.ion-share:before, +.ion-shuffle:before, +.ion-skip-backward:before, +.ion-skip-forward:before, +.ion-social-android:before, +.ion-social-android-outline:before, +.ion-social-angular:before, +.ion-social-angular-outline:before, +.ion-social-apple:before, +.ion-social-apple-outline:before, +.ion-social-bitcoin:before, +.ion-social-bitcoin-outline:before, +.ion-social-buffer:before, +.ion-social-buffer-outline:before, +.ion-social-chrome:before, +.ion-social-chrome-outline:before, +.ion-social-codepen:before, +.ion-social-codepen-outline:before, +.ion-social-css3:before, +.ion-social-css3-outline:before, +.ion-social-designernews:before, +.ion-social-designernews-outline:before, +.ion-social-dribbble:before, +.ion-social-dribbble-outline:before, +.ion-social-dropbox:before, +.ion-social-dropbox-outline:before, +.ion-social-euro:before, +.ion-social-euro-outline:before, +.ion-social-facebook:before, +.ion-social-facebook-outline:before, +.ion-social-foursquare:before, +.ion-social-foursquare-outline:before, +.ion-social-freebsd-devil:before, +.ion-social-github:before, +.ion-social-github-outline:before, +.ion-social-google:before, +.ion-social-google-outline:before, +.ion-social-googleplus:before, +.ion-social-googleplus-outline:before, +.ion-social-hackernews:before, +.ion-social-hackernews-outline:before, +.ion-social-html5:before, +.ion-social-html5-outline:before, +.ion-social-instagram:before, +.ion-social-instagram-outline:before, +.ion-social-javascript:before, +.ion-social-javascript-outline:before, +.ion-social-linkedin:before, +.ion-social-linkedin-outline:before, +.ion-social-markdown:before, +.ion-social-nodejs:before, +.ion-social-octocat:before, +.ion-social-pinterest:before, +.ion-social-pinterest-outline:before, +.ion-social-python:before, +.ion-social-reddit:before, +.ion-social-reddit-outline:before, +.ion-social-rss:before, +.ion-social-rss-outline:before, +.ion-social-sass:before, +.ion-social-skype:before, +.ion-social-skype-outline:before, +.ion-social-snapchat:before, +.ion-social-snapchat-outline:before, +.ion-social-tumblr:before, +.ion-social-tumblr-outline:before, +.ion-social-tux:before, +.ion-social-twitch:before, +.ion-social-twitch-outline:before, +.ion-social-twitter:before, +.ion-social-twitter-outline:before, +.ion-social-usd:before, +.ion-social-usd-outline:before, +.ion-social-vimeo:before, +.ion-social-vimeo-outline:before, +.ion-social-whatsapp:before, +.ion-social-whatsapp-outline:before, +.ion-social-windows:before, +.ion-social-windows-outline:before, +.ion-social-wordpress:before, +.ion-social-wordpress-outline:before, +.ion-social-yahoo:before, +.ion-social-yahoo-outline:before, +.ion-social-yen:before, +.ion-social-yen-outline:before, +.ion-social-youtube:before, +.ion-social-youtube-outline:before, +.ion-soup-can:before, +.ion-soup-can-outline:before, +.ion-speakerphone:before, +.ion-speedometer:before, +.ion-spoon:before, +.ion-star:before, +.ion-stats-bars:before, +.ion-steam:before, +.ion-stop:before, +.ion-thermometer:before, +.ion-thumbsdown:before, +.ion-thumbsup:before, +.ion-toggle:before, +.ion-toggle-filled:before, +.ion-transgender:before, +.ion-trash-a:before, +.ion-trash-b:before, +.ion-trophy:before, +.ion-tshirt:before, +.ion-tshirt-outline:before, +.ion-umbrella:before, +.ion-university:before, +.ion-unlocked:before, +.ion-upload:before, +.ion-usb:before, +.ion-videocamera:before, +.ion-volume-high:before, +.ion-volume-low:before, +.ion-volume-medium:before, +.ion-volume-mute:before, +.ion-wand:before, +.ion-waterdrop:before, +.ion-wifi:before, +.ion-wineglass:before, +.ion-woman:before, +.ion-wrench:before, +.ion-xbox:before { + display: inline-block; + font-family: "Ionicons"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + text-rendering: auto; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.ion-alert:before { + content: ""; } + +.ion-alert-circled:before { + content: ""; } + +.ion-android-add:before { + content: ""; } + +.ion-android-add-circle:before { + content: ""; } + +.ion-android-alarm-clock:before { + content: ""; } + +.ion-android-alert:before { + content: ""; } + +.ion-android-apps:before { + content: ""; } + +.ion-android-archive:before { + content: ""; } + +.ion-android-arrow-back:before { + content: ""; } + +.ion-android-arrow-down:before { + content: ""; } + +.ion-android-arrow-dropdown:before { + content: ""; } + +.ion-android-arrow-dropdown-circle:before { + content: ""; } + +.ion-android-arrow-dropleft:before { + content: ""; } + +.ion-android-arrow-dropleft-circle:before { + content: ""; } + +.ion-android-arrow-dropright:before { + content: ""; } + +.ion-android-arrow-dropright-circle:before { + content: ""; } + +.ion-android-arrow-dropup:before { + content: ""; } + +.ion-android-arrow-dropup-circle:before { + content: ""; } + +.ion-android-arrow-forward:before { + content: ""; } + +.ion-android-arrow-up:before { + content: ""; } + +.ion-android-attach:before { + content: ""; } + +.ion-android-bar:before { + content: ""; } + +.ion-android-bicycle:before { + content: ""; } + +.ion-android-boat:before { + content: ""; } + +.ion-android-bookmark:before { + content: ""; } + +.ion-android-bulb:before { + content: ""; } + +.ion-android-bus:before { + content: ""; } + +.ion-android-calendar:before { + content: ""; } + +.ion-android-call:before { + content: ""; } + +.ion-android-camera:before { + content: ""; } + +.ion-android-cancel:before { + content: ""; } + +.ion-android-car:before { + content: ""; } + +.ion-android-cart:before { + content: ""; } + +.ion-android-chat:before { + content: ""; } + +.ion-android-checkbox:before { + content: ""; } + +.ion-android-checkbox-blank:before { + content: ""; } + +.ion-android-checkbox-outline:before { + content: ""; } + +.ion-android-checkbox-outline-blank:before { + content: ""; } + +.ion-android-checkmark-circle:before { + content: ""; } + +.ion-android-clipboard:before { + content: ""; } + +.ion-android-close:before { + content: ""; } + +.ion-android-cloud:before { + content: ""; } + +.ion-android-cloud-circle:before { + content: ""; } + +.ion-android-cloud-done:before { + content: ""; } + +.ion-android-cloud-outline:before { + content: ""; } + +.ion-android-color-palette:before { + content: ""; } + +.ion-android-compass:before { + content: ""; } + +.ion-android-contact:before { + content: ""; } + +.ion-android-contacts:before { + content: ""; } + +.ion-android-contract:before { + content: ""; } + +.ion-android-create:before { + content: ""; } + +.ion-android-delete:before { + content: ""; } + +.ion-android-desktop:before { + content: ""; } + +.ion-android-document:before { + content: ""; } + +.ion-android-done:before { + content: ""; } + +.ion-android-done-all:before { + content: ""; } + +.ion-android-download:before { + content: ""; } + +.ion-android-drafts:before { + content: ""; } + +.ion-android-exit:before { + content: ""; } + +.ion-android-expand:before { + content: ""; } + +.ion-android-favorite:before { + content: ""; } + +.ion-android-favorite-outline:before { + content: ""; } + +.ion-android-film:before { + content: ""; } + +.ion-android-folder:before { + content: ""; } + +.ion-android-folder-open:before { + content: ""; } + +.ion-android-funnel:before { + content: ""; } + +.ion-android-globe:before { + content: ""; } + +.ion-android-hand:before { + content: ""; } + +.ion-android-hangout:before { + content: ""; } + +.ion-android-happy:before { + content: ""; } + +.ion-android-home:before { + content: ""; } + +.ion-android-image:before { + content: ""; } + +.ion-android-laptop:before { + content: ""; } + +.ion-android-list:before { + content: ""; } + +.ion-android-locate:before { + content: ""; } + +.ion-android-lock:before { + content: ""; } + +.ion-android-mail:before { + content: ""; } + +.ion-android-map:before { + content: ""; } + +.ion-android-menu:before { + content: ""; } + +.ion-android-microphone:before { + content: ""; } + +.ion-android-microphone-off:before { + content: ""; } + +.ion-android-more-horizontal:before { + content: ""; } + +.ion-android-more-vertical:before { + content: ""; } + +.ion-android-navigate:before { + content: ""; } + +.ion-android-notifications:before { + content: ""; } + +.ion-android-notifications-none:before { + content: ""; } + +.ion-android-notifications-off:before { + content: ""; } + +.ion-android-open:before { + content: ""; } + +.ion-android-options:before { + content: ""; } + +.ion-android-people:before { + content: ""; } + +.ion-android-person:before { + content: ""; } + +.ion-android-person-add:before { + content: ""; } + +.ion-android-phone-landscape:before { + content: ""; } + +.ion-android-phone-portrait:before { + content: ""; } + +.ion-android-pin:before { + content: ""; } + +.ion-android-plane:before { + content: ""; } + +.ion-android-playstore:before { + content: ""; } + +.ion-android-print:before { + content: ""; } + +.ion-android-radio-button-off:before { + content: ""; } + +.ion-android-radio-button-on:before { + content: ""; } + +.ion-android-refresh:before { + content: ""; } + +.ion-android-remove:before { + content: ""; } + +.ion-android-remove-circle:before { + content: ""; } + +.ion-android-restaurant:before { + content: ""; } + +.ion-android-sad:before { + content: ""; } + +.ion-android-search:before { + content: ""; } + +.ion-android-send:before { + content: ""; } + +.ion-android-settings:before { + content: ""; } + +.ion-android-share:before { + content: ""; } + +.ion-android-share-alt:before { + content: ""; } + +.ion-android-star:before { + content: ""; } + +.ion-android-star-half:before { + content: ""; } + +.ion-android-star-outline:before { + content: ""; } + +.ion-android-stopwatch:before { + content: ""; } + +.ion-android-subway:before { + content: ""; } + +.ion-android-sunny:before { + content: ""; } + +.ion-android-sync:before { + content: ""; } + +.ion-android-textsms:before { + content: ""; } + +.ion-android-time:before { + content: ""; } + +.ion-android-train:before { + content: ""; } + +.ion-android-unlock:before { + content: ""; } + +.ion-android-upload:before { + content: ""; } + +.ion-android-volume-down:before { + content: ""; } + +.ion-android-volume-mute:before { + content: ""; } + +.ion-android-volume-off:before { + content: ""; } + +.ion-android-volume-up:before { + content: ""; } + +.ion-android-walk:before { + content: ""; } + +.ion-android-warning:before { + content: ""; } + +.ion-android-watch:before { + content: ""; } + +.ion-android-wifi:before { + content: ""; } + +.ion-aperture:before { + content: ""; } + +.ion-archive:before { + content: ""; } + +.ion-arrow-down-a:before { + content: ""; } + +.ion-arrow-down-b:before { + content: ""; } + +.ion-arrow-down-c:before { + content: ""; } + +.ion-arrow-expand:before { + content: ""; } + +.ion-arrow-graph-down-left:before { + content: ""; } + +.ion-arrow-graph-down-right:before { + content: ""; } + +.ion-arrow-graph-up-left:before { + content: ""; } + +.ion-arrow-graph-up-right:before { + content: ""; } + +.ion-arrow-left-a:before { + content: ""; } + +.ion-arrow-left-b:before { + content: ""; } + +.ion-arrow-left-c:before { + content: ""; } + +.ion-arrow-move:before { + content: ""; } + +.ion-arrow-resize:before { + content: ""; } + +.ion-arrow-return-left:before { + content: ""; } + +.ion-arrow-return-right:before { + content: ""; } + +.ion-arrow-right-a:before { + content: ""; } + +.ion-arrow-right-b:before { + content: ""; } + +.ion-arrow-right-c:before { + content: ""; } + +.ion-arrow-shrink:before { + content: ""; } + +.ion-arrow-swap:before { + content: ""; } + +.ion-arrow-up-a:before { + content: ""; } + +.ion-arrow-up-b:before { + content: ""; } + +.ion-arrow-up-c:before { + content: ""; } + +.ion-asterisk:before { + content: ""; } + +.ion-at:before { + content: ""; } + +.ion-backspace:before { + content: ""; } + +.ion-backspace-outline:before { + content: ""; } + +.ion-bag:before { + content: ""; } + +.ion-battery-charging:before { + content: ""; } + +.ion-battery-empty:before { + content: ""; } + +.ion-battery-full:before { + content: ""; } + +.ion-battery-half:before { + content: ""; } + +.ion-battery-low:before { + content: ""; } + +.ion-beaker:before { + content: ""; } + +.ion-beer:before { + content: ""; } + +.ion-bluetooth:before { + content: ""; } + +.ion-bonfire:before { + content: ""; } + +.ion-bookmark:before { + content: ""; } + +.ion-bowtie:before { + content: ""; } + +.ion-briefcase:before { + content: ""; } + +.ion-bug:before { + content: ""; } + +.ion-calculator:before { + content: ""; } + +.ion-calendar:before { + content: ""; } + +.ion-camera:before { + content: ""; } + +.ion-card:before { + content: ""; } + +.ion-cash:before { + content: ""; } + +.ion-chatbox:before { + content: ""; } + +.ion-chatbox-working:before { + content: ""; } + +.ion-chatboxes:before { + content: ""; } + +.ion-chatbubble:before { + content: ""; } + +.ion-chatbubble-working:before { + content: ""; } + +.ion-chatbubbles:before { + content: ""; } + +.ion-checkmark:before { + content: ""; } + +.ion-checkmark-circled:before { + content: ""; } + +.ion-checkmark-round:before { + content: ""; } + +.ion-chevron-down:before { + content: ""; } + +.ion-chevron-left:before { + content: ""; } + +.ion-chevron-right:before { + content: ""; } + +.ion-chevron-up:before { + content: ""; } + +.ion-clipboard:before { + content: ""; } + +.ion-clock:before { + content: ""; } + +.ion-close:before { + content: ""; } + +.ion-close-circled:before { + content: ""; } + +.ion-close-round:before { + content: ""; } + +.ion-closed-captioning:before { + content: ""; } + +.ion-cloud:before { + content: ""; } + +.ion-code:before { + content: ""; } + +.ion-code-download:before { + content: ""; } + +.ion-code-working:before { + content: ""; } + +.ion-coffee:before { + content: ""; } + +.ion-compass:before { + content: ""; } + +.ion-compose:before { + content: ""; } + +.ion-connection-bars:before { + content: ""; } + +.ion-contrast:before { + content: ""; } + +.ion-crop:before { + content: ""; } + +.ion-cube:before { + content: ""; } + +.ion-disc:before { + content: ""; } + +.ion-document:before { + content: ""; } + +.ion-document-text:before { + content: ""; } + +.ion-drag:before { + content: ""; } + +.ion-earth:before { + content: ""; } + +.ion-easel:before { + content: ""; } + +.ion-edit:before { + content: ""; } + +.ion-egg:before { + content: ""; } + +.ion-eject:before { + content: ""; } + +.ion-email:before { + content: ""; } + +.ion-email-unread:before { + content: ""; } + +.ion-erlenmeyer-flask:before { + content: ""; } + +.ion-erlenmeyer-flask-bubbles:before { + content: ""; } + +.ion-eye:before { + content: ""; } + +.ion-eye-disabled:before { + content: ""; } + +.ion-female:before { + content: ""; } + +.ion-filing:before { + content: ""; } + +.ion-film-marker:before { + content: ""; } + +.ion-fireball:before { + content: ""; } + +.ion-flag:before { + content: ""; } + +.ion-flame:before { + content: ""; } + +.ion-flash:before { + content: ""; } + +.ion-flash-off:before { + content: ""; } + +.ion-folder:before { + content: ""; } + +.ion-fork:before { + content: ""; } + +.ion-fork-repo:before { + content: ""; } + +.ion-forward:before { + content: ""; } + +.ion-funnel:before { + content: ""; } + +.ion-gear-a:before { + content: ""; } + +.ion-gear-b:before { + content: ""; } + +.ion-grid:before { + content: ""; } + +.ion-hammer:before { + content: ""; } + +.ion-happy:before { + content: ""; } + +.ion-happy-outline:before { + content: ""; } + +.ion-headphone:before { + content: ""; } + +.ion-heart:before { + content: ""; } + +.ion-heart-broken:before { + content: ""; } + +.ion-help:before { + content: ""; } + +.ion-help-buoy:before { + content: ""; } + +.ion-help-circled:before { + content: ""; } + +.ion-home:before { + content: ""; } + +.ion-icecream:before { + content: ""; } + +.ion-image:before { + content: ""; } + +.ion-images:before { + content: ""; } + +.ion-information:before { + content: ""; } + +.ion-information-circled:before { + content: ""; } + +.ion-ionic:before { + content: ""; } + +.ion-ios-alarm:before { + content: ""; } + +.ion-ios-alarm-outline:before { + content: ""; } + +.ion-ios-albums:before { + content: ""; } + +.ion-ios-albums-outline:before { + content: ""; } + +.ion-ios-americanfootball:before { + content: ""; } + +.ion-ios-americanfootball-outline:before { + content: ""; } + +.ion-ios-analytics:before { + content: ""; } + +.ion-ios-analytics-outline:before { + content: ""; } + +.ion-ios-arrow-back:before { + content: ""; } + +.ion-ios-arrow-down:before { + content: ""; } + +.ion-ios-arrow-forward:before { + content: ""; } + +.ion-ios-arrow-left:before { + content: ""; } + +.ion-ios-arrow-right:before { + content: ""; } + +.ion-ios-arrow-thin-down:before { + content: ""; } + +.ion-ios-arrow-thin-left:before { + content: ""; } + +.ion-ios-arrow-thin-right:before { + content: ""; } + +.ion-ios-arrow-thin-up:before { + content: ""; } + +.ion-ios-arrow-up:before { + content: ""; } + +.ion-ios-at:before { + content: ""; } + +.ion-ios-at-outline:before { + content: ""; } + +.ion-ios-barcode:before { + content: ""; } + +.ion-ios-barcode-outline:before { + content: ""; } + +.ion-ios-baseball:before { + content: ""; } + +.ion-ios-baseball-outline:before { + content: ""; } + +.ion-ios-basketball:before { + content: ""; } + +.ion-ios-basketball-outline:before { + content: ""; } + +.ion-ios-bell:before { + content: ""; } + +.ion-ios-bell-outline:before { + content: ""; } + +.ion-ios-body:before { + content: ""; } + +.ion-ios-body-outline:before { + content: ""; } + +.ion-ios-bolt:before { + content: ""; } + +.ion-ios-bolt-outline:before { + content: ""; } + +.ion-ios-book:before { + content: ""; } + +.ion-ios-book-outline:before { + content: ""; } + +.ion-ios-bookmarks:before { + content: ""; } + +.ion-ios-bookmarks-outline:before { + content: ""; } + +.ion-ios-box:before { + content: ""; } + +.ion-ios-box-outline:before { + content: ""; } + +.ion-ios-briefcase:before { + content: ""; } + +.ion-ios-briefcase-outline:before { + content: ""; } + +.ion-ios-browsers:before { + content: ""; } + +.ion-ios-browsers-outline:before { + content: ""; } + +.ion-ios-calculator:before { + content: ""; } + +.ion-ios-calculator-outline:before { + content: ""; } + +.ion-ios-calendar:before { + content: ""; } + +.ion-ios-calendar-outline:before { + content: ""; } + +.ion-ios-camera:before { + content: ""; } + +.ion-ios-camera-outline:before { + content: ""; } + +.ion-ios-cart:before { + content: ""; } + +.ion-ios-cart-outline:before { + content: ""; } + +.ion-ios-chatboxes:before { + content: ""; } + +.ion-ios-chatboxes-outline:before { + content: ""; } + +.ion-ios-chatbubble:before { + content: ""; } + +.ion-ios-chatbubble-outline:before { + content: ""; } + +.ion-ios-checkmark:before { + content: ""; } + +.ion-ios-checkmark-empty:before { + content: ""; } + +.ion-ios-checkmark-outline:before { + content: ""; } + +.ion-ios-circle-filled:before { + content: ""; } + +.ion-ios-circle-outline:before { + content: ""; } + +.ion-ios-clock:before { + content: ""; } + +.ion-ios-clock-outline:before { + content: ""; } + +.ion-ios-close:before { + content: ""; } + +.ion-ios-close-empty:before { + content: ""; } + +.ion-ios-close-outline:before { + content: ""; } + +.ion-ios-cloud:before { + content: ""; } + +.ion-ios-cloud-download:before { + content: ""; } + +.ion-ios-cloud-download-outline:before { + content: ""; } + +.ion-ios-cloud-outline:before { + content: ""; } + +.ion-ios-cloud-upload:before { + content: ""; } + +.ion-ios-cloud-upload-outline:before { + content: ""; } + +.ion-ios-cloudy:before { + content: ""; } + +.ion-ios-cloudy-night:before { + content: ""; } + +.ion-ios-cloudy-night-outline:before { + content: ""; } + +.ion-ios-cloudy-outline:before { + content: ""; } + +.ion-ios-cog:before { + content: ""; } + +.ion-ios-cog-outline:before { + content: ""; } + +.ion-ios-color-filter:before { + content: ""; } + +.ion-ios-color-filter-outline:before { + content: ""; } + +.ion-ios-color-wand:before { + content: ""; } + +.ion-ios-color-wand-outline:before { + content: ""; } + +.ion-ios-compose:before { + content: ""; } + +.ion-ios-compose-outline:before { + content: ""; } + +.ion-ios-contact:before { + content: ""; } + +.ion-ios-contact-outline:before { + content: ""; } + +.ion-ios-copy:before { + content: ""; } + +.ion-ios-copy-outline:before { + content: ""; } + +.ion-ios-crop:before { + content: ""; } + +.ion-ios-crop-strong:before { + content: ""; } + +.ion-ios-download:before { + content: ""; } + +.ion-ios-download-outline:before { + content: ""; } + +.ion-ios-drag:before { + content: ""; } + +.ion-ios-email:before { + content: ""; } + +.ion-ios-email-outline:before { + content: ""; } + +.ion-ios-eye:before { + content: ""; } + +.ion-ios-eye-outline:before { + content: ""; } + +.ion-ios-fastforward:before { + content: ""; } + +.ion-ios-fastforward-outline:before { + content: ""; } + +.ion-ios-filing:before { + content: ""; } + +.ion-ios-filing-outline:before { + content: ""; } + +.ion-ios-film:before { + content: ""; } + +.ion-ios-film-outline:before { + content: ""; } + +.ion-ios-flag:before { + content: ""; } + +.ion-ios-flag-outline:before { + content: ""; } + +.ion-ios-flame:before { + content: ""; } + +.ion-ios-flame-outline:before { + content: ""; } + +.ion-ios-flask:before { + content: ""; } + +.ion-ios-flask-outline:before { + content: ""; } + +.ion-ios-flower:before { + content: ""; } + +.ion-ios-flower-outline:before { + content: ""; } + +.ion-ios-folder:before { + content: ""; } + +.ion-ios-folder-outline:before { + content: ""; } + +.ion-ios-football:before { + content: ""; } + +.ion-ios-football-outline:before { + content: ""; } + +.ion-ios-game-controller-a:before { + content: ""; } + +.ion-ios-game-controller-a-outline:before { + content: ""; } + +.ion-ios-game-controller-b:before { + content: ""; } + +.ion-ios-game-controller-b-outline:before { + content: ""; } + +.ion-ios-gear:before { + content: ""; } + +.ion-ios-gear-outline:before { + content: ""; } + +.ion-ios-glasses:before { + content: ""; } + +.ion-ios-glasses-outline:before { + content: ""; } + +.ion-ios-grid-view:before { + content: ""; } + +.ion-ios-grid-view-outline:before { + content: ""; } + +.ion-ios-heart:before { + content: ""; } + +.ion-ios-heart-outline:before { + content: ""; } + +.ion-ios-help:before { + content: ""; } + +.ion-ios-help-empty:before { + content: ""; } + +.ion-ios-help-outline:before { + content: ""; } + +.ion-ios-home:before { + content: ""; } + +.ion-ios-home-outline:before { + content: ""; } + +.ion-ios-infinite:before { + content: ""; } + +.ion-ios-infinite-outline:before { + content: ""; } + +.ion-ios-information:before { + content: ""; } + +.ion-ios-information-empty:before { + content: ""; } + +.ion-ios-information-outline:before { + content: ""; } + +.ion-ios-ionic-outline:before { + content: ""; } + +.ion-ios-keypad:before { + content: ""; } + +.ion-ios-keypad-outline:before { + content: ""; } + +.ion-ios-lightbulb:before { + content: ""; } + +.ion-ios-lightbulb-outline:before { + content: ""; } + +.ion-ios-list:before { + content: ""; } + +.ion-ios-list-outline:before { + content: ""; } + +.ion-ios-location:before { + content: ""; } + +.ion-ios-location-outline:before { + content: ""; } + +.ion-ios-locked:before { + content: ""; } + +.ion-ios-locked-outline:before { + content: ""; } + +.ion-ios-loop:before { + content: ""; } + +.ion-ios-loop-strong:before { + content: ""; } + +.ion-ios-medical:before { + content: ""; } + +.ion-ios-medical-outline:before { + content: ""; } + +.ion-ios-medkit:before { + content: ""; } + +.ion-ios-medkit-outline:before { + content: ""; } + +.ion-ios-mic:before { + content: ""; } + +.ion-ios-mic-off:before { + content: ""; } + +.ion-ios-mic-outline:before { + content: ""; } + +.ion-ios-minus:before { + content: ""; } + +.ion-ios-minus-empty:before { + content: ""; } + +.ion-ios-minus-outline:before { + content: ""; } + +.ion-ios-monitor:before { + content: ""; } + +.ion-ios-monitor-outline:before { + content: ""; } + +.ion-ios-moon:before { + content: ""; } + +.ion-ios-moon-outline:before { + content: ""; } + +.ion-ios-more:before { + content: ""; } + +.ion-ios-more-outline:before { + content: ""; } + +.ion-ios-musical-note:before { + content: ""; } + +.ion-ios-musical-notes:before { + content: ""; } + +.ion-ios-navigate:before { + content: ""; } + +.ion-ios-navigate-outline:before { + content: ""; } + +.ion-ios-nutrition:before { + content: ""; } + +.ion-ios-nutrition-outline:before { + content: ""; } + +.ion-ios-paper:before { + content: ""; } + +.ion-ios-paper-outline:before { + content: ""; } + +.ion-ios-paperplane:before { + content: ""; } + +.ion-ios-paperplane-outline:before { + content: ""; } + +.ion-ios-partlysunny:before { + content: ""; } + +.ion-ios-partlysunny-outline:before { + content: ""; } + +.ion-ios-pause:before { + content: ""; } + +.ion-ios-pause-outline:before { + content: ""; } + +.ion-ios-paw:before { + content: ""; } + +.ion-ios-paw-outline:before { + content: ""; } + +.ion-ios-people:before { + content: ""; } + +.ion-ios-people-outline:before { + content: ""; } + +.ion-ios-person:before { + content: ""; } + +.ion-ios-person-outline:before { + content: ""; } + +.ion-ios-personadd:before { + content: ""; } + +.ion-ios-personadd-outline:before { + content: ""; } + +.ion-ios-photos:before { + content: ""; } + +.ion-ios-photos-outline:before { + content: ""; } + +.ion-ios-pie:before { + content: ""; } + +.ion-ios-pie-outline:before { + content: ""; } + +.ion-ios-pint:before { + content: ""; } + +.ion-ios-pint-outline:before { + content: ""; } + +.ion-ios-play:before { + content: ""; } + +.ion-ios-play-outline:before { + content: ""; } + +.ion-ios-plus:before { + content: ""; } + +.ion-ios-plus-empty:before { + content: ""; } + +.ion-ios-plus-outline:before { + content: ""; } + +.ion-ios-pricetag:before { + content: ""; } + +.ion-ios-pricetag-outline:before { + content: ""; } + +.ion-ios-pricetags:before { + content: ""; } + +.ion-ios-pricetags-outline:before { + content: ""; } + +.ion-ios-printer:before { + content: ""; } + +.ion-ios-printer-outline:before { + content: ""; } + +.ion-ios-pulse:before { + content: ""; } + +.ion-ios-pulse-strong:before { + content: ""; } + +.ion-ios-rainy:before { + content: ""; } + +.ion-ios-rainy-outline:before { + content: ""; } + +.ion-ios-recording:before { + content: ""; } + +.ion-ios-recording-outline:before { + content: ""; } + +.ion-ios-redo:before { + content: ""; } + +.ion-ios-redo-outline:before { + content: ""; } + +.ion-ios-refresh:before { + content: ""; } + +.ion-ios-refresh-empty:before { + content: ""; } + +.ion-ios-refresh-outline:before { + content: ""; } + +.ion-ios-reload:before { + content: ""; } + +.ion-ios-reverse-camera:before { + content: ""; } + +.ion-ios-reverse-camera-outline:before { + content: ""; } + +.ion-ios-rewind:before { + content: ""; } + +.ion-ios-rewind-outline:before { + content: ""; } + +.ion-ios-rose:before { + content: ""; } + +.ion-ios-rose-outline:before { + content: ""; } + +.ion-ios-search:before { + content: ""; } + +.ion-ios-search-strong:before { + content: ""; } + +.ion-ios-settings:before { + content: ""; } + +.ion-ios-settings-strong:before { + content: ""; } + +.ion-ios-shuffle:before { + content: ""; } + +.ion-ios-shuffle-strong:before { + content: ""; } + +.ion-ios-skipbackward:before { + content: ""; } + +.ion-ios-skipbackward-outline:before { + content: ""; } + +.ion-ios-skipforward:before { + content: ""; } + +.ion-ios-skipforward-outline:before { + content: ""; } + +.ion-ios-snowy:before { + content: ""; } + +.ion-ios-speedometer:before { + content: ""; } + +.ion-ios-speedometer-outline:before { + content: ""; } + +.ion-ios-star:before { + content: ""; } + +.ion-ios-star-half:before { + content: ""; } + +.ion-ios-star-outline:before { + content: ""; } + +.ion-ios-stopwatch:before { + content: ""; } + +.ion-ios-stopwatch-outline:before { + content: ""; } + +.ion-ios-sunny:before { + content: ""; } + +.ion-ios-sunny-outline:before { + content: ""; } + +.ion-ios-telephone:before { + content: ""; } + +.ion-ios-telephone-outline:before { + content: ""; } + +.ion-ios-tennisball:before { + content: ""; } + +.ion-ios-tennisball-outline:before { + content: ""; } + +.ion-ios-thunderstorm:before { + content: ""; } + +.ion-ios-thunderstorm-outline:before { + content: ""; } + +.ion-ios-time:before { + content: ""; } + +.ion-ios-time-outline:before { + content: ""; } + +.ion-ios-timer:before { + content: ""; } + +.ion-ios-timer-outline:before { + content: ""; } + +.ion-ios-toggle:before { + content: ""; } + +.ion-ios-toggle-outline:before { + content: ""; } + +.ion-ios-trash:before { + content: ""; } + +.ion-ios-trash-outline:before { + content: ""; } + +.ion-ios-undo:before { + content: ""; } + +.ion-ios-undo-outline:before { + content: ""; } + +.ion-ios-unlocked:before { + content: ""; } + +.ion-ios-unlocked-outline:before { + content: ""; } + +.ion-ios-upload:before { + content: ""; } + +.ion-ios-upload-outline:before { + content: ""; } + +.ion-ios-videocam:before { + content: ""; } + +.ion-ios-videocam-outline:before { + content: ""; } + +.ion-ios-volume-high:before { + content: ""; } + +.ion-ios-volume-low:before { + content: ""; } + +.ion-ios-wineglass:before { + content: ""; } + +.ion-ios-wineglass-outline:before { + content: ""; } + +.ion-ios-world:before { + content: ""; } + +.ion-ios-world-outline:before { + content: ""; } + +.ion-ipad:before { + content: ""; } + +.ion-iphone:before { + content: ""; } + +.ion-ipod:before { + content: ""; } + +.ion-jet:before { + content: ""; } + +.ion-key:before { + content: ""; } + +.ion-knife:before { + content: ""; } + +.ion-laptop:before { + content: ""; } + +.ion-leaf:before { + content: ""; } + +.ion-levels:before { + content: ""; } + +.ion-lightbulb:before { + content: ""; } + +.ion-link:before { + content: ""; } + +.ion-load-a:before { + content: ""; } + +.ion-load-b:before { + content: ""; } + +.ion-load-c:before { + content: ""; } + +.ion-load-d:before { + content: ""; } + +.ion-location:before { + content: ""; } + +.ion-lock-combination:before { + content: ""; } + +.ion-locked:before { + content: ""; } + +.ion-log-in:before { + content: ""; } + +.ion-log-out:before { + content: ""; } + +.ion-loop:before { + content: ""; } + +.ion-magnet:before { + content: ""; } + +.ion-male:before { + content: ""; } + +.ion-man:before { + content: ""; } + +.ion-map:before { + content: ""; } + +.ion-medkit:before { + content: ""; } + +.ion-merge:before { + content: ""; } + +.ion-mic-a:before { + content: ""; } + +.ion-mic-b:before { + content: ""; } + +.ion-mic-c:before { + content: ""; } + +.ion-minus:before { + content: ""; } + +.ion-minus-circled:before { + content: ""; } + +.ion-minus-round:before { + content: ""; } + +.ion-model-s:before { + content: ""; } + +.ion-monitor:before { + content: ""; } + +.ion-more:before { + content: ""; } + +.ion-mouse:before { + content: ""; } + +.ion-music-note:before { + content: ""; } + +.ion-navicon:before { + content: ""; } + +.ion-navicon-round:before { + content: ""; } + +.ion-navigate:before { + content: ""; } + +.ion-network:before { + content: ""; } + +.ion-no-smoking:before { + content: ""; } + +.ion-nuclear:before { + content: ""; } + +.ion-outlet:before { + content: ""; } + +.ion-paintbrush:before { + content: ""; } + +.ion-paintbucket:before { + content: ""; } + +.ion-paper-airplane:before { + content: ""; } + +.ion-paperclip:before { + content: ""; } + +.ion-pause:before { + content: ""; } + +.ion-person:before { + content: ""; } + +.ion-person-add:before { + content: ""; } + +.ion-person-stalker:before { + content: ""; } + +.ion-pie-graph:before { + content: ""; } + +.ion-pin:before { + content: ""; } + +.ion-pinpoint:before { + content: ""; } + +.ion-pizza:before { + content: ""; } + +.ion-plane:before { + content: ""; } + +.ion-planet:before { + content: ""; } + +.ion-play:before { + content: ""; } + +.ion-playstation:before { + content: ""; } + +.ion-plus:before { + content: ""; } + +.ion-plus-circled:before { + content: ""; } + +.ion-plus-round:before { + content: ""; } + +.ion-podium:before { + content: ""; } + +.ion-pound:before { + content: ""; } + +.ion-power:before { + content: ""; } + +.ion-pricetag:before { + content: ""; } + +.ion-pricetags:before { + content: ""; } + +.ion-printer:before { + content: ""; } + +.ion-pull-request:before { + content: ""; } + +.ion-qr-scanner:before { + content: ""; } + +.ion-quote:before { + content: ""; } + +.ion-radio-waves:before { + content: ""; } + +.ion-record:before { + content: ""; } + +.ion-refresh:before { + content: ""; } + +.ion-reply:before { + content: ""; } + +.ion-reply-all:before { + content: ""; } + +.ion-ribbon-a:before { + content: ""; } + +.ion-ribbon-b:before { + content: ""; } + +.ion-sad:before { + content: ""; } + +.ion-sad-outline:before { + content: ""; } + +.ion-scissors:before { + content: ""; } + +.ion-search:before { + content: ""; } + +.ion-settings:before { + content: ""; } + +.ion-share:before { + content: ""; } + +.ion-shuffle:before { + content: ""; } + +.ion-skip-backward:before { + content: ""; } + +.ion-skip-forward:before { + content: ""; } + +.ion-social-android:before { + content: ""; } + +.ion-social-android-outline:before { + content: ""; } + +.ion-social-angular:before { + content: ""; } + +.ion-social-angular-outline:before { + content: ""; } + +.ion-social-apple:before { + content: ""; } + +.ion-social-apple-outline:before { + content: ""; } + +.ion-social-bitcoin:before { + content: ""; } + +.ion-social-bitcoin-outline:before { + content: ""; } + +.ion-social-buffer:before { + content: ""; } + +.ion-social-buffer-outline:before { + content: ""; } + +.ion-social-chrome:before { + content: ""; } + +.ion-social-chrome-outline:before { + content: ""; } + +.ion-social-codepen:before { + content: ""; } + +.ion-social-codepen-outline:before { + content: ""; } + +.ion-social-css3:before { + content: ""; } + +.ion-social-css3-outline:before { + content: ""; } + +.ion-social-designernews:before { + content: ""; } + +.ion-social-designernews-outline:before { + content: ""; } + +.ion-social-dribbble:before { + content: ""; } + +.ion-social-dribbble-outline:before { + content: ""; } + +.ion-social-dropbox:before { + content: ""; } + +.ion-social-dropbox-outline:before { + content: ""; } + +.ion-social-euro:before { + content: ""; } + +.ion-social-euro-outline:before { + content: ""; } + +.ion-social-facebook:before { + content: ""; } + +.ion-social-facebook-outline:before { + content: ""; } + +.ion-social-foursquare:before { + content: ""; } + +.ion-social-foursquare-outline:before { + content: ""; } + +.ion-social-freebsd-devil:before { + content: ""; } + +.ion-social-github:before { + content: ""; } + +.ion-social-github-outline:before { + content: ""; } + +.ion-social-google:before { + content: ""; } + +.ion-social-google-outline:before { + content: ""; } + +.ion-social-googleplus:before { + content: ""; } + +.ion-social-googleplus-outline:before { + content: ""; } + +.ion-social-hackernews:before { + content: ""; } + +.ion-social-hackernews-outline:before { + content: ""; } + +.ion-social-html5:before { + content: ""; } + +.ion-social-html5-outline:before { + content: ""; } + +.ion-social-instagram:before { + content: ""; } + +.ion-social-instagram-outline:before { + content: ""; } + +.ion-social-javascript:before { + content: ""; } + +.ion-social-javascript-outline:before { + content: ""; } + +.ion-social-linkedin:before { + content: ""; } + +.ion-social-linkedin-outline:before { + content: ""; } + +.ion-social-markdown:before { + content: ""; } + +.ion-social-nodejs:before { + content: ""; } + +.ion-social-octocat:before { + content: ""; } + +.ion-social-pinterest:before { + content: ""; } + +.ion-social-pinterest-outline:before { + content: ""; } + +.ion-social-python:before { + content: ""; } + +.ion-social-reddit:before { + content: ""; } + +.ion-social-reddit-outline:before { + content: ""; } + +.ion-social-rss:before { + content: ""; } + +.ion-social-rss-outline:before { + content: ""; } + +.ion-social-sass:before { + content: ""; } + +.ion-social-skype:before { + content: ""; } + +.ion-social-skype-outline:before { + content: ""; } + +.ion-social-snapchat:before { + content: ""; } + +.ion-social-snapchat-outline:before { + content: ""; } + +.ion-social-tumblr:before { + content: ""; } + +.ion-social-tumblr-outline:before { + content: ""; } + +.ion-social-tux:before { + content: ""; } + +.ion-social-twitch:before { + content: ""; } + +.ion-social-twitch-outline:before { + content: ""; } + +.ion-social-twitter:before { + content: ""; } + +.ion-social-twitter-outline:before { + content: ""; } + +.ion-social-usd:before { + content: ""; } + +.ion-social-usd-outline:before { + content: ""; } + +.ion-social-vimeo:before { + content: ""; } + +.ion-social-vimeo-outline:before { + content: ""; } + +.ion-social-whatsapp:before { + content: ""; } + +.ion-social-whatsapp-outline:before { + content: ""; } + +.ion-social-windows:before { + content: ""; } + +.ion-social-windows-outline:before { + content: ""; } + +.ion-social-wordpress:before { + content: ""; } + +.ion-social-wordpress-outline:before { + content: ""; } + +.ion-social-yahoo:before { + content: ""; } + +.ion-social-yahoo-outline:before { + content: ""; } + +.ion-social-yen:before { + content: ""; } + +.ion-social-yen-outline:before { + content: ""; } + +.ion-social-youtube:before { + content: ""; } + +.ion-social-youtube-outline:before { + content: ""; } + +.ion-soup-can:before { + content: ""; } + +.ion-soup-can-outline:before { + content: ""; } + +.ion-speakerphone:before { + content: ""; } + +.ion-speedometer:before { + content: ""; } + +.ion-spoon:before { + content: ""; } + +.ion-star:before { + content: ""; } + +.ion-stats-bars:before { + content: ""; } + +.ion-steam:before { + content: ""; } + +.ion-stop:before { + content: ""; } + +.ion-thermometer:before { + content: ""; } + +.ion-thumbsdown:before { + content: ""; } + +.ion-thumbsup:before { + content: ""; } + +.ion-toggle:before { + content: ""; } + +.ion-toggle-filled:before { + content: ""; } + +.ion-transgender:before { + content: ""; } + +.ion-trash-a:before { + content: ""; } + +.ion-trash-b:before { + content: ""; } + +.ion-trophy:before { + content: ""; } + +.ion-tshirt:before { + content: ""; } + +.ion-tshirt-outline:before { + content: ""; } + +.ion-umbrella:before { + content: ""; } + +.ion-university:before { + content: ""; } + +.ion-unlocked:before { + content: ""; } + +.ion-upload:before { + content: ""; } + +.ion-usb:before { + content: ""; } + +.ion-videocamera:before { + content: ""; } + +.ion-volume-high:before { + content: ""; } + +.ion-volume-low:before { + content: ""; } + +.ion-volume-medium:before { + content: ""; } + +.ion-volume-mute:before { + content: ""; } + +.ion-wand:before { + content: ""; } + +.ion-waterdrop:before { + content: ""; } + +.ion-wifi:before { + content: ""; } + +.ion-wineglass:before { + content: ""; } + +.ion-woman:before { + content: ""; } + +.ion-wrench:before { + content: ""; } + +.ion-xbox:before { + content: ""; } + +/** + * Resets + * -------------------------------------------------- + * Adapted from normalize.css and some reset.css. We don't care even one + * bit about old IE, so we don't need any hacks for that in here. + * + * There are probably other things we could remove here, as well. + * + * normalize.css v2.1.2 | MIT License | git.io/normalize + + * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/) + * http://cssreset.com + */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, i, u, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, fieldset, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; + font: inherit; + font-size: 100%; } + +ol, ul { + list-style: none; } + +blockquote, q { + quotes: none; } + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; } + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ +audio:not([controls]) { + display: none; + height: 0; } + +/** + * Hide the `template` element in IE, Safari, and Firefox < 22. + */ +[hidden], +template { + display: none; } + +script { + display: none !important; } + +/* ========================================================================== + Base + ========================================================================== */ +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ +html { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + font-family: sans-serif; + /* 1 */ + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ } + +/** + * Remove default margin. + */ +body { + margin: 0; + line-height: 1; } + +/** + * Remove default outlines. + */ +a, +button, +:focus, +a:focus, +button:focus, +a:active, +a:hover { + outline: 0; } + +/* * + * Remove tap highlight color + */ +a { + -webkit-user-drag: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; } + a[href]:hover { + cursor: pointer; } + +/* ========================================================================== + Typography + ========================================================================== */ +/** + * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ +b, +strong { + font-weight: bold; } + +/** + * Address styling not present in Safari 5 and Chrome. + */ +dfn { + font-style: italic; } + +/** + * Address differences between Firefox and other browsers. + */ +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; } + +/** + * Correct font family set oddly in Safari 5 and Chrome. + */ +code, +kbd, +pre, +samp { + font-size: 1em; + font-family: monospace, serif; } + +/** + * Improve readability of pre-formatted text in all browsers. + */ +pre { + white-space: pre-wrap; } + +/** + * Set consistent quote types. + */ +q { + quotes: "\201C" "\201D" "\2018" "\2019"; } + +/** + * Address inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; } + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + position: relative; + vertical-align: baseline; + font-size: 75%; + line-height: 0; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +/** + * Define consistent border, margin, and padding. + */ +fieldset { + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; + border: 1px solid #c0c0c0; } + +/** + * 1. Correct `color` not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ +legend { + padding: 0; + /* 2 */ + border: 0; + /* 1 */ } + +/** + * 1. Correct font family not being inherited in all browsers. + * 2. Correct font size not being inherited in all browsers. + * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + * 4. Remove any default :focus styles + * 5. Make sure webkit font smoothing is being inherited + * 6. Remove default gradient in Android Firefox / FirefoxOS + */ +button, +input, +select, +textarea { + margin: 0; + /* 3 */ + font-size: 100%; + /* 2 */ + font-family: inherit; + /* 1 */ + outline-offset: 0; + /* 4 */ + outline-style: none; + /* 4 */ + outline-width: 0; + /* 4 */ + -webkit-font-smoothing: inherit; + /* 5 */ + background-image: none; + /* 6 */ } + +/** + * Address Firefox 4+ setting `line-height` on `input` using `importnt` in + * the UA stylesheet. + */ +button, +input { + line-height: normal; } + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ +button, +select { + text-transform: none; } + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + /* 3 */ + -webkit-appearance: button; + /* 2 */ } + +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] { + cursor: default; } + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ +input[type="search"] { + -webkit-box-sizing: content-box; + /* 2 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; + /* 1 */ } + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +/** + * Remove inner padding and border in Firefox 4+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; } + +/** + * 1. Remove default vertical scrollbar in IE 8/9. + * 2. Improve readability and alignment in all browsers. + */ +textarea { + overflow: auto; + /* 1 */ + vertical-align: top; + /* 2 */ } + +img { + -webkit-user-drag: none; } + +/* ========================================================================== + Tables + ========================================================================== */ +/** + * Remove most spacing between table cells. + */ +table { + border-spacing: 0; + border-collapse: collapse; } + +/** + * Scaffolding + * -------------------------------------------------- + */ +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +html { + overflow: hidden; + -ms-touch-action: pan-y; + touch-action: pan-y; } + +body, +.ionic-body { + -webkit-touch-callout: none; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + text-size-adjust: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + margin: 0; + padding: 0; + color: #000; + word-wrap: break-word; + font-size: 14px; + font-family: -apple-system; + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; + line-height: 20px; + text-rendering: optimizeLegibility; + -webkit-backface-visibility: hidden; + -webkit-user-drag: none; + -ms-content-zooming: none; } + +body.grade-b, +body.grade-c { + text-rendering: auto; } + +.content { + position: relative; } + +.scroll-content { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow: hidden; + margin-top: -1px; + padding-top: 1px; + margin-bottom: -1px; + width: auto; + height: auto; } + +.menu .scroll-content.scroll-content-false { + z-index: 11; } + +.scroll-view { + position: relative; + display: block; + overflow: hidden; + margin-top: -1px; } + .scroll-view.overflow-scroll { + position: relative; } + .scroll-view.scroll-x { + overflow-x: scroll; + overflow-y: hidden; } + .scroll-view.scroll-y { + overflow-x: hidden; + overflow-y: scroll; } + .scroll-view.scroll-xy { + overflow-x: scroll; + overflow-y: scroll; } + +/** + * Scroll is the scroll view component available for complex and custom + * scroll view functionality. + */ +.scroll { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + text-size-adjust: none; + -webkit-transform-origin: left top; + transform-origin: left top; } + +/** + * Set ms-viewport to prevent MS "page squish" and allow fluid scrolling + * https://msdn.microsoft.com/en-us/library/ie/hh869615(v=vs.85).aspx + */ +@-ms-viewport { + width: device-width; } + +.scroll-bar { + position: absolute; + z-index: 9999; } + +.ng-animate .scroll-bar { + visibility: hidden; } + +.scroll-bar-h { + right: 2px; + bottom: 3px; + left: 2px; + height: 3px; } + .scroll-bar-h .scroll-bar-indicator { + height: 100%; } + +.scroll-bar-v { + top: 2px; + right: 3px; + bottom: 2px; + width: 3px; } + .scroll-bar-v .scroll-bar-indicator { + width: 100%; } + +.scroll-bar-indicator { + position: absolute; + border-radius: 4px; + background: rgba(0, 0, 0, 0.3); + opacity: 1; + -webkit-transition: opacity 0.3s linear; + transition: opacity 0.3s linear; } + .scroll-bar-indicator.scroll-bar-fade-out { + opacity: 0; } + +.platform-android .scroll-bar-indicator { + border-radius: 0; } + +.grade-b .scroll-bar-indicator, +.grade-c .scroll-bar-indicator { + background: #aaa; } + .grade-b .scroll-bar-indicator.scroll-bar-fade-out, + .grade-c .scroll-bar-indicator.scroll-bar-fade-out { + -webkit-transition: none; + transition: none; } + +ion-infinite-scroll { + height: 60px; + width: 100%; + display: block; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: horizontal; + -webkit-flex-direction: row; + -moz-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; } + ion-infinite-scroll .icon { + color: #666666; + font-size: 30px; + color: #666666; } + ion-infinite-scroll:not(.active) .spinner, + ion-infinite-scroll:not(.active) .icon:before { + display: none; } + +.overflow-scroll { + overflow-x: hidden; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + top: 0; + right: 0; + bottom: 0; + left: 0; + position: absolute; } + .overflow-scroll.pane { + overflow-x: hidden; + overflow-y: scroll; } + .overflow-scroll .scroll { + position: static; + height: 100%; + -webkit-transform: translate3d(0, 0, 0); } + .overflow-scroll.keyboard-up:not(.keyboard-up-confirm) { + overflow: hidden; } + +/* If you change these, change platform.scss as well */ +.has-header { + top: 44px; } + +.no-header { + top: 0; } + +.has-subheader { + top: 88px; } + +.has-tabs-top { + top: 93px; } + +.has-header.has-subheader.has-tabs-top { + top: 137px; } + +.has-footer { + bottom: 44px; } + +.has-subfooter { + bottom: 88px; } + +.has-tabs, +.bar-footer.has-tabs { + bottom: 49px; } + .has-tabs.pane, + .bar-footer.has-tabs.pane { + bottom: 49px; + height: auto; } + +.bar-subfooter.has-tabs { + bottom: 93px; } + +.has-footer.has-tabs { + bottom: 93px; } + +.pane { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-transition-duration: 0; + transition-duration: 0; + z-index: 1; } + +.view { + z-index: 1; } + +.pane, +.view { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #fff; + overflow: hidden; } + +.view-container { + position: absolute; + display: block; + width: 100%; + height: 100%; } + +/** + * Typography + * -------------------------------------------------- + */ +p { + margin: 0 0 10px; } + +small { + font-size: 85%; } + +cite { + font-style: normal; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + color: #000; + font-weight: 500; + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; + line-height: 1.2; } + h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, + .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small { + font-weight: normal; + line-height: 1; } + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; } + h1:first-child, .h1:first-child, + h2:first-child, .h2:first-child, + h3:first-child, .h3:first-child { + margin-top: 0; } + h1 + h1, h1 + .h1, + h1 + h2, h1 + .h2, + h1 + h3, h1 + .h3, .h1 + h1, .h1 + .h1, + .h1 + h2, .h1 + .h2, + .h1 + h3, .h1 + .h3, + h2 + h1, + h2 + .h1, + h2 + h2, + h2 + .h2, + h2 + h3, + h2 + .h3, .h2 + h1, .h2 + .h1, + .h2 + h2, .h2 + .h2, + .h2 + h3, .h2 + .h3, + h3 + h1, + h3 + .h1, + h3 + h2, + h3 + .h2, + h3 + h3, + h3 + .h3, .h3 + h1, .h3 + .h1, + .h3 + h2, .h3 + .h2, + .h3 + h3, .h3 + .h3 { + margin-top: 10px; } + +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; } + +h1, .h1 { + font-size: 36px; } + +h2, .h2 { + font-size: 30px; } + +h3, .h3 { + font-size: 24px; } + +h4, .h4 { + font-size: 18px; } + +h5, .h5 { + font-size: 14px; } + +h6, .h6 { + font-size: 12px; } + +h1 small, .h1 small { + font-size: 24px; } + +h2 small, .h2 small { + font-size: 18px; } + +h3 small, .h3 small, +h4 small, .h4 small { + font-size: 14px; } + +dl { + margin-bottom: 20px; } + +dt, +dd { + line-height: 1.42857; } + +dt { + font-weight: bold; } + +blockquote { + margin: 0 0 20px; + padding: 10px 20px; + border-left: 5px solid gray; } + blockquote p { + font-weight: 300; + font-size: 17.5px; + line-height: 1.25; } + blockquote p:last-child { + margin-bottom: 0; } + blockquote small { + display: block; + line-height: 1.42857; } + blockquote small:before { + content: '\2014 \00A0'; } + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; } + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857; } + +a { + color: #387ef5; } + +a.subdued { + padding-right: 10px; + color: #888; + text-decoration: none; } + a.subdued:hover { + text-decoration: none; } + a.subdued:last-child { + padding-right: 0; } + +/** + * Action Sheets + * -------------------------------------------------- + */ +.action-sheet-backdrop { + -webkit-transition: background-color 150ms ease-in-out; + transition: background-color 150ms ease-in-out; + position: fixed; + top: 0; + left: 0; + z-index: 11; + width: 100%; + height: 100%; + background-color: transparent; } + .action-sheet-backdrop.active { + background-color: rgba(0, 0, 0, 0.4); } + +.action-sheet-wrapper { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + -webkit-transition: all cubic-bezier(0.36, 0.66, 0.04, 1) 500ms; + transition: all cubic-bezier(0.36, 0.66, 0.04, 1) 500ms; + position: absolute; + bottom: 0; + left: 0; + right: 0; + width: 100%; + max-width: 500px; + margin: auto; } + +.action-sheet-up { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.action-sheet { + margin-left: 8px; + margin-right: 8px; + width: auto; + z-index: 11; + overflow: hidden; } + .action-sheet .button { + display: block; + padding: 1px; + width: 100%; + border-radius: 0; + border-color: #d1d3d6; + background-color: transparent; + color: #007aff; + font-size: 21px; } + .action-sheet .button:hover { + color: #007aff; } + .action-sheet .button.destructive { + color: #ff3b30; } + .action-sheet .button.destructive:hover { + color: #ff3b30; } + .action-sheet .button.active, .action-sheet .button.activated { + box-shadow: none; + border-color: #d1d3d6; + color: #007aff; + background: #e4e5e7; } + +.action-sheet-has-icons .icon { + position: absolute; + left: 16px; } + +.action-sheet-title { + padding: 16px; + color: #8f8f8f; + text-align: center; + font-size: 13px; } + +.action-sheet-group { + margin-bottom: 8px; + border-radius: 4px; + background-color: #fff; + overflow: hidden; } + .action-sheet-group .button { + border-width: 1px 0px 0px 0px; } + .action-sheet-group .button:first-child:last-child { + border-width: 0; } + +.action-sheet-options { + background: #f1f2f3; } + +.action-sheet-cancel .button { + font-weight: 500; } + +.action-sheet-open { + pointer-events: none; } + .action-sheet-open.modal-open .modal { + pointer-events: none; } + .action-sheet-open .action-sheet-backdrop { + pointer-events: auto; } + +.platform-android .action-sheet-backdrop.active { + background-color: rgba(0, 0, 0, 0.2); } + +.platform-android .action-sheet { + margin: 0; } + .platform-android .action-sheet .action-sheet-title, + .platform-android .action-sheet .button { + text-align: left; + border-color: transparent; + font-size: 16px; + color: inherit; } + .platform-android .action-sheet .action-sheet-title { + font-size: 14px; + padding: 16px; + color: #666; } + .platform-android .action-sheet .button.active, + .platform-android .action-sheet .button.activated { + background: #e8e8e8; } + +.platform-android .action-sheet-group { + margin: 0; + border-radius: 0; + background-color: #fafafa; } + +.platform-android .action-sheet-cancel { + display: none; } + +.platform-android .action-sheet-has-icons .button { + padding-left: 56px; } + +.backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 11; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.4); + visibility: hidden; + opacity: 0; + -webkit-transition: 0.1s opacity linear; + transition: 0.1s opacity linear; } + .backdrop.visible { + visibility: visible; } + .backdrop.active { + opacity: 1; } + +/** + * Bar (Headers and Footers) + * -------------------------------------------------- + */ +.bar { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + position: absolute; + right: 0; + left: 0; + z-index: 9; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 5px; + width: 100%; + height: 44px; + border-width: 0; + border-style: solid; + border-top: 1px solid transparent; + border-bottom: 1px solid #ddd; + background-color: white; + /* border-width: 1px will actually create 2 device pixels on retina */ + /* this nifty trick sets an actual 1px border on hi-res displays */ + background-size: 0; } + @media (min--moz-device-pixel-ratio: 1.5), (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi), (min-resolution: 1.5dppx) { + .bar { + border: none; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + background-position: bottom; + background-size: 100% 1px; + background-repeat: no-repeat; } } + .bar.bar-clear { + border: none; + background: none; + color: #fff; } + .bar.bar-clear .button { + color: #fff; } + .bar.bar-clear .title { + color: #fff; } + .bar.item-input-inset .item-input-wrapper { + margin-top: -1px; } + .bar.item-input-inset .item-input-wrapper input { + padding-left: 8px; + width: 94%; + height: 28px; + background: transparent; } + .bar.bar-light { + border-color: #ddd; + background-color: white; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + color: #444; } + .bar.bar-light .title { + color: #444; } + .bar.bar-light.bar-footer { + background-image: linear-gradient(180deg, #ddd, #ddd 50%, transparent 50%); } + .bar.bar-stable { + border-color: #b2b2b2; + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + color: #444; } + .bar.bar-stable .title { + color: #444; } + .bar.bar-stable.bar-footer { + background-image: linear-gradient(180deg, #b2b2b2, #b2b2b2 50%, transparent 50%); } + .bar.bar-positive { + border-color: #0c60ee; + background-color: #387ef5; + background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%); + color: #fff; } + .bar.bar-positive .title { + color: #fff; } + .bar.bar-positive.bar-footer { + background-image: linear-gradient(180deg, #0c60ee, #0c60ee 50%, transparent 50%); } + .bar.bar-calm { + border-color: #0a9dc7; + background-color: #11c1f3; + background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%); + color: #fff; } + .bar.bar-calm .title { + color: #fff; } + .bar.bar-calm.bar-footer { + background-image: linear-gradient(180deg, #0a9dc7, #0a9dc7 50%, transparent 50%); } + .bar.bar-assertive { + border-color: #e42112; + background-color: #ef473a; + background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%); + color: #fff; } + .bar.bar-assertive .title { + color: #fff; } + .bar.bar-assertive.bar-footer { + background-image: linear-gradient(180deg, #e42112, #e42112 50%, transparent 50%); } + .bar.bar-balanced { + border-color: #28a54c; + background-color: #33cd5f; + background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%); + color: #fff; } + .bar.bar-balanced .title { + color: #fff; } + .bar.bar-balanced.bar-footer { + background-image: linear-gradient(180deg, #28a54c, #0c60ee 50%, transparent 50%); } + .bar.bar-energized { + border-color: #e6b500; + background-color: #ffc900; + background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%); + color: #fff; } + .bar.bar-energized .title { + color: #fff; } + .bar.bar-energized.bar-footer { + background-image: linear-gradient(180deg, #e6b500, #e6b500 50%, transparent 50%); } + .bar.bar-royal { + border-color: #6b46e5; + background-color: #886aea; + background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%); + color: #fff; } + .bar.bar-royal .title { + color: #fff; } + .bar.bar-royal.bar-footer { + background-image: linear-gradient(180deg, #6b46e5, #6b46e5 50%, transparent 50%); } + .bar.bar-dark { + border-color: #111; + background-color: #444444; + background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%); + color: #fff; } + .bar.bar-dark .title { + color: #fff; } + .bar.bar-dark.bar-footer { + background-image: linear-gradient(180deg, #111, #111 50%, transparent 50%); } + .bar .title { + display: block; + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 0; + overflow: hidden; + margin: 0 10px; + min-width: 30px; + height: 43px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 17px; + font-weight: 500; + line-height: 44px; } + .bar .title.title-left { + text-align: left; } + .bar .title.title-right { + text-align: right; } + .bar .title a { + color: inherit; } + .bar .button, .bar button { + z-index: 1; + padding: 0 8px; + min-width: initial; + min-height: 31px; + font-weight: 400; + font-size: 13px; + line-height: 32px; } + .bar .button.button-icon:before, + .bar .button .icon:before, .bar .button.icon:before, .bar .button.icon-left:before, .bar .button.icon-right:before, .bar button.button-icon:before, + .bar button .icon:before, .bar button.icon:before, .bar button.icon-left:before, .bar button.icon-right:before { + padding-right: 2px; + padding-left: 2px; + font-size: 20px; + line-height: 32px; } + .bar .button.button-icon, .bar button.button-icon { + font-size: 17px; } + .bar .button.button-icon .icon:before, .bar .button.button-icon:before, .bar .button.button-icon.icon-left:before, .bar .button.button-icon.icon-right:before, .bar button.button-icon .icon:before, .bar button.button-icon:before, .bar button.button-icon.icon-left:before, .bar button.button-icon.icon-right:before { + vertical-align: top; + font-size: 32px; + line-height: 32px; } + .bar .button.button-clear, .bar button.button-clear { + padding-right: 2px; + padding-left: 2px; + font-weight: 300; + font-size: 17px; } + .bar .button.button-clear .icon:before, .bar .button.button-clear.icon:before, .bar .button.button-clear.icon-left:before, .bar .button.button-clear.icon-right:before, .bar button.button-clear .icon:before, .bar button.button-clear.icon:before, .bar button.button-clear.icon-left:before, .bar button.button-clear.icon-right:before { + font-size: 32px; + line-height: 32px; } + .bar .button.back-button, .bar button.back-button { + display: block; + margin-right: 5px; + padding: 0; + white-space: nowrap; + font-weight: 400; } + .bar .button.back-button.active, .bar .button.back-button.activated, .bar button.back-button.active, .bar button.back-button.activated { + opacity: 0.2; } + .bar .button-bar > .button, + .bar .buttons > .button { + min-height: 31px; + line-height: 32px; } + .bar .button-bar + .button, + .bar .button + .button-bar { + margin-left: 5px; } + .bar .buttons, + .bar .buttons.primary-buttons, + .bar .buttons.secondary-buttons { + display: inherit; } + .bar .buttons span { + display: inline-block; } + .bar .buttons-left span { + margin-right: 5px; + display: inherit; } + .bar .buttons-right span { + margin-left: 5px; + display: inherit; } + .bar .title + .button:last-child, + .bar > .button + .button:last-child, + .bar > .button.pull-right, + .bar .buttons.pull-right, + .bar .title + .buttons { + position: absolute; + top: 5px; + right: 5px; + bottom: 5px; } + +.platform-android .nav-bar-has-subheader .bar { + background-image: none; } + +.platform-android .bar .back-button .icon:before { + font-size: 24px; } + +.platform-android .bar .title { + font-size: 19px; + line-height: 44px; } + +.bar-light .button { + border-color: transparent; + background-color: white; + color: #444; } + .bar-light .button:hover { + color: #444; + text-decoration: none; } + .bar-light .button.active, .bar-light .button.activated { + background-color: #fafafa; } + .bar-light .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #444; + font-size: 17px; } + .bar-light .button.button-icon { + border-color: transparent; + background: none; } + +.bar-stable .button { + border-color: transparent; + background-color: #f8f8f8; + color: #444; } + .bar-stable .button:hover { + color: #444; + text-decoration: none; } + .bar-stable .button.active, .bar-stable .button.activated { + background-color: #e5e5e5; } + .bar-stable .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #444; + font-size: 17px; } + .bar-stable .button.button-icon { + border-color: transparent; + background: none; } + +.bar-positive .button { + border-color: transparent; + background-color: #387ef5; + color: #fff; } + .bar-positive .button:hover { + color: #fff; + text-decoration: none; } + .bar-positive .button.active, .bar-positive .button.activated { + background-color: #0c60ee; } + .bar-positive .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-positive .button.button-icon { + border-color: transparent; + background: none; } + +.bar-calm .button { + border-color: transparent; + background-color: #11c1f3; + color: #fff; } + .bar-calm .button:hover { + color: #fff; + text-decoration: none; } + .bar-calm .button.active, .bar-calm .button.activated { + background-color: #0a9dc7; } + .bar-calm .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-calm .button.button-icon { + border-color: transparent; + background: none; } + +.bar-assertive .button { + border-color: transparent; + background-color: #ef473a; + color: #fff; } + .bar-assertive .button:hover { + color: #fff; + text-decoration: none; } + .bar-assertive .button.active, .bar-assertive .button.activated { + background-color: #e42112; } + .bar-assertive .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-assertive .button.button-icon { + border-color: transparent; + background: none; } + +.bar-balanced .button { + border-color: transparent; + background-color: #33cd5f; + color: #fff; } + .bar-balanced .button:hover { + color: #fff; + text-decoration: none; } + .bar-balanced .button.active, .bar-balanced .button.activated { + background-color: #28a54c; } + .bar-balanced .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-balanced .button.button-icon { + border-color: transparent; + background: none; } + +.bar-energized .button { + border-color: transparent; + background-color: #ffc900; + color: #fff; } + .bar-energized .button:hover { + color: #fff; + text-decoration: none; } + .bar-energized .button.active, .bar-energized .button.activated { + background-color: #e6b500; } + .bar-energized .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-energized .button.button-icon { + border-color: transparent; + background: none; } + +.bar-royal .button { + border-color: transparent; + background-color: #886aea; + color: #fff; } + .bar-royal .button:hover { + color: #fff; + text-decoration: none; } + .bar-royal .button.active, .bar-royal .button.activated { + background-color: #6b46e5; } + .bar-royal .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-royal .button.button-icon { + border-color: transparent; + background: none; } + +.bar-dark .button { + border-color: transparent; + background-color: #444444; + color: #fff; } + .bar-dark .button:hover { + color: #fff; + text-decoration: none; } + .bar-dark .button.active, .bar-dark .button.activated { + background-color: #262626; } + .bar-dark .button.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #fff; + font-size: 17px; } + .bar-dark .button.button-icon { + border-color: transparent; + background: none; } + +.bar-header { + top: 0; + border-top-width: 0; + border-bottom-width: 1px; } + .bar-header.has-tabs-top { + border-bottom-width: 0px; + background-image: none; } + +.tabs-top .bar-header { + border-bottom-width: 0px; + background-image: none; } + +.bar-footer { + bottom: 0; + border-top-width: 1px; + border-bottom-width: 0; + background-position: top; + height: 44px; } + .bar-footer.item-input-inset { + position: absolute; } + +.bar-tabs { + padding: 0; } + +.bar-subheader { + top: 44px; + display: block; + height: 44px; } + +.bar-subfooter { + bottom: 44px; + display: block; + height: 44px; } + +.nav-bar-block { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 9; } + +.bar .back-button.hide, +.bar .buttons .hide { + display: none; } + +.nav-bar-tabs-top .bar { + background-image: none; } + +/** + * Tabs + * -------------------------------------------------- + * A navigation bar with any number of tab items supported. + */ +.tabs { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: horizontal; + -webkit-flex-direction: horizontal; + -moz-flex-direction: horizontal; + -ms-flex-direction: horizontal; + flex-direction: horizontal; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + border-color: #b2b2b2; + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + color: #444; + position: absolute; + bottom: 0; + z-index: 5; + width: 100%; + height: 49px; + border-style: solid; + border-top-width: 1px; + background-size: 0; + line-height: 49px; } + .tabs .tab-item .badge { + background-color: #444; + color: #f8f8f8; } + @media (min--moz-device-pixel-ratio: 1.5), (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi), (min-resolution: 1.5dppx) { + .tabs { + padding-top: 2px; + border-top: none !important; + border-bottom: none; + background-position: top; + background-size: 100% 1px; + background-repeat: no-repeat; } } + +/* Allow parent element of tabs to define color, or just the tab itself */ +.tabs-light > .tabs, +.tabs.tabs-light { + border-color: #ddd; + background-color: #fff; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + color: #444; } + .tabs-light > .tabs .tab-item .badge, + .tabs.tabs-light .tab-item .badge { + background-color: #444; + color: #fff; } + +.tabs-stable > .tabs, +.tabs.tabs-stable { + border-color: #b2b2b2; + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + color: #444; } + .tabs-stable > .tabs .tab-item .badge, + .tabs.tabs-stable .tab-item .badge { + background-color: #444; + color: #f8f8f8; } + +.tabs-positive > .tabs, +.tabs.tabs-positive { + border-color: #0c60ee; + background-color: #387ef5; + background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%); + color: #fff; } + .tabs-positive > .tabs .tab-item .badge, + .tabs.tabs-positive .tab-item .badge { + background-color: #fff; + color: #387ef5; } + +.tabs-calm > .tabs, +.tabs.tabs-calm { + border-color: #0a9dc7; + background-color: #11c1f3; + background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%); + color: #fff; } + .tabs-calm > .tabs .tab-item .badge, + .tabs.tabs-calm .tab-item .badge { + background-color: #fff; + color: #11c1f3; } + +.tabs-assertive > .tabs, +.tabs.tabs-assertive { + border-color: #e42112; + background-color: #ef473a; + background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%); + color: #fff; } + .tabs-assertive > .tabs .tab-item .badge, + .tabs.tabs-assertive .tab-item .badge { + background-color: #fff; + color: #ef473a; } + +.tabs-balanced > .tabs, +.tabs.tabs-balanced { + border-color: #28a54c; + background-color: #33cd5f; + background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%); + color: #fff; } + .tabs-balanced > .tabs .tab-item .badge, + .tabs.tabs-balanced .tab-item .badge { + background-color: #fff; + color: #33cd5f; } + +.tabs-energized > .tabs, +.tabs.tabs-energized { + border-color: #e6b500; + background-color: #ffc900; + background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%); + color: #fff; } + .tabs-energized > .tabs .tab-item .badge, + .tabs.tabs-energized .tab-item .badge { + background-color: #fff; + color: #ffc900; } + +.tabs-royal > .tabs, +.tabs.tabs-royal { + border-color: #6b46e5; + background-color: #886aea; + background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%); + color: #fff; } + .tabs-royal > .tabs .tab-item .badge, + .tabs.tabs-royal .tab-item .badge { + background-color: #fff; + color: #886aea; } + +.tabs-dark > .tabs, +.tabs.tabs-dark { + border-color: #111; + background-color: #444; + background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%); + color: #fff; } + .tabs-dark > .tabs .tab-item .badge, + .tabs.tabs-dark .tab-item .badge { + background-color: #fff; + color: #444; } + +.tabs-striped .tabs { + background-color: white; + background-image: none; + border: none; + border-bottom: 1px solid #ddd; + padding-top: 2px; } + +.tabs-striped .tab-item.tab-item-active, .tabs-striped .tab-item.active, .tabs-striped .tab-item.activated { + margin-top: -2px; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #444; } + .tabs-striped .tab-item.tab-item-active .badge, .tabs-striped .tab-item.active .badge, .tabs-striped .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-light .tabs { + background-color: #fff; } + +.tabs-striped.tabs-light .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-striped.tabs-light .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-light .tab-item.tab-item-active, .tabs-striped.tabs-light .tab-item.active, .tabs-striped.tabs-light .tab-item.activated { + margin-top: -2px; + color: #444; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #444; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-stable .tabs { + background-color: #f8f8f8; } + +.tabs-striped.tabs-stable .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-striped.tabs-stable .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-stable .tab-item.tab-item-active, .tabs-striped.tabs-stable .tab-item.active, .tabs-striped.tabs-stable .tab-item.activated { + margin-top: -2px; + color: #444; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #444; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-positive .tabs { + background-color: #387ef5; } + +.tabs-striped.tabs-positive .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-positive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-positive .tab-item.tab-item-active, .tabs-striped.tabs-positive .tab-item.active, .tabs-striped.tabs-positive .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-calm .tabs { + background-color: #11c1f3; } + +.tabs-striped.tabs-calm .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-calm .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-calm .tab-item.tab-item-active, .tabs-striped.tabs-calm .tab-item.active, .tabs-striped.tabs-calm .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-assertive .tabs { + background-color: #ef473a; } + +.tabs-striped.tabs-assertive .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-assertive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-assertive .tab-item.tab-item-active, .tabs-striped.tabs-assertive .tab-item.active, .tabs-striped.tabs-assertive .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-balanced .tabs { + background-color: #33cd5f; } + +.tabs-striped.tabs-balanced .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-balanced .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-balanced .tab-item.tab-item-active, .tabs-striped.tabs-balanced .tab-item.active, .tabs-striped.tabs-balanced .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-energized .tabs { + background-color: #ffc900; } + +.tabs-striped.tabs-energized .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-energized .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-energized .tab-item.tab-item-active, .tabs-striped.tabs-energized .tab-item.active, .tabs-striped.tabs-energized .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-royal .tabs { + background-color: #886aea; } + +.tabs-striped.tabs-royal .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-royal .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-royal .tab-item.tab-item-active, .tabs-striped.tabs-royal .tab-item.active, .tabs-striped.tabs-royal .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-dark .tabs { + background-color: #444; } + +.tabs-striped.tabs-dark .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-dark .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-dark .tab-item.tab-item-active, .tabs-striped.tabs-dark .tab-item.active, .tabs-striped.tabs-dark .tab-item.activated { + margin-top: -2px; + color: #fff; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #fff; } + +.tabs-striped.tabs-top .tab-item.tab-item-active .badge, .tabs-striped.tabs-top .tab-item.active .badge, .tabs-striped.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-striped.tabs-background-light .tabs { + background-color: #fff; + background-image: none; } + +.tabs-striped.tabs-background-stable .tabs { + background-color: #f8f8f8; + background-image: none; } + +.tabs-striped.tabs-background-positive .tabs { + background-color: #387ef5; + background-image: none; } + +.tabs-striped.tabs-background-calm .tabs { + background-color: #11c1f3; + background-image: none; } + +.tabs-striped.tabs-background-assertive .tabs { + background-color: #ef473a; + background-image: none; } + +.tabs-striped.tabs-background-balanced .tabs { + background-color: #33cd5f; + background-image: none; } + +.tabs-striped.tabs-background-energized .tabs { + background-color: #ffc900; + background-image: none; } + +.tabs-striped.tabs-background-royal .tabs { + background-color: #886aea; + background-image: none; } + +.tabs-striped.tabs-background-dark .tabs { + background-color: #444; + background-image: none; } + +.tabs-striped.tabs-color-light .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-light .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-light .tab-item.tab-item-active, .tabs-striped.tabs-color-light .tab-item.active, .tabs-striped.tabs-color-light .tab-item.activated { + margin-top: -2px; + color: #fff; + border: 0 solid #fff; + border-top-width: 2px; } + .tabs-striped.tabs-color-light .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-light .tab-item.active .badge, .tabs-striped.tabs-color-light .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-stable .tab-item { + color: rgba(248, 248, 248, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-stable .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-stable .tab-item.tab-item-active, .tabs-striped.tabs-color-stable .tab-item.active, .tabs-striped.tabs-color-stable .tab-item.activated { + margin-top: -2px; + color: #f8f8f8; + border: 0 solid #f8f8f8; + border-top-width: 2px; } + .tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-stable .tab-item.active .badge, .tabs-striped.tabs-color-stable .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-positive .tab-item { + color: rgba(56, 126, 245, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-positive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-positive .tab-item.tab-item-active, .tabs-striped.tabs-color-positive .tab-item.active, .tabs-striped.tabs-color-positive .tab-item.activated { + margin-top: -2px; + color: #387ef5; + border: 0 solid #387ef5; + border-top-width: 2px; } + .tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-positive .tab-item.active .badge, .tabs-striped.tabs-color-positive .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-calm .tab-item { + color: rgba(17, 193, 243, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-calm .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-calm .tab-item.tab-item-active, .tabs-striped.tabs-color-calm .tab-item.active, .tabs-striped.tabs-color-calm .tab-item.activated { + margin-top: -2px; + color: #11c1f3; + border: 0 solid #11c1f3; + border-top-width: 2px; } + .tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-calm .tab-item.active .badge, .tabs-striped.tabs-color-calm .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-assertive .tab-item { + color: rgba(239, 71, 58, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-assertive .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-assertive .tab-item.tab-item-active, .tabs-striped.tabs-color-assertive .tab-item.active, .tabs-striped.tabs-color-assertive .tab-item.activated { + margin-top: -2px; + color: #ef473a; + border: 0 solid #ef473a; + border-top-width: 2px; } + .tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-assertive .tab-item.active .badge, .tabs-striped.tabs-color-assertive .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-balanced .tab-item { + color: rgba(51, 205, 95, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-balanced .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-balanced .tab-item.tab-item-active, .tabs-striped.tabs-color-balanced .tab-item.active, .tabs-striped.tabs-color-balanced .tab-item.activated { + margin-top: -2px; + color: #33cd5f; + border: 0 solid #33cd5f; + border-top-width: 2px; } + .tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-balanced .tab-item.active .badge, .tabs-striped.tabs-color-balanced .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-energized .tab-item { + color: rgba(255, 201, 0, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-energized .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-energized .tab-item.tab-item-active, .tabs-striped.tabs-color-energized .tab-item.active, .tabs-striped.tabs-color-energized .tab-item.activated { + margin-top: -2px; + color: #ffc900; + border: 0 solid #ffc900; + border-top-width: 2px; } + .tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-energized .tab-item.active .badge, .tabs-striped.tabs-color-energized .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-royal .tab-item { + color: rgba(136, 106, 234, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-royal .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-royal .tab-item.tab-item-active, .tabs-striped.tabs-color-royal .tab-item.active, .tabs-striped.tabs-color-royal .tab-item.activated { + margin-top: -2px; + color: #886aea; + border: 0 solid #886aea; + border-top-width: 2px; } + .tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-royal .tab-item.active .badge, .tabs-striped.tabs-color-royal .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-striped.tabs-color-dark .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-striped.tabs-color-dark .tab-item .badge { + opacity: 0.4; } + .tabs-striped.tabs-color-dark .tab-item.tab-item-active, .tabs-striped.tabs-color-dark .tab-item.active, .tabs-striped.tabs-color-dark .tab-item.activated { + margin-top: -2px; + color: #444; + border: 0 solid #444; + border-top-width: 2px; } + .tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge, .tabs-striped.tabs-color-dark .tab-item.active .badge, .tabs-striped.tabs-color-dark .tab-item.activated .badge { + top: 2px; + opacity: 1; } + +.tabs-background-light .tabs, +.tabs-background-light > .tabs { + background-color: #fff; + background-image: linear-gradient(0deg, #ddd, #ddd 50%, transparent 50%); + border-color: #ddd; } + +.tabs-background-stable .tabs, +.tabs-background-stable > .tabs { + background-color: #f8f8f8; + background-image: linear-gradient(0deg, #b2b2b2, #b2b2b2 50%, transparent 50%); + border-color: #b2b2b2; } + +.tabs-background-positive .tabs, +.tabs-background-positive > .tabs { + background-color: #387ef5; + background-image: linear-gradient(0deg, #0c60ee, #0c60ee 50%, transparent 50%); + border-color: #0c60ee; } + +.tabs-background-calm .tabs, +.tabs-background-calm > .tabs { + background-color: #11c1f3; + background-image: linear-gradient(0deg, #0a9dc7, #0a9dc7 50%, transparent 50%); + border-color: #0a9dc7; } + +.tabs-background-assertive .tabs, +.tabs-background-assertive > .tabs { + background-color: #ef473a; + background-image: linear-gradient(0deg, #e42112, #e42112 50%, transparent 50%); + border-color: #e42112; } + +.tabs-background-balanced .tabs, +.tabs-background-balanced > .tabs { + background-color: #33cd5f; + background-image: linear-gradient(0deg, #28a54c, #28a54c 50%, transparent 50%); + border-color: #28a54c; } + +.tabs-background-energized .tabs, +.tabs-background-energized > .tabs { + background-color: #ffc900; + background-image: linear-gradient(0deg, #e6b500, #e6b500 50%, transparent 50%); + border-color: #e6b500; } + +.tabs-background-royal .tabs, +.tabs-background-royal > .tabs { + background-color: #886aea; + background-image: linear-gradient(0deg, #6b46e5, #6b46e5 50%, transparent 50%); + border-color: #6b46e5; } + +.tabs-background-dark .tabs, +.tabs-background-dark > .tabs { + background-color: #444; + background-image: linear-gradient(0deg, #111, #111 50%, transparent 50%); + border-color: #111; } + +.tabs-color-light .tab-item { + color: rgba(255, 255, 255, 0.4); + opacity: 1; } + .tabs-color-light .tab-item .badge { + opacity: 0.4; } + .tabs-color-light .tab-item.tab-item-active, .tabs-color-light .tab-item.active, .tabs-color-light .tab-item.activated { + color: #fff; + border: 0 solid #fff; } + .tabs-color-light .tab-item.tab-item-active .badge, .tabs-color-light .tab-item.active .badge, .tabs-color-light .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-stable .tab-item { + color: rgba(248, 248, 248, 0.4); + opacity: 1; } + .tabs-color-stable .tab-item .badge { + opacity: 0.4; } + .tabs-color-stable .tab-item.tab-item-active, .tabs-color-stable .tab-item.active, .tabs-color-stable .tab-item.activated { + color: #f8f8f8; + border: 0 solid #f8f8f8; } + .tabs-color-stable .tab-item.tab-item-active .badge, .tabs-color-stable .tab-item.active .badge, .tabs-color-stable .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-positive .tab-item { + color: rgba(56, 126, 245, 0.4); + opacity: 1; } + .tabs-color-positive .tab-item .badge { + opacity: 0.4; } + .tabs-color-positive .tab-item.tab-item-active, .tabs-color-positive .tab-item.active, .tabs-color-positive .tab-item.activated { + color: #387ef5; + border: 0 solid #387ef5; } + .tabs-color-positive .tab-item.tab-item-active .badge, .tabs-color-positive .tab-item.active .badge, .tabs-color-positive .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-calm .tab-item { + color: rgba(17, 193, 243, 0.4); + opacity: 1; } + .tabs-color-calm .tab-item .badge { + opacity: 0.4; } + .tabs-color-calm .tab-item.tab-item-active, .tabs-color-calm .tab-item.active, .tabs-color-calm .tab-item.activated { + color: #11c1f3; + border: 0 solid #11c1f3; } + .tabs-color-calm .tab-item.tab-item-active .badge, .tabs-color-calm .tab-item.active .badge, .tabs-color-calm .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-assertive .tab-item { + color: rgba(239, 71, 58, 0.4); + opacity: 1; } + .tabs-color-assertive .tab-item .badge { + opacity: 0.4; } + .tabs-color-assertive .tab-item.tab-item-active, .tabs-color-assertive .tab-item.active, .tabs-color-assertive .tab-item.activated { + color: #ef473a; + border: 0 solid #ef473a; } + .tabs-color-assertive .tab-item.tab-item-active .badge, .tabs-color-assertive .tab-item.active .badge, .tabs-color-assertive .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-balanced .tab-item { + color: rgba(51, 205, 95, 0.4); + opacity: 1; } + .tabs-color-balanced .tab-item .badge { + opacity: 0.4; } + .tabs-color-balanced .tab-item.tab-item-active, .tabs-color-balanced .tab-item.active, .tabs-color-balanced .tab-item.activated { + color: #33cd5f; + border: 0 solid #33cd5f; } + .tabs-color-balanced .tab-item.tab-item-active .badge, .tabs-color-balanced .tab-item.active .badge, .tabs-color-balanced .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-energized .tab-item { + color: rgba(255, 201, 0, 0.4); + opacity: 1; } + .tabs-color-energized .tab-item .badge { + opacity: 0.4; } + .tabs-color-energized .tab-item.tab-item-active, .tabs-color-energized .tab-item.active, .tabs-color-energized .tab-item.activated { + color: #ffc900; + border: 0 solid #ffc900; } + .tabs-color-energized .tab-item.tab-item-active .badge, .tabs-color-energized .tab-item.active .badge, .tabs-color-energized .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-royal .tab-item { + color: rgba(136, 106, 234, 0.4); + opacity: 1; } + .tabs-color-royal .tab-item .badge { + opacity: 0.4; } + .tabs-color-royal .tab-item.tab-item-active, .tabs-color-royal .tab-item.active, .tabs-color-royal .tab-item.activated { + color: #886aea; + border: 0 solid #886aea; } + .tabs-color-royal .tab-item.tab-item-active .badge, .tabs-color-royal .tab-item.active .badge, .tabs-color-royal .tab-item.activated .badge { + opacity: 1; } + +.tabs-color-dark .tab-item { + color: rgba(68, 68, 68, 0.4); + opacity: 1; } + .tabs-color-dark .tab-item .badge { + opacity: 0.4; } + .tabs-color-dark .tab-item.tab-item-active, .tabs-color-dark .tab-item.active, .tabs-color-dark .tab-item.activated { + color: #444; + border: 0 solid #444; } + .tabs-color-dark .tab-item.tab-item-active .badge, .tabs-color-dark .tab-item.active .badge, .tabs-color-dark .tab-item.activated .badge { + opacity: 1; } + +ion-tabs.tabs-color-active-light .tab-item { + color: #444; } + ion-tabs.tabs-color-active-light .tab-item.tab-item-active, ion-tabs.tabs-color-active-light .tab-item.active, ion-tabs.tabs-color-active-light .tab-item.activated { + color: #fff; } + +ion-tabs.tabs-color-active-stable .tab-item { + color: #444; } + ion-tabs.tabs-color-active-stable .tab-item.tab-item-active, ion-tabs.tabs-color-active-stable .tab-item.active, ion-tabs.tabs-color-active-stable .tab-item.activated { + color: #f8f8f8; } + +ion-tabs.tabs-color-active-positive .tab-item { + color: #444; } + ion-tabs.tabs-color-active-positive .tab-item.tab-item-active, ion-tabs.tabs-color-active-positive .tab-item.active, ion-tabs.tabs-color-active-positive .tab-item.activated { + color: #387ef5; } + +ion-tabs.tabs-color-active-calm .tab-item { + color: #444; } + ion-tabs.tabs-color-active-calm .tab-item.tab-item-active, ion-tabs.tabs-color-active-calm .tab-item.active, ion-tabs.tabs-color-active-calm .tab-item.activated { + color: #11c1f3; } + +ion-tabs.tabs-color-active-assertive .tab-item { + color: #444; } + ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active, ion-tabs.tabs-color-active-assertive .tab-item.active, ion-tabs.tabs-color-active-assertive .tab-item.activated { + color: #ef473a; } + +ion-tabs.tabs-color-active-balanced .tab-item { + color: #444; } + ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active, ion-tabs.tabs-color-active-balanced .tab-item.active, ion-tabs.tabs-color-active-balanced .tab-item.activated { + color: #33cd5f; } + +ion-tabs.tabs-color-active-energized .tab-item { + color: #444; } + ion-tabs.tabs-color-active-energized .tab-item.tab-item-active, ion-tabs.tabs-color-active-energized .tab-item.active, ion-tabs.tabs-color-active-energized .tab-item.activated { + color: #ffc900; } + +ion-tabs.tabs-color-active-royal .tab-item { + color: #444; } + ion-tabs.tabs-color-active-royal .tab-item.tab-item-active, ion-tabs.tabs-color-active-royal .tab-item.active, ion-tabs.tabs-color-active-royal .tab-item.activated { + color: #886aea; } + +ion-tabs.tabs-color-active-dark .tab-item { + color: #fff; } + ion-tabs.tabs-color-active-dark .tab-item.tab-item-active, ion-tabs.tabs-color-active-dark .tab-item.active, ion-tabs.tabs-color-active-dark .tab-item.activated { + color: #444; } + +.tabs-top.tabs-striped { + padding-bottom: 0; } + .tabs-top.tabs-striped .tab-item { + background: transparent; + -webkit-transition: color .1s ease; + -moz-transition: color .1s ease; + -ms-transition: color .1s ease; + -o-transition: color .1s ease; + transition: color .1s ease; } + .tabs-top.tabs-striped .tab-item.tab-item-active, .tabs-top.tabs-striped .tab-item.active, .tabs-top.tabs-striped .tab-item.activated { + margin-top: 1px; + border-width: 0px 0px 2px 0px !important; + border-style: solid; } + .tabs-top.tabs-striped .tab-item.tab-item-active > .badge, .tabs-top.tabs-striped .tab-item.tab-item-active > i, .tabs-top.tabs-striped .tab-item.active > .badge, .tabs-top.tabs-striped .tab-item.active > i, .tabs-top.tabs-striped .tab-item.activated > .badge, .tabs-top.tabs-striped .tab-item.activated > i { + margin-top: -1px; } + .tabs-top.tabs-striped .tab-item .badge { + -webkit-transition: color .2s ease; + -moz-transition: color .2s ease; + -ms-transition: color .2s ease; + -o-transition: color .2s ease; + transition: color .2s ease; } + .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title, .tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i { + display: block; + margin-top: -1px; } + .tabs-top.tabs-striped.tabs-icon-left .tab-item { + margin-top: 1px; } + .tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i, .tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.active i, .tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title, .tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i { + margin-top: -0.1em; } + +/* Allow parent element to have tabs-top */ +/* If you change this, change platform.scss as well */ +.tabs-top > .tabs, +.tabs.tabs-top { + top: 44px; + padding-top: 0; + background-position: bottom; + border-top-width: 0; + border-bottom-width: 1px; } + .tabs-top > .tabs .tab-item.tab-item-active .badge, .tabs-top > .tabs .tab-item.active .badge, .tabs-top > .tabs .tab-item.activated .badge, + .tabs.tabs-top .tab-item.tab-item-active .badge, + .tabs.tabs-top .tab-item.active .badge, + .tabs.tabs-top .tab-item.activated .badge { + top: 4%; } + +.tabs-top ~ .bar-header { + border-bottom-width: 0; } + +.tab-item { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + overflow: hidden; + max-width: 150px; + height: 100%; + color: inherit; + text-align: center; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 400; + font-size: 14px; + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; + opacity: 0.7; } + .tab-item:hover { + cursor: pointer; } + .tab-item.tab-hidden { + display: none; } + +.tabs-item-hide > .tabs, +.tabs.tabs-item-hide { + display: none; } + +.tabs-icon-top > .tabs .tab-item, +.tabs-icon-top.tabs .tab-item, +.tabs-icon-bottom > .tabs .tab-item, +.tabs-icon-bottom.tabs .tab-item { + font-size: 10px; + line-height: 14px; } + +.tab-item .icon { + display: block; + margin: 0 auto; + height: 32px; + font-size: 32px; } + +.tabs-icon-left.tabs .tab-item, +.tabs-icon-left > .tabs .tab-item, +.tabs-icon-right.tabs .tab-item, +.tabs-icon-right > .tabs .tab-item { + font-size: 10px; } + .tabs-icon-left.tabs .tab-item .icon, .tabs-icon-left.tabs .tab-item .tab-title, + .tabs-icon-left > .tabs .tab-item .icon, + .tabs-icon-left > .tabs .tab-item .tab-title, + .tabs-icon-right.tabs .tab-item .icon, + .tabs-icon-right.tabs .tab-item .tab-title, + .tabs-icon-right > .tabs .tab-item .icon, + .tabs-icon-right > .tabs .tab-item .tab-title { + display: inline-block; + vertical-align: top; + margin-top: -.1em; } + .tabs-icon-left.tabs .tab-item .icon:before, .tabs-icon-left.tabs .tab-item .tab-title:before, + .tabs-icon-left > .tabs .tab-item .icon:before, + .tabs-icon-left > .tabs .tab-item .tab-title:before, + .tabs-icon-right.tabs .tab-item .icon:before, + .tabs-icon-right.tabs .tab-item .tab-title:before, + .tabs-icon-right > .tabs .tab-item .icon:before, + .tabs-icon-right > .tabs .tab-item .tab-title:before { + font-size: 24px; + line-height: 49px; } + +.tabs-icon-left > .tabs .tab-item .icon, +.tabs-icon-left.tabs .tab-item .icon { + padding-right: 3px; } + +.tabs-icon-right > .tabs .tab-item .icon, +.tabs-icon-right.tabs .tab-item .icon { + padding-left: 3px; } + +.tabs-icon-only > .tabs .icon, +.tabs-icon-only.tabs .icon { + line-height: inherit; } + +.tab-item.has-badge { + position: relative; } + +.tab-item .badge { + position: absolute; + top: 4%; + right: 33%; + right: calc(50% - 26px); + padding: 1px 6px; + height: auto; + font-size: 12px; + line-height: 16px; } + +/* Navigational tab */ +/* Active state for tab */ +.tab-item.tab-item-active, +.tab-item.active, +.tab-item.activated { + opacity: 1; } + .tab-item.tab-item-active.tab-item-light, + .tab-item.active.tab-item-light, + .tab-item.activated.tab-item-light { + color: #fff; } + .tab-item.tab-item-active.tab-item-stable, + .tab-item.active.tab-item-stable, + .tab-item.activated.tab-item-stable { + color: #f8f8f8; } + .tab-item.tab-item-active.tab-item-positive, + .tab-item.active.tab-item-positive, + .tab-item.activated.tab-item-positive { + color: #387ef5; } + .tab-item.tab-item-active.tab-item-calm, + .tab-item.active.tab-item-calm, + .tab-item.activated.tab-item-calm { + color: #11c1f3; } + .tab-item.tab-item-active.tab-item-assertive, + .tab-item.active.tab-item-assertive, + .tab-item.activated.tab-item-assertive { + color: #ef473a; } + .tab-item.tab-item-active.tab-item-balanced, + .tab-item.active.tab-item-balanced, + .tab-item.activated.tab-item-balanced { + color: #33cd5f; } + .tab-item.tab-item-active.tab-item-energized, + .tab-item.active.tab-item-energized, + .tab-item.activated.tab-item-energized { + color: #ffc900; } + .tab-item.tab-item-active.tab-item-royal, + .tab-item.active.tab-item-royal, + .tab-item.activated.tab-item-royal { + color: #886aea; } + .tab-item.tab-item-active.tab-item-dark, + .tab-item.active.tab-item-dark, + .tab-item.activated.tab-item-dark { + color: #444; } + +.item.tabs { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + padding: 0; } + .item.tabs .icon:before { + position: relative; } + +.tab-item.disabled, +.tab-item[disabled] { + opacity: .4; + cursor: default; + pointer-events: none; } + +.nav-bar-tabs-top.hide ~ .view-container .tabs-top .tabs { + top: 0; } + +.pane[hide-nav-bar="true"] .has-tabs-top { + top: 49px; } + +/** + * Menus + * -------------------------------------------------- + * Side panel structure + */ +.menu { + position: absolute; + top: 0; + bottom: 0; + z-index: 0; + overflow: hidden; + min-height: 100%; + max-height: 100%; + width: 275px; + background-color: #fff; } + .menu .scroll-content { + z-index: 10; } + .menu .bar-header { + z-index: 11; } + +.menu-content { + -webkit-transform: none; + transform: none; + box-shadow: -1px 0px 2px rgba(0, 0, 0, 0.2), 1px 0px 2px rgba(0, 0, 0, 0.2); } + +.menu-open .menu-content .pane, +.menu-open .menu-content .scroll-content { + pointer-events: none; } + +.menu-open .menu-content .scroll-content .scroll { + pointer-events: none; } + +.menu-open .menu-content .scroll-content:not(.overflow-scroll) { + overflow: hidden; } + +.grade-b .menu-content, +.grade-c .menu-content { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + right: -1px; + left: -1px; + border-right: 1px solid #ccc; + border-left: 1px solid #ccc; + box-shadow: none; } + +.menu-left { + left: 0; } + +.menu-right { + right: 0; } + +.aside-open.aside-resizing .menu-right { + display: none; } + +.menu-animated { + -webkit-transition: -webkit-transform 200ms ease; + transition: transform 200ms ease; } + +/** + * Modals + * -------------------------------------------------- + * Modals are independent windows that slide in from off-screen. + */ +.modal-backdrop, +.modal-backdrop-bg { + position: fixed; + top: 0; + left: 0; + z-index: 10; + width: 100%; + height: 100%; } + +.modal-backdrop-bg { + pointer-events: none; } + +.modal { + display: block; + position: absolute; + top: 0; + z-index: 10; + overflow: hidden; + min-height: 100%; + width: 100%; + background-color: #fff; } + +@media (min-width: 680px) { + .modal { + top: 20%; + right: 20%; + bottom: 20%; + left: 20%; + min-height: 240px; + width: 60%; } + .modal.ng-leave-active { + bottom: 0; } + .platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader) { + height: 44px; } + .platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader) > * { + margin-top: 0; } + .platform-ios.platform-cordova .modal-wrapper .modal .tabs-top > .tabs, + .platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top { + top: 44px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-header, + .platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader { + top: 44px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-subheader { + top: 88px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top { + top: 93px; } + .platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top { + top: 137px; } + .modal-backdrop-bg { + -webkit-transition: opacity 300ms ease-in-out; + transition: opacity 300ms ease-in-out; + background-color: #000; + opacity: 0; } + .active .modal-backdrop-bg { + opacity: 0.5; } } + +.modal-open { + pointer-events: none; } + .modal-open .modal, + .modal-open .modal-backdrop { + pointer-events: auto; } + .modal-open.loading-active .modal, + .modal-open.loading-active .modal-backdrop { + pointer-events: none; } + +/** + * Popovers + * -------------------------------------------------- + * Popovers are independent views which float over content + */ +.popover-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 10; + width: 100%; + height: 100%; + background-color: transparent; } + .popover-backdrop.active { + background-color: rgba(0, 0, 0, 0.1); } + +.popover { + position: absolute; + top: 25%; + left: 50%; + z-index: 10; + display: block; + margin-top: 12px; + margin-left: -110px; + height: 280px; + width: 220px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); + opacity: 0; } + .popover .item:first-child { + border-top: 0; } + .popover .item:last-child { + border-bottom: 0; } + .popover.popover-bottom { + margin-top: -12px; } + +.popover, +.popover .bar-header { + border-radius: 2px; } + +.popover .scroll-content { + z-index: 1; + margin: 2px 0; } + +.popover .bar-header { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.popover .has-header { + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.popover-arrow { + display: none; } + +.platform-ios .popover { + box-shadow: 0 0 40px rgba(0, 0, 0, 0.08); + border-radius: 10px; } + +.platform-ios .popover .bar-header { + -webkit-border-top-right-radius: 10px; + border-top-right-radius: 10px; + -webkit-border-top-left-radius: 10px; + border-top-left-radius: 10px; } + +.platform-ios .popover .scroll-content { + margin: 8px 0; + border-radius: 10px; } + +.platform-ios .popover .scroll-content.has-header { + margin-top: 0; } + +.platform-ios .popover-arrow { + position: absolute; + display: block; + top: -17px; + width: 30px; + height: 19px; + overflow: hidden; } + .platform-ios .popover-arrow:after { + position: absolute; + top: 12px; + left: 5px; + width: 20px; + height: 20px; + background-color: #fff; + border-radius: 3px; + content: ''; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + +.platform-ios .popover-bottom .popover-arrow { + top: auto; + bottom: -10px; } + .platform-ios .popover-bottom .popover-arrow:after { + top: -6px; } + +.platform-android .popover { + margin-top: -32px; + background-color: #fafafa; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35); } + .platform-android .popover .item { + border-color: #fafafa; + background-color: #fafafa; + color: #4d4d4d; } + .platform-android .popover.popover-bottom { + margin-top: 32px; } + +.platform-android .popover-backdrop, +.platform-android .popover-backdrop.active { + background-color: transparent; } + +.popover-open { + pointer-events: none; } + .popover-open .popover, + .popover-open .popover-backdrop { + pointer-events: auto; } + .popover-open.loading-active .popover, + .popover-open.loading-active .popover-backdrop { + pointer-events: none; } + +@media (min-width: 680px) { + .popover { + width: 360px; + margin-left: -180px; } } + +/** + * Popups + * -------------------------------------------------- + */ +.popup-container { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + z-index: 12; + visibility: hidden; } + .popup-container.popup-showing { + visibility: visible; } + .popup-container.popup-hidden .popup { + -webkit-animation-name: scaleOut; + animation-name: scaleOut; + -webkit-animation-duration: 0.1s; + animation-duration: 0.1s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; } + .popup-container.active .popup { + -webkit-animation-name: superScaleIn; + animation-name: superScaleIn; + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; } + .popup-container .popup { + width: 250px; + max-width: 100%; + max-height: 90%; + border-radius: 0px; + background-color: rgba(255, 255, 255, 0.9); + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: vertical; + -webkit-flex-direction: column; + -moz-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .popup-container input, + .popup-container textarea { + width: 100%; } + +.popup-head { + padding: 15px 10px; + border-bottom: 1px solid #eee; + text-align: center; } + +.popup-title { + margin: 0; + padding: 0; + font-size: 15px; } + +.popup-sub-title { + margin: 5px 0 0 0; + padding: 0; + font-weight: normal; + font-size: 11px; } + +.popup-body { + padding: 10px; + overflow: auto; } + +.popup-buttons { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-direction: normal; + -webkit-box-orient: horizontal; + -webkit-flex-direction: row; + -moz-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + padding: 10px; + min-height: 65px; } + .popup-buttons .button { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + min-height: 45px; + border-radius: 2px; + line-height: 20px; + margin-right: 5px; } + .popup-buttons .button:last-child { + margin-right: 0px; } + +.popup-open { + pointer-events: none; } + .popup-open.modal-open .modal { + pointer-events: none; } + .popup-open .popup-backdrop, .popup-open .popup { + pointer-events: auto; } + +/** + * Loading + * -------------------------------------------------- + */ +.loading-container { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 13; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + -moz-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + -webkit-transition: 0.2s opacity linear; + transition: 0.2s opacity linear; + visibility: hidden; + opacity: 0; } + .loading-container:not(.visible) .icon, + .loading-container:not(.visible) .spinner { + display: none; } + .loading-container.visible { + visibility: visible; } + .loading-container.active { + opacity: 1; } + .loading-container .loading { + padding: 20px; + border-radius: 5px; + background-color: rgba(0, 0, 0, 0.7); + color: #fff; + text-align: center; + text-overflow: ellipsis; + font-size: 15px; } + .loading-container .loading h1, .loading-container .loading h2, .loading-container .loading h3, .loading-container .loading h4, .loading-container .loading h5, .loading-container .loading h6 { + color: #fff; } + +/** + * Items + * -------------------------------------------------- + */ +.item { + border-color: #ddd; + background-color: #fff; + color: #444; + position: relative; + z-index: 2; + display: block; + margin: -1px; + padding: 16px; + border-width: 1px; + border-style: solid; + font-size: 16px; } + .item h2 { + margin: 0 0 2px 0; + font-size: 16px; + font-weight: normal; } + .item h3 { + margin: 0 0 4px 0; + font-size: 14px; } + .item h4 { + margin: 0 0 4px 0; + font-size: 12px; } + .item h5, .item h6 { + margin: 0 0 3px 0; + font-size: 10px; } + .item p { + color: #666; + font-size: 14px; + margin-bottom: 2px; } + .item h1:last-child, + .item h2:last-child, + .item h3:last-child, + .item h4:last-child, + .item h5:last-child, + .item h6:last-child, + .item p:last-child { + margin-bottom: 0; } + .item .badge { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + position: absolute; + top: 16px; + right: 32px; } + .item.item-button-right .badge { + right: 67px; } + .item.item-divider .badge { + top: 8px; } + .item .badge + .badge { + margin-right: 5px; } + .item.item-light { + border-color: #ddd; + background-color: #fff; + color: #444; } + .item.item-stable { + border-color: #b2b2b2; + background-color: #f8f8f8; + color: #444; } + .item.item-positive { + border-color: #0c60ee; + background-color: #387ef5; + color: #fff; } + .item.item-calm { + border-color: #0a9dc7; + background-color: #11c1f3; + color: #fff; } + .item.item-assertive { + border-color: #e42112; + background-color: #ef473a; + color: #fff; } + .item.item-balanced { + border-color: #28a54c; + background-color: #33cd5f; + color: #fff; } + .item.item-energized { + border-color: #e6b500; + background-color: #ffc900; + color: #fff; } + .item.item-royal { + border-color: #6b46e5; + background-color: #886aea; + color: #fff; } + .item.item-dark { + border-color: #111; + background-color: #444; + color: #fff; } + .item[ng-click]:hover { + cursor: pointer; } + +.list-borderless .item, +.item-borderless { + border-width: 0; } + +.item.active, +.item.activated, +.item-complex.active .item-content, +.item-complex.activated .item-content, +.item .item-content.active, +.item .item-content.activated { + border-color: #ccc; + background-color: #D9D9D9; } + .item.active.item-complex > .item-content, + .item.activated.item-complex > .item-content, + .item-complex.active .item-content.item-complex > .item-content, + .item-complex.activated .item-content.item-complex > .item-content, + .item .item-content.active.item-complex > .item-content, + .item .item-content.activated.item-complex > .item-content { + border-color: #ccc; + background-color: #D9D9D9; } + .item.active.item-light, + .item.activated.item-light, + .item-complex.active .item-content.item-light, + .item-complex.activated .item-content.item-light, + .item .item-content.active.item-light, + .item .item-content.activated.item-light { + border-color: #ccc; + background-color: #fafafa; } + .item.active.item-light.item-complex > .item-content, + .item.activated.item-light.item-complex > .item-content, + .item-complex.active .item-content.item-light.item-complex > .item-content, + .item-complex.activated .item-content.item-light.item-complex > .item-content, + .item .item-content.active.item-light.item-complex > .item-content, + .item .item-content.activated.item-light.item-complex > .item-content { + border-color: #ccc; + background-color: #fafafa; } + .item.active.item-stable, + .item.activated.item-stable, + .item-complex.active .item-content.item-stable, + .item-complex.activated .item-content.item-stable, + .item .item-content.active.item-stable, + .item .item-content.activated.item-stable { + border-color: #a2a2a2; + background-color: #e5e5e5; } + .item.active.item-stable.item-complex > .item-content, + .item.activated.item-stable.item-complex > .item-content, + .item-complex.active .item-content.item-stable.item-complex > .item-content, + .item-complex.activated .item-content.item-stable.item-complex > .item-content, + .item .item-content.active.item-stable.item-complex > .item-content, + .item .item-content.activated.item-stable.item-complex > .item-content { + border-color: #a2a2a2; + background-color: #e5e5e5; } + .item.active.item-positive, + .item.activated.item-positive, + .item-complex.active .item-content.item-positive, + .item-complex.activated .item-content.item-positive, + .item .item-content.active.item-positive, + .item .item-content.activated.item-positive { + border-color: #0c60ee; + background-color: #0c60ee; } + .item.active.item-positive.item-complex > .item-content, + .item.activated.item-positive.item-complex > .item-content, + .item-complex.active .item-content.item-positive.item-complex > .item-content, + .item-complex.activated .item-content.item-positive.item-complex > .item-content, + .item .item-content.active.item-positive.item-complex > .item-content, + .item .item-content.activated.item-positive.item-complex > .item-content { + border-color: #0c60ee; + background-color: #0c60ee; } + .item.active.item-calm, + .item.activated.item-calm, + .item-complex.active .item-content.item-calm, + .item-complex.activated .item-content.item-calm, + .item .item-content.active.item-calm, + .item .item-content.activated.item-calm { + border-color: #0a9dc7; + background-color: #0a9dc7; } + .item.active.item-calm.item-complex > .item-content, + .item.activated.item-calm.item-complex > .item-content, + .item-complex.active .item-content.item-calm.item-complex > .item-content, + .item-complex.activated .item-content.item-calm.item-complex > .item-content, + .item .item-content.active.item-calm.item-complex > .item-content, + .item .item-content.activated.item-calm.item-complex > .item-content { + border-color: #0a9dc7; + background-color: #0a9dc7; } + .item.active.item-assertive, + .item.activated.item-assertive, + .item-complex.active .item-content.item-assertive, + .item-complex.activated .item-content.item-assertive, + .item .item-content.active.item-assertive, + .item .item-content.activated.item-assertive { + border-color: #e42112; + background-color: #e42112; } + .item.active.item-assertive.item-complex > .item-content, + .item.activated.item-assertive.item-complex > .item-content, + .item-complex.active .item-content.item-assertive.item-complex > .item-content, + .item-complex.activated .item-content.item-assertive.item-complex > .item-content, + .item .item-content.active.item-assertive.item-complex > .item-content, + .item .item-content.activated.item-assertive.item-complex > .item-content { + border-color: #e42112; + background-color: #e42112; } + .item.active.item-balanced, + .item.activated.item-balanced, + .item-complex.active .item-content.item-balanced, + .item-complex.activated .item-content.item-balanced, + .item .item-content.active.item-balanced, + .item .item-content.activated.item-balanced { + border-color: #28a54c; + background-color: #28a54c; } + .item.active.item-balanced.item-complex > .item-content, + .item.activated.item-balanced.item-complex > .item-content, + .item-complex.active .item-content.item-balanced.item-complex > .item-content, + .item-complex.activated .item-content.item-balanced.item-complex > .item-content, + .item .item-content.active.item-balanced.item-complex > .item-content, + .item .item-content.activated.item-balanced.item-complex > .item-content { + border-color: #28a54c; + background-color: #28a54c; } + .item.active.item-energized, + .item.activated.item-energized, + .item-complex.active .item-content.item-energized, + .item-complex.activated .item-content.item-energized, + .item .item-content.active.item-energized, + .item .item-content.activated.item-energized { + border-color: #e6b500; + background-color: #e6b500; } + .item.active.item-energized.item-complex > .item-content, + .item.activated.item-energized.item-complex > .item-content, + .item-complex.active .item-content.item-energized.item-complex > .item-content, + .item-complex.activated .item-content.item-energized.item-complex > .item-content, + .item .item-content.active.item-energized.item-complex > .item-content, + .item .item-content.activated.item-energized.item-complex > .item-content { + border-color: #e6b500; + background-color: #e6b500; } + .item.active.item-royal, + .item.activated.item-royal, + .item-complex.active .item-content.item-royal, + .item-complex.activated .item-content.item-royal, + .item .item-content.active.item-royal, + .item .item-content.activated.item-royal { + border-color: #6b46e5; + background-color: #6b46e5; } + .item.active.item-royal.item-complex > .item-content, + .item.activated.item-royal.item-complex > .item-content, + .item-complex.active .item-content.item-royal.item-complex > .item-content, + .item-complex.activated .item-content.item-royal.item-complex > .item-content, + .item .item-content.active.item-royal.item-complex > .item-content, + .item .item-content.activated.item-royal.item-complex > .item-content { + border-color: #6b46e5; + background-color: #6b46e5; } + .item.active.item-dark, + .item.activated.item-dark, + .item-complex.active .item-content.item-dark, + .item-complex.activated .item-content.item-dark, + .item .item-content.active.item-dark, + .item .item-content.activated.item-dark { + border-color: #000; + background-color: #262626; } + .item.active.item-dark.item-complex > .item-content, + .item.activated.item-dark.item-complex > .item-content, + .item-complex.active .item-content.item-dark.item-complex > .item-content, + .item-complex.activated .item-content.item-dark.item-complex > .item-content, + .item .item-content.active.item-dark.item-complex > .item-content, + .item .item-content.activated.item-dark.item-complex > .item-content { + border-color: #000; + background-color: #262626; } + +.item, +.item h1, +.item h2, +.item h3, +.item h4, +.item h5, +.item h6, +.item p, +.item-content, +.item-content h1, +.item-content h2, +.item-content h3, +.item-content h4, +.item-content h5, +.item-content h6, +.item-content p { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +a.item { + color: inherit; + text-decoration: none; } + a.item:hover, a.item:focus { + text-decoration: none; } + +/** + * Complex Items + * -------------------------------------------------- + * Adding .item-complex allows the .item to be slidable and + * have options underneath the button, but also requires an + * additional .item-content element inside .item. + * Basically .item-complex removes any default settings which + * .item added, so that .item-content looks them as just .item. + */ +.item-complex, +a.item.item-complex, +button.item.item-complex { + padding: 0; } + +.item-complex .item-content, +.item-radio .item-content { + position: relative; + z-index: 2; + padding: 16px 49px 16px 16px; + border: none; + background-color: #fff; } + +a.item-content { + display: block; + color: inherit; + text-decoration: none; } + +.item-text-wrap .item, +.item-text-wrap .item-content, +.item-text-wrap, +.item-text-wrap h1, +.item-text-wrap h2, +.item-text-wrap h3, +.item-text-wrap h4, +.item-text-wrap h5, +.item-text-wrap h6, +.item-text-wrap p, +.item-complex.item-text-wrap .item-content, +.item-body h1, +.item-body h2, +.item-body h3, +.item-body h4, +.item-body h5, +.item-body h6, +.item-body p { + overflow: visible; + white-space: normal; } + +.item-complex.item-text-wrap, +.item-complex.item-text-wrap h1, +.item-complex.item-text-wrap h2, +.item-complex.item-text-wrap h3, +.item-complex.item-text-wrap h4, +.item-complex.item-text-wrap h5, +.item-complex.item-text-wrap h6, +.item-complex.item-text-wrap p { + overflow: visible; + white-space: normal; } + +.item-complex.item-light > .item-content { + border-color: #ddd; + background-color: #fff; + color: #444; } + .item-complex.item-light > .item-content.active, .item-complex.item-light > .item-content:active { + border-color: #ccc; + background-color: #fafafa; } + .item-complex.item-light > .item-content.active.item-complex > .item-content, .item-complex.item-light > .item-content:active.item-complex > .item-content { + border-color: #ccc; + background-color: #fafafa; } + +.item-complex.item-stable > .item-content { + border-color: #b2b2b2; + background-color: #f8f8f8; + color: #444; } + .item-complex.item-stable > .item-content.active, .item-complex.item-stable > .item-content:active { + border-color: #a2a2a2; + background-color: #e5e5e5; } + .item-complex.item-stable > .item-content.active.item-complex > .item-content, .item-complex.item-stable > .item-content:active.item-complex > .item-content { + border-color: #a2a2a2; + background-color: #e5e5e5; } + +.item-complex.item-positive > .item-content { + border-color: #0c60ee; + background-color: #387ef5; + color: #fff; } + .item-complex.item-positive > .item-content.active, .item-complex.item-positive > .item-content:active { + border-color: #0c60ee; + background-color: #0c60ee; } + .item-complex.item-positive > .item-content.active.item-complex > .item-content, .item-complex.item-positive > .item-content:active.item-complex > .item-content { + border-color: #0c60ee; + background-color: #0c60ee; } + +.item-complex.item-calm > .item-content { + border-color: #0a9dc7; + background-color: #11c1f3; + color: #fff; } + .item-complex.item-calm > .item-content.active, .item-complex.item-calm > .item-content:active { + border-color: #0a9dc7; + background-color: #0a9dc7; } + .item-complex.item-calm > .item-content.active.item-complex > .item-content, .item-complex.item-calm > .item-content:active.item-complex > .item-content { + border-color: #0a9dc7; + background-color: #0a9dc7; } + +.item-complex.item-assertive > .item-content { + border-color: #e42112; + background-color: #ef473a; + color: #fff; } + .item-complex.item-assertive > .item-content.active, .item-complex.item-assertive > .item-content:active { + border-color: #e42112; + background-color: #e42112; } + .item-complex.item-assertive > .item-content.active.item-complex > .item-content, .item-complex.item-assertive > .item-content:active.item-complex > .item-content { + border-color: #e42112; + background-color: #e42112; } + +.item-complex.item-balanced > .item-content { + border-color: #28a54c; + background-color: #33cd5f; + color: #fff; } + .item-complex.item-balanced > .item-content.active, .item-complex.item-balanced > .item-content:active { + border-color: #28a54c; + background-color: #28a54c; } + .item-complex.item-balanced > .item-content.active.item-complex > .item-content, .item-complex.item-balanced > .item-content:active.item-complex > .item-content { + border-color: #28a54c; + background-color: #28a54c; } + +.item-complex.item-energized > .item-content { + border-color: #e6b500; + background-color: #ffc900; + color: #fff; } + .item-complex.item-energized > .item-content.active, .item-complex.item-energized > .item-content:active { + border-color: #e6b500; + background-color: #e6b500; } + .item-complex.item-energized > .item-content.active.item-complex > .item-content, .item-complex.item-energized > .item-content:active.item-complex > .item-content { + border-color: #e6b500; + background-color: #e6b500; } + +.item-complex.item-royal > .item-content { + border-color: #6b46e5; + background-color: #886aea; + color: #fff; } + .item-complex.item-royal > .item-content.active, .item-complex.item-royal > .item-content:active { + border-color: #6b46e5; + background-color: #6b46e5; } + .item-complex.item-royal > .item-content.active.item-complex > .item-content, .item-complex.item-royal > .item-content:active.item-complex > .item-content { + border-color: #6b46e5; + background-color: #6b46e5; } + +.item-complex.item-dark > .item-content { + border-color: #111; + background-color: #444; + color: #fff; } + .item-complex.item-dark > .item-content.active, .item-complex.item-dark > .item-content:active { + border-color: #000; + background-color: #262626; } + .item-complex.item-dark > .item-content.active.item-complex > .item-content, .item-complex.item-dark > .item-content:active.item-complex > .item-content { + border-color: #000; + background-color: #262626; } + +/** + * Item Icons + * -------------------------------------------------- + */ +.item-icon-left .icon, +.item-icon-right .icon { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 0; + height: 100%; + font-size: 32px; } + .item-icon-left .icon:before, + .item-icon-right .icon:before { + display: block; + width: 32px; + text-align: center; } + +.item .fill-icon { + min-width: 30px; + min-height: 30px; + font-size: 28px; } + +.item-icon-left { + padding-left: 54px; } + .item-icon-left .icon { + left: 11px; } + +.item-complex.item-icon-left { + padding-left: 0; } + .item-complex.item-icon-left .item-content { + padding-left: 54px; } + +.item-icon-right { + padding-right: 54px; } + .item-icon-right .icon { + right: 11px; } + +.item-complex.item-icon-right { + padding-right: 0; } + .item-complex.item-icon-right .item-content { + padding-right: 54px; } + +.item-icon-left.item-icon-right .icon:first-child { + right: auto; } + +.item-icon-left.item-icon-right .icon:last-child, +.item-icon-left .item-delete .icon { + left: auto; } + +.item-icon-left .icon-accessory, +.item-icon-right .icon-accessory { + color: #ccc; + font-size: 16px; } + +.item-icon-left .icon-accessory { + left: 3px; } + +.item-icon-right .icon-accessory { + right: 3px; } + +/** + * Item Button + * -------------------------------------------------- + * An item button is a child button inside an .item (not the entire .item) + */ +.item-button-left { + padding-left: 72px; } + +.item-button-left > .button, +.item-button-left .item-content > .button { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 8px; + left: 11px; + min-width: 34px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + .item-button-left > .button .icon:before, + .item-button-left .item-content > .button .icon:before { + position: relative; + left: auto; + width: auto; + line-height: 31px; } + .item-button-left > .button > .button, + .item-button-left .item-content > .button > .button { + margin: 0px 2px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + +.item-button-right, +a.item.item-button-right, +button.item.item-button-right { + padding-right: 80px; } + +.item-button-right > .button, +.item-button-right .item-content > .button, +.item-button-right > .buttons, +.item-button-right .item-content > .buttons { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 8px; + right: 16px; + min-width: 34px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + .item-button-right > .button .icon:before, + .item-button-right .item-content > .button .icon:before, + .item-button-right > .buttons .icon:before, + .item-button-right .item-content > .buttons .icon:before { + position: relative; + left: auto; + width: auto; + line-height: 31px; } + .item-button-right > .button > .button, + .item-button-right .item-content > .button > .button, + .item-button-right > .buttons > .button, + .item-button-right .item-content > .buttons > .button { + margin: 0px 2px; + min-width: 34px; + min-height: 34px; + font-size: 18px; + line-height: 32px; } + +.item-avatar, +.item-avatar .item-content, +.item-avatar-left, +.item-avatar-left .item-content { + padding-left: 72px; + min-height: 72px; } + .item-avatar > img:first-child, + .item-avatar .item-image, + .item-avatar .item-content > img:first-child, + .item-avatar .item-content .item-image, + .item-avatar-left > img:first-child, + .item-avatar-left .item-image, + .item-avatar-left .item-content > img:first-child, + .item-avatar-left .item-content .item-image { + position: absolute; + top: 16px; + left: 16px; + max-width: 40px; + max-height: 40px; + width: 100%; + height: 100%; + border-radius: 50%; } + +.item-avatar-right, +.item-avatar-right .item-content { + padding-right: 72px; + min-height: 72px; } + .item-avatar-right > img:first-child, + .item-avatar-right .item-image, + .item-avatar-right .item-content > img:first-child, + .item-avatar-right .item-content .item-image { + position: absolute; + top: 16px; + right: 16px; + max-width: 40px; + max-height: 40px; + width: 100%; + height: 100%; + border-radius: 50%; } + +.item-thumbnail-left, +.item-thumbnail-left .item-content { + padding-top: 8px; + padding-left: 106px; + min-height: 100px; } + .item-thumbnail-left > img:first-child, + .item-thumbnail-left .item-image, + .item-thumbnail-left .item-content > img:first-child, + .item-thumbnail-left .item-content .item-image { + position: absolute; + top: 10px; + left: 10px; + max-width: 80px; + max-height: 80px; + width: 100%; + height: 100%; } + +.item-avatar.item-complex, +.item-avatar-left.item-complex, +.item-thumbnail-left.item-complex { + padding-top: 0; + padding-left: 0; } + +.item-thumbnail-right, +.item-thumbnail-right .item-content { + padding-top: 8px; + padding-right: 106px; + min-height: 100px; } + .item-thumbnail-right > img:first-child, + .item-thumbnail-right .item-image, + .item-thumbnail-right .item-content > img:first-child, + .item-thumbnail-right .item-content .item-image { + position: absolute; + top: 10px; + right: 10px; + max-width: 80px; + max-height: 80px; + width: 100%; + height: 100%; } + +.item-avatar-right.item-complex, +.item-thumbnail-right.item-complex { + padding-top: 0; + padding-right: 0; } + +.item-image { + padding: 0; + text-align: center; } + .item-image img:first-child, .item-image .list-img { + width: 100%; + vertical-align: middle; } + +.item-body { + overflow: auto; + padding: 16px; + text-overflow: inherit; + white-space: normal; } + .item-body h1, .item-body h2, .item-body h3, .item-body h4, .item-body h5, .item-body h6, .item-body p { + margin-top: 16px; + margin-bottom: 16px; } + +.item-divider { + padding-top: 8px; + padding-bottom: 8px; + min-height: 30px; + background-color: #f5f5f5; + color: #222; + font-weight: 500; } + +.platform-ios .item-divider-platform, +.item-divider-ios { + padding-top: 26px; + text-transform: uppercase; + font-weight: 300; + font-size: 13px; + background-color: #efeff4; + color: #555; } + +.platform-android .item-divider-platform, +.item-divider-android { + font-weight: 300; + font-size: 13px; } + +.item-note { + float: right; + color: #aaa; + font-size: 14px; } + +.item-left-editable .item-content, +.item-right-editable .item-content { + -webkit-transition-duration: 250ms; + transition-duration: 250ms; + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + transition-property: transform; } + +.list-left-editing .item-left-editable .item-content, +.item-left-editing.item-left-editable .item-content { + -webkit-transform: translate3d(50px, 0, 0); + transform: translate3d(50px, 0, 0); } + +.item-remove-animate.ng-leave { + -webkit-transition-duration: 300ms; + transition-duration: 300ms; } + +.item-remove-animate.ng-leave .item-content, .item-remove-animate.ng-leave:last-of-type { + -webkit-transition-duration: 300ms; + transition-duration: 300ms; + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + -webkit-transition-property: all; + transition-property: all; } + +.item-remove-animate.ng-leave.ng-leave-active .item-content { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) !important; + transform: translate3d(-100%, 0, 0) !important; } + +.item-remove-animate.ng-leave.ng-leave-active:last-of-type { + opacity: 0; } + +.item-remove-animate.ng-leave.ng-leave-active ~ ion-item:not(.ng-leave) { + -webkit-transform: translate3d(0, -webkit-calc(-100% + 1px), 0); + transform: translate3d(0, calc(-100% + 1px), 0); + -webkit-transition-duration: 300ms; + transition-duration: 300ms; + -webkit-transition-timing-function: cubic-bezier(0.25, 0.81, 0.24, 1); + transition-timing-function: cubic-bezier(0.25, 0.81, 0.24, 1); + -webkit-transition-property: all; + transition-property: all; } + +.item-left-edit { + -webkit-transition: all ease-in-out 125ms; + transition: all ease-in-out 125ms; + position: absolute; + top: 0; + left: 0; + z-index: 0; + width: 50px; + height: 100%; + line-height: 100%; + display: none; + opacity: 0; + -webkit-transform: translate3d(-21px, 0, 0); + transform: translate3d(-21px, 0, 0); } + .item-left-edit .button { + height: 100%; } + .item-left-edit .button.icon { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 0; + height: 100%; } + .item-left-edit.visible { + display: block; } + .item-left-edit.visible.active { + opacity: 1; + -webkit-transform: translate3d(8px, 0, 0); + transform: translate3d(8px, 0, 0); } + +.list-left-editing .item-left-edit { + -webkit-transition-delay: 125ms; + transition-delay: 125ms; } + +.item-delete .button.icon { + color: #ef473a; + font-size: 24px; } + .item-delete .button.icon:hover { + opacity: .7; } + +.item-right-edit { + -webkit-transition: all ease-in-out 250ms; + transition: all ease-in-out 250ms; + position: absolute; + top: 0; + right: 0; + z-index: 3; + width: 75px; + height: 100%; + background: inherit; + padding-left: 20px; + display: block; + opacity: 0; + -webkit-transform: translate3d(75px, 0, 0); + transform: translate3d(75px, 0, 0); } + .item-right-edit .button { + min-width: 50px; + height: 100%; } + .item-right-edit .button.icon { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: absolute; + top: 0; + height: 100%; + font-size: 32px; } + .item-right-edit.visible { + display: block; } + .item-right-edit.visible.active { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.item-reorder .button.icon { + color: #444; + font-size: 32px; } + +.item-reordering { + position: absolute; + left: 0; + top: 0; + z-index: 9; + width: 100%; + box-shadow: 0px 0px 10px 0px #aaa; } + .item-reordering .item-reorder { + z-index: 9; } + +.item-placeholder { + opacity: 0.7; } + +/** + * The hidden right-side buttons that can be exposed under a list item + * with dragging. + */ +.item-options { + position: absolute; + top: 0; + right: 0; + z-index: 1; + height: 100%; } + .item-options .button { + height: 100%; + border: none; + border-radius: 0; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -moz-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; } + .item-options .button:before { + margin: 0 auto; } + +/** + * Lists + * -------------------------------------------------- + */ +.list { + position: relative; + padding-top: 1px; + padding-bottom: 1px; + padding-left: 0; + margin-bottom: 20px; } + +.list:last-child { + margin-bottom: 0px; } + .list:last-child.card { + margin-bottom: 40px; } + +/** + * List Header + * -------------------------------------------------- + */ +.list-header { + margin-top: 20px; + padding: 5px 15px; + background-color: transparent; + color: #222; + font-weight: bold; } + +.card.list .list-item { + padding-right: 1px; + padding-left: 1px; } + +/** + * Cards and Inset Lists + * -------------------------------------------------- + * A card and list-inset are close to the same thing, except a card as a box shadow. + */ +.card, +.list-inset { + overflow: hidden; + margin: 20px 10px; + border-radius: 2px; + background-color: #fff; } + +.card { + padding-top: 1px; + padding-bottom: 1px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); } + .card .item { + border-left: 0; + border-right: 0; } + .card .item:first-child { + border-top: 0; } + .card .item:last-child { + border-bottom: 0; } + +.padding .card, .padding .list-inset { + margin-left: 0; + margin-right: 0; } + +.card .item:first-child, +.list-inset .item:first-child, +.padding > .list .item:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; } + .card .item:first-child .item-content, + .list-inset .item:first-child .item-content, + .padding > .list .item:first-child .item-content { + border-top-left-radius: 2px; + border-top-right-radius: 2px; } + +.card .item:last-child, +.list-inset .item:last-child, +.padding > .list .item:last-child { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; } + .card .item:last-child .item-content, + .list-inset .item:last-child .item-content, + .padding > .list .item:last-child .item-content { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; } + +.card .item:last-child, +.list-inset .item:last-child { + margin-bottom: -1px; } + +.card .item, +.list-inset .item, +.padding > .list .item, +.padding-horizontal > .list .item { + margin-right: 0; + margin-left: 0; } + .card .item.item-input input, + .list-inset .item.item-input input, + .padding > .list .item.item-input input, + .padding-horizontal > .list .item.item-input input { + padding-right: 44px; } + +.padding-left > .list .item { + margin-left: 0; } + +.padding-right > .list .item { + margin-right: 0; } + +/** + * Badges + * -------------------------------------------------- + */ +.badge { + background-color: transparent; + color: #AAAAAA; + z-index: 1; + display: inline-block; + padding: 3px 8px; + min-width: 10px; + border-radius: 10px; + vertical-align: baseline; + text-align: center; + white-space: nowrap; + font-weight: bold; + font-size: 14px; + line-height: 16px; } + .badge:empty { + display: none; } + +.tabs .tab-item .badge.badge-light, +.badge.badge-light { + background-color: #fff; + color: #444; } + +.tabs .tab-item .badge.badge-stable, +.badge.badge-stable { + background-color: #f8f8f8; + color: #444; } + +.tabs .tab-item .badge.badge-positive, +.badge.badge-positive { + background-color: #387ef5; + color: #fff; } + +.tabs .tab-item .badge.badge-calm, +.badge.badge-calm { + background-color: #11c1f3; + color: #fff; } + +.tabs .tab-item .badge.badge-assertive, +.badge.badge-assertive { + background-color: #ef473a; + color: #fff; } + +.tabs .tab-item .badge.badge-balanced, +.badge.badge-balanced { + background-color: #33cd5f; + color: #fff; } + +.tabs .tab-item .badge.badge-energized, +.badge.badge-energized { + background-color: #ffc900; + color: #fff; } + +.tabs .tab-item .badge.badge-royal, +.badge.badge-royal { + background-color: #886aea; + color: #fff; } + +.tabs .tab-item .badge.badge-dark, +.badge.badge-dark { + background-color: #444; + color: #fff; } + +.button .badge { + position: relative; + top: -1px; } + +/** + * Slide Box + * -------------------------------------------------- + */ +.slider { + position: relative; + visibility: hidden; + overflow: hidden; } + +.slider-slides { + position: relative; + height: 100%; } + +.slider-slide { + position: relative; + display: block; + float: left; + width: 100%; + height: 100%; + vertical-align: top; } + +.slider-slide-image > img { + width: 100%; } + +.slider-pager { + position: absolute; + bottom: 20px; + z-index: 1; + width: 100%; + height: 15px; + text-align: center; } + .slider-pager .slider-pager-page { + display: inline-block; + margin: 0px 3px; + width: 15px; + color: #000; + text-decoration: none; + opacity: 0.3; } + .slider-pager .slider-pager-page.active { + -webkit-transition: opacity 0.4s ease-in; + transition: opacity 0.4s ease-in; + opacity: 1; } + +.slider-slide.ng-enter, .slider-slide.ng-leave, .slider-slide.ng-animate, +.slider-pager-page.ng-enter, +.slider-pager-page.ng-leave, +.slider-pager-page.ng-animate { + -webkit-transition: none !important; + transition: none !important; } + +.slider-slide.ng-animate, +.slider-pager-page.ng-animate { + -webkit-animation: none 0s; + animation: none 0s; } + +/** + * Swiper 3.2.7 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * + * http://www.idangero.us/swiper/ + * + * Copyright 2015, Vladimir Kharlampidi + * The iDangero.us + * http://www.idangero.us/ + * + * Licensed under MIT + * + * Released on: December 7, 2015 + */ +.swiper-container { + margin: 0 auto; + position: relative; + overflow: hidden; + /* Fix of Webkit flickering */ + z-index: 1; } + +.swiper-container-no-flexbox .swiper-slide { + float: left; } + +.swiper-container-vertical > .swiper-wrapper { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -ms-flex-direction: column; + -webkit-flex-direction: column; + flex-direction: column; } + +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + -ms-transition-property: -ms-transform; + transition-property: transform; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } + +.swiper-container-android .swiper-slide, +.swiper-wrapper { + -webkit-transform: translate3d(0px, 0, 0); + -moz-transform: translate3d(0px, 0, 0); + -o-transform: translate(0px, 0px); + -ms-transform: translate3d(0px, 0, 0); + transform: translate3d(0px, 0, 0); } + +.swiper-container-multirow > .swiper-wrapper { + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; } + +.swiper-container-free-mode > .swiper-wrapper { + -webkit-transition-timing-function: ease-out; + -moz-transition-timing-function: ease-out; + -ms-transition-timing-function: ease-out; + -o-transition-timing-function: ease-out; + transition-timing-function: ease-out; + margin: 0 auto; } + +.swiper-slide { + display: block; + -webkit-flex-shrink: 0; + -ms-flex: 0 0 auto; + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; } + +/* Auto Height */ +.swiper-container-autoheight, +.swiper-container-autoheight .swiper-slide { + height: auto; } + +.swiper-container-autoheight .swiper-wrapper { + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; + -webkit-transition-property: -webkit-transform, height; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + -ms-transition-property: -ms-transform; + transition-property: transform, height; } + +/* a11y */ +.swiper-container .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; } + +/* IE10 Windows Phone 8 Fixes */ +.swiper-wp8-horizontal { + -ms-touch-action: pan-y; + touch-action: pan-y; } + +.swiper-wp8-vertical { + -ms-touch-action: pan-x; + touch-action: pan-x; } + +/* Arrows */ +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: 27px; + height: 44px; + margin-top: -22px; + z-index: 10; + cursor: pointer; + -moz-background-size: 27px 44px; + -webkit-background-size: 27px 44px; + background-size: 27px 44px; + background-position: center; + background-repeat: no-repeat; } + +.swiper-button-prev.swiper-button-disabled, +.swiper-button-next.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; } + +.swiper-button-prev, +.swiper-container-rtl .swiper-button-next { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + left: 10px; + right: auto; } + +.swiper-button-prev.swiper-button-black, +.swiper-container-rtl .swiper-button-next.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); } + +.swiper-button-prev.swiper-button-white, +.swiper-container-rtl .swiper-button-next.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); } + +.swiper-button-next, +.swiper-container-rtl .swiper-button-prev { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E"); + right: 10px; + left: auto; } + +.swiper-button-next.swiper-button-black, +.swiper-container-rtl .swiper-button-prev.swiper-button-black { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E"); } + +.swiper-button-next.swiper-button-white, +.swiper-container-rtl .swiper-button-prev.swiper-button-white { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E"); } + +/* Pagination Styles */ +.swiper-pagination { + position: absolute; + text-align: center; + -webkit-transition: 300ms; + -moz-transition: 300ms; + -o-transition: 300ms; + transition: 300ms; + -webkit-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + z-index: 10; } + +.swiper-pagination.swiper-pagination-hidden { + opacity: 0; } + +.swiper-pagination-bullet { + width: 8px; + height: 8px; + display: inline-block; + border-radius: 100%; + background: #000; + opacity: 0.2; } + +button.swiper-pagination-bullet { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + -moz-appearance: none; + -ms-appearance: none; + -webkit-appearance: none; + appearance: none; } + +.swiper-pagination-clickable .swiper-pagination-bullet { + cursor: pointer; } + +.swiper-pagination-white .swiper-pagination-bullet { + background: #fff; } + +.swiper-pagination-bullet-active { + opacity: 1; } + +.swiper-pagination-white .swiper-pagination-bullet-active { + background: #fff; } + +.swiper-pagination-black .swiper-pagination-bullet-active { + background: #000; } + +.swiper-container-vertical > .swiper-pagination { + right: 10px; + top: 50%; + -webkit-transform: translate3d(0px, -50%, 0); + -moz-transform: translate3d(0px, -50%, 0); + -o-transform: translate(0px, -50%); + -ms-transform: translate3d(0px, -50%, 0); + transform: translate3d(0px, -50%, 0); } + +.swiper-container-vertical > .swiper-pagination .swiper-pagination-bullet { + margin: 5px 0; + display: block; } + +.swiper-container-horizontal > .swiper-pagination { + bottom: 10px; + left: 0; + width: 100%; } + +.swiper-container-horizontal > .swiper-pagination .swiper-pagination-bullet { + margin: 0 5px; } + +/* 3D Container */ +.swiper-container-3d { + -webkit-perspective: 1200px; + -moz-perspective: 1200px; + -o-perspective: 1200px; + perspective: 1200px; } + +.swiper-container-3d .swiper-wrapper, +.swiper-container-3d .swiper-slide, +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom, +.swiper-container-3d .swiper-cube-shadow { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + -ms-transform-style: preserve-3d; + transform-style: preserve-3d; } + +.swiper-container-3d .swiper-slide-shadow-left, +.swiper-container-3d .swiper-slide-shadow-right, +.swiper-container-3d .swiper-slide-shadow-top, +.swiper-container-3d .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; } + +.swiper-container-3d .swiper-slide-shadow-left { + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +.swiper-container-3d .swiper-slide-shadow-right { + background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +.swiper-container-3d .swiper-slide-shadow-top { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +.swiper-container-3d .swiper-slide-shadow-bottom { + background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(transparent)); + /* Safari 4+, Chrome */ + background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent); + /* Chrome 10+, Safari 5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 3.6-15 */ + background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), transparent); + /* Opera 11.10-12.00 */ + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), transparent); + /* Firefox 16+, IE10, Opera 12.50+ */ } + +/* Coverflow */ +.swiper-container-coverflow .swiper-wrapper { + /* Windows 8 IE 10 fix */ + -ms-perspective: 1200px; } + +/* Fade */ +.swiper-container-fade.swiper-container-free-mode .swiper-slide { + -webkit-transition-timing-function: ease-out; + -moz-transition-timing-function: ease-out; + -ms-transition-timing-function: ease-out; + -o-transition-timing-function: ease-out; + transition-timing-function: ease-out; } + +.swiper-container-fade .swiper-slide { + pointer-events: none; } + +.swiper-container-fade .swiper-slide .swiper-slide { + pointer-events: none; } + +.swiper-container-fade .swiper-slide-active, +.swiper-container-fade .swiper-slide-active .swiper-slide-active { + pointer-events: auto; } + +/* Cube */ +.swiper-container-cube { + overflow: visible; } + +.swiper-container-cube .swiper-slide { + pointer-events: none; + visibility: hidden; + -webkit-transform-origin: 0 0; + -moz-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + width: 100%; + height: 100%; + z-index: 1; } + +.swiper-container-cube.swiper-container-rtl .swiper-slide { + -webkit-transform-origin: 100% 0; + -moz-transform-origin: 100% 0; + -ms-transform-origin: 100% 0; + transform-origin: 100% 0; } + +.swiper-container-cube .swiper-slide-active, +.swiper-container-cube .swiper-slide-next, +.swiper-container-cube .swiper-slide-prev, +.swiper-container-cube .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; } + +.swiper-container-cube .swiper-slide-shadow-top, +.swiper-container-cube .swiper-slide-shadow-bottom, +.swiper-container-cube .swiper-slide-shadow-left, +.swiper-container-cube .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; } + +.swiper-container-cube .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + background: #000; + opacity: 0.6; + -webkit-filter: blur(50px); + filter: blur(50px); + z-index: 0; } + +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); } + +.swiper-container-horizontal > .swiper-scrollbar { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; } + +.swiper-container-vertical > .swiper-scrollbar { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; } + +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; } + +.swiper-scrollbar-cursor-drag { + cursor: move; } + +/* Preloader */ +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + -webkit-transform-origin: 50%; + -moz-transform-origin: 50%; + transform-origin: 50%; + -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite; + -moz-animation: swiper-preloader-spin 1s steps(12, end) infinite; + animation: swiper-preloader-spin 1s steps(12, end) infinite; } + +.swiper-lazy-preloader:after { + display: block; + content: ""; + width: 100%; + height: 100%; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); + background-position: 50%; + -webkit-background-size: 100%; + background-size: 100%; + background-repeat: no-repeat; } + +.swiper-lazy-preloader-white:after { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } + +@-webkit-keyframes swiper-preloader-spin { + 100% { + -webkit-transform: rotate(360deg); } } + +@keyframes swiper-preloader-spin { + 100% { + transform: rotate(360deg); } } + +ion-slides { + width: 100%; + height: 100%; + display: block; } + +.slide-zoom { + display: block; + width: 100%; + text-align: center; } + +.swiper-container { + width: 100%; + height: 100%; + padding: 0; + overflow: hidden; } + +.swiper-wrapper { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + padding: 0; } + +.swiper-slide { + width: 100%; + height: 100%; + box-sizing: border-box; + /* Center slide text vertically */ } + .swiper-slide img { + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; } + +.scroll-refresher { + position: absolute; + top: -60px; + right: 0; + left: 0; + overflow: hidden; + margin: auto; + height: 60px; } + .scroll-refresher .ionic-refresher-content { + position: absolute; + bottom: 15px; + left: 0; + width: 100%; + color: #666666; + text-align: center; + font-size: 30px; } + .scroll-refresher .ionic-refresher-content .text-refreshing, + .scroll-refresher .ionic-refresher-content .text-pulling { + font-size: 16px; + line-height: 16px; } + .scroll-refresher .ionic-refresher-content.ionic-refresher-with-text { + bottom: 10px; } + .scroll-refresher .icon-refreshing, + .scroll-refresher .icon-pulling { + width: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; } + .scroll-refresher .icon-pulling { + -webkit-animation-name: refresh-spin-back; + animation-name: refresh-spin-back; + -webkit-animation-duration: 200ms; + animation-duration: 200ms; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-fill-mode: none; + animation-fill-mode: none; + -webkit-transform: translate3d(0, 0, 0) rotate(0deg); + transform: translate3d(0, 0, 0) rotate(0deg); } + .scroll-refresher .icon-refreshing, + .scroll-refresher .text-refreshing { + display: none; } + .scroll-refresher .icon-refreshing { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; } + .scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled) { + -webkit-animation-name: refresh-spin; + animation-name: refresh-spin; + -webkit-transform: translate3d(0, 0, 0) rotate(-180deg); + transform: translate3d(0, 0, 0) rotate(-180deg); } + .scroll-refresher.active.refreshing { + -webkit-transition: -webkit-transform 0.2s; + transition: -webkit-transform 0.2s; + -webkit-transition: transform 0.2s; + transition: transform 0.2s; + -webkit-transform: scale(1, 1); + transform: scale(1, 1); } + .scroll-refresher.active.refreshing .icon-pulling, + .scroll-refresher.active.refreshing .text-pulling { + display: none; } + .scroll-refresher.active.refreshing .icon-refreshing, + .scroll-refresher.active.refreshing .text-refreshing { + display: block; } + .scroll-refresher.active.refreshing.refreshing-tail { + -webkit-transform: scale(0, 0); + transform: scale(0, 0); } + +.overflow-scroll > .scroll { + -webkit-overflow-scrolling: touch; + width: 100%; } + .overflow-scroll > .scroll.overscroll { + position: fixed; + right: 0; + left: 0; } + +.overflow-scroll.padding > .scroll.overscroll { + padding: 10px; } + +@-webkit-keyframes refresh-spin { + 0% { + -webkit-transform: translate3d(0, 0, 0) rotate(0); } + 100% { + -webkit-transform: translate3d(0, 0, 0) rotate(180deg); } } + +@keyframes refresh-spin { + 0% { + transform: translate3d(0, 0, 0) rotate(0); } + 100% { + transform: translate3d(0, 0, 0) rotate(180deg); } } + +@-webkit-keyframes refresh-spin-back { + 0% { + -webkit-transform: translate3d(0, 0, 0) rotate(180deg); } + 100% { + -webkit-transform: translate3d(0, 0, 0) rotate(0); } } + +@keyframes refresh-spin-back { + 0% { + transform: translate3d(0, 0, 0) rotate(180deg); } + 100% { + transform: translate3d(0, 0, 0) rotate(0); } } + +/** + * Spinners + * -------------------------------------------------- + */ +.spinner { + stroke: #444; + fill: #444; } + .spinner svg { + width: 28px; + height: 28px; } + .spinner.spinner-light { + stroke: #fff; + fill: #fff; } + .spinner.spinner-stable { + stroke: #f8f8f8; + fill: #f8f8f8; } + .spinner.spinner-positive { + stroke: #387ef5; + fill: #387ef5; } + .spinner.spinner-calm { + stroke: #11c1f3; + fill: #11c1f3; } + .spinner.spinner-balanced { + stroke: #33cd5f; + fill: #33cd5f; } + .spinner.spinner-assertive { + stroke: #ef473a; + fill: #ef473a; } + .spinner.spinner-energized { + stroke: #ffc900; + fill: #ffc900; } + .spinner.spinner-royal { + stroke: #886aea; + fill: #886aea; } + .spinner.spinner-dark { + stroke: #444; + fill: #444; } + +.spinner-android { + stroke: #4b8bf4; } + +.spinner-ios, +.spinner-ios-small { + stroke: #69717d; } + +.spinner-spiral .stop1 { + stop-color: #fff; + stop-opacity: 0; } + +.spinner-spiral.spinner-light .stop1 { + stop-color: #444; } + +.spinner-spiral.spinner-light .stop2 { + stop-color: #fff; } + +.spinner-spiral.spinner-stable .stop2 { + stop-color: #f8f8f8; } + +.spinner-spiral.spinner-positive .stop2 { + stop-color: #387ef5; } + +.spinner-spiral.spinner-calm .stop2 { + stop-color: #11c1f3; } + +.spinner-spiral.spinner-balanced .stop2 { + stop-color: #33cd5f; } + +.spinner-spiral.spinner-assertive .stop2 { + stop-color: #ef473a; } + +.spinner-spiral.spinner-energized .stop2 { + stop-color: #ffc900; } + +.spinner-spiral.spinner-royal .stop2 { + stop-color: #886aea; } + +.spinner-spiral.spinner-dark .stop2 { + stop-color: #444; } + +/** + * Forms + * -------------------------------------------------- + */ +form { + margin: 0 0 1.42857; } + +legend { + display: block; + margin-bottom: 1.42857; + padding: 0; + width: 100%; + border: 1px solid #ddd; + color: #444; + font-size: 21px; + line-height: 2.85714; } + legend small { + color: #f8f8f8; + font-size: 1.07143; } + +label, +input, +button, +select, +textarea { + font-weight: normal; + font-size: 14px; + line-height: 1.42857; } + +input, +button, +select, +textarea { + font-family: "-apple-system", "Helvetica Neue", "Roboto", "Segoe UI", sans-serif; } + +.item-input { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: relative; + overflow: hidden; + padding: 6px 0 5px 16px; } + .item-input input { + -webkit-border-radius: 0; + border-radius: 0; + -webkit-box-flex: 1; + -webkit-flex: 1 220px; + -moz-box-flex: 1; + -moz-flex: 1 220px; + -ms-flex: 1 220px; + flex: 1 220px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + margin: 0; + padding-right: 24px; + background-color: transparent; } + .item-input .button .icon { + -webkit-box-flex: 0; + -webkit-flex: 0 0 24px; + -moz-box-flex: 0; + -moz-flex: 0 0 24px; + -ms-flex: 0 0 24px; + flex: 0 0 24px; + position: static; + display: inline-block; + height: auto; + text-align: center; + font-size: 16px; } + .item-input .button-bar { + -webkit-border-radius: 0; + border-radius: 0; + -webkit-box-flex: 1; + -webkit-flex: 1 0 220px; + -moz-box-flex: 1; + -moz-flex: 1 0 220px; + -ms-flex: 1 0 220px; + flex: 1 0 220px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + .item-input .icon { + min-width: 14px; } + +.platform-windowsphone .item-input input { + flex-shrink: 1; } + +.item-input-inset { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + position: relative; + overflow: hidden; + padding: 10.66667px; } + +.item-input-wrapper { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1 0; + -moz-box-flex: 1; + -moz-flex: 1 0; + -ms-flex: 1 0; + flex: 1 0; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + -webkit-border-radius: 4px; + border-radius: 4px; + padding-right: 8px; + padding-left: 8px; + background: #eee; } + +.item-input-inset .item-input-wrapper input { + padding-left: 4px; + height: 29px; + background: transparent; + line-height: 18px; } + +.item-input-wrapper ~ .button { + margin-left: 10.66667px; } + +.input-label { + display: table; + padding: 7px 10px 7px 0px; + max-width: 200px; + width: 35%; + color: #444; + font-size: 16px; } + +.placeholder-icon { + color: #aaa; } + .placeholder-icon:first-child { + padding-right: 6px; } + .placeholder-icon:last-child { + padding-left: 6px; } + +.item-stacked-label { + display: block; + background-color: transparent; + box-shadow: none; } + .item-stacked-label .input-label, .item-stacked-label .icon { + display: inline-block; + padding: 4px 0 0 0px; + vertical-align: middle; } + +.item-stacked-label input, +.item-stacked-label textarea { + -webkit-border-radius: 2px; + border-radius: 2px; + padding: 4px 8px 3px 0; + border: none; + background-color: #fff; } + +.item-stacked-label input { + overflow: hidden; + height: 46px; } + +.item-select.item-stacked-label select { + position: relative; + padding: 0px; + max-width: 90%; + direction: ltr; + white-space: pre-wrap; + margin: -3px; } + +.item-floating-label { + display: block; + background-color: transparent; + box-shadow: none; } + .item-floating-label .input-label { + position: relative; + padding: 5px 0 0 0; + opacity: 0; + top: 10px; + -webkit-transition: opacity 0.15s ease-in, top 0.2s linear; + transition: opacity 0.15s ease-in, top 0.2s linear; } + .item-floating-label .input-label.has-input { + opacity: 1; + top: 0; + -webkit-transition: opacity 0.15s ease-in, top 0.2s linear; + transition: opacity 0.15s ease-in, top 0.2s linear; } + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"] { + display: block; + padding-top: 2px; + padding-left: 0; + height: 34px; + color: #111; + vertical-align: middle; + font-size: 14px; + line-height: 16px; } + +.platform-ios input[type="datetime-local"], +.platform-ios input[type="date"], +.platform-ios input[type="month"], +.platform-ios input[type="time"], +.platform-ios input[type="week"], +.platform-android input[type="datetime-local"], +.platform-android input[type="date"], +.platform-android input[type="month"], +.platform-android input[type="time"], +.platform-android input[type="week"] { + padding-top: 8px; } + +.item-input input, +.item-input textarea { + width: 100%; } + +textarea { + padding-left: 0; } + textarea::-moz-placeholder { + color: #aaaaaa; } + textarea:-ms-input-placeholder { + color: #aaaaaa; } + textarea::-webkit-input-placeholder { + color: #aaaaaa; + text-indent: -3px; } + +textarea { + height: auto; } + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"] { + border: 0; } + +input[type="radio"], +input[type="checkbox"] { + margin: 0; + line-height: normal; } + +.item-input input[type="file"], +.item-input input[type="image"], +.item-input input[type="submit"], +.item-input input[type="reset"], +.item-input input[type="button"], +.item-input input[type="radio"], +.item-input input[type="checkbox"] { + width: auto; } + +input[type="file"] { + line-height: 34px; } + +.previous-input-focus, +.cloned-text-input + input, +.cloned-text-input + textarea { + position: absolute !important; + left: -9999px; + width: 200px; } + +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #aaaaaa; } + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #aaaaaa; } + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #aaaaaa; + text-indent: 0; } + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly]:not(.cloned-text-input), +textarea[readonly]:not(.cloned-text-input), +select[readonly] { + background-color: #f8f8f8; + cursor: not-allowed; } + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; } + +/** + * Checkbox + * -------------------------------------------------- + */ +.checkbox { + position: relative; + display: inline-block; + padding: 7px 7px; + cursor: pointer; } + .checkbox input:before, + .checkbox .checkbox-icon:before { + border-color: #ddd; } + .checkbox input:checked:before, + .checkbox input:checked + .checkbox-icon:before { + background: #387ef5; + border-color: #387ef5; } + +.checkbox-light input:before, +.checkbox-light .checkbox-icon:before { + border-color: #ddd; } + +.checkbox-light input:checked:before, +.checkbox-light input:checked + .checkbox-icon:before { + background: #ddd; + border-color: #ddd; } + +.checkbox-stable input:before, +.checkbox-stable .checkbox-icon:before { + border-color: #b2b2b2; } + +.checkbox-stable input:checked:before, +.checkbox-stable input:checked + .checkbox-icon:before { + background: #b2b2b2; + border-color: #b2b2b2; } + +.checkbox-positive input:before, +.checkbox-positive .checkbox-icon:before { + border-color: #387ef5; } + +.checkbox-positive input:checked:before, +.checkbox-positive input:checked + .checkbox-icon:before { + background: #387ef5; + border-color: #387ef5; } + +.checkbox-calm input:before, +.checkbox-calm .checkbox-icon:before { + border-color: #11c1f3; } + +.checkbox-calm input:checked:before, +.checkbox-calm input:checked + .checkbox-icon:before { + background: #11c1f3; + border-color: #11c1f3; } + +.checkbox-assertive input:before, +.checkbox-assertive .checkbox-icon:before { + border-color: #ef473a; } + +.checkbox-assertive input:checked:before, +.checkbox-assertive input:checked + .checkbox-icon:before { + background: #ef473a; + border-color: #ef473a; } + +.checkbox-balanced input:before, +.checkbox-balanced .checkbox-icon:before { + border-color: #33cd5f; } + +.checkbox-balanced input:checked:before, +.checkbox-balanced input:checked + .checkbox-icon:before { + background: #33cd5f; + border-color: #33cd5f; } + +.checkbox-energized input:before, +.checkbox-energized .checkbox-icon:before { + border-color: #ffc900; } + +.checkbox-energized input:checked:before, +.checkbox-energized input:checked + .checkbox-icon:before { + background: #ffc900; + border-color: #ffc900; } + +.checkbox-royal input:before, +.checkbox-royal .checkbox-icon:before { + border-color: #886aea; } + +.checkbox-royal input:checked:before, +.checkbox-royal input:checked + .checkbox-icon:before { + background: #886aea; + border-color: #886aea; } + +.checkbox-dark input:before, +.checkbox-dark .checkbox-icon:before { + border-color: #444; } + +.checkbox-dark input:checked:before, +.checkbox-dark input:checked + .checkbox-icon:before { + background: #444; + border-color: #444; } + +.checkbox input:disabled:before, +.checkbox input:disabled + .checkbox-icon:before { + border-color: #ddd; } + +.checkbox input:disabled:checked:before, +.checkbox input:disabled:checked + .checkbox-icon:before { + background: #ddd; } + +.checkbox.checkbox-input-hidden input { + display: none !important; } + +.checkbox input, +.checkbox-icon { + position: relative; + width: 28px; + height: 28px; + display: block; + border: 0; + background: transparent; + cursor: pointer; + -webkit-appearance: none; } + .checkbox input:before, + .checkbox-icon:before { + display: table; + width: 100%; + height: 100%; + border-width: 1px; + border-style: solid; + border-radius: 28px; + background: #fff; + content: ' '; + -webkit-transition: background-color 20ms ease-in-out; + transition: background-color 20ms ease-in-out; } + +.checkbox input:checked:before, +input:checked + .checkbox-icon:before { + border-width: 2px; } + +.checkbox input:after, +.checkbox-icon:after { + -webkit-transition: opacity 0.05s ease-in-out; + transition: opacity 0.05s ease-in-out; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + position: absolute; + top: 33%; + left: 25%; + display: table; + width: 14px; + height: 6px; + border: 1px solid #fff; + border-top: 0; + border-right: 0; + content: ' '; + opacity: 0; } + +.platform-android .checkbox-platform input:before, +.platform-android .checkbox-platform .checkbox-icon:before, +.checkbox-square input:before, +.checkbox-square .checkbox-icon:before { + border-radius: 2px; + width: 72%; + height: 72%; + margin-top: 14%; + margin-left: 14%; + border-width: 2px; } + +.platform-android .checkbox-platform input:after, +.platform-android .checkbox-platform .checkbox-icon:after, +.checkbox-square input:after, +.checkbox-square .checkbox-icon:after { + border-width: 2px; + top: 19%; + left: 25%; + width: 13px; + height: 7px; } + +.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after { + top: 31%; } + +.grade-c .checkbox input:after, +.grade-c .checkbox-icon:after { + -webkit-transform: rotate(0); + transform: rotate(0); + top: 3px; + left: 4px; + border: none; + color: #fff; + content: '\2713'; + font-weight: bold; + font-size: 20px; } + +.checkbox input:checked:after, +input:checked + .checkbox-icon:after { + opacity: 1; } + +.item-checkbox { + padding-left: 60px; } + .item-checkbox.active { + box-shadow: none; } + +.item-checkbox .checkbox { + position: absolute; + top: 50%; + right: 8px; + left: 8px; + z-index: 3; + margin-top: -21px; } + +.item-checkbox.item-checkbox-right { + padding-right: 60px; + padding-left: 16px; } + +.item-checkbox-right .checkbox input, +.item-checkbox-right .checkbox-icon { + float: right; } + +/** + * Toggle + * -------------------------------------------------- + */ +.item-toggle { + pointer-events: none; } + +.toggle { + position: relative; + display: inline-block; + pointer-events: auto; + margin: -5px; + padding: 5px; } + .toggle input:checked + .track { + border-color: #4cd964; + background-color: #4cd964; } + .toggle.dragging .handle { + background-color: #f2f2f2 !important; } + +.toggle.toggle-light input:checked + .track { + border-color: #ddd; + background-color: #ddd; } + +.toggle.toggle-stable input:checked + .track { + border-color: #b2b2b2; + background-color: #b2b2b2; } + +.toggle.toggle-positive input:checked + .track { + border-color: #387ef5; + background-color: #387ef5; } + +.toggle.toggle-calm input:checked + .track { + border-color: #11c1f3; + background-color: #11c1f3; } + +.toggle.toggle-assertive input:checked + .track { + border-color: #ef473a; + background-color: #ef473a; } + +.toggle.toggle-balanced input:checked + .track { + border-color: #33cd5f; + background-color: #33cd5f; } + +.toggle.toggle-energized input:checked + .track { + border-color: #ffc900; + background-color: #ffc900; } + +.toggle.toggle-royal input:checked + .track { + border-color: #886aea; + background-color: #886aea; } + +.toggle.toggle-dark input:checked + .track { + border-color: #444; + background-color: #444; } + +.toggle input { + display: none; } + +/* the track appearance when the toggle is "off" */ +.toggle .track { + -webkit-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-duration: 0.3s; + transition-duration: 0.3s; + -webkit-transition-property: background-color, border; + transition-property: background-color, border; + display: inline-block; + box-sizing: border-box; + width: 51px; + height: 31px; + border: solid 2px #e6e6e6; + border-radius: 20px; + background-color: #fff; + content: ' '; + cursor: pointer; + pointer-events: none; } + +/* Fix to avoid background color bleeding */ +/* (occured on (at least) Android 4.2, Asus MeMO Pad HD7 ME173X) */ +.platform-android4_2 .toggle .track { + -webkit-background-clip: padding-box; } + +/* the handle (circle) thats inside the toggle's track area */ +/* also the handle's appearance when it is "off" */ +.toggle .handle { + -webkit-transition: 0.3s cubic-bezier(0, 1.1, 1, 1.1); + transition: 0.3s cubic-bezier(0, 1.1, 1, 1.1); + -webkit-transition-property: background-color, transform; + transition-property: background-color, transform; + position: absolute; + display: block; + width: 27px; + height: 27px; + border-radius: 27px; + background-color: #fff; + top: 7px; + left: 7px; + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.35), 0 1px 1px rgba(0, 0, 0, 0.15); } + .toggle .handle:before { + position: absolute; + top: -4px; + left: -21.5px; + padding: 18.5px 34px; + content: " "; } + +.toggle input:checked + .track .handle { + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + background-color: #fff; } + +.item-toggle.active { + box-shadow: none; } + +.item-toggle, +.item-toggle.item-complex .item-content { + padding-right: 99px; } + +.item-toggle.item-complex { + padding-right: 0; } + +.item-toggle .toggle { + position: absolute; + top: 10px; + right: 16px; + z-index: 3; } + +.toggle input:disabled + .track { + opacity: .6; } + +.toggle-small .track { + border: 0; + width: 34px; + height: 15px; + background: #9e9e9e; } + +.toggle-small input:checked + .track { + background: rgba(0, 150, 137, 0.5); } + +.toggle-small .handle { + top: 2px; + left: 4px; + width: 21px; + height: 21px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25); } + +.toggle-small input:checked + .track .handle { + -webkit-transform: translate3d(16px, 0, 0); + transform: translate3d(16px, 0, 0); + background: #009689; } + +.toggle-small.item-toggle .toggle { + top: 19px; } + +.toggle-small .toggle-light input:checked + .track { + background-color: rgba(221, 221, 221, 0.5); } + +.toggle-small .toggle-light input:checked + .track .handle { + background-color: #ddd; } + +.toggle-small .toggle-stable input:checked + .track { + background-color: rgba(178, 178, 178, 0.5); } + +.toggle-small .toggle-stable input:checked + .track .handle { + background-color: #b2b2b2; } + +.toggle-small .toggle-positive input:checked + .track { + background-color: rgba(56, 126, 245, 0.5); } + +.toggle-small .toggle-positive input:checked + .track .handle { + background-color: #387ef5; } + +.toggle-small .toggle-calm input:checked + .track { + background-color: rgba(17, 193, 243, 0.5); } + +.toggle-small .toggle-calm input:checked + .track .handle { + background-color: #11c1f3; } + +.toggle-small .toggle-assertive input:checked + .track { + background-color: rgba(239, 71, 58, 0.5); } + +.toggle-small .toggle-assertive input:checked + .track .handle { + background-color: #ef473a; } + +.toggle-small .toggle-balanced input:checked + .track { + background-color: rgba(51, 205, 95, 0.5); } + +.toggle-small .toggle-balanced input:checked + .track .handle { + background-color: #33cd5f; } + +.toggle-small .toggle-energized input:checked + .track { + background-color: rgba(255, 201, 0, 0.5); } + +.toggle-small .toggle-energized input:checked + .track .handle { + background-color: #ffc900; } + +.toggle-small .toggle-royal input:checked + .track { + background-color: rgba(136, 106, 234, 0.5); } + +.toggle-small .toggle-royal input:checked + .track .handle { + background-color: #886aea; } + +.toggle-small .toggle-dark input:checked + .track { + background-color: rgba(68, 68, 68, 0.5); } + +.toggle-small .toggle-dark input:checked + .track .handle { + background-color: #444; } + +/** + * Radio Button Inputs + * -------------------------------------------------- + */ +.item-radio { + padding: 0; } + .item-radio:hover { + cursor: pointer; } + +.item-radio .item-content { + /* give some room to the right for the checkmark icon */ + padding-right: 64px; } + +.item-radio .radio-icon { + /* checkmark icon will be hidden by default */ + position: absolute; + top: 0; + right: 0; + z-index: 3; + visibility: hidden; + padding: 14px; + height: 100%; + font-size: 24px; } + +.item-radio input { + /* hide any radio button inputs elements (the ugly circles) */ + position: absolute; + left: -9999px; } + .item-radio input:checked + .radio-content .item-content { + /* style the item content when its checked */ + background: #f7f7f7; } + .item-radio input:checked + .radio-content .radio-icon { + /* show the checkmark icon when its checked */ + visibility: visible; } + +/** + * Range + * -------------------------------------------------- + */ +.range input { + display: inline-block; + overflow: hidden; + margin-top: 5px; + margin-bottom: 5px; + padding-right: 2px; + padding-left: 1px; + width: auto; + height: 43px; + outline: none; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ccc), color-stop(100%, #ccc)); + background: linear-gradient(to right, #ccc 0%, #ccc 100%); + background-position: center; + background-size: 99% 2px; + background-repeat: no-repeat; + -webkit-appearance: none; + /* + &::-ms-track{ + background: transparent; + border-color: transparent; + border-width: 11px 0 16px; + color:transparent; + margin-top:20px; + } + &::-ms-thumb { + width: $range-slider-width; + height: $range-slider-height; + border-radius: $range-slider-border-radius; + background-color: $toggle-handle-off-bg-color; + border-color:$toggle-handle-off-bg-color; + box-shadow: $range-slider-box-shadow; + margin-left:1px; + margin-right:1px; + outline:none; + } + &::-ms-fill-upper { + height: $range-track-height; + background:$range-default-track-bg; + } + */ } + .range input::-moz-focus-outer { + /* hide the focus outline in Firefox */ + border: 0; } + .range input::-webkit-slider-thumb { + position: relative; + width: 28px; + height: 28px; + border-radius: 50%; + background-color: #fff; + box-shadow: 0 0 2px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2); + cursor: pointer; + -webkit-appearance: none; + border: 0; } + .range input::-webkit-slider-thumb:before { + /* what creates the colorful line on the left side of the slider */ + position: absolute; + top: 13px; + left: -2001px; + width: 2000px; + height: 2px; + background: #444; + content: ' '; } + .range input::-webkit-slider-thumb:after { + /* create a larger (but hidden) hit area */ + position: absolute; + top: -15px; + left: -15px; + padding: 30px; + content: ' '; } + .range input::-ms-fill-lower { + height: 2px; + background: #444; } + +.range { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; + padding: 2px 11px; } + .range.range-light input::-webkit-slider-thumb:before { + background: #ddd; } + .range.range-light input::-ms-fill-lower { + background: #ddd; } + .range.range-stable input::-webkit-slider-thumb:before { + background: #b2b2b2; } + .range.range-stable input::-ms-fill-lower { + background: #b2b2b2; } + .range.range-positive input::-webkit-slider-thumb:before { + background: #387ef5; } + .range.range-positive input::-ms-fill-lower { + background: #387ef5; } + .range.range-calm input::-webkit-slider-thumb:before { + background: #11c1f3; } + .range.range-calm input::-ms-fill-lower { + background: #11c1f3; } + .range.range-balanced input::-webkit-slider-thumb:before { + background: #33cd5f; } + .range.range-balanced input::-ms-fill-lower { + background: #33cd5f; } + .range.range-assertive input::-webkit-slider-thumb:before { + background: #ef473a; } + .range.range-assertive input::-ms-fill-lower { + background: #ef473a; } + .range.range-energized input::-webkit-slider-thumb:before { + background: #ffc900; } + .range.range-energized input::-ms-fill-lower { + background: #ffc900; } + .range.range-royal input::-webkit-slider-thumb:before { + background: #886aea; } + .range.range-royal input::-ms-fill-lower { + background: #886aea; } + .range.range-dark input::-webkit-slider-thumb:before { + background: #444; } + .range.range-dark input::-ms-fill-lower { + background: #444; } + +.range .icon { + -webkit-box-flex: 0; + -webkit-flex: 0; + -moz-box-flex: 0; + -moz-flex: 0; + -ms-flex: 0; + flex: 0; + display: block; + min-width: 24px; + text-align: center; + font-size: 24px; } + +.range input { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + margin-right: 10px; + margin-left: 10px; } + +.range-label { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -moz-box-flex: 0; + -moz-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + display: block; + white-space: nowrap; } + +.range-label:first-child { + padding-left: 5px; } + +.range input + .range-label { + padding-right: 5px; + padding-left: 0; } + +.platform-windowsphone .range input { + height: auto; } + +/** + * Select + * -------------------------------------------------- + */ +.item-select { + position: relative; } + .item-select select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + position: absolute; + top: 0; + bottom: 0; + right: 0; + padding: 0 48px 0 16px; + max-width: 65%; + border: none; + background: #fff; + color: #333; + text-indent: .01px; + text-overflow: ''; + white-space: nowrap; + font-size: 14px; + cursor: pointer; + direction: rtl; } + .item-select select::-ms-expand { + display: none; } + .item-select option { + direction: ltr; } + .item-select:after { + position: absolute; + top: 50%; + right: 16px; + margin-top: -3px; + width: 0; + height: 0; + border-top: 5px solid; + border-right: 5px solid transparent; + border-left: 5px solid transparent; + color: #999; + content: ""; + pointer-events: none; } + .item-select.item-light select { + background: #fff; + color: #444; } + .item-select.item-stable select { + background: #f8f8f8; + color: #444; } + .item-select.item-stable:after, .item-select.item-stable .input-label { + color: #666666; } + .item-select.item-positive select { + background: #387ef5; + color: #fff; } + .item-select.item-positive:after, .item-select.item-positive .input-label { + color: #fff; } + .item-select.item-calm select { + background: #11c1f3; + color: #fff; } + .item-select.item-calm:after, .item-select.item-calm .input-label { + color: #fff; } + .item-select.item-assertive select { + background: #ef473a; + color: #fff; } + .item-select.item-assertive:after, .item-select.item-assertive .input-label { + color: #fff; } + .item-select.item-balanced select { + background: #33cd5f; + color: #fff; } + .item-select.item-balanced:after, .item-select.item-balanced .input-label { + color: #fff; } + .item-select.item-energized select { + background: #ffc900; + color: #fff; } + .item-select.item-energized:after, .item-select.item-energized .input-label { + color: #fff; } + .item-select.item-royal select { + background: #886aea; + color: #fff; } + .item-select.item-royal:after, .item-select.item-royal .input-label { + color: #fff; } + .item-select.item-dark select { + background: #444; + color: #fff; } + .item-select.item-dark:after, .item-select.item-dark .input-label { + color: #fff; } + +select[multiple], select[size] { + height: auto; } + +/** + * Progress + * -------------------------------------------------- + */ +progress { + display: block; + margin: 15px auto; + width: 100%; } + +/** + * Buttons + * -------------------------------------------------- + */ +.button { + border-color: transparent; + background-color: #f8f8f8; + color: #444; + position: relative; + display: inline-block; + margin: 0; + padding: 0 12px; + min-width: 52px; + min-height: 47px; + border-width: 1px; + border-style: solid; + border-radius: 4px; + vertical-align: top; + text-align: center; + text-overflow: ellipsis; + font-size: 16px; + line-height: 42px; + cursor: pointer; } + .button:hover { + color: #444; + text-decoration: none; } + .button.active, .button.activated { + background-color: #e5e5e5; } + .button:after { + position: absolute; + top: -6px; + right: -6px; + bottom: -6px; + left: -6px; + content: ' '; } + .button .icon { + vertical-align: top; + pointer-events: none; } + .button .icon:before, .button.icon:before, .button.icon-left:before, .button.icon-right:before { + display: inline-block; + padding: 0 0 1px 0; + vertical-align: inherit; + font-size: 24px; + line-height: 41px; + pointer-events: none; } + .button.icon-left:before { + float: left; + padding-right: .2em; + padding-left: 0; } + .button.icon-right:before { + float: right; + padding-right: 0; + padding-left: .2em; } + .button.button-block, .button.button-full { + margin-top: 10px; + margin-bottom: 10px; } + .button.button-light { + border-color: transparent; + background-color: #fff; + color: #444; } + .button.button-light:hover { + color: #444; + text-decoration: none; } + .button.button-light.active, .button.button-light.activated { + background-color: #fafafa; } + .button.button-light.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #ddd; } + .button.button-light.button-icon { + border-color: transparent; + background: none; } + .button.button-light.button-outline { + border-color: #ddd; + background: transparent; + color: #ddd; } + .button.button-light.button-outline.active, .button.button-light.button-outline.activated { + background-color: #ddd; + box-shadow: none; + color: #fff; } + .button.button-stable { + border-color: transparent; + background-color: #f8f8f8; + color: #444; } + .button.button-stable:hover { + color: #444; + text-decoration: none; } + .button.button-stable.active, .button.button-stable.activated { + background-color: #e5e5e5; } + .button.button-stable.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #b2b2b2; } + .button.button-stable.button-icon { + border-color: transparent; + background: none; } + .button.button-stable.button-outline { + border-color: #b2b2b2; + background: transparent; + color: #b2b2b2; } + .button.button-stable.button-outline.active, .button.button-stable.button-outline.activated { + background-color: #b2b2b2; + box-shadow: none; + color: #fff; } + .button.button-positive { + border-color: transparent; + background-color: #387ef5; + color: #fff; } + .button.button-positive:hover { + color: #fff; + text-decoration: none; } + .button.button-positive.active, .button.button-positive.activated { + background-color: #0c60ee; } + .button.button-positive.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #387ef5; } + .button.button-positive.button-icon { + border-color: transparent; + background: none; } + .button.button-positive.button-outline { + border-color: #387ef5; + background: transparent; + color: #387ef5; } + .button.button-positive.button-outline.active, .button.button-positive.button-outline.activated { + background-color: #387ef5; + box-shadow: none; + color: #fff; } + .button.button-calm { + border-color: transparent; + background-color: #11c1f3; + color: #fff; } + .button.button-calm:hover { + color: #fff; + text-decoration: none; } + .button.button-calm.active, .button.button-calm.activated { + background-color: #0a9dc7; } + .button.button-calm.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #11c1f3; } + .button.button-calm.button-icon { + border-color: transparent; + background: none; } + .button.button-calm.button-outline { + border-color: #11c1f3; + background: transparent; + color: #11c1f3; } + .button.button-calm.button-outline.active, .button.button-calm.button-outline.activated { + background-color: #11c1f3; + box-shadow: none; + color: #fff; } + .button.button-assertive { + border-color: transparent; + background-color: #ef473a; + color: #fff; } + .button.button-assertive:hover { + color: #fff; + text-decoration: none; } + .button.button-assertive.active, .button.button-assertive.activated { + background-color: #e42112; } + .button.button-assertive.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #ef473a; } + .button.button-assertive.button-icon { + border-color: transparent; + background: none; } + .button.button-assertive.button-outline { + border-color: #ef473a; + background: transparent; + color: #ef473a; } + .button.button-assertive.button-outline.active, .button.button-assertive.button-outline.activated { + background-color: #ef473a; + box-shadow: none; + color: #fff; } + .button.button-balanced { + border-color: transparent; + background-color: #33cd5f; + color: #fff; } + .button.button-balanced:hover { + color: #fff; + text-decoration: none; } + .button.button-balanced.active, .button.button-balanced.activated { + background-color: #28a54c; } + .button.button-balanced.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #33cd5f; } + .button.button-balanced.button-icon { + border-color: transparent; + background: none; } + .button.button-balanced.button-outline { + border-color: #33cd5f; + background: transparent; + color: #33cd5f; } + .button.button-balanced.button-outline.active, .button.button-balanced.button-outline.activated { + background-color: #33cd5f; + box-shadow: none; + color: #fff; } + .button.button-energized { + border-color: transparent; + background-color: #ffc900; + color: #fff; } + .button.button-energized:hover { + color: #fff; + text-decoration: none; } + .button.button-energized.active, .button.button-energized.activated { + background-color: #e6b500; } + .button.button-energized.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #ffc900; } + .button.button-energized.button-icon { + border-color: transparent; + background: none; } + .button.button-energized.button-outline { + border-color: #ffc900; + background: transparent; + color: #ffc900; } + .button.button-energized.button-outline.active, .button.button-energized.button-outline.activated { + background-color: #ffc900; + box-shadow: none; + color: #fff; } + .button.button-royal { + border-color: transparent; + background-color: #886aea; + color: #fff; } + .button.button-royal:hover { + color: #fff; + text-decoration: none; } + .button.button-royal.active, .button.button-royal.activated { + background-color: #6b46e5; } + .button.button-royal.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #886aea; } + .button.button-royal.button-icon { + border-color: transparent; + background: none; } + .button.button-royal.button-outline { + border-color: #886aea; + background: transparent; + color: #886aea; } + .button.button-royal.button-outline.active, .button.button-royal.button-outline.activated { + background-color: #886aea; + box-shadow: none; + color: #fff; } + .button.button-dark { + border-color: transparent; + background-color: #444; + color: #fff; } + .button.button-dark:hover { + color: #fff; + text-decoration: none; } + .button.button-dark.active, .button.button-dark.activated { + background-color: #262626; } + .button.button-dark.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #444; } + .button.button-dark.button-icon { + border-color: transparent; + background: none; } + .button.button-dark.button-outline { + border-color: #444; + background: transparent; + color: #444; } + .button.button-dark.button-outline.active, .button.button-dark.button-outline.activated { + background-color: #444; + box-shadow: none; + color: #fff; } + +.button-small { + padding: 2px 4px 1px; + min-width: 28px; + min-height: 30px; + font-size: 12px; + line-height: 26px; } + .button-small .icon:before, .button-small.icon:before, .button-small.icon-left:before, .button-small.icon-right:before { + font-size: 16px; + line-height: 19px; + margin-top: 3px; } + +.button-large { + padding: 0 16px; + min-width: 68px; + min-height: 59px; + font-size: 20px; + line-height: 53px; } + .button-large .icon:before, .button-large.icon:before, .button-large.icon-left:before, .button-large.icon-right:before { + padding-bottom: 2px; + font-size: 32px; + line-height: 51px; } + +.button-icon { + -webkit-transition: opacity 0.1s; + transition: opacity 0.1s; + padding: 0 6px; + min-width: initial; + border-color: transparent; + background: none; } + .button-icon.button.active, .button-icon.button.activated { + border-color: transparent; + background: none; + box-shadow: none; + opacity: 0.3; } + .button-icon .icon:before, .button-icon.icon:before { + font-size: 32px; } + +.button-clear { + -webkit-transition: opacity 0.1s; + transition: opacity 0.1s; + padding: 0 6px; + max-height: 42px; + border-color: transparent; + background: none; + box-shadow: none; } + .button-clear.button-clear { + border-color: transparent; + background: none; + box-shadow: none; + color: #b2b2b2; } + .button-clear.button-icon { + border-color: transparent; + background: none; } + .button-clear.active, .button-clear.activated { + opacity: 0.3; } + +.button-outline { + -webkit-transition: opacity 0.1s; + transition: opacity 0.1s; + background: none; + box-shadow: none; } + .button-outline.button-outline { + border-color: #b2b2b2; + background: transparent; + color: #b2b2b2; } + .button-outline.button-outline.active, .button-outline.button-outline.activated { + background-color: #b2b2b2; + box-shadow: none; + color: #fff; } + +.padding > .button.button-block:first-child { + margin-top: 0; } + +.button-block { + display: block; + clear: both; } + .button-block:after { + clear: both; } + +.button-full, +.button-full > .button { + display: block; + margin-right: 0; + margin-left: 0; + border-right-width: 0; + border-left-width: 0; + border-radius: 0; } + +button.button-block, +button.button-full, +.button-full > button.button, +input.button.button-block { + width: 100%; } + +a.button { + text-decoration: none; } + a.button .icon:before, a.button.icon:before, a.button.icon-left:before, a.button.icon-right:before { + margin-top: 2px; } + +.button.disabled, +.button[disabled] { + opacity: .4; + cursor: default !important; + pointer-events: none; } + +/** + * Button Bar + * -------------------------------------------------- + */ +.button-bar { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + width: 100%; } + .button-bar.button-bar-inline { + display: block; + width: auto; + *zoom: 1; } + .button-bar.button-bar-inline:before, .button-bar.button-bar-inline:after { + display: table; + content: ""; + line-height: 0; } + .button-bar.button-bar-inline:after { + clear: both; } + .button-bar.button-bar-inline > .button { + width: auto; + display: inline-block; + float: left; } + +.button-bar > .button { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + overflow: hidden; + padding: 0 16px; + width: 0; + border-width: 1px 0px 1px 1px; + border-radius: 0; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; } + .button-bar > .button:before, + .button-bar > .button .icon:before { + line-height: 44px; } + .button-bar > .button:first-child { + border-radius: 4px 0px 0px 4px; } + .button-bar > .button:last-child { + border-right-width: 1px; + border-radius: 0px 4px 4px 0px; } + .button-bar > .button:only-child { + border-radius: 4px; } + +.button-bar > .button-small:before, +.button-bar > .button-small .icon:before { + line-height: 28px; } + +/** + * Grid + * -------------------------------------------------- + * Using flexbox for the grid, inspired by Philip Walton: + * http://philipwalton.github.io/solved-by-flexbox/demos/grids/ + * By default each .col within a .row will evenly take up + * available width, and the height of each .col with take + * up the height of the tallest .col in the same .row. + */ +.row { + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -moz-flex; + display: -ms-flexbox; + display: flex; + padding: 5px; + width: 100%; } + +.row-wrap { + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + +.row-no-padding { + padding: 0; } + .row-no-padding > .col { + padding: 0; } + +.row + .row { + margin-top: -5px; + padding-top: 0; } + +.col { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + display: block; + padding: 5px; + width: 100%; } + +/* Vertically Align Columns */ +/* .row-* vertically aligns every .col in the .row */ +.row-top { + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + -moz-align-items: flex-start; + align-items: flex-start; } + +.row-bottom { + -webkit-box-align: end; + -ms-flex-align: end; + -webkit-align-items: flex-end; + -moz-align-items: flex-end; + align-items: flex-end; } + +.row-center { + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + -moz-align-items: center; + align-items: center; } + +.row-stretch { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + -webkit-align-items: stretch; + -moz-align-items: stretch; + align-items: stretch; } + +.row-baseline { + -webkit-box-align: baseline; + -ms-flex-align: baseline; + -webkit-align-items: baseline; + -moz-align-items: baseline; + align-items: baseline; } + +/* .col-* vertically aligns an individual .col */ +.col-top { + -webkit-align-self: flex-start; + -moz-align-self: flex-start; + -ms-flex-item-align: start; + align-self: flex-start; } + +.col-bottom { + -webkit-align-self: flex-end; + -moz-align-self: flex-end; + -ms-flex-item-align: end; + align-self: flex-end; } + +.col-center { + -webkit-align-self: center; + -moz-align-self: center; + -ms-flex-item-align: center; + align-self: center; } + +/* Column Offsets */ +.col-offset-10 { + margin-left: 10%; } + +.col-offset-20 { + margin-left: 20%; } + +.col-offset-25 { + margin-left: 25%; } + +.col-offset-33, .col-offset-34 { + margin-left: 33.3333%; } + +.col-offset-50 { + margin-left: 50%; } + +.col-offset-66, .col-offset-67 { + margin-left: 66.6666%; } + +.col-offset-75 { + margin-left: 75%; } + +.col-offset-80 { + margin-left: 80%; } + +.col-offset-90 { + margin-left: 90%; } + +/* Explicit Column Percent Sizes */ +/* By default each grid column will evenly distribute */ +/* across the grid. However, you can specify individual */ +/* columns to take up a certain size of the available area */ +.col-10 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 10%; + -moz-box-flex: 0; + -moz-flex: 0 0 10%; + -ms-flex: 0 0 10%; + flex: 0 0 10%; + max-width: 10%; } + +.col-20 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 20%; + -moz-box-flex: 0; + -moz-flex: 0 0 20%; + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; } + +.col-25 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 25%; + -moz-box-flex: 0; + -moz-flex: 0 0 25%; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + +.col-33, .col-34 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 33.3333%; + -moz-box-flex: 0; + -moz-flex: 0 0 33.3333%; + -ms-flex: 0 0 33.3333%; + flex: 0 0 33.3333%; + max-width: 33.3333%; } + +.col-40 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 40%; + -moz-box-flex: 0; + -moz-flex: 0 0 40%; + -ms-flex: 0 0 40%; + flex: 0 0 40%; + max-width: 40%; } + +.col-50 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 50%; + -moz-box-flex: 0; + -moz-flex: 0 0 50%; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + +.col-60 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 60%; + -moz-box-flex: 0; + -moz-flex: 0 0 60%; + -ms-flex: 0 0 60%; + flex: 0 0 60%; + max-width: 60%; } + +.col-66, .col-67 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 66.6666%; + -moz-box-flex: 0; + -moz-flex: 0 0 66.6666%; + -ms-flex: 0 0 66.6666%; + flex: 0 0 66.6666%; + max-width: 66.6666%; } + +.col-75 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 75%; + -moz-box-flex: 0; + -moz-flex: 0 0 75%; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + +.col-80 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 80%; + -moz-box-flex: 0; + -moz-flex: 0 0 80%; + -ms-flex: 0 0 80%; + flex: 0 0 80%; + max-width: 80%; } + +.col-90 { + -webkit-box-flex: 0; + -webkit-flex: 0 0 90%; + -moz-box-flex: 0; + -moz-flex: 0 0 90%; + -ms-flex: 0 0 90%; + flex: 0 0 90%; + max-width: 90%; } + +/* Responsive Grid Classes */ +/* Adding a class of responsive-X to a row */ +/* will trigger the flex-direction to */ +/* change to column and add some margin */ +/* to any columns in the row for clearity */ +@media (max-width: 567px) { + .responsive-sm { + -webkit-box-direction: normal; + -moz-box-direction: normal; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .responsive-sm .col, .responsive-sm .col-10, .responsive-sm .col-20, .responsive-sm .col-25, .responsive-sm .col-33, .responsive-sm .col-34, .responsive-sm .col-50, .responsive-sm .col-66, .responsive-sm .col-67, .responsive-sm .col-75, .responsive-sm .col-80, .responsive-sm .col-90 { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + margin-bottom: 15px; + margin-left: 0; + max-width: 100%; + width: 100%; } } + +@media (max-width: 767px) { + .responsive-md { + -webkit-box-direction: normal; + -moz-box-direction: normal; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .responsive-md .col, .responsive-md .col-10, .responsive-md .col-20, .responsive-md .col-25, .responsive-md .col-33, .responsive-md .col-34, .responsive-md .col-50, .responsive-md .col-66, .responsive-md .col-67, .responsive-md .col-75, .responsive-md .col-80, .responsive-md .col-90 { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + margin-bottom: 15px; + margin-left: 0; + max-width: 100%; + width: 100%; } } + +@media (max-width: 1023px) { + .responsive-lg { + -webkit-box-direction: normal; + -moz-box-direction: normal; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; } + .responsive-lg .col, .responsive-lg .col-10, .responsive-lg .col-20, .responsive-lg .col-25, .responsive-lg .col-33, .responsive-lg .col-34, .responsive-lg .col-50, .responsive-lg .col-66, .responsive-lg .col-67, .responsive-lg .col-75, .responsive-lg .col-80, .responsive-lg .col-90 { + -webkit-box-flex: 1; + -webkit-flex: 1; + -moz-box-flex: 1; + -moz-flex: 1; + -ms-flex: 1; + flex: 1; + margin-bottom: 15px; + margin-left: 0; + max-width: 100%; + width: 100%; } } + +/** + * Utility Classes + * -------------------------------------------------- + */ +.hide { + display: none; } + +.opacity-hide { + opacity: 0; } + +.grade-b .opacity-hide, +.grade-c .opacity-hide { + opacity: 1; + display: none; } + +.show { + display: block; } + +.opacity-show { + opacity: 1; } + +.invisible { + visibility: hidden; } + +.keyboard-open .hide-on-keyboard-open { + display: none; } + +.keyboard-open .tabs.hide-on-keyboard-open + .pane .has-tabs, +.keyboard-open .bar-footer.hide-on-keyboard-open + .pane .has-footer { + bottom: 0; } + +.inline { + display: inline-block; } + +.disable-pointer-events { + pointer-events: none; } + +.enable-pointer-events { + pointer-events: auto; } + +.disable-user-behavior { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; + -webkit-user-drag: none; + -ms-touch-action: none; + -ms-content-zooming: none; } + +.click-block { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0; + z-index: 99999; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + overflow: hidden; } + +.click-block-hide { + -webkit-transform: translate3d(-9999px, 0, 0); + transform: translate3d(-9999px, 0, 0); } + +.no-resize { + resize: none; } + +.block { + display: block; + clear: both; } + .block:after { + display: block; + visibility: hidden; + clear: both; + height: 0; + content: "."; } + +.full-image { + width: 100%; } + +.clearfix { + *zoom: 1; } + .clearfix:before, .clearfix:after { + display: table; + content: ""; + line-height: 0; } + .clearfix:after { + clear: both; } + +/** + * Content Padding + * -------------------------------------------------- + */ +.padding { + padding: 10px; } + +.padding-top, +.padding-vertical { + padding-top: 10px; } + +.padding-right, +.padding-horizontal { + padding-right: 10px; } + +.padding-bottom, +.padding-vertical { + padding-bottom: 10px; } + +.padding-left, +.padding-horizontal { + padding-left: 10px; } + +/** + * Scrollable iFrames + * -------------------------------------------------- + */ +.iframe-wrapper { + position: fixed; + -webkit-overflow-scrolling: touch; + overflow: scroll; } + .iframe-wrapper iframe { + height: 100%; + width: 100%; } + +/** + * Rounded + * -------------------------------------------------- + */ +.rounded { + border-radius: 4px; } + +/** + * Utility Colors + * -------------------------------------------------- + * Utility colors are added to help set a naming convention. You'll + * notice we purposely do not use words like "red" or "blue", but + * instead have colors which represent an emotion or generic theme. + */ +.light, a.light { + color: #fff; } + +.light-bg { + background-color: #fff; } + +.light-border { + border-color: #ddd; } + +.stable, a.stable { + color: #f8f8f8; } + +.stable-bg { + background-color: #f8f8f8; } + +.stable-border { + border-color: #b2b2b2; } + +.positive, a.positive { + color: #387ef5; } + +.positive-bg { + background-color: #387ef5; } + +.positive-border { + border-color: #0c60ee; } + +.calm, a.calm { + color: #11c1f3; } + +.calm-bg { + background-color: #11c1f3; } + +.calm-border { + border-color: #0a9dc7; } + +.assertive, a.assertive { + color: #ef473a; } + +.assertive-bg { + background-color: #ef473a; } + +.assertive-border { + border-color: #e42112; } + +.balanced, a.balanced { + color: #33cd5f; } + +.balanced-bg { + background-color: #33cd5f; } + +.balanced-border { + border-color: #28a54c; } + +.energized, a.energized { + color: #ffc900; } + +.energized-bg { + background-color: #ffc900; } + +.energized-border { + border-color: #e6b500; } + +.royal, a.royal { + color: #886aea; } + +.royal-bg { + background-color: #886aea; } + +.royal-border { + border-color: #6b46e5; } + +.dark, a.dark { + color: #444; } + +.dark-bg { + background-color: #444; } + +.dark-border { + border-color: #111; } + +[collection-repeat] { + /* Position is set by transforms */ + left: 0 !important; + top: 0 !important; + position: absolute !important; + z-index: 1; } + +.collection-repeat-container { + position: relative; + z-index: 1; } + +.collection-repeat-after-container { + z-index: 0; + display: block; + /* when scrolling horizontally, make sure the after container doesn't take up 100% width */ } + .collection-repeat-after-container.horizontal { + display: inline-block; } + +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, +.x-ng-cloak, .ng-hide:not(.ng-hide-animate) { + display: none !important; } + +/** + * Platform + * -------------------------------------------------- + * Platform specific tweaks + */ +.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) { + height: 64px; } + .platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper { + margin-top: 19px !important; } + .platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader) > * { + margin-top: 20px; } + +.platform-ios.platform-cordova:not(.fullscreen) .tabs-top > .tabs, +.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top { + top: 64px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-header, +.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader { + top: 64px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-subheader { + top: 108px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top { + top: 113px; } + +.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top { + top: 157px; } + +.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader) { + height: 44px; } + .platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper { + margin-top: -1px; } + .platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader) > * { + margin-top: 0; } + +.platform-ios.platform-cordova .popover .has-header, +.platform-ios.platform-cordova .popover .bar-subheader { + top: 44px; } + +.platform-ios.platform-cordova .popover .has-subheader { + top: 88px; } + +.platform-ios.platform-cordova.status-bar-hide { + margin-bottom: 20px; } + +@media (orientation: landscape) { + .platform-ios.platform-browser.platform-ipad { + position: fixed; } } + +.platform-c:not(.enable-transitions) * { + -webkit-transition: none !important; + transition: none !important; } + +.slide-in-up { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); } + +.slide-in-up.ng-enter, +.slide-in-up > .ng-enter { + -webkit-transition: all cubic-bezier(0.1, 0.7, 0.1, 1) 400ms; + transition: all cubic-bezier(0.1, 0.7, 0.1, 1) 400ms; } + +.slide-in-up.ng-enter-active, +.slide-in-up > .ng-enter-active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.slide-in-up.ng-leave, +.slide-in-up > .ng-leave { + -webkit-transition: all ease-in-out 250ms; + transition: all ease-in-out 250ms; } + +@-webkit-keyframes scaleOut { + from { + -webkit-transform: scale(1); + opacity: 1; } + to { + -webkit-transform: scale(0.8); + opacity: 0; } } + +@keyframes scaleOut { + from { + transform: scale(1); + opacity: 1; } + to { + transform: scale(0.8); + opacity: 0; } } + +@-webkit-keyframes superScaleIn { + from { + -webkit-transform: scale(1.2); + opacity: 0; } + to { + -webkit-transform: scale(1); + opacity: 1; } } + +@keyframes superScaleIn { + from { + transform: scale(1.2); + opacity: 0; } + to { + transform: scale(1); + opacity: 1; } } + +[nav-view-transition="ios"] [nav-view="entering"], +[nav-view-transition="ios"] [nav-view="leaving"] { + -webkit-transition-duration: 500ms; + transition-duration: 500ms; + -webkit-transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + -webkit-transition-property: opacity, -webkit-transform, box-shadow; + transition-property: opacity, transform, box-shadow; } + +[nav-view-transition="ios"][nav-view-direction="forward"], [nav-view-transition="ios"][nav-view-direction="back"] { + background-color: #000; } + +[nav-view-transition="ios"] [nav-view="active"], +[nav-view-transition="ios"][nav-view-direction="forward"] [nav-view="entering"], +[nav-view-transition="ios"][nav-view-direction="back"] [nav-view="leaving"] { + z-index: 3; } + +[nav-view-transition="ios"][nav-view-direction="back"] [nav-view="entering"], +[nav-view-transition="ios"][nav-view-direction="forward"] [nav-view="leaving"] { + z-index: 2; } + +[nav-bar-transition="ios"] .title, +[nav-bar-transition="ios"] .buttons, +[nav-bar-transition="ios"] .back-text { + -webkit-transition-duration: 500ms; + transition-duration: 500ms; + -webkit-transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + transition-timing-function: cubic-bezier(0.36, 0.66, 0.04, 1); + -webkit-transition-property: opacity, -webkit-transform; + transition-property: opacity, transform; } + +[nav-bar-transition="ios"] [nav-bar="active"], +[nav-bar-transition="ios"] [nav-bar="entering"] { + z-index: 10; } + [nav-bar-transition="ios"] [nav-bar="active"] .bar, + [nav-bar-transition="ios"] [nav-bar="entering"] .bar { + background: transparent; } + +[nav-bar-transition="ios"] [nav-bar="cached"] { + display: block; } + [nav-bar-transition="ios"] [nav-bar="cached"] .header-item { + display: none; } + +[nav-view-transition="android"] [nav-view="entering"], +[nav-view-transition="android"] [nav-view="leaving"] { + -webkit-transition-duration: 200ms; + transition-duration: 200ms; + -webkit-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + -webkit-transition-property: -webkit-transform; + transition-property: transform; } + +[nav-view-transition="android"] [nav-view="active"], +[nav-view-transition="android"][nav-view-direction="forward"] [nav-view="entering"], +[nav-view-transition="android"][nav-view-direction="back"] [nav-view="leaving"] { + z-index: 3; } + +[nav-view-transition="android"][nav-view-direction="back"] [nav-view="entering"], +[nav-view-transition="android"][nav-view-direction="forward"] [nav-view="leaving"] { + z-index: 2; } + +[nav-bar-transition="android"] .title, +[nav-bar-transition="android"] .buttons { + -webkit-transition-duration: 200ms; + transition-duration: 200ms; + -webkit-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1); + -webkit-transition-property: opacity; + transition-property: opacity; } + +[nav-bar-transition="android"] [nav-bar="active"], +[nav-bar-transition="android"] [nav-bar="entering"] { + z-index: 10; } + [nav-bar-transition="android"] [nav-bar="active"] .bar, + [nav-bar-transition="android"] [nav-bar="entering"] .bar { + background: transparent; } + +[nav-bar-transition="android"] [nav-bar="cached"] { + display: block; } + [nav-bar-transition="android"] [nav-bar="cached"] .header-item { + display: none; } + +[nav-swipe="fast"] [nav-view], +[nav-swipe="fast"] .title, +[nav-swipe="fast"] .buttons, +[nav-swipe="fast"] .back-text { + -webkit-transition-duration: 50ms; + transition-duration: 50ms; + -webkit-transition-timing-function: linear; + transition-timing-function: linear; } + +[nav-swipe="slow"] [nav-view], +[nav-swipe="slow"] .title, +[nav-swipe="slow"] .buttons, +[nav-swipe="slow"] .back-text { + -webkit-transition-duration: 160ms; + transition-duration: 160ms; + -webkit-transition-timing-function: linear; + transition-timing-function: linear; } + +[nav-view="cached"], +[nav-bar="cached"] { + display: none; } + +[nav-view="stage"] { + opacity: 0; + -webkit-transition-duration: 0; + transition-duration: 0; } + +[nav-bar="stage"] .title, +[nav-bar="stage"] .buttons, +[nav-bar="stage"] .back-text { + position: absolute; + opacity: 0; + -webkit-transition-duration: 0s; + transition-duration: 0s; } diff --git a/src/MCM.KidsIdApp/www/css/ionic.app.min.css b/src/MCM.KidsIdApp/www/css/ionic.app.min.css new file mode 100644 index 0000000..7a4fec7 --- /dev/null +++ b/src/MCM.KidsIdApp/www/css/ionic.app.min.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:Ionicons;src:url(../lib/ionic/fonts/ionicons.eot?v=2.0.1);src:url(../lib/ionic/fonts/ionicons.eot?v=2.0.1#iefix) format("embedded-opentype"),url(../lib/ionic/fonts/ionicons.ttf?v=2.0.1) format("truetype"),url(../lib/ionic/fonts/ionicons.woff?v=2.0.1) format("woff"),url(../lib/ionic/fonts/ionicons.woff) format("woff"),url(../lib/ionic/fonts/ionicons.svg?v=2.0.1#Ionicons) format("svg");font-weight:400;font-style:normal}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-circle:before,.ion-android-add:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-cloud:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done-all:before,.ion-android-done:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite-outline:before,.ion-android-favorite:before,.ion-android-film:before,.ion-android-folder-open:before,.ion-android-folder:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone-off:before,.ion-android-microphone:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-notifications:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person-add:before,.ion-android-person:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove-circle:before,.ion-android-remove:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share-alt:before,.ion-android-share:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace-outline:before,.ion-backspace:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox-working:before,.ion-chatbox:before,.ion-chatboxes:before,.ion-chatbubble-working:before,.ion-chatbubble:before,.ion-chatbubbles:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-checkmark:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close-circled:before,.ion-close-round:before,.ion-close:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code-download:before,.ion-code-working:before,.ion-code:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email-unread:before,.ion-email:before,.ion-erlenmeyer-flask-bubbles:before,.ion-erlenmeyer-flask:before,.ion-eye-disabled:before,.ion-eye:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash-off:before,.ion-flash:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy-outline:before,.ion-happy:before,.ion-headphone:before,.ion-heart-broken:before,.ion-heart:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-help:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios-alarm-outline:before,.ion-ios-alarm:before,.ion-ios-albums-outline:before,.ion-ios-albums:before,.ion-ios-americanfootball-outline:before,.ion-ios-americanfootball:before,.ion-ios-analytics-outline:before,.ion-ios-analytics:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at-outline:before,.ion-ios-at:before,.ion-ios-barcode-outline:before,.ion-ios-barcode:before,.ion-ios-baseball-outline:before,.ion-ios-baseball:before,.ion-ios-basketball-outline:before,.ion-ios-basketball:before,.ion-ios-bell-outline:before,.ion-ios-bell:before,.ion-ios-body-outline:before,.ion-ios-body:before,.ion-ios-bolt-outline:before,.ion-ios-bolt:before,.ion-ios-book-outline:before,.ion-ios-book:before,.ion-ios-bookmarks-outline:before,.ion-ios-bookmarks:before,.ion-ios-box-outline:before,.ion-ios-box:before,.ion-ios-briefcase-outline:before,.ion-ios-briefcase:before,.ion-ios-browsers-outline:before,.ion-ios-browsers:before,.ion-ios-calculator-outline:before,.ion-ios-calculator:before,.ion-ios-calendar-outline:before,.ion-ios-calendar:before,.ion-ios-camera-outline:before,.ion-ios-camera:before,.ion-ios-cart-outline:before,.ion-ios-cart:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatbubble-outline:before,.ion-ios-chatbubble:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-checkmark:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock-outline:before,.ion-ios-clock:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-close:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-outline:before,.ion-ios-cloudy:before,.ion-ios-cog-outline:before,.ion-ios-cog:before,.ion-ios-color-filter-outline:before,.ion-ios-color-filter:before,.ion-ios-color-wand-outline:before,.ion-ios-color-wand:before,.ion-ios-compose-outline:before,.ion-ios-compose:before,.ion-ios-contact-outline:before,.ion-ios-contact:before,.ion-ios-copy-outline:before,.ion-ios-copy:before,.ion-ios-crop-strong:before,.ion-ios-crop:before,.ion-ios-download-outline:before,.ion-ios-download:before,.ion-ios-drag:before,.ion-ios-email-outline:before,.ion-ios-email:before,.ion-ios-eye-outline:before,.ion-ios-eye:before,.ion-ios-fastforward-outline:before,.ion-ios-fastforward:before,.ion-ios-filing-outline:before,.ion-ios-filing:before,.ion-ios-film-outline:before,.ion-ios-film:before,.ion-ios-flag-outline:before,.ion-ios-flag:before,.ion-ios-flame-outline:before,.ion-ios-flame:before,.ion-ios-flask-outline:before,.ion-ios-flask:before,.ion-ios-flower-outline:before,.ion-ios-flower:before,.ion-ios-folder-outline:before,.ion-ios-folder:before,.ion-ios-football-outline:before,.ion-ios-football:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-b-outline:before,.ion-ios-game-controller-b:before,.ion-ios-gear-outline:before,.ion-ios-gear:before,.ion-ios-glasses-outline:before,.ion-ios-glasses:before,.ion-ios-grid-view-outline:before,.ion-ios-grid-view:before,.ion-ios-heart-outline:before,.ion-ios-heart:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-help:before,.ion-ios-home-outline:before,.ion-ios-home:before,.ion-ios-infinite-outline:before,.ion-ios-infinite:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-information:before,.ion-ios-ionic-outline:before,.ion-ios-keypad-outline:before,.ion-ios-keypad:before,.ion-ios-lightbulb-outline:before,.ion-ios-lightbulb:before,.ion-ios-list-outline:before,.ion-ios-list:before,.ion-ios-location-outline:before,.ion-ios-location:before,.ion-ios-locked-outline:before,.ion-ios-locked:before,.ion-ios-loop-strong:before,.ion-ios-loop:before,.ion-ios-medical-outline:before,.ion-ios-medical:before,.ion-ios-medkit-outline:before,.ion-ios-medkit:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-mic:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-minus:before,.ion-ios-monitor-outline:before,.ion-ios-monitor:before,.ion-ios-moon-outline:before,.ion-ios-moon:before,.ion-ios-more-outline:before,.ion-ios-more:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate-outline:before,.ion-ios-navigate:before,.ion-ios-nutrition-outline:before,.ion-ios-nutrition:before,.ion-ios-paper-outline:before,.ion-ios-paper:before,.ion-ios-paperplane-outline:before,.ion-ios-paperplane:before,.ion-ios-partlysunny-outline:before,.ion-ios-partlysunny:before,.ion-ios-pause-outline:before,.ion-ios-pause:before,.ion-ios-paw-outline:before,.ion-ios-paw:before,.ion-ios-people-outline:before,.ion-ios-people:before,.ion-ios-person-outline:before,.ion-ios-person:before,.ion-ios-personadd-outline:before,.ion-ios-personadd:before,.ion-ios-photos-outline:before,.ion-ios-photos:before,.ion-ios-pie-outline:before,.ion-ios-pie:before,.ion-ios-pint-outline:before,.ion-ios-pint:before,.ion-ios-play-outline:before,.ion-ios-play:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-plus:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetags-outline:before,.ion-ios-pricetags:before,.ion-ios-printer-outline:before,.ion-ios-printer:before,.ion-ios-pulse-strong:before,.ion-ios-pulse:before,.ion-ios-rainy-outline:before,.ion-ios-rainy:before,.ion-ios-recording-outline:before,.ion-ios-recording:before,.ion-ios-redo-outline:before,.ion-ios-redo:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-refresh:before,.ion-ios-reload:before,.ion-ios-reverse-camera-outline:before,.ion-ios-reverse-camera:before,.ion-ios-rewind-outline:before,.ion-ios-rewind:before,.ion-ios-rose-outline:before,.ion-ios-rose:before,.ion-ios-search-strong:before,.ion-ios-search:before,.ion-ios-settings-strong:before,.ion-ios-settings:before,.ion-ios-shuffle-strong:before,.ion-ios-shuffle:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipbackward:before,.ion-ios-skipforward-outline:before,.ion-ios-skipforward:before,.ion-ios-snowy:before,.ion-ios-speedometer-outline:before,.ion-ios-speedometer:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-star:before,.ion-ios-stopwatch-outline:before,.ion-ios-stopwatch:before,.ion-ios-sunny-outline:before,.ion-ios-sunny:before,.ion-ios-telephone-outline:before,.ion-ios-telephone:before,.ion-ios-tennisball-outline:before,.ion-ios-tennisball:before,.ion-ios-thunderstorm-outline:before,.ion-ios-thunderstorm:before,.ion-ios-time-outline:before,.ion-ios-time:before,.ion-ios-timer-outline:before,.ion-ios-timer:before,.ion-ios-toggle-outline:before,.ion-ios-toggle:before,.ion-ios-trash-outline:before,.ion-ios-trash:before,.ion-ios-undo-outline:before,.ion-ios-undo:before,.ion-ios-unlocked-outline:before,.ion-ios-unlocked:before,.ion-ios-upload-outline:before,.ion-ios-upload:before,.ion-ios-videocam-outline:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass-outline:before,.ion-ios-wineglass:before,.ion-ios-world-outline:before,.ion-ios-world:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-minus:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon-round:before,.ion-navicon:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person-add:before,.ion-person-stalker:before,.ion-person:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-plus:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad-outline:before,.ion-sad:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android-outline:before,.ion-social-android:before,.ion-social-angular-outline:before,.ion-social-angular:before,.ion-social-apple-outline:before,.ion-social-apple:before,.ion-social-bitcoin-outline:before,.ion-social-bitcoin:before,.ion-social-buffer-outline:before,.ion-social-buffer:before,.ion-social-chrome-outline:before,.ion-social-chrome:before,.ion-social-codepen-outline:before,.ion-social-codepen:before,.ion-social-css3-outline:before,.ion-social-css3:before,.ion-social-designernews-outline:before,.ion-social-designernews:before,.ion-social-dribbble-outline:before,.ion-social-dribbble:before,.ion-social-dropbox-outline:before,.ion-social-dropbox:before,.ion-social-euro-outline:before,.ion-social-euro:before,.ion-social-facebook-outline:before,.ion-social-facebook:before,.ion-social-foursquare-outline:before,.ion-social-foursquare:before,.ion-social-freebsd-devil:before,.ion-social-github-outline:before,.ion-social-github:before,.ion-social-google-outline:before,.ion-social-google:before,.ion-social-googleplus-outline:before,.ion-social-googleplus:before,.ion-social-hackernews-outline:before,.ion-social-hackernews:before,.ion-social-html5-outline:before,.ion-social-html5:before,.ion-social-instagram-outline:before,.ion-social-instagram:before,.ion-social-javascript-outline:before,.ion-social-javascript:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-python:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-sass:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-snapchat-outline:before,.ion-social-snapchat:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux:before,.ion-social-twitch-outline:before,.ion-social-twitch:before,.ion-social-twitter-outline:before,.ion-social-twitter:before,.ion-social-usd-outline:before,.ion-social-usd:before,.ion-social-vimeo-outline:before,.ion-social-vimeo:before,.ion-social-whatsapp-outline:before,.ion-social-whatsapp:before,.ion-social-windows-outline:before,.ion-social-windows:before,.ion-social-wordpress-outline:before,.ion-social-wordpress:before,.ion-social-yahoo-outline:before,.ion-social-yahoo:before,.ion-social-yen-outline:before,.ion-social-yen:before,.ion-social-youtube-outline:before,.ion-social-youtube:before,.ion-soup-can-outline:before,.ion-soup-can:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle-filled:before,.ion-toggle:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt-outline:before,.ion-tshirt:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:""}.ion-alert-circled:before{content:""}.ion-android-add:before{content:""}.ion-android-add-circle:before{content:""}.ion-android-alarm-clock:before{content:""}.ion-android-alert:before{content:""}.ion-android-apps:before{content:""}.ion-android-archive:before{content:""}.ion-android-arrow-back:before{content:""}.ion-android-arrow-down:before{content:""}.ion-android-arrow-dropdown:before{content:""}.ion-android-arrow-dropdown-circle:before{content:""}.ion-android-arrow-dropleft:before{content:""}.ion-android-arrow-dropleft-circle:before{content:""}.ion-android-arrow-dropright:before{content:""}.ion-android-arrow-dropright-circle:before{content:""}.ion-android-arrow-dropup:before{content:""}.ion-android-arrow-dropup-circle:before{content:""}.ion-android-arrow-forward:before{content:""}.ion-android-arrow-up:before{content:""}.ion-android-attach:before{content:""}.ion-android-bar:before{content:""}.ion-android-bicycle:before{content:""}.ion-android-boat:before{content:""}.ion-android-bookmark:before{content:""}.ion-android-bulb:before{content:""}.ion-android-bus:before{content:""}.ion-android-calendar:before{content:""}.ion-android-call:before{content:""}.ion-android-camera:before{content:""}.ion-android-cancel:before{content:""}.ion-android-car:before{content:""}.ion-android-cart:before{content:""}.ion-android-chat:before{content:""}.ion-android-checkbox:before{content:""}.ion-android-checkbox-blank:before{content:""}.ion-android-checkbox-outline:before{content:""}.ion-android-checkbox-outline-blank:before{content:""}.ion-android-checkmark-circle:before{content:""}.ion-android-clipboard:before{content:""}.ion-android-close:before{content:""}.ion-android-cloud:before{content:""}.ion-android-cloud-circle:before{content:""}.ion-android-cloud-done:before{content:""}.ion-android-cloud-outline:before{content:""}.ion-android-color-palette:before{content:""}.ion-android-compass:before{content:""}.ion-android-contact:before{content:""}.ion-android-contacts:before{content:""}.ion-android-contract:before{content:""}.ion-android-create:before{content:""}.ion-android-delete:before{content:""}.ion-android-desktop:before{content:""}.ion-android-document:before{content:""}.ion-android-done:before{content:""}.ion-android-done-all:before{content:""}.ion-android-download:before{content:""}.ion-android-drafts:before{content:""}.ion-android-exit:before{content:""}.ion-android-expand:before{content:""}.ion-android-favorite:before{content:""}.ion-android-favorite-outline:before{content:""}.ion-android-film:before{content:""}.ion-android-folder:before{content:""}.ion-android-folder-open:before{content:""}.ion-android-funnel:before{content:""}.ion-android-globe:before{content:""}.ion-android-hand:before{content:""}.ion-android-hangout:before{content:""}.ion-android-happy:before{content:""}.ion-android-home:before{content:""}.ion-android-image:before{content:""}.ion-android-laptop:before{content:""}.ion-android-list:before{content:""}.ion-android-locate:before{content:""}.ion-android-lock:before{content:""}.ion-android-mail:before{content:""}.ion-android-map:before{content:""}.ion-android-menu:before{content:""}.ion-android-microphone:before{content:""}.ion-android-microphone-off:before{content:""}.ion-android-more-horizontal:before{content:""}.ion-android-more-vertical:before{content:""}.ion-android-navigate:before{content:""}.ion-android-notifications:before{content:""}.ion-android-notifications-none:before{content:""}.ion-android-notifications-off:before{content:""}.ion-android-open:before{content:""}.ion-android-options:before{content:""}.ion-android-people:before{content:""}.ion-android-person:before{content:""}.ion-android-person-add:before{content:""}.ion-android-phone-landscape:before{content:""}.ion-android-phone-portrait:before{content:""}.ion-android-pin:before{content:""}.ion-android-plane:before{content:""}.ion-android-playstore:before{content:""}.ion-android-print:before{content:""}.ion-android-radio-button-off:before{content:""}.ion-android-radio-button-on:before{content:""}.ion-android-refresh:before{content:""}.ion-android-remove:before{content:""}.ion-android-remove-circle:before{content:""}.ion-android-restaurant:before{content:""}.ion-android-sad:before{content:""}.ion-android-search:before{content:""}.ion-android-send:before{content:""}.ion-android-settings:before{content:""}.ion-android-share:before{content:""}.ion-android-share-alt:before{content:""}.ion-android-star:before{content:""}.ion-android-star-half:before{content:""}.ion-android-star-outline:before{content:""}.ion-android-stopwatch:before{content:""}.ion-android-subway:before{content:""}.ion-android-sunny:before{content:""}.ion-android-sync:before{content:""}.ion-android-textsms:before{content:""}.ion-android-time:before{content:""}.ion-android-train:before{content:""}.ion-android-unlock:before{content:""}.ion-android-upload:before{content:""}.ion-android-volume-down:before{content:""}.ion-android-volume-mute:before{content:""}.ion-android-volume-off:before{content:""}.ion-android-volume-up:before{content:""}.ion-android-walk:before{content:""}.ion-android-warning:before{content:""}.ion-android-watch:before{content:""}.ion-android-wifi:before{content:""}.ion-aperture:before{content:""}.ion-archive:before{content:""}.ion-arrow-down-a:before{content:""}.ion-arrow-down-b:before{content:""}.ion-arrow-down-c:before{content:""}.ion-arrow-expand:before{content:""}.ion-arrow-graph-down-left:before{content:""}.ion-arrow-graph-down-right:before{content:""}.ion-arrow-graph-up-left:before{content:""}.ion-arrow-graph-up-right:before{content:""}.ion-arrow-left-a:before{content:""}.ion-arrow-left-b:before{content:""}.ion-arrow-left-c:before{content:""}.ion-arrow-move:before{content:""}.ion-arrow-resize:before{content:""}.ion-arrow-return-left:before{content:""}.ion-arrow-return-right:before{content:""}.ion-arrow-right-a:before{content:""}.ion-arrow-right-b:before{content:""}.ion-arrow-right-c:before{content:""}.ion-arrow-shrink:before{content:""}.ion-arrow-swap:before{content:""}.ion-arrow-up-a:before{content:""}.ion-arrow-up-b:before{content:""}.ion-arrow-up-c:before{content:""}.ion-asterisk:before{content:""}.ion-at:before{content:""}.ion-backspace:before{content:""}.ion-backspace-outline:before{content:""}.ion-bag:before{content:""}.ion-battery-charging:before{content:""}.ion-battery-empty:before{content:""}.ion-battery-full:before{content:""}.ion-battery-half:before{content:""}.ion-battery-low:before{content:""}.ion-beaker:before{content:""}.ion-beer:before{content:""}.ion-bluetooth:before{content:""}.ion-bonfire:before{content:""}.ion-bookmark:before{content:""}.ion-bowtie:before{content:""}.ion-briefcase:before{content:""}.ion-bug:before{content:""}.ion-calculator:before{content:""}.ion-calendar:before{content:""}.ion-camera:before{content:""}.ion-card:before{content:""}.ion-cash:before{content:""}.ion-chatbox:before{content:""}.ion-chatbox-working:before{content:""}.ion-chatboxes:before{content:""}.ion-chatbubble:before{content:""}.ion-chatbubble-working:before{content:""}.ion-chatbubbles:before{content:""}.ion-checkmark:before{content:""}.ion-checkmark-circled:before{content:""}.ion-checkmark-round:before{content:""}.ion-chevron-down:before{content:""}.ion-chevron-left:before{content:""}.ion-chevron-right:before{content:""}.ion-chevron-up:before{content:""}.ion-clipboard:before{content:""}.ion-clock:before{content:""}.ion-close:before{content:""}.ion-close-circled:before{content:""}.ion-close-round:before{content:""}.ion-closed-captioning:before{content:""}.ion-cloud:before{content:""}.ion-code:before{content:""}.ion-code-download:before{content:""}.ion-code-working:before{content:""}.ion-coffee:before{content:""}.ion-compass:before{content:""}.ion-compose:before{content:""}.ion-connection-bars:before{content:""}.ion-contrast:before{content:""}.ion-crop:before{content:""}.ion-cube:before{content:""}.ion-disc:before{content:""}.ion-document:before{content:""}.ion-document-text:before{content:""}.ion-drag:before{content:""}.ion-earth:before{content:""}.ion-easel:before{content:""}.ion-edit:before{content:""}.ion-egg:before{content:""}.ion-eject:before{content:""}.ion-email:before{content:""}.ion-email-unread:before{content:""}.ion-erlenmeyer-flask:before{content:""}.ion-erlenmeyer-flask-bubbles:before{content:""}.ion-eye:before{content:""}.ion-eye-disabled:before{content:""}.ion-female:before{content:""}.ion-filing:before{content:""}.ion-film-marker:before{content:""}.ion-fireball:before{content:""}.ion-flag:before{content:""}.ion-flame:before{content:""}.ion-flash:before{content:""}.ion-flash-off:before{content:""}.ion-folder:before{content:""}.ion-fork:before{content:""}.ion-fork-repo:before{content:""}.ion-forward:before{content:""}.ion-funnel:before{content:""}.ion-gear-a:before{content:""}.ion-gear-b:before{content:""}.ion-grid:before{content:""}.ion-hammer:before{content:""}.ion-happy:before{content:""}.ion-happy-outline:before{content:""}.ion-headphone:before{content:""}.ion-heart:before{content:""}.ion-heart-broken:before{content:""}.ion-help:before{content:""}.ion-help-buoy:before{content:""}.ion-help-circled:before{content:""}.ion-home:before{content:""}.ion-icecream:before{content:""}.ion-image:before{content:""}.ion-images:before{content:""}.ion-information:before{content:""}.ion-information-circled:before{content:""}.ion-ionic:before{content:""}.ion-ios-alarm:before{content:""}.ion-ios-alarm-outline:before{content:""}.ion-ios-albums:before{content:""}.ion-ios-albums-outline:before{content:""}.ion-ios-americanfootball:before{content:""}.ion-ios-americanfootball-outline:before{content:""}.ion-ios-analytics:before{content:""}.ion-ios-analytics-outline:before{content:""}.ion-ios-arrow-back:before{content:""}.ion-ios-arrow-down:before{content:""}.ion-ios-arrow-forward:before{content:""}.ion-ios-arrow-left:before{content:""}.ion-ios-arrow-right:before{content:""}.ion-ios-arrow-thin-down:before{content:""}.ion-ios-arrow-thin-left:before{content:""}.ion-ios-arrow-thin-right:before{content:""}.ion-ios-arrow-thin-up:before{content:""}.ion-ios-arrow-up:before{content:""}.ion-ios-at:before{content:""}.ion-ios-at-outline:before{content:""}.ion-ios-barcode:before{content:""}.ion-ios-barcode-outline:before{content:""}.ion-ios-baseball:before{content:""}.ion-ios-baseball-outline:before{content:""}.ion-ios-basketball:before{content:""}.ion-ios-basketball-outline:before{content:""}.ion-ios-bell:before{content:""}.ion-ios-bell-outline:before{content:""}.ion-ios-body:before{content:""}.ion-ios-body-outline:before{content:""}.ion-ios-bolt:before{content:""}.ion-ios-bolt-outline:before{content:""}.ion-ios-book:before{content:""}.ion-ios-book-outline:before{content:""}.ion-ios-bookmarks:before{content:""}.ion-ios-bookmarks-outline:before{content:""}.ion-ios-box:before{content:""}.ion-ios-box-outline:before{content:""}.ion-ios-briefcase:before{content:""}.ion-ios-briefcase-outline:before{content:""}.ion-ios-browsers:before{content:""}.ion-ios-browsers-outline:before{content:""}.ion-ios-calculator:before{content:""}.ion-ios-calculator-outline:before{content:""}.ion-ios-calendar:before{content:""}.ion-ios-calendar-outline:before{content:""}.ion-ios-camera:before{content:""}.ion-ios-camera-outline:before{content:""}.ion-ios-cart:before{content:""}.ion-ios-cart-outline:before{content:""}.ion-ios-chatboxes:before{content:""}.ion-ios-chatboxes-outline:before{content:""}.ion-ios-chatbubble:before{content:""}.ion-ios-chatbubble-outline:before{content:""}.ion-ios-checkmark:before{content:""}.ion-ios-checkmark-empty:before{content:""}.ion-ios-checkmark-outline:before{content:""}.ion-ios-circle-filled:before{content:""}.ion-ios-circle-outline:before{content:""}.ion-ios-clock:before{content:""}.ion-ios-clock-outline:before{content:""}.ion-ios-close:before{content:""}.ion-ios-close-empty:before{content:""}.ion-ios-close-outline:before{content:""}.ion-ios-cloud:before{content:""}.ion-ios-cloud-download:before{content:""}.ion-ios-cloud-download-outline:before{content:""}.ion-ios-cloud-outline:before{content:""}.ion-ios-cloud-upload:before{content:""}.ion-ios-cloud-upload-outline:before{content:""}.ion-ios-cloudy:before{content:""}.ion-ios-cloudy-night:before{content:""}.ion-ios-cloudy-night-outline:before{content:""}.ion-ios-cloudy-outline:before{content:""}.ion-ios-cog:before{content:""}.ion-ios-cog-outline:before{content:""}.ion-ios-color-filter:before{content:""}.ion-ios-color-filter-outline:before{content:""}.ion-ios-color-wand:before{content:""}.ion-ios-color-wand-outline:before{content:""}.ion-ios-compose:before{content:""}.ion-ios-compose-outline:before{content:""}.ion-ios-contact:before{content:""}.ion-ios-contact-outline:before{content:""}.ion-ios-copy:before{content:""}.ion-ios-copy-outline:before{content:""}.ion-ios-crop:before{content:""}.ion-ios-crop-strong:before{content:""}.ion-ios-download:before{content:""}.ion-ios-download-outline:before{content:""}.ion-ios-drag:before{content:""}.ion-ios-email:before{content:""}.ion-ios-email-outline:before{content:""}.ion-ios-eye:before{content:""}.ion-ios-eye-outline:before{content:""}.ion-ios-fastforward:before{content:""}.ion-ios-fastforward-outline:before{content:""}.ion-ios-filing:before{content:""}.ion-ios-filing-outline:before{content:""}.ion-ios-film:before{content:""}.ion-ios-film-outline:before{content:""}.ion-ios-flag:before{content:""}.ion-ios-flag-outline:before{content:""}.ion-ios-flame:before{content:""}.ion-ios-flame-outline:before{content:""}.ion-ios-flask:before{content:""}.ion-ios-flask-outline:before{content:""}.ion-ios-flower:before{content:""}.ion-ios-flower-outline:before{content:""}.ion-ios-folder:before{content:""}.ion-ios-folder-outline:before{content:""}.ion-ios-football:before{content:""}.ion-ios-football-outline:before{content:""}.ion-ios-game-controller-a:before{content:""}.ion-ios-game-controller-a-outline:before{content:""}.ion-ios-game-controller-b:before{content:""}.ion-ios-game-controller-b-outline:before{content:""}.ion-ios-gear:before{content:""}.ion-ios-gear-outline:before{content:""}.ion-ios-glasses:before{content:""}.ion-ios-glasses-outline:before{content:""}.ion-ios-grid-view:before{content:""}.ion-ios-grid-view-outline:before{content:""}.ion-ios-heart:before{content:""}.ion-ios-heart-outline:before{content:""}.ion-ios-help:before{content:""}.ion-ios-help-empty:before{content:""}.ion-ios-help-outline:before{content:""}.ion-ios-home:before{content:""}.ion-ios-home-outline:before{content:""}.ion-ios-infinite:before{content:""}.ion-ios-infinite-outline:before{content:""}.ion-ios-information:before{content:""}.ion-ios-information-empty:before{content:""}.ion-ios-information-outline:before{content:""}.ion-ios-ionic-outline:before{content:""}.ion-ios-keypad:before{content:""}.ion-ios-keypad-outline:before{content:""}.ion-ios-lightbulb:before{content:""}.ion-ios-lightbulb-outline:before{content:""}.ion-ios-list:before{content:""}.ion-ios-list-outline:before{content:""}.ion-ios-location:before{content:""}.ion-ios-location-outline:before{content:""}.ion-ios-locked:before{content:""}.ion-ios-locked-outline:before{content:""}.ion-ios-loop:before{content:""}.ion-ios-loop-strong:before{content:""}.ion-ios-medical:before{content:""}.ion-ios-medical-outline:before{content:""}.ion-ios-medkit:before{content:""}.ion-ios-medkit-outline:before{content:""}.ion-ios-mic:before{content:""}.ion-ios-mic-off:before{content:""}.ion-ios-mic-outline:before{content:""}.ion-ios-minus:before{content:""}.ion-ios-minus-empty:before{content:""}.ion-ios-minus-outline:before{content:""}.ion-ios-monitor:before{content:""}.ion-ios-monitor-outline:before{content:""}.ion-ios-moon:before{content:""}.ion-ios-moon-outline:before{content:""}.ion-ios-more:before{content:""}.ion-ios-more-outline:before{content:""}.ion-ios-musical-note:before{content:""}.ion-ios-musical-notes:before{content:""}.ion-ios-navigate:before{content:""}.ion-ios-navigate-outline:before{content:""}.ion-ios-nutrition:before{content:""}.ion-ios-nutrition-outline:before{content:""}.ion-ios-paper:before{content:""}.ion-ios-paper-outline:before{content:""}.ion-ios-paperplane:before{content:""}.ion-ios-paperplane-outline:before{content:""}.ion-ios-partlysunny:before{content:""}.ion-ios-partlysunny-outline:before{content:""}.ion-ios-pause:before{content:""}.ion-ios-pause-outline:before{content:""}.ion-ios-paw:before{content:""}.ion-ios-paw-outline:before{content:""}.ion-ios-people:before{content:""}.ion-ios-people-outline:before{content:""}.ion-ios-person:before{content:""}.ion-ios-person-outline:before{content:""}.ion-ios-personadd:before{content:""}.ion-ios-personadd-outline:before{content:""}.ion-ios-photos:before{content:""}.ion-ios-photos-outline:before{content:""}.ion-ios-pie:before{content:""}.ion-ios-pie-outline:before{content:""}.ion-ios-pint:before{content:""}.ion-ios-pint-outline:before{content:""}.ion-ios-play:before{content:""}.ion-ios-play-outline:before{content:""}.ion-ios-plus:before{content:""}.ion-ios-plus-empty:before{content:""}.ion-ios-plus-outline:before{content:""}.ion-ios-pricetag:before{content:""}.ion-ios-pricetag-outline:before{content:""}.ion-ios-pricetags:before{content:""}.ion-ios-pricetags-outline:before{content:""}.ion-ios-printer:before{content:""}.ion-ios-printer-outline:before{content:""}.ion-ios-pulse:before{content:""}.ion-ios-pulse-strong:before{content:""}.ion-ios-rainy:before{content:""}.ion-ios-rainy-outline:before{content:""}.ion-ios-recording:before{content:""}.ion-ios-recording-outline:before{content:""}.ion-ios-redo:before{content:""}.ion-ios-redo-outline:before{content:""}.ion-ios-refresh:before{content:""}.ion-ios-refresh-empty:before{content:""}.ion-ios-refresh-outline:before{content:""}.ion-ios-reload:before{content:""}.ion-ios-reverse-camera:before{content:""}.ion-ios-reverse-camera-outline:before{content:""}.ion-ios-rewind:before{content:""}.ion-ios-rewind-outline:before{content:""}.ion-ios-rose:before{content:""}.ion-ios-rose-outline:before{content:""}.ion-ios-search:before{content:""}.ion-ios-search-strong:before{content:""}.ion-ios-settings:before{content:""}.ion-ios-settings-strong:before{content:""}.ion-ios-shuffle:before{content:""}.ion-ios-shuffle-strong:before{content:""}.ion-ios-skipbackward:before{content:""}.ion-ios-skipbackward-outline:before{content:""}.ion-ios-skipforward:before{content:""}.ion-ios-skipforward-outline:before{content:""}.ion-ios-snowy:before{content:""}.ion-ios-speedometer:before{content:""}.ion-ios-speedometer-outline:before{content:""}.ion-ios-star:before{content:""}.ion-ios-star-half:before{content:""}.ion-ios-star-outline:before{content:""}.ion-ios-stopwatch:before{content:""}.ion-ios-stopwatch-outline:before{content:""}.ion-ios-sunny:before{content:""}.ion-ios-sunny-outline:before{content:""}.ion-ios-telephone:before{content:""}.ion-ios-telephone-outline:before{content:""}.ion-ios-tennisball:before{content:""}.ion-ios-tennisball-outline:before{content:""}.ion-ios-thunderstorm:before{content:""}.ion-ios-thunderstorm-outline:before{content:""}.ion-ios-time:before{content:""}.ion-ios-time-outline:before{content:""}.ion-ios-timer:before{content:""}.ion-ios-timer-outline:before{content:""}.ion-ios-toggle:before{content:""}.ion-ios-toggle-outline:before{content:""}.ion-ios-trash:before{content:""}.ion-ios-trash-outline:before{content:""}.ion-ios-undo:before{content:""}.ion-ios-undo-outline:before{content:""}.ion-ios-unlocked:before{content:""}.ion-ios-unlocked-outline:before{content:""}.ion-ios-upload:before{content:""}.ion-ios-upload-outline:before{content:""}.ion-ios-videocam:before{content:""}.ion-ios-videocam-outline:before{content:""}.ion-ios-volume-high:before{content:""}.ion-ios-volume-low:before{content:""}.ion-ios-wineglass:before{content:""}.ion-ios-wineglass-outline:before{content:""}.ion-ios-world:before{content:""}.ion-ios-world-outline:before{content:""}.ion-ipad:before{content:""}.ion-iphone:before{content:""}.ion-ipod:before{content:""}.ion-jet:before{content:""}.ion-key:before{content:""}.ion-knife:before{content:""}.ion-laptop:before{content:""}.ion-leaf:before{content:""}.ion-levels:before{content:""}.ion-lightbulb:before{content:""}.ion-link:before{content:""}.ion-load-a:before{content:""}.ion-load-b:before{content:""}.ion-load-c:before{content:""}.ion-load-d:before{content:""}.ion-location:before{content:""}.ion-lock-combination:before{content:""}.ion-locked:before{content:""}.ion-log-in:before{content:""}.ion-log-out:before{content:""}.ion-loop:before{content:""}.ion-magnet:before{content:""}.ion-male:before{content:""}.ion-man:before{content:""}.ion-map:before{content:""}.ion-medkit:before{content:""}.ion-merge:before{content:""}.ion-mic-a:before{content:""}.ion-mic-b:before{content:""}.ion-mic-c:before{content:""}.ion-minus:before{content:""}.ion-minus-circled:before{content:""}.ion-minus-round:before{content:""}.ion-model-s:before{content:""}.ion-monitor:before{content:""}.ion-more:before{content:""}.ion-mouse:before{content:""}.ion-music-note:before{content:""}.ion-navicon:before{content:""}.ion-navicon-round:before{content:""}.ion-navigate:before{content:""}.ion-network:before{content:""}.ion-no-smoking:before{content:""}.ion-nuclear:before{content:""}.ion-outlet:before{content:""}.ion-paintbrush:before{content:""}.ion-paintbucket:before{content:""}.ion-paper-airplane:before{content:""}.ion-paperclip:before{content:""}.ion-pause:before{content:""}.ion-person:before{content:""}.ion-person-add:before{content:""}.ion-person-stalker:before{content:""}.ion-pie-graph:before{content:""}.ion-pin:before{content:""}.ion-pinpoint:before{content:""}.ion-pizza:before{content:""}.ion-plane:before{content:""}.ion-planet:before{content:""}.ion-play:before{content:""}.ion-playstation:before{content:""}.ion-plus:before{content:""}.ion-plus-circled:before{content:""}.ion-plus-round:before{content:""}.ion-podium:before{content:""}.ion-pound:before{content:""}.ion-power:before{content:""}.ion-pricetag:before{content:""}.ion-pricetags:before{content:""}.ion-printer:before{content:""}.ion-pull-request:before{content:""}.ion-qr-scanner:before{content:""}.ion-quote:before{content:""}.ion-radio-waves:before{content:""}.ion-record:before{content:""}.ion-refresh:before{content:""}.ion-reply:before{content:""}.ion-reply-all:before{content:""}.ion-ribbon-a:before{content:""}.ion-ribbon-b:before{content:""}.ion-sad:before{content:""}.ion-sad-outline:before{content:""}.ion-scissors:before{content:""}.ion-search:before{content:""}.ion-settings:before{content:""}.ion-share:before{content:""}.ion-shuffle:before{content:""}.ion-skip-backward:before{content:""}.ion-skip-forward:before{content:""}.ion-social-android:before{content:""}.ion-social-android-outline:before{content:""}.ion-social-angular:before{content:""}.ion-social-angular-outline:before{content:""}.ion-social-apple:before{content:""}.ion-social-apple-outline:before{content:""}.ion-social-bitcoin:before{content:""}.ion-social-bitcoin-outline:before{content:""}.ion-social-buffer:before{content:""}.ion-social-buffer-outline:before{content:""}.ion-social-chrome:before{content:""}.ion-social-chrome-outline:before{content:""}.ion-social-codepen:before{content:""}.ion-social-codepen-outline:before{content:""}.ion-social-css3:before{content:""}.ion-social-css3-outline:before{content:""}.ion-social-designernews:before{content:""}.ion-social-designernews-outline:before{content:""}.ion-social-dribbble:before{content:""}.ion-social-dribbble-outline:before{content:""}.ion-social-dropbox:before{content:""}.ion-social-dropbox-outline:before{content:""}.ion-social-euro:before{content:""}.ion-social-euro-outline:before{content:""}.ion-social-facebook:before{content:""}.ion-social-facebook-outline:before{content:""}.ion-social-foursquare:before{content:""}.ion-social-foursquare-outline:before{content:""}.ion-social-freebsd-devil:before{content:""}.ion-social-github:before{content:""}.ion-social-github-outline:before{content:""}.ion-social-google:before{content:""}.ion-social-google-outline:before{content:""}.ion-social-googleplus:before{content:""}.ion-social-googleplus-outline:before{content:""}.ion-social-hackernews:before{content:""}.ion-social-hackernews-outline:before{content:""}.ion-social-html5:before{content:""}.ion-social-html5-outline:before{content:""}.ion-social-instagram:before{content:""}.ion-social-instagram-outline:before{content:""}.ion-social-javascript:before{content:""}.ion-social-javascript-outline:before{content:""}.ion-social-linkedin:before{content:""}.ion-social-linkedin-outline:before{content:""}.ion-social-markdown:before{content:""}.ion-social-nodejs:before{content:""}.ion-social-octocat:before{content:""}.ion-social-pinterest:before{content:""}.ion-social-pinterest-outline:before{content:""}.ion-social-python:before{content:""}.ion-social-reddit:before{content:""}.ion-social-reddit-outline:before{content:""}.ion-social-rss:before{content:""}.ion-social-rss-outline:before{content:""}.ion-social-sass:before{content:""}.ion-social-skype:before{content:""}.ion-social-skype-outline:before{content:""}.ion-social-snapchat:before{content:""}.ion-social-snapchat-outline:before{content:""}.ion-social-tumblr:before{content:""}.ion-social-tumblr-outline:before{content:""}.ion-social-tux:before{content:""}.ion-social-twitch:before{content:""}.ion-social-twitch-outline:before{content:""}.ion-social-twitter:before{content:""}.ion-social-twitter-outline:before{content:""}.ion-social-usd:before{content:""}.ion-social-usd-outline:before{content:""}.ion-social-vimeo:before{content:""}.ion-social-vimeo-outline:before{content:""}.ion-social-whatsapp:before{content:""}.ion-social-whatsapp-outline:before{content:""}.ion-social-windows:before{content:""}.ion-social-windows-outline:before{content:""}.ion-social-wordpress:before{content:""}.ion-social-wordpress-outline:before{content:""}.ion-social-yahoo:before{content:""}.ion-social-yahoo-outline:before{content:""}.ion-social-yen:before{content:""}.ion-social-yen-outline:before{content:""}.ion-social-youtube:before{content:""}.ion-social-youtube-outline:before{content:""}.ion-soup-can:before{content:""}.ion-soup-can-outline:before{content:""}.ion-speakerphone:before{content:""}.ion-speedometer:before{content:""}.ion-spoon:before{content:""}.ion-star:before{content:""}.ion-stats-bars:before{content:""}.ion-steam:before{content:""}.ion-stop:before{content:""}.ion-thermometer:before{content:""}.ion-thumbsdown:before{content:""}.ion-thumbsup:before{content:""}.ion-toggle:before{content:""}.ion-toggle-filled:before{content:""}.ion-transgender:before{content:""}.ion-trash-a:before{content:""}.ion-trash-b:before{content:""}.ion-trophy:before{content:""}.ion-tshirt:before{content:""}.ion-tshirt-outline:before{content:""}.ion-umbrella:before{content:""}.ion-university:before{content:""}.ion-unlocked:before{content:""}.ion-upload:before{content:""}.ion-usb:before{content:""}.ion-videocamera:before{content:""}.ion-volume-high:before{content:""}.ion-volume-low:before{content:""}.ion-volume-medium:before{content:""}.ion-volume-mute:before{content:""}.ion-wand:before{content:""}.ion-waterdrop:before{content:""}.ion-wifi:before{content:""}.ion-wineglass:before{content:""}.ion-woman:before{content:""}.ion-wrench:before{content:""}.ion-xbox:before{content:""}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a,a:active,a:focus,a:hover,button,button:focus{outline:0}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent}a[href]:hover{cursor:pointer}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit;background-image:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}img{-webkit-user-drag:none}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{overflow:hidden;-ms-touch-action:pan-y;touch-action:pan-y}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:-apple-system;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-backface-visibility:hidden;-webkit-user-drag:none;-ms-content-zooming:none}body.grade-b,body.grade-c{text-rendering:auto}.content{position:relative}.scroll-content{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;margin-top:-1px;padding-top:1px;margin-bottom:-1px;width:auto;height:auto}.menu .scroll-content.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.scroll-view.overflow-scroll{position:relative}.scroll-view.scroll-x{overflow-x:scroll;overflow-y:hidden}.scroll-view.scroll-y{overflow-x:hidden;overflow-y:scroll}.scroll-view.scroll-xy{overflow-x:scroll;overflow-y:scroll}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform-origin:left top;transform-origin:left top}@-ms-viewport{width:device-width}.scroll-bar{position:absolute;z-index:9999}.ng-animate .scroll-bar{visibility:hidden}.scroll-bar-h{right:2px;bottom:3px;left:2px;height:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{top:2px;right:3px;bottom:2px;width:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;border-radius:4px;background:rgba(0,0,0,.3);opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.scroll-bar-indicator.scroll-bar-fade-out{opacity:0}.platform-android .scroll-bar-indicator{border-radius:0}.grade-b .scroll-bar-indicator,.grade-c .scroll-bar-indicator{background:#aaa}.grade-b .scroll-bar-indicator.scroll-bar-fade-out,.grade-c .scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:none;transition:none}ion-infinite-scroll{height:60px;width:100%;display:block;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}ion-infinite-scroll .icon{font-size:30px;color:#666}ion-infinite-scroll:not(.active) .icon:before,ion-infinite-scroll:not(.active) .spinner{display:none}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;top:0;right:0;bottom:0;left:0;position:absolute}.overflow-scroll.pane{overflow-x:hidden;overflow-y:scroll}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.overflow-scroll.keyboard-up:not(.keyboard-up-confirm){overflow:hidden}.has-header{top:44px}.no-header{top:0}.has-subheader{top:88px}.has-tabs-top{top:93px}.has-header.has-subheader.has-tabs-top{top:137px}.has-footer{bottom:44px}.has-subfooter{bottom:88px}.bar-footer.has-tabs,.has-tabs{bottom:49px}.bar-footer.has-tabs.pane,.has-tabs.pane{bottom:49px;height:auto}.bar-subfooter.has-tabs,.has-footer.has-tabs{bottom:93px}.pane{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:0;transition-duration:0;z-index:1}.view{z-index:1}.pane,.view{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff;overflow:hidden}.view-container{position:absolute;display:block;width:100%;height:100%}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;line-height:1.2}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a{color:#387ef5}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}.action-sheet-backdrop{-webkit-transition:background-color 150ms ease-in-out;transition:background-color 150ms ease-in-out;position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:transparent}.action-sheet-backdrop.active{background-color:rgba(0,0,0,.4)}.action-sheet-wrapper{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:all cubic-bezier(.36,.66,.04,1) 500ms;transition:all cubic-bezier(.36,.66,.04,1) 500ms;position:absolute;bottom:0;left:0;right:0;width:100%;max-width:500px;margin:auto}.action-sheet-up{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.action-sheet{margin-left:8px;margin-right:8px;width:auto;z-index:11;overflow:hidden}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;border-color:#d1d3d6;background-color:transparent;color:#007aff;font-size:21px}.action-sheet .button:hover{color:#007aff}.action-sheet .button.destructive,.action-sheet .button.destructive:hover{color:#ff3b30}.action-sheet .button.activated,.action-sheet .button.active{box-shadow:none;border-color:#d1d3d6;color:#007aff;background:#e4e5e7}.action-sheet-has-icons .icon{position:absolute;left:16px}.action-sheet-title{padding:16px;color:#8f8f8f;text-align:center;font-size:13px}.action-sheet-group{margin-bottom:8px;border-radius:4px;background-color:#fff;overflow:hidden}.action-sheet-group .button{border-width:1px 0 0}.action-sheet-group .button:first-child:last-child{border-width:0}.action-sheet-options{background:#f1f2f3}.action-sheet-cancel .button{font-weight:500}.action-sheet-open,.action-sheet-open.modal-open .modal{pointer-events:none}.action-sheet-open .action-sheet-backdrop{pointer-events:auto}.platform-android .action-sheet-backdrop.active{background-color:rgba(0,0,0,.2)}.platform-android .action-sheet{margin:0}.platform-android .action-sheet .action-sheet-title,.platform-android .action-sheet .button{text-align:left;border-color:transparent;font-size:16px;color:inherit}.platform-android .action-sheet .action-sheet-title{font-size:14px;padding:16px;color:#666}.platform-android .action-sheet .button.activated,.platform-android .action-sheet .button.active{background:#e8e8e8}.platform-android .action-sheet-group{margin:0;border-radius:0;background-color:#fafafa}.platform-android .action-sheet-cancel{display:none}.platform-android .action-sheet-has-icons .button{padding-left:56px}.backdrop{position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:rgba(0,0,0,.4);visibility:hidden;opacity:0;-webkit-transition:.1s opacity linear;transition:.1s opacity linear}.backdrop.visible{visibility:visible}.backdrop.active{opacity:1}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:none;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:none;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;width:94%;height:28px;background:0 0}.bar.bar-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-light.bar-footer{background-image:linear-gradient(180deg,#ddd,#ddd 50%,transparent 50%)}.bar.bar-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-stable.bar-footer{background-image:linear-gradient(180deg,#b2b2b2,#b2b2b2 50%,transparent 50%)}.bar.bar-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#0c60ee,#0c60ee 50%,transparent 50%)}.bar.bar-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#0a9dc7,#0a9dc7 50%,transparent 50%)}.bar.bar-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#e42112,#e42112 50%,transparent 50%)}.bar.bar-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-balanced.bar-footer{background-image:linear-gradient(180deg,#28a54c,#0c60ee 50%,transparent 50%)}.bar.bar-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#e6b500,#e6b500 50%,transparent 50%)}.bar.bar-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-royal.bar-footer{background-image:linear-gradient(180deg,#6b46e5,#6b46e5 50%,transparent 50%)}.bar.bar-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar.bar-dark.bar-footer{background-image:linear-gradient(180deg,#111,#111 50%,transparent 50%)}.bar .title{display:block;position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;height:43px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:17px;font-weight:500;line-height:44px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button,.bar button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-weight:400;font-size:13px;line-height:32px}.bar .button .icon:before,.bar .button.button-icon:before,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before,.bar button .icon:before,.bar button.button-icon:before,.bar button.icon-left:before,.bar button.icon-right:before,.bar button.icon:before{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.bar .button.button-icon,.bar button.button-icon{font-size:17px}.bar .button.button-icon .icon:before,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon:before,.bar button.button-icon .icon:before,.bar button.button-icon.icon-left:before,.bar button.button-icon.icon-right:before,.bar button.button-icon:before{vertical-align:top;font-size:32px;line-height:32px}.bar .button.button-clear,.bar button.button-clear{padding-right:2px;padding-left:2px;font-weight:300;font-size:17px}.bar .button.button-clear .icon:before,.bar .button.button-clear.icon-left:before,.bar .button.button-clear.icon-right:before,.bar .button.button-clear.icon:before,.bar button.button-clear .icon:before,.bar button.button-clear.icon-left:before,.bar button.button-clear.icon-right:before,.bar button.button-clear.icon:before{font-size:32px;line-height:32px}.bar .button.back-button,.bar button.back-button{display:block;margin-right:5px;padding:0;white-space:nowrap;font-weight:400}.bar .button.back-button.activated,.bar .button.back-button.active,.bar button.back-button.activated,.bar button.back-button.active{opacity:.2}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:32px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .buttons,.bar .buttons.primary-buttons,.bar .buttons.secondary-buttons{display:inherit}.bar .buttons span{display:inline-block}.bar .buttons-left span{margin-right:5px;display:inherit}.bar .buttons-right span{margin-left:5px;display:inherit}.bar .buttons.pull-right,.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:5px;right:5px;bottom:5px}.platform-android .nav-bar-has-subheader .bar{background-image:none}.platform-android .bar .back-button .icon:before{font-size:24px}.platform-android .bar .title{font-size:19px;line-height:44px}.bar-light .button{border-color:transparent;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{background-color:#fafafa}.bar-light .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-light .button.button-icon{border-color:transparent;background:0 0}.bar-stable .button{border-color:transparent;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{background-color:#e5e5e5}.bar-stable .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-stable .button.button-icon{border-color:transparent;background:0 0}.bar-positive .button{border-color:transparent;background-color:#387ef5;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{background-color:#0c60ee}.bar-positive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-positive .button.button-icon{border-color:transparent;background:0 0}.bar-calm .button{border-color:transparent;background-color:#11c1f3;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{background-color:#0a9dc7}.bar-calm .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-calm .button.button-icon{border-color:transparent;background:0 0}.bar-assertive .button{border-color:transparent;background-color:#ef473a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{background-color:#e42112}.bar-assertive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-assertive .button.button-icon{border-color:transparent;background:0 0}.bar-balanced .button{border-color:transparent;background-color:#33cd5f;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{background-color:#28a54c}.bar-balanced .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-balanced .button.button-icon{border-color:transparent;background:0 0}.bar-energized .button{border-color:transparent;background-color:#ffc900;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{background-color:#e6b500}.bar-energized .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-energized .button.button-icon{border-color:transparent;background:0 0}.bar-royal .button{border-color:transparent;background-color:#886aea;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{background-color:#6b46e5}.bar-royal .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-royal .button.button-icon{border-color:transparent;background:0 0}.bar-dark .button{border-color:transparent;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{background-color:#262626}.bar-dark .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-dark .button.button-icon{border-color:transparent;background:0 0}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-header.has-tabs-top,.tabs-top .bar-header{border-bottom-width:0;background-image:none}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top;height:44px}.bar-footer.item-input-inset{position:absolute}.bar-tabs{padding:0}.bar-subheader{top:44px;display:block;height:44px}.bar-subfooter{bottom:44px;display:block;height:44px}.nav-bar-block{position:absolute;top:0;right:0;left:0;z-index:9}.bar .back-button.hide,.bar .buttons .hide{display:none}.nav-bar-tabs-top .bar{background-image:none}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs .tab-item .badge{background-color:#444;color:#f8f8f8}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:none!important;border-bottom:none;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-light>.tabs,.tabs.tabs-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.tabs-light>.tabs .tab-item .badge,.tabs.tabs-light .tab-item .badge{background-color:#444;color:#fff}.tabs-stable>.tabs,.tabs.tabs-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.tabs-stable>.tabs .tab-item .badge,.tabs.tabs-stable .tab-item .badge{background-color:#444;color:#f8f8f8}.tabs-positive>.tabs,.tabs.tabs-positive{border-color:#0c60ee;background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);color:#fff}.tabs-positive>.tabs .tab-item .badge,.tabs.tabs-positive .tab-item .badge{background-color:#fff;color:#387ef5}.tabs-calm>.tabs,.tabs.tabs-calm{border-color:#0a9dc7;background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);color:#fff}.tabs-calm>.tabs .tab-item .badge,.tabs.tabs-calm .tab-item .badge{background-color:#fff;color:#11c1f3}.tabs-assertive>.tabs,.tabs.tabs-assertive{border-color:#e42112;background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);color:#fff}.tabs-assertive>.tabs .tab-item .badge,.tabs.tabs-assertive .tab-item .badge{background-color:#fff;color:#ef473a}.tabs-balanced>.tabs,.tabs.tabs-balanced{border-color:#28a54c;background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);color:#fff}.tabs-balanced>.tabs .tab-item .badge,.tabs.tabs-balanced .tab-item .badge{background-color:#fff;color:#33cd5f}.tabs-energized>.tabs,.tabs.tabs-energized{border-color:#e6b500;background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);color:#fff}.tabs-energized>.tabs .tab-item .badge,.tabs.tabs-energized .tab-item .badge{background-color:#fff;color:#ffc900}.tabs-royal>.tabs,.tabs.tabs-royal{border-color:#6b46e5;background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);color:#fff}.tabs-royal>.tabs .tab-item .badge,.tabs.tabs-royal .tab-item .badge{background-color:#fff;color:#886aea}.tabs-dark>.tabs,.tabs.tabs-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.tabs-dark>.tabs .tab-item .badge,.tabs.tabs-dark .tab-item .badge{background-color:#fff;color:#444}.tabs-striped .tabs{background-color:#fff;background-image:none;border:none;border-bottom:1px solid #ddd;padding-top:2px}.tabs-striped .tab-item.activated,.tabs-striped .tab-item.active,.tabs-striped .tab-item.tab-item-active{margin-top:-2px;border-style:solid;border-width:2px 0 0;border-color:#444}.tabs-striped .tab-item.activated .badge,.tabs-striped .tab-item.active .badge,.tabs-striped .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-light .tabs{background-color:#fff}.tabs-striped.tabs-light .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-light .tab-item.activated,.tabs-striped.tabs-light .tab-item.active,.tabs-striped.tabs-light .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0;border-color:#444}.tabs-striped.tabs-stable .tabs{background-color:#f8f8f8}.tabs-striped.tabs-stable .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-stable .tab-item.activated,.tabs-striped.tabs-stable .tab-item.active,.tabs-striped.tabs-stable .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0;border-color:#444}.tabs-striped.tabs-positive .tabs{background-color:#387ef5}.tabs-striped.tabs-positive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-positive .tab-item.activated,.tabs-striped.tabs-positive .tab-item.active,.tabs-striped.tabs-positive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-calm .tabs{background-color:#11c1f3}.tabs-striped.tabs-calm .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-calm .tab-item.activated,.tabs-striped.tabs-calm .tab-item.active,.tabs-striped.tabs-calm .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-assertive .tabs{background-color:#ef473a}.tabs-striped.tabs-assertive .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-assertive .tab-item.activated,.tabs-striped.tabs-assertive .tab-item.active,.tabs-striped.tabs-assertive .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-balanced .tabs{background-color:#33cd5f}.tabs-striped.tabs-balanced .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-balanced .tab-item.activated,.tabs-striped.tabs-balanced .tab-item.active,.tabs-striped.tabs-balanced .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-energized .tabs{background-color:#ffc900}.tabs-striped.tabs-energized .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-energized .tab-item.activated,.tabs-striped.tabs-energized .tab-item.active,.tabs-striped.tabs-energized .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-royal .tabs{background-color:#886aea}.tabs-striped.tabs-royal .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-royal .tab-item.activated,.tabs-striped.tabs-royal .tab-item.active,.tabs-striped.tabs-royal .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-dark .tabs{background-color:#444}.tabs-striped.tabs-dark .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-dark .tab-item.activated,.tabs-striped.tabs-dark .tab-item.active,.tabs-striped.tabs-dark .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-background-light .tabs{background-color:#fff;background-image:none}.tabs-striped.tabs-background-stable .tabs{background-color:#f8f8f8;background-image:none}.tabs-striped.tabs-background-positive .tabs{background-color:#387ef5;background-image:none}.tabs-striped.tabs-background-calm .tabs{background-color:#11c1f3;background-image:none}.tabs-striped.tabs-background-assertive .tabs{background-color:#ef473a;background-image:none}.tabs-striped.tabs-background-balanced .tabs{background-color:#33cd5f;background-image:none}.tabs-striped.tabs-background-energized .tabs{background-color:#ffc900;background-image:none}.tabs-striped.tabs-background-royal .tabs{background-color:#886aea;background-image:none}.tabs-striped.tabs-background-dark .tabs{background-color:#444;background-image:none}.tabs-striped.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-color-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-light .tab-item.activated,.tabs-striped.tabs-color-light .tab-item.active,.tabs-striped.tabs-color-light .tab-item.tab-item-active{margin-top:-2px;color:#fff;border:0 solid #fff;border-top-width:2px}.tabs-striped.tabs-color-light .tab-item.activated .badge,.tabs-striped.tabs-color-light .tab-item.active .badge,.tabs-striped.tabs-color-light .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-striped.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-stable .tab-item.activated,.tabs-striped.tabs-color-stable .tab-item.active,.tabs-striped.tabs-color-stable .tab-item.tab-item-active{margin-top:-2px;color:#f8f8f8;border:0 solid #f8f8f8;border-top-width:2px}.tabs-striped.tabs-color-stable .tab-item.activated .badge,.tabs-striped.tabs-color-stable .tab-item.active .badge,.tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-striped.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-positive .tab-item.activated,.tabs-striped.tabs-color-positive .tab-item.active,.tabs-striped.tabs-color-positive .tab-item.tab-item-active{margin-top:-2px;color:#387ef5;border:0 solid #387ef5;border-top-width:2px}.tabs-striped.tabs-color-positive .tab-item.activated .badge,.tabs-striped.tabs-color-positive .tab-item.active .badge,.tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-striped.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-calm .tab-item.activated,.tabs-striped.tabs-color-calm .tab-item.active,.tabs-striped.tabs-color-calm .tab-item.tab-item-active{margin-top:-2px;color:#11c1f3;border:0 solid #11c1f3;border-top-width:2px}.tabs-striped.tabs-color-calm .tab-item.activated .badge,.tabs-striped.tabs-color-calm .tab-item.active .badge,.tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-striped.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-assertive .tab-item.activated,.tabs-striped.tabs-color-assertive .tab-item.active,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active{margin-top:-2px;color:#ef473a;border:0 solid #ef473a;border-top-width:2px}.tabs-striped.tabs-color-assertive .tab-item.activated .badge,.tabs-striped.tabs-color-assertive .tab-item.active .badge,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-striped.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-balanced .tab-item.activated,.tabs-striped.tabs-color-balanced .tab-item.active,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active{margin-top:-2px;color:#33cd5f;border:0 solid #33cd5f;border-top-width:2px}.tabs-striped.tabs-color-balanced .tab-item.activated .badge,.tabs-striped.tabs-color-balanced .tab-item.active .badge,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-striped.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-energized .tab-item.activated,.tabs-striped.tabs-color-energized .tab-item.active,.tabs-striped.tabs-color-energized .tab-item.tab-item-active{margin-top:-2px;color:#ffc900;border:0 solid #ffc900;border-top-width:2px}.tabs-striped.tabs-color-energized .tab-item.activated .badge,.tabs-striped.tabs-color-energized .tab-item.active .badge,.tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-striped.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-royal .tab-item.activated,.tabs-striped.tabs-color-royal .tab-item.active,.tabs-striped.tabs-color-royal .tab-item.tab-item-active{margin-top:-2px;color:#886aea;border:0 solid #886aea;border-top-width:2px}.tabs-striped.tabs-color-royal .tab-item.activated .badge,.tabs-striped.tabs-color-royal .tab-item.active .badge,.tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-dark .tab-item.activated,.tabs-striped.tabs-color-dark .tab-item.active,.tabs-striped.tabs-color-dark .tab-item.tab-item-active{margin-top:-2px;color:#444;border:0 solid #444;border-top-width:2px}.tabs-striped.tabs-color-dark .tab-item.activated .badge,.tabs-striped.tabs-color-dark .tab-item.active .badge,.tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-background-light .tabs,.tabs-background-light>.tabs{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd}.tabs-background-stable .tabs,.tabs-background-stable>.tabs{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2}.tabs-background-positive .tabs,.tabs-background-positive>.tabs{background-color:#387ef5;background-image:linear-gradient(0deg,#0c60ee,#0c60ee 50%,transparent 50%);border-color:#0c60ee}.tabs-background-calm .tabs,.tabs-background-calm>.tabs{background-color:#11c1f3;background-image:linear-gradient(0deg,#0a9dc7,#0a9dc7 50%,transparent 50%);border-color:#0a9dc7}.tabs-background-assertive .tabs,.tabs-background-assertive>.tabs{background-color:#ef473a;background-image:linear-gradient(0deg,#e42112,#e42112 50%,transparent 50%);border-color:#e42112}.tabs-background-balanced .tabs,.tabs-background-balanced>.tabs{background-color:#33cd5f;background-image:linear-gradient(0deg,#28a54c,#28a54c 50%,transparent 50%);border-color:#28a54c}.tabs-background-energized .tabs,.tabs-background-energized>.tabs{background-color:#ffc900;background-image:linear-gradient(0deg,#e6b500,#e6b500 50%,transparent 50%);border-color:#e6b500}.tabs-background-royal .tabs,.tabs-background-royal>.tabs{background-color:#886aea;background-image:linear-gradient(0deg,#6b46e5,#6b46e5 50%,transparent 50%);border-color:#6b46e5}.tabs-background-dark .tabs,.tabs-background-dark>.tabs{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111}.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-color-light .tab-item .badge{opacity:.4}.tabs-color-light .tab-item.activated,.tabs-color-light .tab-item.active,.tabs-color-light .tab-item.tab-item-active{color:#fff;border:0 solid #fff}.tabs-color-light .tab-item.activated .badge,.tabs-color-light .tab-item.active .badge,.tabs-color-light .tab-item.tab-item-active .badge{opacity:1}.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-color-stable .tab-item.activated,.tabs-color-stable .tab-item.active,.tabs-color-stable .tab-item.tab-item-active{color:#f8f8f8;border:0 solid #f8f8f8}.tabs-color-stable .tab-item.activated .badge,.tabs-color-stable .tab-item.active .badge,.tabs-color-stable .tab-item.tab-item-active .badge{opacity:1}.tabs-color-positive .tab-item{color:rgba(56,126,245,.4);opacity:1}.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-color-positive .tab-item.activated,.tabs-color-positive .tab-item.active,.tabs-color-positive .tab-item.tab-item-active{color:#387ef5;border:0 solid #387ef5}.tabs-color-positive .tab-item.activated .badge,.tabs-color-positive .tab-item.active .badge,.tabs-color-positive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-calm .tab-item{color:rgba(17,193,243,.4);opacity:1}.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-color-calm .tab-item.activated,.tabs-color-calm .tab-item.active,.tabs-color-calm .tab-item.tab-item-active{color:#11c1f3;border:0 solid #11c1f3}.tabs-color-calm .tab-item.activated .badge,.tabs-color-calm .tab-item.active .badge,.tabs-color-calm .tab-item.tab-item-active .badge{opacity:1}.tabs-color-assertive .tab-item{color:rgba(239,71,58,.4);opacity:1}.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-color-assertive .tab-item.activated,.tabs-color-assertive .tab-item.active,.tabs-color-assertive .tab-item.tab-item-active{color:#ef473a;border:0 solid #ef473a}.tabs-color-assertive .tab-item.activated .badge,.tabs-color-assertive .tab-item.active .badge,.tabs-color-assertive .tab-item.tab-item-active .badge{opacity:1}.tabs-color-balanced .tab-item{color:rgba(51,205,95,.4);opacity:1}.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-color-balanced .tab-item.activated,.tabs-color-balanced .tab-item.active,.tabs-color-balanced .tab-item.tab-item-active{color:#33cd5f;border:0 solid #33cd5f}.tabs-color-balanced .tab-item.activated .badge,.tabs-color-balanced .tab-item.active .badge,.tabs-color-balanced .tab-item.tab-item-active .badge{opacity:1}.tabs-color-energized .tab-item{color:rgba(255,201,0,.4);opacity:1}.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-color-energized .tab-item.activated,.tabs-color-energized .tab-item.active,.tabs-color-energized .tab-item.tab-item-active{color:#ffc900;border:0 solid #ffc900}.tabs-color-energized .tab-item.activated .badge,.tabs-color-energized .tab-item.active .badge,.tabs-color-energized .tab-item.tab-item-active .badge{opacity:1}.tabs-color-royal .tab-item{color:rgba(136,106,234,.4);opacity:1}.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-color-royal .tab-item.activated,.tabs-color-royal .tab-item.active,.tabs-color-royal .tab-item.tab-item-active{color:#886aea;border:0 solid #886aea}.tabs-color-royal .tab-item.activated .badge,.tabs-color-royal .tab-item.active .badge,.tabs-color-royal .tab-item.tab-item-active .badge{opacity:1}.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-color-dark .tab-item.activated,.tabs-color-dark .tab-item.active,.tabs-color-dark .tab-item.tab-item-active{color:#444;border:0 solid #444}.tabs-color-dark .tab-item.activated .badge,.tabs-color-dark .tab-item.active .badge,.tabs-color-dark .tab-item.tab-item-active .badge{opacity:1}ion-tabs.tabs-color-active-light .tab-item{color:#444}ion-tabs.tabs-color-active-light .tab-item.activated,ion-tabs.tabs-color-active-light .tab-item.active,ion-tabs.tabs-color-active-light .tab-item.tab-item-active{color:#fff}ion-tabs.tabs-color-active-stable .tab-item{color:#444}ion-tabs.tabs-color-active-stable .tab-item.activated,ion-tabs.tabs-color-active-stable .tab-item.active,ion-tabs.tabs-color-active-stable .tab-item.tab-item-active{color:#f8f8f8}ion-tabs.tabs-color-active-positive .tab-item{color:#444}ion-tabs.tabs-color-active-positive .tab-item.activated,ion-tabs.tabs-color-active-positive .tab-item.active,ion-tabs.tabs-color-active-positive .tab-item.tab-item-active{color:#387ef5}ion-tabs.tabs-color-active-calm .tab-item{color:#444}ion-tabs.tabs-color-active-calm .tab-item.activated,ion-tabs.tabs-color-active-calm .tab-item.active,ion-tabs.tabs-color-active-calm .tab-item.tab-item-active{color:#11c1f3}ion-tabs.tabs-color-active-assertive .tab-item{color:#444}ion-tabs.tabs-color-active-assertive .tab-item.activated,ion-tabs.tabs-color-active-assertive .tab-item.active,ion-tabs.tabs-color-active-assertive .tab-item.tab-item-active{color:#ef473a}ion-tabs.tabs-color-active-balanced .tab-item{color:#444}ion-tabs.tabs-color-active-balanced .tab-item.activated,ion-tabs.tabs-color-active-balanced .tab-item.active,ion-tabs.tabs-color-active-balanced .tab-item.tab-item-active{color:#33cd5f}ion-tabs.tabs-color-active-energized .tab-item{color:#444}ion-tabs.tabs-color-active-energized .tab-item.activated,ion-tabs.tabs-color-active-energized .tab-item.active,ion-tabs.tabs-color-active-energized .tab-item.tab-item-active{color:#ffc900}ion-tabs.tabs-color-active-royal .tab-item{color:#444}ion-tabs.tabs-color-active-royal .tab-item.activated,ion-tabs.tabs-color-active-royal .tab-item.active,ion-tabs.tabs-color-active-royal .tab-item.tab-item-active{color:#886aea}ion-tabs.tabs-color-active-dark .tab-item{color:#fff}ion-tabs.tabs-color-active-dark .tab-item.activated,ion-tabs.tabs-color-active-dark .tab-item.active,ion-tabs.tabs-color-active-dark .tab-item.tab-item-active{color:#444}.tabs-top.tabs-striped{padding-bottom:0}.tabs-top.tabs-striped .tab-item{background:0 0;-webkit-transition:color .1s ease;-moz-transition:color .1s ease;-ms-transition:color .1s ease;-o-transition:color .1s ease;transition:color .1s ease}.tabs-top.tabs-striped .tab-item.activated,.tabs-top.tabs-striped .tab-item.active,.tabs-top.tabs-striped .tab-item.tab-item-active{margin-top:1px;border-width:0 0 2px!important;border-style:solid}.tabs-top.tabs-striped .tab-item.activated>.badge,.tabs-top.tabs-striped .tab-item.activated>i,.tabs-top.tabs-striped .tab-item.active>.badge,.tabs-top.tabs-striped .tab-item.active>i,.tabs-top.tabs-striped .tab-item.tab-item-active>.badge,.tabs-top.tabs-striped .tab-item.tab-item-active>i{margin-top:-1px}.tabs-top.tabs-striped .tab-item .badge{-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.activated i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.active i,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped:not(.tabs-icon-left):not(.tabs-icon-top) .tab-item.tab-item-active i{display:block;margin-top:-1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item{margin-top:1px}.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.activated i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.active i,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active .tab-title,.tabs-top.tabs-striped.tabs-icon-left .tab-item.tab-item-active i{margin-top:-.1em}.tabs-top>.tabs,.tabs.tabs-top{top:44px;padding-top:0;background-position:bottom;border-top-width:0;border-bottom-width:1px}.tabs-top>.tabs .tab-item.activated .badge,.tabs-top>.tabs .tab-item.active .badge,.tabs-top>.tabs .tab-item.tab-item-active .badge,.tabs.tabs-top .tab-item.activated .badge,.tabs.tabs-top .tab-item.active .badge,.tabs.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-top~.bar-header{border-bottom-width:0}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif;opacity:.7}.tab-item:hover{cursor:pointer}.tab-item.tab-hidden,.tabs-item-hide>.tabs,.tabs.tabs-item-hide{display:none}.tabs-icon-bottom.tabs .tab-item,.tabs-icon-bottom>.tabs .tab-item,.tabs-icon-top.tabs .tab-item,.tabs-icon-top>.tabs .tab-item{font-size:10px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left.tabs .tab-item,.tabs-icon-left>.tabs .tab-item,.tabs-icon-right.tabs .tab-item,.tabs-icon-right>.tabs .tab-item{font-size:10px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left.tabs .tab-item .tab-title,.tabs-icon-left>.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .tab-title,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right.tabs .tab-item .tab-title,.tabs-icon-right>.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .tab-title{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left.tabs .tab-item .tab-title:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .tab-title:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .tab-title:before,.tabs-icon-right>.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .tab-title:before{font-size:24px;line-height:49px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .icon{padding-right:3px}.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{padding-left:3px}.tabs-icon-only.tabs .icon,.tabs-icon-only>.tabs .icon{line-height:inherit}.tab-item.has-badge{position:relative}.tab-item .badge{position:absolute;top:4%;right:33%;right:calc(50% - 26px);padding:1px 6px;height:auto;font-size:12px;line-height:16px}.tab-item.activated,.tab-item.active,.tab-item.tab-item-active{opacity:1}.tab-item.activated.tab-item-light,.tab-item.active.tab-item-light,.tab-item.tab-item-active.tab-item-light{color:#fff}.tab-item.activated.tab-item-stable,.tab-item.active.tab-item-stable,.tab-item.tab-item-active.tab-item-stable{color:#f8f8f8}.tab-item.activated.tab-item-positive,.tab-item.active.tab-item-positive,.tab-item.tab-item-active.tab-item-positive{color:#387ef5}.tab-item.activated.tab-item-calm,.tab-item.active.tab-item-calm,.tab-item.tab-item-active.tab-item-calm{color:#11c1f3}.tab-item.activated.tab-item-assertive,.tab-item.active.tab-item-assertive,.tab-item.tab-item-active.tab-item-assertive{color:#ef473a}.tab-item.activated.tab-item-balanced,.tab-item.active.tab-item-balanced,.tab-item.tab-item-active.tab-item-balanced{color:#33cd5f}.tab-item.activated.tab-item-energized,.tab-item.active.tab-item-energized,.tab-item.tab-item-active.tab-item-energized{color:#ffc900}.tab-item.activated.tab-item-royal,.tab-item.active.tab-item-royal,.tab-item.tab-item-active.tab-item-royal{color:#886aea}.tab-item.activated.tab-item-dark,.tab-item.active.tab-item-dark,.tab-item.tab-item-active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon:before{position:relative}.tab-item.disabled,.tab-item[disabled]{opacity:.4;cursor:default;pointer-events:none}.nav-bar-tabs-top.hide~.view-container .tabs-top .tabs{top:0}.pane[hide-nav-bar=true] .has-tabs-top{top:49px}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu .scroll-content{z-index:10}.menu .bar-header{z-index:11}.menu-content{-webkit-transform:none;transform:none;box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-open .menu-content .pane,.menu-open .menu-content .scroll-content,.menu-open .menu-content .scroll-content .scroll{pointer-events:none}.menu-open .menu-content .scroll-content:not(.overflow-scroll){overflow:hidden}.grade-b .menu-content,.grade-c .menu-content{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;right:-1px;left:-1px;border-right:1px solid #ccc;border-left:1px solid #ccc;box-shadow:none}.menu-left{left:0}.menu-right{right:0}.aside-open.aside-resizing .menu-right{display:none}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;transition:transform 200ms ease}.modal-backdrop,.modal-backdrop-bg{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%}.modal-backdrop-bg{pointer-events:none}.modal{display:block;position:absolute;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff}@media (min-width:680px){.modal{top:20%;right:20%;bottom:20%;left:20%;min-height:240px;width:60%}.modal.ng-leave-active{bottom:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader,.platform-ios.platform-cordova .modal-wrapper .modal .has-header,.platform-ios.platform-cordova .modal-wrapper .modal .tabs-top>.tabs,.platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top{top:44px}.platform-ios.platform-cordova .modal-wrapper .modal .has-subheader{top:88px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}.modal-backdrop-bg{-webkit-transition:opacity 300ms ease-in-out;transition:opacity 300ms ease-in-out;background-color:#000;opacity:0}.active .modal-backdrop-bg{opacity:.5}}.modal-open{pointer-events:none}.modal-open .modal,.modal-open .modal-backdrop{pointer-events:auto}.modal-open.loading-active .modal,.modal-open.loading-active .modal-backdrop{pointer-events:none}.popover-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.popover-backdrop.active{background-color:rgba(0,0,0,.1)}.popover{position:absolute;top:25%;left:50%;z-index:10;display:block;margin-top:12px;margin-left:-110px;height:280px;width:220px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);opacity:0}.popover .item:first-child{border-top:0}.popover .item:last-child{border-bottom:0}.popover.popover-bottom{margin-top:-12px}.popover,.popover .bar-header{border-radius:2px}.popover .scroll-content{z-index:1;margin:2px 0}.popover .bar-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.popover .has-header{border-top-right-radius:0;border-top-left-radius:0}.popover-arrow{display:none}.platform-ios .popover{box-shadow:0 0 40px rgba(0,0,0,.08);border-radius:10px}.platform-ios .popover .bar-header{-webkit-border-top-right-radius:10px;border-top-right-radius:10px;-webkit-border-top-left-radius:10px;border-top-left-radius:10px}.platform-ios .popover .scroll-content{margin:8px 0;border-radius:10px}.platform-ios .popover .scroll-content.has-header{margin-top:0}.platform-ios .popover-arrow{position:absolute;display:block;top:-17px;width:30px;height:19px;overflow:hidden}.platform-ios .popover-arrow:after{position:absolute;top:12px;left:5px;width:20px;height:20px;background-color:#fff;border-radius:3px;content:'';-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.platform-ios .popover-bottom .popover-arrow{top:auto;bottom:-10px}.platform-ios .popover-bottom .popover-arrow:after{top:-6px}.platform-android .popover{margin-top:-32px;background-color:#fafafa;box-shadow:0 2px 6px rgba(0,0,0,.35)}.platform-android .popover .item{border-color:#fafafa;background-color:#fafafa;color:#4d4d4d}.platform-android .popover.popover-bottom{margin-top:32px}.platform-android .popover-backdrop,.platform-android .popover-backdrop.active{background-color:transparent}.popover-open{pointer-events:none}.popover-open .popover,.popover-open .popover-backdrop{pointer-events:auto}.popover-open.loading-active .popover,.popover-open.loading-active .popover-backdrop{pointer-events:none}@media (min-width:680px){.popover{width:360px;margin-left:-180px}}.popup-container{position:absolute;top:0;left:0;bottom:0;right:0;background:0 0;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;z-index:12;visibility:hidden}.popup-container.popup-showing{visibility:visible}.popup-container.popup-hidden .popup{-webkit-animation-name:scaleOut;animation-name:scaleOut;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container.active .popup{-webkit-animation-name:superScaleIn;animation-name:superScaleIn;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.popup-container .popup{width:250px;max-width:100%;max-height:90%;border-radius:0;background-color:rgba(255,255,255,.9);display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.popup-container input,.popup-container textarea{width:100%}.popup-head{padding:15px 10px;border-bottom:1px solid #eee;text-align:center}.popup-title{margin:0;padding:0;font-size:15px}.popup-sub-title{margin:5px 0 0;padding:0;font-weight:400;font-size:11px}.popup-body{padding:10px;overflow:auto}.popup-buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:10px;min-height:65px}.popup-buttons .button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;min-height:45px;border-radius:2px;line-height:20px;margin-right:5px}.popup-buttons .button:last-child{margin-right:0}.popup-open,.popup-open.modal-open .modal{pointer-events:none}.popup-open .popup,.popup-open .popup-backdrop{pointer-events:auto}.loading-container{position:absolute;left:0;top:0;right:0;bottom:0;z-index:13;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-transition:.2s opacity linear;transition:.2s opacity linear;visibility:hidden;opacity:0}.loading-container:not(.visible) .icon,.loading-container:not(.visible) .spinner{display:none}.loading-container.visible{visibility:visible}.loading-container.active{opacity:1}.loading-container .loading{padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading-container .loading h1,.loading-container .loading h2,.loading-container .loading h3,.loading-container .loading h4,.loading-container .loading h5,.loading-container .loading h6{color:#fff}.item{border-color:#ddd;background-color:#fff;color:#444;position:relative;z-index:2;display:block;margin:-1px;padding:16px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 2px;font-size:16px;font-weight:400}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;font-size:10px}.item p{color:#666;font-size:14px;margin-bottom:2px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;position:absolute;top:16px;right:32px}.item.item-button-right .badge{right:67px}.item.item-divider .badge{top:8px}.item .badge+.badge{margin-right:5px}.item.item-light{border-color:#ddd;background-color:#fff;color:#444}.item.item-stable{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item.item-positive{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item.item-calm{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item.item-assertive{border-color:#e42112;background-color:#ef473a;color:#fff}.item.item-balanced{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item.item-energized{border-color:#e6b500;background-color:#ffc900;color:#fff}.item.item-royal{border-color:#6b46e5;background-color:#886aea;color:#fff}.item.item-dark{border-color:#111;background-color:#444;color:#fff}.item[ng-click]:hover{cursor:pointer}.item-borderless,.list-borderless .item{border-width:0}.item .item-content.activated,.item .item-content.activated.item-complex>.item-content,.item .item-content.active,.item .item-content.active.item-complex>.item-content,.item-complex.activated .item-content,.item-complex.activated .item-content.item-complex>.item-content,.item-complex.active .item-content,.item-complex.active .item-content.item-complex>.item-content,.item.activated,.item.activated.item-complex>.item-content,.item.active,.item.active.item-complex>.item-content{border-color:#ccc;background-color:#D9D9D9}.item .item-content.activated.item-light,.item .item-content.activated.item-light.item-complex>.item-content,.item .item-content.active.item-light,.item .item-content.active.item-light.item-complex>.item-content,.item-complex.activated .item-content.item-light,.item-complex.activated .item-content.item-light.item-complex>.item-content,.item-complex.active .item-content.item-light,.item-complex.active .item-content.item-light.item-complex>.item-content,.item.activated.item-light,.item.activated.item-light.item-complex>.item-content,.item.active.item-light,.item.active.item-light.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.activated.item-stable.item-complex>.item-content,.item .item-content.active.item-stable,.item .item-content.active.item-stable.item-complex>.item-content,.item-complex.activated .item-content.item-stable,.item-complex.activated .item-content.item-stable.item-complex>.item-content,.item-complex.active .item-content.item-stable,.item-complex.active .item-content.item-stable.item-complex>.item-content,.item.activated.item-stable,.item.activated.item-stable.item-complex>.item-content,.item.active.item-stable,.item.active.item-stable.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.activated.item-positive.item-complex>.item-content,.item .item-content.active.item-positive,.item .item-content.active.item-positive.item-complex>.item-content,.item-complex.activated .item-content.item-positive,.item-complex.activated .item-content.item-positive.item-complex>.item-content,.item-complex.active .item-content.item-positive,.item-complex.active .item-content.item-positive.item-complex>.item-content,.item.activated.item-positive,.item.activated.item-positive.item-complex>.item-content,.item.active.item-positive,.item.active.item-positive.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item .item-content.activated.item-calm,.item .item-content.activated.item-calm.item-complex>.item-content,.item .item-content.active.item-calm,.item .item-content.active.item-calm.item-complex>.item-content,.item-complex.activated .item-content.item-calm,.item-complex.activated .item-content.item-calm.item-complex>.item-content,.item-complex.active .item-content.item-calm,.item-complex.active .item-content.item-calm.item-complex>.item-content,.item.activated.item-calm,.item.activated.item-calm.item-complex>.item-content,.item.active.item-calm,.item.active.item-calm.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item .item-content.activated.item-assertive,.item .item-content.activated.item-assertive.item-complex>.item-content,.item .item-content.active.item-assertive,.item .item-content.active.item-assertive.item-complex>.item-content,.item-complex.activated .item-content.item-assertive,.item-complex.activated .item-content.item-assertive.item-complex>.item-content,.item-complex.active .item-content.item-assertive,.item-complex.active .item-content.item-assertive.item-complex>.item-content,.item.activated.item-assertive,.item.activated.item-assertive.item-complex>.item-content,.item.active.item-assertive,.item.active.item-assertive.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item .item-content.activated.item-balanced,.item .item-content.activated.item-balanced.item-complex>.item-content,.item .item-content.active.item-balanced,.item .item-content.active.item-balanced.item-complex>.item-content,.item-complex.activated .item-content.item-balanced,.item-complex.activated .item-content.item-balanced.item-complex>.item-content,.item-complex.active .item-content.item-balanced,.item-complex.active .item-content.item-balanced.item-complex>.item-content,.item.activated.item-balanced,.item.activated.item-balanced.item-complex>.item-content,.item.active.item-balanced,.item.active.item-balanced.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item .item-content.activated.item-energized,.item .item-content.activated.item-energized.item-complex>.item-content,.item .item-content.active.item-energized,.item .item-content.active.item-energized.item-complex>.item-content,.item-complex.activated .item-content.item-energized,.item-complex.activated .item-content.item-energized.item-complex>.item-content,.item-complex.active .item-content.item-energized,.item-complex.active .item-content.item-energized.item-complex>.item-content,.item.activated.item-energized,.item.activated.item-energized.item-complex>.item-content,.item.active.item-energized,.item.active.item-energized.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item .item-content.activated.item-royal,.item .item-content.activated.item-royal.item-complex>.item-content,.item .item-content.active.item-royal,.item .item-content.active.item-royal.item-complex>.item-content,.item-complex.activated .item-content.item-royal,.item-complex.activated .item-content.item-royal.item-complex>.item-content,.item-complex.active .item-content.item-royal,.item-complex.active .item-content.item-royal.item-complex>.item-content,.item.activated.item-royal,.item.activated.item-royal.item-complex>.item-content,.item.active.item-royal,.item.active.item-royal.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item .item-content.activated.item-dark,.item .item-content.activated.item-dark.item-complex>.item-content,.item .item-content.active.item-dark,.item .item-content.active.item-dark.item-complex>.item-content,.item-complex.activated .item-content.item-dark,.item-complex.activated .item-content.item-dark.item-complex>.item-content,.item-complex.active .item-content.item-dark,.item-complex.active .item-content.item-dark.item-complex>.item-content,.item.activated.item-dark,.item.activated.item-dark.item-complex>.item-content,.item.active.item-dark,.item.active.item-dark.item-complex>.item-content{border-color:#000;background-color:#262626}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{position:relative;z-index:2;padding:16px 49px 16px 16px;border:none;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap,.item-complex.item-text-wrap .item-content,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p,.item-text-wrap,.item-text-wrap .item,.item-text-wrap .item-content,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:visible;white-space:normal}.item-complex.item-light>.item-content{border-color:#ddd;background-color:#fff;color:#444}.item-complex.item-light>.item-content.active,.item-complex.item-light>.item-content.active.item-complex>.item-content,.item-complex.item-light>.item-content:active,.item-complex.item-light>.item-content:active.item-complex>.item-content{border-color:#ccc;background-color:#fafafa}.item-complex.item-stable>.item-content{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item-complex.item-stable>.item-content.active,.item-complex.item-stable>.item-content.active.item-complex>.item-content,.item-complex.item-stable>.item-content:active,.item-complex.item-stable>.item-content:active.item-complex>.item-content{border-color:#a2a2a2;background-color:#e5e5e5}.item-complex.item-positive>.item-content{border-color:#0c60ee;background-color:#387ef5;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content.active.item-complex>.item-content,.item-complex.item-positive>.item-content:active,.item-complex.item-positive>.item-content:active.item-complex>.item-content{border-color:#0c60ee;background-color:#0c60ee}.item-complex.item-calm>.item-content{border-color:#0a9dc7;background-color:#11c1f3;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content.active.item-complex>.item-content,.item-complex.item-calm>.item-content:active,.item-complex.item-calm>.item-content:active.item-complex>.item-content{border-color:#0a9dc7;background-color:#0a9dc7}.item-complex.item-assertive>.item-content{border-color:#e42112;background-color:#ef473a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content.active.item-complex>.item-content,.item-complex.item-assertive>.item-content:active,.item-complex.item-assertive>.item-content:active.item-complex>.item-content{border-color:#e42112;background-color:#e42112}.item-complex.item-balanced>.item-content{border-color:#28a54c;background-color:#33cd5f;color:#fff}.item-complex.item-balanced>.item-content.active,.item-complex.item-balanced>.item-content.active.item-complex>.item-content,.item-complex.item-balanced>.item-content:active,.item-complex.item-balanced>.item-content:active.item-complex>.item-content{border-color:#28a54c;background-color:#28a54c}.item-complex.item-energized>.item-content{border-color:#e6b500;background-color:#ffc900;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content.active.item-complex>.item-content,.item-complex.item-energized>.item-content:active,.item-complex.item-energized>.item-content:active.item-complex>.item-content{border-color:#e6b500;background-color:#e6b500}.item-complex.item-royal>.item-content{border-color:#6b46e5;background-color:#886aea;color:#fff}.item-complex.item-royal>.item-content.active,.item-complex.item-royal>.item-content.active.item-complex>.item-content,.item-complex.item-royal>.item-content:active,.item-complex.item-royal>.item-content:active.item-complex>.item-content{border-color:#6b46e5;background-color:#6b46e5}.item-complex.item-dark>.item-content{border-color:#111;background-color:#444;color:#fff}.item-complex.item-dark>.item-content.active,.item-complex.item-dark>.item-content.active.item-complex>.item-content,.item-complex.item-dark>.item-content:active,.item-complex.item-dark>.item-content:active.item-complex>.item-content{border-color:#000;background-color:#262626}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:32px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:54px}.item-icon-left .icon{left:11px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:54px}.item-icon-right{padding-right:54px}.item-icon-right .icon{right:11px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:54px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left .item-delete .icon,.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-icon-left .icon-accessory,.item-icon-right .icon-accessory{color:#ccc;font-size:16px}.item-icon-left .icon-accessory{left:3px}.item-icon-right .icon-accessory{right:3px}.item-button-left{padding-left:72px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;left:11px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left .item-content>.button .icon:before,.item-button-left>.button .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-left .item-content>.button>.button,.item-button-left>.button>.button{margin:0 2px;min-height:34px;font-size:18px;line-height:32px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:80px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;right:16px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-right .item-content>.button .icon:before,.item-button-right .item-content>.buttons .icon:before,.item-button-right>.button .icon:before,.item-button-right>.buttons .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-avatar,.item-avatar .item-content,.item-avatar-left,.item-avatar-left .item-content{padding-left:72px;min-height:72px}.item-avatar .item-content .item-image,.item-avatar .item-content>img:first-child,.item-avatar .item-image,.item-avatar-left .item-content .item-image,.item-avatar-left .item-content>img:first-child,.item-avatar-left .item-image,.item-avatar-left>img:first-child,.item-avatar>img:first-child{position:absolute;top:16px;left:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-avatar-right,.item-avatar-right .item-content{padding-right:72px;min-height:72px}.item-avatar-right .item-content .item-image,.item-avatar-right .item-content>img:first-child,.item-avatar-right .item-image,.item-avatar-right>img:first-child{position:absolute;top:16px;right:16px;max-width:40px;max-height:40px;width:100%;height:100%;border-radius:50%}.item-thumbnail-left,.item-thumbnail-left .item-content{padding-top:8px;padding-left:106px;min-height:100px}.item-thumbnail-left .item-content .item-image,.item-thumbnail-left .item-content>img:first-child,.item-thumbnail-left .item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-left.item-complex,.item-avatar.item-complex,.item-thumbnail-left.item-complex{padding-top:0;padding-left:0}.item-thumbnail-right,.item-thumbnail-right .item-content{padding-top:8px;padding-right:106px;min-height:100px}.item-thumbnail-right .item-content .item-image,.item-thumbnail-right .item-content>img:first-child,.item-thumbnail-right .item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%;height:100%}.item-avatar-right.item-complex,.item-thumbnail-right.item-complex{padding-top:0;padding-right:0}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:16px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:16px;margin-bottom:16px}.item-divider{padding-top:8px;padding-bottom:8px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:500}.item-divider-ios,.platform-ios .item-divider-platform{padding-top:26px;text-transform:uppercase;font-weight:300;font-size:13px;background-color:#efeff4;color:#555}.item-divider-android,.platform-android .item-divider-platform{font-weight:300;font-size:13px}.item-note{float:right;color:#aaa;font-size:14px}.item-left-editable .item-content,.item-right-editable .item-content{-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.item-remove-animate.ng-leave{-webkit-transition-duration:300ms;transition-duration:300ms}.item-remove-animate.ng-leave .item-content,.item-remove-animate.ng-leave:last-of-type{-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-property:all;transition-property:all}.item-remove-animate.ng-leave.ng-leave-active .item-content{opacity:0;-webkit-transform:translate3d(-100%,0,0)!important;transform:translate3d(-100%,0,0)!important}.item-remove-animate.ng-leave.ng-leave-active:last-of-type{opacity:0}.item-remove-animate.ng-leave.ng-leave-active~ion-item:not(.ng-leave){-webkit-transform:translate3d(0,-webkit-calc(-100% + 1px),0);transform:translate3d(0,calc(-100% + 1px),0);-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(.25,.81,.24,1);transition-timing-function:cubic-bezier(.25,.81,.24,1);-webkit-transition-property:all;transition-property:all}.item-left-edit{-webkit-transition:all ease-in-out 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;left:0;z-index:0;width:50px;height:100%;line-height:100%;display:none;opacity:0;-webkit-transform:translate3d(-21px,0,0);transform:translate3d(-21px,0,0)}.item-left-edit .button{height:100%}.item-left-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%}.item-left-edit.visible{display:block}.item-left-edit.visible.active{opacity:1;-webkit-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}.list-left-editing .item-left-edit{-webkit-transition-delay:125ms;transition-delay:125ms}.item-delete .button.icon{color:#ef473a;font-size:24px}.item-delete .button.icon:hover{opacity:.7}.item-right-edit{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;z-index:3;width:75px;height:100%;background:inherit;padding-left:20px;display:block;opacity:0;-webkit-transform:translate3d(75px,0,0);transform:translate3d(75px,0,0)}.item-right-edit .button{min-width:50px;height:100%}.item-right-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-right-edit.visible{display:block}.item-right-edit.visible.active{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.item-reorder .button.icon{color:#444;font-size:32px}.item-reordering{position:absolute;left:0;top:0;z-index:9;width:100%;box-shadow:0 0 10px 0 #aaa}.item-reordering .item-reorder{z-index:9}.item-placeholder{opacity:.7}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:none;border-radius:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.item-options .button:before{margin:0 auto}.list{position:relative;padding-top:1px;padding-bottom:1px;padding-left:0;margin-bottom:20px}.list:last-child{margin-bottom:0}.list:last-child.card{margin-bottom:40px}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 3px rgba(0,0,0,.3)}.card .item{border-left:0;border-right:0}.card .item:first-child{border-top:0}.card .item:last-child{border-bottom:0}.padding .card,.padding .list-inset{margin-left:0;margin-right:0}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.card .item.item-input input,.list-inset .item.item-input input,.padding-horizontal>.list .item.item-input input,.padding>.list .item.item-input input{padding-right:44px}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.badge{background-color:transparent;color:#AAA;z-index:1;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light,.tabs .tab-item .badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable,.tabs .tab-item .badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive,.tabs .tab-item .badge.badge-positive{background-color:#387ef5;color:#fff}.badge.badge-calm,.tabs .tab-item .badge.badge-calm{background-color:#11c1f3;color:#fff}.badge.badge-assertive,.tabs .tab-item .badge.badge-assertive{background-color:#ef473a;color:#fff}.badge.badge-balanced,.tabs .tab-item .badge.badge-balanced{background-color:#33cd5f;color:#fff}.badge.badge-energized,.tabs .tab-item .badge.badge-energized{background-color:#ffc900;color:#fff}.badge.badge-royal,.tabs .tab-item .badge.badge-royal{background-color:#886aea;color:#fff}.badge.badge-dark,.tabs .tab-item .badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;visibility:hidden;overflow:hidden}.slider-slides{position:relative;height:100%}.slider-slide{position:relative;display:block;float:left;width:100%;height:100%;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;z-index:1;width:100%;height:15px;text-align:center}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{-webkit-transition:opacity .4s ease-in;transition:opacity .4s ease-in;opacity:1}.slider-pager-page.ng-animate,.slider-pager-page.ng-enter,.slider-pager-page.ng-leave,.slider-slide.ng-animate,.slider-slide.ng-enter,.slider-slide.ng-leave{-webkit-transition:none!important;transition:none!important}.slider-pager-page.ng-animate,.slider-slide.ng-animate{-webkit-animation:none 0s;animation:none 0s}.swiper-container{margin:0 auto;position:relative;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{display:block;-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:300ms;-moz-transition:300ms;-o-transition:300ms;transition:300ms;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination{bottom:10px;left:0;width:100%}.swiper-container-horizontal>.swiper-pagination .swiper-pagination-bullet{margin:0 5px}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(right,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to left,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(left,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to right,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to top,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(transparent));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:-o-linear-gradient(top,rgba(0,0,0,.5),transparent);background-image:linear-gradient(to bottom,rgba(0,0,0,.5),transparent)}.swiper-container-coverflow .swiper-wrapper{-ms-perspective:1200px}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide,.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;width:100%;height:100%;z-index:1}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}}ion-slides{width:100%;height:100%;display:block}.slide-zoom{display:block;width:100%;text-align:center}.swiper-container{width:100%;height:100%;padding:0;overflow:hidden}.swiper-wrapper{position:absolute;left:0;top:0;width:100%;height:100%;padding:0}.swiper-slide{width:100%;height:100%;box-sizing:border-box}.swiper-slide img{width:auto;height:auto;max-width:100%;max-height:100%}.scroll-refresher{position:absolute;top:-60px;right:0;left:0;overflow:hidden;margin:auto;height:60px}.scroll-refresher .ionic-refresher-content{position:absolute;bottom:15px;left:0;width:100%;color:#666;text-align:center;font-size:30px}.scroll-refresher .ionic-refresher-content .text-pulling,.scroll-refresher .ionic-refresher-content .text-refreshing{font-size:16px;line-height:16px}.scroll-refresher .ionic-refresher-content.ionic-refresher-with-text{bottom:10px}.scroll-refresher .icon-pulling,.scroll-refresher .icon-refreshing{width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.scroll-refresher .icon-pulling{-webkit-animation-name:refresh-spin-back;animation-name:refresh-spin-back;-webkit-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:none;animation-fill-mode:none;-webkit-transform:translate3d(0,0,0) rotate(0deg);transform:translate3d(0,0,0) rotate(0deg)}.scroll-refresher .icon-refreshing,.scroll-refresher .text-refreshing{display:none}.scroll-refresher .icon-refreshing{-webkit-animation-duration:1.5s;animation-duration:1.5s}.scroll-refresher.active .icon-pulling:not(.pulling-rotation-disabled){-webkit-animation-name:refresh-spin;animation-name:refresh-spin;-webkit-transform:translate3d(0,0,0) rotate(-180deg);transform:translate3d(0,0,0) rotate(-180deg)}.scroll-refresher.active.refreshing{-webkit-transition:transform .2s;transition:transform .2s;-webkit-transform:scale(1,1);transform:scale(1,1)}.scroll-refresher.active.refreshing .icon-pulling,.scroll-refresher.active.refreshing .text-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing,.scroll-refresher.active.refreshing .text-refreshing{display:block}.scroll-refresher.active.refreshing.refreshing-tail{-webkit-transform:scale(0,0);transform:scale(0,0)}.overflow-scroll>.scroll{-webkit-overflow-scrolling:touch;width:100%}.overflow-scroll>.scroll.overscroll{position:fixed;right:0;left:0}.overflow-scroll.padding>.scroll.overscroll{padding:10px}@-webkit-keyframes refresh-spin{0%{-webkit-transform:translate3d(0,0,0) rotate(0)}100%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}}@keyframes refresh-spin{0%{transform:translate3d(0,0,0) rotate(0)}100%{transform:translate3d(0,0,0) rotate(180deg)}}@-webkit-keyframes refresh-spin-back{0%{-webkit-transform:translate3d(0,0,0) rotate(180deg)}100%{-webkit-transform:translate3d(0,0,0) rotate(0)}}@keyframes refresh-spin-back{0%{transform:translate3d(0,0,0) rotate(180deg)}100%{transform:translate3d(0,0,0) rotate(0)}}.spinner{stroke:#444;fill:#444}.spinner svg{width:28px;height:28px}.spinner.spinner-light{stroke:#fff;fill:#fff}.spinner.spinner-stable{stroke:#f8f8f8;fill:#f8f8f8}.spinner.spinner-positive{stroke:#387ef5;fill:#387ef5}.spinner.spinner-calm{stroke:#11c1f3;fill:#11c1f3}.spinner.spinner-balanced{stroke:#33cd5f;fill:#33cd5f}.spinner.spinner-assertive{stroke:#ef473a;fill:#ef473a}.spinner.spinner-energized{stroke:#ffc900;fill:#ffc900}.spinner.spinner-royal{stroke:#886aea;fill:#886aea}.spinner.spinner-dark{stroke:#444;fill:#444}.spinner-android{stroke:#4b8bf4}.spinner-ios,.spinner-ios-small{stroke:#69717d}.spinner-spiral .stop1{stop-color:#fff;stop-opacity:0}.spinner-spiral.spinner-light .stop1{stop-color:#444}.spinner-spiral.spinner-light .stop2{stop-color:#fff}.spinner-spiral.spinner-stable .stop2{stop-color:#f8f8f8}.spinner-spiral.spinner-positive .stop2{stop-color:#387ef5}.spinner-spiral.spinner-calm .stop2{stop-color:#11c1f3}.spinner-spiral.spinner-balanced .stop2{stop-color:#33cd5f}.spinner-spiral.spinner-assertive .stop2{stop-color:#ef473a}.spinner-spiral.spinner-energized .stop2{stop-color:#ffc900}.spinner-spiral.spinner-royal .stop2{stop-color:#886aea}.spinner-spiral.spinner-dark .stop2{stop-color:#444}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-weight:400;font-size:14px;line-height:1.42857}button,input,select,textarea{font-family:"-apple-system","Helvetica Neue",Roboto,"Segoe UI",sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 0 5px 16px}.item-input input{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 220px;-moz-box-flex:1;-moz-flex:1 220px;-ms-flex:1 220px;flex:1 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;padding-right:24px;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.item-input .button-bar{-webkit-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input .icon{min-width:14px}.platform-windowsphone .item-input input{flex-shrink:1}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10.67px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:0 0;line-height:18px}.item-input-wrapper~.button{margin-left:10.67px}.input-label{display:table;padding:7px 10px 7px 0;max-width:200px;width:35%;color:#444;font-size:16px}.placeholder-icon{color:#aaa}.placeholder-icon:first-child{padding-right:6px}.placeholder-icon:last-child{padding-left:6px}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;border-radius:2px;padding:4px 8px 3px 0;border:none;background-color:#fff}.item-stacked-label input{overflow:hidden;height:46px}.item-select.item-stacked-label select{position:relative;padding:0;max-width:90%;direction:ltr;white-space:pre-wrap;margin:-3px}.item-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 0 0;opacity:0;top:10px;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}.item-floating-label .input-label.has-input{opacity:1;top:0;-webkit-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{display:block;padding-top:2px;padding-left:0;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:16px}.platform-android input[type=datetime-local],.platform-android input[type=date],.platform-android input[type=month],.platform-android input[type=time],.platform-android input[type=week],.platform-ios input[type=datetime-local],.platform-ios input[type=date],.platform-ios input[type=month],.platform-ios input[type=time],.platform-ios input[type=week]{padding-top:8px}.item-input input,.item-input textarea{width:100%}textarea{padding-left:0}textarea::-moz-placeholder{color:#aaa}textarea:-ms-input-placeholder{color:#aaa}textarea::-webkit-input-placeholder{color:#aaa;text-indent:-3px}textarea{height:auto}input[type=search],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=tel],input[type=color],textarea{border:0}input[type=radio],input[type=checkbox]{margin:0;line-height:normal}.item-input input[type=button],.item-input input[type=reset],.item-input input[type=submit],.item-input input[type=radio],.item-input input[type=checkbox],.item-input input[type=file],.item-input input[type=image]{width:auto}input[type=file]{line-height:34px}.cloned-text-input+input,.cloned-text-input+textarea,.previous-input-focus{position:absolute!important;left:-9999px;width:200px}input::-moz-placeholder,textarea::-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;text-indent:0}input[disabled],input[readonly]:not(.cloned-text-input),select[disabled],select[readonly],textarea[disabled],textarea[readonly]:not(.cloned-text-input){background-color:#f8f8f8;cursor:not-allowed}input[type=radio][disabled],input[type=radio][readonly],input[type=checkbox][disabled],input[type=checkbox][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px;cursor:pointer}.checkbox .checkbox-icon:before,.checkbox input:before{border-color:#ddd}.checkbox input:checked+.checkbox-icon:before,.checkbox input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-light .checkbox-icon:before,.checkbox-light input:before{border-color:#ddd}.checkbox-light input:checked+.checkbox-icon:before,.checkbox-light input:checked:before{background:#ddd;border-color:#ddd}.checkbox-stable .checkbox-icon:before,.checkbox-stable input:before{border-color:#b2b2b2}.checkbox-stable input:checked+.checkbox-icon:before,.checkbox-stable input:checked:before{background:#b2b2b2;border-color:#b2b2b2}.checkbox-positive .checkbox-icon:before,.checkbox-positive input:before{border-color:#387ef5}.checkbox-positive input:checked+.checkbox-icon:before,.checkbox-positive input:checked:before{background:#387ef5;border-color:#387ef5}.checkbox-calm .checkbox-icon:before,.checkbox-calm input:before{border-color:#11c1f3}.checkbox-calm input:checked+.checkbox-icon:before,.checkbox-calm input:checked:before{background:#11c1f3;border-color:#11c1f3}.checkbox-assertive .checkbox-icon:before,.checkbox-assertive input:before{border-color:#ef473a}.checkbox-assertive input:checked+.checkbox-icon:before,.checkbox-assertive input:checked:before{background:#ef473a;border-color:#ef473a}.checkbox-balanced .checkbox-icon:before,.checkbox-balanced input:before{border-color:#33cd5f}.checkbox-balanced input:checked+.checkbox-icon:before,.checkbox-balanced input:checked:before{background:#33cd5f;border-color:#33cd5f}.checkbox-energized .checkbox-icon:before,.checkbox-energized input:before{border-color:#ffc900}.checkbox-energized input:checked+.checkbox-icon:before,.checkbox-energized input:checked:before{background:#ffc900;border-color:#ffc900}.checkbox-royal .checkbox-icon:before,.checkbox-royal input:before{border-color:#886aea}.checkbox-royal input:checked+.checkbox-icon:before,.checkbox-royal input:checked:before{background:#886aea;border-color:#886aea}.checkbox-dark .checkbox-icon:before,.checkbox-dark input:before{border-color:#444}.checkbox-dark input:checked+.checkbox-icon:before,.checkbox-dark input:checked:before{background:#444;border-color:#444}.checkbox input:disabled+.checkbox-icon:before,.checkbox input:disabled:before{border-color:#ddd}.checkbox input:disabled:checked+.checkbox-icon:before,.checkbox input:disabled:checked:before{background:#ddd}.checkbox.checkbox-input-hidden input{display:none!important}.checkbox input,.checkbox-icon{position:relative;width:28px;height:28px;display:block;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before,.checkbox-icon:before{display:table;width:100%;height:100%;border-width:1px;border-style:solid;border-radius:28px;background:#fff;content:' ';-webkit-transition:background-color 20ms ease-in-out;transition:background-color 20ms ease-in-out}.checkbox input:checked:before,input:checked+.checkbox-icon:before{border-width:2px}.checkbox input:after,.checkbox-icon:after{-webkit-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:33%;left:25%;display:table;width:14px;height:6px;border:1px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox-square .checkbox-icon:before,.checkbox-square input:before,.platform-android .checkbox-platform .checkbox-icon:before,.platform-android .checkbox-platform input:before{border-radius:2px;width:72%;height:72%;margin-top:14%;margin-left:14%;border-width:2px}.checkbox-square .checkbox-icon:after,.checkbox-square input:after,.platform-android .checkbox-platform .checkbox-icon:after,.platform-android .checkbox-platform input:after{border-width:2px;top:19%;left:25%;width:13px;height:7px}.platform-android .item-checkbox-right .checkbox-square .checkbox-icon::after{top:31%}.grade-c .checkbox input:after,.grade-c .checkbox-icon:after{-webkit-transform:rotate(0);transform:rotate(0);top:3px;left:4px;border:none;color:#fff;content:'\2713';font-weight:700;font-size:20px}.checkbox input:checked:after,input:checked+.checkbox-icon:after{opacity:1}.item-checkbox{padding-left:60px}.item-checkbox.active{box-shadow:none}.item-checkbox .checkbox{position:absolute;top:50%;right:8px;left:8px;z-index:3;margin-top:-21px}.item-checkbox.item-checkbox-right{padding-right:60px;padding-left:16px}.item-checkbox-right .checkbox input,.item-checkbox-right .checkbox-icon{float:right}.item-toggle{pointer-events:none}.toggle{position:relative;display:inline-block;pointer-events:auto;margin:-5px;padding:5px}.toggle input:checked+.track{border-color:#4cd964;background-color:#4cd964}.toggle.dragging .handle{background-color:#f2f2f2!important}.toggle.toggle-light input:checked+.track{border-color:#ddd;background-color:#ddd}.toggle.toggle-stable input:checked+.track{border-color:#b2b2b2;background-color:#b2b2b2}.toggle.toggle-positive input:checked+.track{border-color:#387ef5;background-color:#387ef5}.toggle.toggle-calm input:checked+.track{border-color:#11c1f3;background-color:#11c1f3}.toggle.toggle-assertive input:checked+.track{border-color:#ef473a;background-color:#ef473a}.toggle.toggle-balanced input:checked+.track{border-color:#33cd5f;background-color:#33cd5f}.toggle.toggle-energized input:checked+.track{border-color:#ffc900;background-color:#ffc900}.toggle.toggle-royal input:checked+.track{border-color:#886aea;background-color:#886aea}.toggle.toggle-dark input:checked+.track{border-color:#444;background-color:#444}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:51px;height:31px;border:2px solid #e6e6e6;border-radius:20px;background-color:#fff;content:' ';cursor:pointer;pointer-events:none}.platform-android4_2 .toggle .track{-webkit-background-clip:padding-box}.toggle .handle{-webkit-transition:.3s cubic-bezier(0,1.1,1,1.1);transition:.3s cubic-bezier(0,1.1,1,1.1);-webkit-transition-property:background-color,transform;transition-property:background-color,transform;position:absolute;display:block;width:27px;height:27px;border-radius:27px;background-color:#fff;top:7px;left:7px;box-shadow:0 2px 7px rgba(0,0,0,.35),0 1px 1px rgba(0,0,0,.15)}.toggle .handle:before{position:absolute;top:-4px;left:-21.5px;padding:18.5px 34px;content:" "}.toggle input:checked+.track .handle{-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0);background-color:#fff}.item-toggle.active{box-shadow:none}.item-toggle,.item-toggle.item-complex .item-content{padding-right:99px}.item-toggle.item-complex{padding-right:0}.item-toggle .toggle{position:absolute;top:10px;right:16px;z-index:3}.toggle input:disabled+.track{opacity:.6}.toggle-small .track{border:0;width:34px;height:15px;background:#9e9e9e}.toggle-small input:checked+.track{background:rgba(0,150,137,.5)}.toggle-small .handle{top:2px;left:4px;width:21px;height:21px;box-shadow:0 2px 5px rgba(0,0,0,.25)}.toggle-small input:checked+.track .handle{-webkit-transform:translate3d(16px,0,0);transform:translate3d(16px,0,0);background:#009689}.toggle-small.item-toggle .toggle{top:19px}.toggle-small .toggle-light input:checked+.track{background-color:rgba(221,221,221,.5)}.toggle-small .toggle-light input:checked+.track .handle{background-color:#ddd}.toggle-small .toggle-stable input:checked+.track{background-color:rgba(178,178,178,.5)}.toggle-small .toggle-stable input:checked+.track .handle{background-color:#b2b2b2}.toggle-small .toggle-positive input:checked+.track{background-color:rgba(56,126,245,.5)}.toggle-small .toggle-positive input:checked+.track .handle{background-color:#387ef5}.toggle-small .toggle-calm input:checked+.track{background-color:rgba(17,193,243,.5)}.toggle-small .toggle-calm input:checked+.track .handle{background-color:#11c1f3}.toggle-small .toggle-assertive input:checked+.track{background-color:rgba(239,71,58,.5)}.toggle-small .toggle-assertive input:checked+.track .handle{background-color:#ef473a}.toggle-small .toggle-balanced input:checked+.track{background-color:rgba(51,205,95,.5)}.toggle-small .toggle-balanced input:checked+.track .handle{background-color:#33cd5f}.toggle-small .toggle-energized input:checked+.track{background-color:rgba(255,201,0,.5)}.toggle-small .toggle-energized input:checked+.track .handle{background-color:#ffc900}.toggle-small .toggle-royal input:checked+.track{background-color:rgba(136,106,234,.5)}.toggle-small .toggle-royal input:checked+.track .handle{background-color:#886aea}.toggle-small .toggle-dark input:checked+.track{background-color:rgba(68,68,68,.5)}.toggle-small .toggle-dark input:checked+.track .handle{background-color:#444}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:64px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:14px;height:100%;font-size:24px}.item-radio input{position:absolute;left:-9999px}.item-radio input:checked+.radio-content .item-content{background:#f7f7f7}.item-radio input:checked+.radio-content .radio-icon{visibility:visible}.range input{overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:43px;outline:0;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0,#ccc),color-stop(100%,#ccc)) center no-repeat;background:linear-gradient(to right,#ccc 0,#ccc 100%) center no-repeat;background-size:99% 2px;-webkit-appearance:none}.range input::-moz-focus-outer{border:0}.range input::-webkit-slider-thumb{position:relative;width:28px;height:28px;border-radius:50%;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.3),0 3px 5px rgba(0,0,0,.2);cursor:pointer;-webkit-appearance:none;border:0}.range input::-webkit-slider-thumb:before{position:absolute;top:13px;left:-2001px;width:2000px;height:2px;background:#444;content:' '}.range input::-webkit-slider-thumb:after{position:absolute;top:-15px;left:-15px;padding:30px;content:' '}.range input::-ms-fill-lower{height:2px;background:#444}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 11px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-light input::-ms-fill-lower{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-stable input::-ms-fill-lower{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#387ef5}.range.range-positive input::-ms-fill-lower{background:#387ef5}.range.range-calm input::-webkit-slider-thumb:before{background:#11c1f3}.range.range-calm input::-ms-fill-lower{background:#11c1f3}.range.range-balanced input::-webkit-slider-thumb:before{background:#33cd5f}.range.range-balanced input::-ms-fill-lower{background:#33cd5f}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef473a}.range.range-assertive input::-ms-fill-lower{background:#ef473a}.range.range-energized input::-webkit-slider-thumb:before{background:#ffc900}.range.range-energized input::-ms-fill-lower{background:#ffc900}.range.range-royal input::-webkit-slider-thumb:before{background:#886aea}.range.range-royal input::-ms-fill-lower{background:#886aea}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range.range-dark input::-ms-fill-lower{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.platform-windowsphone .range input{height:auto}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;bottom:0;right:0;padding:0 48px 0 16px;max-width:65%;border:none;background:#fff;color:#333;text-indent:.01px;text-overflow:'';white-space:nowrap;font-size:14px;cursor:pointer;direction:rtl}.item-select select::-ms-expand{display:none}.item-select option{direction:ltr}.item-select:after{position:absolute;top:50%;right:16px;margin-top:-3px;width:0;height:0;border-top:5px solid;border-right:5px solid transparent;border-left:5px solid transparent;color:#999;content:"";pointer-events:none}.item-select.item-light select{background:#fff;color:#444}.item-select.item-stable select{background:#f8f8f8;color:#444}.item-select.item-stable .input-label,.item-select.item-stable:after{color:#666}.item-select.item-positive select{background:#387ef5;color:#fff}.item-select.item-positive .input-label,.item-select.item-positive:after{color:#fff}.item-select.item-calm select{background:#11c1f3;color:#fff}.item-select.item-calm .input-label,.item-select.item-calm:after{color:#fff}.item-select.item-assertive select{background:#ef473a;color:#fff}.item-select.item-assertive .input-label,.item-select.item-assertive:after{color:#fff}.item-select.item-balanced select{background:#33cd5f;color:#fff}.item-select.item-balanced .input-label,.item-select.item-balanced:after{color:#fff}.item-select.item-energized select{background:#ffc900;color:#fff}.item-select.item-energized .input-label,.item-select.item-energized:after{color:#fff}.item-select.item-royal select{background:#886aea;color:#fff}.item-select.item-royal .input-label,.item-select.item-royal:after{color:#fff}.item-select.item-dark select{background:#444;color:#fff}.item-select.item-dark .input-label,.item-select.item-dark:after{color:#fff}select[multiple],select[size]{height:auto}progress{display:block;margin:15px auto;width:100%}.button{border-color:transparent;background-color:#f8f8f8;color:#444;position:relative;display:inline-block;margin:0;padding:0 12px;min-width:52px;min-height:47px;border-width:1px;border-style:solid;border-radius:4px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:42px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.activated,.button.active{background-color:#e5e5e5}.button:after{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;content:' '}.button .icon{vertical-align:top;pointer-events:none}.button .icon:before,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px;vertical-align:inherit;font-size:24px;line-height:41px;pointer-events:none}.button.icon-left:before{float:left;padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{border-color:transparent;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{background-color:#fafafa}.button.button-light.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ddd}.button.button-light.button-icon{border-color:transparent;background:0 0}.button.button-light.button-outline{border-color:#ddd;background:0 0;color:#ddd}.button.button-light.button-outline.activated,.button.button-light.button-outline.active{background-color:#ddd;box-shadow:none;color:#fff}.button.button-stable{border-color:transparent;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{background-color:#e5e5e5}.button.button-stable.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button.button-stable.button-icon{border-color:transparent;background:0 0}.button.button-stable.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button.button-stable.button-outline.activated,.button.button-stable.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.button.button-positive{border-color:transparent;background-color:#387ef5;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{background-color:#0c60ee}.button.button-positive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#387ef5}.button.button-positive.button-icon{border-color:transparent;background:0 0}.button.button-positive.button-outline{border-color:#387ef5;background:0 0;color:#387ef5}.button.button-positive.button-outline.activated,.button.button-positive.button-outline.active{background-color:#387ef5;box-shadow:none;color:#fff}.button.button-calm{border-color:transparent;background-color:#11c1f3;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{background-color:#0a9dc7}.button.button-calm.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#11c1f3}.button.button-calm.button-icon{border-color:transparent;background:0 0}.button.button-calm.button-outline{border-color:#11c1f3;background:0 0;color:#11c1f3}.button.button-calm.button-outline.activated,.button.button-calm.button-outline.active{background-color:#11c1f3;box-shadow:none;color:#fff}.button.button-assertive{border-color:transparent;background-color:#ef473a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{background-color:#e42112}.button.button-assertive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ef473a}.button.button-assertive.button-icon{border-color:transparent;background:0 0}.button.button-assertive.button-outline{border-color:#ef473a;background:0 0;color:#ef473a}.button.button-assertive.button-outline.activated,.button.button-assertive.button-outline.active{background-color:#ef473a;box-shadow:none;color:#fff}.button.button-balanced{border-color:transparent;background-color:#33cd5f;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{background-color:#28a54c}.button.button-balanced.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#33cd5f}.button.button-balanced.button-icon{border-color:transparent;background:0 0}.button.button-balanced.button-outline{border-color:#33cd5f;background:0 0;color:#33cd5f}.button.button-balanced.button-outline.activated,.button.button-balanced.button-outline.active{background-color:#33cd5f;box-shadow:none;color:#fff}.button.button-energized{border-color:transparent;background-color:#ffc900;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{background-color:#e6b500}.button.button-energized.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ffc900}.button.button-energized.button-icon{border-color:transparent;background:0 0}.button.button-energized.button-outline{border-color:#ffc900;background:0 0;color:#ffc900}.button.button-energized.button-outline.activated,.button.button-energized.button-outline.active{background-color:#ffc900;box-shadow:none;color:#fff}.button.button-royal{border-color:transparent;background-color:#886aea;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{background-color:#6b46e5}.button.button-royal.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#886aea}.button.button-royal.button-icon{border-color:transparent;background:0 0}.button.button-royal.button-outline{border-color:#886aea;background:0 0;color:#886aea}.button.button-royal.button-outline.activated,.button.button-royal.button-outline.active{background-color:#886aea;box-shadow:none;color:#fff}.button.button-dark{border-color:transparent;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{background-color:#262626}.button.button-dark.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444}.button.button-dark.button-icon{border-color:transparent;background:0 0}.button.button-dark.button-outline{border-color:#444;background:0 0;color:#444}.button.button-dark.button-outline.activated,.button.button-dark.button-outline.active{background-color:#444;box-shadow:none;color:#fff}.button-small{padding:2px 4px 1px;min-width:28px;min-height:30px;font-size:12px;line-height:26px}.button-small .icon:before,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:19px;margin-top:3px}.button-large{padding:0 16px;min-width:68px;min-height:59px;font-size:20px;line-height:53px}.button-large .icon:before,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.activated,.button-icon.button.active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon:before,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button-clear.button-icon{border-color:transparent;background:0 0}.button-clear.activated,.button-clear.active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button-outline.button-outline.activated,.button-outline.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{clear:both}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full,input.button.button-block{width:100%}a.button{text-decoration:none}a.button .icon:before,a.button.icon-left:before,a.button.icon-right:before,a.button.icon:before{margin-top:2px}.button.disabled,.button[disabled]{opacity:.4;cursor:default!important;pointer-events:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button .icon:before,.button-bar>.button:before{line-height:44px}.button-bar>.button:first-child{border-radius:4px 0 0 4px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 4px 4px 0}.button-bar>.button:only-child{border-radius:4px}.button-bar>.button-small .icon:before,.button-bar>.button-small:before{line-height:28px}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row-wrap{-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.row-no-padding,.row-no-padding>.col{padding:0}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.row-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch}.row-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;-moz-align-items:baseline;align-items:baseline}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-40{-webkit-box-flex:0;-webkit-flex:0 0 40%;-moz-box-flex:0;-moz-flex:0 0 40%;-ms-flex:0 0 40%;flex:0 0 40%;max-width:40%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-60{-webkit-box-flex:0;-webkit-flex:0 0 60%;-moz-box-flex:0;-moz-flex:0 0 60%;-ms-flex:0 0 60%;flex:0 0 60%;max-width:60%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}@media (max-width:567px){.responsive-sm{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-sm .col,.responsive-sm .col-10,.responsive-sm .col-20,.responsive-sm .col-25,.responsive-sm .col-33,.responsive-sm .col-34,.responsive-sm .col-50,.responsive-sm .col-66,.responsive-sm .col-67,.responsive-sm .col-75,.responsive-sm .col-80,.responsive-sm .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:767px){.responsive-md{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-md .col,.responsive-md .col-10,.responsive-md .col-20,.responsive-md .col-25,.responsive-md .col-33,.responsive-md .col-34,.responsive-md .col-50,.responsive-md .col-66,.responsive-md .col-67,.responsive-md .col-75,.responsive-md .col-80,.responsive-md .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:1023px){.responsive-lg{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-lg .col,.responsive-lg .col-10,.responsive-lg .col-20,.responsive-lg .col-25,.responsive-lg .col-33,.responsive-lg .col-34,.responsive-lg .col-50,.responsive-lg .col-66,.responsive-lg .col-67,.responsive-lg .col-75,.responsive-lg .col-80,.responsive-lg .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}.hide{display:none}.opacity-hide{opacity:0}.grade-b .opacity-hide,.grade-c .opacity-hide{opacity:1;display:none}.show{display:block}.opacity-show{opacity:1}.invisible{visibility:hidden}.keyboard-open .hide-on-keyboard-open{display:none}.keyboard-open .bar-footer.hide-on-keyboard-open+.pane .has-footer,.keyboard-open .tabs.hide-on-keyboard-open+.pane .has-tabs{bottom:0}.inline{display:inline-block}.disable-pointer-events{pointer-events:none}.enable-pointer-events{pointer-events:auto}.disable-user-behavior{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-drag:none;-ms-touch-action:none;-ms-content-zooming:none}.click-block{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;z-index:99999;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);overflow:hidden}.click-block-hide{-webkit-transform:translate3d(-9999px,0,0);transform:translate3d(-9999px,0,0)}.no-resize{resize:none}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.iframe-wrapper{position:fixed;-webkit-overflow-scrolling:touch;overflow:scroll}.iframe-wrapper iframe{height:100%;width:100%}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#387ef5}.positive-bg{background-color:#387ef5}.positive-border{border-color:#0c60ee}.calm,a.calm{color:#11c1f3}.calm-bg{background-color:#11c1f3}.calm-border{border-color:#0a9dc7}.assertive,a.assertive{color:#ef473a}.assertive-bg{background-color:#ef473a}.assertive-border{border-color:#e42112}.balanced,a.balanced{color:#33cd5f}.balanced-bg{background-color:#33cd5f}.balanced-border{border-color:#28a54c}.energized,a.energized{color:#ffc900}.energized-bg{background-color:#ffc900}.energized-border{border-color:#e6b500}.royal,a.royal{color:#886aea}.royal-bg{background-color:#886aea}.royal-border{border-color:#6b46e5}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}[collection-repeat]{left:0!important;top:0!important;position:absolute!important;z-index:1}.collection-repeat-container{position:relative;z-index:1}.collection-repeat-after-container{z-index:0;display:block}.collection-repeat-after-container.horizontal{display:inline-block}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader){height:64px}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:19px!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader)>*{margin-top:20px}.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader,.platform-ios.platform-cordova:not(.fullscreen) .has-header,.platform-ios.platform-cordova:not(.fullscreen) .tabs-top>.tabs,.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top{top:64px}.platform-ios.platform-cordova:not(.fullscreen) .has-subheader{top:108px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-tabs-top{top:113px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top{top:157px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:-1px}.platform-ios.platform-cordova .popover .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .popover .bar-subheader,.platform-ios.platform-cordova .popover .has-header{top:44px}.platform-ios.platform-cordova .popover .has-subheader{top:88px}.platform-ios.platform-cordova.status-bar-hide{margin-bottom:20px}@media (orientation:landscape){.platform-ios.platform-browser.platform-ipad{position:fixed}}.platform-c:not(.enable-transitions) *{-webkit-transition:none!important;transition:none!important}.slide-in-up{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.slide-in-up.ng-enter,.slide-in-up>.ng-enter{-webkit-transition:all cubic-bezier(.1,.7,.1,1) 400ms;transition:all cubic-bezier(.1,.7,.1,1) 400ms}.slide-in-up.ng-enter-active,.slide-in-up>.ng-enter-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-in-up.ng-leave,.slide-in-up>.ng-leave{-webkit-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms}@-webkit-keyframes scaleOut{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.8);opacity:0}}@keyframes scaleOut{from{transform:scale(1);opacity:1}to{transform:scale(.8);opacity:0}}@-webkit-keyframes superScaleIn{from{-webkit-transform:scale(1.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@keyframes superScaleIn{from{transform:scale(1.2);opacity:0}to{transform:scale(1);opacity:1}}[nav-view-transition=ios] [nav-view=entering],[nav-view-transition=ios] [nav-view=leaving]{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform,box-shadow;transition-property:opacity,transform,box-shadow}[nav-view-transition=ios][nav-view-direction=forward],[nav-view-transition=ios][nav-view-direction=back]{background-color:#000}[nav-view-transition=ios] [nav-view=active],[nav-view-transition=ios][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=ios][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=ios][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=ios][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=ios] .back-text,[nav-bar-transition=ios] .buttons,[nav-bar-transition=ios] .title{-webkit-transition-duration:500ms;transition-duration:500ms;-webkit-transition-timing-function:cubic-bezier(.36,.66,.04,1);transition-timing-function:cubic-bezier(.36,.66,.04,1);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,transform}[nav-bar-transition=ios] [nav-bar=entering],[nav-bar-transition=ios] [nav-bar=active]{z-index:10}[nav-bar-transition=ios] [nav-bar=entering] .bar,[nav-bar-transition=ios] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=ios] [nav-bar=cached]{display:block}[nav-bar-transition=ios] [nav-bar=cached] .header-item{display:none}[nav-view-transition=android] [nav-view=entering],[nav-view-transition=android] [nav-view=leaving]{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform}[nav-view-transition=android] [nav-view=active],[nav-view-transition=android][nav-view-direction=forward] [nav-view=entering],[nav-view-transition=android][nav-view-direction=back] [nav-view=leaving]{z-index:3}[nav-view-transition=android][nav-view-direction=forward] [nav-view=leaving],[nav-view-transition=android][nav-view-direction=back] [nav-view=entering]{z-index:2}[nav-bar-transition=android] .buttons,[nav-bar-transition=android] .title{-webkit-transition-duration:200ms;transition-duration:200ms;-webkit-transition-timing-function:cubic-bezier(.4,.6,.2,1);transition-timing-function:cubic-bezier(.4,.6,.2,1);-webkit-transition-property:opacity;transition-property:opacity}[nav-bar-transition=android] [nav-bar=entering],[nav-bar-transition=android] [nav-bar=active]{z-index:10}[nav-bar-transition=android] [nav-bar=entering] .bar,[nav-bar-transition=android] [nav-bar=active] .bar{background:0 0}[nav-bar-transition=android] [nav-bar=cached]{display:block}[nav-bar-transition=android] [nav-bar=cached] .header-item{display:none}[nav-swipe=fast] .back-text,[nav-swipe=fast] .buttons,[nav-swipe=fast] .title,[nav-swipe=fast] [nav-view]{-webkit-transition-duration:50ms;transition-duration:50ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-swipe=slow] .back-text,[nav-swipe=slow] .buttons,[nav-swipe=slow] .title,[nav-swipe=slow] [nav-view]{-webkit-transition-duration:160ms;transition-duration:160ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}[nav-bar=cached],[nav-view=cached]{display:none}[nav-view=stage]{opacity:0;-webkit-transition-duration:0;transition-duration:0}[nav-bar=stage] .back-text,[nav-bar=stage] .buttons,[nav-bar=stage] .title{position:absolute;opacity:0;-webkit-transition-duration:0s;transition-duration:0s} \ No newline at end of file diff --git a/src/MCM.KidsIdApp/www/css/style.css b/src/MCM.KidsIdApp/www/css/style.css new file mode 100644 index 0000000..1e6c20c --- /dev/null +++ b/src/MCM.KidsIdApp/www/css/style.css @@ -0,0 +1,16 @@ +.login-title { + color: #fff; + font-family:'Times New Roman', Times, serif; + text-shadow: 1px 1px #000; +} + +.login-background { + background-image: url("../img/bckgrnd-placeholder.png"); + background-size: cover; + background-repeat:no-repeat; +} + +.margin-top-10 { + margin-top: 10%; +} + diff --git a/src/MCM.KidsIdApp/www/img/bckgrnd-placeholder.png b/src/MCM.KidsIdApp/www/img/bckgrnd-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..5090d0d1e6550de03aaf7f065299fa1ee4e5eb68 GIT binary patch literal 202824 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 M$c`9UpaxWhP-vw@G$<_Q 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ⓈuVHuyZzB`E*L&l-Xl3D@+m($9}^r5DGE^ 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

=Azm4npXlL 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 &-;PK!$@gygJspE{PU2rA8-hE!^oFJ{40DZ`3 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

+ * + * ``` + * + * Now we create the **JavaScript animation** that will trigger the CSS transition: + * + * ```js + * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var height = element[0].offsetHeight; + * return $animateCss(element, { + * from: { height:'0px' }, + * to: { height:height + 'px' }, + * duration: 1 // one second + * }); + * } + * } + * }]); + * ``` + * + * ## More Advanced Uses + * + * `$animateCss` is the underlying code that ngAnimate uses to power **CSS-based animations** behind the scenes. Therefore CSS hooks + * like `.ng-EVENT`, `.ng-EVENT-active`, `.ng-EVENT-stagger` are all features that can be triggered using `$animateCss` via JavaScript code. + * + * This also means that just about any combination of adding classes, removing classes, setting styles, dynamically setting a keyframe animation, + * applying a hardcoded duration or delay value, changing the animation easing or applying a stagger animation are all options that work with + * `$animateCss`. The service itself is smart enough to figure out the combination of options and examine the element styling properties in order + * to provide a working animation that will run in CSS. + * + * The example below showcases a more advanced version of the `.fold-animation` from the example above: + * + * ```js + * ngModule.animation('.fold-animation', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var height = element[0].offsetHeight; + * return $animateCss(element, { + * addClass: 'red large-text pulse-twice', + * easing: 'ease-out', + * from: { height:'0px' }, + * to: { height:height + 'px' }, + * duration: 1 // one second + * }); + * } + * } + * }]); + * ``` + * + * Since we're adding/removing CSS classes then the CSS transition will also pick those up: + * + * ```css + * /* since a hardcoded duration value of 1 was provided in the JavaScript animation code, + * the CSS classes below will be transitioned despite them being defined as regular CSS classes */ + * .red { background:red; } + * .large-text { font-size:20px; } + * + * /* we can also use a keyframe animation and $animateCss will make it work alongside the transition */ + * .pulse-twice { + * animation: 0.5s pulse linear 2; + * -webkit-animation: 0.5s pulse linear 2; + * } + * + * @keyframes pulse { + * from { transform: scale(0.5); } + * to { transform: scale(1.5); } + * } + * + * @-webkit-keyframes pulse { + * from { -webkit-transform: scale(0.5); } + * to { -webkit-transform: scale(1.5); } + * } + * ``` + * + * Given this complex combination of CSS classes, styles and options, `$animateCss` will figure everything out and make the animation happen. + * + * ## How the Options are handled + * + * `$animateCss` is very versatile and intelligent when it comes to figuring out what configurations to apply to the element to ensure the animation + * works with the options provided. Say for example we were adding a class that contained a keyframe value and we wanted to also animate some inline + * styles using the `from` and `to` properties. + * + * ```js + * var animator = $animateCss(element, { + * from: { background:'red' }, + * to: { background:'blue' } + * }); + * animator.start(); + * ``` + * + * ```css + * .rotating-animation { + * animation:0.5s rotate linear; + * -webkit-animation:0.5s rotate linear; + * } + * + * @keyframes rotate { + * from { transform: rotate(0deg); } + * to { transform: rotate(360deg); } + * } + * + * @-webkit-keyframes rotate { + * from { -webkit-transform: rotate(0deg); } + * to { -webkit-transform: rotate(360deg); } + * } + * ``` + * + * The missing pieces here are that we do not have a transition set (within the CSS code nor within the `$animateCss` options) and the duration of the animation is + * going to be detected from what the keyframe styles on the CSS class are. In this event, `$animateCss` will automatically create an inline transition + * style matching the duration detected from the keyframe style (which is present in the CSS class that is being added) and then prepare both the transition + * and keyframe animations to run in parallel on the element. Then when the animation is underway the provided `from` and `to` CSS styles will be applied + * and spread across the transition and keyframe animation. + * + * ## What is returned + * + * `$animateCss` works in two stages: a preparation phase and an animation phase. Therefore when `$animateCss` is first called it will NOT actually + * start the animation. All that is going on here is that the element is being prepared for the animation (which means that the generated CSS classes are + * added and removed on the element). Once `$animateCss` is called it will return an object with the following properties: + * + * ```js + * var animator = $animateCss(element, { ... }); + * ``` + * + * Now what do the contents of our `animator` variable look like: + * + * ```js + * { + * // starts the animation + * start: Function, + * + * // ends (aborts) the animation + * end: Function + * } + * ``` + * + * To actually start the animation we need to run `animation.start()` which will then return a promise that we can hook into to detect when the animation ends. + * If we choose not to run the animation then we MUST run `animation.end()` to perform a cleanup on the element (since some CSS classes and stlyes may have been + * applied to the element during the preparation phase). Note that all other properties such as duration, delay, transitions and keyframes are just properties + * and that changing them will not reconfigure the parameters of the animation. + * + * ### runner.done() vs runner.then() + * It is documented that `animation.start()` will return a promise object and this is true, however, there is also an additional method available on the + * runner called `.done(callbackFn)`. The done method works the same as `.finally(callbackFn)`, however, it does **not trigger a digest to occur**. + * Therefore, for performance reasons, it's always best to use `runner.done(callback)` instead of `runner.then()`, `runner.catch()` or `runner.finally()` + * unless you really need a digest to kick off afterwards. + * + * Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss + * (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code). + * Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works. + * + * @param {DOMElement} element the element that will be animated + * @param {object} options the animation-related options that will be applied during the animation + * + * * `event` - The DOM event (e.g. enter, leave, move). When used, a generated CSS class of `ng-EVENT` and `ng-EVENT-active` will be applied + * to the element during the animation. Multiple events can be provided when spaces are used as a separator. (Note that this will not perform any DOM operation.) + * * `easing` - The CSS easing value that will be applied to the transition or keyframe animation (or both). + * * `transition` - The raw CSS transition style that will be used (e.g. `1s linear all`). + * * `keyframeStyle` - The raw CSS keyframe animation style that will be used (e.g. `1s my_animation linear`). + * * `from` - The starting CSS styles (a key/value object) that will be applied at the start of the animation. + * * `to` - The ending CSS styles (a key/value object) that will be applied across the animation via a CSS transition. + * * `addClass` - A space separated list of CSS classes that will be added to the element and spread across the animation. + * * `removeClass` - A space separated list of CSS classes that will be removed from the element and spread across the animation. + * * `duration` - A number value representing the total duration of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `0` + * is provided then the animation will be skipped entirely. + * * `delay` - A number value representing the total delay of the transition and/or keyframe (note that a value of 1 is 1000ms). If a value of `true` is + * used then whatever delay value is detected from the CSS classes will be mirrored on the elements styles (e.g. by setting delay true then the style value + * of the element will be `transition-delay: DETECTED_VALUE`). Using `true` is useful when you want the CSS classes and inline styles to all share the same + * CSS delay value. + * * `stagger` - A numeric time value representing the delay between successively animated elements + * ({@link ngAnimate#css-staggering-animations Click here to learn how CSS-based staggering works in ngAnimate.}) + * * `staggerIndex` - The numeric index representing the stagger item (e.g. a value of 5 is equal to the sixth item in the stagger; therefore when a + * `stagger` option value of `0.1` is used then there will be a stagger delay of `600ms`) + * `applyClassesEarly` - Whether or not the classes being added or removed will be used when detecting the animation. This is set by `$animate` when enter/leave/move animations are fired to ensure that the CSS classes are resolved in time. (Note that this will prevent any transitions from occuring on the classes being added and removed.) + * + * @return {object} an object with start and end methods and details about the animation. + * + * * `start` - The method to start the animation. This will return a `Promise` when called. + * * `end` - This method will cancel the animation and remove all applied CSS classes and styles. + */ + +// Detect proper transitionend/animationend event names. +var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; + +// If unprefixed events are not supported but webkit-prefixed are, use the latter. +// Otherwise, just use W3C names, browsers not supporting them at all will just ignore them. +// Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend` +// but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`. +// Register both events in case `window.onanimationend` is not supported because of that, +// do the same for `transitionend` as Safari is likely to exhibit similar behavior. +// Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit +// therefore there is no reason to test anymore for other vendor prefixes: +// http://caniuse.com/#search=transition +if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) { + CSS_PREFIX = '-webkit-'; + TRANSITION_PROP = 'WebkitTransition'; + TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend'; +} else { + TRANSITION_PROP = 'transition'; + TRANSITIONEND_EVENT = 'transitionend'; +} + +if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) { + CSS_PREFIX = '-webkit-'; + ANIMATION_PROP = 'WebkitAnimation'; + ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend'; +} else { + ANIMATION_PROP = 'animation'; + ANIMATIONEND_EVENT = 'animationend'; +} + +var DURATION_KEY = 'Duration'; +var PROPERTY_KEY = 'Property'; +var DELAY_KEY = 'Delay'; +var TIMING_KEY = 'TimingFunction'; +var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount'; +var ANIMATION_PLAYSTATE_KEY = 'PlayState'; +var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3; +var CLOSING_TIME_BUFFER = 1.5; +var ONE_SECOND = 1000; +var BASE_TEN = 10; + +var SAFE_FAST_FORWARD_DURATION_VALUE = 9999; + +var ANIMATION_DELAY_PROP = ANIMATION_PROP + DELAY_KEY; +var ANIMATION_DURATION_PROP = ANIMATION_PROP + DURATION_KEY; + +var TRANSITION_DELAY_PROP = TRANSITION_PROP + DELAY_KEY; +var TRANSITION_DURATION_PROP = TRANSITION_PROP + DURATION_KEY; + +var DETECT_CSS_PROPERTIES = { + transitionDuration: TRANSITION_DURATION_PROP, + transitionDelay: TRANSITION_DELAY_PROP, + transitionProperty: TRANSITION_PROP + PROPERTY_KEY, + animationDuration: ANIMATION_DURATION_PROP, + animationDelay: ANIMATION_DELAY_PROP, + animationIterationCount: ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY +}; + +var DETECT_STAGGER_CSS_PROPERTIES = { + transitionDuration: TRANSITION_DURATION_PROP, + transitionDelay: TRANSITION_DELAY_PROP, + animationDuration: ANIMATION_DURATION_PROP, + animationDelay: ANIMATION_DELAY_PROP +}; + +function computeCssStyles($window, element, properties) { + var styles = Object.create(null); + var detectedStyles = $window.getComputedStyle(element) || {}; + forEach(properties, function(formalStyleName, actualStyleName) { + var val = detectedStyles[formalStyleName]; + if (val) { + var c = val.charAt(0); + + // only numerical-based values have a negative sign or digit as the first value + if (c === '-' || c === '+' || c >= 0) { + val = parseMaxTime(val); + } + + // by setting this to null in the event that the delay is not set or is set directly as 0 + // then we can still allow for zegative values to be used later on and not mistake this + // value for being greater than any other negative value. + if (val === 0) { + val = null; + } + styles[actualStyleName] = val; + } + }); + + return styles; +} + +function parseMaxTime(str) { + var maxValue = 0; + var values = str.split(/\s*,\s*/); + forEach(values, function(value) { + // it's always safe to consider only second values and omit `ms` values since + // getComputedStyle will always handle the conversion for us + if (value.charAt(value.length - 1) == 's') { + value = value.substring(0, value.length - 1); + } + value = parseFloat(value) || 0; + maxValue = maxValue ? Math.max(value, maxValue) : value; + }); + return maxValue; +} + +function truthyTimingValue(val) { + return val === 0 || val != null; +} + +function getCssTransitionDurationStyle(duration, applyOnlyDuration) { + var style = TRANSITION_PROP; + var value = duration + 's'; + if (applyOnlyDuration) { + style += DURATION_KEY; + } else { + value += ' linear all'; + } + return [style, value]; +} + +function getCssKeyframeDurationStyle(duration) { + return [ANIMATION_DURATION_PROP, duration + 's']; +} + +function getCssDelayStyle(delay, isKeyframeAnimation) { + var prop = isKeyframeAnimation ? ANIMATION_DELAY_PROP : TRANSITION_DELAY_PROP; + return [prop, delay + 's']; +} + +function blockTransitions(node, duration) { + // we use a negative delay value since it performs blocking + // yet it doesn't kill any existing transitions running on the + // same element which makes this safe for class-based animations + var value = duration ? '-' + duration + 's' : ''; + applyInlineStyle(node, [TRANSITION_DELAY_PROP, value]); + return [TRANSITION_DELAY_PROP, value]; +} + +function blockKeyframeAnimations(node, applyBlock) { + var value = applyBlock ? 'paused' : ''; + var key = ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY; + applyInlineStyle(node, [key, value]); + return [key, value]; +} + +function applyInlineStyle(node, styleTuple) { + var prop = styleTuple[0]; + var value = styleTuple[1]; + node.style[prop] = value; +} + +function createLocalCacheLookup() { + var cache = Object.create(null); + return { + flush: function() { + cache = Object.create(null); + }, + + count: function(key) { + var entry = cache[key]; + return entry ? entry.total : 0; + }, + + get: function(key) { + var entry = cache[key]; + return entry && entry.value; + }, + + put: function(key, value) { + if (!cache[key]) { + cache[key] = { total: 1, value: value }; + } else { + cache[key].total++; + } + } + }; +} + +var $AnimateCssProvider = ['$animateProvider', function($animateProvider) { + var gcsLookup = createLocalCacheLookup(); + var gcsStaggerLookup = createLocalCacheLookup(); + + this.$get = ['$window', '$$jqLite', '$$AnimateRunner', '$timeout', + '$document', '$sniffer', '$$rAFScheduler', + function($window, $$jqLite, $$AnimateRunner, $timeout, + $document, $sniffer, $$rAFScheduler) { + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + var parentCounter = 0; + function gcsHashFn(node, extraClasses) { + var KEY = "$$ngAnimateParentKey"; + var parentNode = node.parentNode; + var parentID = parentNode[KEY] || (parentNode[KEY] = ++parentCounter); + return parentID + '-' + node.getAttribute('class') + '-' + extraClasses; + } + + function computeCachedCssStyles(node, className, cacheKey, properties) { + var timings = gcsLookup.get(cacheKey); + + if (!timings) { + timings = computeCssStyles($window, node, properties); + if (timings.animationIterationCount === 'infinite') { + timings.animationIterationCount = 1; + } + } + + // we keep putting this in multiple times even though the value and the cacheKey are the same + // because we're keeping an interal tally of how many duplicate animations are detected. + gcsLookup.put(cacheKey, timings); + return timings; + } + + function computeCachedCssStaggerStyles(node, className, cacheKey, properties) { + var stagger; + + // if we have one or more existing matches of matching elements + // containing the same parent + CSS styles (which is how cacheKey works) + // then staggering is possible + if (gcsLookup.count(cacheKey) > 0) { + stagger = gcsStaggerLookup.get(cacheKey); + + if (!stagger) { + var staggerClassName = pendClasses(className, '-stagger'); + + $$jqLite.addClass(node, staggerClassName); + + stagger = computeCssStyles($window, node, properties); + + // force the conversion of a null value to zero incase not set + stagger.animationDuration = Math.max(stagger.animationDuration, 0); + stagger.transitionDuration = Math.max(stagger.transitionDuration, 0); + + $$jqLite.removeClass(node, staggerClassName); + + gcsStaggerLookup.put(cacheKey, stagger); + } + } + + return stagger || {}; + } + + var bod = getDomNode($document).body; + var rafWaitQueue = []; + function waitUntilQuiet(callback) { + rafWaitQueue.push(callback); + $$rAFScheduler.waitUntilQuiet(function() { + gcsLookup.flush(); + gcsStaggerLookup.flush(); + + //the line below will force the browser to perform a repaint so + //that all the animated elements within the animation frame will + //be properly updated and drawn on screen. This is required to + //ensure that the preparation animation is properly flushed so that + //the active state picks up from there. DO NOT REMOVE THIS LINE. + //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH + //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND + //WILL TAKE YEARS AWAY FROM YOUR LIFE. + var width = bod.offsetWidth + 1; + + // we use a for loop to ensure that if the queue is changed + // during this looping then it will consider new requests + for (var i = 0; i < rafWaitQueue.length; i++) { + rafWaitQueue[i](width); + } + rafWaitQueue.length = 0; + }); + } + + return init; + + function computeTimings(node, className, cacheKey) { + var timings = computeCachedCssStyles(node, className, cacheKey, DETECT_CSS_PROPERTIES); + var aD = timings.animationDelay; + var tD = timings.transitionDelay; + timings.maxDelay = aD && tD + ? Math.max(aD, tD) + : (aD || tD); + timings.maxDuration = Math.max( + timings.animationDuration * timings.animationIterationCount, + timings.transitionDuration); + + return timings; + } + + function init(element, options) { + var node = getDomNode(element); + if (!node || !node.parentNode) { + return closeAndReturnNoopAnimator(); + } + + options = prepareAnimationOptions(options); + + var temporaryStyles = []; + var classes = element.attr('class'); + var styles = packageStyles(options); + var animationClosed; + var animationPaused; + var animationCompleted; + var runner; + var runnerHost; + var maxDelay; + var maxDelayTime; + var maxDuration; + var maxDurationTime; + + if (options.duration === 0 || (!$sniffer.animations && !$sniffer.transitions)) { + return closeAndReturnNoopAnimator(); + } + + var method = options.event && isArray(options.event) + ? options.event.join(' ') + : options.event; + + var isStructural = method && options.structural; + var structuralClassName = ''; + var addRemoveClassName = ''; + + if (isStructural) { + structuralClassName = pendClasses(method, 'ng-', true); + } else if (method) { + structuralClassName = method; + } + + if (options.addClass) { + addRemoveClassName += pendClasses(options.addClass, '-add'); + } + + if (options.removeClass) { + if (addRemoveClassName.length) { + addRemoveClassName += ' '; + } + addRemoveClassName += pendClasses(options.removeClass, '-remove'); + } + + // there may be a situation where a structural animation is combined together + // with CSS classes that need to resolve before the animation is computed. + // However this means that there is no explicit CSS code to block the animation + // from happening (by setting 0s none in the class name). If this is the case + // we need to apply the classes before the first rAF so we know to continue if + // there actually is a detected transition or keyframe animation + if (options.applyClassesEarly && addRemoveClassName.length) { + applyAnimationClasses(element, options); + addRemoveClassName = ''; + } + + var setupClasses = [structuralClassName, addRemoveClassName].join(' ').trim(); + var fullClassName = classes + ' ' + setupClasses; + var activeClasses = pendClasses(setupClasses, '-active'); + var hasToStyles = styles.to && Object.keys(styles.to).length > 0; + var containsKeyframeAnimation = (options.keyframeStyle || '').length > 0; + + // there is no way we can trigger an animation if no styles and + // no classes are being applied which would then trigger a transition, + // unless there a is raw keyframe value that is applied to the element. + if (!containsKeyframeAnimation + && !hasToStyles + && !setupClasses) { + return closeAndReturnNoopAnimator(); + } + + var cacheKey, stagger; + if (options.stagger > 0) { + var staggerVal = parseFloat(options.stagger); + stagger = { + transitionDelay: staggerVal, + animationDelay: staggerVal, + transitionDuration: 0, + animationDuration: 0 + }; + } else { + cacheKey = gcsHashFn(node, fullClassName); + stagger = computeCachedCssStaggerStyles(node, setupClasses, cacheKey, DETECT_STAGGER_CSS_PROPERTIES); + } + + $$jqLite.addClass(element, setupClasses); + + var applyOnlyDuration; + + if (options.transitionStyle) { + var transitionStyle = [TRANSITION_PROP, options.transitionStyle]; + applyInlineStyle(node, transitionStyle); + temporaryStyles.push(transitionStyle); + } + + if (options.duration >= 0) { + applyOnlyDuration = node.style[TRANSITION_PROP].length > 0; + var durationStyle = getCssTransitionDurationStyle(options.duration, applyOnlyDuration); + + // we set the duration so that it will be picked up by getComputedStyle later + applyInlineStyle(node, durationStyle); + temporaryStyles.push(durationStyle); + } + + if (options.keyframeStyle) { + var keyframeStyle = [ANIMATION_PROP, options.keyframeStyle]; + applyInlineStyle(node, keyframeStyle); + temporaryStyles.push(keyframeStyle); + } + + var itemIndex = stagger + ? options.staggerIndex >= 0 + ? options.staggerIndex + : gcsLookup.count(cacheKey) + : 0; + + var isFirst = itemIndex === 0; + + // this is a pre-emptive way of forcing the setup classes to be added and applied INSTANTLY + // without causing any combination of transitions to kick in. By adding a negative delay value + // it forces the setup class' transition to end immediately. We later then remove the negative + // transition delay to allow for the transition to naturally do it's thing. The beauty here is + // that if there is no transition defined then nothing will happen and this will also allow + // other transitions to be stacked on top of each other without any chopping them out. + if (isFirst) { + blockTransitions(node, SAFE_FAST_FORWARD_DURATION_VALUE); + } + + var timings = computeTimings(node, fullClassName, cacheKey); + var relativeDelay = timings.maxDelay; + maxDelay = Math.max(relativeDelay, 0); + maxDuration = timings.maxDuration; + + var flags = {}; + flags.hasTransitions = timings.transitionDuration > 0; + flags.hasAnimations = timings.animationDuration > 0; + flags.hasTransitionAll = flags.hasTransitions && timings.transitionProperty == 'all'; + flags.applyTransitionDuration = hasToStyles && ( + (flags.hasTransitions && !flags.hasTransitionAll) + || (flags.hasAnimations && !flags.hasTransitions)); + flags.applyAnimationDuration = options.duration && flags.hasAnimations; + flags.applyTransitionDelay = truthyTimingValue(options.delay) && (flags.applyTransitionDuration || flags.hasTransitions); + flags.applyAnimationDelay = truthyTimingValue(options.delay) && flags.hasAnimations; + flags.recalculateTimingStyles = addRemoveClassName.length > 0; + + if (flags.applyTransitionDuration || flags.applyAnimationDuration) { + maxDuration = options.duration ? parseFloat(options.duration) : maxDuration; + + if (flags.applyTransitionDuration) { + flags.hasTransitions = true; + timings.transitionDuration = maxDuration; + applyOnlyDuration = node.style[TRANSITION_PROP + PROPERTY_KEY].length > 0; + temporaryStyles.push(getCssTransitionDurationStyle(maxDuration, applyOnlyDuration)); + } + + if (flags.applyAnimationDuration) { + flags.hasAnimations = true; + timings.animationDuration = maxDuration; + temporaryStyles.push(getCssKeyframeDurationStyle(maxDuration)); + } + } + + if (maxDuration === 0 && !flags.recalculateTimingStyles) { + return closeAndReturnNoopAnimator(); + } + + // we need to recalculate the delay value since we used a pre-emptive negative + // delay value and the delay value is required for the final event checking. This + // property will ensure that this will happen after the RAF phase has passed. + if (options.duration == null && timings.transitionDuration > 0) { + flags.recalculateTimingStyles = flags.recalculateTimingStyles || isFirst; + } + + maxDelayTime = maxDelay * ONE_SECOND; + maxDurationTime = maxDuration * ONE_SECOND; + if (!options.skipBlocking) { + flags.blockTransition = timings.transitionDuration > 0; + flags.blockKeyframeAnimation = timings.animationDuration > 0 && + stagger.animationDelay > 0 && + stagger.animationDuration === 0; + } + + applyAnimationFromStyles(element, options); + if (!flags.blockTransition) { + blockTransitions(node, false); + } + + applyBlocking(maxDuration); + + // TODO(matsko): for 1.5 change this code to have an animator object for better debugging + return { + $$willAnimate: true, + end: endFn, + start: function() { + if (animationClosed) return; + + runnerHost = { + end: endFn, + cancel: cancelFn, + resume: null, //this will be set during the start() phase + pause: null + }; + + runner = new $$AnimateRunner(runnerHost); + + waitUntilQuiet(start); + + // we don't have access to pause/resume the animation + // since it hasn't run yet. AnimateRunner will therefore + // set noop functions for resume and pause and they will + // later be overridden once the animation is triggered + return runner; + } + }; + + function endFn() { + close(); + } + + function cancelFn() { + close(true); + } + + function close(rejected) { // jshint ignore:line + // if the promise has been called already then we shouldn't close + // the animation again + if (animationClosed || (animationCompleted && animationPaused)) return; + animationClosed = true; + animationPaused = false; + + $$jqLite.removeClass(element, setupClasses); + $$jqLite.removeClass(element, activeClasses); + + blockKeyframeAnimations(node, false); + blockTransitions(node, false); + + forEach(temporaryStyles, function(entry) { + // There is only one way to remove inline style properties entirely from elements. + // By using `removeProperty` this works, but we need to convert camel-cased CSS + // styles down to hyphenated values. + node.style[entry[0]] = ''; + }); + + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + + // the reason why we have this option is to allow a synchronous closing callback + // that is fired as SOON as the animation ends (when the CSS is removed) or if + // the animation never takes off at all. A good example is a leave animation since + // the element must be removed just after the animation is over or else the element + // will appear on screen for one animation frame causing an overbearing flicker. + if (options.onDone) { + options.onDone(); + } + + // if the preparation function fails then the promise is not setup + if (runner) { + runner.complete(!rejected); + } + } + + function applyBlocking(duration) { + if (flags.blockTransition) { + blockTransitions(node, duration); + } + + if (flags.blockKeyframeAnimation) { + blockKeyframeAnimations(node, !!duration); + } + } + + function closeAndReturnNoopAnimator() { + runner = new $$AnimateRunner({ + end: endFn, + cancel: cancelFn + }); + + close(); + + return { + $$willAnimate: false, + start: function() { + return runner; + }, + end: endFn + }; + } + + function start() { + if (animationClosed) return; + if (!node.parentNode) { + close(); + return; + } + + var startTime, events = []; + + // even though we only pause keyframe animations here the pause flag + // will still happen when transitions are used. Only the transition will + // not be paused since that is not possible. If the animation ends when + // paused then it will not complete until unpaused or cancelled. + var playPause = function(playAnimation) { + if (!animationCompleted) { + animationPaused = !playAnimation; + if (timings.animationDuration) { + var value = blockKeyframeAnimations(node, animationPaused); + animationPaused + ? temporaryStyles.push(value) + : removeFromArray(temporaryStyles, value); + } + } else if (animationPaused && playAnimation) { + animationPaused = false; + close(); + } + }; + + // checking the stagger duration prevents an accidently cascade of the CSS delay style + // being inherited from the parent. If the transition duration is zero then we can safely + // rely that the delay value is an intential stagger delay style. + var maxStagger = itemIndex > 0 + && ((timings.transitionDuration && stagger.transitionDuration === 0) || + (timings.animationDuration && stagger.animationDuration === 0)) + && Math.max(stagger.animationDelay, stagger.transitionDelay); + if (maxStagger) { + $timeout(triggerAnimationStart, + Math.floor(maxStagger * itemIndex * ONE_SECOND), + false); + } else { + triggerAnimationStart(); + } + + // this will decorate the existing promise runner with pause/resume methods + runnerHost.resume = function() { + playPause(true); + }; + + runnerHost.pause = function() { + playPause(false); + }; + + function triggerAnimationStart() { + // just incase a stagger animation kicks in when the animation + // itself was cancelled entirely + if (animationClosed) return; + + applyBlocking(false); + + forEach(temporaryStyles, function(entry) { + var key = entry[0]; + var value = entry[1]; + node.style[key] = value; + }); + + applyAnimationClasses(element, options); + $$jqLite.addClass(element, activeClasses); + + if (flags.recalculateTimingStyles) { + fullClassName = node.className + ' ' + setupClasses; + cacheKey = gcsHashFn(node, fullClassName); + + timings = computeTimings(node, fullClassName, cacheKey); + relativeDelay = timings.maxDelay; + maxDelay = Math.max(relativeDelay, 0); + maxDuration = timings.maxDuration; + + if (maxDuration === 0) { + close(); + return; + } + + flags.hasTransitions = timings.transitionDuration > 0; + flags.hasAnimations = timings.animationDuration > 0; + } + + if (flags.applyTransitionDelay || flags.applyAnimationDelay) { + relativeDelay = typeof options.delay !== "boolean" && truthyTimingValue(options.delay) + ? parseFloat(options.delay) + : relativeDelay; + + maxDelay = Math.max(relativeDelay, 0); + + var delayStyle; + if (flags.applyTransitionDelay) { + timings.transitionDelay = relativeDelay; + delayStyle = getCssDelayStyle(relativeDelay); + temporaryStyles.push(delayStyle); + node.style[delayStyle[0]] = delayStyle[1]; + } + + if (flags.applyAnimationDelay) { + timings.animationDelay = relativeDelay; + delayStyle = getCssDelayStyle(relativeDelay, true); + temporaryStyles.push(delayStyle); + node.style[delayStyle[0]] = delayStyle[1]; + } + } + + maxDelayTime = maxDelay * ONE_SECOND; + maxDurationTime = maxDuration * ONE_SECOND; + + if (options.easing) { + var easeProp, easeVal = options.easing; + if (flags.hasTransitions) { + easeProp = TRANSITION_PROP + TIMING_KEY; + temporaryStyles.push([easeProp, easeVal]); + node.style[easeProp] = easeVal; + } + if (flags.hasAnimations) { + easeProp = ANIMATION_PROP + TIMING_KEY; + temporaryStyles.push([easeProp, easeVal]); + node.style[easeProp] = easeVal; + } + } + + if (timings.transitionDuration) { + events.push(TRANSITIONEND_EVENT); + } + + if (timings.animationDuration) { + events.push(ANIMATIONEND_EVENT); + } + + startTime = Date.now(); + element.on(events.join(' '), onAnimationProgress); + $timeout(onAnimationExpired, maxDelayTime + CLOSING_TIME_BUFFER * maxDurationTime); + + applyAnimationToStyles(element, options); + } + + function onAnimationExpired() { + // although an expired animation is a failed animation, getting to + // this outcome is very easy if the CSS code screws up. Therefore we + // should still continue normally as if the animation completed correctly. + close(); + } + + function onAnimationProgress(event) { + event.stopPropagation(); + var ev = event.originalEvent || event; + var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now(); + + /* Firefox (or possibly just Gecko) likes to not round values up + * when a ms measurement is used for the animation */ + var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); + + /* $manualTimeStamp is a mocked timeStamp value which is set + * within browserTrigger(). This is only here so that tests can + * mock animations properly. Real events fallback to event.timeStamp, + * or, if they don't, then a timeStamp is automatically created for them. + * We're checking to see if the timeStamp surpasses the expected delay, + * but we're using elapsedTime instead of the timeStamp on the 2nd + * pre-condition since animations sometimes close off early */ + if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) { + // we set this flag to ensure that if the transition is paused then, when resumed, + // the animation will automatically close itself since transitions cannot be paused. + animationCompleted = true; + close(); + } + } + } + } + }]; +}]; + +var $$AnimateCssDriverProvider = ['$$animationProvider', function($$animationProvider) { + $$animationProvider.drivers.push('$$animateCssDriver'); + + var NG_ANIMATE_SHIM_CLASS_NAME = 'ng-animate-shim'; + var NG_ANIMATE_ANCHOR_CLASS_NAME = 'ng-anchor'; + + var NG_OUT_ANCHOR_CLASS_NAME = 'ng-anchor-out'; + var NG_IN_ANCHOR_CLASS_NAME = 'ng-anchor-in'; + + this.$get = ['$animateCss', '$rootScope', '$$AnimateRunner', '$rootElement', '$document', '$sniffer', + function($animateCss, $rootScope, $$AnimateRunner, $rootElement, $document, $sniffer) { + + // only browsers that support these properties can render animations + if (!$sniffer.animations && !$sniffer.transitions) return noop; + + var bodyNode = getDomNode($document).body; + var rootNode = getDomNode($rootElement); + + var rootBodyElement = jqLite(bodyNode.parentNode === rootNode ? bodyNode : rootNode); + + return function initDriverFn(animationDetails) { + return animationDetails.from && animationDetails.to + ? prepareFromToAnchorAnimation(animationDetails.from, + animationDetails.to, + animationDetails.classes, + animationDetails.anchors) + : prepareRegularAnimation(animationDetails); + }; + + function filterCssClasses(classes) { + //remove all the `ng-` stuff + return classes.replace(/\bng-\S+\b/g, ''); + } + + function getUniqueValues(a, b) { + if (isString(a)) a = a.split(' '); + if (isString(b)) b = b.split(' '); + return a.filter(function(val) { + return b.indexOf(val) === -1; + }).join(' '); + } + + function prepareAnchoredAnimation(classes, outAnchor, inAnchor) { + var clone = jqLite(getDomNode(outAnchor).cloneNode(true)); + var startingClasses = filterCssClasses(getClassVal(clone)); + + outAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME); + inAnchor.addClass(NG_ANIMATE_SHIM_CLASS_NAME); + + clone.addClass(NG_ANIMATE_ANCHOR_CLASS_NAME); + + rootBodyElement.append(clone); + + var animatorIn, animatorOut = prepareOutAnimation(); + + // the user may not end up using the `out` animation and + // only making use of the `in` animation or vice-versa. + // In either case we should allow this and not assume the + // animation is over unless both animations are not used. + if (!animatorOut) { + animatorIn = prepareInAnimation(); + if (!animatorIn) { + return end(); + } + } + + var startingAnimator = animatorOut || animatorIn; + + return { + start: function() { + var runner; + + var currentAnimation = startingAnimator.start(); + currentAnimation.done(function() { + currentAnimation = null; + if (!animatorIn) { + animatorIn = prepareInAnimation(); + if (animatorIn) { + currentAnimation = animatorIn.start(); + currentAnimation.done(function() { + currentAnimation = null; + end(); + runner.complete(); + }); + return currentAnimation; + } + } + // in the event that there is no `in` animation + end(); + runner.complete(); + }); + + runner = new $$AnimateRunner({ + end: endFn, + cancel: endFn + }); + + return runner; + + function endFn() { + if (currentAnimation) { + currentAnimation.end(); + } + } + } + }; + + function calculateAnchorStyles(anchor) { + var styles = {}; + + var coords = getDomNode(anchor).getBoundingClientRect(); + + // we iterate directly since safari messes up and doesn't return + // all the keys for the coods object when iterated + forEach(['width','height','top','left'], function(key) { + var value = coords[key]; + switch (key) { + case 'top': + value += bodyNode.scrollTop; + break; + case 'left': + value += bodyNode.scrollLeft; + break; + } + styles[key] = Math.floor(value) + 'px'; + }); + return styles; + } + + function prepareOutAnimation() { + var animator = $animateCss(clone, { + addClass: NG_OUT_ANCHOR_CLASS_NAME, + delay: true, + from: calculateAnchorStyles(outAnchor) + }); + + // read the comment within `prepareRegularAnimation` to understand + // why this check is necessary + return animator.$$willAnimate ? animator : null; + } + + function getClassVal(element) { + return element.attr('class') || ''; + } + + function prepareInAnimation() { + var endingClasses = filterCssClasses(getClassVal(inAnchor)); + var toAdd = getUniqueValues(endingClasses, startingClasses); + var toRemove = getUniqueValues(startingClasses, endingClasses); + + var animator = $animateCss(clone, { + to: calculateAnchorStyles(inAnchor), + addClass: NG_IN_ANCHOR_CLASS_NAME + ' ' + toAdd, + removeClass: NG_OUT_ANCHOR_CLASS_NAME + ' ' + toRemove, + delay: true + }); + + // read the comment within `prepareRegularAnimation` to understand + // why this check is necessary + return animator.$$willAnimate ? animator : null; + } + + function end() { + clone.remove(); + outAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME); + inAnchor.removeClass(NG_ANIMATE_SHIM_CLASS_NAME); + } + } + + function prepareFromToAnchorAnimation(from, to, classes, anchors) { + var fromAnimation = prepareRegularAnimation(from); + var toAnimation = prepareRegularAnimation(to); + + var anchorAnimations = []; + forEach(anchors, function(anchor) { + var outElement = anchor['out']; + var inElement = anchor['in']; + var animator = prepareAnchoredAnimation(classes, outElement, inElement); + if (animator) { + anchorAnimations.push(animator); + } + }); + + // no point in doing anything when there are no elements to animate + if (!fromAnimation && !toAnimation && anchorAnimations.length === 0) return; + + return { + start: function() { + var animationRunners = []; + + if (fromAnimation) { + animationRunners.push(fromAnimation.start()); + } + + if (toAnimation) { + animationRunners.push(toAnimation.start()); + } + + forEach(anchorAnimations, function(animation) { + animationRunners.push(animation.start()); + }); + + var runner = new $$AnimateRunner({ + end: endFn, + cancel: endFn // CSS-driven animations cannot be cancelled, only ended + }); + + $$AnimateRunner.all(animationRunners, function(status) { + runner.complete(status); + }); + + return runner; + + function endFn() { + forEach(animationRunners, function(runner) { + runner.end(); + }); + } + } + }; + } + + function prepareRegularAnimation(animationDetails) { + var element = animationDetails.element; + var options = animationDetails.options || {}; + + if (animationDetails.structural) { + // structural animations ensure that the CSS classes are always applied + // before the detection starts. + options.structural = options.applyClassesEarly = true; + + // we special case the leave animation since we want to ensure that + // the element is removed as soon as the animation is over. Otherwise + // a flicker might appear or the element may not be removed at all + options.event = animationDetails.event; + if (options.event === 'leave') { + options.onDone = options.domOperation; + } + } else { + options.event = null; + } + + var animator = $animateCss(element, options); + + // the driver lookup code inside of $$animation attempts to spawn a + // driver one by one until a driver returns a.$$willAnimate animator object. + // $animateCss will always return an object, however, it will pass in + // a flag as a hint as to whether an animation was detected or not + return animator.$$willAnimate ? animator : null; + } + }]; +}]; + +// TODO(matsko): use caching here to speed things up for detection +// TODO(matsko): add documentation +// by the time... + +var $$AnimateJsProvider = ['$animateProvider', function($animateProvider) { + this.$get = ['$injector', '$$AnimateRunner', '$$rAFMutex', '$$jqLite', + function($injector, $$AnimateRunner, $$rAFMutex, $$jqLite) { + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + // $animateJs(element, 'enter'); + return function(element, event, classes, options) { + // the `classes` argument is optional and if it is not used + // then the classes will be resolved from the element's className + // property as well as options.addClass/options.removeClass. + if (arguments.length === 3 && isObject(classes)) { + options = classes; + classes = null; + } + + options = prepareAnimationOptions(options); + if (!classes) { + classes = element.attr('class') || ''; + if (options.addClass) { + classes += ' ' + options.addClass; + } + if (options.removeClass) { + classes += ' ' + options.removeClass; + } + } + + var classesToAdd = options.addClass; + var classesToRemove = options.removeClass; + + // the lookupAnimations function returns a series of animation objects that are + // matched up with one or more of the CSS classes. These animation objects are + // defined via the module.animation factory function. If nothing is detected then + // we don't return anything which then makes $animation query the next driver. + var animations = lookupAnimations(classes); + var before, after; + if (animations.length) { + var afterFn, beforeFn; + if (event == 'leave') { + beforeFn = 'leave'; + afterFn = 'afterLeave'; // TODO(matsko): get rid of this + } else { + beforeFn = 'before' + event.charAt(0).toUpperCase() + event.substr(1); + afterFn = event; + } + + if (event !== 'enter' && event !== 'move') { + before = packageAnimations(element, event, options, animations, beforeFn); + } + after = packageAnimations(element, event, options, animations, afterFn); + } + + // no matching animations + if (!before && !after) return; + + function applyOptions() { + options.domOperation(); + applyAnimationClasses(element, options); + } + + return { + start: function() { + var closeActiveAnimations; + var chain = []; + + if (before) { + chain.push(function(fn) { + closeActiveAnimations = before(fn); + }); + } + + if (chain.length) { + chain.push(function(fn) { + applyOptions(); + fn(true); + }); + } else { + applyOptions(); + } + + if (after) { + chain.push(function(fn) { + closeActiveAnimations = after(fn); + }); + } + + var animationClosed = false; + var runner = new $$AnimateRunner({ + end: function() { + endAnimations(); + }, + cancel: function() { + endAnimations(true); + } + }); + + $$AnimateRunner.chain(chain, onComplete); + return runner; + + function onComplete(success) { + animationClosed = true; + applyOptions(); + applyAnimationStyles(element, options); + runner.complete(success); + } + + function endAnimations(cancelled) { + if (!animationClosed) { + (closeActiveAnimations || noop)(cancelled); + onComplete(cancelled); + } + } + } + }; + + function executeAnimationFn(fn, element, event, options, onDone) { + var args; + switch (event) { + case 'animate': + args = [element, options.from, options.to, onDone]; + break; + + case 'setClass': + args = [element, classesToAdd, classesToRemove, onDone]; + break; + + case 'addClass': + args = [element, classesToAdd, onDone]; + break; + + case 'removeClass': + args = [element, classesToRemove, onDone]; + break; + + default: + args = [element, onDone]; + break; + } + + args.push(options); + + var value = fn.apply(fn, args); + if (value) { + if (isFunction(value.start)) { + value = value.start(); + } + + if (value instanceof $$AnimateRunner) { + value.done(onDone); + } else if (isFunction(value)) { + // optional onEnd / onCancel callback + return value; + } + } + + return noop; + } + + function groupEventedAnimations(element, event, options, animations, fnName) { + var operations = []; + forEach(animations, function(ani) { + var animation = ani[fnName]; + if (!animation) return; + + // note that all of these animations will run in parallel + operations.push(function() { + var runner; + var endProgressCb; + + var resolved = false; + var onAnimationComplete = function(rejected) { + if (!resolved) { + resolved = true; + (endProgressCb || noop)(rejected); + runner.complete(!rejected); + } + }; + + runner = new $$AnimateRunner({ + end: function() { + onAnimationComplete(); + }, + cancel: function() { + onAnimationComplete(true); + } + }); + + endProgressCb = executeAnimationFn(animation, element, event, options, function(result) { + var cancelled = result === false; + onAnimationComplete(cancelled); + }); + + return runner; + }); + }); + + return operations; + } + + function packageAnimations(element, event, options, animations, fnName) { + var operations = groupEventedAnimations(element, event, options, animations, fnName); + if (operations.length === 0) { + var a,b; + if (fnName === 'beforeSetClass') { + a = groupEventedAnimations(element, 'removeClass', options, animations, 'beforeRemoveClass'); + b = groupEventedAnimations(element, 'addClass', options, animations, 'beforeAddClass'); + } else if (fnName === 'setClass') { + a = groupEventedAnimations(element, 'removeClass', options, animations, 'removeClass'); + b = groupEventedAnimations(element, 'addClass', options, animations, 'addClass'); + } + + if (a) { + operations = operations.concat(a); + } + if (b) { + operations = operations.concat(b); + } + } + + if (operations.length === 0) return; + + // TODO(matsko): add documentation + return function startAnimation(callback) { + var runners = []; + if (operations.length) { + forEach(operations, function(animateFn) { + runners.push(animateFn()); + }); + } + + runners.length ? $$AnimateRunner.all(runners, callback) : callback(); + + return function endFn(reject) { + forEach(runners, function(runner) { + reject ? runner.cancel() : runner.end(); + }); + }; + }; + } + }; + + function lookupAnimations(classes) { + classes = isArray(classes) ? classes : classes.split(' '); + var matches = [], flagMap = {}; + for (var i=0; i < classes.length; i++) { + var klass = classes[i], + animationFactory = $animateProvider.$$registeredAnimations[klass]; + if (animationFactory && !flagMap[klass]) { + matches.push($injector.get(animationFactory)); + flagMap[klass] = true; + } + } + return matches; + } + }]; +}]; + +var $$AnimateJsDriverProvider = ['$$animationProvider', function($$animationProvider) { + $$animationProvider.drivers.push('$$animateJsDriver'); + this.$get = ['$$animateJs', '$$AnimateRunner', function($$animateJs, $$AnimateRunner) { + return function initDriverFn(animationDetails) { + if (animationDetails.from && animationDetails.to) { + var fromAnimation = prepareAnimation(animationDetails.from); + var toAnimation = prepareAnimation(animationDetails.to); + if (!fromAnimation && !toAnimation) return; + + return { + start: function() { + var animationRunners = []; + + if (fromAnimation) { + animationRunners.push(fromAnimation.start()); + } + + if (toAnimation) { + animationRunners.push(toAnimation.start()); + } + + $$AnimateRunner.all(animationRunners, done); + + var runner = new $$AnimateRunner({ + end: endFnFactory(), + cancel: endFnFactory() + }); + + return runner; + + function endFnFactory() { + return function() { + forEach(animationRunners, function(runner) { + // at this point we cannot cancel animations for groups just yet. 1.5+ + runner.end(); + }); + }; + } + + function done(status) { + runner.complete(status); + } + } + }; + } else { + return prepareAnimation(animationDetails); + } + }; + + function prepareAnimation(animationDetails) { + // TODO(matsko): make sure to check for grouped animations and delegate down to normal animations + var element = animationDetails.element; + var event = animationDetails.event; + var options = animationDetails.options; + var classes = animationDetails.classes; + return $$animateJs(element, event, classes, options); + } + }]; +}]; + +var NG_ANIMATE_ATTR_NAME = 'data-ng-animate'; +var NG_ANIMATE_PIN_DATA = '$ngAnimatePin'; +var $$AnimateQueueProvider = ['$animateProvider', function($animateProvider) { + var PRE_DIGEST_STATE = 1; + var RUNNING_STATE = 2; + + var rules = this.rules = { + skip: [], + cancel: [], + join: [] + }; + + function isAllowed(ruleType, element, currentAnimation, previousAnimation) { + return rules[ruleType].some(function(fn) { + return fn(element, currentAnimation, previousAnimation); + }); + } + + function hasAnimationClasses(options, and) { + options = options || {}; + var a = (options.addClass || '').length > 0; + var b = (options.removeClass || '').length > 0; + return and ? a && b : a || b; + } + + rules.join.push(function(element, newAnimation, currentAnimation) { + // if the new animation is class-based then we can just tack that on + return !newAnimation.structural && hasAnimationClasses(newAnimation.options); + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // there is no need to animate anything if no classes are being added and + // there is no structural animation that will be triggered + return !newAnimation.structural && !hasAnimationClasses(newAnimation.options); + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // why should we trigger a new structural animation if the element will + // be removed from the DOM anyway? + return currentAnimation.event == 'leave' && newAnimation.structural; + }); + + rules.skip.push(function(element, newAnimation, currentAnimation) { + // if there is a current animation then skip the class-based animation + return currentAnimation.structural && !newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + // there can never be two structural animations running at the same time + return currentAnimation.structural && newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + // if the previous animation is already running, but the new animation will + // be triggered, but the new animation is structural + return currentAnimation.state === RUNNING_STATE && newAnimation.structural; + }); + + rules.cancel.push(function(element, newAnimation, currentAnimation) { + var nO = newAnimation.options; + var cO = currentAnimation.options; + + // if the exact same CSS class is added/removed then it's safe to cancel it + return (nO.addClass && nO.addClass === cO.removeClass) || (nO.removeClass && nO.removeClass === cO.addClass); + }); + + this.$get = ['$$rAF', '$rootScope', '$rootElement', '$document', '$$HashMap', + '$$animation', '$$AnimateRunner', '$templateRequest', '$$jqLite', + function($$rAF, $rootScope, $rootElement, $document, $$HashMap, + $$animation, $$AnimateRunner, $templateRequest, $$jqLite) { + + var activeAnimationsLookup = new $$HashMap(); + var disabledElementsLookup = new $$HashMap(); + + var animationsEnabled = null; + + // Wait until all directive and route-related templates are downloaded and + // compiled. The $templateRequest.totalPendingRequests variable keeps track of + // all of the remote templates being currently downloaded. If there are no + // templates currently downloading then the watcher will still fire anyway. + var deregisterWatch = $rootScope.$watch( + function() { return $templateRequest.totalPendingRequests === 0; }, + function(isEmpty) { + if (!isEmpty) return; + deregisterWatch(); + + // Now that all templates have been downloaded, $animate will wait until + // the post digest queue is empty before enabling animations. By having two + // calls to $postDigest calls we can ensure that the flag is enabled at the + // very end of the post digest queue. Since all of the animations in $animate + // use $postDigest, it's important that the code below executes at the end. + // This basically means that the page is fully downloaded and compiled before + // any animations are triggered. + $rootScope.$$postDigest(function() { + $rootScope.$$postDigest(function() { + // we check for null directly in the event that the application already called + // .enabled() with whatever arguments that it provided it with + if (animationsEnabled === null) { + animationsEnabled = true; + } + }); + }); + } + ); + + var bodyElement = jqLite($document[0].body); + + var callbackRegistry = {}; + + // remember that the classNameFilter is set during the provider/config + // stage therefore we can optimize here and setup a helper function + var classNameFilter = $animateProvider.classNameFilter(); + var isAnimatableClassName = !classNameFilter + ? function() { return true; } + : function(className) { + return classNameFilter.test(className); + }; + + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + function normalizeAnimationOptions(element, options) { + return mergeAnimationOptions(element, options, {}); + } + + function findCallbacks(element, event) { + var targetNode = getDomNode(element); + + var matches = []; + var entries = callbackRegistry[event]; + if (entries) { + forEach(entries, function(entry) { + if (entry.node.contains(targetNode)) { + matches.push(entry.callback); + } + }); + } + + return matches; + } + + function triggerCallback(event, element, phase, data) { + $$rAF(function() { + forEach(findCallbacks(element, event), function(callback) { + callback(element, phase, data); + }); + }); + } + + return { + on: function(event, container, callback) { + var node = extractElementNode(container); + callbackRegistry[event] = callbackRegistry[event] || []; + callbackRegistry[event].push({ + node: node, + callback: callback + }); + }, + + off: function(event, container, callback) { + var entries = callbackRegistry[event]; + if (!entries) return; + + callbackRegistry[event] = arguments.length === 1 + ? null + : filterFromRegistry(entries, container, callback); + + function filterFromRegistry(list, matchContainer, matchCallback) { + var containerNode = extractElementNode(matchContainer); + return list.filter(function(entry) { + var isMatch = entry.node === containerNode && + (!matchCallback || entry.callback === matchCallback); + return !isMatch; + }); + } + }, + + pin: function(element, parentElement) { + assertArg(isElement(element), 'element', 'not an element'); + assertArg(isElement(parentElement), 'parentElement', 'not an element'); + element.data(NG_ANIMATE_PIN_DATA, parentElement); + }, + + push: function(element, event, options, domOperation) { + options = options || {}; + options.domOperation = domOperation; + return queueAnimation(element, event, options); + }, + + // this method has four signatures: + // () - global getter + // (bool) - global setter + // (element) - element getter + // (element, bool) - element setter + enabled: function(element, bool) { + var argCount = arguments.length; + + if (argCount === 0) { + // () - Global getter + bool = !!animationsEnabled; + } else { + var hasElement = isElement(element); + + if (!hasElement) { + // (bool) - Global setter + bool = animationsEnabled = !!element; + } else { + var node = getDomNode(element); + var recordExists = disabledElementsLookup.get(node); + + if (argCount === 1) { + // (element) - Element getter + bool = !recordExists; + } else { + // (element, bool) - Element setter + bool = !!bool; + if (!bool) { + disabledElementsLookup.put(node, true); + } else if (recordExists) { + disabledElementsLookup.remove(node); + } + } + } + } + + return bool; + } + }; + + function queueAnimation(element, event, options) { + var node, parent; + element = stripCommentsFromElement(element); + if (element) { + node = getDomNode(element); + parent = element.parent(); + } + + options = prepareAnimationOptions(options); + + // we create a fake runner with a working promise. + // These methods will become available after the digest has passed + var runner = new $$AnimateRunner(); + + // there are situations where a directive issues an animation for + // a jqLite wrapper that contains only comment nodes... If this + // happens then there is no way we can perform an animation + if (!node) { + close(); + return runner; + } + + if (isArray(options.addClass)) { + options.addClass = options.addClass.join(' '); + } + + if (isArray(options.removeClass)) { + options.removeClass = options.removeClass.join(' '); + } + + if (options.from && !isObject(options.from)) { + options.from = null; + } + + if (options.to && !isObject(options.to)) { + options.to = null; + } + + var className = [node.className, options.addClass, options.removeClass].join(' '); + if (!isAnimatableClassName(className)) { + close(); + return runner; + } + + var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0; + + // this is a hard disable of all animations for the application or on + // the element itself, therefore there is no need to continue further + // past this point if not enabled + var skipAnimations = !animationsEnabled || disabledElementsLookup.get(node); + var existingAnimation = (!skipAnimations && activeAnimationsLookup.get(node)) || {}; + var hasExistingAnimation = !!existingAnimation.state; + + // there is no point in traversing the same collection of parent ancestors if a followup + // animation will be run on the same element that already did all that checking work + if (!skipAnimations && (!hasExistingAnimation || existingAnimation.state != PRE_DIGEST_STATE)) { + skipAnimations = !areAnimationsAllowed(element, parent, event); + } + + if (skipAnimations) { + close(); + return runner; + } + + if (isStructural) { + closeChildAnimations(element); + } + + var newAnimation = { + structural: isStructural, + element: element, + event: event, + close: close, + options: options, + runner: runner + }; + + if (hasExistingAnimation) { + var skipAnimationFlag = isAllowed('skip', element, newAnimation, existingAnimation); + if (skipAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + close(); + return runner; + } else { + mergeAnimationOptions(element, existingAnimation.options, options); + return existingAnimation.runner; + } + } + + var cancelAnimationFlag = isAllowed('cancel', element, newAnimation, existingAnimation); + if (cancelAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + // this will end the animation right away and it is safe + // to do so since the animation is already running and the + // runner callback code will run in async + existingAnimation.runner.end(); + } else if (existingAnimation.structural) { + // this means that the animation is queued into a digest, but + // hasn't started yet. Therefore it is safe to run the close + // method which will call the runner methods in async. + existingAnimation.close(); + } else { + // this will merge the existing animation options into this new follow-up animation + mergeAnimationOptions(element, newAnimation.options, existingAnimation.options); + } + } else { + // a joined animation means that this animation will take over the existing one + // so an example would involve a leave animation taking over an enter. Then when + // the postDigest kicks in the enter will be ignored. + var joinAnimationFlag = isAllowed('join', element, newAnimation, existingAnimation); + if (joinAnimationFlag) { + if (existingAnimation.state === RUNNING_STATE) { + normalizeAnimationOptions(element, options); + } else { + event = newAnimation.event = existingAnimation.event; + options = mergeAnimationOptions(element, existingAnimation.options, newAnimation.options); + return runner; + } + } + } + } else { + // normalization in this case means that it removes redundant CSS classes that + // already exist (addClass) or do not exist (removeClass) on the element + normalizeAnimationOptions(element, options); + } + + // when the options are merged and cleaned up we may end up not having to do + // an animation at all, therefore we should check this before issuing a post + // digest callback. Structural animations will always run no matter what. + var isValidAnimation = newAnimation.structural; + if (!isValidAnimation) { + // animate (from/to) can be quickly checked first, otherwise we check if any classes are present + isValidAnimation = (newAnimation.event === 'animate' && Object.keys(newAnimation.options.to || {}).length > 0) + || hasAnimationClasses(newAnimation.options); + } + + if (!isValidAnimation) { + close(); + clearElementAnimationState(element); + return runner; + } + + if (isStructural) { + closeParentClassBasedAnimations(parent); + } + + // the counter keeps track of cancelled animations + var counter = (existingAnimation.counter || 0) + 1; + newAnimation.counter = counter; + + markElementAnimationState(element, PRE_DIGEST_STATE, newAnimation); + + $rootScope.$$postDigest(function() { + var animationDetails = activeAnimationsLookup.get(node); + var animationCancelled = !animationDetails; + animationDetails = animationDetails || {}; + + // if addClass/removeClass is called before something like enter then the + // registered parent element may not be present. The code below will ensure + // that a final value for parent element is obtained + var parentElement = element.parent() || []; + + // animate/structural/class-based animations all have requirements. Otherwise there + // is no point in performing an animation. The parent node must also be set. + var isValidAnimation = parentElement.length > 0 + && (animationDetails.event === 'animate' + || animationDetails.structural + || hasAnimationClasses(animationDetails.options)); + + // this means that the previous animation was cancelled + // even if the follow-up animation is the same event + if (animationCancelled || animationDetails.counter !== counter || !isValidAnimation) { + // if another animation did not take over then we need + // to make sure that the domOperation and options are + // handled accordingly + if (animationCancelled) { + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + } + + // if the event changed from something like enter to leave then we do + // it, otherwise if it's the same then the end result will be the same too + if (animationCancelled || (isStructural && animationDetails.event !== event)) { + options.domOperation(); + runner.end(); + } + + // in the event that the element animation was not cancelled or a follow-up animation + // isn't allowed to animate from here then we need to clear the state of the element + // so that any future animations won't read the expired animation data. + if (!isValidAnimation) { + clearElementAnimationState(element); + } + + return; + } + + // this combined multiple class to addClass / removeClass into a setClass event + // so long as a structural event did not take over the animation + event = !animationDetails.structural && hasAnimationClasses(animationDetails.options, true) + ? 'setClass' + : animationDetails.event; + + if (animationDetails.structural) { + closeParentClassBasedAnimations(parentElement); + } + + markElementAnimationState(element, RUNNING_STATE); + var realRunner = $$animation(element, event, animationDetails.options); + realRunner.done(function(status) { + close(!status); + var animationDetails = activeAnimationsLookup.get(node); + if (animationDetails && animationDetails.counter === counter) { + clearElementAnimationState(getDomNode(element)); + } + notifyProgress(runner, event, 'close', {}); + }); + + // this will update the runner's flow-control events based on + // the `realRunner` object. + runner.setHost(realRunner); + notifyProgress(runner, event, 'start', {}); + }); + + return runner; + + function notifyProgress(runner, event, phase, data) { + triggerCallback(event, element, phase, data); + runner.progress(event, phase, data); + } + + function close(reject) { // jshint ignore:line + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + options.domOperation(); + runner.complete(!reject); + } + } + + function closeChildAnimations(element) { + var node = getDomNode(element); + var children = node.querySelectorAll('[' + NG_ANIMATE_ATTR_NAME + ']'); + forEach(children, function(child) { + var state = parseInt(child.getAttribute(NG_ANIMATE_ATTR_NAME)); + var animationDetails = activeAnimationsLookup.get(child); + switch (state) { + case RUNNING_STATE: + animationDetails.runner.end(); + /* falls through */ + case PRE_DIGEST_STATE: + if (animationDetails) { + activeAnimationsLookup.remove(child); + } + break; + } + }); + } + + function clearElementAnimationState(element) { + var node = getDomNode(element); + node.removeAttribute(NG_ANIMATE_ATTR_NAME); + activeAnimationsLookup.remove(node); + } + + function isMatchingElement(nodeOrElmA, nodeOrElmB) { + return getDomNode(nodeOrElmA) === getDomNode(nodeOrElmB); + } + + function closeParentClassBasedAnimations(startingElement) { + var parentNode = getDomNode(startingElement); + do { + if (!parentNode || parentNode.nodeType !== ELEMENT_NODE) break; + + var animationDetails = activeAnimationsLookup.get(parentNode); + if (animationDetails) { + examineParentAnimation(parentNode, animationDetails); + } + + parentNode = parentNode.parentNode; + } while (true); + + // since animations are detected from CSS classes, we need to flush all parent + // class-based animations so that the parent classes are all present for child + // animations to properly function (otherwise any CSS selectors may not work) + function examineParentAnimation(node, animationDetails) { + // enter/leave/move always have priority + if (animationDetails.structural || !hasAnimationClasses(animationDetails.options)) return; + + if (animationDetails.state === RUNNING_STATE) { + animationDetails.runner.end(); + } + clearElementAnimationState(node); + } + } + + function areAnimationsAllowed(element, parentElement, event) { + var bodyElementDetected = false; + var rootElementDetected = false; + var parentAnimationDetected = false; + var animateChildren; + + var parentHost = element.data(NG_ANIMATE_PIN_DATA); + if (parentHost) { + parentElement = parentHost; + } + + while (parentElement && parentElement.length) { + if (!rootElementDetected) { + // angular doesn't want to attempt to animate elements outside of the application + // therefore we need to ensure that the rootElement is an ancestor of the current element + rootElementDetected = isMatchingElement(parentElement, $rootElement); + } + + var parentNode = parentElement[0]; + if (parentNode.nodeType !== ELEMENT_NODE) { + // no point in inspecting the #document element + break; + } + + var details = activeAnimationsLookup.get(parentNode) || {}; + // either an enter, leave or move animation will commence + // therefore we can't allow any animations to take place + // but if a parent animation is class-based then that's ok + if (!parentAnimationDetected) { + parentAnimationDetected = details.structural || disabledElementsLookup.get(parentNode); + } + + if (isUndefined(animateChildren) || animateChildren === true) { + var value = parentElement.data(NG_ANIMATE_CHILDREN_DATA); + if (isDefined(value)) { + animateChildren = value; + } + } + + // there is no need to continue traversing at this point + if (parentAnimationDetected && animateChildren === false) break; + + if (!rootElementDetected) { + // angular doesn't want to attempt to animate elements outside of the application + // therefore we need to ensure that the rootElement is an ancestor of the current element + rootElementDetected = isMatchingElement(parentElement, $rootElement); + if (!rootElementDetected) { + parentHost = parentElement.data(NG_ANIMATE_PIN_DATA); + if (parentHost) { + parentElement = parentHost; + } + } + } + + if (!bodyElementDetected) { + // we also need to ensure that the element is or will be apart of the body element + // otherwise it is pointless to even issue an animation to be rendered + bodyElementDetected = isMatchingElement(parentElement, bodyElement); + } + + parentElement = parentElement.parent(); + } + + var allowAnimation = !parentAnimationDetected || animateChildren; + return allowAnimation && rootElementDetected && bodyElementDetected; + } + + function markElementAnimationState(element, state, details) { + details = details || {}; + details.state = state; + + var node = getDomNode(element); + node.setAttribute(NG_ANIMATE_ATTR_NAME, state); + + var oldValue = activeAnimationsLookup.get(node); + var newValue = oldValue + ? extend(oldValue, details) + : details; + activeAnimationsLookup.put(node, newValue); + } + }]; +}]; + +var $$rAFMutexFactory = ['$$rAF', function($$rAF) { + return function() { + var passed = false; + $$rAF(function() { + passed = true; + }); + return function(fn) { + passed ? fn() : $$rAF(fn); + }; + }; +}]; + +var $$AnimateRunnerFactory = ['$q', '$$rAFMutex', function($q, $$rAFMutex) { + var INITIAL_STATE = 0; + var DONE_PENDING_STATE = 1; + var DONE_COMPLETE_STATE = 2; + + AnimateRunner.chain = function(chain, callback) { + var index = 0; + + next(); + function next() { + if (index === chain.length) { + callback(true); + return; + } + + chain[index](function(response) { + if (response === false) { + callback(false); + return; + } + index++; + next(); + }); + } + }; + + AnimateRunner.all = function(runners, callback) { + var count = 0; + var status = true; + forEach(runners, function(runner) { + runner.done(onProgress); + }); + + function onProgress(response) { + status = status && response; + if (++count === runners.length) { + callback(status); + } + } + }; + + function AnimateRunner(host) { + this.setHost(host); + + this._doneCallbacks = []; + this._runInAnimationFrame = $$rAFMutex(); + this._state = 0; + } + + AnimateRunner.prototype = { + setHost: function(host) { + this.host = host || {}; + }, + + done: function(fn) { + if (this._state === DONE_COMPLETE_STATE) { + fn(); + } else { + this._doneCallbacks.push(fn); + } + }, + + progress: noop, + + getPromise: function() { + if (!this.promise) { + var self = this; + this.promise = $q(function(resolve, reject) { + self.done(function(status) { + status === false ? reject() : resolve(); + }); + }); + } + return this.promise; + }, + + then: function(resolveHandler, rejectHandler) { + return this.getPromise().then(resolveHandler, rejectHandler); + }, + + 'catch': function(handler) { + return this.getPromise()['catch'](handler); + }, + + 'finally': function(handler) { + return this.getPromise()['finally'](handler); + }, + + pause: function() { + if (this.host.pause) { + this.host.pause(); + } + }, + + resume: function() { + if (this.host.resume) { + this.host.resume(); + } + }, + + end: function() { + if (this.host.end) { + this.host.end(); + } + this._resolve(true); + }, + + cancel: function() { + if (this.host.cancel) { + this.host.cancel(); + } + this._resolve(false); + }, + + complete: function(response) { + var self = this; + if (self._state === INITIAL_STATE) { + self._state = DONE_PENDING_STATE; + self._runInAnimationFrame(function() { + self._resolve(response); + }); + } + }, + + _resolve: function(response) { + if (this._state !== DONE_COMPLETE_STATE) { + forEach(this._doneCallbacks, function(fn) { + fn(response); + }); + this._doneCallbacks.length = 0; + this._state = DONE_COMPLETE_STATE; + } + } + }; + + return AnimateRunner; +}]; + +var $$AnimationProvider = ['$animateProvider', function($animateProvider) { + var NG_ANIMATE_REF_ATTR = 'ng-animate-ref'; + + var drivers = this.drivers = []; + + var RUNNER_STORAGE_KEY = '$$animationRunner'; + + function setRunner(element, runner) { + element.data(RUNNER_STORAGE_KEY, runner); + } + + function removeRunner(element) { + element.removeData(RUNNER_STORAGE_KEY); + } + + function getRunner(element) { + return element.data(RUNNER_STORAGE_KEY); + } + + this.$get = ['$$jqLite', '$rootScope', '$injector', '$$AnimateRunner', '$$rAFScheduler', + function($$jqLite, $rootScope, $injector, $$AnimateRunner, $$rAFScheduler) { + + var animationQueue = []; + var applyAnimationClasses = applyAnimationClassesFactory($$jqLite); + + var totalPendingClassBasedAnimations = 0; + var totalActiveClassBasedAnimations = 0; + var classBasedAnimationsQueue = []; + + // TODO(matsko): document the signature in a better way + return function(element, event, options) { + options = prepareAnimationOptions(options); + var isStructural = ['enter', 'move', 'leave'].indexOf(event) >= 0; + + // there is no animation at the current moment, however + // these runner methods will get later updated with the + // methods leading into the driver's end/cancel methods + // for now they just stop the animation from starting + var runner = new $$AnimateRunner({ + end: function() { close(); }, + cancel: function() { close(true); } + }); + + if (!drivers.length) { + close(); + return runner; + } + + setRunner(element, runner); + + var classes = mergeClasses(element.attr('class'), mergeClasses(options.addClass, options.removeClass)); + var tempClasses = options.tempClasses; + if (tempClasses) { + classes += ' ' + tempClasses; + options.tempClasses = null; + } + + var classBasedIndex; + if (!isStructural) { + classBasedIndex = totalPendingClassBasedAnimations; + totalPendingClassBasedAnimations += 1; + } + + animationQueue.push({ + // this data is used by the postDigest code and passed into + // the driver step function + element: element, + classes: classes, + event: event, + classBasedIndex: classBasedIndex, + structural: isStructural, + options: options, + beforeStart: beforeStart, + close: close + }); + + element.on('$destroy', handleDestroyedElement); + + // we only want there to be one function called within the post digest + // block. This way we can group animations for all the animations that + // were apart of the same postDigest flush call. + if (animationQueue.length > 1) return runner; + + $rootScope.$$postDigest(function() { + totalActiveClassBasedAnimations = totalPendingClassBasedAnimations; + totalPendingClassBasedAnimations = 0; + classBasedAnimationsQueue.length = 0; + + var animations = []; + forEach(animationQueue, function(entry) { + // the element was destroyed early on which removed the runner + // form its storage. This means we can't animate this element + // at all and it already has been closed due to destruction. + if (getRunner(entry.element)) { + animations.push(entry); + } + }); + + // now any future animations will be in another postDigest + animationQueue.length = 0; + + forEach(groupAnimations(animations), function(animationEntry) { + if (animationEntry.structural) { + triggerAnimationStart(); + } else { + classBasedAnimationsQueue.push({ + node: getDomNode(animationEntry.element), + fn: triggerAnimationStart + }); + + if (animationEntry.classBasedIndex === totalActiveClassBasedAnimations - 1) { + // we need to sort each of the animations in order of parent to child + // relationships. This ensures that the child classes are applied at the + // right time. + classBasedAnimationsQueue = classBasedAnimationsQueue.sort(function(a,b) { + return b.node.contains(a.node); + }).map(function(entry) { + return entry.fn; + }); + + $$rAFScheduler(classBasedAnimationsQueue); + } + } + + function triggerAnimationStart() { + // it's important that we apply the `ng-animate` CSS class and the + // temporary classes before we do any driver invoking since these + // CSS classes may be required for proper CSS detection. + animationEntry.beforeStart(); + + var startAnimationFn, closeFn = animationEntry.close; + + // in the event that the element was removed before the digest runs or + // during the RAF sequencing then we should not trigger the animation. + var targetElement = animationEntry.anchors + ? (animationEntry.from.element || animationEntry.to.element) + : animationEntry.element; + + if (getRunner(targetElement) && getDomNode(targetElement).parentNode) { + var operation = invokeFirstDriver(animationEntry); + if (operation) { + startAnimationFn = operation.start; + } + } + + if (!startAnimationFn) { + closeFn(); + } else { + var animationRunner = startAnimationFn(); + animationRunner.done(function(status) { + closeFn(!status); + }); + updateAnimationRunners(animationEntry, animationRunner); + } + } + }); + }); + + return runner; + + // TODO(matsko): change to reference nodes + function getAnchorNodes(node) { + var SELECTOR = '[' + NG_ANIMATE_REF_ATTR + ']'; + var items = node.hasAttribute(NG_ANIMATE_REF_ATTR) + ? [node] + : node.querySelectorAll(SELECTOR); + var anchors = []; + forEach(items, function(node) { + var attr = node.getAttribute(NG_ANIMATE_REF_ATTR); + if (attr && attr.length) { + anchors.push(node); + } + }); + return anchors; + } + + function groupAnimations(animations) { + var preparedAnimations = []; + var refLookup = {}; + forEach(animations, function(animation, index) { + var element = animation.element; + var node = getDomNode(element); + var event = animation.event; + var enterOrMove = ['enter', 'move'].indexOf(event) >= 0; + var anchorNodes = animation.structural ? getAnchorNodes(node) : []; + + if (anchorNodes.length) { + var direction = enterOrMove ? 'to' : 'from'; + + forEach(anchorNodes, function(anchor) { + var key = anchor.getAttribute(NG_ANIMATE_REF_ATTR); + refLookup[key] = refLookup[key] || {}; + refLookup[key][direction] = { + animationID: index, + element: jqLite(anchor) + }; + }); + } else { + preparedAnimations.push(animation); + } + }); + + var usedIndicesLookup = {}; + var anchorGroups = {}; + forEach(refLookup, function(operations, key) { + var from = operations.from; + var to = operations.to; + + if (!from || !to) { + // only one of these is set therefore we can't have an + // anchor animation since all three pieces are required + var index = from ? from.animationID : to.animationID; + var indexKey = index.toString(); + if (!usedIndicesLookup[indexKey]) { + usedIndicesLookup[indexKey] = true; + preparedAnimations.push(animations[index]); + } + return; + } + + var fromAnimation = animations[from.animationID]; + var toAnimation = animations[to.animationID]; + var lookupKey = from.animationID.toString(); + if (!anchorGroups[lookupKey]) { + var group = anchorGroups[lookupKey] = { + structural: true, + beforeStart: function() { + fromAnimation.beforeStart(); + toAnimation.beforeStart(); + }, + close: function() { + fromAnimation.close(); + toAnimation.close(); + }, + classes: cssClassesIntersection(fromAnimation.classes, toAnimation.classes), + from: fromAnimation, + to: toAnimation, + anchors: [] // TODO(matsko): change to reference nodes + }; + + // the anchor animations require that the from and to elements both have at least + // one shared CSS class which effictively marries the two elements together to use + // the same animation driver and to properly sequence the anchor animation. + if (group.classes.length) { + preparedAnimations.push(group); + } else { + preparedAnimations.push(fromAnimation); + preparedAnimations.push(toAnimation); + } + } + + anchorGroups[lookupKey].anchors.push({ + 'out': from.element, 'in': to.element + }); + }); + + return preparedAnimations; + } + + function cssClassesIntersection(a,b) { + a = a.split(' '); + b = b.split(' '); + var matches = []; + + for (var i = 0; i < a.length; i++) { + var aa = a[i]; + if (aa.substring(0,3) === 'ng-') continue; + + for (var j = 0; j < b.length; j++) { + if (aa === b[j]) { + matches.push(aa); + break; + } + } + } + + return matches.join(' '); + } + + function invokeFirstDriver(animationDetails) { + // we loop in reverse order since the more general drivers (like CSS and JS) + // may attempt more elements, but custom drivers are more particular + for (var i = drivers.length - 1; i >= 0; i--) { + var driverName = drivers[i]; + if (!$injector.has(driverName)) continue; // TODO(matsko): remove this check + + var factory = $injector.get(driverName); + var driver = factory(animationDetails); + if (driver) { + return driver; + } + } + } + + function beforeStart() { + element.addClass(NG_ANIMATE_CLASSNAME); + if (tempClasses) { + $$jqLite.addClass(element, tempClasses); + } + } + + function updateAnimationRunners(animation, newRunner) { + if (animation.from && animation.to) { + update(animation.from.element); + update(animation.to.element); + } else { + update(animation.element); + } + + function update(element) { + getRunner(element).setHost(newRunner); + } + } + + function handleDestroyedElement() { + var runner = getRunner(element); + if (runner && (event !== 'leave' || !options.$$domOperationFired)) { + runner.end(); + } + } + + function close(rejected) { // jshint ignore:line + element.off('$destroy', handleDestroyedElement); + removeRunner(element); + + applyAnimationClasses(element, options); + applyAnimationStyles(element, options); + options.domOperation(); + + if (tempClasses) { + $$jqLite.removeClass(element, tempClasses); + } + + element.removeClass(NG_ANIMATE_CLASSNAME); + runner.complete(!rejected); + } + }; + }]; +}]; + +/* global angularAnimateModule: true, + + $$rAFMutexFactory, + $$rAFSchedulerFactory, + $$AnimateChildrenDirective, + $$AnimateRunnerFactory, + $$AnimateQueueProvider, + $$AnimationProvider, + $AnimateCssProvider, + $$AnimateCssDriverProvider, + $$AnimateJsProvider, + $$AnimateJsDriverProvider, +*/ + +/** + * @ngdoc module + * @name ngAnimate + * @description + * + * The `ngAnimate` module provides support for CSS-based animations (keyframes and transitions) as well as JavaScript-based animations via + * callback hooks. Animations are not enabled by default, however, by including `ngAnimate` then the animation hooks are enabled for an Angular app. + * + *
+ * + * # Usage + * Simply put, there are two ways to make use of animations when ngAnimate is used: by using **CSS** and **JavaScript**. The former works purely based + * using CSS (by using matching CSS selectors/styles) and the latter triggers animations that are registered via `module.animation()`. For + * both CSS and JS animations the sole requirement is to have a matching `CSS class` that exists both in the registered animation and within + * the HTML element that the animation will be triggered on. + * + * ## Directive Support + * The following directives are "animation aware": + * + * | Directive | Supported Animations | + * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| + * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move | + * | {@link ngRoute.directive:ngView#animations ngView} | enter and leave | + * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave | + * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave | + * | {@link ng.directive:ngIf#animations ngIf} | enter and leave | + * | {@link ng.directive:ngClass#animations ngClass} | add and remove (the CSS class(es) present) | + * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide} | add and remove (the ng-hide class value) | + * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | + * | {@link module:ngMessages#animations ngMessages} | add and remove (ng-active & ng-inactive) | + * | {@link module:ngMessages#animations ngMessage} | enter and leave | + * + * (More information can be found by visiting each the documentation associated with each directive.) + * + * ## CSS-based Animations + * + * CSS-based animations with ngAnimate are unique since they require no JavaScript code at all. By using a CSS class that we reference between our HTML + * and CSS code we can create an animation that will be picked up by Angular when an the underlying directive performs an operation. + * + * The example below shows how an `enter` animation can be made possible on a element using `ng-if`: + * + * ```html + *
+ * Fade me in out + *
+ * + * + * ``` + * + * Notice the CSS class **fade**? We can now create the CSS transition code that references this class: + * + * ```css + * /* The starting CSS styles for the enter animation */ + * .fade.ng-enter { + * transition:0.5s linear all; + * opacity:0; + * } + * + * /* The finishing CSS styles for the enter animation */ + * .fade.ng-enter.ng-enter-active { + * opacity:1; + * } + * ``` + * + * The key thing to remember here is that, depending on the animation event (which each of the directives above trigger depending on what's going on) two + * generated CSS classes will be applied to the element; in the example above we have `.ng-enter` and `.ng-enter-active`. For CSS transitions, the transition + * code **must** be defined within the starting CSS class (in this case `.ng-enter`). The destination class is what the transition will animate towards. + * + * If for example we wanted to create animations for `leave` and `move` (ngRepeat triggers move) then we can do so using the same CSS naming conventions: + * + * ```css + * /* now the element will fade out before it is removed from the DOM */ + * .fade.ng-leave { + * transition:0.5s linear all; + * opacity:1; + * } + * .fade.ng-leave.ng-leave-active { + * opacity:0; + * } + * ``` + * + * We can also make use of **CSS Keyframes** by referencing the keyframe animation within the starting CSS class: + * + * ```css + * /* there is no need to define anything inside of the destination + * CSS class since the keyframe will take charge of the animation */ + * .fade.ng-leave { + * animation: my_fade_animation 0.5s linear; + * -webkit-animation: my_fade_animation 0.5s linear; + * } + * + * @keyframes my_fade_animation { + * from { opacity:1; } + * to { opacity:0; } + * } + * + * @-webkit-keyframes my_fade_animation { + * from { opacity:1; } + * to { opacity:0; } + * } + * ``` + * + * Feel free also mix transitions and keyframes together as well as any other CSS classes on the same element. + * + * ### CSS Class-based Animations + * + * Class-based animations (animations that are triggered via `ngClass`, `ngShow`, `ngHide` and some other directives) have a slightly different + * naming convention. Class-based animations are basic enough that a standard transition or keyframe can be referenced on the class being added + * and removed. + * + * For example if we wanted to do a CSS animation for `ngHide` then we place an animation on the `.ng-hide` CSS class: + * + * ```html + *
+ * Show and hide me + *
+ * + * + * + * ``` + * + * All that is going on here with ngShow/ngHide behind the scenes is the `.ng-hide` class is added/removed (when the hidden state is valid). Since + * ngShow and ngHide are animation aware then we can match up a transition and ngAnimate handles the rest. + * + * In addition the addition and removal of the CSS class, ngAnimate also provides two helper methods that we can use to further decorate the animation + * with CSS styles. + * + * ```html + *
+ * Highlight this box + *
+ * + * + * + * ``` + * + * We can also make use of CSS keyframes by placing them within the CSS classes. + * + * + * ### CSS Staggering Animations + * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a + * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be + * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for + * the animation. The style property expected within the stagger class can either be a **transition-delay** or an + * **animation-delay** property (or both if your animation contains both transitions and keyframe animations). + * + * ```css + * .my-animation.ng-enter { + * /* standard transition code */ + * transition: 1s linear all; + * opacity:0; + * } + * .my-animation.ng-enter-stagger { + * /* this will have a 100ms delay between each successive leave animation */ + * transition-delay: 0.1s; + * + * /* in case the stagger doesn't work then the duration value + * must be set to 0 to avoid an accidental CSS inheritance */ + * transition-duration: 0s; + * } + * .my-animation.ng-enter.ng-enter-active { + * /* standard transition styles */ + * opacity:1; + * } + * ``` + * + * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations + * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this + * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation + * will also be reset if one or more animation frames have passed since the multiple calls to `$animate` were fired. + * + * The following code will issue the **ng-leave-stagger** event on the element provided: + * + * ```js + * var kids = parent.children(); + * + * $animate.leave(kids[0]); //stagger index=0 + * $animate.leave(kids[1]); //stagger index=1 + * $animate.leave(kids[2]); //stagger index=2 + * $animate.leave(kids[3]); //stagger index=3 + * $animate.leave(kids[4]); //stagger index=4 + * + * window.requestAnimationFrame(function() { + * //stagger has reset itself + * $animate.leave(kids[5]); //stagger index=0 + * $animate.leave(kids[6]); //stagger index=1 + * + * $scope.$digest(); + * }); + * ``` + * + * Stagger animations are currently only supported within CSS-defined animations. + * + * ### The `ng-animate` CSS class + * + * When ngAnimate is animating an element it will apply the `ng-animate` CSS class to the element for the duration of the animation. + * This is a temporary CSS class and it will be removed once the animation is over (for both JavaScript and CSS-based animations). + * + * Therefore, animations can be applied to an element using this temporary class directly via CSS. + * + * ```css + * .zipper.ng-animate { + * transition:0.5s linear all; + * } + * .zipper.ng-enter { + * opacity:0; + * } + * .zipper.ng-enter.ng-enter-active { + * opacity:1; + * } + * .zipper.ng-leave { + * opacity:1; + * } + * .zipper.ng-leave.ng-leave-active { + * opacity:0; + * } + * ``` + * + * (Note that the `ng-animate` CSS class is reserved and it cannot be applied on an element directly since ngAnimate will always remove + * the CSS class once an animation has completed.) + * + * + * ## JavaScript-based Animations + * + * ngAnimate also allows for animations to be consumed by JavaScript code. The approach is similar to CSS-based animations (where there is a shared + * CSS class that is referenced in our HTML code) but in addition we need to register the JavaScript animation on the module. By making use of the + * `module.animation()` module function we can register the ainmation. + * + * Let's see an example of a enter/leave animation using `ngRepeat`: + * + * ```html + *
+ * {{ item }} + *
+ * ``` + * + * See the **slide** CSS class? Let's use that class to define an animation that we'll structure in our module code by using `module.animation`: + * + * ```js + * myModule.animation('.slide', [function() { + * return { + * // make note that other events (like addClass/removeClass) + * // have different function input parameters + * enter: function(element, doneFn) { + * jQuery(element).fadeIn(1000, doneFn); + * + * // remember to call doneFn so that angular + * // knows that the animation has concluded + * }, + * + * move: function(element, doneFn) { + * jQuery(element).fadeIn(1000, doneFn); + * }, + * + * leave: function(element, doneFn) { + * jQuery(element).fadeOut(1000, doneFn); + * } + * } + * }] + * ``` + * + * The nice thing about JS-based animations is that we can inject other services and make use of advanced animation libraries such as + * greensock.js and velocity.js. + * + * If our animation code class-based (meaning that something like `ngClass`, `ngHide` and `ngShow` triggers it) then we can still define + * our animations inside of the same registered animation, however, the function input arguments are a bit different: + * + * ```html + *
+ * this box is moody + *
+ * + * + * + * ``` + * + * ```js + * myModule.animation('.colorful', [function() { + * return { + * addClass: function(element, className, doneFn) { + * // do some cool animation and call the doneFn + * }, + * removeClass: function(element, className, doneFn) { + * // do some cool animation and call the doneFn + * }, + * setClass: function(element, addedClass, removedClass, doneFn) { + * // do some cool animation and call the doneFn + * } + * } + * }] + * ``` + * + * ## CSS + JS Animations Together + * + * AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of Angular, + * defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking + * charge of the animation**: + * + * ```html + *
+ * Slide in and out + *
+ * ``` + * + * ```js + * myModule.animation('.slide', [function() { + * return { + * enter: function(element, doneFn) { + * jQuery(element).slideIn(1000, doneFn); + * } + * } + * }] + * ``` + * + * ```css + * .slide.ng-enter { + * transition:0.5s linear all; + * transform:translateY(-100px); + * } + * .slide.ng-enter.ng-enter-active { + * transform:translateY(0); + * } + * ``` + * + * Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the + * lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from + * our own JS-based animation code: + * + * ```js + * myModule.animation('.slide', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { +* // this will trigger `.slide.ng-enter` and `.slide.ng-enter-active`. + * var runner = $animateCss(element, { + * event: 'enter', + * structural: true + * }).start(); +* runner.done(doneFn); + * } + * } + * }] + * ``` + * + * The nice thing here is that we can save bandwidth by sticking to our CSS-based animation code and we don't need to rely on a 3rd-party animation framework. + * + * The `$animateCss` service is very powerful since we can feed in all kinds of extra properties that will be evaluated and fed into a CSS transition or + * keyframe animation. For example if we wanted to animate the height of an element while adding and removing classes then we can do so by providing that + * data into `$animateCss` directly: + * + * ```js + * myModule.animation('.slide', ['$animateCss', function($animateCss) { + * return { + * enter: function(element, doneFn) { + * var runner = $animateCss(element, { + * event: 'enter', + * addClass: 'maroon-setting', + * from: { height:0 }, + * to: { height: 200 } + * }).start(); + * + * runner.done(doneFn); + * } + * } + * }] + * ``` + * + * Now we can fill in the rest via our transition CSS code: + * + * ```css + * /* the transition tells ngAnimate to make the animation happen */ + * .slide.ng-enter { transition:0.5s linear all; } + * + * /* this extra CSS class will be absorbed into the transition + * since the $animateCss code is adding the class */ + * .maroon-setting { background:red; } + * ``` + * + * And `$animateCss` will figure out the rest. Just make sure to have the `done()` callback fire the `doneFn` function to signal when the animation is over. + * + * To learn more about what's possible be sure to visit the {@link ngAnimate.$animateCss $animateCss service}. + * + * ## Animation Anchoring (via `ng-animate-ref`) + * + * ngAnimate in AngularJS 1.4 comes packed with the ability to cross-animate elements between + * structural areas of an application (like views) by pairing up elements using an attribute + * called `ng-animate-ref`. + * + * Let's say for example we have two views that are managed by `ng-view` and we want to show + * that there is a relationship between two components situated in within these views. By using the + * `ng-animate-ref` attribute we can identify that the two components are paired together and we + * can then attach an animation, which is triggered when the view changes. + * + * Say for example we have the following template code: + * + * ```html + * + *
+ *
+ * + * + *
+ * + * + * + * + * + * ``` + * + * Now, when the view changes (once the link is clicked), ngAnimate will examine the + * HTML contents to see if there is a match reference between any components in the view + * that is leaving and the view that is entering. It will scan both the view which is being + * removed (leave) and inserted (enter) to see if there are any paired DOM elements that + * contain a matching ref value. + * + * The two images match since they share the same ref value. ngAnimate will now create a + * transport element (which is a clone of the first image element) and it will then attempt + * to animate to the position of the second image element in the next view. For the animation to + * work a special CSS class called `ng-anchor` will be added to the transported element. + * + * We can now attach a transition onto the `.banner.ng-anchor` CSS class and then + * ngAnimate will handle the entire transition for us as well as the addition and removal of + * any changes of CSS classes between the elements: + * + * ```css + * .banner.ng-anchor { + * /* this animation will last for 1 second since there are + * two phases to the animation (an `in` and an `out` phase) */ + * transition:0.5s linear all; + * } + * ``` + * + * We also **must** include animations for the views that are being entered and removed + * (otherwise anchoring wouldn't be possible since the new view would be inserted right away). + * + * ```css + * .view-animation.ng-enter, .view-animation.ng-leave { + * transition:0.5s linear all; + * position:fixed; + * left:0; + * top:0; + * width:100%; + * } + * .view-animation.ng-enter { + * transform:translateX(100%); + * } + * .view-animation.ng-leave, + * .view-animation.ng-enter.ng-enter-active { + * transform:translateX(0%); + * } + * .view-animation.ng-leave.ng-leave-active { + * transform:translateX(-100%); + * } + * ``` + * + * Now we can jump back to the anchor animation. When the animation happens, there are two stages that occur: + * an `out` and an `in` stage. The `out` stage happens first and that is when the element is animated away + * from its origin. Once that animation is over then the `in` stage occurs which animates the + * element to its destination. The reason why there are two animations is to give enough time + * for the enter animation on the new element to be ready. + * + * The example above sets up a transition for both the in and out phases, but we can also target the out or + * in phases directly via `ng-anchor-out` and `ng-anchor-in`. + * + * ```css + * .banner.ng-anchor-out { + * transition: 0.5s linear all; + * + * /* the scale will be applied during the out animation, + * but will be animated away when the in animation runs */ + * transform: scale(1.2); + * } + * + * .banner.ng-anchor-in { + * transition: 1s linear all; + * } + * ``` + * + * + * + * + * ### Anchoring Demo + * + + + Home +
+
+
+
+
+ + angular.module('anchoringExample', ['ngAnimate', 'ngRoute']) + .config(['$routeProvider', function($routeProvider) { + $routeProvider.when('/', { + templateUrl: 'home.html', + controller: 'HomeController as home' + }); + $routeProvider.when('/profile/:id', { + templateUrl: 'profile.html', + controller: 'ProfileController as profile' + }); + }]) + .run(['$rootScope', function($rootScope) { + $rootScope.records = [ + { id:1, title: "Miss Beulah Roob" }, + { id:2, title: "Trent Morissette" }, + { id:3, title: "Miss Ava Pouros" }, + { id:4, title: "Rod Pouros" }, + { id:5, title: "Abdul Rice" }, + { id:6, title: "Laurie Rutherford Sr." }, + { id:7, title: "Nakia McLaughlin" }, + { id:8, title: "Jordon Blanda DVM" }, + { id:9, title: "Rhoda Hand" }, + { id:10, title: "Alexandrea Sauer" } + ]; + }]) + .controller('HomeController', [function() { + //empty + }]) + .controller('ProfileController', ['$rootScope', '$routeParams', function($rootScope, $routeParams) { + var index = parseInt($routeParams.id, 10); + var record = $rootScope.records[index - 1]; + + this.title = record.title; + this.id = record.id; + }]); + + +

Welcome to the home page

+

Please click on an element

+ + {{ record.title }} + +
+ +
+ {{ profile.title }} +
+
+ + .record { + display:block; + font-size:20px; + } + .profile { + background:black; + color:white; + font-size:100px; + } + .view-container { + position:relative; + } + .view-container > .view.ng-animate { + position:absolute; + top:0; + left:0; + width:100%; + min-height:500px; + } + .view.ng-enter, .view.ng-leave, + .record.ng-anchor { + transition:0.5s linear all; + } + .view.ng-enter { + transform:translateX(100%); + } + .view.ng-enter.ng-enter-active, .view.ng-leave { + transform:translateX(0%); + } + .view.ng-leave.ng-leave-active { + transform:translateX(-100%); + } + .record.ng-anchor-out { + background:red; + } + +
+ * + * ### How is the element transported? + * + * When an anchor animation occurs, ngAnimate will clone the starting element and position it exactly where the starting + * element is located on screen via absolute positioning. The cloned element will be placed inside of the root element + * of the application (where ng-app was defined) and all of the CSS classes of the starting element will be applied. The + * element will then animate into the `out` and `in` animations and will eventually reach the coordinates and match + * the dimensions of the destination element. During the entire animation a CSS class of `.ng-animate-shim` will be applied + * to both the starting and destination elements in order to hide them from being visible (the CSS styling for the class + * is: `visibility:hidden`). Once the anchor reaches its destination then it will be removed and the destination element + * will become visible since the shim class will be removed. + * + * ### How is the morphing handled? + * + * CSS Anchoring relies on transitions and keyframes and the internal code is intelligent enough to figure out + * what CSS classes differ between the starting element and the destination element. These different CSS classes + * will be added/removed on the anchor element and a transition will be applied (the transition that is provided + * in the anchor class). Long story short, ngAnimate will figure out what classes to add and remove which will + * make the transition of the element as smooth and automatic as possible. Be sure to use simple CSS classes that + * do not rely on DOM nesting structure so that the anchor element appears the same as the starting element (since + * the cloned element is placed inside of root element which is likely close to the body element). + * + * Note that if the root element is on the `` element then the cloned node will be placed inside of body. + * + * + * ## Using $animate in your directive code + * + * So far we've explored how to feed in animations into an Angular application, but how do we trigger animations within our own directives in our application? + * By injecting the `$animate` service into our directive code, we can trigger structural and class-based hooks which can then be consumed by animations. Let's + * imagine we have a greeting box that shows and hides itself when the data changes + * + * ```html + * Hi there + * ``` + * + * ```js + * ngModule.directive('greetingBox', ['$animate', function($animate) { + * return function(scope, element, attrs) { + * attrs.$observe('active', function(value) { + * value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on'); + * }); + * }); + * }]); + * ``` + * + * Now the `on` CSS class is added and removed on the greeting box component. Now if we add a CSS class on top of the greeting box element + * in our HTML code then we can trigger a CSS or JS animation to happen. + * + * ```css + * /* normally we would create a CSS class to reference on the element */ + * greeting-box.on { transition:0.5s linear all; background:green; color:white; } + * ``` + * + * The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's + * possible be sure to visit the {@link ng.$animate $animate service API page}. + * + * + * ### Preventing Collisions With Third Party Libraries + * + * Some third-party frameworks place animation duration defaults across many element or className + * selectors in order to make their code small and reuseable. This can lead to issues with ngAnimate, which + * is expecting actual animations on these elements and has to wait for their completion. + * + * You can prevent this unwanted behavior by using a prefix on all your animation classes: + * + * ```css + * /* prefixed with animate- */ + * .animate-fade-add.animate-fade-add-active { + * transition:1s linear all; + * opacity:0; + * } + * ``` + * + * You then configure `$animate` to enforce this prefix: + * + * ```js + * $animateProvider.classNameFilter(/animate-/); + * ``` + * + * This also may provide your application with a speed boost since only specific elements containing CSS class prefix + * will be evaluated for animation when any DOM changes occur in the application. + * + * ## Callbacks and Promises + * + * When `$animate` is called it returns a promise that can be used to capture when the animation has ended. Therefore if we were to trigger + * an animation (within our directive code) then we can continue performing directive and scope related activities after the animation has + * ended by chaining onto the returned promise that animation method returns. + * + * ```js + * // somewhere within the depths of the directive + * $animate.enter(element, parent).then(function() { + * //the animation has completed + * }); + * ``` + * + * (Note that earlier versions of Angular prior to v1.4 required the promise code to be wrapped using `$scope.$apply(...)`. This is not the case + * anymore.) + * + * In addition to the animation promise, we can also make use of animation-related callbacks within our directives and controller code by registering + * an event listener using the `$animate` service. Let's say for example that an animation was triggered on our view + * routing controller to hook into that: + * + * ```js + * ngModule.controller('HomePageController', ['$animate', function($animate) { + * $animate.on('enter', ngViewElement, function(element) { + * // the animation for this route has completed + * }]); + * }]) + * ``` + * + * (Note that you will need to trigger a digest within the callback to get angular to notice any scope-related changes.) + */ + +/** + * @ngdoc service + * @name $animate + * @kind object + * + * @description + * The ngAnimate `$animate` service documentation is the same for the core `$animate` service. + * + * Click here {@link ng.$animate $animate to learn more about animations with `$animate`}. + */ +angular.module('ngAnimate', []) + .directive('ngAnimateChildren', $$AnimateChildrenDirective) + + .factory('$$rAFMutex', $$rAFMutexFactory) + .factory('$$rAFScheduler', $$rAFSchedulerFactory) + + .factory('$$AnimateRunner', $$AnimateRunnerFactory) + + .provider('$$animateQueue', $$AnimateQueueProvider) + .provider('$$animation', $$AnimationProvider) + + .provider('$animateCss', $AnimateCssProvider) + .provider('$$animateCssDriver', $$AnimateCssDriverProvider) + + .provider('$$animateJs', $$AnimateJsProvider) + .provider('$$animateJsDriver', $$AnimateJsDriverProvider); + + +})(window, window.angular); diff --git a/src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.min.js b/src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.min.js new file mode 100644 index 0000000..a99eac1 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.min.js @@ -0,0 +1,52 @@ +/* + AngularJS v1.4.3 + (c) 2010-2015 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(F,t,W){'use strict';function ua(a,b,c){if(!a)throw ngMinErr("areq",b||"?",c||"required");return a}function va(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;X(a)&&(a=a.join(" "));X(b)&&(b=b.join(" "));return a+" "+b}function Ea(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function ba(a,b,c){var d="";a=X(a)?a:a&&U(a)&&a.length?a.split(/\s+/):[];u(a,function(a,s){a&&0=F&&b>=J&&(C=!0,m())}if(!K)if(g.parentNode){var x,p=[],k=function(a){if(C)D&&a&&(D=!1,m());else if(D=!a,y.animationDuration)if(a= +ma(g,D),D)l.push(a);else{var b=l,c=b.indexOf(a);0<=a&&b.splice(c,1)}},r=0", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/src/MCM.KidsIdApp/www/lib/angular-sanitize/.bower.json b/src/MCM.KidsIdApp/www/lib/angular-sanitize/.bower.json new file mode 100644 index 0000000..498bc27 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/.bower.json @@ -0,0 +1,19 @@ +{ + "name": "angular-sanitize", + "version": "1.4.3", + "main": "./angular-sanitize.js", + "ignore": [], + "dependencies": { + "angular": "1.4.3" + }, + "homepage": "https://github.com/angular/bower-angular-sanitize", + "_release": "1.4.3", + "_resolution": { + "type": "version", + "tag": "v1.4.3", + "commit": "0367ee4c3f9cb8af5d1da9ec35b71a8b523d9fc0" + }, + "_source": "git://github.com/angular/bower-angular-sanitize.git", + "_target": "1.4.3", + "_originalSource": "angular-sanitize" +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp/www/lib/angular-sanitize/README.md b/src/MCM.KidsIdApp/www/lib/angular-sanitize/README.md new file mode 100644 index 0000000..b84aaf6 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/README.md @@ -0,0 +1,68 @@ +# packaged angular-sanitize + +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/ngSanitize). +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-sanitize +``` + +Then add `ngSanitize` as a dependency for your app: + +```javascript +angular.module('myApp', [require('angular-sanitize')]); +``` + +### bower + +```shell +bower install angular-sanitize +``` + +Add a ` +``` + +Then add `ngSanitize` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngSanitize']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngSanitize). + +## 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/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.js b/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.js new file mode 100644 index 0000000..bebe1a7 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.js @@ -0,0 +1,683 @@ +/** + * @license AngularJS v1.4.3 + * (c) 2010-2015 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $sanitizeMinErr = angular.$$minErr('$sanitize'); + +/** + * @ngdoc module + * @name ngSanitize + * @description + * + * # ngSanitize + * + * The `ngSanitize` module provides functionality to sanitize HTML. + * + * + *
+ * + * See {@link ngSanitize.$sanitize `$sanitize`} for usage. + */ + +/* + * HTML Parser By Misko Hevery (misko@hevery.com) + * based on: HTML Parser By John Resig (ejohn.org) + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * + * // Use like so: + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + */ + + +/** + * @ngdoc service + * @name $sanitize + * @kind function + * + * @description + * The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are + * then serialized back to properly escaped html string. This means that no unsafe input can make + * it into the returned string, however, since our parser is more strict than a typical browser + * parser, it's possible that some obscure input, which would be recognized as valid HTML by a + * browser, won't make it through the sanitizer. The input may also contain SVG markup. + * The whitelist is configured using the functions `aHrefSanitizationWhitelist` and + * `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider `$compileProvider`}. + * + * @param {string} html HTML input. + * @returns {string} Sanitized HTML. + * + * @example + + + +
+ Snippet: + + + + + + + + + + + + + + + + + + + + + + + + + +
DirectiveHowSourceRendered
ng-bind-htmlAutomatically uses $sanitize
<div ng-bind-html="snippet">
</div>
ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value +
<div ng-bind-html="deliberatelyTrustDangerousSnippet()">
+</div>
+
ng-bindAutomatically escapes
<div ng-bind="snippet">
</div>
+
+
+ + it('should sanitize the html snippet by default', function() { + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('

an html\nclick here\nsnippet

'); + }); + + it('should inline raw snippet if bound to a trusted value', function() { + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()). + toBe("

an html\n" + + "click here\n" + + "snippet

"); + }); + + it('should escape snippet without any filter', function() { + expect(element(by.css('#bind-default div')).getInnerHtml()). + toBe("<p style=\"color:blue\">an html\n" + + "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + + "snippet</p>"); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new text'); + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('new text'); + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe( + 'new text'); + expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( + "new <b onclick=\"alert(1)\">text</b>"); + }); +
+
+ */ +function $SanitizeProvider() { + this.$get = ['$$sanitizeUri', function($$sanitizeUri) { + return function(html) { + var buf = []; + htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { + return !/^unsafe/.test($$sanitizeUri(uri, isImage)); + })); + return buf.join(''); + }; + }]; +} + +function sanitizeText(chars) { + var buf = []; + var writer = htmlSanitizeWriter(buf, angular.noop); + writer.chars(chars); + return buf.join(''); +} + + +// Regular Expressions for parsing tags and attributes +var START_TAG_REGEXP = + /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/, + END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/, + ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, + BEGIN_TAG_REGEXP = /^/g, + DOCTYPE_REGEXP = /]*?)>/i, + CDATA_REGEXP = //g, + SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, + // Match everything outside of normal chars and " (quote character) + NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; + + +// Good source of info about elements and attributes +// http://dev.w3.org/html5/spec/Overview.html#semantics +// http://simon.html5.org/html-elements + +// Safe Void Elements - HTML5 +// http://dev.w3.org/html5/spec/Overview.html#void-elements +var voidElements = makeMap("area,br,col,hr,img,wbr"); + +// Elements that you can, intentionally, leave open (and which close themselves) +// http://dev.w3.org/html5/spec/Overview.html#optional-tags +var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), + optionalEndTagInlineElements = makeMap("rp,rt"), + optionalEndTagElements = angular.extend({}, + optionalEndTagInlineElements, + optionalEndTagBlockElements); + +// Safe Block Elements - HTML5 +var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article," + + "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + + "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); + +// Inline Elements - HTML5 +var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b," + + "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + + "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); + +// SVG Elements +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements +// Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted. +// They can potentially allow for arbitrary javascript to be executed. See #11290 +var svgElements = makeMap("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph," + + "hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline," + + "radialGradient,rect,stop,svg,switch,text,title,tspan,use"); + +// Special Elements (can contain anything) +var specialElements = makeMap("script,style"); + +var validElements = angular.extend({}, + voidElements, + blockElements, + inlineElements, + optionalEndTagElements, + svgElements); + +//Attributes that have href and hence need to be sanitized +var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href"); + +var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + + 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + + 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' + + 'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' + + 'valign,value,vspace,width'); + +// SVG attributes (without "id" and "name" attributes) +// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes +var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' + + 'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' + + 'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' + + 'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' + + 'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' + + 'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' + + 'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' + + 'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' + + 'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' + + 'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' + + 'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' + + 'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' + + 'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' + + 'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' + + 'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true); + +var validAttrs = angular.extend({}, + uriAttrs, + svgAttrs, + htmlAttrs); + +function makeMap(str, lowercaseKeys) { + var obj = {}, items = str.split(','), i; + for (i = 0; i < items.length; i++) { + obj[lowercaseKeys ? angular.lowercase(items[i]) : items[i]] = true; + } + return obj; +} + + +/** + * @example + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * @param {string} html string + * @param {object} handler + */ +function htmlParser(html, handler) { + if (typeof html !== 'string') { + if (html === null || typeof html === 'undefined') { + html = ''; + } else { + html = '' + html; + } + } + var index, chars, match, stack = [], last = html, text; + stack.last = function() { return stack[stack.length - 1]; }; + + while (html) { + text = ''; + chars = true; + + // Make sure we're not in a script or style element + if (!stack.last() || !specialElements[stack.last()]) { + + // Comment + if (html.indexOf("", index) === index) { + if (handler.comment) handler.comment(html.substring(4, index)); + html = html.substring(index + 3); + chars = false; + } + // DOCTYPE + } else if (DOCTYPE_REGEXP.test(html)) { + match = html.match(DOCTYPE_REGEXP); + + if (match) { + html = html.replace(match[0], ''); + chars = false; + } + // end tag + } else if (BEGING_END_TAGE_REGEXP.test(html)) { + match = html.match(END_TAG_REGEXP); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(END_TAG_REGEXP, parseEndTag); + chars = false; + } + + // start tag + } else if (BEGIN_TAG_REGEXP.test(html)) { + match = html.match(START_TAG_REGEXP); + + if (match) { + // We only have a valid start-tag if there is a '>'. + if (match[4]) { + html = html.substring(match[0].length); + match[0].replace(START_TAG_REGEXP, parseStartTag); + } + chars = false; + } else { + // no ending tag found --- this piece should be encoded as an entity. + text += '<'; + html = html.substring(1); + } + } + + if (chars) { + index = html.indexOf("<"); + + text += index < 0 ? html : html.substring(0, index); + html = index < 0 ? "" : html.substring(index); + + if (handler.chars) handler.chars(decodeEntities(text)); + } + + } else { + // IE versions 9 and 10 do not understand the regex '[^]', so using a workaround with [\W\w]. + html = html.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), + function(all, text) { + text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); + + if (handler.chars) handler.chars(decodeEntities(text)); + + return ""; + }); + + parseEndTag("", stack.last()); + } + + if (html == last) { + throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + + "of html: {0}", html); + } + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = angular.lowercase(tagName); + if (blockElements[tagName]) { + while (stack.last() && inlineElements[stack.last()]) { + parseEndTag("", stack.last()); + } + } + + if (optionalEndTagElements[tagName] && stack.last() == tagName) { + parseEndTag("", tagName); + } + + unary = voidElements[tagName] || !!unary; + + if (!unary) { + stack.push(tagName); + } + + var attrs = {}; + + rest.replace(ATTR_REGEXP, + function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { + var value = doubleQuotedValue + || singleQuotedValue + || unquotedValue + || ''; + + attrs[name] = decodeEntities(value); + }); + if (handler.start) handler.start(tagName, attrs, unary); + } + + function parseEndTag(tag, tagName) { + var pos = 0, i; + tagName = angular.lowercase(tagName); + if (tagName) { + // Find the closest opened tag of the same type + for (pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos] == tagName) break; + } + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (i = stack.length - 1; i >= pos; i--) + if (handler.end) handler.end(stack[i]); + + // Remove the open elements from the stack + stack.length = pos; + } + } +} + +var hiddenPre=document.createElement("pre"); +/** + * decodes all entities into regular string + * @param value + * @returns {string} A string with decoded entities. + */ +function decodeEntities(value) { + if (!value) { return ''; } + + hiddenPre.innerHTML = value.replace(//g, '>'); +} + +/** + * create an HTML/XML writer which writes to buffer + * @param {Array} buf use buf.jain('') to get out sanitized html string + * @returns {object} in the form of { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * } + */ +function htmlSanitizeWriter(buf, uriValidator) { + var ignore = false; + var out = angular.bind(buf, buf.push); + return { + start: function(tag, attrs, unary) { + tag = angular.lowercase(tag); + if (!ignore && specialElements[tag]) { + ignore = tag; + } + if (!ignore && validElements[tag] === true) { + out('<'); + out(tag); + angular.forEach(attrs, function(value, key) { + var lkey=angular.lowercase(key); + var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); + if (validAttrs[lkey] === true && + (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { + out(' '); + out(key); + out('="'); + out(encodeEntities(value)); + out('"'); + } + }); + out(unary ? '/>' : '>'); + } + }, + end: function(tag) { + tag = angular.lowercase(tag); + if (!ignore && validElements[tag] === true) { + out(''); + } + if (tag == ignore) { + ignore = false; + } + }, + chars: function(chars) { + if (!ignore) { + out(encodeEntities(chars)); + } + } + }; +} + + +// define ngSanitize module and register $sanitize service +angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); + +/* global sanitizeText: false */ + +/** + * @ngdoc filter + * @name linky + * @kind function + * + * @description + * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and + * plain email address links. + * + * Requires the {@link ngSanitize `ngSanitize`} module to be installed. + * + * @param {string} text Input text. + * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. + * @returns {string} Html-linkified text. + * + * @usage + + * + * @example + + + +
+ Snippet: + + + + + + + + + + + + + + + + + + + + + +
FilterSourceRendered
linky filter +
<div ng-bind-html="snippet | linky">
</div>
+
+
+
linky target +
<div ng-bind-html="snippetWithTarget | linky:'_blank'">
</div>
+
+
+
no filter
<div ng-bind="snippet">
</div>
+ + + it('should linkify the snippet with urls', function() { + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); + }); + + it('should not linkify snippet without the linky filter', function() { + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new http://link.'); + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('new http://link.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(1); + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()) + .toBe('new http://link.'); + }); + + it('should work with the target property', function() { + expect(element(by.id('linky-target')). + element(by.binding("snippetWithTarget | linky:'_blank'")).getText()). + toBe('http://angularjs.org/'); + expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); + }); + + + */ +angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { + var LINKY_URL_REGEXP = + /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/i, + MAILTO_REGEXP = /^mailto:/i; + + return function(text, target) { + if (!text) return text; + var match; + var raw = text; + var html = []; + var url; + var i; + while ((match = raw.match(LINKY_URL_REGEXP))) { + // We can not end in these as they are sometimes found at the end of the sentence + url = match[0]; + // if we did not match ftp/http/www/mailto then assume mailto + if (!match[2] && !match[4]) { + url = (match[3] ? 'http://' : 'mailto:') + url; + } + i = match.index; + addText(raw.substr(0, i)); + addLink(url, match[0].replace(MAILTO_REGEXP, '')); + raw = raw.substring(i + match[0].length); + } + addText(raw); + return $sanitize(html.join('')); + + function addText(text) { + if (!text) { + return; + } + html.push(sanitizeText(text)); + } + + function addLink(url, text) { + html.push(''); + addText(text); + html.push(''); + } + }; +}]); + + +})(window, window.angular); diff --git a/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js b/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js new file mode 100644 index 0000000..e8c4226 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js @@ -0,0 +1,16 @@ +/* + AngularJS v1.4.3 + (c) 2010-2015 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(n,h,p){'use strict';function E(a){var f=[];r(f,h.noop).chars(a);return f.join("")}function g(a,f){var d={},c=a.split(","),b;for(b=0;b=c;d--)f.end&&f.end(e[d]);e.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l="";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");f.chars&&f.chars(q(b));return""}),c("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e", +b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML= +a.replace(//g,">")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g="img"===a&&"src"===k|| +"background"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(" "),c(e),c('="'),c(B(d)),c('"'))}),c(e?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^]*?)>/i, +I=/"\u201d\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a, +c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); +//# sourceMappingURL=angular-sanitize.min.js.map diff --git a/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js.map b/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js.map new file mode 100644 index 0000000..2f360f4 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/angular-sanitize.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"angular-sanitize.min.js", +"lineCount":15, +"mappings":"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", +"sources":["angular-sanitize.js"], +"names":["window","angular","undefined","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","makeMap","str","lowercaseKeys","obj","items","split","i","length","lowercase","htmlParser","html","handler","parseStartTag","tag","tagName","rest","unary","blockElements","stack","last","inlineElements","parseEndTag","optionalEndTagElements","voidElements","push","attrs","replace","ATTR_REGEXP","match","name","doubleQuotedValue","singleQuotedValue","unquotedValue","decodeEntities","start","pos","end","index","text","stack.last","specialElements","RegExp","all","COMMENT_REGEXP","CDATA_REGEXP","indexOf","lastIndexOf","comment","substring","DOCTYPE_REGEXP","test","BEGING_END_TAGE_REGEXP","END_TAG_REGEXP","BEGIN_TAG_REGEXP","START_TAG_REGEXP","$sanitizeMinErr","value","hiddenPre","innerHTML","textContent","encodeEntities","SURROGATE_PAIR_REGEXP","hi","charCodeAt","low","NON_ALPHANUMERIC_REGEXP","uriValidator","ignore","out","bind","validElements","forEach","key","lkey","isImage","validAttrs","uriAttrs","$$minErr","optionalEndTagBlockElements","optionalEndTagInlineElements","extend","svgElements","htmlAttrs","svgAttrs","document","createElement","module","provider","$SanitizeProvider","$get","$$sanitizeUri","uri","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","target","addText","addLink","url","isDefined","raw","substr"] +} diff --git a/src/MCM.KidsIdApp/www/lib/angular-sanitize/bower.json b/src/MCM.KidsIdApp/www/lib/angular-sanitize/bower.json new file mode 100644 index 0000000..ffa9554 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/bower.json @@ -0,0 +1,9 @@ +{ + "name": "angular-sanitize", + "version": "1.4.3", + "main": "./angular-sanitize.js", + "ignore": [], + "dependencies": { + "angular": "1.4.3" + } +} diff --git a/src/MCM.KidsIdApp/www/lib/angular-sanitize/index.js b/src/MCM.KidsIdApp/www/lib/angular-sanitize/index.js new file mode 100644 index 0000000..dd5d22e --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/index.js @@ -0,0 +1,2 @@ +require('./angular-sanitize'); +module.exports = 'ngSanitize'; diff --git a/src/MCM.KidsIdApp/www/lib/angular-sanitize/package.json b/src/MCM.KidsIdApp/www/lib/angular-sanitize/package.json new file mode 100644 index 0000000..d8ee360 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-sanitize/package.json @@ -0,0 +1,26 @@ +{ + "name": "angular-sanitize", + "version": "1.4.3", + "description": "AngularJS module for sanitizing HTML", + "main": "index.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", + "html", + "client-side" + ], + "author": "Angular Core Team ", + "license": "MIT", + "bugs": { + "url": "https://github.com/angular/angular.js/issues" + }, + "homepage": "http://angularjs.org" +} diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/.bower.json b/src/MCM.KidsIdApp/www/lib/angular-ui-router/.bower.json new file mode 100644 index 0000000..092d436 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/.bower.json @@ -0,0 +1,33 @@ +{ + "name": "angular-ui-router", + "version": "0.2.13", + "main": "./release/angular-ui-router.js", + "dependencies": { + "angular": ">= 1.0.8" + }, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "component.json", + "package.json", + "lib", + "config", + "sample", + "test", + "tests", + "ngdoc_assets", + "Gruntfile.js", + "files.js" + ], + "homepage": "https://github.com/angular-ui/ui-router", + "_release": "0.2.13", + "_resolution": { + "type": "version", + "tag": "0.2.13", + "commit": "c3d543aae43d4600512520a0d70723ac31f2cb62" + }, + "_source": "git://github.com/angular-ui/ui-router.git", + "_target": "0.2.13", + "_originalSource": "angular-ui-router" +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/CHANGELOG.md b/src/MCM.KidsIdApp/www/lib/angular-ui-router/CHANGELOG.md new file mode 100644 index 0000000..e0848c3 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/CHANGELOG.md @@ -0,0 +1,197 @@ + +### 0.2.13 (2014-11-20) + +This release primarily fixes issues reported against 0.2.12 + +#### Bug Fixes + +* **$state:** fix $state.includes/.is to apply param types before comparisions fix(uiSref): ma ([19715d15](https://github.com/angular-ui/ui-router/commit/19715d15e3cbfff724519e9febedd05b49c75baa), closes [#1513](https://github.com/angular-ui/ui-router/issues/1513)) + * Avoid re-synchronizing from url after .transitionTo ([b267ecd3](https://github.com/angular-ui/ui-router/commit/b267ecd348e5c415233573ef95ebdbd051875f52), closes [#1573](https://github.com/angular-ui/ui-router/issues/1573)) +* **$urlMatcherFactory:** + * Built-in date type uses local time zone ([d726bedc](https://github.com/angular-ui/ui-router/commit/d726bedcbb5f70a5660addf43fd52ec730790293)) + * make date type fn check .is before running ([aa94ce3b](https://github.com/angular-ui/ui-router/commit/aa94ce3b86632ad05301530a2213099da73a3dc0), closes [#1564](https://github.com/angular-ui/ui-router/issues/1564)) + * early binding of array handler bypasses type resolution ([ada4bc27](https://github.com/angular-ui/ui-router/commit/ada4bc27df5eff3ba3ab0de94a09bd91b0f7a28c)) + * add 'any' Type for non-encoding non-url params ([3bfd75ab](https://github.com/angular-ui/ui-router/commit/3bfd75ab445ee2f1dd55275465059ed116b10b27), closes [#1562](https://github.com/angular-ui/ui-router/issues/1562)) + * fix encoding slashes in params ([0c983a08](https://github.com/angular-ui/ui-router/commit/0c983a08e2947f999683571477debd73038e95cf), closes [#1119](https://github.com/angular-ui/ui-router/issues/1119)) + * fix mixed path/query params ordering problem ([a479fbd0](https://github.com/angular-ui/ui-router/commit/a479fbd0b8eb393a94320973e5b9a62d83912ee2), closes [#1543](https://github.com/angular-ui/ui-router/issues/1543)) +* **ArrayType:** + * specify empty array mapping corner case ([74aa6091](https://github.com/angular-ui/ui-router/commit/74aa60917e996b0b4e27bbb4eb88c3c03832021d), closes [#1511](https://github.com/angular-ui/ui-router/issues/1511)) + * fix .equals for array types ([5e6783b7](https://github.com/angular-ui/ui-router/commit/5e6783b77af9a90ddff154f990b43dbb17eeda6e), closes [#1538](https://github.com/angular-ui/ui-router/issues/1538)) +* **Param:** fix default value shorthand declaration ([831d812a](https://github.com/angular-ui/ui-router/commit/831d812a524524c71f0ee1c9afaf0487a5a66230), closes [#1554](https://github.com/angular-ui/ui-router/issues/1554)) +* **common:** fixed the _.filter clone to not create sparse arrays ([750f5cf5](https://github.com/angular-ui/ui-router/commit/750f5cf5fd91f9ada96f39e50d39aceb2caf22b6), closes [#1563](https://github.com/angular-ui/ui-router/issues/1563)) +* **ie8:** fix calls to indexOf and filter ([dcb31b84](https://github.com/angular-ui/ui-router/commit/dcb31b843391b3e61dee4de13f368c109541813e), closes [#1556](https://github.com/angular-ui/ui-router/issues/1556)) + + +#### Features + +* add json parameter Type ([027f1fcf](https://github.com/angular-ui/ui-router/commit/027f1fcf9c0916cea651e88981345da6f9ff214a)) + + + +### 0.2.12 (2014-11-13) + +#### Bug Fixes + +* **$resolve:** use resolve fn result, not parent resolved value of same name ([67f5e00c](https://github.com/angular-ui/ui-router/commit/67f5e00cc9aa006ce3fe6cde9dff261c28eab70a), closes [#1317], [#1353]) +* **$state:** + * populate default params in .transitionTo. ([3f60fbe6](https://github.com/angular-ui/ui-router/commit/3f60fbe6d65ebeca8d97952c05aa1d269f1b7ba1), closes [#1396]) + * reload() now reinvokes controllers ([73443420](https://github.com/angular-ui/ui-router/commit/7344342018847902594dc1fc62d30a5c30f01763), closes [#582]) + * do not emit $viewContentLoading if notify: false ([74255feb](https://github.com/angular-ui/ui-router/commit/74255febdf48ae082a02ca1e735165f2c369a463), closes [#1387](https://github.com/angular-ui/ui-router/issues/1387)) + * register states at config-time ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a)) + * handle parent.name when parent is obj ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a)) +* **$urlMatcherFactory:** + * register types at config ([4533fe36](https://github.com/angular-ui/ui-router/commit/4533fe36e0ab2f0143edd854a4145deaa013915a), closes [#1476]) + * made path params default value "" for backwards compat ([8f998e71](https://github.com/angular-ui/ui-router/commit/8f998e71e43a0b31293331c981f5db0f0097b8ba)) + * Pre-replace certain param values for better mapping ([6374a3e2](https://github.com/angular-ui/ui-router/commit/6374a3e29ab932014a7c77d2e1ab884cc841a2e3)) + * fixed ParamSet.$$keys() ordering ([9136fecb](https://github.com/angular-ui/ui-router/commit/9136fecbc2bfd4fda748a9914f0225a46c933860)) + * empty string policy now respected in Param.value() ([db12c85c](https://github.com/angular-ui/ui-router/commit/db12c85c16f2d105415f9bbbdeb11863f64728e0)) + * "string" type now encodes/decodes slashes ([3045e415](https://github.com/angular-ui/ui-router/commit/3045e41577a8b8b8afc6039f42adddf5f3c061ec), closes [#1119]) + * allow arrays in both path and query params ([fdd2f2c1](https://github.com/angular-ui/ui-router/commit/fdd2f2c191c4a67c874fdb9ec9a34f8dde9ad180), closes [#1073], [#1045], [#1486], [#1394]) + * typed params in search ([8d4cab69](https://github.com/angular-ui/ui-router/commit/8d4cab69dd67058e1a716892cc37b7d80a57037f), closes [#1488](https://github.com/angular-ui/ui-router/issues/1488)) + * no longer generate unroutable urls ([cb9fd9d8](https://github.com/angular-ui/ui-router/commit/cb9fd9d8943cb26c7223f6990db29c82ae8740f8), closes [#1487](https://github.com/angular-ui/ui-router/issues/1487)) + * handle optional parameter followed by required parameter in url format. ([efc72106](https://github.com/angular-ui/ui-router/commit/efc72106ddcc4774b48ea176a505ef9e95193b41)) + * default to parameter string coersion. ([13a468a7](https://github.com/angular-ui/ui-router/commit/13a468a7d54c2fb0751b94c0c1841d580b71e6dc), closes [#1414](https://github.com/angular-ui/ui-router/issues/1414)) + * concat respects strictMode/caseInsensitive ([dd72e103](https://github.com/angular-ui/ui-router/commit/dd72e103edb342d9cf802816fe127e1bbd68fd5f), closes [#1395]) +* **ui-sref:** + * Allow sref state options to take a scope object ([b5f7b596](https://github.com/angular-ui/ui-router/commit/b5f7b59692ce4933e2d63eb5df3f50a4ba68ccc0)) + * replace raw href modification with attrs. ([08c96782](https://github.com/angular-ui/ui-router/commit/08c96782faf881b0c7ab00afc233ee6729548fa0)) + * nagivate to state when url is "" fix($state.href): generate href for state with ([656b5aab](https://github.com/angular-ui/ui-router/commit/656b5aab906e5749db9b5a080c6a83b95f50fd91), closes [#1363](https://github.com/angular-ui/ui-router/issues/1363)) + * Check that state is defined in isMatch() ([92aebc75](https://github.com/angular-ui/ui-router/commit/92aebc7520f88babdc6e266536086e07263514c3), closes [#1314](https://github.com/angular-ui/ui-router/issues/1314), [#1332](https://github.com/angular-ui/ui-router/issues/1332)) +* **uiView:** + * allow inteprolated ui-view names ([81f6a19a](https://github.com/angular-ui/ui-router/commit/81f6a19a432dac9198fd33243855bfd3b4fea8c0), closes [#1324](https://github.com/angular-ui/ui-router/issues/1324)) + * Made anim work with angular 1.3 ([c3bb7ad9](https://github.com/angular-ui/ui-router/commit/c3bb7ad903da1e1f3c91019cfd255be8489ff4ef), closes [#1367](https://github.com/angular-ui/ui-router/issues/1367), [#1345](https://github.com/angular-ui/ui-router/issues/1345)) +* **urlRouter:** html5Mode accepts an object from angular v1.3.0-rc.3 ([7fea1e9d](https://github.com/angular-ui/ui-router/commit/7fea1e9d0d8c6e09cc6c895ecb93d4221e9adf48)) +* **stateFilters:** mark state filters as stateful. ([a00b353e](https://github.com/angular-ui/ui-router/commit/a00b353e3036f64a81245c4e7898646ba218f833), closes [#1479]) +* **ui-router:** re-add IE8 compatibility for map/filter/keys ([8ce69d9f](https://github.com/angular-ui/ui-router/commit/8ce69d9f7c886888ab53eca7e53536f36b428aae), closes [#1518], [#1383]) +* **package:** point 'main' to a valid filename ([ac903350](https://github.com/angular-ui/ui-router/commit/ac9033501debb63364539d91fbf3a0cba4579f8e)) +* **travis:** make CI build faster ([0531de05](https://github.com/angular-ui/ui-router/commit/0531de052e414a8d839fbb4e7635e923e94865b3)) + + +#### Features + +##### Default and Typed params + +This release includes a lot of bug fixes around default/optional and typed parameters. As such, 0.2.12 is the first release where we recommend those features be used. + +* **$state:** + * add state params validation ([b1379e6a](https://github.com/angular-ui/ui-router/commit/b1379e6a4d38f7ed7436e05873932d7c279af578), closes [#1433](https://github.com/angular-ui/ui-router/issues/1433)) + * is/includes/get work on relative stateOrName ([232e94b3](https://github.com/angular-ui/ui-router/commit/232e94b3c2ca2c764bb9510046e4b61690c87852)) + * .reload() returns state transition promise ([639e0565](https://github.com/angular-ui/ui-router/commit/639e0565dece9d5544cc93b3eee6e11c99bd7373)) +* **$templateFactory:** request templateURL as text/html ([ccd60769](https://github.com/angular-ui/ui-router/commit/ccd6076904a4b801d77b47f6e2de4c06ce9962f8), closes [#1287]) +* **$urlMatcherFactory:** Made a Params and ParamSet class ([0cc1e6cc](https://github.com/angular-ui/ui-router/commit/0cc1e6cc461a4640618e2bb594566551c54834e2)) + + + + +### 0.2.11 (2014-08-26) + + +#### Bug Fixes + +* **$resolve:** Resolves only inherit from immediate parent fixes #702 ([df34e20c](https://github.com/angular-ui/ui-router/commit/df34e20c576299e7a3c8bd4ebc68d42341c0ace9)) +* **$state:** + * change $state.href default options.inherit to true ([deea695f](https://github.com/angular-ui/ui-router/commit/deea695f5cacc55de351ab985144fd233c02a769)) + * sanity-check state lookups ([456fd5ae](https://github.com/angular-ui/ui-router/commit/456fd5aec9ea507518927bfabd62b4afad4cf714), closes [#980](https://github.com/angular-ui/ui-router/issues/980)) + * didn't comply to inherit parameter ([09836781](https://github.com/angular-ui/ui-router/commit/09836781f126c1c485b06551eb9cfd4fa0f45c35)) + * allow view content loading broadcast ([7b78edee](https://github.com/angular-ui/ui-router/commit/7b78edeeb52a74abf4d3f00f79534033d5a08d1a)) +* **$urlMatcherFactory:** + * detect injected functions ([91f75ae6](https://github.com/angular-ui/ui-router/commit/91f75ae66c4d129f6f69e53bd547594e9661f5d5)) + * syntax ([1ebed370](https://github.com/angular-ui/ui-router/commit/1ebed37069bae8614d41541d56521f5c45f703f3)) +* **UrlMatcher:** + * query param function defaults ([f9c20530](https://github.com/angular-ui/ui-router/commit/f9c205304f10d8a4ebe7efe9025e642016479a51)) + * don't decode default values ([63607bdb](https://github.com/angular-ui/ui-router/commit/63607bdbbcb432d3fb37856a1cb3da0cd496804e)) +* **travis:** update Node version to fix build ([d6b95ef2](https://github.com/angular-ui/ui-router/commit/d6b95ef23d9dacb4eba08897f5190a0bcddb3a48)) +* **uiSref:** + * Generate an href for states with a blank url. closes #1293 ([691745b1](https://github.com/angular-ui/ui-router/commit/691745b12fa05d3700dd28f0c8d25f8a105074ad)) + * should inherit params by default ([b973dad1](https://github.com/angular-ui/ui-router/commit/b973dad155ad09a7975e1476bd096f7b2c758eeb)) + * cancel transition if preventDefault() has been called ([2e6d9167](https://github.com/angular-ui/ui-router/commit/2e6d9167d3afbfbca6427e53e012f94fb5fb8022)) +* **uiView:** Fixed infinite loop when is called .go() from a controller. ([e13988b8](https://github.com/angular-ui/ui-router/commit/e13988b8cd6231d75c78876ee9d012cc87f4a8d9), closes [#1194](https://github.com/angular-ui/ui-router/issues/1194)) +* **docs:** + * Fixed link to milestones ([6c0ae500](https://github.com/angular-ui/ui-router/commit/6c0ae500cc238ea9fc95adcc15415c55fc9e1f33)) + * fix bug in decorator example ([4bd00af5](https://github.com/angular-ui/ui-router/commit/4bd00af50b8b88a49d1545a76290731cb8e0feb1)) + * Removed an incorrect semi-colon ([af97cef8](https://github.com/angular-ui/ui-router/commit/af97cef8b967f2e32177e539ef41450dca131a7d)) + * Explain return value of rule as function ([5e887890](https://github.com/angular-ui/ui-router/commit/5e8878900a6ffe59a81aed531a3925e34a297377)) + + +#### Features + +* **$state:** + * allow parameters to pass unharmed ([8939d057](https://github.com/angular-ui/ui-router/commit/8939d0572ab1316e458ef016317ecff53131a822)) + * **BREAKING CHANGE**: state parameters are no longer automatically coerced to strings, and unspecified parameter values are now set to undefined rather than null. + * allow prevent syncUrl on failure ([753060b9](https://github.com/angular-ui/ui-router/commit/753060b910d5d2da600a6fa0757976e401c33172)) +* **typescript:** Add typescript definitions for component builds ([521ceb3f](https://github.com/angular-ui/ui-router/commit/521ceb3fd7850646422f411921e21ce5e7d82e0f)) +* **uiSref:** extend syntax for ui-sref ([71cad3d6](https://github.com/angular-ui/ui-router/commit/71cad3d636508b5a9fe004775ad1f1adc0c80c3e)) +* **uiSrefActive:** + * Also activate for child states. ([bf163ad6](https://github.com/angular-ui/ui-router/commit/bf163ad6ce176ce28792696c8302d7cdf5c05a01), closes [#818](https://github.com/angular-ui/ui-router/issues/818)) + * **BREAKING CHANGE** Since ui-sref-active now activates even when child states are active you may need to swap out your ui-sref-active with ui-sref-active-eq, thought typically we think devs want the auto inheritance. + + * uiSrefActiveEq: new directive with old ui-sref-active behavior +* **$urlRouter:** + * defer URL change interception ([c72d8ce1](https://github.com/angular-ui/ui-router/commit/c72d8ce11916d0ac22c81b409c9e61d7048554d7)) + * force URLs to have valid params ([d48505cd](https://github.com/angular-ui/ui-router/commit/d48505cd328d83e39d5706e085ba319715f999a6)) + * abstract $location handling ([08b4636b](https://github.com/angular-ui/ui-router/commit/08b4636b294611f08db35f00641eb5211686fb50)) +* **$urlMatcherFactory:** + * fail on bad parameters ([d8f124c1](https://github.com/angular-ui/ui-router/commit/d8f124c10d00c7e5dde88c602d966db261aea221)) + * date type support ([b7f074ff](https://github.com/angular-ui/ui-router/commit/b7f074ff65ca150a3cdbda4d5ad6cb17107300eb)) + * implement type support ([450b1f0e](https://github.com/angular-ui/ui-router/commit/450b1f0e8e03c738174ff967f688b9a6373290f4)) +* **UrlMatcher:** + * handle query string arrays ([9cf764ef](https://github.com/angular-ui/ui-router/commit/9cf764efab45fa9309368688d535ddf6e96d6449), closes [#373](https://github.com/angular-ui/ui-router/issues/373)) + * injectable functions as defaults ([00966ecd](https://github.com/angular-ui/ui-router/commit/00966ecd91fb745846039160cab707bfca8b3bec)) + * default values & type decoding for query params ([a472b301](https://github.com/angular-ui/ui-router/commit/a472b301389fbe84d1c1fa9f24852b492a569d11)) + * allow shorthand definitions ([5b724304](https://github.com/angular-ui/ui-router/commit/5b7243049793505e44b6608ea09878c37c95b1f5)) + * validates whole interface ([32b27db1](https://github.com/angular-ui/ui-router/commit/32b27db173722e9194ef1d5c0ea7d93f25a98d11)) + * implement non-strict matching ([a3e21366](https://github.com/angular-ui/ui-router/commit/a3e21366bee0475c9795a1ec76f70eec41c5b4e3)) + * add per-param config support ([07b3029f](https://github.com/angular-ui/ui-router/commit/07b3029f4d409cf955780113df92e36401b47580)) + * **BREAKING CHANGE**: the `params` option in state configurations must now be an object keyed by parameter name. + +### 0.2.10 (2014-03-12) + + +#### Bug Fixes + +* **$state:** use $browser.baseHref() when generating urls with .href() ([cbcc8488](https://github.com/angular-ui/ui-router/commit/cbcc84887d6b6d35258adabb97c714cd9c1e272d)) +* **bower.json:** JS files should not be ignored ([ccdab193](https://github.com/angular-ui/ui-router/commit/ccdab193315f304eb3be5f5b97c47a926c79263e)) +* **dev:** karma:background task is missing, can't run grunt:dev. ([d9f7b898](https://github.com/angular-ui/ui-router/commit/d9f7b898e8e3abb8c846b0faa16a382913d7b22b)) +* **sample:** Contacts menu button not staying active when navigating to detail states. Need t ([2fcb8443](https://github.com/angular-ui/ui-router/commit/2fcb84437cb43ade12682a92b764f13cac77dfe7)) +* **uiSref:** support mock-clicks/events with no data ([717d3ff7](https://github.com/angular-ui/ui-router/commit/717d3ff7d0ba72d239892dee562b401cdf90e418)) +* **uiView:** + * Do NOT autoscroll when autoscroll attr is missing ([affe5bd7](https://github.com/angular-ui/ui-router/commit/affe5bd785cdc3f02b7a9f64a52e3900386ec3a0), closes [#807](https://github.com/angular-ui/ui-router/issues/807)) + * Refactoring uiView directive to copy ngView logic ([548fab6a](https://github.com/angular-ui/ui-router/commit/548fab6ab9debc9904c5865c8bc68b4fc3271dd0), closes [#857](https://github.com/angular-ui/ui-router/issues/857), [#552](https://github.com/angular-ui/ui-router/issues/552)) + + +#### Features + +* **$state:** includes() allows glob patterns for state matching. ([2d5f6b37](https://github.com/angular-ui/ui-router/commit/2d5f6b37191a3135f4a6d9e8f344c54edcdc065b)) +* **UrlMatcher:** Add support for case insensitive url matching ([642d5247](https://github.com/angular-ui/ui-router/commit/642d524799f604811e680331002feec7199a1fb5)) +* **uiSref:** add support for transition options ([2ed7a728](https://github.com/angular-ui/ui-router/commit/2ed7a728cee6854b38501fbc1df6139d3de5b28a)) +* **uiView:** add controllerAs config with function ([1ee7334a](https://github.com/angular-ui/ui-router/commit/1ee7334a73efeccc9b95340e315cdfd59944762d)) + + +### 0.2.9 (2014-01-17) + + +This release is identical to 0.2.8. 0.2.8 was re-tagged in git to fix a problem with bower. + + +### 0.2.8 (2014-01-16) + + +#### Bug Fixes + +* **$state:** allow null to be passed as 'params' param ([094dc30e](https://github.com/angular-ui/ui-router/commit/094dc30e883e1bd14e50a475553bafeaade3b178)) +* **$state.go:** param inheritance shouldn't inherit from siblings ([aea872e0](https://github.com/angular-ui/ui-router/commit/aea872e0b983cb433436ce5875df10c838fccedb)) +* **bower.json:** fixes bower.json ([eed3cc4d](https://github.com/angular-ui/ui-router/commit/eed3cc4d4dfef1d3ef84b9fd063127538ebf59d3)) +* **uiSrefActive:** annotate controller injection ([85921422](https://github.com/angular-ui/ui-router/commit/85921422ff7fb0effed358136426d616cce3d583), closes [#671](https://github.com/angular-ui/ui-router/issues/671)) +* **uiView:** + * autoscroll tests pass on 1.2.4 & 1.1.5 ([86eacac0](https://github.com/angular-ui/ui-router/commit/86eacac09ca5e9000bd3b9c7ba6e2cc95d883a3a)) + * don't animate initial load ([83b6634d](https://github.com/angular-ui/ui-router/commit/83b6634d27942ca74766b2b1244a7fc52c5643d9)) + * test pass against 1.0.8 and 1.2.4 ([a402415a](https://github.com/angular-ui/ui-router/commit/a402415a2a28b360c43b9fe8f4f54c540f6c33de)) + * it should autoscroll when expr is missing. ([8bb9e27a](https://github.com/angular-ui/ui-router/commit/8bb9e27a2986725f45daf44c4c9f846385095aff)) + + +#### Features + +* **uiSref:** add target attribute behaviour ([c12bf9a5](https://github.com/angular-ui/ui-router/commit/c12bf9a520d30d70294e3d82de7661900f8e394e)) +* **uiView:** + * merge autoscroll expression test. ([b89e0f87](https://github.com/angular-ui/ui-router/commit/b89e0f871d5cc35c10925ede986c10684d5c9252)) + * cache and test autoscroll expression ([ee262282](https://github.com/angular-ui/ui-router/commit/ee2622828c2ce83807f006a459ac4e11406d9258)) diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/CONTRIBUTING.md b/src/MCM.KidsIdApp/www/lib/angular-ui-router/CONTRIBUTING.md new file mode 100644 index 0000000..63829a5 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/CONTRIBUTING.md @@ -0,0 +1,65 @@ + +# Report an Issue + +Help us make UI-Router better! If you think you might have found a bug, or some other weirdness, start by making sure +it hasn't already been reported. You can [search through existing issues](https://github.com/angular-ui/ui-router/search?q=wat%3F&type=Issues) +to see if someone's reported one similar to yours. + +If not, then [create a plunkr](http://bit.ly/UIR-Plunk) that demonstrates the problem (try to use as little code +as possible: the more minimalist, the faster we can debug it). + +Next, [create a new issue](https://github.com/angular-ui/ui-router/issues/new) that briefly explains the problem, +and provides a bit of background as to the circumstances that triggered it. Don't forget to include the link to +that plunkr you created! + +**Note**: If you're unsure how a feature is used, or are encountering some unexpected behavior that you aren't sure +is a bug, it's best to talk it out on +[StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) before reporting it. This +keeps development streamlined, and helps us focus on building great software. + + +Issues only! | +-------------| +Please keep in mind that the issue tracker is for *issues*. Please do *not* post an issue if you need help or support. Instead, see one of the above-mentioned forums or [IRC](irc://irc.freenode.net/#angularjs). | + +####Purple Labels +A purple label means that **you** need to take some further action. + - ![Not Actionable - Need Info](http://angular-ui.github.io/ui-router/images/notactionable.png): Your issue is not specific enough, or there is no clear action that we can take. Please clarify and refine your issue. + - ![Plunkr Please](http://angular-ui.github.io/ui-router/images/plunkrplease.png): Please [create a plunkr](http://bit.ly/UIR-Plunk) + - ![StackOverflow](http://angular-ui.github.io/ui-router/images/stackoverflow.png): We suspect your issue is really a help request, or could be answered by the community. Please ask your question on [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router). If you determine that is an actual issue, please explain why. + +If your issue gets labeled with purple label, no further action will be taken until you respond to the label appropriately. + +# Contribute + +**(1)** See the **[Developing](#developing)** section below, to get the development version of UI-Router up and running on your local machine. + +**(2)** Check out the [roadmap](https://github.com/angular-ui/ui-router/milestones) to see where the project is headed, and if your feature idea fits with where we're headed. + +**(3)** If you're not sure, [open an RFC](https://github.com/angular-ui/ui-router/issues/new?title=RFC:%20My%20idea) to get some feedback on your idea. + +**(4)** Finally, commit some code and open a pull request. Code & commits should abide by the following rules: + +- *Always* have test coverage for new features (or regression tests for bug fixes), and *never* break existing tests +- Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits down to one +- Make sure to follow the [Angular commit message format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) so your change will appear in the changelog of the next release. +- Changes should always respect the coding style of the project + + + +# Developing + +UI-Router uses grunt >= 0.4.x. Make sure to upgrade your environment and read the +[Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4). + +Dependencies for building from source and running tests: + +* [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli` +* Then, install the development dependencies by running `$ npm install` from the project directory + +There are a number of targets in the gruntfile that are used to generating different builds: + +* `grunt`: Perform a normal build, runs jshint and karma tests +* `grunt build`: Perform a normal build +* `grunt dist`: Perform a clean build and generate documentation +* `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes. diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/LICENSE b/src/MCM.KidsIdApp/www/lib/angular-ui-router/LICENSE new file mode 100644 index 0000000..939f8f8 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2014 The AngularUI Team, Karsten Sperling + +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/src/MCM.KidsIdApp/www/lib/angular-ui-router/README.md b/src/MCM.KidsIdApp/www/lib/angular-ui-router/README.md new file mode 100644 index 0000000..f02d83b --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/README.md @@ -0,0 +1,243 @@ +# AngularUI Router  [![Build Status](https://travis-ci.org/angular-ui/ui-router.svg?branch=master)](https://travis-ci.org/angular-ui/ui-router) + +#### The de-facto solution to flexible routing with nested views +--- +**[Download 0.2.11](http://angular-ui.github.io/ui-router/release/angular-ui-router.js)** (or **[Minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)**) **|** +**[Guide](https://github.com/angular-ui/ui-router/wiki) |** +**[API](http://angular-ui.github.io/ui-router/site) |** +**[Sample](http://angular-ui.github.com/ui-router/sample/) ([Src](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) |** +**[FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) |** +**[Resources](#resources) |** +**[Report an Issue](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#report-an-issue) |** +**[Contribute](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#contribute) |** +**[Help!](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) |** +**[Discuss](https://groups.google.com/forum/#!categories/angular-ui/router)** + +--- + +AngularUI Router is a routing framework for [AngularJS](http://angularjs.org), which allows you to organize the +parts of your interface into a [*state machine*](https://en.wikipedia.org/wiki/Finite-state_machine). Unlike the +[`$route` service](http://docs.angularjs.org/api/ngRoute.$route) in the Angular ngRoute module, which is organized around URL +routes, UI-Router is organized around [*states*](https://github.com/angular-ui/ui-router/wiki), +which may optionally have routes, as well as other behavior, attached. + +States are bound to *named*, *nested* and *parallel views*, allowing you to powerfully manage your application's interface. + +Check out the sample app: http://angular-ui.github.io/ui-router/sample/ + +- +**Note:** *UI-Router is under active development. As such, while this library is well-tested, the API may change. Consider using it in production applications only if you're comfortable following a changelog and updating your usage accordingly.* + + +## Get Started + +**(1)** Get UI-Router in one of the following ways: + - clone & [build](CONTRIBUTING.md#developing) this repository + - [download the release](http://angular-ui.github.io/ui-router/release/angular-ui-router.js) (or [minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)) + - via **[Bower](http://bower.io/)**: by running `$ bower install angular-ui-router` from your console + - or via **[npm](https://www.npmjs.org/)**: by running `$ npm install angular-ui-router` from your console + - or via **[Component](https://github.com/component/component)**: by running `$ component install angular-ui/ui-router` from your console + +**(2)** Include `angular-ui-router.js` (or `angular-ui-router.min.js`) in your `index.html`, after including Angular itself (For Component users: ignore this step) + +**(3)** Add `'ui.router'` to your main module's list of dependencies (For Component users: replace `'ui.router'` with `require('angular-ui-router')`) + +When you're done, your setup should look similar to the following: + +> +```html + + + + + + + ... + + + ... + + +``` + +### [Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview) + +The majority of UI-Router's power is in its ability to nest states & views. + +**(1)** First, follow the [setup](#get-started) instructions detailed above. + +**(2)** Then, add a [`ui-view` directive](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-view) to the `` of your app. + +> +```html + + +
+ + State 1 + State 2 + +``` + +**(3)** You'll notice we also added some links with [`ui-sref` directives](https://github.com/angular-ui/ui-router/wiki/Quick-Reference#ui-sref). In addition to managing state transitions, this directive auto-generates the `href` attribute of the `` element it's attached to, if the corresponding state has a URL. Next we'll add some templates. These will plug into the `ui-view` within `index.html`. Notice that they have their own `ui-view` as well! That is the key to nesting states and views. + +> +```html + +

State 1

+
+
Show List +
+``` +```html + +

State 2

+
+Show List +
+``` + +**(4)** Next, we'll add some child templates. *These* will get plugged into the `ui-view` of their parent state templates. + +> +```html + +

List of State 1 Items

+
    +
  • {{ item }}
  • +
+``` + +> +```html + +

List of State 2 Things

+
    +
  • {{ thing }}
  • +
+``` + +**(5)** Finally, we'll wire it all up with `$stateProvider`. Set up your states in the module config, as in the following: + + +> +```javascript +myApp.config(function($stateProvider, $urlRouterProvider) { + // + // For any unmatched url, redirect to /state1 + $urlRouterProvider.otherwise("/state1"); + // + // Now set up the states + $stateProvider + .state('state1', { + url: "/state1", + templateUrl: "partials/state1.html" + }) + .state('state1.list', { + url: "/list", + templateUrl: "partials/state1.list.html", + controller: function($scope) { + $scope.items = ["A", "List", "Of", "Items"]; + } + }) + .state('state2', { + url: "/state2", + templateUrl: "partials/state2.html" + }) + .state('state2.list', { + url: "/list", + templateUrl: "partials/state2.list.html", + controller: function($scope) { + $scope.things = ["A", "Set", "Of", "Things"]; + } + }); +}); +``` + +**(6)** See this quick start example in action. +>**[Go to Quick Start Plunker for Nested States & Views](http://plnkr.co/edit/u18KQc?p=preview)** + +**(7)** This only scratches the surface +>**[Dive Deeper!](https://github.com/angular-ui/ui-router/wiki)** + + +### [Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview) + +Another great feature is the ability to have multiple `ui-view`s view per template. + +**Pro Tip:** *While multiple parallel views are a powerful feature, you'll often be able to manage your +interfaces more effectively by nesting your views, and pairing those views with nested states.* + +**(1)** Follow the [setup](#get-started) instructions detailed above. + +**(2)** Add one or more `ui-view` to your app, give them names. +> +```html + + +
+
+ + Route 1 + Route 2 + +``` + +**(3)** Set up your states in the module config: +> +```javascript +myApp.config(function($stateProvider) { + $stateProvider + .state('index', { + url: "", + views: { + "viewA": { template: "index.viewA" }, + "viewB": { template: "index.viewB" } + } + }) + .state('route1', { + url: "/route1", + views: { + "viewA": { template: "route1.viewA" }, + "viewB": { template: "route1.viewB" } + } + }) + .state('route2', { + url: "/route2", + views: { + "viewA": { template: "route2.viewA" }, + "viewB": { template: "route2.viewB" } + } + }) +}); +``` + +**(4)** See this quick start example in action. +>**[Go to Quick Start Plunker for Multiple & Named Views](http://plnkr.co/edit/SDOcGS?p=preview)** + + +## Resources + +* [In-Depth Guide](https://github.com/angular-ui/ui-router/wiki) +* [API Reference](http://angular-ui.github.io/ui-router/site) +* [Sample App](http://angular-ui.github.com/ui-router/sample/) ([Source](https://github.com/angular-ui/ui-router/tree/gh-pages/sample)) +* [FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) +* [Slides comparing ngRoute to ui-router](http://slid.es/timkindberg/ui-router#/) +* [UI-Router Extras / Addons](http://christopherthielen.github.io/ui-router-extras/#/home) (@christopherthielen) + +### Videos + +* [Introduction Video](https://egghead.io/lessons/angularjs-introduction-ui-router) (egghead.io) +* [Tim Kindberg on Angular UI-Router](https://www.youtube.com/watch?v=lBqiZSemrqg) +* [Activating States](https://egghead.io/lessons/angularjs-ui-router-activating-states) (egghead.io) +* [Learn Angular.js using UI-Router](http://youtu.be/QETUuZ27N0w) (LearnCode.academy) + + + +## Reporting issues and Contributing + +Please read our [Contributor guidelines](CONTRIBUTING.md) before reporting an issue or creating a pull request. diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/api/angular-ui-router.d.ts b/src/MCM.KidsIdApp/www/lib/angular-ui-router/api/angular-ui-router.d.ts new file mode 100644 index 0000000..55c5d5e --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/api/angular-ui-router.d.ts @@ -0,0 +1,126 @@ +// Type definitions for Angular JS 1.1.5+ (ui.router module) +// Project: https://github.com/angular-ui/ui-router +// Definitions by: Michel Salib +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module ng.ui { + + interface IState { + name?: string; + template?: string; + templateUrl?: any; // string || () => string + templateProvider?: any; // () => string || IPromise + controller?: any; + controllerAs?: string; + controllerProvider?: any; + resolve?: {}; + url?: string; + params?: any; + views?: {}; + abstract?: boolean; + onEnter?: (...args: any[]) => void; + onExit?: (...args: any[]) => void; + data?: any; + reloadOnSearch?: boolean; + } + + interface ITypedState extends IState { + data?: T; + } + + interface IStateProvider extends IServiceProvider { + state(name: string, config: IState): IStateProvider; + state(config: IState): IStateProvider; + decorator(name?: string, decorator?: (state: IState, parent: Function) => any): any; + } + + interface IUrlMatcher { + concat(pattern: string): IUrlMatcher; + exec(path: string, searchParams: {}): {}; + parameters(): string[]; + format(values: {}): string; + } + + interface IUrlMatcherFactory { + compile(pattern: string): IUrlMatcher; + isMatcher(o: any): boolean; + } + + interface IUrlRouterProvider extends IServiceProvider { + when(whenPath: RegExp, handler: Function): IUrlRouterProvider; + when(whenPath: RegExp, handler: any[]): IUrlRouterProvider; + when(whenPath: RegExp, toPath: string): IUrlRouterProvider; + when(whenPath: IUrlMatcher, hanlder: Function): IUrlRouterProvider; + when(whenPath: IUrlMatcher, handler: any[]): IUrlRouterProvider; + when(whenPath: IUrlMatcher, toPath: string): IUrlRouterProvider; + when(whenPath: string, handler: Function): IUrlRouterProvider; + when(whenPath: string, handler: any[]): IUrlRouterProvider; + when(whenPath: string, toPath: string): IUrlRouterProvider; + otherwise(handler: Function): IUrlRouterProvider; + otherwise(handler: any[]): IUrlRouterProvider; + otherwise(path: string): IUrlRouterProvider; + rule(handler: Function): IUrlRouterProvider; + rule(handler: any[]): IUrlRouterProvider; + } + + interface IStateOptions { + location?: any; + inherit?: boolean; + relative?: IState; + notify?: boolean; + reload?: boolean; + } + + interface IHrefOptions { + lossy?: boolean; + inherit?: boolean; + relative?: IState; + absolute?: boolean; + } + + interface IStateService { + go(to: string, params?: {}, options?: IStateOptions): IPromise; + transitionTo(state: string, params?: {}, updateLocation?: boolean): void; + transitionTo(state: string, params?: {}, options?: IStateOptions): void; + includes(state: string, params?: {}): boolean; + is(state:string, params?: {}): boolean; + is(state: IState, params?: {}): boolean; + href(state: IState, params?: {}, options?: IHrefOptions): string; + href(state: string, params?: {}, options?: IHrefOptions): string; + get(state: string): IState; + get(): IState[]; + current: IState; + params: any; + reload(): void; + } + + interface IStateParamsService { + [key: string]: any; + } + + interface IStateParams { + [key: string]: any; + } + + interface IUrlRouterService { + /* + * Triggers an update; the same update that happens when the address bar + * url changes, aka $locationChangeSuccess. + * + * This method is useful when you need to use preventDefault() on the + * $locationChangeSuccess event, perform some custom logic (route protection, + * auth, config, redirection, etc) and then finally proceed with the transition + * by calling $urlRouter.sync(). + * + */ + sync(): void; + } + + interface IUiViewScrollProvider { + /* + * Reverts back to using the core $anchorScroll service for scrolling + * based on the url anchor. + */ + useAnchorScroll(): void; + } +} diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/bower.json b/src/MCM.KidsIdApp/www/lib/angular-ui-router/bower.json new file mode 100644 index 0000000..45e802a --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/bower.json @@ -0,0 +1,23 @@ +{ + "name": "angular-ui-router", + "version": "0.2.13", + "main": "./release/angular-ui-router.js", + "dependencies": { + "angular": ">= 1.0.8" + }, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "component.json", + "package.json", + "lib", + "config", + "sample", + "test", + "tests", + "ngdoc_assets", + "Gruntfile.js", + "files.js" + ] +} diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/common.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/common.js new file mode 100644 index 0000000..5f0500e --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/common.js @@ -0,0 +1,292 @@ +/*jshint globalstrict:true*/ +/*global angular:false*/ +'use strict'; + +var isDefined = angular.isDefined, + isFunction = angular.isFunction, + isString = angular.isString, + isObject = angular.isObject, + isArray = angular.isArray, + forEach = angular.forEach, + extend = angular.extend, + copy = angular.copy; + +function inherit(parent, extra) { + return extend(new (extend(function() {}, { prototype: parent }))(), extra); +} + +function merge(dst) { + forEach(arguments, function(obj) { + if (obj !== dst) { + forEach(obj, function(value, key) { + if (!dst.hasOwnProperty(key)) dst[key] = value; + }); + } + }); + return dst; +} + +/** + * Finds the common ancestor path between two states. + * + * @param {Object} first The first state. + * @param {Object} second The second state. + * @return {Array} Returns an array of state names in descending order, not including the root. + */ +function ancestors(first, second) { + var path = []; + + for (var n in first.path) { + if (first.path[n] !== second.path[n]) break; + path.push(first.path[n]); + } + return path; +} + +/** + * IE8-safe wrapper for `Object.keys()`. + * + * @param {Object} object A JavaScript object. + * @return {Array} Returns the keys of the object as an array. + */ +function objectKeys(object) { + if (Object.keys) { + return Object.keys(object); + } + var result = []; + + angular.forEach(object, function(val, key) { + result.push(key); + }); + return result; +} + +/** + * IE8-safe wrapper for `Array.prototype.indexOf()`. + * + * @param {Array} array A JavaScript array. + * @param {*} value A value to search the array for. + * @return {Number} Returns the array index value of `value`, or `-1` if not present. + */ +function indexOf(array, value) { + if (Array.prototype.indexOf) { + return array.indexOf(value, Number(arguments[2]) || 0); + } + var len = array.length >>> 0, from = Number(arguments[2]) || 0; + from = (from < 0) ? Math.ceil(from) : Math.floor(from); + + if (from < 0) from += len; + + for (; from < len; from++) { + if (from in array && array[from] === value) return from; + } + return -1; +} + +/** + * Merges a set of parameters with all parameters inherited between the common parents of the + * current state and a given destination state. + * + * @param {Object} currentParams The value of the current state parameters ($stateParams). + * @param {Object} newParams The set of parameters which will be composited with inherited params. + * @param {Object} $current Internal definition of object representing the current state. + * @param {Object} $to Internal definition of object representing state to transition to. + */ +function inheritParams(currentParams, newParams, $current, $to) { + var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = []; + + for (var i in parents) { + if (!parents[i].params) continue; + parentParams = objectKeys(parents[i].params); + if (!parentParams.length) continue; + + for (var j in parentParams) { + if (indexOf(inheritList, parentParams[j]) >= 0) continue; + inheritList.push(parentParams[j]); + inherited[parentParams[j]] = currentParams[parentParams[j]]; + } + } + return extend({}, inherited, newParams); +} + +/** + * Performs a non-strict comparison of the subset of two objects, defined by a list of keys. + * + * @param {Object} a The first object. + * @param {Object} b The second object. + * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified, + * it defaults to the list of keys in `a`. + * @return {Boolean} Returns `true` if the keys match, otherwise `false`. + */ +function equalForKeys(a, b, keys) { + if (!keys) { + keys = []; + for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility + } + + for (var i=0; i + * + * + * + * + * + * + * + * + * + * + * + * + */ +angular.module('ui.router', ['ui.router.state']); + +angular.module('ui.router.compat', ['ui.router']); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/resolve.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/resolve.js new file mode 100644 index 0000000..f1c1790 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/resolve.js @@ -0,0 +1,252 @@ +/** + * @ngdoc object + * @name ui.router.util.$resolve + * + * @requires $q + * @requires $injector + * + * @description + * Manages resolution of (acyclic) graphs of promises. + */ +$Resolve.$inject = ['$q', '$injector']; +function $Resolve( $q, $injector) { + + var VISIT_IN_PROGRESS = 1, + VISIT_DONE = 2, + NOTHING = {}, + NO_DEPENDENCIES = [], + NO_LOCALS = NOTHING, + NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING }); + + + /** + * @ngdoc function + * @name ui.router.util.$resolve#study + * @methodOf ui.router.util.$resolve + * + * @description + * Studies a set of invocables that are likely to be used multiple times. + *
+   * $resolve.study(invocables)(locals, parent, self)
+   * 
+ * is equivalent to + *
+   * $resolve.resolve(invocables, locals, parent, self)
+   * 
+ * but the former is more efficient (in fact `resolve` just calls `study` + * internally). + * + * @param {object} invocables Invocable objects + * @return {function} a function to pass in locals, parent and self + */ + this.study = function (invocables) { + if (!isObject(invocables)) throw new Error("'invocables' must be an object"); + var invocableKeys = objectKeys(invocables || {}); + + // Perform a topological sort of invocables to build an ordered plan + var plan = [], cycle = [], visited = {}; + function visit(value, key) { + if (visited[key] === VISIT_DONE) return; + + cycle.push(key); + if (visited[key] === VISIT_IN_PROGRESS) { + cycle.splice(0, indexOf(cycle, key)); + throw new Error("Cyclic dependency: " + cycle.join(" -> ")); + } + visited[key] = VISIT_IN_PROGRESS; + + if (isString(value)) { + plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES); + } else { + var params = $injector.annotate(value); + forEach(params, function (param) { + if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param); + }); + plan.push(key, value, params); + } + + cycle.pop(); + visited[key] = VISIT_DONE; + } + forEach(invocables, visit); + invocables = cycle = visited = null; // plan is all that's required + + function isResolve(value) { + return isObject(value) && value.then && value.$$promises; + } + + return function (locals, parent, self) { + if (isResolve(locals) && self === undefined) { + self = parent; parent = locals; locals = null; + } + if (!locals) locals = NO_LOCALS; + else if (!isObject(locals)) { + throw new Error("'locals' must be an object"); + } + if (!parent) parent = NO_PARENT; + else if (!isResolve(parent)) { + throw new Error("'parent' must be a promise returned by $resolve.resolve()"); + } + + // To complete the overall resolution, we have to wait for the parent + // promise and for the promise for each invokable in our plan. + var resolution = $q.defer(), + result = resolution.promise, + promises = result.$$promises = {}, + values = extend({}, locals), + wait = 1 + plan.length/3, + merged = false; + + function done() { + // Merge parent values we haven't got yet and publish our own $$values + if (!--wait) { + if (!merged) merge(values, parent.$$values); + result.$$values = values; + result.$$promises = result.$$promises || true; // keep for isResolve() + delete result.$$inheritedValues; + resolution.resolve(values); + } + } + + function fail(reason) { + result.$$failure = reason; + resolution.reject(reason); + } + + // Short-circuit if parent has already failed + if (isDefined(parent.$$failure)) { + fail(parent.$$failure); + return result; + } + + if (parent.$$inheritedValues) { + merge(values, omit(parent.$$inheritedValues, invocableKeys)); + } + + // Merge parent values if the parent has already resolved, or merge + // parent promises and wait if the parent resolve is still in progress. + extend(promises, parent.$$promises); + if (parent.$$values) { + merged = merge(values, omit(parent.$$values, invocableKeys)); + result.$$inheritedValues = omit(parent.$$values, invocableKeys); + done(); + } else { + if (parent.$$inheritedValues) { + result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys); + } + parent.then(done, fail); + } + + // Process each invocable in the plan, but ignore any where a local of the same name exists. + for (var i=0, ii=plan.length; i= 0) throw new Error("State must have a valid name"); + if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined"); + + // Get parent name + var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.')) + : (isString(state.parent)) ? state.parent + : (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name + : ''; + + // If parent is not registered yet, add state to queue and register later + if (parentName && !states[parentName]) { + return queueState(parentName, state.self); + } + + for (var key in stateBuilder) { + if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]); + } + states[name] = state; + + // Register the state in the global state list and with $urlRouter if necessary. + if (!state[abstractKey] && state.url) { + $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) { + if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) { + $state.transitionTo(state, $match, { inherit: true, location: false }); + } + }]); + } + + // Register any queued children + flushQueuedChildren(name); + + return state; + } + + // Checks text to see if it looks like a glob. + function isGlob (text) { + return text.indexOf('*') > -1; + } + + // Returns true if glob matches current $state name. + function doesStateMatchGlob (glob) { + var globSegments = glob.split('.'), + segments = $state.$current.name.split('.'); + + //match greedy starts + if (globSegments[0] === '**') { + segments = segments.slice(indexOf(segments, globSegments[1])); + segments.unshift('**'); + } + //match greedy ends + if (globSegments[globSegments.length - 1] === '**') { + segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE); + segments.push('**'); + } + + if (globSegments.length != segments.length) { + return false; + } + + //match single stars + for (var i = 0, l = globSegments.length; i < l; i++) { + if (globSegments[i] === '*') { + segments[i] = '*'; + } + } + + return segments.join('') === globSegments.join(''); + } + + + // Implicit root state that is always active + root = registerState({ + name: '', + url: '^', + views: null, + 'abstract': true + }); + root.navigable = null; + + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#decorator + * @methodOf ui.router.state.$stateProvider + * + * @description + * Allows you to extend (carefully) or override (at your own peril) the + * `stateBuilder` object used internally by `$stateProvider`. This can be used + * to add custom functionality to ui-router, for example inferring templateUrl + * based on the state name. + * + * When passing only a name, it returns the current (original or decorated) builder + * function that matches `name`. + * + * The builder functions that can be decorated are listed below. Though not all + * necessarily have a good use case for decoration, that is up to you to decide. + * + * In addition, users can attach custom decorators, which will generate new + * properties within the state's internal definition. There is currently no clear + * use-case for this beyond accessing internal states (i.e. $state.$current), + * however, expect this to become increasingly relevant as we introduce additional + * meta-programming features. + * + * **Warning**: Decorators should not be interdependent because the order of + * execution of the builder functions in non-deterministic. Builder functions + * should only be dependent on the state definition object and super function. + * + * + * Existing builder functions and current return values: + * + * - **parent** `{object}` - returns the parent state object. + * - **data** `{object}` - returns state data, including any inherited data that is not + * overridden by own values (if any). + * - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher} + * or `null`. + * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is + * navigable). + * - **params** `{object}` - returns an array of state params that are ensured to + * be a super-set of parent's params. + * - **views** `{object}` - returns a views object where each key is an absolute view + * name (i.e. "viewName@stateName") and each value is the config object + * (template, controller) for the view. Even when you don't use the views object + * explicitly on a state config, one is still created for you internally. + * So by decorating this builder function you have access to decorating template + * and controller properties. + * - **ownParams** `{object}` - returns an array of params that belong to the state, + * not including any params defined by ancestor states. + * - **path** `{string}` - returns the full path from the root down to this state. + * Needed for state activation. + * - **includes** `{object}` - returns an object that includes every state that + * would pass a `$state.includes()` test. + * + * @example + *
+   * // Override the internal 'views' builder with a function that takes the state
+   * // definition, and a reference to the internal function being overridden:
+   * $stateProvider.decorator('views', function (state, parent) {
+   *   var result = {},
+   *       views = parent(state);
+   *
+   *   angular.forEach(views, function (config, name) {
+   *     var autoName = (state.name + '.' + name).replace('.', '/');
+   *     config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
+   *     result[name] = config;
+   *   });
+   *   return result;
+   * });
+   *
+   * $stateProvider.state('home', {
+   *   views: {
+   *     'contact.list': { controller: 'ListController' },
+   *     'contact.item': { controller: 'ItemController' }
+   *   }
+   * });
+   *
+   * // ...
+   *
+   * $state.go('home');
+   * // Auto-populates list and item views with /partials/home/contact/list.html,
+   * // and /partials/home/contact/item.html, respectively.
+   * 
+ * + * @param {string} name The name of the builder function to decorate. + * @param {object} func A function that is responsible for decorating the original + * builder function. The function receives two parameters: + * + * - `{object}` - state - The state config object. + * - `{object}` - super - The original builder function. + * + * @return {object} $stateProvider - $stateProvider instance + */ + this.decorator = decorator; + function decorator(name, func) { + /*jshint validthis: true */ + if (isString(name) && !isDefined(func)) { + return stateBuilder[name]; + } + if (!isFunction(func) || !isString(name)) { + return this; + } + if (stateBuilder[name] && !stateBuilder.$delegates[name]) { + stateBuilder.$delegates[name] = stateBuilder[name]; + } + stateBuilder[name] = func; + return this; + } + + /** + * @ngdoc function + * @name ui.router.state.$stateProvider#state + * @methodOf ui.router.state.$stateProvider + * + * @description + * Registers a state configuration under a given state name. The stateConfig object + * has the following acceptable properties. + * + * @param {string} name A unique state name, e.g. "home", "about", "contacts". + * To create a parent/child state use a dot, e.g. "about.sales", "home.newest". + * @param {object} stateConfig State configuration object. + * @param {string|function=} stateConfig.template + * + * html template as a string or a function that returns + * an html template as a string which should be used by the uiView directives. This property + * takes precedence over templateUrl. + * + * If `template` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
template:
+   *   "

inline template definition

" + + * "
"
+ *
template: function(params) {
+   *       return "

generated template

"; }
+ *
+ * + * @param {string|function=} stateConfig.templateUrl + * + * + * path or function that returns a path to an html + * template that should be used by uiView. + * + * If `templateUrl` is a function, it will be called with the following parameters: + * + * - {array.<object>} - state parameters extracted from the current $location.path() by + * applying the current state + * + *
templateUrl: "home.html"
+ *
templateUrl: function(params) {
+   *     return myTemplates[params.pageId]; }
+ * + * @param {function=} stateConfig.templateProvider + * + * Provider function that returns HTML content string. + *
 templateProvider:
+   *       function(MyTemplateService, params) {
+   *         return MyTemplateService.getTemplate(params.pageId);
+   *       }
+ * + * @param {string|function=} stateConfig.controller + * + * + * Controller fn that should be associated with newly + * related scope or the name of a registered controller if passed as a string. + * Optionally, the ControllerAs may be declared here. + *
controller: "MyRegisteredController"
+ *
controller:
+   *     "MyRegisteredController as fooCtrl"}
+ *
controller: function($scope, MyService) {
+   *     $scope.data = MyService.getData(); }
+ * + * @param {function=} stateConfig.controllerProvider + * + * + * Injectable provider function that returns the actual controller or string. + *
controllerProvider:
+   *   function(MyResolveData) {
+   *     if (MyResolveData.foo)
+   *       return "FooCtrl"
+   *     else if (MyResolveData.bar)
+   *       return "BarCtrl";
+   *     else return function($scope) {
+   *       $scope.baz = "Qux";
+   *     }
+   *   }
+ * + * @param {string=} stateConfig.controllerAs + * + * + * A controller alias name. If present the controller will be + * published to scope under the controllerAs name. + *
controllerAs: "myCtrl"
+ * + * @param {object=} stateConfig.resolve + * + * + * An optional map<string, function> of dependencies which + * should be injected into the controller. If any of these dependencies are promises, + * the router will wait for them all to be resolved before the controller is instantiated. + * If all the promises are resolved successfully, the $stateChangeSuccess event is fired + * and the values of the resolved promises are injected into any controllers that reference them. + * If any of the promises are rejected the $stateChangeError event is fired. + * + * The map object is: + * + * - key - {string}: name of dependency to be injected into controller + * - factory - {string|function}: If string then it is alias for service. Otherwise if function, + * it is injected and return value it treated as dependency. If result is a promise, it is + * resolved before its value is injected into controller. + * + *
resolve: {
+   *     myResolve1:
+   *       function($http, $stateParams) {
+   *         return $http.get("/api/foos/"+stateParams.fooID);
+   *       }
+   *     }
+ * + * @param {string=} stateConfig.url + * + * + * A url fragment with optional parameters. When a state is navigated or + * transitioned to, the `$stateParams` service will be populated with any + * parameters that were passed. + * + * examples: + *
url: "/home"
+   * url: "/users/:userid"
+   * url: "/books/{bookid:[a-zA-Z_-]}"
+   * url: "/books/{categoryid:int}"
+   * url: "/books/{publishername:string}/{categoryid:int}"
+   * url: "/messages?before&after"
+   * url: "/messages?{before:date}&{after:date}"
+ * url: "/messages/:mailboxid?{before:date}&{after:date}" + * + * @param {object=} stateConfig.views + * + * an optional map<string, object> which defined multiple views, or targets views + * manually/explicitly. + * + * Examples: + * + * Targets three named `ui-view`s in the parent state's template + *
views: {
+   *     header: {
+   *       controller: "headerCtrl",
+   *       templateUrl: "header.html"
+   *     }, body: {
+   *       controller: "bodyCtrl",
+   *       templateUrl: "body.html"
+   *     }, footer: {
+   *       controller: "footCtrl",
+   *       templateUrl: "footer.html"
+   *     }
+   *   }
+ * + * Targets named `ui-view="header"` from grandparent state 'top''s template, and named `ui-view="body" from parent state's template. + *
views: {
+   *     'header@top': {
+   *       controller: "msgHeaderCtrl",
+   *       templateUrl: "msgHeader.html"
+   *     }, 'body': {
+   *       controller: "messagesCtrl",
+   *       templateUrl: "messages.html"
+   *     }
+   *   }
+ * + * @param {boolean=} [stateConfig.abstract=false] + * + * An abstract state will never be directly activated, + * but can provide inherited properties to its common children states. + *
abstract: true
+ * + * @param {function=} stateConfig.onEnter + * + * + * Callback function for when a state is entered. Good way + * to trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
onEnter: function(MyService, $stateParams) {
+   *     MyService.foo($stateParams.myParam);
+   * }
+ * + * @param {function=} stateConfig.onExit + * + * + * Callback function for when a state is exited. Good way to + * trigger an action or dispatch an event, such as opening a dialog. + * If minifying your scripts, make sure to explictly annotate this function, + * because it won't be automatically annotated by your build tools. + * + *
onExit: function(MyService, $stateParams) {
+   *     MyService.cleanup($stateParams.myParam);
+   * }
+ * + * @param {boolean=} [stateConfig.reloadOnSearch=true] + * + * + * If `false`, will not retrigger the same state + * just because a search/query parameter has changed (via $location.search() or $location.hash()). + * Useful for when you'd like to modify $location.search() without triggering a reload. + *
reloadOnSearch: false
+ * + * @param {object=} stateConfig.data + * + * + * Arbitrary data object, useful for custom configuration. The parent state's `data` is + * prototypally inherited. In other words, adding a data property to a state adds it to + * the entire subtree via prototypal inheritance. + * + *
data: {
+   *     requiredRole: 'foo'
+   * } 
+ * + * @param {object=} stateConfig.params + * + * + * A map which optionally configures parameters declared in the `url`, or + * defines additional non-url parameters. For each parameter being + * configured, add a configuration object keyed to the name of the parameter. + * + * Each parameter configuration object may contain the following properties: + * + * - ** value ** - {object|function=}: specifies the default value for this + * parameter. This implicitly sets this parameter as optional. + * + * When UI-Router routes to a state and no value is + * specified for this parameter in the URL or transition, the + * default value will be used instead. If `value` is a function, + * it will be injected and invoked, and the return value used. + * + * *Note*: `undefined` is treated as "no default value" while `null` + * is treated as "the default value is `null`". + * + * *Shorthand*: If you only need to configure the default value of the + * parameter, you may use a shorthand syntax. In the **`params`** + * map, instead mapping the param name to a full parameter configuration + * object, simply set map it to the default parameter value, e.g.: + * + *
// define a parameter's default value
+   * params: {
+   *     param1: { value: "defaultValue" }
+   * }
+   * // shorthand default values
+   * params: {
+   *     param1: "defaultValue",
+   *     param2: "param2Default"
+   * }
+ * + * - ** array ** - {boolean=}: *(default: false)* If true, the param value will be + * treated as an array of values. If you specified a Type, the value will be + * treated as an array of the specified Type. Note: query parameter values + * default to a special `"auto"` mode. + * + * For query parameters in `"auto"` mode, if multiple values for a single parameter + * are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values + * are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`). However, if + * only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single + * value (e.g.: `{ foo: '1' }`). + * + *
params: {
+   *     param1: { array: true }
+   * }
+ * + * - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when + * the current parameter value is the same as the default value. If `squash` is not set, it uses the + * configured default squash policy. + * (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`}) + * + * There are three squash settings: + * + * - false: The parameter's default value is not squashed. It is encoded and included in the URL + * - true: The parameter's default value is omitted from the URL. If the parameter is preceeded and followed + * by slashes in the state's `url` declaration, then one of those slashes are omitted. + * This can allow for cleaner looking URLs. + * - `""`: The parameter's default value is replaced with an arbitrary placeholder of your choice. + * + *
params: {
+   *     param1: {
+   *       value: "defaultId",
+   *       squash: true
+   * } }
+   * // squash "defaultValue" to "~"
+   * params: {
+   *     param1: {
+   *       value: "defaultValue",
+   *       squash: "~"
+   * } }
+   * 
+ * + * + * @example + *
+   * // Some state name examples
+   *
+   * // stateName can be a single top-level name (must be unique).
+   * $stateProvider.state("home", {});
+   *
+   * // Or it can be a nested state name. This state is a child of the
+   * // above "home" state.
+   * $stateProvider.state("home.newest", {});
+   *
+   * // Nest states as deeply as needed.
+   * $stateProvider.state("home.newest.abc.xyz.inception", {});
+   *
+   * // state() returns $stateProvider, so you can chain state declarations.
+   * $stateProvider
+   *   .state("home", {})
+   *   .state("about", {})
+   *   .state("contacts", {});
+   * 
+ * + */ + this.state = state; + function state(name, definition) { + /*jshint validthis: true */ + if (isObject(name)) definition = name; + else definition.name = name; + registerState(definition); + return this; + } + + /** + * @ngdoc object + * @name ui.router.state.$state + * + * @requires $rootScope + * @requires $q + * @requires ui.router.state.$view + * @requires $injector + * @requires ui.router.util.$resolve + * @requires ui.router.state.$stateParams + * @requires ui.router.router.$urlRouter + * + * @property {object} params A param object, e.g. {sectionId: section.id)}, that + * you'd like to test against the current active state. + * @property {object} current A reference to the state's config object. However + * you passed it in. Useful for accessing custom data. + * @property {object} transition Currently pending transition. A promise that'll + * resolve or reject. + * + * @description + * `$state` service is responsible for representing states as well as transitioning + * between them. It also provides interfaces to ask for current state or even states + * you're coming from. + */ + this.$get = $get; + $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory']; + function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter, $location, $urlMatcherFactory) { + + var TransitionSuperseded = $q.reject(new Error('transition superseded')); + var TransitionPrevented = $q.reject(new Error('transition prevented')); + var TransitionAborted = $q.reject(new Error('transition aborted')); + var TransitionFailed = $q.reject(new Error('transition failed')); + + // Handles the case where a state which is the target of a transition is not found, and the user + // can optionally retry or defer the transition + function handleRedirect(redirect, state, params, options) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateNotFound + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when a requested state **cannot be found** using the provided state name during transition. + * The event is broadcast allowing any handlers a single chance to deal with the error (usually by + * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler, + * you can see its three properties in the example. You can use `event.preventDefault()` to abort the + * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value. + * + * @param {Object} event Event object. + * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties. + * @param {State} fromState Current state object. + * @param {Object} fromParams Current state params. + * + * @example + * + *
+       * // somewhere, assume lazy.state has not been defined
+       * $state.go("lazy.state", {a:1, b:2}, {inherit:false});
+       *
+       * // somewhere else
+       * $scope.$on('$stateNotFound',
+       * function(event, unfoundState, fromState, fromParams){
+       *     console.log(unfoundState.to); // "lazy.state"
+       *     console.log(unfoundState.toParams); // {a:1, b:2}
+       *     console.log(unfoundState.options); // {inherit:false} + default options
+       * })
+       * 
+ */ + var evt = $rootScope.$broadcast('$stateNotFound', redirect, state, params); + + if (evt.defaultPrevented) { + $urlRouter.update(); + return TransitionAborted; + } + + if (!evt.retry) { + return null; + } + + // Allow the handler to return a promise to defer state lookup retry + if (options.$retry) { + $urlRouter.update(); + return TransitionFailed; + } + var retryTransition = $state.transition = $q.when(evt.retry); + + retryTransition.then(function() { + if (retryTransition !== $state.transition) return TransitionSuperseded; + redirect.options.$retry = true; + return $state.transitionTo(redirect.to, redirect.toParams, redirect.options); + }, function() { + return TransitionAborted; + }); + $urlRouter.update(); + + return retryTransition; + } + + root.locals = { resolve: null, globals: { $stateParams: {} } }; + + $state = { + params: {}, + current: root.self, + $current: root, + transition: null + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#reload + * @methodOf ui.router.state.$state + * + * @description + * A method that force reloads the current state. All resolves are re-resolved, events are not re-fired, + * and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon). + * + * @example + *
+     * var app angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.reload = function(){
+     *     $state.reload();
+     *   }
+     * });
+     * 
+ * + * `reload()` is just an alias for: + *
+     * $state.transitionTo($state.current, $stateParams, { 
+     *   reload: true, inherit: false, notify: true
+     * });
+     * 
+ * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.reload = function reload() { + return $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: true }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#go + * @methodOf ui.router.state.$state + * + * @description + * Convenience method for transitioning to a new state. `$state.go` calls + * `$state.transitionTo` internally but automatically sets options to + * `{ location: true, inherit: true, relative: $state.$current, notify: true }`. + * This allows you to easily use an absolute or relative to path and specify + * only the parameters you'd like to update (while letting unspecified parameters + * inherit from the currently active ancestor states). + * + * @example + *
+     * var app = angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.changeState = function () {
+     *     $state.go('contact.detail');
+     *   };
+     * });
+     * 
+ * + * + * @param {string} to Absolute state name or relative state path. Some examples: + * + * - `$state.go('contact.detail')` - will go to the `contact.detail` state + * - `$state.go('^')` - will go to a parent state + * - `$state.go('^.sibling')` - will go to a sibling state + * - `$state.go('.child.grandchild')` - will go to grandchild state + * + * @param {object=} params A map of the parameters that will be sent to the state, + * will populate $stateParams. Any parameters that are not specified will be inherited from currently + * defined parameters. This allows, for example, going to a sibling state that shares parameters + * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e. + * transitioning to a sibling will get you the parameters for all parents, transitioning to a child + * will get you all current parameters, etc. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. + * + * Possible success values: + * + * - $state.current + * + *
Possible rejection values: + * + * - 'transition superseded' - when a newer transition has been started after this one + * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener + * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or + * when a `$stateNotFound` `event.retry` promise errors. + * - 'transition failed' - when a state has been unsuccessfully found after 2 tries. + * - *resolve error* - when an error has occurred with a `resolve` + * + */ + $state.go = function go(to, params, options) { + return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options)); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#transitionTo + * @methodOf ui.router.state.$state + * + * @description + * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go} + * uses `transitionTo` internally. `$state.go` is recommended in most situations. + * + * @example + *
+     * var app = angular.module('app', ['ui.router']);
+     *
+     * app.controller('ctrl', function ($scope, $state) {
+     *   $scope.changeState = function () {
+     *     $state.transitionTo('contact.detail');
+     *   };
+     * });
+     * 
+ * + * @param {string} to State name. + * @param {object=} toParams A map of the parameters that will be sent to the state, + * will populate $stateParams. + * @param {object=} options Options object. The options are: + * + * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false` + * will not. If string, must be `"replace"`, which will update url and also replace last history record. + * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events. + * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params + * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd + * use this when you want to force a reload when *everything* is the same, including search params. + * + * @returns {promise} A promise representing the state of the new transition. See + * {@link ui.router.state.$state#methods_go $state.go}. + */ + $state.transitionTo = function transitionTo(to, toParams, options) { + toParams = toParams || {}; + options = extend({ + location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false + }, options || {}); + + var from = $state.$current, fromParams = $state.params, fromPath = from.path; + var evt, toState = findState(to, options.relative); + + if (!isDefined(toState)) { + var redirect = { to: to, toParams: toParams, options: options }; + var redirectResult = handleRedirect(redirect, from.self, fromParams, options); + + if (redirectResult) { + return redirectResult; + } + + // Always retry once if the $stateNotFound was not prevented + // (handles either redirect changed or state lazy-definition) + to = redirect.to; + toParams = redirect.toParams; + options = redirect.options; + toState = findState(to, options.relative); + + if (!isDefined(toState)) { + if (!options.relative) throw new Error("No such state '" + to + "'"); + throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'"); + } + } + if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'"); + if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState); + if (!toState.params.$$validates(toParams)) return TransitionFailed; + + toParams = toState.params.$$values(toParams); + to = toState; + + var toPath = to.path; + + // Starting from the root of the path, keep all levels that haven't changed + var keep = 0, state = toPath[keep], locals = root.locals, toLocals = []; + + if (!options.reload) { + while (state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams)) { + locals = toLocals[keep] = state.locals; + keep++; + state = toPath[keep]; + } + } + + // If we're going to the same state and all locals are kept, we've got nothing to do. + // But clear 'transition', as we still want to cancel any other pending transitions. + // TODO: We may not want to bump 'transition' if we're called from a location change + // that we've initiated ourselves, because we might accidentally abort a legitimate + // transition initiated from code? + if (shouldTriggerReload(to, from, locals, options)) { + if (to.self.reloadOnSearch !== false) $urlRouter.update(); + $state.transition = null; + return $q.when($state.current); + } + + // Filter parameters before we pass them to event handlers etc. + toParams = filterByKeys(to.params.$$keys(), toParams || {}); + + // Broadcast start event and cancel the transition if requested + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeStart + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when the state transition **begins**. You can use `event.preventDefault()` + * to prevent the transition from happening and then the transition promise will be + * rejected with a `'transition prevented'` value. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * + * @example + * + *
+         * $rootScope.$on('$stateChangeStart',
+         * function(event, toState, toParams, fromState, fromParams){
+         *     event.preventDefault();
+         *     // transitionTo() promise will be rejected with
+         *     // a 'transition prevented' error
+         * })
+         * 
+ */ + if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams).defaultPrevented) { + $urlRouter.update(); + return TransitionPrevented; + } + } + + // Resolve locals for the remaining states, but don't update any global state just + // yet -- if anything fails to resolve the current state needs to remain untouched. + // We also set up an inheritance chain for the locals here. This allows the view directive + // to quickly look up the correct definition for each view in the current state. Even + // though we create the locals object itself outside resolveState(), it is initially + // empty and gets filled asynchronously. We need to keep track of the promise for the + // (fully resolved) current locals, and pass this down the chain. + var resolved = $q.when(locals); + + for (var l = keep; l < toPath.length; l++, state = toPath[l]) { + locals = toLocals[l] = inherit(locals); + resolved = resolveState(state, toParams, state === to, resolved, locals, options); + } + + // Once everything is resolved, we are ready to perform the actual transition + // and return a promise for the new state. We also keep track of what the + // current promise is, so that we can detect overlapping transitions and + // keep only the outcome of the last transition. + var transition = $state.transition = resolved.then(function () { + var l, entering, exiting; + + if ($state.transition !== transition) return TransitionSuperseded; + + // Exit 'from' states not kept + for (l = fromPath.length - 1; l >= keep; l--) { + exiting = fromPath[l]; + if (exiting.self.onExit) { + $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals); + } + exiting.locals = null; + } + + // Enter 'to' states not kept + for (l = keep; l < toPath.length; l++) { + entering = toPath[l]; + entering.locals = toLocals[l]; + if (entering.self.onEnter) { + $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals); + } + } + + // Run it again, to catch any transitions in callbacks + if ($state.transition !== transition) return TransitionSuperseded; + + // Update globals in $state + $state.$current = to; + $state.current = to.self; + $state.params = toParams; + copy($state.params, $stateParams); + $state.transition = null; + + if (options.location && to.navigable) { + $urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, { + $$avoidResync: true, replace: options.location === 'replace' + }); + } + + if (options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeSuccess + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired once the state transition is **complete**. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + */ + $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams); + } + $urlRouter.update(true); + + return $state.current; + }, function (error) { + if ($state.transition !== transition) return TransitionSuperseded; + + $state.transition = null; + /** + * @ngdoc event + * @name ui.router.state.$state#$stateChangeError + * @eventOf ui.router.state.$state + * @eventType broadcast on root scope + * @description + * Fired when an **error occurs** during transition. It's important to note that if you + * have any errors in your resolve functions (javascript errors, non-existent services, etc) + * they will not throw traditionally. You must listen for this $stateChangeError event to + * catch **ALL** errors. + * + * @param {Object} event Event object. + * @param {State} toState The state being transitioned to. + * @param {Object} toParams The params supplied to the `toState`. + * @param {State} fromState The current state, pre-transition. + * @param {Object} fromParams The params supplied to the `fromState`. + * @param {Error} error The resolve error object. + */ + evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error); + + if (!evt.defaultPrevented) { + $urlRouter.update(); + } + + return $q.reject(error); + }); + + return transition; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#is + * @methodOf ui.router.state.$state + * + * @description + * Similar to {@link ui.router.state.$state#methods_includes $state.includes}, + * but only checks for the full state name. If params is supplied then it will be + * tested for strict equality against the current active params object, so all params + * must match with none missing and no extras. + * + * @example + *
+     * $state.$current.name = 'contacts.details.item';
+     *
+     * // absolute name
+     * $state.is('contact.details.item'); // returns true
+     * $state.is(contactDetailItemStateObject); // returns true
+     *
+     * // relative name (. and ^), typically from a template
+     * // E.g. from the 'contacts.details' template
+     * 
Item
+ *
+ * + * @param {string|object} stateOrName The state name (absolute or relative) or state object you'd like to check. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like + * to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object} - If `stateOrName` is a relative state name and `options.relative` is set, .is will + * test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it is the state. + */ + $state.is = function is(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) { return undefined; } + if ($state.$current !== state) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams) : true; + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#includes + * @methodOf ui.router.state.$state + * + * @description + * A method to determine if the current active state is equal to or is the child of the + * state stateName. If any params are passed then they will be tested for a match as well. + * Not all the parameters need to be passed, just the ones you'd like to test for equality. + * + * @example + * Partial and relative names + *
+     * $state.$current.name = 'contacts.details.item';
+     *
+     * // Using partial names
+     * $state.includes("contacts"); // returns true
+     * $state.includes("contacts.details"); // returns true
+     * $state.includes("contacts.details.item"); // returns true
+     * $state.includes("contacts.list"); // returns false
+     * $state.includes("about"); // returns false
+     *
+     * // Using relative names (. and ^), typically from a template
+     * // E.g. from the 'contacts.details' template
+     * 
Item
+ *
+ * + * Basic globbing patterns + *
+     * $state.$current.name = 'contacts.details.item.url';
+     *
+     * $state.includes("*.details.*.*"); // returns true
+     * $state.includes("*.details.**"); // returns true
+     * $state.includes("**.item.**"); // returns true
+     * $state.includes("*.details.item.url"); // returns true
+     * $state.includes("*.details.*.url"); // returns true
+     * $state.includes("*.details.*"); // returns false
+     * $state.includes("item.**"); // returns false
+     * 
+ * + * @param {string} stateOrName A partial name, relative name, or glob pattern + * to be searched for within the current state name. + * @param {object=} params A param object, e.g. `{sectionId: section.id}`, + * that you'd like to test against the current active state. + * @param {object=} options An options object. The options are: + * + * - **`relative`** - {string|object=} - If `stateOrName` is a relative state reference and `options.relative` is set, + * .includes will test relative to `options.relative` state (or name). + * + * @returns {boolean} Returns true if it does include the state + */ + $state.includes = function includes(stateOrName, params, options) { + options = extend({ relative: $state.$current }, options || {}); + if (isString(stateOrName) && isGlob(stateOrName)) { + if (!doesStateMatchGlob(stateOrName)) { + return false; + } + stateOrName = $state.$current.name; + } + + var state = findState(stateOrName, options.relative); + if (!isDefined(state)) { return undefined; } + if (!isDefined($state.$current.includes[state.name])) { return false; } + return params ? equalForKeys(state.params.$$values(params), $stateParams, objectKeys(params)) : true; + }; + + + /** + * @ngdoc function + * @name ui.router.state.$state#href + * @methodOf ui.router.state.$state + * + * @description + * A url generation method that returns the compiled url for the given state populated with the given params. + * + * @example + *
+     * expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
+     * 
+ * + * @param {string|object} stateOrName The state name or state object you'd like to generate a url from. + * @param {object=} params An object of parameter values to fill the state's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the + * first parameter, then the constructed href url will be built from the first navigable ancestor (aka + * ancestor with a valid url). + * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url. + * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), + * defines which state to be relative from. + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} compiled state url + */ + $state.href = function href(stateOrName, params, options) { + options = extend({ + lossy: true, + inherit: true, + absolute: false, + relative: $state.$current + }, options || {}); + + var state = findState(stateOrName, options.relative); + + if (!isDefined(state)) return null; + if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state); + + var nav = (state && options.lossy) ? state.navigable : state; + + if (!nav || nav.url === undefined || nav.url === null) { + return null; + } + return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys(), params || {}), { + absolute: options.absolute + }); + }; + + /** + * @ngdoc function + * @name ui.router.state.$state#get + * @methodOf ui.router.state.$state + * + * @description + * Returns the state configuration object for any specific state or all states. + * + * @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for + * the requested state. If not provided, returns an array of ALL state configs. + * @param {string|object=} context When stateOrName is a relative state reference, the state will be retrieved relative to context. + * @returns {Object|Array} State configuration object or array of all objects. + */ + $state.get = function (stateOrName, context) { + if (arguments.length === 0) return map(objectKeys(states), function(name) { return states[name].self; }); + var state = findState(stateOrName, context || $state.$current); + return (state && state.self) ? state.self : null; + }; + + function resolveState(state, params, paramsAreFiltered, inherited, dst, options) { + // Make a restricted $stateParams with only the parameters that apply to this state if + // necessary. In addition to being available to the controller and onEnter/onExit callbacks, + // we also need $stateParams to be available for any $injector calls we make during the + // dependency resolution process. + var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params); + var locals = { $stateParams: $stateParams }; + + // Resolve 'global' dependencies for the state, i.e. those not specific to a view. + // We're also including $stateParams in this; that way the parameters are restricted + // to the set that should be visible to the state, and are independent of when we update + // the global $state and $stateParams values. + dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state); + var promises = [dst.resolve.then(function (globals) { + dst.globals = globals; + })]; + if (inherited) promises.push(inherited); + + // Resolve template and dependencies for all views. + forEach(state.views, function (view, name) { + var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {}); + injectables.$template = [ function () { + return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: options.notify }) || ''; + }]; + + promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) { + // References to the controller (only instantiated at link time) + if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) { + var injectLocals = angular.extend({}, injectables, locals); + result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals); + } else { + result.$$controller = view.controller; + } + // Provide access to the state itself for internal use + result.$$state = state; + result.$$controllerAs = view.controllerAs; + dst[name] = result; + })); + }); + + // Wait for all the promises and then return the activation object + return $q.all(promises).then(function (values) { + return dst; + }); + } + + return $state; + } + + function shouldTriggerReload(to, from, locals, options) { + if (to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false))) { + return true; + } + } +} + +angular.module('ui.router.state') + .value('$stateParams', {}) + .provider('$state', $StateProvider); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateDirectives.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateDirectives.js new file mode 100644 index 0000000..4d9d527 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateDirectives.js @@ -0,0 +1,268 @@ +function parseStateRef(ref, current) { + var preparsed = ref.match(/^\s*({[^}]*})\s*$/), parsed; + if (preparsed) ref = current + '(' + preparsed[1] + ')'; + parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/); + if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'"); + return { state: parsed[1], paramExpr: parsed[3] || null }; +} + +function stateContext(el) { + var stateData = el.parent().inheritedData('$uiView'); + + if (stateData && stateData.state && stateData.state.name) { + return stateData.state; + } +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref + * + * @requires ui.router.state.$state + * @requires $timeout + * + * @restrict A + * + * @description + * A directive that binds a link (`` tag) to a state. If the state has an associated + * URL, the directive will automatically generate & update the `href` attribute via + * the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking + * the link will trigger a state transition with optional parameters. + * + * Also middle-clicking, right-clicking, and ctrl-clicking on the link will be + * handled natively by the browser. + * + * You can also use relative state paths within ui-sref, just like the relative + * paths passed to `$state.go()`. You just need to be aware that the path is relative + * to the state that the link lives in, in other words the state that loaded the + * template containing the link. + * + * You can specify options to pass to {@link ui.router.state.$state#go $state.go()} + * using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`, + * and `reload`. + * + * @example + * Here's an example of how you'd use ui-sref and how it would compile. If you have the + * following template: + *
+ * Home | About | Next page
+ * 
+ * 
+ * 
+ * + * Then the compiled html would be (assuming Html5Mode is off and current state is contacts): + *
+ * Home | About | Next page
+ * 
+ * 
    + *
  • + * Joe + *
  • + *
  • + * Alice + *
  • + *
  • + * Bob + *
  • + *
+ * + * Home + *
+ * + * @param {string} ui-sref 'stateName' can be any valid absolute or relative state + * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#go $state.go()} + */ +$StateRefDirective.$inject = ['$state', '$timeout']; +function $StateRefDirective($state, $timeout) { + var allowedOptions = ['location', 'inherit', 'reload']; + + return { + restrict: 'A', + require: ['?^uiSrefActive', '?^uiSrefActiveEq'], + link: function(scope, element, attrs, uiSrefActive) { + var ref = parseStateRef(attrs.uiSref, $state.current.name); + var params = null, url = null, base = stateContext(element) || $state.$current; + var newHref = null, isAnchor = element.prop("tagName") === "A"; + var isForm = element[0].nodeName === "FORM"; + var attr = isForm ? "action" : "href", nav = true; + + var options = { relative: base, inherit: true }; + var optionsOverride = scope.$eval(attrs.uiSrefOpts) || {}; + + angular.forEach(allowedOptions, function(option) { + if (option in optionsOverride) { + options[option] = optionsOverride[option]; + } + }); + + var update = function(newVal) { + if (newVal) params = angular.copy(newVal); + if (!nav) return; + + newHref = $state.href(ref.state, params, options); + + var activeDirective = uiSrefActive[1] || uiSrefActive[0]; + if (activeDirective) { + activeDirective.$$setStateInfo(ref.state, params); + } + if (newHref === null) { + nav = false; + return false; + } + attrs.$set(attr, newHref); + }; + + if (ref.paramExpr) { + scope.$watch(ref.paramExpr, function(newVal, oldVal) { + if (newVal !== params) update(newVal); + }, true); + params = angular.copy(scope.$eval(ref.paramExpr)); + } + update(); + + if (isForm) return; + + element.bind("click", function(e) { + var button = e.which || e.button; + if ( !(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr('target')) ) { + // HACK: This is to allow ng-clicks to be processed before the transition is initiated: + var transition = $timeout(function() { + $state.go(ref.state, params, options); + }); + e.preventDefault(); + + // if the state has no URL, ignore one preventDefault from the directive. + var ignorePreventDefaultCount = isAnchor && !newHref ? 1: 0; + e.preventDefault = function() { + if (ignorePreventDefaultCount-- <= 0) + $timeout.cancel(transition); + }; + } + }); + } + }; +} + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * A directive working alongside ui-sref to add classes to an element when the + * related ui-sref directive's state is active, and removing them when it is inactive. + * The primary use-case is to simplify the special appearance of navigation menus + * relying on `ui-sref`, by having the "active" state's menu button appear different, + * distinguishing it from the inactive menu items. + * + * ui-sref-active can live on the same element as ui-sref or on a parent element. The first + * ui-sref-active found at the same level or above the ui-sref will be used. + * + * Will activate when the ui-sref's target state or any child state is active. If you + * need to activate only when the ui-sref target state is active and *not* any of + * it's children, then you will use + * {@link ui.router.state.directive:ui-sref-active-eq ui-sref-active-eq} + * + * @example + * Given the following template: + *
+ * 
+ * 
+ * + * + * When the app state is "app.user" (or any children states), and contains the state parameter "user" with value "bilbobaggins", + * the resulting HTML will appear as (note the 'active' class): + *
+ * 
+ * 
+ * + * The class name is interpolated **once** during the directives link time (any further changes to the + * interpolated value are ignored). + * + * Multiple classes may be specified in a space-separated format: + *
+ * 
    + *
  • + * link + *
  • + *
+ *
+ */ + +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-sref-active-eq + * + * @requires ui.router.state.$state + * @requires ui.router.state.$stateParams + * @requires $interpolate + * + * @restrict A + * + * @description + * The same as {@link ui.router.state.directive:ui-sref-active ui-sref-active} but will only activate + * when the exact target state used in the `ui-sref` is active; no child states. + * + */ +$StateRefActiveDirective.$inject = ['$state', '$stateParams', '$interpolate']; +function $StateRefActiveDirective($state, $stateParams, $interpolate) { + return { + restrict: "A", + controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { + var state, params, activeClass; + + // There probably isn't much point in $observing this + // uiSrefActive and uiSrefActiveEq share the same directive object with some + // slight difference in logic routing + activeClass = $interpolate($attrs.uiSrefActiveEq || $attrs.uiSrefActive || '', false)($scope); + + // Allow uiSref to communicate with uiSrefActive[Equals] + this.$$setStateInfo = function (newState, newParams) { + state = $state.get(newState, stateContext($element)); + params = newParams; + update(); + }; + + $scope.$on('$stateChangeSuccess', update); + + // Update route state + function update() { + if (isMatch()) { + $element.addClass(activeClass); + } else { + $element.removeClass(activeClass); + } + } + + function isMatch() { + if (typeof $attrs.uiSrefActiveEq !== 'undefined') { + return state && $state.is(state.name, params); + } else { + return state && $state.includes(state.name, params); + } + } + }] + }; +} + +angular.module('ui.router.state') + .directive('uiSref', $StateRefDirective) + .directive('uiSrefActive', $StateRefActiveDirective) + .directive('uiSrefActiveEq', $StateRefActiveDirective); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateFilters.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateFilters.js new file mode 100644 index 0000000..e0a1175 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/stateFilters.js @@ -0,0 +1,39 @@ +/** + * @ngdoc filter + * @name ui.router.state.filter:isState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}. + */ +$IsStateFilter.$inject = ['$state']; +function $IsStateFilter($state) { + var isFilter = function (state) { + return $state.is(state); + }; + isFilter.$stateful = true; + return isFilter; +} + +/** + * @ngdoc filter + * @name ui.router.state.filter:includedByState + * + * @requires ui.router.state.$state + * + * @description + * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}. + */ +$IncludedByStateFilter.$inject = ['$state']; +function $IncludedByStateFilter($state) { + var includesFilter = function (state) { + return $state.includes(state); + }; + includesFilter.$stateful = true; + return includesFilter; +} + +angular.module('ui.router.state') + .filter('isState', $IsStateFilter) + .filter('includedByState', $IncludedByStateFilter); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/templateFactory.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/templateFactory.js new file mode 100644 index 0000000..ca491a9 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/templateFactory.js @@ -0,0 +1,110 @@ +/** + * @ngdoc object + * @name ui.router.util.$templateFactory + * + * @requires $http + * @requires $templateCache + * @requires $injector + * + * @description + * Service. Manages loading of templates. + */ +$TemplateFactory.$inject = ['$http', '$templateCache', '$injector']; +function $TemplateFactory( $http, $templateCache, $injector) { + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromConfig + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template from a configuration object. + * + * @param {object} config Configuration object for which to load a template. + * The following properties are search in the specified order, and the first one + * that is defined is used to create the template: + * + * @param {string|object} config.template html string template or function to + * load via {@link ui.router.util.$templateFactory#fromString fromString}. + * @param {string|object} config.templateUrl url to load or a function returning + * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}. + * @param {Function} config.templateProvider function to invoke via + * {@link ui.router.util.$templateFactory#fromProvider fromProvider}. + * @param {object} params Parameters to pass to the template function. + * @param {object} locals Locals to pass to `invoke` if the template is loaded + * via a `templateProvider`. Defaults to `{ params: params }`. + * + * @return {string|object} The template html as a string, or a promise for + * that string,or `null` if no template is configured. + */ + this.fromConfig = function (config, params, locals) { + return ( + isDefined(config.template) ? this.fromString(config.template, params) : + isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) : + isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) : + null + ); + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromString + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template from a string or a function returning a string. + * + * @param {string|object} template html template as a string or function that + * returns an html template as a string. + * @param {object} params Parameters to pass to the template function. + * + * @return {string|object} The template html as a string, or a promise for that + * string. + */ + this.fromString = function (template, params) { + return isFunction(template) ? template(params) : template; + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromUrl + * @methodOf ui.router.util.$templateFactory + * + * @description + * Loads a template from the a URL via `$http` and `$templateCache`. + * + * @param {string|Function} url url of the template to load, or a function + * that returns a url. + * @param {Object} params Parameters to pass to the url function. + * @return {string|Promise.} The template html as a string, or a promise + * for that string. + */ + this.fromUrl = function (url, params) { + if (isFunction(url)) url = url(params); + if (url == null) return null; + else return $http + .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }}) + .then(function(response) { return response.data; }); + }; + + /** + * @ngdoc function + * @name ui.router.util.$templateFactory#fromProvider + * @methodOf ui.router.util.$templateFactory + * + * @description + * Creates a template by invoking an injectable provider function. + * + * @param {Function} provider Function to invoke via `$injector.invoke` + * @param {Object} params Parameters for the template. + * @param {Object} locals Locals to pass to `invoke`. Defaults to + * `{ params: params }`. + * @return {string|Promise.} The template html as a string, or a promise + * for that string. + */ + this.fromProvider = function (provider, params, locals) { + return $injector.invoke(provider, null, locals || { params: params }); + }; +} + +angular.module('ui.router.util').service('$templateFactory', $TemplateFactory); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlMatcherFactory.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlMatcherFactory.js new file mode 100644 index 0000000..a16e728 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlMatcherFactory.js @@ -0,0 +1,1036 @@ +var $$UMFP; // reference to $UrlMatcherFactoryProvider + +/** + * @ngdoc object + * @name ui.router.util.type:UrlMatcher + * + * @description + * Matches URLs against patterns and extracts named parameters from the path or the search + * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list + * of search parameters. Multiple search parameter names are separated by '&'. Search parameters + * do not influence whether or not a URL is matched, but their values are passed through into + * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}. + * + * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace + * syntax, which optionally allows a regular expression for the parameter to be specified: + * + * * `':'` name - colon placeholder + * * `'*'` name - catch-all placeholder + * * `'{' name '}'` - curly placeholder + * * `'{' name ':' regexp|type '}'` - curly placeholder with regexp or type name. Should the + * regexp itself contain curly braces, they must be in matched pairs or escaped with a backslash. + * + * Parameter names may contain only word characters (latin letters, digits, and underscore) and + * must be unique within the pattern (across both path and search parameters). For colon + * placeholders or curly placeholders without an explicit regexp, a path parameter matches any + * number of characters other than '/'. For catch-all placeholders the path parameter matches + * any number of characters. + * + * Examples: + * + * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for + * trailing slashes, and patterns have to match the entire path, not just a prefix. + * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or + * '/user/bob/details'. The second path segment will be captured as the parameter 'id'. + * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax. + * * `'/user/{id:[^/]*}'` - Same as the previous example. + * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id + * parameter consists of 1 to 8 hex digits. + * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the + * path into the parameter 'path'. + * * `'/files/*path'` - ditto. + * * `'/calendar/{start:date}'` - Matches "/calendar/2014-11-12" (because the pattern defined + * in the built-in `date` Type matches `2014-11-12`) and provides a Date object in $stateParams.start + * + * @param {string} pattern The pattern to compile into a matcher. + * @param {Object} config A configuration object hash: + * @param {Object=} parentMatcher Used to concatenate the pattern/config onto + * an existing UrlMatcher + * + * * `caseInsensitive` - `true` if URL matching should be case insensitive, otherwise `false`, the default value (for backward compatibility) is `false`. + * * `strict` - `false` if matching against a URL with a trailing slash should be treated as equivalent to a URL without a trailing slash, the default value is `true`. + * + * @property {string} prefix A static prefix of this pattern. The matcher guarantees that any + * URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns + * non-null) will start with this prefix. + * + * @property {string} source The pattern that was passed into the constructor + * + * @property {string} sourcePath The path portion of the source property + * + * @property {string} sourceSearch The search portion of the source property + * + * @property {string} regex The constructed regex that will be used to match against the url when + * it is time to determine which url will match. + * + * @returns {Object} New `UrlMatcher` object + */ +function UrlMatcher(pattern, config, parentMatcher) { + config = extend({ params: {} }, isObject(config) ? config : {}); + + // Find all placeholders and create a compiled pattern, using either classic or curly syntax: + // '*' name + // ':' name + // '{' name '}' + // '{' name ':' regexp '}' + // The regular expression is somewhat complicated due to the need to allow curly braces + // inside the regular expression. The placeholder regexp breaks down as follows: + // ([:*])([\w\[\]]+) - classic placeholder ($1 / $2) (search version has - for snake-case) + // \{([\w\[\]]+)(?:\:( ... ))?\} - curly brace placeholder ($3) with optional regexp/type ... ($4) (search version has - for snake-case + // (?: ... | ... | ... )+ - the regexp consists of any number of atoms, an atom being either + // [^{}\\]+ - anything other than curly braces or backslash + // \\. - a backslash escape + // \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms + var placeholder = /([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + searchPlaceholder = /([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g, + compiled = '^', last = 0, m, + segments = this.segments = [], + parentParams = parentMatcher ? parentMatcher.params : {}, + params = this.params = parentMatcher ? parentMatcher.params.$$new() : new $$UMFP.ParamSet(), + paramNames = []; + + function addParameter(id, type, config, location) { + paramNames.push(id); + if (parentParams[id]) return parentParams[id]; + if (!/^\w+(-+\w+)*(?:\[\])?$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'"); + if (params[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'"); + params[id] = new $$UMFP.Param(id, type, config, location); + return params[id]; + } + + function quoteRegExp(string, pattern, squash) { + var surroundPattern = ['',''], result = string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&"); + if (!pattern) return result; + switch(squash) { + case false: surroundPattern = ['(', ')']; break; + case true: surroundPattern = ['?(', ')?']; break; + default: surroundPattern = ['(' + squash + "|", ')?']; break; + } + return result + surroundPattern[0] + pattern + surroundPattern[1]; + } + + this.source = pattern; + + // Split into static segments separated by path parameter placeholders. + // The number of segments is always 1 more than the number of parameters. + function matchDetails(m, isSearch) { + var id, regexp, segment, type, cfg, arrayMode; + id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null + cfg = config.params[id]; + segment = pattern.substring(last, m.index); + regexp = isSearch ? m[4] : m[4] || (m[1] == '*' ? '.*' : null); + type = $$UMFP.type(regexp || "string") || inherit($$UMFP.type("string"), { pattern: new RegExp(regexp) }); + return { + id: id, regexp: regexp, segment: segment, type: type, cfg: cfg + }; + } + + var p, param, segment; + while ((m = placeholder.exec(pattern))) { + p = matchDetails(m, false); + if (p.segment.indexOf('?') >= 0) break; // we're into the search part + + param = addParameter(p.id, p.type, p.cfg, "path"); + compiled += quoteRegExp(p.segment, param.type.pattern.source, param.squash); + segments.push(p.segment); + last = placeholder.lastIndex; + } + segment = pattern.substring(last); + + // Find any search parameter names and remove them from the last segment + var i = segment.indexOf('?'); + + if (i >= 0) { + var search = this.sourceSearch = segment.substring(i); + segment = segment.substring(0, i); + this.sourcePath = pattern.substring(0, last + i); + + if (search.length > 0) { + last = 0; + while ((m = searchPlaceholder.exec(search))) { + p = matchDetails(m, true); + param = addParameter(p.id, p.type, p.cfg, "search"); + last = placeholder.lastIndex; + // check if ?& + } + } + } else { + this.sourcePath = pattern; + this.sourceSearch = ''; + } + + compiled += quoteRegExp(segment) + (config.strict === false ? '\/?' : '') + '$'; + segments.push(segment); + + this.regexp = new RegExp(compiled, config.caseInsensitive ? 'i' : undefined); + this.prefix = segments[0]; + this.$$paramNames = paramNames; +} + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#concat + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns a new matcher for a pattern constructed by appending the path part and adding the + * search parameters of the specified pattern to this pattern. The current pattern is not + * modified. This can be understood as creating a pattern for URLs that are relative to (or + * suffixes of) the current pattern. + * + * @example + * The following two matchers are equivalent: + *
+ * new UrlMatcher('/user/{id}?q').concat('/details?date');
+ * new UrlMatcher('/user/{id}/details?q&date');
+ * 
+ * + * @param {string} pattern The pattern to append. + * @param {Object} config An object hash of the configuration for the matcher. + * @returns {UrlMatcher} A matcher for the concatenated pattern. + */ +UrlMatcher.prototype.concat = function (pattern, config) { + // Because order of search parameters is irrelevant, we can add our own search + // parameters to the end of the new pattern. Parse the new pattern by itself + // and then join the bits together, but it's much easier to do this on a string level. + var defaultConfig = { + caseInsensitive: $$UMFP.caseInsensitive(), + strict: $$UMFP.strictMode(), + squash: $$UMFP.defaultSquashPolicy() + }; + return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch, extend(defaultConfig, config), this); +}; + +UrlMatcher.prototype.toString = function () { + return this.source; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#exec + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Tests the specified path against this matcher, and returns an object containing the captured + * parameter values, or null if the path does not match. The returned object contains the values + * of any search parameters that are mentioned in the pattern, but their value may be null if + * they are not present in `searchParams`. This means that search parameters are always treated + * as optional. + * + * @example + *
+ * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', {
+ *   x: '1', q: 'hello'
+ * });
+ * // returns { id: 'bob', q: 'hello', r: null }
+ * 
+ * + * @param {string} path The URL path to match, e.g. `$location.path()`. + * @param {Object} searchParams URL search parameters, e.g. `$location.search()`. + * @returns {Object} The captured parameter values. + */ +UrlMatcher.prototype.exec = function (path, searchParams) { + var m = this.regexp.exec(path); + if (!m) return null; + searchParams = searchParams || {}; + + var paramNames = this.parameters(), nTotal = paramNames.length, + nPath = this.segments.length - 1, + values = {}, i, j, cfg, paramName; + + if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'"); + + function decodePathArray(string) { + function reverseString(str) { return str.split("").reverse().join(""); } + function unquoteDashes(str) { return str.replace(/\\-/, "-"); } + + var split = reverseString(string).split(/-(?!\\)/); + var allReversed = map(split, reverseString); + return map(allReversed, unquoteDashes).reverse(); + } + + for (i = 0; i < nPath; i++) { + paramName = paramNames[i]; + var param = this.params[paramName]; + var paramVal = m[i+1]; + // if the param value matches a pre-replace pair, replace the value before decoding. + for (j = 0; j < param.replace; j++) { + if (param.replace[j].from === paramVal) paramVal = param.replace[j].to; + } + if (paramVal && param.array === true) paramVal = decodePathArray(paramVal); + values[paramName] = param.value(paramVal); + } + for (/**/; i < nTotal; i++) { + paramName = paramNames[i]; + values[paramName] = this.params[paramName].value(searchParams[paramName]); + } + + return values; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#parameters + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Returns the names of all path and search parameters of this pattern in an unspecified order. + * + * @returns {Array.} An array of parameter names. Must be treated as read-only. If the + * pattern has no parameters, an empty array is returned. + */ +UrlMatcher.prototype.parameters = function (param) { + if (!isDefined(param)) return this.$$paramNames; + return this.params[param] || null; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#validate + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Checks an object hash of parameters to validate their correctness according to the parameter + * types of this `UrlMatcher`. + * + * @param {Object} params The object hash of parameters to validate. + * @returns {boolean} Returns `true` if `params` validates, otherwise `false`. + */ +UrlMatcher.prototype.validates = function (params) { + return this.params.$$validates(params); +}; + +/** + * @ngdoc function + * @name ui.router.util.type:UrlMatcher#format + * @methodOf ui.router.util.type:UrlMatcher + * + * @description + * Creates a URL that matches this pattern by substituting the specified values + * for the path and search parameters. Null values for path parameters are + * treated as empty strings. + * + * @example + *
+ * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });
+ * // returns '/user/bob?q=yes'
+ * 
+ * + * @param {Object} values the values to substitute for the parameters in this pattern. + * @returns {string} the formatted URL (path and optionally search part). + */ +UrlMatcher.prototype.format = function (values) { + values = values || {}; + var segments = this.segments, params = this.parameters(), paramset = this.params; + if (!this.validates(values)) return null; + + var i, search = false, nPath = segments.length - 1, nTotal = params.length, result = segments[0]; + + function encodeDashes(str) { // Replace dashes with encoded "\-" + return encodeURIComponent(str).replace(/-/g, function(c) { return '%5C%' + c.charCodeAt(0).toString(16).toUpperCase(); }); + } + + for (i = 0; i < nTotal; i++) { + var isPathParam = i < nPath; + var name = params[i], param = paramset[name], value = param.value(values[name]); + var isDefaultValue = param.isOptional && param.type.equals(param.value(), value); + var squash = isDefaultValue ? param.squash : false; + var encoded = param.type.encode(value); + + if (isPathParam) { + var nextSegment = segments[i + 1]; + if (squash === false) { + if (encoded != null) { + if (isArray(encoded)) { + result += map(encoded, encodeDashes).join("-"); + } else { + result += encodeURIComponent(encoded); + } + } + result += nextSegment; + } else if (squash === true) { + var capture = result.match(/\/$/) ? /\/?(.*)/ : /(.*)/; + result += nextSegment.match(capture)[1]; + } else if (isString(squash)) { + result += squash + nextSegment; + } + } else { + if (encoded == null || (isDefaultValue && squash !== false)) continue; + if (!isArray(encoded)) encoded = [ encoded ]; + encoded = map(encoded, encodeURIComponent).join('&' + name + '='); + result += (search ? '&' : '?') + (name + '=' + encoded); + search = true; + } + } + + return result; +}; + +/** + * @ngdoc object + * @name ui.router.util.type:Type + * + * @description + * Implements an interface to define custom parameter types that can be decoded from and encoded to + * string parameters matched in a URL. Used by {@link ui.router.util.type:UrlMatcher `UrlMatcher`} + * objects when matching or formatting URLs, or comparing or validating parameter values. + * + * See {@link ui.router.util.$urlMatcherFactory#methods_type `$urlMatcherFactory#type()`} for more + * information on registering custom types. + * + * @param {Object} config A configuration object which contains the custom type definition. The object's + * properties will override the default methods and/or pattern in `Type`'s public interface. + * @example + *
+ * {
+ *   decode: function(val) { return parseInt(val, 10); },
+ *   encode: function(val) { return val && val.toString(); },
+ *   equals: function(a, b) { return this.is(a) && a === b; },
+ *   is: function(val) { return angular.isNumber(val) isFinite(val) && val % 1 === 0; },
+ *   pattern: /\d+/
+ * }
+ * 
+ * + * @property {RegExp} pattern The regular expression pattern used to match values of this type when + * coming from a substring of a URL. + * + * @returns {Object} Returns a new `Type` object. + */ +function Type(config) { + extend(this, config); +} + +/** + * @ngdoc function + * @name ui.router.util.type:Type#is + * @methodOf ui.router.util.type:Type + * + * @description + * Detects whether a value is of a particular type. Accepts a native (decoded) value + * and determines whether it matches the current `Type` object. + * + * @param {*} val The value to check. + * @param {string} key Optional. If the type check is happening in the context of a specific + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`} object, this is the name of the + * parameter in which `val` is stored. Can be used for meta-programming of `Type` objects. + * @returns {Boolean} Returns `true` if the value matches the type, otherwise `false`. + */ +Type.prototype.is = function(val, key) { + return true; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#encode + * @methodOf ui.router.util.type:Type + * + * @description + * Encodes a custom/native type value to a string that can be embedded in a URL. Note that the + * return value does *not* need to be URL-safe (i.e. passed through `encodeURIComponent()`), it + * only needs to be a representation of `val` that has been coerced to a string. + * + * @param {*} val The value to encode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {string} Returns a string representation of `val` that can be encoded in a URL. + */ +Type.prototype.encode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#decode + * @methodOf ui.router.util.type:Type + * + * @description + * Converts a parameter value (from URL string or transition param) to a custom/native value. + * + * @param {string} val The URL parameter value to decode. + * @param {string} key The name of the parameter in which `val` is stored. Can be used for + * meta-programming of `Type` objects. + * @returns {*} Returns a custom representation of the URL parameter value. + */ +Type.prototype.decode = function(val, key) { + return val; +}; + +/** + * @ngdoc function + * @name ui.router.util.type:Type#equals + * @methodOf ui.router.util.type:Type + * + * @description + * Determines whether two decoded values are equivalent. + * + * @param {*} a A value to compare against. + * @param {*} b A value to compare against. + * @returns {Boolean} Returns `true` if the values are equivalent/equal, otherwise `false`. + */ +Type.prototype.equals = function(a, b) { + return a == b; +}; + +Type.prototype.$subPattern = function() { + var sub = this.pattern.toString(); + return sub.substr(1, sub.length - 2); +}; + +Type.prototype.pattern = /.*/; + +Type.prototype.toString = function() { return "{Type:" + this.name + "}"; }; + +/* + * Wraps an existing custom Type as an array of Type, depending on 'mode'. + * e.g.: + * - urlmatcher pattern "/path?{queryParam[]:int}" + * - url: "/path?queryParam=1&queryParam=2 + * - $stateParams.queryParam will be [1, 2] + * if `mode` is "auto", then + * - url: "/path?queryParam=1 will create $stateParams.queryParam: 1 + * - url: "/path?queryParam=1&queryParam=2 will create $stateParams.queryParam: [1, 2] + */ +Type.prototype.$asArray = function(mode, isSearch) { + if (!mode) return this; + if (mode === "auto" && !isSearch) throw new Error("'auto' array mode is for query parameters only"); + return new ArrayType(this, mode); + + function ArrayType(type, mode) { + function bindTo(type, callbackName) { + return function() { + return type[callbackName].apply(type, arguments); + }; + } + + // Wrap non-array value as array + function arrayWrap(val) { return isArray(val) ? val : (isDefined(val) ? [ val ] : []); } + // Unwrap array value for "auto" mode. Return undefined for empty array. + function arrayUnwrap(val) { + switch(val.length) { + case 0: return undefined; + case 1: return mode === "auto" ? val[0] : val; + default: return val; + } + } + function falsey(val) { return !val; } + + // Wraps type (.is/.encode/.decode) functions to operate on each value of an array + function arrayHandler(callback, allTruthyMode) { + return function handleArray(val) { + val = arrayWrap(val); + var result = map(val, callback); + if (allTruthyMode === true) + return filter(result, falsey).length === 0; + return arrayUnwrap(result); + }; + } + + // Wraps type (.equals) functions to operate on each value of an array + function arrayEqualsHandler(callback) { + return function handleArray(val1, val2) { + var left = arrayWrap(val1), right = arrayWrap(val2); + if (left.length !== right.length) return false; + for (var i = 0; i < left.length; i++) { + if (!callback(left[i], right[i])) return false; + } + return true; + }; + } + + this.encode = arrayHandler(bindTo(type, 'encode')); + this.decode = arrayHandler(bindTo(type, 'decode')); + this.is = arrayHandler(bindTo(type, 'is'), true); + this.equals = arrayEqualsHandler(bindTo(type, 'equals')); + this.pattern = type.pattern; + this.$arrayMode = mode; + } +}; + + + +/** + * @ngdoc object + * @name ui.router.util.$urlMatcherFactory + * + * @description + * Factory for {@link ui.router.util.type:UrlMatcher `UrlMatcher`} instances. The factory + * is also available to providers under the name `$urlMatcherFactoryProvider`. + */ +function $UrlMatcherFactory() { + $$UMFP = this; + + var isCaseInsensitive = false, isStrictMode = true, defaultSquashPolicy = false; + + function valToString(val) { return val != null ? val.toString().replace(/\//g, "%2F") : val; } + function valFromString(val) { return val != null ? val.toString().replace(/%2F/g, "/") : val; } +// TODO: in 1.0, make string .is() return false if value is undefined by default. +// function regexpMatches(val) { /*jshint validthis:true */ return isDefined(val) && this.pattern.test(val); } + function regexpMatches(val) { /*jshint validthis:true */ return this.pattern.test(val); } + + var $types = {}, enqueue = true, typeQueue = [], injector, defaultTypes = { + string: { + encode: valToString, + decode: valFromString, + is: regexpMatches, + pattern: /[^/]*/ + }, + int: { + encode: valToString, + decode: function(val) { return parseInt(val, 10); }, + is: function(val) { return isDefined(val) && this.decode(val.toString()) === val; }, + pattern: /\d+/ + }, + bool: { + encode: function(val) { return val ? 1 : 0; }, + decode: function(val) { return parseInt(val, 10) !== 0; }, + is: function(val) { return val === true || val === false; }, + pattern: /0|1/ + }, + date: { + encode: function (val) { + if (!this.is(val)) + return undefined; + return [ val.getFullYear(), + ('0' + (val.getMonth() + 1)).slice(-2), + ('0' + val.getDate()).slice(-2) + ].join("-"); + }, + decode: function (val) { + if (this.is(val)) return val; + var match = this.capture.exec(val); + return match ? new Date(match[1], match[2] - 1, match[3]) : undefined; + }, + is: function(val) { return val instanceof Date && !isNaN(val.valueOf()); }, + equals: function (a, b) { return this.is(a) && this.is(b) && a.toISOString() === b.toISOString(); }, + pattern: /[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/, + capture: /([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ + }, + json: { + encode: angular.toJson, + decode: angular.fromJson, + is: angular.isObject, + equals: angular.equals, + pattern: /[^/]*/ + }, + any: { // does not encode/decode + encode: angular.identity, + decode: angular.identity, + is: angular.identity, + equals: angular.equals, + pattern: /.*/ + } + }; + + function getDefaultConfig() { + return { + strict: isStrictMode, + caseInsensitive: isCaseInsensitive + }; + } + + function isInjectable(value) { + return (isFunction(value) || (isArray(value) && isFunction(value[value.length - 1]))); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + $UrlMatcherFactory.$$getDefaultValue = function(config) { + if (!isInjectable(config.value)) return config.value; + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.value); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#caseInsensitive + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URL matching should be case sensitive (the default behavior), or not. + * + * @param {boolean} value `false` to match URL in a case sensitive manner; otherwise `true`; + * @returns {boolean} the current value of caseInsensitive + */ + this.caseInsensitive = function(value) { + if (isDefined(value)) + isCaseInsensitive = value; + return isCaseInsensitive; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#strictMode + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Defines whether URLs should match trailing slashes, or not (the default behavior). + * + * @param {boolean=} value `false` to match trailing slashes in URLs, otherwise `true`. + * @returns {boolean} the current value of strictMode + */ + this.strictMode = function(value) { + if (isDefined(value)) + isStrictMode = value; + return isStrictMode; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#defaultSquashPolicy + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Sets the default behavior when generating or matching URLs with default parameter values. + * + * @param {string} value A string that defines the default parameter URL squashing behavior. + * `nosquash`: When generating an href with a default parameter value, do not squash the parameter value from the URL + * `slash`: When generating an href with a default parameter value, squash (remove) the parameter value, and, if the + * parameter is surrounded by slashes, squash (remove) one slash from the URL + * any other string, e.g. "~": When generating an href with a default parameter value, squash (remove) + * the parameter value from the URL and replace it with this string. + */ + this.defaultSquashPolicy = function(value) { + if (!isDefined(value)) return defaultSquashPolicy; + if (value !== true && value !== false && !isString(value)) + throw new Error("Invalid squash policy: " + value + ". Valid policies: false, true, arbitrary-string"); + defaultSquashPolicy = value; + return value; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#compile + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Creates a {@link ui.router.util.type:UrlMatcher `UrlMatcher`} for the specified pattern. + * + * @param {string} pattern The URL pattern. + * @param {Object} config The config object hash. + * @returns {UrlMatcher} The UrlMatcher. + */ + this.compile = function (pattern, config) { + return new UrlMatcher(pattern, extend(getDefaultConfig(), config)); + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#isMatcher + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Returns true if the specified object is a `UrlMatcher`, or false otherwise. + * + * @param {Object} object The object to perform the type check against. + * @returns {Boolean} Returns `true` if the object matches the `UrlMatcher` interface, by + * implementing all the same methods. + */ + this.isMatcher = function (o) { + if (!isObject(o)) return false; + var result = true; + + forEach(UrlMatcher.prototype, function(val, name) { + if (isFunction(val)) { + result = result && (isDefined(o[name]) && isFunction(o[name])); + } + }); + return result; + }; + + /** + * @ngdoc function + * @name ui.router.util.$urlMatcherFactory#type + * @methodOf ui.router.util.$urlMatcherFactory + * + * @description + * Registers a custom {@link ui.router.util.type:Type `Type`} object that can be used to + * generate URLs with typed parameters. + * + * @param {string} name The type name. + * @param {Object|Function} definition The type definition. See + * {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * @param {Object|Function} definitionFn (optional) A function that is injected before the app + * runtime starts. The result of this function is merged into the existing `definition`. + * See {@link ui.router.util.type:Type `Type`} for information on the values accepted. + * + * @returns {Object} Returns `$urlMatcherFactoryProvider`. + * + * @example + * This is a simple example of a custom type that encodes and decodes items from an + * array, using the array index as the URL-encoded value: + * + *
+   * var list = ['John', 'Paul', 'George', 'Ringo'];
+   *
+   * $urlMatcherFactoryProvider.type('listItem', {
+   *   encode: function(item) {
+   *     // Represent the list item in the URL using its corresponding index
+   *     return list.indexOf(item);
+   *   },
+   *   decode: function(item) {
+   *     // Look up the list item by index
+   *     return list[parseInt(item, 10)];
+   *   },
+   *   is: function(item) {
+   *     // Ensure the item is valid by checking to see that it appears
+   *     // in the list
+   *     return list.indexOf(item) > -1;
+   *   }
+   * });
+   *
+   * $stateProvider.state('list', {
+   *   url: "/list/{item:listItem}",
+   *   controller: function($scope, $stateParams) {
+   *     console.log($stateParams.item);
+   *   }
+   * });
+   *
+   * // ...
+   *
+   * // Changes URL to '/list/3', logs "Ringo" to the console
+   * $state.go('list', { item: "Ringo" });
+   * 
+ * + * This is a more complex example of a type that relies on dependency injection to + * interact with services, and uses the parameter name from the URL to infer how to + * handle encoding and decoding parameter values: + * + *
+   * // Defines a custom type that gets a value from a service,
+   * // where each service gets different types of values from
+   * // a backend API:
+   * $urlMatcherFactoryProvider.type('dbObject', {}, function(Users, Posts) {
+   *
+   *   // Matches up services to URL parameter names
+   *   var services = {
+   *     user: Users,
+   *     post: Posts
+   *   };
+   *
+   *   return {
+   *     encode: function(object) {
+   *       // Represent the object in the URL using its unique ID
+   *       return object.id;
+   *     },
+   *     decode: function(value, key) {
+   *       // Look up the object by ID, using the parameter
+   *       // name (key) to call the correct service
+   *       return services[key].findById(value);
+   *     },
+   *     is: function(object, key) {
+   *       // Check that object is a valid dbObject
+   *       return angular.isObject(object) && object.id && services[key];
+   *     }
+   *     equals: function(a, b) {
+   *       // Check the equality of decoded objects by comparing
+   *       // their unique IDs
+   *       return a.id === b.id;
+   *     }
+   *   };
+   * });
+   *
+   * // In a config() block, you can then attach URLs with
+   * // type-annotated parameters:
+   * $stateProvider.state('users', {
+   *   url: "/users",
+   *   // ...
+   * }).state('users.item', {
+   *   url: "/{user:dbObject}",
+   *   controller: function($scope, $stateParams) {
+   *     // $stateParams.user will now be an object returned from
+   *     // the Users service
+   *   },
+   *   // ...
+   * });
+   * 
+ */ + this.type = function (name, definition, definitionFn) { + if (!isDefined(definition)) return $types[name]; + if ($types.hasOwnProperty(name)) throw new Error("A type named '" + name + "' has already been defined."); + + $types[name] = new Type(extend({ name: name }, definition)); + if (definitionFn) { + typeQueue.push({ name: name, def: definitionFn }); + if (!enqueue) flushTypeQueue(); + } + return this; + }; + + // `flushTypeQueue()` waits until `$urlMatcherFactory` is injected before invoking the queued `definitionFn`s + function flushTypeQueue() { + while(typeQueue.length) { + var type = typeQueue.shift(); + if (type.pattern) throw new Error("You cannot override a type's .pattern at runtime."); + angular.extend($types[type.name], injector.invoke(type.def)); + } + } + + // Register default types. Store them in the prototype of $types. + forEach(defaultTypes, function(type, name) { $types[name] = new Type(extend({name: name}, type)); }); + $types = inherit($types, {}); + + /* No need to document $get, since it returns this */ + this.$get = ['$injector', function ($injector) { + injector = $injector; + enqueue = false; + flushTypeQueue(); + + forEach(defaultTypes, function(type, name) { + if (!$types[name]) $types[name] = new Type(type); + }); + return this; + }]; + + this.Param = function Param(id, type, config, location) { + var self = this; + config = unwrapShorthand(config); + type = getType(config, type, location); + var arrayMode = getArrayMode(); + type = arrayMode ? type.$asArray(arrayMode, location === "search") : type; + if (type.name === "string" && !arrayMode && location === "path" && config.value === undefined) + config.value = ""; // for 0.2.x; in 0.3.0+ do not automatically default to "" + var isOptional = config.value !== undefined; + var squash = getSquashPolicy(config, isOptional); + var replace = getReplace(config, arrayMode, isOptional, squash); + + function unwrapShorthand(config) { + var keys = isObject(config) ? objectKeys(config) : []; + var isShorthand = indexOf(keys, "value") === -1 && indexOf(keys, "type") === -1 && + indexOf(keys, "squash") === -1 && indexOf(keys, "array") === -1; + if (isShorthand) config = { value: config }; + config.$$fn = isInjectable(config.value) ? config.value : function () { return config.value; }; + return config; + } + + function getType(config, urlType, location) { + if (config.type && urlType) throw new Error("Param '"+id+"' has two type configurations."); + if (urlType) return urlType; + if (!config.type) return (location === "config" ? $types.any : $types.string); + return config.type instanceof Type ? config.type : new Type(config.type); + } + + // array config: param name (param[]) overrides default settings. explicit config overrides param name. + function getArrayMode() { + var arrayDefaults = { array: (location === "search" ? "auto" : false) }; + var arrayParamNomenclature = id.match(/\[\]$/) ? { array: true } : {}; + return extend(arrayDefaults, arrayParamNomenclature, config).array; + } + + /** + * returns false, true, or the squash value to indicate the "default parameter url squash policy". + */ + function getSquashPolicy(config, isOptional) { + var squash = config.squash; + if (!isOptional || squash === false) return false; + if (!isDefined(squash) || squash == null) return defaultSquashPolicy; + if (squash === true || isString(squash)) return squash; + throw new Error("Invalid squash policy: '" + squash + "'. Valid policies: false, true, or arbitrary string"); + } + + function getReplace(config, arrayMode, isOptional, squash) { + var replace, configuredKeys, defaultPolicy = [ + { from: "", to: (isOptional || arrayMode ? undefined : "") }, + { from: null, to: (isOptional || arrayMode ? undefined : "") } + ]; + replace = isArray(config.replace) ? config.replace : []; + if (isString(squash)) + replace.push({ from: squash, to: undefined }); + configuredKeys = map(replace, function(item) { return item.from; } ); + return filter(defaultPolicy, function(item) { return indexOf(configuredKeys, item.from) === -1; }).concat(replace); + } + + /** + * [Internal] Get the default value of a parameter, which may be an injectable function. + */ + function $$getDefaultValue() { + if (!injector) throw new Error("Injectable functions cannot be called at configuration time"); + return injector.invoke(config.$$fn); + } + + /** + * [Internal] Gets the decoded representation of a value if the value is defined, otherwise, returns the + * default value, which may be the result of an injectable function. + */ + function $value(value) { + function hasReplaceVal(val) { return function(obj) { return obj.from === val; }; } + function $replace(value) { + var replacement = map(filter(self.replace, hasReplaceVal(value)), function(obj) { return obj.to; }); + return replacement.length ? replacement[0] : value; + } + value = $replace(value); + return isDefined(value) ? self.type.decode(value) : $$getDefaultValue(); + } + + function toString() { return "{Param:" + id + " " + type + " squash: '" + squash + "' optional: " + isOptional + "}"; } + + extend(this, { + id: id, + type: type, + location: location, + array: arrayMode, + squash: squash, + replace: replace, + isOptional: isOptional, + value: $value, + dynamic: undefined, + config: config, + toString: toString + }); + }; + + function ParamSet(params) { + extend(this, params || {}); + } + + ParamSet.prototype = { + $$new: function() { + return inherit(this, extend(new ParamSet(), { $$parent: this})); + }, + $$keys: function () { + var keys = [], chain = [], parent = this, + ignore = objectKeys(ParamSet.prototype); + while (parent) { chain.push(parent); parent = parent.$$parent; } + chain.reverse(); + forEach(chain, function(paramset) { + forEach(objectKeys(paramset), function(key) { + if (indexOf(keys, key) === -1 && indexOf(ignore, key) === -1) keys.push(key); + }); + }); + return keys; + }, + $$values: function(paramValues) { + var values = {}, self = this; + forEach(self.$$keys(), function(key) { + values[key] = self[key].value(paramValues && paramValues[key]); + }); + return values; + }, + $$equals: function(paramValues1, paramValues2) { + var equal = true, self = this; + forEach(self.$$keys(), function(key) { + var left = paramValues1 && paramValues1[key], right = paramValues2 && paramValues2[key]; + if (!self[key].type.equals(left, right)) equal = false; + }); + return equal; + }, + $$validates: function $$validate(paramValues) { + var result = true, isOptional, val, param, self = this; + + forEach(this.$$keys(), function(key) { + param = self[key]; + val = paramValues[key]; + isOptional = !val && param.isOptional; + result = result && (isOptional || !!param.type.is(val)); + }); + return result; + }, + $$parent: undefined + }; + + this.ParamSet = ParamSet; +} + +// Register as a provider so it's available to other providers +angular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory); +angular.module('ui.router.util').run(['$urlMatcherFactory', function($urlMatcherFactory) { }]); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlRouter.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlRouter.js new file mode 100644 index 0000000..2b22937 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/urlRouter.js @@ -0,0 +1,413 @@ +/** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider + * + * @requires ui.router.util.$urlMatcherFactoryProvider + * @requires $locationProvider + * + * @description + * `$urlRouterProvider` has the responsibility of watching `$location`. + * When `$location` changes it runs through a list of rules one by one until a + * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify + * a url in a state configuration. All urls are compiled into a UrlMatcher object. + * + * There are several methods on `$urlRouterProvider` that make it useful to use directly + * in your module config. + */ +$UrlRouterProvider.$inject = ['$locationProvider', '$urlMatcherFactoryProvider']; +function $UrlRouterProvider( $locationProvider, $urlMatcherFactory) { + var rules = [], otherwise = null, interceptDeferred = false, listener; + + // Returns a string that is a prefix of all strings matching the RegExp + function regExpPrefix(re) { + var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source); + return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : ''; + } + + // Interpolates matched values into a String.replace()-style pattern + function interpolate(pattern, match) { + return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) { + return match[what === '$' ? 0 : Number(what)]; + }); + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#rule + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines rules that are used by `$urlRouterProvider` to find matches for + * specific URLs. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   // Here's an example of how you might allow case insensitive urls
+   *   $urlRouterProvider.rule(function ($injector, $location) {
+   *     var path = $location.path(),
+   *         normalized = path.toLowerCase();
+   *
+   *     if (path !== normalized) {
+   *       return normalized;
+   *     }
+   *   });
+   * });
+   * 
+ * + * @param {object} rule Handler function that takes `$injector` and `$location` + * services as arguments. You can use them to return a valid path as a string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.rule = function (rule) { + if (!isFunction(rule)) throw new Error("'rule' must be a function"); + rules.push(rule); + return this; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouterProvider#otherwise + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Defines a path that is used when an invalid route is requested. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   // if the path doesn't match any of the urls you configured
+   *   // otherwise will take care of routing the user to the
+   *   // specified url
+   *   $urlRouterProvider.otherwise('/index');
+   *
+   *   // Example of using function rule as param
+   *   $urlRouterProvider.otherwise(function ($injector, $location) {
+   *     return '/a/valid/url';
+   *   });
+   * });
+   * 
+ * + * @param {string|object} rule The url path you want to redirect to or a function + * rule that returns the url path. The function version is passed two params: + * `$injector` and `$location` services, and must return a url string. + * + * @return {object} `$urlRouterProvider` - `$urlRouterProvider` instance + */ + this.otherwise = function (rule) { + if (isString(rule)) { + var redirect = rule; + rule = function () { return redirect; }; + } + else if (!isFunction(rule)) throw new Error("'rule' must be a function"); + otherwise = rule; + return this; + }; + + + function handleIfMatch($injector, handler, match) { + if (!match) return false; + var result = $injector.invoke(handler, handler, { $match: match }); + return isDefined(result) ? result : true; + } + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#when + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Registers a handler for a given url matching. if handle is a string, it is + * treated as a redirect, and is interpolated according to the syntax of match + * (i.e. like `String.replace()` for `RegExp`, or like a `UrlMatcher` pattern otherwise). + * + * If the handler is a function, it is injectable. It gets invoked if `$location` + * matches. You have the option of inject the match object as `$match`. + * + * The handler can return + * + * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter` + * will continue trying to find another one that matches. + * - **string** which is treated as a redirect and passed to `$location.url()` + * - **void** or any **truthy** value tells `$urlRouter` that the url was handled. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *   $urlRouterProvider.when($state.url, function ($match, $stateParams) {
+   *     if ($state.$current.navigable !== state ||
+   *         !equalForKeys($match, $stateParams) {
+   *      $state.transitionTo(state, $match, false);
+   *     }
+   *   });
+   * });
+   * 
+ * + * @param {string|object} what The incoming path that you want to redirect. + * @param {string|object} handler The path you want to redirect your user to. + */ + this.when = function (what, handler) { + var redirect, handlerIsString = isString(handler); + if (isString(what)) what = $urlMatcherFactory.compile(what); + + if (!handlerIsString && !isFunction(handler) && !isArray(handler)) + throw new Error("invalid 'handler' in when()"); + + var strategies = { + matcher: function (what, handler) { + if (handlerIsString) { + redirect = $urlMatcherFactory.compile(handler); + handler = ['$match', function ($match) { return redirect.format($match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path(), $location.search())); + }, { + prefix: isString(what.prefix) ? what.prefix : '' + }); + }, + regex: function (what, handler) { + if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky"); + + if (handlerIsString) { + redirect = handler; + handler = ['$match', function ($match) { return interpolate(redirect, $match); }]; + } + return extend(function ($injector, $location) { + return handleIfMatch($injector, handler, what.exec($location.path())); + }, { + prefix: regExpPrefix(what) + }); + } + }; + + var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp }; + + for (var n in check) { + if (check[n]) return this.rule(strategies[n](what, handler)); + } + + throw new Error("invalid 'what' in when()"); + }; + + /** + * @ngdoc function + * @name ui.router.router.$urlRouterProvider#deferIntercept + * @methodOf ui.router.router.$urlRouterProvider + * + * @description + * Disables (or enables) deferring location change interception. + * + * If you wish to customize the behavior of syncing the URL (for example, if you wish to + * defer a transition but maintain the current URL), call this method at configuration time. + * Then, at run time, call `$urlRouter.listen()` after you have configured your own + * `$locationChangeSuccess` event handler. + * + * @example + *
+   * var app = angular.module('app', ['ui.router.router']);
+   *
+   * app.config(function ($urlRouterProvider) {
+   *
+   *   // Prevent $urlRouter from automatically intercepting URL changes;
+   *   // this allows you to configure custom behavior in between
+   *   // location changes and route synchronization:
+   *   $urlRouterProvider.deferIntercept();
+   *
+   * }).run(function ($rootScope, $urlRouter, UserService) {
+   *
+   *   $rootScope.$on('$locationChangeSuccess', function(e) {
+   *     // UserService is an example service for managing user state
+   *     if (UserService.isLoggedIn()) return;
+   *
+   *     // Prevent $urlRouter's default handler from firing
+   *     e.preventDefault();
+   *
+   *     UserService.handleLogin().then(function() {
+   *       // Once the user has logged in, sync the current URL
+   *       // to the router:
+   *       $urlRouter.sync();
+   *     });
+   *   });
+   *
+   *   // Configures $urlRouter's listener *after* your custom listener
+   *   $urlRouter.listen();
+   * });
+   * 
+ * + * @param {boolean} defer Indicates whether to defer location change interception. Passing + no parameter is equivalent to `true`. + */ + this.deferIntercept = function (defer) { + if (defer === undefined) defer = true; + interceptDeferred = defer; + }; + + /** + * @ngdoc object + * @name ui.router.router.$urlRouter + * + * @requires $location + * @requires $rootScope + * @requires $injector + * @requires $browser + * + * @description + * + */ + this.$get = $get; + $get.$inject = ['$location', '$rootScope', '$injector', '$browser']; + function $get( $location, $rootScope, $injector, $browser) { + + var baseHref = $browser.baseHref(), location = $location.url(), lastPushedUrl; + + function appendBasePath(url, isHtml5, absolute) { + if (baseHref === '/') return url; + if (isHtml5) return baseHref.slice(0, -1) + url; + if (absolute) return baseHref.slice(1) + url; + return url; + } + + // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree + function update(evt) { + if (evt && evt.defaultPrevented) return; + var ignoreUpdate = lastPushedUrl && $location.url() === lastPushedUrl; + lastPushedUrl = undefined; + if (ignoreUpdate) return true; + + function check(rule) { + var handled = rule($injector, $location); + + if (!handled) return false; + if (isString(handled)) $location.replace().url(handled); + return true; + } + var n = rules.length, i; + + for (i = 0; i < n; i++) { + if (check(rules[i])) return; + } + // always check otherwise last to allow dynamic updates to the set of rules + if (otherwise) check(otherwise); + } + + function listen() { + listener = listener || $rootScope.$on('$locationChangeSuccess', update); + return listener; + } + + if (!interceptDeferred) listen(); + + return { + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#sync + * @methodOf ui.router.router.$urlRouter + * + * @description + * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`. + * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event, + * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed + * with the transition by calling `$urlRouter.sync()`. + * + * @example + *
+       * angular.module('app', ['ui.router'])
+       *   .run(function($rootScope, $urlRouter) {
+       *     $rootScope.$on('$locationChangeSuccess', function(evt) {
+       *       // Halt state change from even starting
+       *       evt.preventDefault();
+       *       // Perform custom logic
+       *       var meetsRequirement = ...
+       *       // Continue with the update and state transition if logic allows
+       *       if (meetsRequirement) $urlRouter.sync();
+       *     });
+       * });
+       * 
+ */ + sync: function() { + update(); + }, + + listen: function() { + return listen(); + }, + + update: function(read) { + if (read) { + location = $location.url(); + return; + } + if ($location.url() === location) return; + + $location.url(location); + $location.replace(); + }, + + push: function(urlMatcher, params, options) { + $location.url(urlMatcher.format(params || {})); + lastPushedUrl = options && options.$$avoidResync ? $location.url() : undefined; + if (options && options.replace) $location.replace(); + }, + + /** + * @ngdoc function + * @name ui.router.router.$urlRouter#href + * @methodOf ui.router.router.$urlRouter + * + * @description + * A URL generation method that returns the compiled URL for a given + * {@link ui.router.util.type:UrlMatcher `UrlMatcher`}, populated with the provided parameters. + * + * @example + *
+       * $bob = $urlRouter.href(new UrlMatcher("/about/:person"), {
+       *   person: "bob"
+       * });
+       * // $bob == "/about/bob";
+       * 
+ * + * @param {UrlMatcher} urlMatcher The `UrlMatcher` object which is used as the template of the URL to generate. + * @param {object=} params An object of parameter values to fill the matcher's required parameters. + * @param {object=} options Options object. The options are: + * + * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl". + * + * @returns {string} Returns the fully compiled URL, or `null` if `params` fail validation against `urlMatcher` + */ + href: function(urlMatcher, params, options) { + if (!urlMatcher.validates(params)) return null; + + var isHtml5 = $locationProvider.html5Mode(); + if (angular.isObject(isHtml5)) { + isHtml5 = isHtml5.enabled; + } + + var url = urlMatcher.format(params); + options = options || {}; + + if (!isHtml5 && url !== null) { + url = "#" + $locationProvider.hashPrefix() + url; + } + url = appendBasePath(url, isHtml5, options.absolute); + + if (!options.absolute || !url) { + return url; + } + + var slash = (!isHtml5 && url ? '/' : ''), port = $location.port(); + port = (port === 80 || port === 443 ? '' : ':' + port); + + return [$location.protocol(), '://', $location.host(), port, slash, url].join(''); + } + }; + } +} + +angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/view.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/view.js new file mode 100644 index 0000000..f19a3c5 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/view.js @@ -0,0 +1,71 @@ + +$ViewProvider.$inject = []; +function $ViewProvider() { + + this.$get = $get; + /** + * @ngdoc object + * @name ui.router.state.$view + * + * @requires ui.router.util.$templateFactory + * @requires $rootScope + * + * @description + * + */ + $get.$inject = ['$rootScope', '$templateFactory']; + function $get( $rootScope, $templateFactory) { + return { + // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... }) + /** + * @ngdoc function + * @name ui.router.state.$view#load + * @methodOf ui.router.state.$view + * + * @description + * + * @param {string} name name + * @param {object} options option object. + */ + load: function load(name, options) { + var result, defaults = { + template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {} + }; + options = extend(defaults, options); + + if (options.view) { + result = $templateFactory.fromConfig(options.view, options.params, options.locals); + } + if (result && options.notify) { + /** + * @ngdoc event + * @name ui.router.state.$state#$viewContentLoading + * @eventOf ui.router.state.$view + * @eventType broadcast on root scope + * @description + * + * Fired once the view **begins loading**, *before* the DOM is rendered. + * + * @param {Object} event Event object. + * @param {Object} viewConfig The view config properties (template, controller, etc). + * + * @example + * + *
+         * $scope.$on('$viewContentLoading',
+         * function(event, viewConfig){
+         *     // Access to all the view config properties.
+         *     // and one special property 'targetView'
+         *     // viewConfig.targetView
+         * });
+         * 
+ */ + $rootScope.$broadcast('$viewContentLoading', options); + } + return result; + } + }; + } +} + +angular.module('ui.router.state').provider('$view', $ViewProvider); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewDirective.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewDirective.js new file mode 100644 index 0000000..d3cf100 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewDirective.js @@ -0,0 +1,302 @@ +/** + * @ngdoc directive + * @name ui.router.state.directive:ui-view + * + * @requires ui.router.state.$state + * @requires $compile + * @requires $controller + * @requires $injector + * @requires ui.router.state.$uiViewScroll + * @requires $document + * + * @restrict ECA + * + * @description + * The ui-view directive tells $state where to place your templates. + * + * @param {string=} name A view name. The name should be unique amongst the other views in the + * same state. You can have views of the same name that live in different states. + * + * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window + * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll + * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you + * scroll ui-view elements into view when they are populated during a state activation. + * + * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) + * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.* + * + * @param {string=} onload Expression to evaluate whenever the view updates. + * + * @example + * A view can be unnamed or named. + *
+ * 
+ * 
+ * + * + *
+ *
+ * + * You can only have one unnamed view within any template (or root html). If you are only using a + * single view and it is unnamed then you can populate it like so: + *
+ * 
+ * $stateProvider.state("home", { + * template: "

HELLO!

" + * }) + *
+ * + * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`} + * config property, by name, in this case an empty name: + *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "": {
+ *       template: "

HELLO!

" + * } + * } + * }) + *
+ * + * But typically you'll only use the views property if you name your view or have more than one view + * in the same template. There's not really a compelling reason to name a view if its the only one, + * but you could if you wanted, like so: + *
+ * 
+ *
+ *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "main": {
+ *       template: "

HELLO!

" + * } + * } + * }) + *
+ * + * Really though, you'll use views to set up multiple views: + *
+ * 
+ *
+ *
+ *
+ * + *
+ * $stateProvider.state("home", {
+ *   views: {
+ *     "": {
+ *       template: "

HELLO!

" + * }, + * "chart": { + * template: "" + * }, + * "data": { + * template: "" + * } + * } + * }) + *
+ * + * Examples for `autoscroll`: + * + *
+ * 
+ * 
+ *
+ * 
+ * 
+ * 
+ * 
+ * 
+ */ +$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll', '$interpolate']; +function $ViewDirective( $state, $injector, $uiViewScroll, $interpolate) { + + function getService() { + return ($injector.has) ? function(service) { + return $injector.has(service) ? $injector.get(service) : null; + } : function(service) { + try { + return $injector.get(service); + } catch (e) { + return null; + } + }; + } + + var service = getService(), + $animator = service('$animator'), + $animate = service('$animate'); + + // Returns a set of DOM manipulation functions based on which Angular version + // it should use + function getRenderer(attrs, scope) { + var statics = function() { + return { + enter: function (element, target, cb) { target.after(element); cb(); }, + leave: function (element, cb) { element.remove(); cb(); } + }; + }; + + if ($animate) { + return { + enter: function(element, target, cb) { + var promise = $animate.enter(element, null, target, cb); + if (promise && promise.then) promise.then(cb); + }, + leave: function(element, cb) { + var promise = $animate.leave(element, cb); + if (promise && promise.then) promise.then(cb); + } + }; + } + + if ($animator) { + var animate = $animator && $animator(scope, attrs); + + return { + enter: function(element, target, cb) {animate.enter(element, null, target); cb(); }, + leave: function(element, cb) { animate.leave(element); cb(); } + }; + } + + return statics(); + } + + var directive = { + restrict: 'ECA', + terminal: true, + priority: 400, + transclude: 'element', + compile: function (tElement, tAttrs, $transclude) { + return function (scope, $element, attrs) { + var previousEl, currentEl, currentScope, latestLocals, + onloadExp = attrs.onload || '', + autoScrollExp = attrs.autoscroll, + renderer = getRenderer(attrs, scope); + + scope.$on('$stateChangeSuccess', function() { + updateView(false); + }); + scope.$on('$viewContentLoading', function() { + updateView(false); + }); + + updateView(true); + + function cleanupLastView() { + if (previousEl) { + previousEl.remove(); + previousEl = null; + } + + if (currentScope) { + currentScope.$destroy(); + currentScope = null; + } + + if (currentEl) { + renderer.leave(currentEl, function() { + previousEl = null; + }); + + previousEl = currentEl; + currentEl = null; + } + } + + function updateView(firstTime) { + var newScope, + name = getUiViewName(scope, attrs, $element, $interpolate), + previousLocals = name && $state.$current && $state.$current.locals[name]; + + if (!firstTime && previousLocals === latestLocals) return; // nothing to do + newScope = scope.$new(); + latestLocals = $state.$current.locals[name]; + + var clone = $transclude(newScope, function(clone) { + renderer.enter(clone, $element, function onUiViewEnter() { + if(currentScope) { + currentScope.$emit('$viewContentAnimationEnded'); + } + + if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) { + $uiViewScroll(clone); + } + }); + cleanupLastView(); + }); + + currentEl = clone; + currentScope = newScope; + /** + * @ngdoc event + * @name ui.router.state.directive:ui-view#$viewContentLoaded + * @eventOf ui.router.state.directive:ui-view + * @eventType emits on ui-view directive scope + * @description * + * Fired once the view is **loaded**, *after* the DOM is rendered. + * + * @param {Object} event Event object. + */ + currentScope.$emit('$viewContentLoaded'); + currentScope.$eval(onloadExp); + } + }; + } + }; + + return directive; +} + +$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state', '$interpolate']; +function $ViewDirectiveFill ( $compile, $controller, $state, $interpolate) { + return { + restrict: 'ECA', + priority: -400, + compile: function (tElement) { + var initial = tElement.html(); + return function (scope, $element, attrs) { + var current = $state.$current, + name = getUiViewName(scope, attrs, $element, $interpolate), + locals = current && current.locals[name]; + + if (! locals) { + return; + } + + $element.data('$uiView', { name: name, state: locals.$$state }); + $element.html(locals.$template ? locals.$template : initial); + + var link = $compile($element.contents()); + + if (locals.$$controller) { + locals.$scope = scope; + var controller = $controller(locals.$$controller, locals); + if (locals.$$controllerAs) { + scope[locals.$$controllerAs] = controller; + } + $element.data('$ngControllerController', controller); + $element.children().data('$ngControllerController', controller); + } + + link(scope); + }; + } + }; +} + +/** + * Shared ui-view code for both directives: + * Given scope, element, and its attributes, return the view's name + */ +function getUiViewName(scope, attrs, element, $interpolate) { + var name = $interpolate(attrs.uiView || attrs.name || '')(scope); + var inherited = element.inheritedData('$uiView'); + return name.indexOf('@') >= 0 ? name : (name + '@' + (inherited ? inherited.state.name : '')); +} + +angular.module('ui.router.state').directive('uiView', $ViewDirective); +angular.module('ui.router.state').directive('uiView', $ViewDirectiveFill); diff --git a/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewScroll.js b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewScroll.js new file mode 100644 index 0000000..dfe0a03 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-ui-router/src/viewScroll.js @@ -0,0 +1,52 @@ +/** + * @ngdoc object + * @name ui.router.state.$uiViewScrollProvider + * + * @description + * Provider that returns the {@link ui.router.state.$uiViewScroll} service function. + */ +function $ViewScrollProvider() { + + var useAnchorScroll = false; + + /** + * @ngdoc function + * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll + * @methodOf ui.router.state.$uiViewScrollProvider + * + * @description + * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for + * scrolling based on the url anchor. + */ + this.useAnchorScroll = function () { + useAnchorScroll = true; + }; + + /** + * @ngdoc object + * @name ui.router.state.$uiViewScroll + * + * @requires $anchorScroll + * @requires $timeout + * + * @description + * When called with a jqLite element, it scrolls the element into view (after a + * `$timeout` so the DOM has time to refresh). + * + * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor, + * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}. + */ + this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) { + if (useAnchorScroll) { + return $anchorScroll; + } + + return function ($element) { + $timeout(function () { + $element[0].scrollIntoView(); + }, 0, false); + }; + }]; +} + +angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider); diff --git a/src/MCM.KidsIdApp/www/lib/angular/.bower.json b/src/MCM.KidsIdApp/www/lib/angular/.bower.json new file mode 100644 index 0000000..02a61a8 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular/.bower.json @@ -0,0 +1,17 @@ +{ + "name": "angular", + "version": "1.4.3", + "main": "./angular.js", + "ignore": [], + "dependencies": {}, + "homepage": "https://github.com/angular/bower-angular", + "_release": "1.4.3", + "_resolution": { + "type": "version", + "tag": "v1.4.3", + "commit": "dbd689e8103a6366e53e1f6786727f7c65ccfd75" + }, + "_source": "git://github.com/angular/bower-angular.git", + "_target": "1.4.3", + "_originalSource": "angular" +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp/www/lib/angular/README.md b/src/MCM.KidsIdApp/www/lib/angular/README.md new file mode 100644 index 0000000..d1bc0ed --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular/README.md @@ -0,0 +1,64 @@ +# packaged angular + +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). +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 +``` + +Then add a ` +``` + +Or `require('angular')` from your code. + +### bower + +```shell +bower install angular +``` + +Then add a ` +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/). + +## 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/src/MCM.KidsIdApp/www/lib/angular/angular-csp.css b/src/MCM.KidsIdApp/www/lib/angular/angular-csp.css new file mode 100644 index 0000000..f3cd926 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular/angular-csp.css @@ -0,0 +1,21 @@ +/* Include this file in your html if you are using the CSP mode. */ + +@charset "UTF-8"; + +[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], +.ng-cloak, .x-ng-cloak, +.ng-hide:not(.ng-hide-animate) { + display: none !important; +} + +ng\:form { + display: block; +} + +.ng-animate-shim { + visibility:hidden; +} + +.ng-anchor { + position:absolute; +} diff --git a/src/MCM.KidsIdApp/www/lib/angular/angular.js b/src/MCM.KidsIdApp/www/lib/angular/angular.js new file mode 100644 index 0000000..f7442c0 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular/angular.js @@ -0,0 +1,28364 @@ +/** + * @license AngularJS v1.4.3 + * (c) 2010-2015 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, document, undefined) {'use strict'; + +/** + * @description + * + * This object provides a utility for producing rich Error messages within + * Angular. It can be called as follows: + * + * var exampleMinErr = minErr('example'); + * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); + * + * The above creates an instance of minErr in the example namespace. The + * resulting error will have a namespaced error code of example.one. The + * resulting error will replace {0} with the value of foo, and {1} with the + * value of bar. The object is not restricted in the number of arguments it can + * take. + * + * If fewer arguments are specified than necessary for interpolation, the extra + * interpolation markers will be preserved in the final string. + * + * Since data will be parsed statically during a build step, some restrictions + * are applied with respect to how minErr instances are created and called. + * Instances should have names of the form namespaceMinErr for a minErr created + * using minErr('namespace') . Error codes, namespaces and template strings + * should all be static strings, not variables or general expressions. + * + * @param {string} module The namespace to use for the new minErr instance. + * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning + * error from returned function, for cases when a particular type of error is useful. + * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance + */ + +function minErr(module, ErrorConstructor) { + ErrorConstructor = ErrorConstructor || Error; + return function() { + var SKIP_INDEXES = 2; + + var templateArgs = arguments, + code = templateArgs[0], + message = '[' + (module ? module + ':' : '') + code + '] ', + template = templateArgs[1], + paramPrefix, i; + + message += template.replace(/\{\d+\}/g, function(match) { + var index = +match.slice(1, -1), + shiftedIndex = index + SKIP_INDEXES; + + if (shiftedIndex < templateArgs.length) { + return toDebugString(templateArgs[shiftedIndex]); + } + + return match; + }); + + message += '\nhttp://errors.angularjs.org/1.4.3/' + + (module ? module + '/' : '') + code; + + for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') { + message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' + + encodeURIComponent(toDebugString(templateArgs[i])); + } + + return new ErrorConstructor(message); + }; +} + +/* We need to tell jshint what variables are being exported */ +/* global angular: true, + msie: true, + jqLite: true, + jQuery: true, + slice: true, + splice: true, + push: true, + toString: true, + ngMinErr: true, + angularModule: true, + uid: true, + REGEX_STRING_REGEXP: true, + VALIDITY_STATE_PROPERTY: true, + + lowercase: true, + uppercase: true, + manualLowercase: true, + manualUppercase: true, + nodeName_: true, + isArrayLike: true, + forEach: true, + forEachSorted: true, + reverseParams: true, + nextUid: true, + setHashKey: true, + extend: true, + toInt: true, + inherit: true, + merge: true, + noop: true, + identity: true, + valueFn: true, + isUndefined: true, + isDefined: true, + isObject: true, + isBlankObject: true, + isString: true, + isNumber: true, + isDate: true, + isArray: true, + isFunction: true, + isRegExp: true, + isWindow: true, + isScope: true, + isFile: true, + isFormData: true, + isBlob: true, + isBoolean: true, + isPromiseLike: true, + trim: true, + escapeForRegexp: true, + isElement: true, + makeMap: true, + includes: true, + arrayRemove: true, + copy: true, + shallowCopy: true, + equals: true, + csp: true, + jq: true, + concat: true, + sliceArgs: true, + bind: true, + toJsonReplacer: true, + toJson: true, + fromJson: true, + convertTimezoneToLocal: true, + timezoneToOffset: true, + startingTag: true, + tryDecodeURIComponent: true, + parseKeyValue: true, + toKeyValue: true, + encodeUriSegment: true, + encodeUriQuery: true, + angularInit: true, + bootstrap: true, + getTestability: true, + snake_case: true, + bindJQuery: true, + assertArg: true, + assertArgFn: true, + assertNotHasOwnProperty: true, + getter: true, + getBlockNodes: true, + hasOwnProperty: true, + createMap: true, + + NODE_TYPE_ELEMENT: true, + NODE_TYPE_ATTRIBUTE: true, + NODE_TYPE_TEXT: true, + NODE_TYPE_COMMENT: true, + NODE_TYPE_DOCUMENT: true, + NODE_TYPE_DOCUMENT_FRAGMENT: true, +*/ + +//////////////////////////////////// + +/** + * @ngdoc module + * @name ng + * @module ng + * @description + * + * # ng (core module) + * The ng module is loaded by default when an AngularJS application is started. The module itself + * contains the essential components for an AngularJS application to function. The table below + * lists a high level breakdown of each of the services/factories, filters, directives and testing + * components available within this core module. + * + *
+ */ + +var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/; + +// The name of a form control's ValidityState property. +// This is used so that it's possible for internal tests to create mock ValidityStates. +var VALIDITY_STATE_PROPERTY = 'validity'; + +/** + * @ngdoc function + * @name angular.lowercase + * @module ng + * @kind function + * + * @description Converts the specified string to lowercase. + * @param {string} string String to be converted to lowercase. + * @returns {string} Lowercased string. + */ +var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;}; +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * @ngdoc function + * @name angular.uppercase + * @module ng + * @kind function + * + * @description Converts the specified string to uppercase. + * @param {string} string String to be converted to uppercase. + * @returns {string} Uppercased string. + */ +var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;}; + + +var manualLowercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) + : s; +}; +var manualUppercase = function(s) { + /* jshint bitwise: false */ + return isString(s) + ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) + : s; +}; + + +// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish +// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods +// with correct but slower alternatives. +if ('i' !== 'I'.toLowerCase()) { + lowercase = manualLowercase; + uppercase = manualUppercase; +} + + +var + msie, // holds major version number for IE, or NaN if UA is not IE. + jqLite, // delay binding since jQuery could be loaded after us. + jQuery, // delay binding + slice = [].slice, + splice = [].splice, + push = [].push, + toString = Object.prototype.toString, + getPrototypeOf = Object.getPrototypeOf, + ngMinErr = minErr('ng'), + + /** @name angular */ + angular = window.angular || (window.angular = {}), + angularModule, + uid = 0; + +/** + * documentMode is an IE-only property + * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx + */ +msie = document.documentMode; + + +/** + * @private + * @param {*} obj + * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, + * String ...) + */ +function isArrayLike(obj) { + if (obj == null || isWindow(obj)) { + return false; + } + + // Support: iOS 8.2 (not reproducible in simulator) + // "length" in obj used to prevent JIT error (gh-11508) + var length = "length" in Object(obj) && obj.length; + + if (obj.nodeType === NODE_TYPE_ELEMENT && length) { + return true; + } + + return isString(obj) || isArray(obj) || length === 0 || + typeof length === 'number' && length > 0 && (length - 1) in obj; +} + +/** + * @ngdoc function + * @name angular.forEach + * @module ng + * @kind function + * + * @description + * Invokes the `iterator` function once for each item in `obj` collection, which can be either an + * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value` + * is the value of an object property or an array element, `key` is the object property key or + * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional. + * + * It is worth noting that `.forEach` does not iterate over inherited properties because it filters + * using the `hasOwnProperty` method. + * + * 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 + * return the value provided. + * + ```js + var values = {name: 'misko', gender: 'male'}; + var log = []; + angular.forEach(values, function(value, key) { + this.push(key + ': ' + value); + }, log); + expect(log).toEqual(['name: misko', 'gender: male']); + ``` + * + * @param {Object|Array} obj Object to iterate over. + * @param {Function} iterator Iterator function. + * @param {Object=} context Object to become context (`this`) for the iterator function. + * @returns {Object|Array} Reference to `obj`. + */ + +function forEach(obj, iterator, context) { + var key, length; + if (obj) { + if (isFunction(obj)) { + 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))) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (isArray(obj) || isArrayLike(obj)) { + var isPrimitive = typeof obj !== 'object'; + for (key = 0, length = obj.length; key < length; key++) { + if (isPrimitive || key in obj) { + iterator.call(context, obj[key], key, obj); + } + } + } else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context, obj); + } else if (isBlankObject(obj)) { + // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty + for (key in obj) { + iterator.call(context, obj[key], key, obj); + } + } else if (typeof obj.hasOwnProperty === 'function') { + // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key, obj); + } + } + } else { + // Slow path for objects which do not have a method `hasOwnProperty` + for (key in obj) { + if (hasOwnProperty.call(obj, key)) { + iterator.call(context, obj[key], key, obj); + } + } + } + } + return obj; +} + +function forEachSorted(obj, iterator, context) { + var keys = Object.keys(obj).sort(); + for (var i = 0; i < keys.length; i++) { + iterator.call(context, obj[keys[i]], keys[i]); + } + return keys; +} + + +/** + * when using forEach the params are value, key, but it is often useful to have key, value. + * @param {function(string, *)} iteratorFn + * @returns {function(*, string)} + */ +function reverseParams(iteratorFn) { + return function(value, key) { iteratorFn(key, value); }; +} + +/** + * A consistent way of creating unique IDs in angular. + * + * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before + * we hit number precision issues in JavaScript. + * + * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M + * + * @returns {number} an unique alpha-numeric string + */ +function nextUid() { + return ++uid; +} + + +/** + * Set or clear the hashkey for an object. + * @param obj object + * @param h the hashkey (!truthy to delete the hashkey) + */ +function setHashKey(obj, h) { + if (h) { + obj.$$hashKey = h; + } else { + delete obj.$$hashKey; + } +} + + +function baseExtend(dst, objs, deep) { + var h = dst.$$hashKey; + + for (var i = 0, ii = objs.length; i < ii; ++i) { + var obj = objs[i]; + if (!isObject(obj) && !isFunction(obj)) continue; + var keys = Object.keys(obj); + for (var j = 0, jj = keys.length; j < jj; j++) { + var key = keys[j]; + var src = obj[key]; + + if (deep && isObject(src)) { + if (isDate(src)) { + dst[key] = new Date(src.valueOf()); + } else { + if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {}; + baseExtend(dst[key], [src], true); + } + } else { + dst[key] = src; + } + } + } + + setHashKey(dst, h); + return dst; +} + +/** + * @ngdoc function + * @name angular.extend + * @module ng + * @kind function + * + * @description + * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s) + * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so + * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`. + * + * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use + * {@link angular.merge} for this. + * + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ +function extend(dst) { + return baseExtend(dst, slice.call(arguments, 1), false); +} + + +/** +* @ngdoc function +* @name angular.merge +* @module ng +* @kind function +* +* @description +* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s) +* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so +* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`. +* +* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source +* objects, performing a deep copy. +* +* @param {Object} dst Destination object. +* @param {...Object} src Source object(s). +* @returns {Object} Reference to `dst`. +*/ +function merge(dst) { + return baseExtend(dst, slice.call(arguments, 1), true); +} + + + +function toInt(str) { + return parseInt(str, 10); +} + + +function inherit(parent, extra) { + return extend(Object.create(parent), extra); +} + +/** + * @ngdoc function + * @name angular.noop + * @module ng + * @kind function + * + * @description + * A function that performs no operations. This function can be useful when writing code in the + * functional style. + ```js + function foo(callback) { + var result = calculateResult(); + (callback || angular.noop)(result); + } + ``` + */ +function noop() {} +noop.$inject = []; + + +/** + * @ngdoc function + * @name angular.identity + * @module ng + * @kind function + * + * @description + * A function that returns its first argument. This function is useful when writing code in the + * functional style. + * + ```js + function transformer(transformationFn, value) { + return (transformationFn || angular.identity)(value); + }; + ``` + * @param {*} value to be returned. + * @returns {*} the value passed in. + */ +function identity($) {return $;} +identity.$inject = []; + + +function valueFn(value) {return function() {return value;};} + +function hasCustomToString(obj) { + return isFunction(obj.toString) && obj.toString !== Object.prototype.toString; +} + + +/** + * @ngdoc function + * @name angular.isUndefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is undefined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is undefined. + */ +function isUndefined(value) {return typeof value === 'undefined';} + + +/** + * @ngdoc function + * @name angular.isDefined + * @module ng + * @kind function + * + * @description + * Determines if a reference is defined. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is defined. + */ +function isDefined(value) {return typeof value !== 'undefined';} + + +/** + * @ngdoc function + * @name angular.isObject + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not + * considered to be objects. Note that JavaScript arrays are objects. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Object` but not `null`. + */ +function isObject(value) { + // http://jsperf.com/isobject4 + return value !== null && typeof value === 'object'; +} + + +/** + * Determine if a value is an object with a null prototype + * + * @returns {boolean} True if `value` is an `Object` with a null prototype + */ +function isBlankObject(value) { + return value !== null && typeof value === 'object' && !getPrototypeOf(value); +} + + +/** + * @ngdoc function + * @name angular.isString + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `String`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `String`. + */ +function isString(value) {return typeof value === 'string';} + + +/** + * @ngdoc function + * @name angular.isNumber + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Number`. + * + * This includes the "special" numbers `NaN`, `+Infinity` and `-Infinity`. + * + * If you wish to exclude these then you can use the native + * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite) + * method. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Number`. + */ +function isNumber(value) {return typeof value === 'number';} + + +/** + * @ngdoc function + * @name angular.isDate + * @module ng + * @kind function + * + * @description + * Determines if a value is a date. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Date`. + */ +function isDate(value) { + return toString.call(value) === '[object Date]'; +} + + +/** + * @ngdoc function + * @name angular.isArray + * @module ng + * @kind function + * + * @description + * Determines if a reference is an `Array`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is an `Array`. + */ +var isArray = Array.isArray; + +/** + * @ngdoc function + * @name angular.isFunction + * @module ng + * @kind function + * + * @description + * Determines if a reference is a `Function`. + * + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `Function`. + */ +function isFunction(value) {return typeof value === 'function';} + + +/** + * Determines if a value is a regular expression object. + * + * @private + * @param {*} value Reference to check. + * @returns {boolean} True if `value` is a `RegExp`. + */ +function isRegExp(value) { + return toString.call(value) === '[object RegExp]'; +} + + +/** + * Checks if `obj` is a window object. + * + * @private + * @param {*} obj Object to check + * @returns {boolean} True if `obj` is a window obj. + */ +function isWindow(obj) { + return obj && obj.window === obj; +} + + +function isScope(obj) { + return obj && obj.$evalAsync && obj.$watch; +} + + +function isFile(obj) { + return toString.call(obj) === '[object File]'; +} + + +function isFormData(obj) { + return toString.call(obj) === '[object FormData]'; +} + + +function isBlob(obj) { + return toString.call(obj) === '[object Blob]'; +} + + +function isBoolean(value) { + return typeof value === 'boolean'; +} + + +function isPromiseLike(obj) { + return obj && isFunction(obj.then); +} + + +var TYPED_ARRAY_REGEXP = /^\[object (Uint8(Clamped)?)|(Uint16)|(Uint32)|(Int8)|(Int16)|(Int32)|(Float(32)|(64))Array\]$/; +function isTypedArray(value) { + return TYPED_ARRAY_REGEXP.test(toString.call(value)); +} + + +var trim = function(value) { + return isString(value) ? value.trim() : value; +}; + +// Copied from: +// 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(/([-()\[\]{}+?*.$\^|,:#= 0) { + array.splice(index, 1); + } + return index; +} + +/** + * @ngdoc function + * @name angular.copy + * @module ng + * @kind function + * + * @description + * Creates a deep copy of `source`, which should be an object or an array. + * + * * If no destination is supplied, a copy of the object or array is created. + * * If a destination is provided, all of its elements (for arrays) or properties (for objects) + * are deleted and then all elements/properties from the source are copied to it. + * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. + * * If `source` is identical to 'destination' an exception will be thrown. + * + * @param {*} source The source that will be used to make a copy. + * Can be any type, including primitives, `null`, and `undefined`. + * @param {(Object|Array)=} destination Destination into which the source is copied. If + * provided, must be of the same type as `source`. + * @returns {*} The copy or updated `destination`, if `destination` was specified. + * + * @example + + +
+
+ Name:
+ E-mail:
+ Gender: male + female
+ + +
+
form = {{user | json}}
+
master = {{master | json}}
+
+ + +
+
+ */ +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."); + } + + 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 { + var emptyObject = Object.create(getPrototypeOf(source)); + return copy(source, emptyObject, stackSource, stackDest); + } + + if (stackDest) { + stackSource.push(source); + stackDest.push(destination); + } + } + } 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); + } + + var result, key; + if (isArray(source)) { + destination.length = 0; + for (var i = 0; i < source.length; i++) { + destination.push(copy(source[i], null, stackSource, stackDest)); + } + } 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); + } + } + } + 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]; + } + } + } + + return dst || src; +} + + +/** + * @ngdoc function + * @name angular.equals + * @module ng + * @kind function + * + * @description + * Determines if two objects or two values are equivalent. Supports value types, regular + * expressions, arrays and objects. + * + * Two objects or values are considered equivalent if at least one of the following is true: + * + * * Both objects or values pass `===` comparison. + * * Both objects or values are of the same type and all of their properties are equal by + * comparing them with `angular.equals`. + * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) + * * Both values represent the same regular expression (In JavaScript, + * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual + * representation matches). + * + * During a property comparison, properties of `function` type and properties with names + * that begin with `$` are ignored. + * + * Scope and DOMWindow objects are being compared only by identify (`===`). + * + * @param {*} o1 Object or value to compare. + * @param {*} o2 Object or value to compare. + * @returns {boolean} True if arguments are equal. + */ +function equals(o1, o2) { + if (o1 === o2) return true; + if (o1 === null || o2 === null) return false; + 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 (!equals(o1[key], o2[key])) return false; + keySet[key] = true; + } + for (key in o2) { + if (!(key in keySet) && + key.charAt(0) !== '$' && + o2[key] !== undefined && + !isFunction(o2[key])) return false; + } + return true; + } + } + } + return false; +} + +var csp = function() { + if (isDefined(csp.isActive_)) return csp.isActive_; + + var active = !!(document.querySelector('[ng-csp]') || + document.querySelector('[data-ng-csp]')); + + if (!active) { + try { + /* jshint -W031, -W054 */ + new Function(''); + /* jshint +W031, +W054 */ + } catch (e) { + active = true; + } + } + + return (csp.isActive_ = active); +}; + +/** + * @ngdoc directive + * @module ng + * @name ngJq + * + * @element ANY + * @param {string=} ngJq the name of the library available under `window` + * to be used for angular.element + * @description + * Use this directive to force the angular.element library. This should be + * used to force either jqLite by leaving ng-jq blank or setting the name of + * the jquery variable under window (eg. jQuery). + * + * Since angular looks for this directive when it is loaded (doesn't wait for the + * DOMContentLoaded event), it must be placed on an element that comes before the script + * which loads angular. Also, only the first instance of `ng-jq` will be used and all + * others ignored. + * + * @example + * This example shows how to force jqLite using the `ngJq` directive to the `html` tag. + ```html + + + ... + ... + + ``` + * @example + * This example shows how to use a jQuery based library of a different name. + * The library name must be available at the top most 'window'. + ```html + + + ... + ... + + ``` + */ +var jq = function() { + if (isDefined(jq.name_)) return jq.name_; + var el; + var i, ii = ngAttrPrefixes.length, prefix, name; + for (i = 0; i < ii; ++i) { + prefix = ngAttrPrefixes[i]; + if (el = document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) { + name = el.getAttribute(prefix + 'jq'); + break; + } + } + + return (jq.name_ = name); +}; + +function concat(array1, array2, index) { + return array1.concat(slice.call(array2, index)); +} + +function sliceArgs(args, startIndex) { + return slice.call(args, startIndex || 0); +} + + +/* jshint -W101 */ +/** + * @ngdoc function + * @name angular.bind + * @module ng + * @kind function + * + * @description + * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for + * `fn`). You can supply optional `args` that are prebound to the function. This feature is also + * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as + * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). + * + * @param {Object} self Context which `fn` should be evaluated in. + * @param {function()} fn Function to be bound. + * @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)) { + return curryArgs.length + ? function() { + return arguments.length + ? fn.apply(self, concat(curryArgs, arguments, 0)) + : fn.apply(self, curryArgs); + } + : function() { + return arguments.length + ? fn.apply(self, arguments) + : fn.call(self); + }; + } else { + // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) + return fn; + } +} + + +function toJsonReplacer(key, value) { + var val = value; + + if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +} + + +/** + * @ngdoc function + * @name angular.toJson + * @module ng + * @kind function + * + * @description + * 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 {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`. + */ +function toJson(obj, pretty) { + if (typeof obj === 'undefined') return undefined; + if (!isNumber(pretty)) { + pretty = pretty ? 2 : null; + } + return JSON.stringify(obj, toJsonReplacer, pretty); +} + + +/** + * @ngdoc function + * @name angular.fromJson + * @module ng + * @kind function + * + * @description + * Deserializes a JSON string. + * + * @param {string} json JSON string to deserialize. + * @returns {Object|Array|string|number} Deserialized JSON string. + */ +function fromJson(json) { + return isString(json) + ? JSON.parse(json) + : json; +} + + +function timezoneToOffset(timezone, fallback) { + var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000; + return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset; +} + + +function addDateMinutes(date, minutes) { + date = new Date(date.getTime()); + date.setMinutes(date.getMinutes() + minutes); + return date; +} + + +function convertTimezoneToLocal(date, timezone, reverse) { + reverse = reverse ? -1 : 1; + var timezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); + return addDateMinutes(date, reverse * (timezoneOffset - date.getTimezoneOffset())); +} + + +/** + * @returns {string} Returns the string representation of the element. + */ +function startingTag(element) { + element = jqLite(element).clone(); + try { + // 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) {} + 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); }); + } catch (e) { + return lowercase(elemHtml); + } + +} + + +///////////////////////////////////////////////// + +/** + * Tries to decode the URI component without throwing an exception. + * + * @private + * @param str value potential URI component to check. + * @returns {boolean} True if `value` can be decoded + * with the decodeURIComponent function. + */ +function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch (e) { + // Ignore any invalid uri component + } +} + + +/** + * Parses an escaped url query string into key-value pairs. + * @returns {Object.} + */ +function parseKeyValue(/**string*/keyValue) { + var obj = {}, key_value, key; + forEach((keyValue || "").split('&'), function(keyValue) { + if (keyValue) { + key_value = keyValue.replace(/\+/g,'%20').split('='); + key = tryDecodeURIComponent(key_value[0]); + if (isDefined(key)) { + var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; + if (!hasOwnProperty.call(obj, key)) { + obj[key] = val; + } else if (isArray(obj[key])) { + obj[key].push(val); + } else { + obj[key] = [obj[key],val]; + } + } + } + }); + return obj; +} + +function toKeyValue(obj) { + var parts = []; + forEach(obj, function(value, key) { + if (isArray(value)) { + forEach(value, function(arrayValue) { + parts.push(encodeUriQuery(key, true) + + (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); + }); + } else { + parts.push(encodeUriQuery(key, true) + + (value === true ? '' : '=' + encodeUriQuery(value, true))); + } + }); + return parts.length ? parts.join('&') : ''; +} + + +/** + * We need our custom method because encodeURIComponent is too aggressive and doesn't follow + * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path + * segments: + * segment = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * pct-encoded = "%" HEXDIG HEXDIG + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriSegment(val) { + return encodeUriQuery(val, true). + replace(/%26/gi, '&'). + replace(/%3D/gi, '='). + replace(/%2B/gi, '+'); +} + + +/** + * This method is intended for encoding *key* or *value* parts of query component. We need a custom + * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be + * encoded per http://tools.ietf.org/html/rfc3986: + * query = *( pchar / "/" / "?" ) + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + */ +function encodeUriQuery(val, pctEncodeSpaces) { + return encodeURIComponent(val). + replace(/%40/gi, '@'). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%3B/gi, ';'). + replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); +} + +var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; + +function getNgAttribute(element, ngAttr) { + var attr, i, ii = ngAttrPrefixes.length; + for (i = 0; i < ii; ++i) { + attr = ngAttrPrefixes[i] + ngAttr; + if (isString(attr = element.getAttribute(attr))) { + return attr; + } + } + return null; +} + +/** + * @ngdoc directive + * @name ngApp + * @module ng + * + * @element ANY + * @param {angular.Module} ngApp an optional application + * {@link angular.module module} name to load. + * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be + * created in "strict-di" mode. This means that the application will fail to invoke functions which + * do not use explicit function annotation (and are thus unsuitable for minification), as described + * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in + * tracking down the root of these bugs. + * + * @description + * + * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive + * 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. + * + * 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 + * should contain the application code needed or have dependencies on other modules that will + * contain the code. See {@link angular.module} for more information. + * + * In the example below if the `ngApp` directive were not placed on the `html` element then the + * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` + * would not be resolved to `3`. + * + * `ngApp` is the easiest, and most common way to bootstrap an application. + * + + +
+ I can add: {{a}} + {{b}} = {{ a+b }} +
+
+ + angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }); + +
+ * + * Using `ngStrictDi`, you would see something like this: + * + + +
+
+ I can add: {{a}} + {{b}} = {{ a+b }} + +

This renders because the controller does not fail to + instantiate, by using explicit annotation style (see + script.js for details) +

+
+ +
+ Name:
+ Hello, {{name}}! + +

This renders because the controller does not fail to + instantiate, by using explicit annotation style + (see script.js for details) +

+
+ +
+ I can add: {{a}} + {{b}} = {{ a+b }} + +

The controller could not be instantiated, due to relying + on automatic function annotations (which are disabled in + strict mode). As such, the content of this section is not + interpolated, and there should be an error in your web console. +

+
+
+
+ + angular.module('ngAppStrictDemo', []) + // BadController will fail to instantiate, due to relying on automatic function annotation, + // rather than an explicit annotation + .controller('BadController', function($scope) { + $scope.a = 1; + $scope.b = 2; + }) + // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, + // due to using explicit annotations using the array style and $inject property, respectively. + .controller('GoodController1', ['$scope', function($scope) { + $scope.a = 1; + $scope.b = 2; + }]) + .controller('GoodController2', GoodController2); + function GoodController2($scope) { + $scope.name = "World"; + } + GoodController2.$inject = ['$scope']; + + + div[ng-controller] { + margin-bottom: 1em; + -webkit-border-radius: 4px; + border-radius: 4px; + border: 1px solid; + padding: .5em; + } + div[ng-controller^=Good] { + border-color: #d6e9c6; + background-color: #dff0d8; + color: #3c763d; + } + div[ng-controller^=Bad] { + border-color: #ebccd1; + background-color: #f2dede; + color: #a94442; + margin-bottom: 0; + } + +
+ */ +function angularInit(element, bootstrap) { + var appElement, + module, + config = {}; + + // The element `element` has priority over any other element + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + + if (!appElement && element.hasAttribute && element.hasAttribute(name)) { + appElement = element; + module = element.getAttribute(name); + } + }); + forEach(ngAttrPrefixes, function(prefix) { + var name = prefix + 'app'; + var candidate; + + if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { + appElement = candidate; + module = candidate.getAttribute(name); + } + }); + if (appElement) { + config.strictDi = getNgAttribute(appElement, "strict-di") !== null; + bootstrap(appElement, module ? [module] : [], config); + } +} + +/** + * @ngdoc function + * @name angular.bootstrap + * @module ng + * @description + * Use this function to manually start up angular application. + * + * See: {@link guide/bootstrap Bootstrap} + * + * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually. + * They must use {@link ng.directive:ngApp ngApp}. + * + * Angular will detect if it has been loaded into the browser more than once and only allow the + * first loaded script to be bootstrapped and will report a warning to the browser console for + * each of the subsequent scripts. This prevents strange results in applications, where otherwise + * multiple instances of Angular try to work on the DOM. + * + * ```html + * + * + * + *
+ * {{greeting}} + *
+ * + * + * + * + * + * ``` + * + * @param {DOMElement} element DOM element which is the root of angular application. + * @param {Array=} modules an array of modules to load into the application. + * Each item in the array should be the name of a predefined module or a (DI annotated) + * function that will be invoked by the injector as a `config` block. + * See: {@link angular.module modules} + * @param {Object=} config an object for defining configuration options for the application. The + * following keys are supported: + * + * * `strictDi` - disable automatic function annotation for the application. This is meant to + * assist in finding bugs which break minified code. Defaults to `false`. + * + * @returns {auto.$injector} Returns the newly created injector for this app. + */ +function bootstrap(element, modules, config) { + if (!isObject(config)) config = {}; + var defaultConfig = { + strictDi: false + }; + config = extend(defaultConfig, config); + var doBootstrap = function() { + element = jqLite(element); + + if (element.injector()) { + var tag = (element[0] === document) ? 'document' : startingTag(element); + //Encode angle brackets to prevent input from being sanitized to empty string #8683 + throw ngMinErr( + 'btstrpd', + "App Already Bootstrapped with this Element '{0}'", + tag.replace(//,'>')); + } + + modules = modules || []; + modules.unshift(['$provide', function($provide) { + $provide.value('$rootElement', element); + }]); + + if (config.debugInfoEnabled) { + // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. + modules.push(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(true); + }]); + } + + modules.unshift('ng'); + var injector = createInjector(modules, config.strictDi); + injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', + function bootstrapApply(scope, element, compile, injector) { + scope.$apply(function() { + element.data('$injector', injector); + compile(element)(scope); + }); + }] + ); + return injector; + }; + + var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; + var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; + + if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { + config.debugInfoEnabled = true; + window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); + } + + if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { + return doBootstrap(); + } + + window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); + angular.resumeBootstrap = function(extraModules) { + forEach(extraModules, function(module) { + modules.push(module); + }); + return doBootstrap(); + }; + + if (isFunction(angular.resumeDeferredBootstrap)) { + angular.resumeDeferredBootstrap(); + } +} + +/** + * @ngdoc function + * @name angular.reloadWithDebugInfo + * @module ng + * @description + * Use this function to reload the current application with debug information turned on. + * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. + * + * See {@link ng.$compileProvider#debugInfoEnabled} for more. + */ +function reloadWithDebugInfo() { + window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; + window.location.reload(); +} + +/** + * @name angular.getTestability + * @module ng + * @description + * Get the testability service for the instance of Angular on the given + * element. + * @param {DOMElement} element DOM element which is the root of angular application. + */ +function getTestability(rootElement) { + var injector = angular.element(rootElement).injector(); + if (!injector) { + throw ngMinErr('test', + 'no injector found for element argument to getTestability'); + } + return injector.get('$$testability'); +} + +var SNAKE_CASE_REGEXP = /[A-Z]/g; +function snake_case(name, separator) { + separator = separator || '_'; + return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); +} + +var bindJQueryFired = false; +var skipDestroyOnNextJQueryCleanData; +function bindJQuery() { + var originalCleanData; + + if (bindJQueryFired) { + return; + } + + // bind to jQuery if present; + var jqName = jq(); + jQuery = window.jQuery; // use default jQuery. + if (isDefined(jqName)) { // `ngJq` present + jQuery = jqName === null ? undefined : window[jqName]; // if empty; use jqLite. if not empty, use jQuery specified by `ngJq`. + } + + // Use jQuery if it exists with proper functionality, otherwise default to us. + // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. + // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older + // versions. It will not work for sure with jQuery <1.7, though. + if (jQuery && jQuery.fn.on) { + jqLite = jQuery; + extend(jQuery.fn, { + scope: JQLitePrototype.scope, + isolateScope: JQLitePrototype.isolateScope, + controller: JQLitePrototype.controller, + injector: JQLitePrototype.injector, + inheritedData: JQLitePrototype.inheritedData + }); + + // All nodes removed from the DOM via various jQuery APIs like .remove() + // are passed through jQuery.cleanData. Monkey-patch this method to fire + // the $destroy event on all removed nodes. + originalCleanData = jQuery.cleanData; + jQuery.cleanData = function(elems) { + var events; + if (!skipDestroyOnNextJQueryCleanData) { + for (var i = 0, elem; (elem = elems[i]) != null; i++) { + events = jQuery._data(elem, "events"); + if (events && events.$destroy) { + jQuery(elem).triggerHandler('$destroy'); + } + } + } else { + skipDestroyOnNextJQueryCleanData = false; + } + originalCleanData(elems); + }; + } else { + jqLite = JQLite; + } + + angular.element = jqLite; + + // Prevent double-proxying. + bindJQueryFired = true; +} + +/** + * throw error if the argument is falsy. + */ +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function assertArgFn(arg, name, acceptArrayAnnotation) { + if (acceptArrayAnnotation && isArray(arg)) { + arg = arg[arg.length - 1]; + } + + assertArg(isFunction(arg), name, 'not a function, got ' + + (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); + return arg; +} + +/** + * throw error if the name given is hasOwnProperty + * @param {String} name the name to test + * @param {String} context the context in which the name is used, such as module or directive + */ +function assertNotHasOwnProperty(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); + } +} + +/** + * Return the value accessible from the object by path. Any undefined traversals are ignored + * @param {Object} obj starting object + * @param {String} path path to traverse + * @param {boolean} [bindFnToScope=true] + * @returns {Object} value as accessible by path + */ +//TODO(misko): this function needs to be removed +function getter(obj, path, bindFnToScope) { + if (!path) return obj; + var keys = path.split('.'); + var key; + var lastInstance = obj; + var len = keys.length; + + for (var i = 0; i < len; i++) { + key = keys[i]; + if (obj) { + obj = (lastInstance = obj)[key]; + } + } + if (!bindFnToScope && isFunction(obj)) { + return bind(lastInstance, obj); + } + return obj; +} + +/** + * Return the DOM siblings between the first and last node in the given array. + * @param {Array} array like object + * @returns {jqLite} jqLite collection containing the nodes + */ +function getBlockNodes(nodes) { + // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original + // collection, otherwise update the original collection. + var node = nodes[0]; + var endNode = nodes[nodes.length - 1]; + var blockNodes = [node]; + + do { + node = node.nextSibling; + if (!node) break; + blockNodes.push(node); + } while (node !== endNode); + + return jqLite(blockNodes); +} + + +/** + * Creates a new object without a prototype. This object is useful for lookup without having to + * guard against prototypically inherited properties via hasOwnProperty. + * + * Related micro-benchmarks: + * - http://jsperf.com/object-create2 + * - http://jsperf.com/proto-map-lookup/2 + * - http://jsperf.com/for-in-vs-object-keys2 + * + * @returns {Object} + */ +function createMap() { + return Object.create(null); +} + +var NODE_TYPE_ELEMENT = 1; +var NODE_TYPE_ATTRIBUTE = 2; +var NODE_TYPE_TEXT = 3; +var NODE_TYPE_COMMENT = 8; +var NODE_TYPE_DOCUMENT = 9; +var NODE_TYPE_DOCUMENT_FRAGMENT = 11; + +/** + * @ngdoc type + * @name angular.Module + * @module ng + * @description + * + * Interface for configuring angular {@link angular.module modules}. + */ + +function setupModuleLoader(window) { + + var $injectorMinErr = minErr('$injector'); + var ngMinErr = minErr('ng'); + + function ensure(obj, name, factory) { + return obj[name] || (obj[name] = factory()); + } + + var angular = ensure(window, 'angular', Object); + + // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap + angular.$$minErr = angular.$$minErr || minErr; + + return ensure(angular, 'module', function() { + /** @type {Object.} */ + var modules = {}; + + /** + * @ngdoc function + * @name angular.module + * @module ng + * @description + * + * The `angular.module` is a global place for creating, registering and retrieving Angular + * modules. + * All modules (angular core or 3rd party) that should be available to an application must be + * registered using this mechanism. + * + * When passed two or more arguments, a new module is created. If passed only one argument, an + * existing module (the name passed as the first argument to `module`) is retrieved. + * + * + * # Module + * + * A module is a collection of services, directives, controllers, filters, and configuration information. + * `angular.module` is used to configure the {@link auto.$injector $injector}. + * + * ```js + * // Create a new module + * var myModule = angular.module('myModule', []); + * + * // register a new service + * myModule.value('appName', 'MyCoolApp'); + * + * // configure existing services inside initialization blocks. + * myModule.config(['$locationProvider', function($locationProvider) { + * // Configure existing providers + * $locationProvider.hashPrefix('!'); + * }]); + * ``` + * + * Then you can create an injector and load your modules like this: + * + * ```js + * var injector = angular.injector(['ng', 'myModule']) + * ``` + * + * However it's more likely that you'll just use + * {@link ng.directive:ngApp ngApp} or + * {@link angular.bootstrap} to simplify this process for you. + * + * @param {!string} name The name of the module to create or retrieve. + * @param {!Array.=} requires If specified then new module is being created. If + * unspecified then the module is being retrieved for further configuration. + * @param {Function=} configFn Optional configuration function for the module. Same as + * {@link angular.Module#config Module#config()}. + * @returns {module} new module with the {@link angular.Module} api. + */ + return function module(name, requires, configFn) { + var assertNotHasOwnProperty = function(name, context) { + if (name === 'hasOwnProperty') { + throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); + } + }; + + assertNotHasOwnProperty(name, 'module'); + if (requires && modules.hasOwnProperty(name)) { + modules[name] = null; + } + return ensure(modules, name, function() { + if (!requires) { + throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + + "the module name or forgot to load it. If registering a module ensure that you " + + "specify the dependencies as the second argument.", name); + } + + /** @type {!Array.>} */ + var invokeQueue = []; + + /** @type {!Array.} */ + var configBlocks = []; + + /** @type {!Array.} */ + var runBlocks = []; + + var config = invokeLater('$injector', 'invoke', 'push', configBlocks); + + /** @type {angular.Module} */ + var moduleInstance = { + // Private state + _invokeQueue: invokeQueue, + _configBlocks: configBlocks, + _runBlocks: runBlocks, + + /** + * @ngdoc property + * @name angular.Module#requires + * @module ng + * + * @description + * Holds the list of modules which the injector will load before the current module is + * loaded. + */ + requires: requires, + + /** + * @ngdoc property + * @name angular.Module#name + * @module ng + * + * @description + * Name of the module. + */ + name: name, + + + /** + * @ngdoc method + * @name angular.Module#provider + * @module ng + * @param {string} name service name + * @param {Function} providerType Construction function for creating new instance of the + * service. + * @description + * See {@link auto.$provide#provider $provide.provider()}. + */ + provider: invokeLaterAndSetModuleName('$provide', 'provider'), + + /** + * @ngdoc method + * @name angular.Module#factory + * @module ng + * @param {string} name service name + * @param {Function} providerFunction Function for creating new instance of the service. + * @description + * See {@link auto.$provide#factory $provide.factory()}. + */ + factory: invokeLaterAndSetModuleName('$provide', 'factory'), + + /** + * @ngdoc method + * @name angular.Module#service + * @module ng + * @param {string} name service name + * @param {Function} constructor A constructor function that will be instantiated. + * @description + * See {@link auto.$provide#service $provide.service()}. + */ + service: invokeLaterAndSetModuleName('$provide', 'service'), + + /** + * @ngdoc method + * @name angular.Module#value + * @module ng + * @param {string} name service name + * @param {*} object Service instance object. + * @description + * See {@link auto.$provide#value $provide.value()}. + */ + value: invokeLater('$provide', 'value'), + + /** + * @ngdoc method + * @name angular.Module#constant + * @module ng + * @param {string} name constant name + * @param {*} object Constant value. + * @description + * Because the constant are fixed, they get applied before other provide methods. + * See {@link auto.$provide#constant $provide.constant()}. + */ + constant: invokeLater('$provide', 'constant', 'unshift'), + + /** + * @ngdoc method + * @name angular.Module#decorator + * @module ng + * @param {string} The name of the service to decorate. + * @param {Function} This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. + * @description + * See {@link auto.$provide#decorator $provide.decorator()}. + */ + decorator: invokeLaterAndSetModuleName('$provide', 'decorator'), + + /** + * @ngdoc method + * @name angular.Module#animation + * @module ng + * @param {string} name animation name + * @param {Function} animationFactory Factory function for creating new instance of an + * animation. + * @description + * + * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. + * + * + * Defines an animation hook that can be later used with + * {@link $animate $animate} service and directives that use this service. + * + * ```js + * module.animation('.animation-name', function($inject1, $inject2) { + * return { + * eventName : function(element, done) { + * //code to run the animation + * //once complete, then run done() + * return function cancellationFunction(element) { + * //code to cancel the animation + * } + * } + * } + * }) + * ``` + * + * See {@link ng.$animateProvider#register $animateProvider.register()} and + * {@link ngAnimate ngAnimate module} for more information. + */ + animation: invokeLaterAndSetModuleName('$animateProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#filter + * @module ng + * @param {string} name Filter name - this must be a valid angular expression identifier + * @param {Function} filterFactory Factory function for creating new instance of filter. + * @description + * See {@link ng.$filterProvider#register $filterProvider.register()}. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ */ + filter: invokeLaterAndSetModuleName('$filterProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#controller + * @module ng + * @param {string|Object} name Controller name, or an object map of controllers where the + * keys are the names and the values are the constructors. + * @param {Function} constructor Controller constructor function. + * @description + * See {@link ng.$controllerProvider#register $controllerProvider.register()}. + */ + controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'), + + /** + * @ngdoc method + * @name angular.Module#directive + * @module ng + * @param {string|Object} name Directive name, or an object map of directives where the + * keys are the names and the values are the factories. + * @param {Function} directiveFactory Factory function for creating new instance of + * directives. + * @description + * See {@link ng.$compileProvider#directive $compileProvider.directive()}. + */ + directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'), + + /** + * @ngdoc method + * @name angular.Module#config + * @module ng + * @param {Function} configFn Execute this function on module load. Useful for service + * configuration. + * @description + * Use this method to register work which needs to be performed on module loading. + * For more about how to configure services, see + * {@link providers#provider-recipe Provider Recipe}. + */ + config: config, + + /** + * @ngdoc method + * @name angular.Module#run + * @module ng + * @param {Function} initializationFn Execute this function after injector creation. + * Useful for application initialization. + * @description + * Use this method to register work which should be performed when the injector is done + * loading all modules. + */ + run: function(block) { + runBlocks.push(block); + return this; + } + }; + + if (configFn) { + config(configFn); + } + + return moduleInstance; + + /** + * @param {string} provider + * @param {string} method + * @param {String=} insertMethod + * @returns {angular.Module} + */ + function invokeLater(provider, method, insertMethod, queue) { + if (!queue) queue = invokeQueue; + return function() { + queue[insertMethod || 'push']([provider, method, arguments]); + return moduleInstance; + }; + } + + /** + * @param {string} provider + * @param {string} method + * @returns {angular.Module} + */ + function invokeLaterAndSetModuleName(provider, method) { + return function(recipeName, factoryFunction) { + if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name; + invokeQueue.push([provider, method, arguments]); + return moduleInstance; + }; + } + }); + }; + }); + +} + +/* global: toDebugString: true */ + +function serializeObject(obj) { + var seen = []; + + return JSON.stringify(obj, function(key, val) { + val = toJsonReplacer(key, val); + if (isObject(val)) { + + if (seen.indexOf(val) >= 0) return '<>'; + + seen.push(val); + } + return val; + }); +} + +function toDebugString(obj) { + if (typeof obj === 'function') { + return obj.toString().replace(/ \{[\s\S]*$/, ''); + } else if (typeof obj === 'undefined') { + return 'undefined'; + } else if (typeof obj !== 'string') { + return serializeObject(obj); + } + return obj; +} + +/* global angularModule: true, + version: true, + + $LocaleProvider, + $CompileProvider, + + htmlAnchorDirective, + inputDirective, + inputDirective, + formDirective, + scriptDirective, + selectDirective, + styleDirective, + optionDirective, + ngBindDirective, + ngBindHtmlDirective, + ngBindTemplateDirective, + ngClassDirective, + ngClassEvenDirective, + ngClassOddDirective, + ngCspDirective, + ngCloakDirective, + ngControllerDirective, + ngFormDirective, + ngHideDirective, + ngIfDirective, + ngIncludeDirective, + ngIncludeFillContentDirective, + ngInitDirective, + ngNonBindableDirective, + ngPluralizeDirective, + ngRepeatDirective, + ngShowDirective, + ngStyleDirective, + ngSwitchDirective, + ngSwitchWhenDirective, + ngSwitchDefaultDirective, + ngOptionsDirective, + ngTranscludeDirective, + ngModelDirective, + ngListDirective, + ngChangeDirective, + patternDirective, + patternDirective, + requiredDirective, + requiredDirective, + minlengthDirective, + minlengthDirective, + maxlengthDirective, + maxlengthDirective, + ngValueDirective, + ngModelOptionsDirective, + ngAttributeAliasDirectives, + ngEventDirectives, + + $AnchorScrollProvider, + $AnimateProvider, + $$CoreAnimateQueueProvider, + $$CoreAnimateRunnerProvider, + $BrowserProvider, + $CacheFactoryProvider, + $ControllerProvider, + $DocumentProvider, + $ExceptionHandlerProvider, + $FilterProvider, + $InterpolateProvider, + $IntervalProvider, + $$HashMapProvider, + $HttpProvider, + $HttpParamSerializerProvider, + $HttpParamSerializerJQLikeProvider, + $HttpBackendProvider, + $LocationProvider, + $LogProvider, + $ParseProvider, + $RootScopeProvider, + $QProvider, + $$QProvider, + $$SanitizeUriProvider, + $SceProvider, + $SceDelegateProvider, + $SnifferProvider, + $TemplateCacheProvider, + $TemplateRequestProvider, + $$TestabilityProvider, + $TimeoutProvider, + $$RAFProvider, + $WindowProvider, + $$jqLiteProvider, + $$CookieReaderProvider +*/ + + +/** + * @ngdoc object + * @name angular.version + * @module ng + * @description + * An object that contains information about the current AngularJS version. This object has the + * following properties: + * + * - `full` – `{string}` – Full version string, such as "0.9.18". + * - `major` – `{number}` – Major version number, such as "0". + * - `minor` – `{number}` – Minor version number, such as "9". + * - `dot` – `{number}` – Dot version number, such as "18". + * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". + */ +var version = { + full: '1.4.3', // all of these placeholder strings will be replaced by grunt's + major: 1, // package task + minor: 4, + dot: 3, + codeName: 'foam-acceleration' +}; + + +function publishExternalAPI(angular) { + extend(angular, { + 'bootstrap': bootstrap, + 'copy': copy, + 'extend': extend, + 'merge': merge, + 'equals': equals, + 'element': jqLite, + 'forEach': forEach, + 'injector': createInjector, + 'noop': noop, + 'bind': bind, + 'toJson': toJson, + 'fromJson': fromJson, + 'identity': identity, + 'isUndefined': isUndefined, + 'isDefined': isDefined, + 'isString': isString, + 'isFunction': isFunction, + 'isObject': isObject, + 'isNumber': isNumber, + 'isElement': isElement, + 'isArray': isArray, + 'version': version, + 'isDate': isDate, + 'lowercase': lowercase, + 'uppercase': uppercase, + 'callbacks': {counter: 0}, + 'getTestability': getTestability, + '$$minErr': minErr, + '$$csp': csp, + 'reloadWithDebugInfo': reloadWithDebugInfo + }); + + angularModule = setupModuleLoader(window); + try { + angularModule('ngLocale'); + } catch (e) { + angularModule('ngLocale', []).provider('$locale', $LocaleProvider); + } + + angularModule('ng', ['ngLocale'], ['$provide', + function ngModule($provide) { + // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. + $provide.provider({ + $$sanitizeUri: $$SanitizeUriProvider + }); + $provide.provider('$compile', $CompileProvider). + directive({ + a: htmlAnchorDirective, + input: inputDirective, + textarea: inputDirective, + form: formDirective, + script: scriptDirective, + select: selectDirective, + style: styleDirective, + 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: patternDirective, + required: requiredDirective, + ngRequired: requiredDirective, + minlength: minlengthDirective, + ngMinlength: minlengthDirective, + maxlength: maxlengthDirective, + ngMaxlength: maxlengthDirective, + ngValue: ngValueDirective, + ngModelOptions: ngModelOptionsDirective + }). + directive({ + ngInclude: ngIncludeFillContentDirective + }). + directive(ngAttributeAliasDirectives). + directive(ngEventDirectives); + $provide.provider({ + $anchorScroll: $AnchorScrollProvider, + $animate: $AnimateProvider, + $$animateQueue: $$CoreAnimateQueueProvider, + $$AnimateRunner: $$CoreAnimateRunnerProvider, + $browser: $BrowserProvider, + $cacheFactory: $CacheFactoryProvider, + $controller: $ControllerProvider, + $document: $DocumentProvider, + $exceptionHandler: $ExceptionHandlerProvider, + $filter: $FilterProvider, + $interpolate: $InterpolateProvider, + $interval: $IntervalProvider, + $http: $HttpProvider, + $httpParamSerializer: $HttpParamSerializerProvider, + $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider, + $httpBackend: $HttpBackendProvider, + $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 + }); + } + ]); +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* global JQLitePrototype: true, + addEventListenerFn: true, + removeEventListenerFn: true, + BOOLEAN_ATTR: true, + ALIASED_ATTR: true, +*/ + +////////////////////////////////// +//JQLite +////////////////////////////////// + +/** + * @ngdoc function + * @name angular.element + * @module ng + * @kind function + * + * @description + * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. + * + * If jQuery is available, `angular.element` is an alias for the + * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` + * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." + * + *
jqLite is a tiny, API-compatible subset of jQuery that allows + * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most + * commonly needed functionality with the goal of having a very small footprint.
+ * + * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. + * + *
**Note:** all element references in Angular are always wrapped with jQuery or + * jqLite; they are never raw DOM references.
+ * + * ## Angular's jqLite + * jqLite provides only the following jQuery methods: + * + * - [`addClass()`](http://api.jquery.com/addClass/) + * - [`after()`](http://api.jquery.com/after/) + * - [`append()`](http://api.jquery.com/append/) + * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters + * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData + * - [`children()`](http://api.jquery.com/children/) - Does not support selectors + * - [`clone()`](http://api.jquery.com/clone/) + * - [`contents()`](http://api.jquery.com/contents/) + * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`. As a setter, does not convert numbers to strings or append 'px'. + * - [`data()`](http://api.jquery.com/data/) + * - [`detach()`](http://api.jquery.com/detach/) + * - [`empty()`](http://api.jquery.com/empty/) + * - [`eq()`](http://api.jquery.com/eq/) + * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name + * - [`hasClass()`](http://api.jquery.com/hasClass/) + * - [`html()`](http://api.jquery.com/html/) + * - [`next()`](http://api.jquery.com/next/) - Does not support selectors + * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData + * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors + * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors + * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors + * - [`prepend()`](http://api.jquery.com/prepend/) + * - [`prop()`](http://api.jquery.com/prop/) + * - [`ready()`](http://api.jquery.com/ready/) + * - [`remove()`](http://api.jquery.com/remove/) + * - [`removeAttr()`](http://api.jquery.com/removeAttr/) + * - [`removeClass()`](http://api.jquery.com/removeClass/) + * - [`removeData()`](http://api.jquery.com/removeData/) + * - [`replaceWith()`](http://api.jquery.com/replaceWith/) + * - [`text()`](http://api.jquery.com/text/) + * - [`toggleClass()`](http://api.jquery.com/toggleClass/) + * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. + * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces + * - [`val()`](http://api.jquery.com/val/) + * - [`wrap()`](http://api.jquery.com/wrap/) + * + * ## jQuery/jqLite Extras + * Angular also provides the following additional methods and events to both jQuery and jqLite: + * + * ### Events + * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event + * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM + * element before it is removed. + * + * ### Methods + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ngController` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current + * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to + * be enabled. + * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the + * current element. This getter should be used only on elements that contain a directive which starts a new isolate + * scope. Calling `scope()` on this element always returns the original non-isolate scope. + * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. + * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top + * parent element is reached. + * + * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. + * @returns {Object} jQuery object. + */ + +JQLite.expando = 'ng339'; + +var jqCache = JQLite.cache = {}, + jqId = 1, + addEventListenerFn = function(element, type, fn) { + element.addEventListener(type, fn, false); + }, + removeEventListenerFn = function(element, type, fn) { + element.removeEventListener(type, fn, false); + }; + +/* + * !!! This is an undocumented "private" function !!! + */ +JQLite._data = function(node) { + //jQuery always returns an object on cache miss + return this.cache[node[this.expando]] || {}; +}; + +function jqNextId() { return ++jqId; } + + +var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; +var MOZ_HACK_REGEXP = /^moz([A-Z])/; +var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; +var jqLiteMinErr = minErr('jqLite'); + +/** + * Converts snake_case to camelCase. + * Also there is special case for Moz prefix starting with upper case letter. + * @param name Name to normalize + */ +function camelCase(name) { + return name. + replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { + return offset ? letter.toUpperCase() : letter; + }). + replace(MOZ_HACK_REGEXP, 'Moz$1'); +} + +var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/; +var HTML_REGEXP = /<|&#?\w+;/; +var TAG_NAME_REGEXP = /<([\w:]+)/; +var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi; + +var wrapMap = { + 'option': [1, ''], + + 'thead': [1, '', '
'], + 'col': [2, '', '
'], + 'tr': [2, '', '
'], + 'td': [3, '', '
'], + '_default': [0, "", ""] +}; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function jqLiteIsTextNode(html) { + return !HTML_REGEXP.test(html); +} + +function jqLiteAcceptsData(node) { + // The window object can accept data but has no nodeType + // Otherwise we are only interested in elements (1) and documents (9) + var nodeType = node.nodeType; + return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; +} + +function jqLiteHasData(node) { + for (var key in jqCache[node.ng339]) { + return true; + } + return false; +} + +function jqLiteBuildFragment(html, context) { + var tmp, tag, wrap, + fragment = context.createDocumentFragment(), + nodes = [], i; + + if (jqLiteIsTextNode(html)) { + // Convert non-html into a text node + nodes.push(context.createTextNode(html)); + } else { + // Convert html into DOM nodes + tmp = tmp || fragment.appendChild(context.createElement("div")); + tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; + + // Descend through wrappers to the right content + i = wrap[0]; + while (i--) { + tmp = tmp.lastChild; + } + + nodes = concat(nodes, tmp.childNodes); + + tmp = fragment.firstChild; + tmp.textContent = ""; + } + + // Remove wrapper from fragment + fragment.textContent = ""; + fragment.innerHTML = ""; // Clear inner HTML + forEach(nodes, function(node) { + fragment.appendChild(node); + }); + + return fragment; +} + +function jqLiteParseHTML(html, context) { + context = context || document; + var parsed; + + if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { + return [context.createElement(parsed[1])]; + } + + if ((parsed = jqLiteBuildFragment(html, context))) { + return parsed.childNodes; + } + + return []; +} + +///////////////////////////////////////////// +function JQLite(element) { + if (element instanceof JQLite) { + return element; + } + + var argIsString; + + if (isString(element)) { + element = trim(element); + argIsString = true; + } + if (!(this instanceof JQLite)) { + if (argIsString && element.charAt(0) != '<') { + throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); + } + return new JQLite(element); + } + + if (argIsString) { + jqLiteAddNodes(this, jqLiteParseHTML(element)); + } else { + jqLiteAddNodes(this, element); + } +} + +function jqLiteClone(element) { + return element.cloneNode(true); +} + +function jqLiteDealoc(element, onlyDescendants) { + if (!onlyDescendants) jqLiteRemoveData(element); + + if (element.querySelectorAll) { + var descendants = element.querySelectorAll('*'); + for (var i = 0, l = descendants.length; i < l; i++) { + jqLiteRemoveData(descendants[i]); + } + } +} + +function jqLiteOff(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); + + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var handle = expandoStore && expandoStore.handle; + + if (!handle) return; //no listeners registered + + if (!type) { + for (type in events) { + if (type !== '$destroy') { + removeEventListenerFn(element, type, handle); + } + delete events[type]; + } + } else { + forEach(type.split(' '), function(type) { + if (isDefined(fn)) { + var listenerFns = events[type]; + arrayRemove(listenerFns || [], fn); + if (listenerFns && listenerFns.length > 0) { + return; + } + } + + removeEventListenerFn(element, type, handle); + delete events[type]; + }); + } +} + +function jqLiteRemoveData(element, name) { + var expandoId = element.ng339; + var expandoStore = expandoId && jqCache[expandoId]; + + if (expandoStore) { + if (name) { + delete expandoStore.data[name]; + return; + } + + if (expandoStore.handle) { + if (expandoStore.events.$destroy) { + expandoStore.handle({}, '$destroy'); + } + jqLiteOff(element); + } + delete jqCache[expandoId]; + element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it + } +} + + +function jqLiteExpandoStore(element, createIfNecessary) { + var expandoId = element.ng339, + expandoStore = expandoId && jqCache[expandoId]; + + if (createIfNecessary && !expandoStore) { + element.ng339 = expandoId = jqNextId(); + expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; + } + + return expandoStore; +} + + +function jqLiteData(element, key, value) { + if (jqLiteAcceptsData(element)) { + + var isSimpleSetter = isDefined(value); + var isSimpleGetter = !isSimpleSetter && key && !isObject(key); + var massGetter = !key; + var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); + var data = expandoStore && expandoStore.data; + + if (isSimpleSetter) { // data('key', value) + data[key] = value; + } else { + if (massGetter) { // data() + return data; + } else { + if (isSimpleGetter) { // data('key') + // don't force creation of expandoStore if it doesn't exist yet + return data && data[key]; + } else { // mass-setter: data({key1: val1, key2: val2}) + extend(data, key); + } + } + } + } +} + +function jqLiteHasClass(element, selector) { + if (!element.getAttribute) return false; + return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). + indexOf(" " + selector + " ") > -1); +} + +function jqLiteRemoveClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + forEach(cssClasses.split(' '), function(cssClass) { + element.setAttribute('class', trim( + (" " + (element.getAttribute('class') || '') + " ") + .replace(/[\n\t]/g, " ") + .replace(" " + trim(cssClass) + " ", " ")) + ); + }); + } +} + +function jqLiteAddClass(element, cssClasses) { + if (cssClasses && element.setAttribute) { + var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + .replace(/[\n\t]/g, " "); + + forEach(cssClasses.split(' '), function(cssClass) { + cssClass = trim(cssClass); + if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { + existingClasses += cssClass + ' '; + } + }); + + element.setAttribute('class', trim(existingClasses)); + } +} + + +function jqLiteAddNodes(root, elements) { + // THIS CODE IS VERY HOT. Don't make changes without benchmarking. + + if (elements) { + + // if a Node (the most common case) + if (elements.nodeType) { + root[root.length++] = elements; + } else { + var length = elements.length; + + // if an Array or NodeList and not a Window + if (typeof length === 'number' && elements.window !== elements) { + if (length) { + for (var i = 0; i < length; i++) { + root[root.length++] = elements[i]; + } + } + } else { + root[root.length++] = elements; + } + } + } +} + + +function jqLiteController(element, name) { + return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); +} + +function jqLiteInheritedData(element, name, value) { + // if element is the document object work with the html element instead + // this makes $(document).scope() possible + if (element.nodeType == NODE_TYPE_DOCUMENT) { + element = element.documentElement; + } + var names = isArray(name) ? name : [name]; + + while (element) { + for (var i = 0, ii = names.length; i < ii; i++) { + if ((value = jqLite.data(element, names[i])) !== undefined) return value; + } + + // If dealing with a document fragment node with a host element, and no parent, use the host + // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM + // to lookup parent controllers. + element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); + } +} + +function jqLiteEmpty(element) { + jqLiteDealoc(element, true); + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + +function jqLiteRemove(element, keepData) { + if (!keepData) jqLiteDealoc(element); + var parent = element.parentNode; + if (parent) parent.removeChild(element); +} + + +function jqLiteDocumentLoaded(action, win) { + win = win || window; + if (win.document.readyState === 'complete') { + // Force the action to be run async for consistent behaviour + // from the action's point of view + // i.e. it will definitely not be in a $apply + win.setTimeout(action); + } else { + // No need to unbind this handler as load is only ever called once + jqLite(win).on('load', action); + } +} + +////////////////////////////////////////// +// Functions which are declared directly. +////////////////////////////////////////// +var JQLitePrototype = JQLite.prototype = { + ready: function(fn) { + var fired = false; + + function trigger() { + if (fired) return; + fired = true; + fn(); + } + + // check if document is already loaded + if (document.readyState === 'complete') { + setTimeout(trigger); + } else { + this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 + // we can not use jqLite since we are not done loading and jQuery could be loaded later. + // jshint -W064 + JQLite(window).on('load', trigger); // fallback to window.onload for others + // jshint +W064 + } + }, + toString: function() { + var value = []; + forEach(this, function(e) { value.push('' + e);}); + return '[' + value.join(', ') + ']'; + }, + + eq: function(index) { + return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); + }, + + length: 0, + push: push, + sort: [].sort, + splice: [].splice +}; + +////////////////////////////////////////// +// Functions iterating getter/setters. +// these functions return self on setter and +// value on get. +////////////////////////////////////////// +var BOOLEAN_ATTR = {}; +forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { + BOOLEAN_ATTR[lowercase(value)] = value; +}); +var BOOLEAN_ELEMENTS = {}; +forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { + BOOLEAN_ELEMENTS[value] = true; +}); +var ALIASED_ATTR = { + 'ngMinlength': 'minlength', + 'ngMaxlength': 'maxlength', + 'ngMin': 'min', + 'ngMax': 'max', + 'ngPattern': 'pattern' +}; + +function getBooleanAttrName(element, name) { + // check dom last since we will most likely fail on name + var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; + + // booleanAttr is here twice to minimize DOM access + return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; +} + +function getAliasedAttrName(element, name) { + var nodeName = element.nodeName; + return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name]; +} + +forEach({ + data: jqLiteData, + removeData: jqLiteRemoveData, + hasData: jqLiteHasData +}, function(fn, name) { + JQLite[name] = fn; +}); + +forEach({ + data: jqLiteData, + inheritedData: jqLiteInheritedData, + + scope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); + }, + + isolateScope: function(element) { + // Can't use jqLiteData here directly so we stay compatible with jQuery! + return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); + }, + + controller: jqLiteController, + + injector: function(element) { + return jqLiteInheritedData(element, '$injector'); + }, + + removeAttr: function(element, name) { + element.removeAttribute(name); + }, + + hasClass: jqLiteHasClass, + + css: function(element, name, value) { + name = camelCase(name); + + if (isDefined(value)) { + element.style[name] = value; + } else { + return element.style[name]; + } + }, + + attr: function(element, name, value) { + var nodeType = element.nodeType; + if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) { + return; + } + var lowercasedName = lowercase(name); + if (BOOLEAN_ATTR[lowercasedName]) { + if (isDefined(value)) { + if (!!value) { + element[name] = true; + element.setAttribute(name, lowercasedName); + } else { + element[name] = false; + element.removeAttribute(lowercasedName); + } + } else { + return (element[name] || + (element.attributes.getNamedItem(name) || noop).specified) + ? lowercasedName + : undefined; + } + } else if (isDefined(value)) { + element.setAttribute(name, value); + } else if (element.getAttribute) { + // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code + // some elements (e.g. Document) don't have get attribute, so return undefined + var ret = element.getAttribute(name, 2); + // normalize non-existing attributes to undefined (as jQuery) + return ret === null ? undefined : ret; + } + }, + + prop: function(element, name, value) { + if (isDefined(value)) { + element[name] = value; + } else { + return element[name]; + } + }, + + text: (function() { + getText.$dv = ''; + return getText; + + function getText(element, value) { + if (isUndefined(value)) { + var nodeType = element.nodeType; + return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; + } + element.textContent = value; + } + })(), + + val: function(element, value) { + if (isUndefined(value)) { + if (element.multiple && nodeName_(element) === 'select') { + var result = []; + forEach(element.options, function(option) { + if (option.selected) { + result.push(option.value || option.text); + } + }); + return result.length === 0 ? null : result; + } + return element.value; + } + element.value = value; + }, + + html: function(element, value) { + if (isUndefined(value)) { + return element.innerHTML; + } + jqLiteDealoc(element, true); + element.innerHTML = value; + }, + + empty: jqLiteEmpty +}, function(fn, name) { + /** + * Properties: writes return selection, reads return first value + */ + JQLite.prototype[name] = function(arg1, arg2) { + var i, key; + var nodeCount = this.length; + + // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it + // in a way that survives minification. + // jqLiteEmpty takes no arguments but is a setter. + if (fn !== jqLiteEmpty && + (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) { + if (isObject(arg1)) { + + // we are a write, but the object properties are the key/values + for (i = 0; i < nodeCount; i++) { + if (fn === jqLiteData) { + // data() takes the whole object in jQuery + fn(this[i], arg1); + } else { + for (key in arg1) { + fn(this[i], key, arg1[key]); + } + } + } + // return self for chaining + return this; + } else { + // we are a read, so read the first child. + // TODO: do we still need this? + var value = fn.$dv; + // Only if we have $dv do we iterate over all, otherwise it is just the first element. + var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount; + for (var j = 0; j < jj; j++) { + var nodeValue = fn(this[j], arg1, arg2); + value = value ? value + nodeValue : nodeValue; + } + return value; + } + } else { + // we are a write, so apply to all children + for (i = 0; i < nodeCount; i++) { + fn(this[i], arg1, arg2); + } + // return self for chaining + return this; + } + }; +}); + +function createEventHandler(element, events) { + var eventHandler = function(event, type) { + // jQuery specific api + event.isDefaultPrevented = function() { + return event.defaultPrevented; + }; + + var eventFns = events[type || event.type]; + var eventFnsLength = eventFns ? eventFns.length : 0; + + if (!eventFnsLength) return; + + if (isUndefined(event.immediatePropagationStopped)) { + var originalStopImmediatePropagation = event.stopImmediatePropagation; + event.stopImmediatePropagation = function() { + event.immediatePropagationStopped = true; + + if (event.stopPropagation) { + event.stopPropagation(); + } + + if (originalStopImmediatePropagation) { + originalStopImmediatePropagation.call(event); + } + }; + } + + event.isImmediatePropagationStopped = function() { + return event.immediatePropagationStopped === true; + }; + + // Copy event handlers in case event handlers array is modified during execution. + if ((eventFnsLength > 1)) { + eventFns = shallowCopy(eventFns); + } + + for (var i = 0; i < eventFnsLength; i++) { + if (!event.isImmediatePropagationStopped()) { + eventFns[i].call(element, event); + } + } + }; + + // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all + // events on `element` + eventHandler.elem = element; + return eventHandler; +} + +////////////////////////////////////////// +// Functions iterating traversal. +// These functions chain results into a single +// selector. +////////////////////////////////////////// +forEach({ + removeData: jqLiteRemoveData, + + on: function jqLiteOn(element, type, fn, unsupported) { + if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); + + // Do not add event handlers to non-elements because they will not be cleaned up. + if (!jqLiteAcceptsData(element)) { + return; + } + + var expandoStore = jqLiteExpandoStore(element, true); + var events = expandoStore.events; + var handle = expandoStore.handle; + + if (!handle) { + handle = expandoStore.handle = createEventHandler(element, events); + } + + // http://jsperf.com/string-indexof-vs-split + var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; + var i = types.length; + + while (i--) { + type = types[i]; + var eventFns = events[type]; + + if (!eventFns) { + events[type] = []; + + if (type === 'mouseenter' || type === 'mouseleave') { + // Refer to jQuery's implementation of mouseenter & mouseleave + // Read about mouseenter and mouseleave: + // http://www.quirksmode.org/js/events_mouse.html#link8 + + jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { + var target = this, related = event.relatedTarget; + // 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 && !target.contains(related))) { + handle(event, type); + } + }); + + } else { + if (type !== '$destroy') { + addEventListenerFn(element, type, handle); + } + } + eventFns = events[type]; + } + eventFns.push(fn); + } + }, + + off: jqLiteOff, + + one: function(element, type, fn) { + element = jqLite(element); + + //add the listener twice so that when it is called + //you can remove the original function and still be + //able to call element.off(ev, fn) normally + element.on(type, function onFn() { + element.off(type, fn); + element.off(type, onFn); + }); + element.on(type, fn); + }, + + replaceWith: function(element, replaceNode) { + var index, parent = element.parentNode; + jqLiteDealoc(element); + forEach(new JQLite(replaceNode), function(node) { + if (index) { + parent.insertBefore(node, index.nextSibling); + } else { + parent.replaceChild(node, element); + } + index = node; + }); + }, + + children: function(element) { + var children = []; + forEach(element.childNodes, function(element) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + children.push(element); + } + }); + return children; + }, + + contents: function(element) { + return element.contentDocument || element.childNodes || []; + }, + + append: function(element, node) { + var nodeType = element.nodeType; + if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; + + node = new JQLite(node); + + for (var i = 0, ii = node.length; i < ii; i++) { + var child = node[i]; + element.appendChild(child); + } + }, + + prepend: function(element, node) { + if (element.nodeType === NODE_TYPE_ELEMENT) { + var index = element.firstChild; + forEach(new JQLite(node), function(child) { + element.insertBefore(child, index); + }); + } + }, + + wrap: function(element, wrapNode) { + wrapNode = jqLite(wrapNode).eq(0).clone()[0]; + var parent = element.parentNode; + if (parent) { + parent.replaceChild(wrapNode, element); + } + wrapNode.appendChild(element); + }, + + remove: jqLiteRemove, + + detach: function(element) { + jqLiteRemove(element, true); + }, + + after: function(element, newElement) { + var index = element, parent = element.parentNode; + newElement = new JQLite(newElement); + + for (var i = 0, ii = newElement.length; i < ii; i++) { + var node = newElement[i]; + parent.insertBefore(node, index.nextSibling); + index = node; + } + }, + + addClass: jqLiteAddClass, + removeClass: jqLiteRemoveClass, + + toggleClass: function(element, selector, condition) { + if (selector) { + forEach(selector.split(' '), function(className) { + var classCondition = condition; + if (isUndefined(classCondition)) { + classCondition = !jqLiteHasClass(element, className); + } + (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); + }); + } + }, + + parent: function(element) { + var parent = element.parentNode; + return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; + }, + + next: function(element) { + return element.nextElementSibling; + }, + + find: function(element, selector) { + if (element.getElementsByTagName) { + return element.getElementsByTagName(selector); + } else { + return []; + } + }, + + clone: jqLiteClone, + + triggerHandler: function(element, event, extraParameters) { + + var dummyEvent, eventFnsCopy, handlerArgs; + var eventName = event.type || event; + var expandoStore = jqLiteExpandoStore(element); + var events = expandoStore && expandoStore.events; + var eventFns = events && events[eventName]; + + if (eventFns) { + // Create a dummy event to pass to the handlers + dummyEvent = { + preventDefault: function() { this.defaultPrevented = true; }, + isDefaultPrevented: function() { return this.defaultPrevented === true; }, + stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, + isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, + stopPropagation: noop, + type: eventName, + target: element + }; + + // If a custom event was provided then extend our dummy event with it + if (event.type) { + dummyEvent = extend(dummyEvent, event); + } + + // Copy event handlers in case event handlers array is modified during execution. + eventFnsCopy = shallowCopy(eventFns); + handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; + + forEach(eventFnsCopy, function(fn) { + if (!dummyEvent.isImmediatePropagationStopped()) { + fn.apply(element, handlerArgs); + } + }); + } + } +}, function(fn, name) { + /** + * chaining functions + */ + JQLite.prototype[name] = function(arg1, arg2, arg3) { + var value; + + for (var i = 0, ii = this.length; i < ii; i++) { + if (isUndefined(value)) { + value = fn(this[i], arg1, arg2, arg3); + if (isDefined(value)) { + // any function which returns a value needs to be wrapped + value = jqLite(value); + } + } else { + jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); + } + } + return isDefined(value) ? value : this; + }; + + // bind legacy bind/unbind to on/off + JQLite.prototype.bind = JQLite.prototype.on; + JQLite.prototype.unbind = JQLite.prototype.off; +}); + + +// Provider for private $$jqLite service +function $$jqLiteProvider() { + this.$get = function $$jqLite() { + return extend(JQLite, { + hasClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteHasClass(node, classes); + }, + addClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteAddClass(node, classes); + }, + removeClass: function(node, classes) { + if (node.attr) node = node[0]; + return jqLiteRemoveClass(node, classes); + } + }); + }; +} + +/** + * Computes a hash of an 'obj'. + * Hash of a: + * string is string + * number is number as string + * object is either result of calling $$hashKey function on the object or uniquely generated id, + * that is also assigned to the $$hashKey property of the object. + * + * @param obj + * @returns {string} hash string such that the same input will have the same hash string. + * The resulting string key is in 'type:hashKey' format. + */ +function hashKey(obj, nextUidFn) { + var key = obj && obj.$$hashKey; + + if (key) { + if (typeof key === 'function') { + key = obj.$$hashKey(); + } + return key; + } + + var objType = typeof obj; + if (objType == 'function' || (objType == 'object' && obj !== null)) { + key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); + } else { + key = objType + ':' + obj; + } + + return key; +} + +/** + * HashMap which can use objects as keys + */ +function HashMap(array, isolatedUid) { + if (isolatedUid) { + var uid = 0; + this.nextUid = function() { + return ++uid; + }; + } + forEach(array, this.put, this); +} +HashMap.prototype = { + /** + * Store key value pair + * @param key key to store can be any type + * @param value value to store can be any type + */ + put: function(key, value) { + this[hashKey(key, this.nextUid)] = value; + }, + + /** + * @param key + * @returns {Object} the value for the key + */ + get: function(key) { + return this[hashKey(key, this.nextUid)]; + }, + + /** + * Remove the key/value pair + * @param key + */ + remove: function(key) { + var value = this[key = hashKey(key, this.nextUid)]; + delete this[key]; + return value; + } +}; + +var $$HashMapProvider = [function() { + this.$get = [function() { + return HashMap; + }]; +}]; + +/** + * @ngdoc function + * @module ng + * @name angular.injector + * @kind function + * + * @description + * Creates an injector object that can be used for retrieving services as well as for + * dependency injection (see {@link guide/di dependency injection}). + * + * @param {Array.} modules A list of module functions or their aliases. See + * {@link angular.module}. The `ng` module must be explicitly added. + * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which + * disallows argument name annotation inference. + * @returns {injector} Injector object. See {@link auto.$injector $injector}. + * + * @example + * Typical usage + * ```js + * // create an injector + * var $injector = angular.injector(['ng']); + * + * // use the injector to kick off your application + * // use the type inference to auto inject arguments, or use implicit injection + * $injector.invoke(function($rootScope, $compile, $document) { + * $compile($document)($rootScope); + * $rootScope.$digest(); + * }); + * ``` + * + * Sometimes you want to get access to the injector of a currently running Angular app + * from outside Angular. Perhaps, you want to inject and compile some markup after the + * application has been bootstrapped. You can do this using the extra `injector()` added + * to JQuery/jqLite elements. See {@link angular.element}. + * + * *This is fairly rare but could be the case if a third party library is injecting the + * markup.* + * + * In the following example a new block of HTML containing a `ng-controller` + * directive is added to the end of the document body by JQuery. We then compile and link + * it into the current AngularJS scope. + * + * ```js + * var $div = $('
{{content.label}}
'); + * $(document.body).append($div); + * + * angular.element(document).injector().invoke(function($compile) { + * var scope = angular.element($div).scope(); + * $compile($div)(scope); + * }); + * ``` + */ + + +/** + * @ngdoc module + * @name auto + * @description + * + * Implicit module which gets automatically added to each {@link auto.$injector $injector}. + */ + +var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; +var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +var $injectorMinErr = minErr('$injector'); + +function anonFn(fn) { + // For anonymous functions, showing at the very least the function signature can help in + // debugging. + var fnText = fn.toString().replace(STRIP_COMMENTS, ''), + args = fnText.match(FN_ARGS); + if (args) { + return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; + } + return 'fn'; +} + +function annotate(fn, strictDi, name) { + var $inject, + fnText, + argDecl, + last; + + if (typeof fn === 'function') { + if (!($inject = fn.$inject)) { + $inject = []; + if (fn.length) { + if (strictDi) { + if (!isString(name) || !name) { + name = fn.name || anonFn(fn); + } + throw $injectorMinErr('strictdi', + '{0} is not using explicit annotation and cannot be invoked in strict mode', name); + } + fnText = fn.toString().replace(STRIP_COMMENTS, ''); + argDecl = fnText.match(FN_ARGS); + forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { + arg.replace(FN_ARG, function(all, underscore, name) { + $inject.push(name); + }); + }); + } + fn.$inject = $inject; + } + } else if (isArray(fn)) { + last = fn.length - 1; + assertArgFn(fn[last], 'fn'); + $inject = fn.slice(0, last); + } else { + assertArgFn(fn, 'fn', true); + } + return $inject; +} + +/////////////////////////////////////// + +/** + * @ngdoc service + * @name $injector + * + * @description + * + * `$injector` is used to retrieve object instances as defined by + * {@link auto.$provide provider}, instantiate types, invoke methods, + * and load modules. + * + * The following always holds true: + * + * ```js + * var $injector = angular.injector(); + * expect($injector.get('$injector')).toBe($injector); + * expect($injector.invoke(function($injector) { + * return $injector; + * })).toBe($injector); + * ``` + * + * # Injection Function Annotation + * + * JavaScript does not have annotations, and annotations are needed for dependency injection. The + * following are all valid ways of annotating function with injection arguments and are equivalent. + * + * ```js + * // inferred (only works if code not minified/obfuscated) + * $injector.invoke(function(serviceA){}); + * + * // annotated + * function explicit(serviceA) {}; + * explicit.$inject = ['serviceA']; + * $injector.invoke(explicit); + * + * // inline + * $injector.invoke(['serviceA', function(serviceA){}]); + * ``` + * + * ## Inference + * + * In JavaScript calling `toString()` on a function returns the function definition. The definition + * can then be parsed and the function arguments can be extracted. This method of discovering + * annotations is disallowed when the injector is in strict mode. + * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the + * argument names. + * + * ## `$inject` Annotation + * By adding an `$inject` property onto a function the injection parameters can be specified. + * + * ## Inline + * As an array of injection names, where the last item in the array is the function to call. + */ + +/** + * @ngdoc method + * @name $injector#get + * + * @description + * Return an instance of the service. + * + * @param {string} name The name of the instance to retrieve. + * @param {string=} caller An optional string to provide the origin of the function call for error messages. + * @return {*} The instance. + */ + +/** + * @ngdoc method + * @name $injector#invoke + * + * @description + * Invoke the method and supply the method arguments from the `$injector`. + * + * @param {Function|Array.} fn The injectable function to invoke. Function parameters are + * injected according to the {@link guide/di $inject Annotation} rules. + * @param {Object=} self The `this` for the invoked method. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {*} the value returned by the invoked `fn` function. + */ + +/** + * @ngdoc method + * @name $injector#has + * + * @description + * Allows the user to query if the particular service exists. + * + * @param {string} name Name of the service to query. + * @returns {boolean} `true` if injector has given service. + */ + +/** + * @ngdoc method + * @name $injector#instantiate + * @description + * Create a new instance of JS type. The method takes a constructor function, invokes the new + * operator, and supplies all of the arguments to the constructor function as specified by the + * constructor annotation. + * + * @param {Function} Type Annotated constructor function. + * @param {Object=} locals Optional object. If preset then any argument names are read from this + * object first, before the `$injector` is consulted. + * @returns {Object} new instance of `Type`. + */ + +/** + * @ngdoc method + * @name $injector#annotate + * + * @description + * Returns an array of service names which the function is requesting for injection. This API is + * used by the injector to determine which services need to be injected into the function when the + * function is invoked. There are three ways in which the function can be annotated with the needed + * dependencies. + * + * # Argument names + * + * The simplest form is to extract the dependencies from the arguments of the function. This is done + * by converting the function into a string using `toString()` method and extracting the argument + * names. + * ```js + * // Given + * function MyController($scope, $route) { + * // ... + * } + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * You can disallow this method by using strict injection mode. + * + * This method does not work with code minification / obfuscation. For this reason the following + * annotation strategies are supported. + * + * # The `$inject` property + * + * If a function has an `$inject` property and its value is an array of strings, then the strings + * represent names of services to be injected into the function. + * ```js + * // Given + * var MyController = function(obfuscatedScope, obfuscatedRoute) { + * // ... + * } + * // Define function dependencies + * MyController['$inject'] = ['$scope', '$route']; + * + * // Then + * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); + * ``` + * + * # The array notation + * + * It is often desirable to inline Injected functions and that's when setting the `$inject` property + * is very inconvenient. In these situations using the array notation to specify the dependencies in + * a way that survives minification is a better choice: + * + * ```js + * // We wish to write this (not minification / obfuscation safe) + * injector.invoke(function($compile, $rootScope) { + * // ... + * }); + * + * // We are forced to write break inlining + * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { + * // ... + * }; + * tmpFn.$inject = ['$compile', '$rootScope']; + * injector.invoke(tmpFn); + * + * // To better support inline function the inline annotation is supported + * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { + * // ... + * }]); + * + * // Therefore + * expect(injector.annotate( + * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) + * ).toEqual(['$compile', '$rootScope']); + * ``` + * + * @param {Function|Array.} fn Function for which dependent service names need to + * be retrieved as described above. + * + * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. + * + * @returns {Array.} The names of the services which the function requires. + */ + + + + +/** + * @ngdoc service + * @name $provide + * + * @description + * + * The {@link auto.$provide $provide} service has a number of methods for registering components + * with the {@link auto.$injector $injector}. Many of these functions are also exposed on + * {@link angular.Module}. + * + * An Angular **service** is a singleton object created by a **service factory**. These **service + * factories** are functions which, in turn, are created by a **service provider**. + * The **service providers** are constructor functions. When instantiated they must contain a + * property called `$get`, which holds the **service factory** function. + * + * When you request a service, the {@link auto.$injector $injector} is responsible for finding the + * correct **service provider**, instantiating it and then calling its `$get` **service factory** + * function to get the instance of the **service**. + * + * Often services have no configuration options and there is no need to add methods to the service + * provider. The provider will be no more than a constructor function with a `$get` property. For + * these cases the {@link auto.$provide $provide} service has additional helper methods to register + * services without specifying a provider. + * + * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the + * {@link auto.$injector $injector} + * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by + * providers and services. + * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by + * services, not providers. + * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`, + * that will be wrapped in a **service provider** object, whose `$get` property will contain the + * given factory function. + * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class` + * that will be wrapped in a **service provider** object, whose `$get` property will instantiate + * a new object using the given constructor function. + * + * See the individual methods for more information and examples. + */ + +/** + * @ngdoc method + * @name $provide#provider + * @description + * + * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions + * are constructor functions, whose instances are responsible for "providing" a factory for a + * service. + * + * Service provider names start with the name of the service they provide followed by `Provider`. + * For example, the {@link ng.$log $log} service has a provider called + * {@link ng.$logProvider $logProvider}. + * + * Service provider objects can have additional methods which allow configuration of the provider + * and its service. Importantly, you can configure what kind of service is created by the `$get` + * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a + * method {@link ng.$logProvider#debugEnabled debugEnabled} + * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the + * console or not. + * + * @param {string} name The name of the instance. NOTE: the provider will be available under `name + + 'Provider'` key. + * @param {(Object|function())} provider If the provider is: + * + * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using + * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. + * - `Constructor`: a new instance of the provider will be created using + * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. + * + * @returns {Object} registered provider instance + + * @example + * + * The following example shows how to create a simple event tracking service and register it using + * {@link auto.$provide#provider $provide.provider()}. + * + * ```js + * // Define the eventTracker provider + * function EventTrackerProvider() { + * var trackingUrl = '/track'; + * + * // A provider method for configuring where the tracked events should been saved + * this.setTrackingUrl = function(url) { + * trackingUrl = url; + * }; + * + * // The service factory function + * this.$get = ['$http', function($http) { + * var trackedEvents = {}; + * return { + * // Call this to track an event + * event: function(event) { + * var count = trackedEvents[event] || 0; + * count += 1; + * trackedEvents[event] = count; + * return count; + * }, + * // Call this to save the tracked events to the trackingUrl + * save: function() { + * $http.post(trackingUrl, trackedEvents); + * } + * }; + * }]; + * } + * + * describe('eventTracker', function() { + * var postSpy; + * + * beforeEach(module(function($provide) { + * // Register the eventTracker provider + * $provide.provider('eventTracker', EventTrackerProvider); + * })); + * + * beforeEach(module(function(eventTrackerProvider) { + * // Configure eventTracker provider + * eventTrackerProvider.setTrackingUrl('/custom-track'); + * })); + * + * it('tracks events', inject(function(eventTracker) { + * expect(eventTracker.event('login')).toEqual(1); + * expect(eventTracker.event('login')).toEqual(2); + * })); + * + * it('saves to the tracking url', inject(function(eventTracker, $http) { + * postSpy = spyOn($http, 'post'); + * eventTracker.event('login'); + * eventTracker.save(); + * expect(postSpy).toHaveBeenCalled(); + * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); + * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); + * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); + * })); + * }); + * ``` + */ + +/** + * @ngdoc method + * @name $provide#factory + * @description + * + * Register a **service factory**, which will be called to return the service instance. + * This is short for registering a service where its provider consists of only a `$get` property, + * which is the given service factory function. + * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to + * configure your service in a provider. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} $getFn The injectable $getFn for the instance creation. + * Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service + * ```js + * $provide.factory('ping', ['$http', function($http) { + * return function ping() { + * return $http.send('/ping'); + * }; + * }]); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#service + * @description + * + * Register a **service constructor**, which will be invoked with `new` to create the service + * instance. + * This is short for registering a service where its provider's `$get` property is the service + * constructor function that will be used to instantiate the service instance. + * + * You should use {@link auto.$provide#service $provide.service(class)} if you define your service + * as a type/class. + * + * @param {string} name The name of the instance. + * @param {Function|Array.} constructor An injectable class (constructor function) + * that will be instantiated. + * @returns {Object} registered provider instance + * + * @example + * Here is an example of registering a service using + * {@link auto.$provide#service $provide.service(class)}. + * ```js + * var Ping = function($http) { + * this.$http = $http; + * }; + * + * Ping.$inject = ['$http']; + * + * Ping.prototype.send = function() { + * return this.$http.get('/ping'); + * }; + * $provide.service('ping', Ping); + * ``` + * You would then inject and use this service like this: + * ```js + * someModule.controller('Ctrl', ['ping', function(ping) { + * ping.send(); + * }]); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#value + * @description + * + * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a + * number, an array, an object or a function. This is short for registering a service where its + * provider's `$get` property is a factory function that takes no arguments and returns the **value + * service**. + * + * Value services are similar to constant services, except that they cannot be injected into a + * module configuration function (see {@link angular.Module#config}) but they can be overridden by + * an Angular + * {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the instance. + * @param {*} value The value. + * @returns {Object} registered provider instance + * + * @example + * Here are some examples of creating value services. + * ```js + * $provide.value('ADMIN_USER', 'admin'); + * + * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); + * + * $provide.value('halfOf', function(value) { + * return value / 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#constant + * @description + * + * Register a **constant service**, such as a string, a number, an array, an object or a function, + * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be + * injected into a module configuration function (see {@link angular.Module#config}) and it cannot + * be overridden by an Angular {@link auto.$provide#decorator decorator}. + * + * @param {string} name The name of the constant. + * @param {*} value The constant value. + * @returns {Object} registered instance + * + * @example + * Here a some examples of creating constants: + * ```js + * $provide.constant('SHARD_HEIGHT', 306); + * + * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); + * + * $provide.constant('double', function(value) { + * return value * 2; + * }); + * ``` + */ + + +/** + * @ngdoc method + * @name $provide#decorator + * @description + * + * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator + * intercepts the creation of a service, allowing it to override or modify the behaviour of the + * service. The object returned by the decorator may be the original service, or a new service + * object which replaces or wraps and delegates to the original service. + * + * @param {string} name The name of the service to decorate. + * @param {Function|Array.} decorator This function will be invoked when the service needs to be + * instantiated and should return the decorated service instance. The function is called using + * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. + * Local injection arguments: + * + * * `$delegate` - The original service instance, which can be monkey patched, configured, + * decorated or delegated to. + * + * @example + * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting + * calls to {@link ng.$log#error $log.warn()}. + * ```js + * $provide.decorator('$log', ['$delegate', function($delegate) { + * $delegate.warn = $delegate.error; + * return $delegate; + * }]); + * ``` + */ + + +function createInjector(modulesToLoad, strictDi) { + strictDi = (strictDi === true); + var INSTANTIATING = {}, + providerSuffix = 'Provider', + path = [], + loadedModules = new HashMap([], true), + providerCache = { + $provide: { + provider: supportObject(provider), + factory: supportObject(factory), + service: supportObject(service), + value: supportObject(value), + constant: supportObject(constant), + decorator: decorator + } + }, + providerInjector = (providerCache.$injector = + createInternalInjector(providerCache, function(serviceName, caller) { + if (angular.isString(caller)) { + path.push(caller); + } + throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); + })), + instanceCache = {}, + instanceInjector = (instanceCache.$injector = + createInternalInjector(instanceCache, function(serviceName, caller) { + var provider = providerInjector.get(serviceName + providerSuffix, caller); + return instanceInjector.invoke(provider.$get, provider, undefined, serviceName); + })); + + + forEach(loadModules(modulesToLoad), function(fn) { if (fn) instanceInjector.invoke(fn); }); + + return instanceInjector; + + //////////////////////////////////// + // $provider + //////////////////////////////////// + + function supportObject(delegate) { + return function(key, value) { + if (isObject(key)) { + forEach(key, reverseParams(delegate)); + } else { + return delegate(key, value); + } + }; + } + + function provider(name, provider_) { + assertNotHasOwnProperty(name, 'service'); + if (isFunction(provider_) || isArray(provider_)) { + provider_ = providerInjector.instantiate(provider_); + } + if (!provider_.$get) { + throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); + } + return providerCache[name + providerSuffix] = provider_; + } + + function enforceReturnValue(name, factory) { + return function enforcedReturnValue() { + var result = instanceInjector.invoke(factory, this); + if (isUndefined(result)) { + throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); + } + return result; + }; + } + + function factory(name, factoryFn, enforce) { + return provider(name, { + $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn + }); + } + + function service(name, constructor) { + return factory(name, ['$injector', function($injector) { + return $injector.instantiate(constructor); + }]); + } + + function value(name, val) { return factory(name, valueFn(val), false); } + + function constant(name, value) { + assertNotHasOwnProperty(name, 'constant'); + providerCache[name] = value; + instanceCache[name] = value; + } + + function decorator(serviceName, decorFn) { + var origProvider = providerInjector.get(serviceName + providerSuffix), + orig$get = origProvider.$get; + + origProvider.$get = function() { + var origInstance = instanceInjector.invoke(orig$get, origProvider); + return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); + }; + } + + //////////////////////////////////// + // Module Loading + //////////////////////////////////// + function loadModules(modulesToLoad) { + var runBlocks = [], moduleFn; + forEach(modulesToLoad, function(module) { + if (loadedModules.get(module)) return; + loadedModules.put(module, true); + + function runInvokeQueue(queue) { + var i, ii; + for (i = 0, ii = queue.length; i < ii; i++) { + var invokeArgs = queue[i], + provider = providerInjector.get(invokeArgs[0]); + + provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + } + } + + try { + if (isString(module)) { + moduleFn = angularModule(module); + runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); + runInvokeQueue(moduleFn._invokeQueue); + runInvokeQueue(moduleFn._configBlocks); + } else if (isFunction(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else if (isArray(module)) { + runBlocks.push(providerInjector.invoke(module)); + } else { + assertArgFn(module, 'module'); + } + } catch (e) { + if (isArray(module)) { + module = module[module.length - 1]; + } + if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { + // Safari & FF's stack traces don't contain error.message content + // unlike those of Chrome and IE + // So if stack doesn't contain message, we create a new string that contains both. + // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. + /* jshint -W022 */ + e = e.message + '\n' + e.stack; + } + throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", + module, e.stack || e.message || e); + } + }); + return runBlocks; + } + + //////////////////////////////////// + // internal Injector + //////////////////////////////////// + + function createInternalInjector(cache, factory) { + + function getService(serviceName, caller) { + if (cache.hasOwnProperty(serviceName)) { + if (cache[serviceName] === INSTANTIATING) { + throw $injectorMinErr('cdep', 'Circular dependency found: {0}', + serviceName + ' <- ' + path.join(' <- ')); + } + return cache[serviceName]; + } else { + try { + path.unshift(serviceName); + cache[serviceName] = INSTANTIATING; + return cache[serviceName] = factory(serviceName, caller); + } catch (err) { + if (cache[serviceName] === INSTANTIATING) { + delete cache[serviceName]; + } + throw err; + } finally { + path.shift(); + } + } + } + + function invoke(fn, self, locals, serviceName) { + if (typeof locals === 'string') { + serviceName = locals; + locals = null; + } + + var args = [], + $inject = createInjector.$$annotate(fn, strictDi, serviceName), + length, i, + key; + + for (i = 0, length = $inject.length; i < length; i++) { + key = $inject[i]; + if (typeof key !== 'string') { + throw $injectorMinErr('itkn', + 'Incorrect injection token! Expected service name as string, got {0}', key); + } + args.push( + locals && locals.hasOwnProperty(key) + ? locals[key] + : getService(key, serviceName) + ); + } + if (isArray(fn)) { + fn = fn[length]; + } + + // http://jsperf.com/angularjs-invoke-apply-vs-switch + // #5388 + return fn.apply(self, args); + } + + function instantiate(Type, locals, serviceName) { + // Check if Type is annotated and use just the given function at n-1 as parameter + // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); + // Object creation: http://jsperf.com/create-constructor/2 + var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null); + var returnedValue = invoke(Type, instance, locals, serviceName); + + return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; + } + + return { + invoke: invoke, + instantiate: instantiate, + get: getService, + annotate: createInjector.$$annotate, + has: function(name) { + return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); + } + }; + } +} + +createInjector.$$annotate = annotate; + +/** + * @ngdoc provider + * @name $anchorScrollProvider + * + * @description + * Use `$anchorScrollProvider` to disable automatic scrolling whenever + * {@link ng.$location#hash $location.hash()} changes. + */ +function $AnchorScrollProvider() { + + var autoScrollingEnabled = true; + + /** + * @ngdoc method + * @name $anchorScrollProvider#disableAutoScrolling + * + * @description + * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to + * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
+ * Use this method to disable automatic scrolling. + * + * If automatic scrolling is disabled, one must explicitly call + * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the + * current hash. + */ + this.disableAutoScrolling = function() { + autoScrollingEnabled = false; + }; + + /** + * @ngdoc service + * @name $anchorScroll + * @kind function + * @requires $window + * @requires $location + * @requires $rootScope + * + * @description + * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the + * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified + * in the + * [HTML5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document). + * + * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to + * match any anchor whenever it changes. This can be disabled by calling + * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. + * + * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a + * vertical scroll-offset (either fixed or dynamic). + * + * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of + * {@link ng.$location#hash $location.hash()} will be used. + * + * @property {(number|function|jqLite)} yOffset + * If set, specifies a vertical scroll-offset. This is often useful when there are fixed + * positioned elements at the top of the page, such as navbars, headers etc. + * + * `yOffset` can be specified in various ways: + * - **number**: A fixed number of pixels to be used as offset.

+ * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return + * a number representing the offset (in pixels).

+ * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from + * the top of the page to the element's bottom will be used as offset.
+ * **Note**: The element will be taken into account only as long as its `position` is set to + * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust + * their height and/or positioning according to the viewport's size. + * + *
+ *
+ * In order for `yOffset` to work properly, scrolling should take place on the document's root and + * not some child element. + *
+ * + * @example + + +
+ Go to bottom + You're at the bottom! +
+
+ + angular.module('anchorScrollExample', []) + .controller('ScrollController', ['$scope', '$location', '$anchorScroll', + function ($scope, $location, $anchorScroll) { + $scope.gotoBottom = function() { + // set the location.hash to the id of + // the element you wish to scroll to. + $location.hash('bottom'); + + // call $anchorScroll() + $anchorScroll(); + }; + }]); + + + #scrollArea { + height: 280px; + overflow: auto; + } + + #bottom { + display: block; + margin-top: 2000px; + } + +
+ * + *
+ * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). + * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. + * + * @example + + + +
+ Anchor {{x}} of 5 +
+
+ + angular.module('anchorScrollOffsetExample', []) + .run(['$anchorScroll', function($anchorScroll) { + $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels + }]) + .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', + function ($anchorScroll, $location, $scope) { + $scope.gotoAnchor = function(x) { + var newHash = 'anchor' + x; + if ($location.hash() !== newHash) { + // set the $location.hash to `newHash` and + // $anchorScroll will automatically scroll to it + $location.hash('anchor' + x); + } else { + // call $anchorScroll() explicitly, + // since $location.hash hasn't changed + $anchorScroll(); + } + }; + } + ]); + + + body { + padding-top: 50px; + } + + .anchor { + border: 2px dashed DarkOrchid; + padding: 10px 10px 200px 10px; + } + + .fixed-header { + background-color: rgba(0, 0, 0, 0.2); + height: 50px; + position: fixed; + top: 0; left: 0; right: 0; + } + + .fixed-header > a { + display: inline-block; + margin: 5px 15px; + } + +
+ */ + this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { + var document = $window.document; + + // Helper function to get first anchor from a NodeList + // (using `Array#some()` instead of `angular#forEach()` since it's more performant + // and working in all supported browsers.) + function getFirstAnchor(list) { + var result = null; + Array.prototype.some.call(list, function(element) { + if (nodeName_(element) === 'a') { + result = element; + return true; + } + }); + return result; + } + + function getYOffset() { + + var offset = scroll.yOffset; + + if (isFunction(offset)) { + offset = offset(); + } else if (isElement(offset)) { + var elem = offset[0]; + var style = $window.getComputedStyle(elem); + if (style.position !== 'fixed') { + offset = 0; + } else { + offset = elem.getBoundingClientRect().bottom; + } + } else if (!isNumber(offset)) { + offset = 0; + } + + return offset; + } + + function scrollTo(elem) { + if (elem) { + elem.scrollIntoView(); + + var offset = getYOffset(); + + if (offset) { + // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. + // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the + // top of the viewport. + // + // IF the number of pixels from the top of `elem` to the end of the page's content is less + // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some + // way down the page. + // + // This is often the case for elements near the bottom of the page. + // + // In such cases we do not need to scroll the whole `offset` up, just the difference between + // the top of the element and the offset, which is enough to align the top of `elem` at the + // desired position. + var elemTop = elem.getBoundingClientRect().top; + $window.scrollBy(0, elemTop - offset); + } + } else { + $window.scrollTo(0, 0); + } + } + + function scroll(hash) { + hash = isString(hash) ? hash : $location.hash(); + var elm; + + // empty hash, scroll to the top of the page + if (!hash) scrollTo(null); + + // element with given id + else if ((elm = document.getElementById(hash))) scrollTo(elm); + + // first anchor with given name :-D + else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); + + // no element and hash == 'top', scroll to the top of the page + else if (hash === 'top') scrollTo(null); + } + + // does not scroll when user clicks on anchor link that is currently on + // (no url change, no $location.hash() change), browser native does scroll + if (autoScrollingEnabled) { + $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, + function autoScrollWatchAction(newVal, oldVal) { + // skip the initial scroll if $location.hash is empty + if (newVal === oldVal && newVal === '') return; + + jqLiteDocumentLoaded(function() { + $rootScope.$evalAsync(scroll); + }); + }); + } + + return scroll; + }]; +} + +var $animateMinErr = minErr('$animate'); +var ELEMENT_NODE = 1; +var NG_ANIMATE_CLASSNAME = 'ng-animate'; + +function mergeClasses(a,b) { + if (!a && !b) return ''; + if (!a) return b; + if (!b) return a; + if (isArray(a)) a = a.join(' '); + if (isArray(b)) b = b.join(' '); + return a + ' ' + b; +} + +function extractElementNode(element) { + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType === ELEMENT_NODE) { + return elm; + } + } +} + +function splitClasses(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + // Use createMap() to prevent class assumptions involving property names in + // Object.prototype + var obj = createMap(); + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; +} + +// if any other type of options value besides an Object value is +// passed into the $animate.method() animation then this helper code +// will be run which will ignore it. While this patch is not the +// greatest solution to this, a lot of existing plugins depend on +// $animate to either call the callback (< 1.2) or return a promise +// that can be changed. This helper function ensures that the options +// are wiped clean incase a callback function is provided. +function prepareAnimateOptions(options) { + return isObject(options) + ? options + : {}; +} + +var $$CoreAnimateRunnerProvider = function() { + this.$get = ['$q', '$$rAF', function($q, $$rAF) { + function AnimateRunner() {} + AnimateRunner.all = noop; + AnimateRunner.chain = noop; + AnimateRunner.prototype = { + end: noop, + cancel: noop, + resume: noop, + pause: noop, + complete: noop, + then: function(pass, fail) { + return $q(function(resolve) { + $$rAF(function() { + resolve(); + }); + }).then(pass, fail); + } + }; + return AnimateRunner; + }]; +}; + +// this is prefixed with Core since it conflicts with +// the animateQueueProvider defined in ngAnimate/animateQueue.js +var $$CoreAnimateQueueProvider = function() { + var postDigestQueue = new HashMap(); + var postDigestElements = []; + + this.$get = ['$$AnimateRunner', '$rootScope', + function($$AnimateRunner, $rootScope) { + return { + enabled: noop, + on: noop, + off: noop, + pin: noop, + + push: function(element, event, options, domOperation) { + domOperation && domOperation(); + + options = options || {}; + options.from && element.css(options.from); + options.to && element.css(options.to); + + if (options.addClass || options.removeClass) { + addRemoveClassesPostDigest(element, options.addClass, options.removeClass); + } + + return new $$AnimateRunner(); // jshint ignore:line + } + }; + + function addRemoveClassesPostDigest(element, add, remove) { + var data = postDigestQueue.get(element); + var classVal; + + if (!data) { + postDigestQueue.put(element, data = {}); + postDigestElements.push(element); + } + + if (add) { + forEach(add.split(' '), function(className) { + if (className) { + data[className] = true; + } + }); + } + + if (remove) { + forEach(remove.split(' '), function(className) { + if (className) { + data[className] = false; + } + }); + } + + if (postDigestElements.length > 1) return; + + $rootScope.$$postDigest(function() { + forEach(postDigestElements, function(element) { + var data = postDigestQueue.get(element); + if (data) { + var existing = splitClasses(element.attr('class')); + var toAdd = ''; + var toRemove = ''; + forEach(data, function(status, className) { + var hasClass = !!existing[className]; + if (status !== hasClass) { + if (status) { + toAdd += (toAdd.length ? ' ' : '') + className; + } else { + toRemove += (toRemove.length ? ' ' : '') + className; + } + } + }); + + forEach(element, function(elm) { + toAdd && jqLiteAddClass(elm, toAdd); + toRemove && jqLiteRemoveClass(elm, toRemove); + }); + postDigestQueue.remove(element); + } + }); + + postDigestElements.length = 0; + }); + } + }]; +}; + +/** + * @ngdoc provider + * @name $animateProvider + * + * @description + * Default implementation of $animate that doesn't perform any animations, instead just + * synchronously performs DOM updates and resolves the returned runner promise. + * + * In order to enable animations the `ngAnimate` module has to be loaded. + * + * To see the functional implementation check out `src/ngAnimate/animate.js`. + */ +var $AnimateProvider = ['$provide', function($provide) { + var provider = this; + + this.$$registeredAnimations = Object.create(null); + + /** + * @ngdoc method + * @name $animateProvider#register + * + * @description + * Registers a new injectable animation factory function. The factory function produces the + * animation object which contains callback functions for each event that is expected to be + * animated. + * + * * `eventFn`: `function(element, ... , doneFunction, options)` + * The element to animate, the `doneFunction` and the options fed into the animation. Depending + * on the type of animation additional arguments will be injected into the animation function. The + * list below explains the function signatures for the different animation methods: + * + * - setClass: function(element, addedClasses, removedClasses, doneFunction, options) + * - addClass: function(element, addedClasses, doneFunction, options) + * - removeClass: function(element, removedClasses, doneFunction, options) + * - enter, leave, move: function(element, doneFunction, options) + * - animate: function(element, fromStyles, toStyles, doneFunction, options) + * + * Make sure to trigger the `doneFunction` once the animation is fully complete. + * + * ```js + * return { + * //enter, leave, move signature + * eventFn : function(element, done, options) { + * //code to run the animation + * //once complete, then run done() + * return function endFunction(wasCancelled) { + * //code to cancel the animation + * } + * } + * } + * ``` + * + * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to). + * @param {Function} factory The factory function that will be executed to return the animation + * object. + */ + this.register = function(name, factory) { + if (name && name.charAt(0) !== '.') { + throw $animateMinErr('notcsel', "Expecting class selector starting with '.' got '{0}'.", name); + } + + var key = name + '-animation'; + provider.$$registeredAnimations[name.substr(1)] = key; + $provide.factory(key, factory); + }; + + /** + * @ngdoc method + * @name $animateProvider#classNameFilter + * + * @description + * Sets and/or returns the CSS class regular expression that is checked when performing + * an animation. Upon bootstrap the classNameFilter value is not set at all and will + * therefore enable $animate to attempt to perform an animation on any element that is triggered. + * When setting the `classNameFilter` value, animations will only be performed on elements + * that successfully match the filter expression. This in turn can boost performance + * for low-powered devices as well as applications containing a lot of structural operations. + * @param {RegExp=} expression The className expression which will be checked against all animations + * @return {RegExp} The current CSS className expression value. If null then there is no expression value + */ + this.classNameFilter = function(expression) { + if (arguments.length === 1) { + this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; + if (this.$$classNameFilter) { + var reservedRegex = new RegExp("(\\s+|\\/)" + NG_ANIMATE_CLASSNAME + "(\\s+|\\/)"); + if (reservedRegex.test(this.$$classNameFilter.toString())) { + throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME); + + } + } + } + return this.$$classNameFilter; + }; + + this.$get = ['$$animateQueue', function($$animateQueue) { + function domInsert(element, parentElement, afterElement) { + // if for some reason the previous element was removed + // from the dom sometime before this code runs then let's + // just stick to using the parent element as the anchor + if (afterElement) { + var afterNode = extractElementNode(afterElement); + if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) { + afterElement = null; + } + } + afterElement ? afterElement.after(element) : parentElement.prepend(element); + } + + /** + * @ngdoc service + * @name $animate + * @description The $animate service exposes a series of DOM utility methods that provide support + * for animation hooks. The default behavior is the application of DOM operations, however, + * when an animation is detected (and animations are enabled), $animate will do the heavy lifting + * to ensure that animation runs with the triggered DOM operation. + * + * By default $animate doesn't trigger an animations. This is because the `ngAnimate` module isn't + * included and only when it is active then the animation hooks that `$animate` triggers will be + * functional. Once active then all structural `ng-` directives will trigger animations as they perform + * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`, + * `ngShow`, `ngHide` and `ngMessages` also provide support for animations. + * + * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives. + * + * To learn more about enabling animation support, click here to visit the + * {@link ngAnimate ngAnimate module page}. + */ + return { + // we don't call it directly since non-existant arguments may + // be interpreted as null within the sub enabled function + + /** + * + * @ngdoc method + * @name $animate#on + * @kind function + * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...) + * has fired on the given element or among any of its children. Once the listener is fired, the provided callback + * is fired with the following params: + * + * ```js + * $animate.on('enter', container, + * function callback(element, phase) { + * // cool we detected an enter animation within the container + * } + * ); + * ``` + * + * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself + * as well as among its children + * @param {Function} callback the callback function that will be fired when the listener is triggered + * + * The arguments present in the callback function are: + * * `element` - The captured DOM element that the animation was fired on. + * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends). + */ + on: $$animateQueue.on, + + /** + * + * @ngdoc method + * @name $animate#off + * @kind function + * @description Deregisters an event listener based on the event which has been associated with the provided element. This method + * can be used in three different ways depending on the arguments: + * + * ```js + * // remove all the animation event listeners listening for `enter` + * $animate.off('enter'); + * + * // remove all the animation event listeners listening for `enter` on the given element and its children + * $animate.off('enter', container); + * + * // remove the event listener function provided by `listenerFn` that is set + * // to listen for `enter` on the given `element` as well as its children + * $animate.off('enter', container, callback); + * ``` + * + * @param {string} event the animation event (e.g. enter, leave, move, addClass, removeClass, etc...) + * @param {DOMElement=} container the container element the event listener was placed on + * @param {Function=} callback the callback function that was registered as the listener + */ + off: $$animateQueue.off, + + /** + * @ngdoc method + * @name $animate#pin + * @kind function + * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists + * outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the + * element despite being outside the realm of the application or within another application. Say for example if the application + * was bootstrapped on an element that is somewhere inside of the `` tag, but we wanted to allow for an element to be situated + * as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind + * that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association. + * + * Note that this feature is only active when the `ngAnimate` module is used. + * + * @param {DOMElement} element the external element that will be pinned + * @param {DOMElement} parentElement the host parent element that will be associated with the external element + */ + pin: $$animateQueue.pin, + + /** + * + * @ngdoc method + * @name $animate#enabled + * @kind function + * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This + * function can be called in four ways: + * + * ```js + * // returns true or false + * $animate.enabled(); + * + * // changes the enabled state for all animations + * $animate.enabled(false); + * $animate.enabled(true); + * + * // returns true or false if animations are enabled for an element + * $animate.enabled(element); + * + * // changes the enabled state for an element and its children + * $animate.enabled(element, true); + * $animate.enabled(element, false); + * ``` + * + * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state + * @param {boolean=} enabled whether or not the animations will be enabled for the element + * + * @return {boolean} whether or not animations are enabled + */ + enabled: $$animateQueue.enabled, + + /** + * @ngdoc method + * @name $animate#cancel + * @kind function + * @description Cancels the provided animation. + * + * @param {Promise} animationPromise The animation promise that is returned when an animation is started. + */ + cancel: function(runner) { + runner.end && runner.end(); + }, + + /** + * + * @ngdoc method + * @name $animate#enter + * @kind function + * @description Inserts the element into the DOM either after the `after` element (if provided) or + * as the first child within the `parent` element and then triggers an animation. + * A promise is returned that will be resolved during the next digest once the animation + * has completed. + * + * @param {DOMElement} element the element which will be inserted into the DOM + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + enter: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options)); + }, + + /** + * + * @ngdoc method + * @name $animate#move + * @kind function + * @description Inserts (moves) the element into its new position in the DOM either after + * the `after` element (if provided) or as the first child within the `parent` element + * and then triggers an animation. A promise is returned that will be resolved + * during the next digest once the animation has completed. + * + * @param {DOMElement} element the element which will be moved into the new DOM position + * @param {DOMElement} parent the parent element which will append the element as + * a child (so long as the after element is not present) + * @param {DOMElement=} after the sibling element after which the element will be appended + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + move: function(element, parent, after, options) { + parent = parent && jqLite(parent); + after = after && jqLite(after); + parent = parent || after.parent(); + domInsert(element, parent, after); + return $$animateQueue.push(element, 'move', prepareAnimateOptions(options)); + }, + + /** + * @ngdoc method + * @name $animate#leave + * @kind function + * @description Triggers an animation and then removes the element from the DOM. + * When the function is called a promise is returned that will be resolved during the next + * digest once the animation has completed. + * + * @param {DOMElement} element the element which will be removed from the DOM + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + leave: function(element, options) { + return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() { + element.remove(); + }); + }, + + /** + * @ngdoc method + * @name $animate#addClass + * @kind function + * + * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon + * execution, the addClass operation will only be handled after the next digest and it will not trigger an + * animation if element already contains the CSS class or if the class is removed at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + addClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addclass, className); + return $$animateQueue.push(element, 'addClass', options); + }, + + /** + * @ngdoc method + * @name $animate#removeClass + * @kind function + * + * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon + * execution, the removeClass operation will only be handled after the next digest and it will not trigger an + * animation if element does not contain the CSS class or if the class is added at a later step. + * Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + removeClass: function(element, className, options) { + options = prepareAnimateOptions(options); + options.removeClass = mergeClasses(options.removeClass, className); + return $$animateQueue.push(element, 'removeClass', options); + }, + + /** + * @ngdoc method + * @name $animate#setClass + * @kind function + * + * @description Performs both the addition and removal of a CSS classes on an element and (during the process) + * triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and + * `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has + * passed. Note that class-based animations are treated differently compared to structural animations + * (like enter, move and leave) since the CSS classes may be added/removed at different points + * depending if CSS or JavaScript animations are used. + * + * @param {DOMElement} element the element which the CSS classes will be applied to + * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces) + * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + setClass: function(element, add, remove, options) { + options = prepareAnimateOptions(options); + options.addClass = mergeClasses(options.addClass, add); + options.removeClass = mergeClasses(options.removeClass, remove); + return $$animateQueue.push(element, 'setClass', options); + }, + + /** + * @ngdoc method + * @name $animate#animate + * @kind function + * + * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element. + * If any detected CSS transition, keyframe or JavaScript matches the provided className value then the animation will take + * on the provided styles. For example, if a transition animation is set for the given className then the provided from and + * to styles will be applied alongside the given transition. If a JavaScript animation is detected then the provided styles + * will be given in as function paramters into the `animate` method (or as apart of the `options` parameter). + * + * @param {DOMElement} element the element which the CSS styles will be applied to + * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation. + * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation. + * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If + * this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element. + * (Note that if no animation is detected then this value will not be appplied to the element.) + * @param {object=} options an optional collection of options/styles that will be applied to the element + * + * @return {Promise} the animation callback promise + */ + animate: function(element, from, to, className, options) { + options = prepareAnimateOptions(options); + options.from = options.from ? extend(options.from, from) : from; + options.to = options.to ? extend(options.to, to) : to; + + className = className || 'ng-inline-animate'; + options.tempClasses = mergeClasses(options.tempClasses, className); + return $$animateQueue.push(element, 'animate', options); + } + }; + }]; +}]; + +function $$AsyncCallbackProvider() { + this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) { + return $$rAF.supported + ? function(fn) { return $$rAF(fn); } + : function(fn) { + return $timeout(fn, 0, false); + }; + }]; +} + +/* global stripHash: true */ + +/** + * ! This is a private undocumented service ! + * + * @name $browser + * @requires $log + * @description + * This object has two goals: + * + * - hide all the global state in the browser caused by the window object + * - abstract away all the browser specific features and inconsistencies + * + * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` + * service, which can be used for convenient testing of the application without the interaction with + * the real browser apis. + */ +/** + * @param {object} window The global window object. + * @param {object} document jQuery wrapped document. + * @param {object} $log window.console or an object with the same interface. + * @param {object} $sniffer $sniffer service + */ +function Browser(window, document, $log, $sniffer) { + var self = this, + rawDocument = document[0], + location = window.location, + history = window.history, + setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, + pendingDeferIds = {}; + + self.isMock = false; + + var outstandingRequestCount = 0; + var outstandingRequestCallbacks = []; + + // TODO(vojta): remove this temporary api + self.$$completeOutstandingRequest = completeOutstandingRequest; + self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; + + /** + * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` + * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. + */ + function completeOutstandingRequest(fn) { + try { + fn.apply(null, sliceArgs(arguments, 1)); + } finally { + outstandingRequestCount--; + if (outstandingRequestCount === 0) { + while (outstandingRequestCallbacks.length) { + try { + outstandingRequestCallbacks.pop()(); + } catch (e) { + $log.error(e); + } + } + } + } + } + + function getHash(url) { + var index = url.indexOf('#'); + return index === -1 ? '' : url.substr(index); + } + + /** + * @private + * Note: this method is used only by scenario runner + * TODO(vojta): prefix this method with $$ ? + * @param {function()} callback Function that will be called when no outstanding request + */ + self.notifyWhenNoOutstandingRequests = function(callback) { + if (outstandingRequestCount === 0) { + callback(); + } else { + outstandingRequestCallbacks.push(callback); + } + }; + + ////////////////////////////////////////////////////////////// + // URL API + ////////////////////////////////////////////////////////////// + + var cachedState, lastHistoryState, + lastBrowserUrl = location.href, + baseElement = document.find('base'), + reloadLocation = null; + + cacheState(); + lastHistoryState = cachedState; + + /** + * @name $browser#url + * + * @description + * GETTER: + * Without any argument, this method just returns current value of location.href. + * + * SETTER: + * With at least one argument, this method sets url to new value. + * If html5 history api supported, pushState/replaceState is used, otherwise + * location.href/location.replace is used. + * Returns its own instance to allow chaining + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to change url. + * + * @param {string} url New url (when used as setter) + * @param {boolean=} replace Should new url replace current history record? + * @param {object=} state object to use with pushState/replaceState + */ + self.url = function(url, replace, state) { + // In modern browsers `history.state` is `null` by default; treating it separately + // from `undefined` would cause `$browser.url('/foo')` to change `history.state` + // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. + if (isUndefined(state)) { + state = null; + } + + // Android Browser BFCache causes location, history reference to become stale. + if (location !== window.location) location = window.location; + if (history !== window.history) history = window.history; + + // setter + if (url) { + var sameState = lastHistoryState === state; + + // Don't change anything if previous and current URLs and states match. This also prevents + // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. + // See https://github.com/angular/angular.js/commit/ffb2701 + if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { + return self; + } + var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); + lastBrowserUrl = url; + lastHistoryState = state; + // Don't use history API if only the hash changed + // due to a bug in IE10/IE11 which leads + // to not firing a `hashchange` nor `popstate` event + // in some cases (see #9143). + if ($sniffer.history && (!sameBase || !sameState)) { + history[replace ? 'replaceState' : 'pushState'](state, '', url); + cacheState(); + // Do the assignment again so that those two variables are referentially identical. + lastHistoryState = cachedState; + } else { + if (!sameBase || reloadLocation) { + reloadLocation = url; + } + if (replace) { + location.replace(url); + } else if (!sameBase) { + location.href = url; + } else { + location.hash = getHash(url); + } + } + return self; + // getter + } else { + // - reloadLocation is needed as browsers don't allow to read out + // the new location.href if a reload happened. + // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 + return reloadLocation || location.href.replace(/%27/g,"'"); + } + }; + + /** + * @name $browser#state + * + * @description + * This method is a getter. + * + * Return history.state or null if history.state is undefined. + * + * @returns {object} state + */ + self.state = function() { + return cachedState; + }; + + var urlChangeListeners = [], + urlChangeInit = false; + + function cacheStateAndFireUrlChange() { + cacheState(); + fireUrlChange(); + } + + function getCurrentState() { + try { + return history.state; + } catch (e) { + // MSIE can reportedly throw when there is no state (UNCONFIRMED). + } + } + + // This variable should be used *only* inside the cacheState function. + var lastCachedState = null; + function cacheState() { + // This should be the only place in $browser where `history.state` is read. + cachedState = getCurrentState(); + cachedState = isUndefined(cachedState) ? null : cachedState; + + // Prevent callbacks fo fire twice if both hashchange & popstate were fired. + if (equals(cachedState, lastCachedState)) { + cachedState = lastCachedState; + } + lastCachedState = cachedState; + } + + function fireUrlChange() { + if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { + return; + } + + lastBrowserUrl = self.url(); + lastHistoryState = cachedState; + forEach(urlChangeListeners, function(listener) { + listener(self.url(), cachedState); + }); + } + + /** + * @name $browser#onUrlChange + * + * @description + * Register callback function that will be called, when url changes. + * + * It's only called when the url is changed from outside of angular: + * - user types different url into address bar + * - user clicks on history (forward/back) button + * - user clicks on a link + * + * It's not called when url is changed by $browser.url() method + * + * The listener gets called with new url as parameter. + * + * NOTE: this api is intended for use only by the $location service. Please use the + * {@link ng.$location $location service} to monitor url changes in angular apps. + * + * @param {function(string)} listener Listener function to be called when url changes. + * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. + */ + self.onUrlChange = function(callback) { + // TODO(vojta): refactor to use node's syntax for events + if (!urlChangeInit) { + // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) + // don't fire popstate when user change the address bar and don't fire hashchange when url + // changed by push/replaceState + + // html5 history api - popstate event + if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); + // hashchange event + jqLite(window).on('hashchange', cacheStateAndFireUrlChange); + + urlChangeInit = true; + } + + urlChangeListeners.push(callback); + return callback; + }; + + /** + * @private + * Remove popstate and hashchange handler from window. + * + * NOTE: this api is intended for use only by $rootScope. + */ + self.$$applicationDestroyed = function() { + jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange); + }; + + /** + * Checks whether the url has changed outside of Angular. + * Needs to be exported to be able to check for changes that have been done in sync, + * as hashchange/popstate events fire in async. + */ + self.$$checkUrlChange = fireUrlChange; + + ////////////////////////////////////////////////////////////// + // Misc API + ////////////////////////////////////////////////////////////// + + /** + * @name $browser#baseHref + * + * @description + * Returns current + * (always relative - without domain) + * + * @returns {string} The current base href + */ + self.baseHref = function() { + var href = baseElement.attr('href'); + return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; + }; + + /** + * @name $browser#defer + * @param {function()} fn A function, who's execution should be deferred. + * @param {number=} [delay=0] of milliseconds to defer the function execution. + * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. + * + * @description + * Executes a fn asynchronously via `setTimeout(fn, delay)`. + * + * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using + * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed + * via `$browser.defer.flush()`. + * + */ + self.defer = function(fn, delay) { + var timeoutId; + outstandingRequestCount++; + timeoutId = setTimeout(function() { + delete pendingDeferIds[timeoutId]; + completeOutstandingRequest(fn); + }, delay || 0); + pendingDeferIds[timeoutId] = true; + return timeoutId; + }; + + + /** + * @name $browser#defer.cancel + * + * @description + * Cancels a deferred task identified with `deferId`. + * + * @param {*} deferId Token returned by the `$browser.defer` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + self.defer.cancel = function(deferId) { + if (pendingDeferIds[deferId]) { + delete pendingDeferIds[deferId]; + clearTimeout(deferId); + completeOutstandingRequest(noop); + return true; + } + return false; + }; + +} + +function $BrowserProvider() { + this.$get = ['$window', '$log', '$sniffer', '$document', + function($window, $log, $sniffer, $document) { + return new Browser($window, $document, $log, $sniffer); + }]; +} + +/** + * @ngdoc service + * @name $cacheFactory + * + * @description + * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to + * them. + * + * ```js + * + * var cache = $cacheFactory('cacheId'); + * expect($cacheFactory.get('cacheId')).toBe(cache); + * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); + * + * cache.put("key", "value"); + * cache.put("another key", "another value"); + * + * // We've specified no options on creation + * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); + * + * ``` + * + * + * @param {string} cacheId Name or id of the newly created cache. + * @param {object=} options Options object that specifies the cache behavior. Properties: + * + * - `{number=}` `capacity` — turns the cache into LRU cache. + * + * @returns {object} Newly created cache object with the following set of methods: + * + * - `{object}` `info()` — Returns id, size, and options of cache. + * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns + * it. + * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. + * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. + * - `{void}` `removeAll()` — Removes all cached values. + * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. + * + * @example + + +
+ + + + +

Cached Values

+
+ + : + +
+ +

Cache Info

+
+ + : + +
+
+
+ + angular.module('cacheExampleApp', []). + controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { + $scope.keys = []; + $scope.cache = $cacheFactory('cacheId'); + $scope.put = function(key, value) { + if ($scope.cache.get(key) === undefined) { + $scope.keys.push(key); + } + $scope.cache.put(key, value === undefined ? null : value); + }; + }]); + + + p { + margin: 10px 0 3px; + } + +
+ */ +function $CacheFactoryProvider() { + + this.$get = function() { + var caches = {}; + + function cacheFactory(cacheId, options) { + if (cacheId in caches) { + throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); + } + + var size = 0, + stats = extend({}, options, {id: cacheId}), + data = {}, + capacity = (options && options.capacity) || Number.MAX_VALUE, + lruHash = {}, + freshEnd = null, + staleEnd = null; + + /** + * @ngdoc type + * @name $cacheFactory.Cache + * + * @description + * A cache object used to store and retrieve data, primarily used by + * {@link $http $http} and the {@link ng.directive:script script} directive to cache + * templates and other data. + * + * ```js + * angular.module('superCache') + * .factory('superCache', ['$cacheFactory', function($cacheFactory) { + * return $cacheFactory('super-cache'); + * }]); + * ``` + * + * Example test: + * + * ```js + * it('should behave like a cache', inject(function(superCache) { + * superCache.put('key', 'value'); + * superCache.put('another key', 'another value'); + * + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 2 + * }); + * + * superCache.remove('another key'); + * expect(superCache.get('another key')).toBeUndefined(); + * + * superCache.removeAll(); + * expect(superCache.info()).toEqual({ + * id: 'super-cache', + * size: 0 + * }); + * })); + * ``` + */ + return caches[cacheId] = { + + /** + * @ngdoc method + * @name $cacheFactory.Cache#put + * @kind function + * + * @description + * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be + * retrieved later, and incrementing the size of the cache if the key was not already + * present in the cache. If behaving like an LRU cache, it will also remove stale + * entries from the set. + * + * It will not insert undefined values into the cache. + * + * @param {string} key the key under which the cached data is stored. + * @param {*} value the value to store alongside the key. If it is undefined, the key + * will not be stored. + * @returns {*} the value stored. + */ + put: function(key, value) { + if (isUndefined(value)) return; + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); + + refresh(lruEntry); + } + + if (!(key in data)) size++; + data[key] = value; + + if (size > capacity) { + this.remove(staleEnd.key); + } + + return value; + }, + + /** + * @ngdoc method + * @name $cacheFactory.Cache#get + * @kind function + * + * @description + * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the data to be retrieved + * @returns {*} the value stored. + */ + get: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + refresh(lruEntry); + } + + return data[key]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#remove + * @kind function + * + * @description + * Removes an entry from the {@link $cacheFactory.Cache Cache} object. + * + * @param {string} key the key of the entry to be removed + */ + remove: function(key) { + if (capacity < Number.MAX_VALUE) { + var lruEntry = lruHash[key]; + + if (!lruEntry) return; + + if (lruEntry == freshEnd) freshEnd = lruEntry.p; + if (lruEntry == staleEnd) staleEnd = lruEntry.n; + link(lruEntry.n,lruEntry.p); + + delete lruHash[key]; + } + + delete data[key]; + size--; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#removeAll + * @kind function + * + * @description + * Clears the cache object of any entries. + */ + removeAll: function() { + data = {}; + size = 0; + lruHash = {}; + freshEnd = staleEnd = null; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#destroy + * @kind function + * + * @description + * Destroys the {@link $cacheFactory.Cache Cache} object entirely, + * removing it from the {@link $cacheFactory $cacheFactory} set. + */ + destroy: function() { + data = null; + stats = null; + lruHash = null; + delete caches[cacheId]; + }, + + + /** + * @ngdoc method + * @name $cacheFactory.Cache#info + * @kind function + * + * @description + * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. + * + * @returns {object} an object with the following properties: + *
    + *
  • **id**: the id of the cache instance
  • + *
  • **size**: the number of entries kept in the cache instance
  • + *
  • **...**: any additional properties from the options object when creating the + * cache.
  • + *
+ */ + info: function() { + return extend({}, stats, {size: size}); + } + }; + + + /** + * makes the `entry` the freshEnd of the LRU linked list + */ + function refresh(entry) { + if (entry != freshEnd) { + if (!staleEnd) { + staleEnd = entry; + } else if (staleEnd == entry) { + staleEnd = entry.n; + } + + link(entry.n, entry.p); + link(entry, freshEnd); + freshEnd = entry; + freshEnd.n = null; + } + } + + + /** + * bidirectionally links two entries of the LRU linked list + */ + function link(nextEntry, prevEntry) { + if (nextEntry != prevEntry) { + if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify + if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify + } + } + } + + + /** + * @ngdoc method + * @name $cacheFactory#info + * + * @description + * Get information about all the caches that have been created + * + * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` + */ + cacheFactory.info = function() { + var info = {}; + forEach(caches, function(cache, cacheId) { + info[cacheId] = cache.info(); + }); + return info; + }; + + + /** + * @ngdoc method + * @name $cacheFactory#get + * + * @description + * Get access to a cache object by the `cacheId` used when it was created. + * + * @param {string} cacheId Name or id of a cache to access. + * @returns {object} Cache object identified by the cacheId or undefined if no such cache. + */ + cacheFactory.get = function(cacheId) { + return caches[cacheId]; + }; + + + return cacheFactory; + }; +} + +/** + * @ngdoc service + * @name $templateCache + * + * @description + * The first time a template is used, it is loaded in the template cache for quick retrieval. You + * can load templates directly into the cache in a `script` tag, or by consuming the + * `$templateCache` service directly. + * + * Adding via the `script` tag: + * + * ```html + * + * ``` + * + * **Note:** the `script` tag containing the template does not need to be included in the `head` of + * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, + * element with ng-app attribute), otherwise the template will be ignored. + * + * Adding via the `$templateCache` service: + * + * ```js + * var myApp = angular.module('myApp', []); + * myApp.run(function($templateCache) { + * $templateCache.put('templateId.html', 'This is the content of the template'); + * }); + * ``` + * + * To retrieve the template later, simply use it in your HTML: + * ```html + *
+ * ``` + * + * or get it via Javascript: + * ```js + * $templateCache.get('templateId.html') + * ``` + * + * See {@link ng.$cacheFactory $cacheFactory}. + * + */ +function $TemplateCacheProvider() { + this.$get = ['$cacheFactory', function($cacheFactory) { + return $cacheFactory('templates'); + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! + * + * DOM-related variables: + * + * - "node" - DOM Node + * - "element" - DOM Element or Node + * - "$node" or "$element" - jqLite-wrapped node or element + * + * + * Compiler related stuff: + * + * - "linkFn" - linking fn of a single directive + * - "nodeLinkFn" - function that aggregates all linking fns for a particular node + * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node + * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) + */ + + +/** + * @ngdoc service + * @name $compile + * @kind function + * + * @description + * Compiles an HTML string or DOM into a template and produces a template function, which + * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. + * + * The compilation is a process of walking the DOM tree and matching DOM elements to + * {@link ng.$compileProvider#directive directives}. + * + *
+ * **Note:** This document is an in-depth reference of all directive options. + * For a gentle introduction to directives with examples of common use cases, + * see the {@link guide/directive directive guide}. + *
+ * + * ## Comprehensive Directive API + * + * There are many different options for a directive. + * + * The difference resides in the return value of the factory function. + * You can either return a "Directive Definition Object" (see below) that defines the directive properties, + * or just the `postLink` function (all other properties will have the default values). + * + *
+ * **Best Practice:** It's recommended to use the "directive definition object" form. + *
+ * + * Here's an example directive declared with a Directive Definition Object: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * priority: 0, + * template: '
', // or // function(tElement, tAttrs) { ... }, + * // or + * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, + * transclude: false, + * restrict: 'A', + * templateNamespace: 'html', + * scope: false, + * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, + * controllerAs: 'stringIdentifier', + * bindToController: false, + * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], + * compile: function compile(tElement, tAttrs, transclude) { + * return { + * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * post: function postLink(scope, iElement, iAttrs, controller) { ... } + * } + * // or + * // return function postLink( ... ) { ... } + * }, + * // or + * // link: { + * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, + * // post: function postLink(scope, iElement, iAttrs, controller) { ... } + * // } + * // or + * // link: function postLink( ... ) { ... } + * }; + * return directiveDefinitionObject; + * }); + * ``` + * + *
+ * **Note:** Any unspecified options will use the default value. You can see the default values below. + *
+ * + * Therefore the above can be simplified as: + * + * ```js + * var myModule = angular.module(...); + * + * myModule.directive('directiveName', function factory(injectables) { + * var directiveDefinitionObject = { + * link: function postLink(scope, iElement, iAttrs) { ... } + * }; + * return directiveDefinitionObject; + * // or + * // return function postLink(scope, iElement, iAttrs) { ... } + * }); + * ``` + * + * + * + * ### Directive Definition Object + * + * The directive definition object provides instructions to the {@link ng.$compile + * compiler}. The attributes are: + * + * #### `multiElement` + * When this property is set to true, the HTML compiler will collect DOM nodes between + * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them + * together as the directive elements. It is recommended that this feature be used on directives + * which are not strictly behavioural (such as {@link ngClick}), and which + * do not manipulate or replace child nodes (such as {@link ngInclude}). + * + * #### `priority` + * When there are multiple directives defined on a single DOM element, sometimes it + * is necessary to specify the order in which the directives are applied. The `priority` is used + * to sort the directives before their `compile` functions get called. Priority is defined as a + * number. Directives with greater numerical `priority` are compiled first. Pre-link functions + * are also run in priority order, but post-link functions are run in reverse order. The order + * of directives with the same priority is undefined. The default priority is `0`. + * + * #### `terminal` + * If set to true then the current `priority` will be the last set of directives + * which will execute (any directives at the current priority will still execute + * as the order of execution on same `priority` is undefined). Note that expressions + * and other directives used in the directive's template will also be excluded from execution. + * + * #### `scope` + * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the + * same element request a new scope, only one new scope is created. The new scope rule does not + * apply for the root of the template since the root of the template always gets a new scope. + * + * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from + * normal scope in that it does not prototypically inherit from the parent scope. This is useful + * when creating reusable components, which should not accidentally read or modify data in the + * parent scope. + * + * The 'isolate' scope takes an object hash which defines a set of local scope properties + * derived from the parent scope. These local properties are useful for aliasing values for + * templates. Locals definition is a hash of local scope property to its source: + * + * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is + * always a string since DOM attributes are strings. If no `attr` name is specified then the + * attribute name is assumed to be the same as the local name. + * Given `` and widget definition + * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect + * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the + * `localName` property on the widget scope. The `name` is read from the parent scope (not + * component scope). + * + * * `=` or `=attr` - set up bi-directional binding between a local scope property and the + * parent scope property of name defined via the value of the `attr` attribute. If no `attr` + * name is specified then the attribute name is assumed to be the same as the local name. + * Given `` and widget definition of + * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the + * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected + * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent + * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You + * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. If + * you want to shallow watch for changes (i.e. $watchCollection instead of $watch) you can use + * `=*` or `=*attr` (`=*?` or `=*?attr` if the property is optional). + * + * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. + * If no `attr` name is specified then the attribute name is assumed to be the same as the + * local name. Given `` and widget definition of + * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to + * a function wrapper for the `count = count + value` expression. Often it's desirable to + * pass data from the isolated scope via an expression to the parent scope, this can be + * done by passing a map of local variable names and values into the expression wrapper fn. + * For example, if the expression is `increment(amount)` then we can specify the amount value + * by calling the `localFn` as `localFn({amount: 22})`. + * + * + * #### `bindToController` + * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will + * allow a component to have its properties bound to the controller, rather than to scope. When the controller + * is instantiated, the initial values of the isolate scope bindings are already available. + * + * #### `controller` + * Controller constructor function. The controller is instantiated before the + * pre-linking phase and it is shared with other directives (see + * `require` attribute). This allows the directives to communicate with each other and augment + * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: + * + * * `$scope` - Current scope associated with the element + * * `$element` - Current element + * * `$attrs` - Current attributes object for the element + * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: + * `function([scope], cloneLinkingFn, futureParentElement)`. + * * `scope`: optional argument to override the scope. + * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content. + * * `futureParentElement`: + * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. + * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. + * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) + * and when the `cloneLinkinFn` is passed, + * as those elements need to created and cloned in a special way when they are defined outside their + * usual containers (e.g. like ``). + * * See also the `directive.templateNamespace` property. + * + * + * #### `require` + * Require another directive and inject its controller as the fourth argument to the linking function. The + * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the + * injected argument will be an array in corresponding order. If no such directive can be + * found, or if the directive does not have a controller, then an error is raised (unless no link function + * is specified, in which case error checking is skipped). The name can be prefixed with: + * + * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. + * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. + * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. + * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. + * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass + * `null` to the `link` fn if not found. + * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass + * `null` to the `link` fn if not found. + * + * + * #### `controllerAs` + * Identifier name for a reference to the controller in the directive's scope. + * This allows the controller to be referenced from the directive template. The directive + * needs to define a scope for this configuration to be used. Useful in the case when + * directive is used as component. + * + * + * #### `restrict` + * String of subset of `EACM` which restricts the directive to a specific directive + * declaration style. If omitted, the defaults (elements and attributes) are used. + * + * * `E` - Element name (default): `` + * * `A` - Attribute (default): `
` + * * `C` - Class: `
` + * * `M` - Comment: `` + * + * + * #### `templateNamespace` + * String representing the document type used by the markup in the template. + * AngularJS needs this information as those elements need to be created and cloned + * in a special way when they are defined outside their usual containers like `` and ``. + * + * * `html` - All root nodes in the template are HTML. Root nodes may also be + * top-level elements such as `` or ``. + * * `svg` - The root nodes in the template are SVG elements (excluding ``). + * * `math` - The root nodes in the template are MathML elements (excluding ``). + * + * If no `templateNamespace` is specified, then the namespace is considered to be `html`. + * + * #### `template` + * HTML markup that may: + * * Replace the contents of the directive's element (default). + * * Replace the directive's element itself (if `replace` is true - DEPRECATED). + * * Wrap the contents of the directive's element (if `transclude` is true). + * + * Value may be: + * + * * A string. For example `
{{delete_str}}
`. + * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` + * function api below) and returns a string value. + * + * + * #### `templateUrl` + * This is similar to `template` but the template is loaded from the specified URL, asynchronously. + * + * Because template loading is asynchronous the compiler will suspend compilation of directives on that element + * for later when the template has been resolved. In the meantime it will continue to compile and link + * sibling and parent elements as though this element had not contained any directives. + * + * The compiler does not suspend the entire compilation to wait for templates to be loaded because this + * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the + * case when only one deeply nested directive has `templateUrl`. + * + * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} + * + * You can specify `templateUrl` as a string representing the URL or as a function which takes two + * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns + * a string value representing the url. In either case, the template URL is passed through {@link + * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. + * + * + * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) + * specify what the template should replace. Defaults to `false`. + * + * * `true` - the template will replace the directive's element. + * * `false` - the template will replace the contents of the directive's element. + * + * The replacement process migrates all of the attributes / classes from the old element to the new + * one. See the {@link guide/directive#template-expanding-directive + * Directives Guide} for an example. + * + * There are very few scenarios where element replacement is required for the application function, + * the main one being reusable custom components that are used within SVG contexts + * (because SVG doesn't work with custom elements in the DOM tree). + * + * #### `transclude` + * Extract the contents of the element where the directive appears and make it available to the directive. + * The contents are compiled and provided to the directive as a **transclusion function**. See the + * {@link $compile#transclusion Transclusion} section below. + * + * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the + * directive's element or the entire element: + * + * * `true` - transclude the content (i.e. the child nodes) of the directive's element. + * * `'element'` - transclude the whole of the directive's element including any directives on this + * element that defined at a lower priority than this directive. When used, the `template` + * property is ignored. + * + * + * #### `compile` + * + * ```js + * function compile(tElement, tAttrs, transclude) { ... } + * ``` + * + * The compile function deals with transforming the template DOM. Since most directives do not do + * template transformation, it is not used often. The compile function takes the following arguments: + * + * * `tElement` - template element - The element where the directive has been declared. It is + * safe to do template transformation on the element and child elements only. + * + * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared + * between all directive compile functions. + * + * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` + * + *
+ * **Note:** The template instance and the link instance may be different objects if the template has + * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that + * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration + * should be done in a linking function rather than in a compile function. + *
+ + *
+ * **Note:** The compile function cannot handle directives that recursively use themselves in their + * own templates or compile functions. Compiling these directives results in an infinite loop and a + * stack overflow errors. + * + * This can be avoided by manually using $compile in the postLink function to imperatively compile + * a directive's template instead of relying on automatic template compilation via `template` or + * `templateUrl` declaration or manual compilation inside the compile function. + *
+ * + *
+ * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it + * e.g. does not know about the right outer scope. Please use the transclude function that is passed + * to the link function instead. + *
+ + * A compile function can have a return value which can be either a function or an object. + * + * * returning a (post-link) function - is equivalent to registering the linking function via the + * `link` property of the config object when the compile function is empty. + * + * * returning an object with function(s) registered via `pre` and `post` properties - allows you to + * control when a linking function should be called during the linking phase. See info about + * pre-linking and post-linking functions below. + * + * + * #### `link` + * This property is used only if the `compile` property is not defined. + * + * ```js + * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } + * ``` + * + * The link function is responsible for registering DOM listeners as well as updating the DOM. It is + * executed after the template has been cloned. This is where most of the directive logic will be + * put. + * + * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the + * directive for registering {@link ng.$rootScope.Scope#$watch watches}. + * + * * `iElement` - instance element - The element where the directive is to be used. It is safe to + * manipulate the children of the element only in `postLink` function since the children have + * already been linked. + * + * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared + * between all directive linking functions. + * + * * `controller` - the directive's required controller instance(s) - Instances are shared + * among all directives, which allows the directives to use the controllers as a communication + * channel. The exact value depends on the directive's `require` property: + * * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one + * * `string`: the controller instance + * * `array`: array of controller instances + * + * If a required controller cannot be found, and it is optional, the instance is `null`, + * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown. + * + * Note that you can also require the directive's own controller - it will be made available like + * like any other controller. + * + * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. + * This is the same as the `$transclude` + * parameter of directive controllers, see there for details. + * `function([scope], cloneLinkingFn, futureParentElement)`. + * + * #### Pre-linking function + * + * Executed before the child elements are linked. Not safe to do DOM transformation since the + * compiler linking function will fail to locate the correct elements for linking. + * + * #### Post-linking function + * + * Executed after the child elements are linked. + * + * Note that child elements that contain `templateUrl` directives will not have been compiled + * and linked since they are waiting for their template to load asynchronously and their own + * compilation and linking has been suspended until that occurs. + * + * It is safe to do DOM transformation in the post-linking function on elements that are not waiting + * for their async templates to be resolved. + * + * + * ### Transclusion + * + * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and + * copying them to another part of the DOM, while maintaining their connection to the original AngularJS + * scope from where they were taken. + * + * Transclusion is used (often with {@link ngTransclude}) to insert the + * original contents of a directive's element into a specified place in the template of the directive. + * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded + * content has access to the properties on the scope from which it was taken, even if the directive + * has isolated scope. + * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. + * + * This makes it possible for the widget to have private state for its template, while the transcluded + * content has access to its originating scope. + * + *
+ * **Note:** When testing an element transclude directive you must not place the directive at the root of the + * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives + * Testing Transclusion Directives}. + *
+ * + * #### Transclusion Functions + * + * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion + * function** to the directive's `link` function and `controller`. This transclusion function is a special + * **linking function** that will return the compiled contents linked to a new transclusion scope. + * + *
+ * If you are just using {@link ngTransclude} then you don't need to worry about this function, since + * ngTransclude will deal with it for us. + *
+ * + * If you want to manually control the insertion and removal of the transcluded content in your directive + * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery + * object that contains the compiled DOM, which is linked to the correct transclusion scope. + * + * When you call a transclusion function you can pass in a **clone attach function**. This function accepts + * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded + * content and the `scope` is the newly created transclusion scope, to which the clone is bound. + * + *
+ * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function + * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. + *
+ * + * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone + * attach function**: + * + * ```js + * var transcludedContent, transclusionScope; + * + * $transclude(function(clone, scope) { + * element.append(clone); + * transcludedContent = clone; + * transclusionScope = scope; + * }); + * ``` + * + * Later, if you want to remove the transcluded content from your DOM then you should also destroy the + * associated transclusion scope: + * + * ```js + * transcludedContent.remove(); + * transclusionScope.$destroy(); + * ``` + * + *
+ * **Best Practice**: if you intend to add and remove transcluded content manually in your directive + * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it), + * then you are also responsible for calling `$destroy` on the transclusion scope. + *
+ * + * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} + * automatically destroy their transluded clones as necessary so you do not need to worry about this if + * you are simply using {@link ngTransclude} to inject the transclusion into your directive. + * + * + * #### Transclusion Scopes + * + * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion + * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed + * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it + * was taken. + * + * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look + * like this: + * + * ```html + *
+ *
+ *
+ *
+ *
+ *
+ * ``` + * + * The `$parent` scope hierarchy will look like this: + * + * ``` + * - $rootScope + * - isolate + * - transclusion + * ``` + * + * but the scopes will inherit prototypically from different scopes to their `$parent`. + * + * ``` + * - $rootScope + * - transclusion + * - isolate + * ``` + * + * + * ### Attributes + * + * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the + * `link()` or `compile()` functions. It has a variety of uses. + * + * accessing *Normalized attribute names:* + * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. + * the attributes object allows for normalized access to + * the attributes. + * + * * *Directive inter-communication:* All directives share the same instance of the attributes + * object which allows the directives to use the attributes object as inter directive + * communication. + * + * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object + * allowing other directives to read the interpolated value. + * + * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes + * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also + * the only way to easily get the actual value because during the linking phase the interpolation + * hasn't been evaluated yet and so the value is at this time set to `undefined`. + * + * ```js + * function linkingFn(scope, elm, attrs, ctrl) { + * // get the attribute value + * console.log(attrs.ngModel); + * + * // change the attribute + * attrs.$set('ngModel', 'new value'); + * + * // observe changes to interpolated attribute + * attrs.$observe('ngModel', function(value) { + * console.log('ngModel has changed value to ' + value); + * }); + * } + * ``` + * + * ## Example + * + *
+ * **Note**: Typically directives are registered with `module.directive`. The example below is + * to illustrate how `$compile` works. + *
+ * + + + +
+
+
+
+
+
+ + it('should auto compile', function() { + var textarea = $('textarea'); + var output = $('div[compile]'); + // The initial state reads 'Hello Angular'. + expect(output.getText()).toBe('Hello Angular'); + textarea.clear(); + textarea.sendKeys('{{name}}!'); + expect(output.getText()).toBe('Angular!'); + }); + +
+ + * + * + * @param {string|DOMElement} element Element or HTML string to compile into a template function. + * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. + * + *
+ * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it + * e.g. will not use the right outer scope. Please pass the transclude function as a + * `parentBoundTranscludeFn` to the link function instead. + *
+ * + * @param {number} maxPriority only apply directives lower than given priority (Only effects the + * root element(s), not their children) + * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template + * (a DOM element/tree) to a scope. Where: + * + * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. + * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the + * `template` and call the `cloneAttachFn` function allowing the caller to attach the + * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is + * called as:
`cloneAttachFn(clonedElement, scope)` where: + * + * * `clonedElement` - is a clone of the original `element` passed into the compiler. + * * `scope` - is the current scope with which the linking function is working with. + * + * * `options` - An optional object hash with linking options. If `options` is provided, then the following + * keys may be used to control linking behavior: + * + * * `parentBoundTranscludeFn` - the transclude function made available to + * directives; if given, it will be passed through to the link functions of + * directives found in `element` during compilation. + * * `transcludeControllers` - an object hash with keys that map controller names + * to controller instances; if given, it will make the controllers + * available to directives. + * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add + * the cloned elements; only needed for transcludes that are allowed to contain non html + * elements (e.g. SVG elements). See also the directive.controller property. + * + * Calling the linking function returns the element of the template. It is either the original + * element passed in, or the clone of the element if the `cloneAttachFn` is provided. + * + * After linking the view is not updated until after a call to $digest which typically is done by + * Angular automatically. + * + * If you need access to the bound view, there are two ways to do it: + * + * - If you are not asking the linking function to clone the template, create the DOM element(s) + * before you send them to the compiler and keep this reference around. + * ```js + * var element = $compile('

{{total}}

')(scope); + * ``` + * + * - if on the other hand, you need the element to be cloned, the view reference from the original + * example would not point to the clone, but rather to the original template that was cloned. In + * this case, you can access the clone via the cloneAttachFn: + * ```js + * var templateElement = angular.element('

{{total}}

'), + * scope = ....; + * + * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { + * //attach the clone to DOM document at the right place + * }); + * + * //now we have reference to the cloned DOM via `clonedElement` + * ``` + * + * + * For information on how the compiler works, see the + * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. + */ + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc provider + * @name $compileProvider + * + * @description + */ +$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; +function $CompileProvider($provide, $$sanitizeUriProvider) { + var hasDirectives = {}, + Suffix = 'Directive', + COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, + CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, + ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), + REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; + + // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes + // The assumption is that future DOM event attribute names will begin with + // 'on' and be composed of only English letters. + var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; + + function parseIsolateBindings(scope, directiveName, isController) { + var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/; + + var bindings = {}; + + forEach(scope, function(definition, scopeName) { + var match = definition.match(LOCAL_REGEXP); + + if (!match) { + throw $compileMinErr('iscp', + "Invalid {3} for directive '{0}'." + + " Definition: {... {1}: '{2}' ...}", + directiveName, scopeName, definition, + (isController ? "controller bindings definition" : + "isolate scope definition")); + } + + bindings[scopeName] = { + mode: match[1][0], + collection: match[2] === '*', + optional: match[3] === '?', + attrName: match[4] || scopeName + }; + }); + + return bindings; + } + + function parseDirectiveBindings(directive, directiveName) { + var bindings = { + isolateScope: null, + bindToController: null + }; + if (isObject(directive.scope)) { + if (directive.bindToController === true) { + bindings.bindToController = parseIsolateBindings(directive.scope, + directiveName, true); + bindings.isolateScope = {}; + } else { + bindings.isolateScope = parseIsolateBindings(directive.scope, + directiveName, false); + } + } + if (isObject(directive.bindToController)) { + bindings.bindToController = + parseIsolateBindings(directive.bindToController, directiveName, true); + } + if (isObject(bindings.bindToController)) { + var controller = directive.controller; + var controllerAs = directive.controllerAs; + if (!controller) { + // There is no controller, there may or may not be a controllerAs property + throw $compileMinErr('noctrl', + "Cannot bind to controller without directive '{0}'s controller.", + directiveName); + } else if (!identifierForController(controller, controllerAs)) { + // There is a controller, but no identifier or controllerAs property + throw $compileMinErr('noident', + "Cannot bind to controller without identifier for directive '{0}'.", + directiveName); + } + } + return bindings; + } + + function assertValidDirectiveName(name) { + var letter = name.charAt(0); + if (!letter || letter !== lowercase(letter)) { + throw $compileMinErr('baddir', "Directive name '{0}' is invalid. The first character must be a lowercase letter", name); + } + if (name !== name.trim()) { + throw $compileMinErr('baddir', + "Directive name '{0}' is invalid. The name should not contain leading or trailing whitespaces", + name); + } + } + + /** + * @ngdoc method + * @name $compileProvider#directive + * @kind function + * + * @description + * Register a new directive with the compiler. + * + * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which + * will match as ng-bind), or an object map of directives where the keys are the + * names and the values are the factories. + * @param {Function|Array} directiveFactory An injectable directive factory function. See + * {@link guide/directive} for more info. + * @returns {ng.$compileProvider} Self for chaining. + */ + this.directive = function registerDirective(name, directiveFactory) { + assertNotHasOwnProperty(name, 'directive'); + if (isString(name)) { + assertValidDirectiveName(name); + assertArg(directiveFactory, 'directiveFactory'); + if (!hasDirectives.hasOwnProperty(name)) { + hasDirectives[name] = []; + $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', + function($injector, $exceptionHandler) { + var directives = []; + forEach(hasDirectives[name], function(directiveFactory, index) { + try { + var directive = $injector.invoke(directiveFactory); + if (isFunction(directive)) { + directive = { compile: valueFn(directive) }; + } else if (!directive.compile && directive.link) { + directive.compile = valueFn(directive.link); + } + directive.priority = directive.priority || 0; + directive.index = index; + directive.name = directive.name || name; + directive.require = directive.require || (directive.controller && directive.name); + directive.restrict = directive.restrict || 'EA'; + var bindings = directive.$$bindings = + parseDirectiveBindings(directive, directive.name); + if (isObject(bindings.isolateScope)) { + directive.$$isolateBindings = bindings.isolateScope; + } + directive.$$moduleName = directiveFactory.$$moduleName; + directives.push(directive); + } catch (e) { + $exceptionHandler(e); + } + }); + return directives; + }]); + } + hasDirectives[name].push(directiveFactory); + } else { + forEach(name, reverseParams(registerDirective)); + } + return this; + }; + + + /** + * @ngdoc method + * @name $compileProvider#aHrefSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at preventing XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); + } + }; + + + /** + * @ngdoc method + * @name $compileProvider#imgSrcSanitizationWhitelist + * @kind function + * + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); + return this; + } else { + return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); + } + }; + + /** + * @ngdoc method + * @name $compileProvider#debugInfoEnabled + * + * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the + * current debugInfoEnabled state + * @returns {*} current value if used as getter or itself (chaining) if used as setter + * + * @kind function + * + * @description + * Call this method to enable/disable various debug runtime information in the compiler such as adding + * binding information and a reference to the current scope on to DOM elements. + * If enabled, the compiler will add the following to DOM elements that have been bound to the scope + * * `ng-binding` CSS class + * * `$binding` data property containing an array of the binding expressions + * + * You may want to disable this in production for a significant performance boost. See + * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. + * + * The default value is true. + */ + var debugInfoEnabled = true; + this.debugInfoEnabled = function(enabled) { + if (isDefined(enabled)) { + debugInfoEnabled = enabled; + return this; + } + return debugInfoEnabled; + }; + + this.$get = [ + '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', + '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', + function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, + $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { + + var Attributes = function(element, attributesToCopy) { + if (attributesToCopy) { + var keys = Object.keys(attributesToCopy); + var i, l, key; + + for (i = 0, l = keys.length; i < l; i++) { + key = keys[i]; + this[key] = attributesToCopy[key]; + } + } else { + this.$attr = {}; + } + + this.$$element = element; + }; + + Attributes.prototype = { + /** + * @ngdoc method + * @name $compile.directive.Attributes#$normalize + * @kind function + * + * @description + * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or + * `data-`) to its normalized, camelCase form. + * + * Also there is special case for Moz prefix starting with upper case letter. + * + * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} + * + * @param {string} name Name to normalize + */ + $normalize: directiveNormalize, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$addClass + * @kind function + * + * @description + * Adds the CSS class value specified by the classVal parameter to the element. If animations + * are enabled then an animation will be triggered for the class addition. + * + * @param {string} classVal The className value that will be added to the element + */ + $addClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.addClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$removeClass + * @kind function + * + * @description + * Removes the CSS class value specified by the classVal parameter from the element. If + * animations are enabled then an animation will be triggered for the class removal. + * + * @param {string} classVal The className value that will be removed from the element + */ + $removeClass: function(classVal) { + if (classVal && classVal.length > 0) { + $animate.removeClass(this.$$element, classVal); + } + }, + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$updateClass + * @kind function + * + * @description + * Adds and removes the appropriate CSS class values to the element based on the difference + * between the new and old CSS class values (specified as newClasses and oldClasses). + * + * @param {string} newClasses The current CSS className value + * @param {string} oldClasses The former CSS className value + */ + $updateClass: function(newClasses, oldClasses) { + var toAdd = tokenDifference(newClasses, oldClasses); + if (toAdd && toAdd.length) { + $animate.addClass(this.$$element, toAdd); + } + + var toRemove = tokenDifference(oldClasses, newClasses); + if (toRemove && toRemove.length) { + $animate.removeClass(this.$$element, toRemove); + } + }, + + /** + * Set a normalized attribute on the element in a way such that all directives + * can share the attribute. This function properly handles boolean attributes. + * @param {string} key Normalized key. (ie ngAttribute) + * @param {string|boolean} value The value to set. If `null` attribute will be deleted. + * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. + * Defaults to true. + * @param {string=} attrName Optional none normalized name. Defaults to key. + */ + $set: function(key, value, writeAttr, attrName) { + // TODO: decide whether or not to throw an error if "class" + //is set through this function since it may cause $updateClass to + //become unstable. + + var node = this.$$element[0], + booleanKey = getBooleanAttrName(node, key), + aliasedKey = getAliasedAttrName(node, key), + observer = key, + nodeName; + + if (booleanKey) { + this.$$element.prop(key, value); + attrName = booleanKey; + } else if (aliasedKey) { + this[aliasedKey] = value; + observer = aliasedKey; + } + + this[key] = value; + + // translate normalized key to actual key + if (attrName) { + this.$attr[key] = attrName; + } else { + attrName = this.$attr[key]; + if (!attrName) { + this.$attr[key] = attrName = snake_case(key, '-'); + } + } + + nodeName = nodeName_(this.$$element); + + if ((nodeName === 'a' && key === 'href') || + (nodeName === 'img' && key === 'src')) { + // sanitize a[href] and img[src] values + this[key] = value = $$sanitizeUri(value, key === 'src'); + } else if (nodeName === 'img' && key === 'srcset') { + // sanitize img[srcset] values + var result = ""; + + // first check if there are spaces because it's not the same pattern + var trimmedSrcset = trim(value); + // ( 999x ,| 999w ,| ,|, ) + var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; + var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; + + // split srcset into tuple of uri and descriptor except for the last item + var rawUris = trimmedSrcset.split(pattern); + + // for each tuples + var nbrUrisWith2parts = Math.floor(rawUris.length / 2); + for (var i = 0; i < nbrUrisWith2parts; i++) { + var innerIdx = i * 2; + // sanitize the uri + result += $$sanitizeUri(trim(rawUris[innerIdx]), true); + // add the descriptor + result += (" " + trim(rawUris[innerIdx + 1])); + } + + // split the last item into uri and descriptor + var lastTuple = trim(rawUris[i * 2]).split(/\s/); + + // sanitize the last uri + result += $$sanitizeUri(trim(lastTuple[0]), true); + + // and add the last descriptor if any + if (lastTuple.length === 2) { + result += (" " + trim(lastTuple[1])); + } + this[key] = value = result; + } + + if (writeAttr !== false) { + if (value === null || value === undefined) { + this.$$element.removeAttr(attrName); + } else { + this.$$element.attr(attrName, value); + } + } + + // fire observers + var $$observers = this.$$observers; + $$observers && forEach($$observers[observer], function(fn) { + try { + fn(value); + } catch (e) { + $exceptionHandler(e); + } + }); + }, + + + /** + * @ngdoc method + * @name $compile.directive.Attributes#$observe + * @kind function + * + * @description + * Observes an interpolated attribute. + * + * The observer function will be invoked once during the next `$digest` following + * compilation. The observer is then invoked whenever the interpolated value + * changes. + * + * @param {string} key Normalized key. (ie ngAttribute) . + * @param {function(interpolatedValue)} fn Function that will be called whenever + the interpolated value of the attribute changes. + * See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info. + * @returns {function()} Returns a deregistration function for this observer. + */ + $observe: function(key, fn) { + var attrs = this, + $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), + listeners = ($$observers[key] || ($$observers[key] = [])); + + listeners.push(fn); + $rootScope.$evalAsync(function() { + if (!listeners.$$inter && attrs.hasOwnProperty(key)) { + // no one registered attribute interpolation function, so lets call it manually + fn(attrs[key]); + } + }); + + return function() { + arrayRemove(listeners, fn); + }; + } + }; + + + function safeAddClass($element, className) { + try { + $element.addClass(className); + } catch (e) { + // ignore, since it means that we are trying to set class on + // SVG element, where class name is read-only. + } + } + + + var startSymbol = $interpolate.startSymbol(), + endSymbol = $interpolate.endSymbol(), + denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') + ? identity + : function denormalizeTemplate(template) { + return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); + }, + NG_ATTR_BINDING = /^ngAttr[A-Z]/; + + compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { + var bindings = $element.data('$binding') || []; + + if (isArray(binding)) { + bindings = bindings.concat(binding); + } else { + bindings.push(binding); + } + + $element.data('$binding', bindings); + } : noop; + + compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { + safeAddClass($element, 'ng-binding'); + } : noop; + + compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { + var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; + $element.data(dataName, scope); + } : noop; + + compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { + safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); + } : noop; + + return compile; + + //================================ + + function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, + previousCompileContext) { + if (!($compileNodes instanceof jqLite)) { + // jquery always rewraps, whereas we need to preserve the original selector so that we can + // modify it. + $compileNodes = jqLite($compileNodes); + } + // We can not compile top level text elements since text nodes can be merged and we will + // not be able to attach scope data to them, so we will wrap them in + forEach($compileNodes, function(node, index) { + if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) { + $compileNodes[index] = jqLite(node).wrap('').parent()[0]; + } + }); + var compositeLinkFn = + compileNodes($compileNodes, transcludeFn, $compileNodes, + maxPriority, ignoreDirective, previousCompileContext); + compile.$$addScopeClass($compileNodes); + var namespace = null; + return function publicLinkFn(scope, cloneConnectFn, options) { + assertArg(scope, 'scope'); + + options = options || {}; + var parentBoundTranscludeFn = options.parentBoundTranscludeFn, + transcludeControllers = options.transcludeControllers, + futureParentElement = options.futureParentElement; + + // When `parentBoundTranscludeFn` is passed, it is a + // `controllersBoundTransclude` function (it was previously passed + // as `transclude` to directive.link) so we must unwrap it to get + // its `boundTranscludeFn` + if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { + parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; + } + + if (!namespace) { + namespace = detectNamespaceForChildElements(futureParentElement); + } + var $linkNode; + if (namespace !== 'html') { + // When using a directive with replace:true and templateUrl the $compileNodes + // (or a child element inside of them) + // might change, so we need to recreate the namespace adapted compileNodes + // for call to the link function. + // Note: This will already clone the nodes... + $linkNode = jqLite( + wrapTemplate(namespace, jqLite('
').append($compileNodes).html()) + ); + } else if (cloneConnectFn) { + // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart + // and sometimes changes the structure of the DOM. + $linkNode = JQLitePrototype.clone.call($compileNodes); + } else { + $linkNode = $compileNodes; + } + + if (transcludeControllers) { + for (var controllerName in transcludeControllers) { + $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); + } + } + + compile.$$addScopeInfo($linkNode, scope); + + if (cloneConnectFn) cloneConnectFn($linkNode, scope); + if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); + return $linkNode; + }; + } + + function detectNamespaceForChildElements(parentElement) { + // TODO: Make this detect MathML as well... + var node = parentElement && parentElement[0]; + if (!node) { + return 'html'; + } else { + return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html'; + } + } + + /** + * Compile function matches each node in nodeList against the directives. Once all directives + * for a particular node are collected their compile functions are executed. The compile + * functions return values - the linking functions - are combined into a composite linking + * function, which is the a linking function for the node. + * + * @param {NodeList} nodeList an array of nodes or NodeList to compile + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new child of the transcluded parent scope. + * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then + * the rootElement must be set the jqLite collection of the compile root. This is + * needed so that the jqLite collection items can be replaced with widgets. + * @param {number=} maxPriority Max directive priority. + * @returns {Function} A composite linking function of all of the matched directives or null. + */ + function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, + previousCompileContext) { + var linkFns = [], + attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; + + for (var i = 0; i < nodeList.length; i++) { + attrs = new Attributes(); + + // we must always refer to nodeList[i] since the nodes can be replaced underneath us. + directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, + ignoreDirective); + + nodeLinkFn = (directives.length) + ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, + null, [], [], previousCompileContext) + : null; + + if (nodeLinkFn && nodeLinkFn.scope) { + compile.$$addScopeClass(attrs.$$element); + } + + childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || + !(childNodes = nodeList[i].childNodes) || + !childNodes.length) + ? null + : compileNodes(childNodes, + nodeLinkFn ? ( + (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) + && nodeLinkFn.transclude) : transcludeFn); + + if (nodeLinkFn || childLinkFn) { + linkFns.push(i, nodeLinkFn, childLinkFn); + linkFnFound = true; + nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; + } + + //use the previous context only for the first element in the virtual group + previousCompileContext = null; + } + + // return a linking function if we have found anything, null otherwise + return linkFnFound ? compositeLinkFn : null; + + function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { + var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; + var stableNodeList; + + + if (nodeLinkFnFound) { + // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our + // offsets don't get screwed up + var nodeListLength = nodeList.length; + stableNodeList = new Array(nodeListLength); + + // create a sparse array by only copying the elements which have a linkFn + for (i = 0; i < linkFns.length; i+=3) { + idx = linkFns[i]; + stableNodeList[idx] = nodeList[idx]; + } + } else { + stableNodeList = nodeList; + } + + for (i = 0, ii = linkFns.length; i < ii;) { + node = stableNodeList[linkFns[i++]]; + nodeLinkFn = linkFns[i++]; + childLinkFn = linkFns[i++]; + + if (nodeLinkFn) { + if (nodeLinkFn.scope) { + childScope = scope.$new(); + compile.$$addScopeInfo(jqLite(node), childScope); + var destroyBindings = nodeLinkFn.$$destroyBindings; + if (destroyBindings) { + nodeLinkFn.$$destroyBindings = null; + childScope.$on('$destroyed', destroyBindings); + } + } else { + childScope = scope; + } + + if (nodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn( + scope, nodeLinkFn.transclude, parentBoundTranscludeFn); + + } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { + childBoundTranscludeFn = parentBoundTranscludeFn; + + } else if (!parentBoundTranscludeFn && transcludeFn) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); + + } else { + childBoundTranscludeFn = null; + } + + nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn, + nodeLinkFn); + + } else if (childLinkFn) { + childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); + } + } + } + } + + function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) { + + var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { + + if (!transcludedScope) { + transcludedScope = scope.$new(false, containingScope); + transcludedScope.$$transcluded = true; + } + + return transcludeFn(transcludedScope, cloneFn, { + parentBoundTranscludeFn: previousBoundTranscludeFn, + transcludeControllers: controllers, + futureParentElement: futureParentElement + }); + }; + + return boundTranscludeFn; + } + + /** + * Looks for directives on the given node and adds them to the directive collection which is + * sorted. + * + * @param node Node to search. + * @param directives An array to which the directives are added to. This array is sorted before + * the function returns. + * @param attrs The shared attrs object which is used to populate the normalized attributes. + * @param {number=} maxPriority Max directive priority. + */ + function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { + var nodeType = node.nodeType, + attrsMap = attrs.$attr, + match, + className; + + switch (nodeType) { + case NODE_TYPE_ELEMENT: /* Element */ + // use the node name: + addDirective(directives, + directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); + + // iterate over the attributes + for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, + j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { + var attrStartName = false; + var attrEndName = false; + + attr = nAttrs[j]; + name = attr.name; + value = trim(attr.value); + + // support ngAttr attribute binding + ngAttrName = directiveNormalize(name); + if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { + name = name.replace(PREFIX_REGEXP, '') + .substr(8).replace(/_(.)/g, function(match, letter) { + return letter.toUpperCase(); + }); + } + + var directiveNName = ngAttrName.replace(/(Start|End)$/, ''); + if (directiveIsMultiElement(directiveNName)) { + if (ngAttrName === directiveNName + 'Start') { + attrStartName = name; + attrEndName = name.substr(0, name.length - 5) + 'end'; + name = name.substr(0, name.length - 6); + } + } + + nName = directiveNormalize(name.toLowerCase()); + attrsMap[nName] = name; + if (isNgAttr || !attrs.hasOwnProperty(nName)) { + attrs[nName] = value; + if (getBooleanAttrName(node, nName)) { + attrs[nName] = true; // presence means true + } + } + addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); + addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, + attrEndName); + } + + // use class as directive + className = node.className; + if (isObject(className)) { + // Maybe SVGAnimatedString + className = className.animVal; + } + if (isString(className) && className !== '') { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); + } + } + break; + case NODE_TYPE_TEXT: /* Text Node */ + if (msie === 11) { + // Workaround for #11781 + while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) { + node.nodeValue = node.nodeValue + node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } + addTextInterpolateDirective(directives, node.nodeValue); + break; + case NODE_TYPE_COMMENT: /* Comment */ + try { + match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); + if (match) { + nName = directiveNormalize(match[1]); + if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { + attrs[nName] = trim(match[2]); + } + } + } catch (e) { + // turns out that under some circumstances IE9 throws errors when one attempts to read + // comment's node value. + // Just ignore it and continue. (Can't seem to reproduce in test case.) + } + break; + } + + directives.sort(byPriority); + return directives; + } + + /** + * Given a node with an directive-start it collects all of the siblings until it finds + * directive-end. + * @param node + * @param attrStart + * @param attrEnd + * @returns {*} + */ + function groupScan(node, attrStart, attrEnd) { + var nodes = []; + var depth = 0; + if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { + do { + if (!node) { + throw $compileMinErr('uterdir', + "Unterminated attribute, found '{0}' but no matching '{1}' found.", + attrStart, attrEnd); + } + if (node.nodeType == NODE_TYPE_ELEMENT) { + if (node.hasAttribute(attrStart)) depth++; + if (node.hasAttribute(attrEnd)) depth--; + } + nodes.push(node); + node = node.nextSibling; + } while (depth > 0); + } else { + nodes.push(node); + } + + return jqLite(nodes); + } + + /** + * Wrapper for linking function which converts normal linking function into a grouped + * linking function. + * @param linkFn + * @param attrStart + * @param attrEnd + * @returns {Function} + */ + function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { + return function(scope, element, attrs, controllers, transcludeFn) { + element = groupScan(element[0], attrStart, attrEnd); + return linkFn(scope, element, attrs, controllers, transcludeFn); + }; + } + + /** + * Once the directives have been collected, their compile functions are executed. This method + * is responsible for inlining directive templates as well as terminating the application + * of the directives if the terminal directive has been reached. + * + * @param {Array} directives Array of collected directives to execute their compile function. + * this needs to be pre-sorted by priority order. + * @param {Node} compileNode The raw DOM node to apply the compile functions to + * @param {Object} templateAttrs The shared attribute function + * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the + * scope argument is auto-generated to the new + * child of the transcluded parent scope. + * @param {JQLite} jqCollection If we are working on the root of the compile tree then this + * argument has the root jqLite array so that we can replace nodes + * on it. + * @param {Object=} originalReplaceDirective An optional directive that will be ignored when + * compiling the transclusion. + * @param {Array.} preLinkFns + * @param {Array.} postLinkFns + * @param {Object} previousCompileContext Context used for previous compilation of the current + * node + * @returns {Function} linkFn + */ + function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, + jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, + previousCompileContext) { + previousCompileContext = previousCompileContext || {}; + + var terminalPriority = -Number.MAX_VALUE, + newScopeDirective = previousCompileContext.newScopeDirective, + controllerDirectives = previousCompileContext.controllerDirectives, + newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, + templateDirective = previousCompileContext.templateDirective, + nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, + hasTranscludeDirective = false, + hasTemplate = false, + hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, + $compileNode = templateAttrs.$$element = jqLite(compileNode), + directive, + directiveName, + $template, + replaceDirective = originalReplaceDirective, + childTranscludeFn = transcludeFn, + linkFn, + directiveValue; + + // executes all directives on the current element + for (var i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + var attrStart = directive.$$start; + var attrEnd = directive.$$end; + + // collect multiblock sections + if (attrStart) { + $compileNode = groupScan(compileNode, attrStart, attrEnd); + } + $template = undefined; + + if (terminalPriority > directive.priority) { + break; // prevent further processing of directives + } + + if (directiveValue = directive.scope) { + + // skip the check for directives with async templates, we'll check the derived sync + // directive when the template arrives + if (!directive.templateUrl) { + if (isObject(directiveValue)) { + // This directive is trying to add an isolated scope. + // Check that there is no scope of any kind already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, + directive, $compileNode); + newIsolateScopeDirective = directive; + } else { + // This directive is trying to add a child scope. + // Check that there is no isolated scope already + assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, + $compileNode); + } + } + + newScopeDirective = newScopeDirective || directive; + } + + directiveName = directive.name; + + if (!directive.templateUrl && directive.controller) { + directiveValue = directive.controller; + controllerDirectives = controllerDirectives || createMap(); + assertNoDuplicate("'" + directiveName + "' controller", + controllerDirectives[directiveName], directive, $compileNode); + controllerDirectives[directiveName] = directive; + } + + if (directiveValue = directive.transclude) { + hasTranscludeDirective = true; + + // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. + // This option should only be used by directives that know how to safely handle element transclusion, + // where the transcluded nodes are added or replaced after linking. + if (!directive.$$tlb) { + assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); + nonTlbTranscludeDirective = directive; + } + + if (directiveValue == 'element') { + hasElementTranscludeDirective = true; + terminalPriority = directive.priority; + $template = $compileNode; + $compileNode = templateAttrs.$$element = + jqLite(document.createComment(' ' + directiveName + ': ' + + templateAttrs[directiveName] + ' ')); + compileNode = $compileNode[0]; + replaceWith(jqCollection, sliceArgs($template), compileNode); + + childTranscludeFn = compile($template, transcludeFn, terminalPriority, + replaceDirective && replaceDirective.name, { + // Don't pass in: + // - controllerDirectives - otherwise we'll create duplicates controllers + // - newIsolateScopeDirective or templateDirective - combining templates with + // element transclusion doesn't make sense. + // + // We need only nonTlbTranscludeDirective so that we prevent putting transclusion + // on the same element more than once. + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + } else { + $template = jqLite(jqLiteClone(compileNode)).contents(); + $compileNode.empty(); // clear contents + childTranscludeFn = compile($template, transcludeFn); + } + } + + if (directive.template) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + directiveValue = (isFunction(directive.template)) + ? directive.template($compileNode, templateAttrs) + : directive.template; + + directiveValue = denormalizeTemplate(directiveValue); + + if (directive.replace) { + replaceDirective = directive; + if (jqLiteIsTextNode(directiveValue)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + directiveName, ''); + } + + replaceWith(jqCollection, $compileNode, compileNode); + + var newTemplateAttrs = {$attr: {}}; + + // combine directives from the original node and from the template: + // - take the array of directives for this element + // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) + // - collect directives from the template and sort them by priority + // - combine directives as: processed + template + unprocessed + var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); + var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); + + if (newIsolateScopeDirective) { + markDirectivesAsIsolate(templateDirectives); + } + directives = directives.concat(templateDirectives).concat(unprocessedDirectives); + mergeTemplateAttributes(templateAttrs, newTemplateAttrs); + + ii = directives.length; + } else { + $compileNode.html(directiveValue); + } + } + + if (directive.templateUrl) { + hasTemplate = true; + assertNoDuplicate('template', templateDirective, directive, $compileNode); + templateDirective = directive; + + if (directive.replace) { + replaceDirective = directive; + } + + nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, + templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { + controllerDirectives: controllerDirectives, + newScopeDirective: (newScopeDirective !== directive) && newScopeDirective, + newIsolateScopeDirective: newIsolateScopeDirective, + templateDirective: templateDirective, + nonTlbTranscludeDirective: nonTlbTranscludeDirective + }); + ii = directives.length; + } else if (directive.compile) { + try { + linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); + if (isFunction(linkFn)) { + addLinkFns(null, linkFn, attrStart, attrEnd); + } else if (linkFn) { + addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); + } + } catch (e) { + $exceptionHandler(e, startingTag($compileNode)); + } + } + + if (directive.terminal) { + nodeLinkFn.terminal = true; + terminalPriority = Math.max(terminalPriority, directive.priority); + } + + } + + nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; + nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; + nodeLinkFn.templateOnThisElement = hasTemplate; + nodeLinkFn.transclude = childTranscludeFn; + + previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; + + // might be normal or delayed nodeLinkFn depending on if templateUrl is present + return nodeLinkFn; + + //////////////////// + + function addLinkFns(pre, post, attrStart, attrEnd) { + if (pre) { + if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); + pre.require = directive.require; + pre.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + pre = cloneAndAnnotateFn(pre, {isolateScope: true}); + } + preLinkFns.push(pre); + } + if (post) { + if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); + post.require = directive.require; + post.directiveName = directiveName; + if (newIsolateScopeDirective === directive || directive.$$isolateScope) { + post = cloneAndAnnotateFn(post, {isolateScope: true}); + } + postLinkFns.push(post); + } + } + + + function getControllers(directiveName, require, $element, elementControllers) { + var value; + + if (isString(require)) { + var match = require.match(REQUIRE_PREFIX_REGEXP); + var name = require.substring(match[0].length); + var inheritType = match[1] || match[3]; + var optional = match[2] === '?'; + + //If only parents then start at the parent element + if (inheritType === '^^') { + $element = $element.parent(); + //Otherwise attempt getting the controller from elementControllers in case + //the element is transcluded (and has no data) and to avoid .data if possible + } else { + value = elementControllers && elementControllers[name]; + value = value && value.instance; + } + + if (!value) { + var dataName = '$' + name + 'Controller'; + value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName); + } + + if (!value && !optional) { + throw $compileMinErr('ctreq', + "Controller '{0}', required by directive '{1}', can't be found!", + name, directiveName); + } + } else if (isArray(require)) { + value = []; + for (var i = 0, ii = require.length; i < ii; i++) { + value[i] = getControllers(directiveName, require[i], $element, elementControllers); + } + } + + return value || null; + } + + function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope) { + var elementControllers = createMap(); + for (var controllerKey in controllerDirectives) { + var directive = controllerDirectives[controllerKey]; + var locals = { + $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, + $element: $element, + $attrs: attrs, + $transclude: transcludeFn + }; + + var controller = directive.controller; + if (controller == '@') { + controller = attrs[directive.name]; + } + + var controllerInstance = $controller(controller, locals, true, directive.controllerAs); + + // For directives with element transclusion the element is a comment, + // but jQuery .data doesn't support attaching data to comment nodes as it's hard to + // clean up (http://bugs.jquery.com/ticket/8335). + // Instead, we save the controllers for the element in a local hash and attach to .data + // later, once we have the actual element. + elementControllers[directive.name] = controllerInstance; + if (!hasElementTranscludeDirective) { + $element.data('$' + directive.name + 'Controller', controllerInstance.instance); + } + } + return elementControllers; + } + + function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn, + thisLinkFn) { + var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, + attrs; + + if (compileNode === linkNode) { + attrs = templateAttrs; + $element = templateAttrs.$$element; + } else { + $element = jqLite(linkNode); + attrs = new Attributes($element, templateAttrs); + } + + if (newIsolateScopeDirective) { + isolateScope = scope.$new(true); + } + + if (boundTranscludeFn) { + // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` + // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` + transcludeFn = controllersBoundTransclude; + transcludeFn.$$boundTransclude = boundTranscludeFn; + } + + if (controllerDirectives) { + elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope); + } + + if (newIsolateScopeDirective) { + // Initialize isolate scope bindings for new isolate scope directive. + compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || + templateDirective === newIsolateScopeDirective.$$originalDirective))); + compile.$$addScopeClass($element, true); + isolateScope.$$isolateBindings = + newIsolateScopeDirective.$$isolateBindings; + initializeDirectiveBindings(scope, attrs, isolateScope, + isolateScope.$$isolateBindings, + newIsolateScopeDirective, isolateScope); + } + if (elementControllers) { + // Initialize bindToController bindings for new/isolate scopes + var scopeDirective = newIsolateScopeDirective || newScopeDirective; + var bindings; + var controllerForBindings; + if (scopeDirective && elementControllers[scopeDirective.name]) { + bindings = scopeDirective.$$bindings.bindToController; + controller = elementControllers[scopeDirective.name]; + + if (controller && controller.identifier && bindings) { + controllerForBindings = controller; + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controller.instance, + bindings, scopeDirective); + } + } + for (i in elementControllers) { + controller = elementControllers[i]; + var controllerResult = controller(); + + if (controllerResult !== controller.instance) { + // If the controller constructor has a return value, overwrite the instance + // from setupControllers and update the element data + controller.instance = controllerResult; + $element.data('$' + i + 'Controller', controllerResult); + if (controller === controllerForBindings) { + // Remove and re-install bindToController bindings + thisLinkFn.$$destroyBindings(); + thisLinkFn.$$destroyBindings = + initializeDirectiveBindings(scope, attrs, controllerResult, bindings, scopeDirective); + } + } + } + } + + // PRELINKING + for (i = 0, ii = preLinkFns.length; i < ii; i++) { + linkFn = preLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // RECURSION + // We only pass the isolate scope, if the isolate directive has a template, + // otherwise the child elements do not belong to the isolate directive. + var scopeToChild = scope; + if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { + scopeToChild = isolateScope; + } + childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); + + // POSTLINKING + for (i = postLinkFns.length - 1; i >= 0; i--) { + linkFn = postLinkFns[i]; + invokeLinkFn(linkFn, + linkFn.isolateScope ? isolateScope : scope, + $element, + attrs, + linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), + transcludeFn + ); + } + + // This is the function that is injected as `$transclude`. + // Note: all arguments are optional! + function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) { + var transcludeControllers; + + // No scope passed in: + if (!isScope(scope)) { + futureParentElement = cloneAttachFn; + cloneAttachFn = scope; + scope = undefined; + } + + if (hasElementTranscludeDirective) { + transcludeControllers = elementControllers; + } + if (!futureParentElement) { + futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; + } + return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); + } + } + } + + function markDirectivesAsIsolate(directives) { + // mark all directives as needing isolate scope. + for (var j = 0, jj = directives.length; j < jj; j++) { + directives[j] = inherit(directives[j], {$$isolateScope: true}); + } + } + + /** + * looks up the directive and decorates it with exception handling and proper parameters. We + * call this the boundDirective. + * + * @param {string} name name of the directive to look up. + * @param {string} location The directive must be found in specific format. + * String containing any of theses characters: + * + * * `E`: element name + * * `A': attribute + * * `C`: class + * * `M`: comment + * @returns {boolean} true if directive was added. + */ + function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, + endAttrName) { + if (name === ignoreDirective) return null; + var match = null; + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + try { + directive = directives[i]; + if ((maxPriority === undefined || maxPriority > directive.priority) && + directive.restrict.indexOf(location) != -1) { + if (startAttrName) { + directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); + } + tDirectives.push(directive); + match = directive; + } + } catch (e) { $exceptionHandler(e); } + } + } + return match; + } + + + /** + * looks up the directive and returns true if it is a multi-element directive, + * and therefore requires DOM nodes between -start and -end markers to be grouped + * together. + * + * @param {string} name name of the directive to look up. + * @returns true if directive was registered as multi-element. + */ + function directiveIsMultiElement(name) { + if (hasDirectives.hasOwnProperty(name)) { + for (var directive, directives = $injector.get(name + Suffix), + i = 0, ii = directives.length; i < ii; i++) { + directive = directives[i]; + if (directive.multiElement) { + return true; + } + } + } + return false; + } + + /** + * When the element is replaced with HTML template then the new attributes + * on the template need to be merged with the existing attributes in the DOM. + * The desired effect is to have both of the attributes present. + * + * @param {object} dst destination attributes (original DOM) + * @param {object} src source attributes (from the directive template) + */ + function mergeTemplateAttributes(dst, src) { + var srcAttr = src.$attr, + dstAttr = dst.$attr, + $element = dst.$$element; + + // reapply the old attributes to the new element + forEach(dst, function(value, key) { + if (key.charAt(0) != '$') { + if (src[key] && src[key] !== value) { + value += (key === 'style' ? ';' : ' ') + src[key]; + } + dst.$set(key, value, true, srcAttr[key]); + } + }); + + // copy the new attributes on the old attrs object + forEach(src, function(value, key) { + if (key == 'class') { + safeAddClass($element, value); + dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; + } else if (key == 'style') { + $element.attr('style', $element.attr('style') + ';' + value); + dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; + // `dst` will never contain hasOwnProperty as DOM parser won't let it. + // You will get an "InvalidCharacterError: DOM Exception 5" error if you + // have an attribute like "has-own-property" or "data-has-own-property", etc. + } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { + dst[key] = value; + dstAttr[key] = srcAttr[key]; + } + }); + } + + + function compileTemplateUrl(directives, $compileNode, tAttrs, + $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { + var linkQueue = [], + afterTemplateNodeLinkFn, + afterTemplateChildLinkFn, + beforeTemplateCompileNode = $compileNode[0], + origAsyncDirective = directives.shift(), + derivedSyncDirective = inherit(origAsyncDirective, { + templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective + }), + templateUrl = (isFunction(origAsyncDirective.templateUrl)) + ? origAsyncDirective.templateUrl($compileNode, tAttrs) + : origAsyncDirective.templateUrl, + templateNamespace = origAsyncDirective.templateNamespace; + + $compileNode.empty(); + + $templateRequest(templateUrl) + .then(function(content) { + var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; + + content = denormalizeTemplate(content); + + if (origAsyncDirective.replace) { + if (jqLiteIsTextNode(content)) { + $template = []; + } else { + $template = removeComments(wrapTemplate(templateNamespace, trim(content))); + } + compileNode = $template[0]; + + if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { + throw $compileMinErr('tplrt', + "Template for directive '{0}' must have exactly one root element. {1}", + origAsyncDirective.name, templateUrl); + } + + tempTemplateAttrs = {$attr: {}}; + replaceWith($rootElement, $compileNode, compileNode); + var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); + + if (isObject(origAsyncDirective.scope)) { + markDirectivesAsIsolate(templateDirectives); + } + directives = templateDirectives.concat(directives); + mergeTemplateAttributes(tAttrs, tempTemplateAttrs); + } else { + compileNode = beforeTemplateCompileNode; + $compileNode.html(content); + } + + directives.unshift(derivedSyncDirective); + + afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, + childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, + previousCompileContext); + forEach($rootElement, function(node, i) { + if (node == compileNode) { + $rootElement[i] = $compileNode[0]; + } + }); + afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); + + while (linkQueue.length) { + var scope = linkQueue.shift(), + beforeTemplateLinkNode = linkQueue.shift(), + linkRootElement = linkQueue.shift(), + boundTranscludeFn = linkQueue.shift(), + linkNode = $compileNode[0]; + + if (scope.$$destroyed) continue; + + if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { + var oldClasses = beforeTemplateLinkNode.className; + + if (!(previousCompileContext.hasElementTranscludeDirective && + origAsyncDirective.replace)) { + // it was cloned therefore we have to clone as well. + linkNode = jqLiteClone(compileNode); + } + replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); + + // Copy in CSS classes from original node + safeAddClass(jqLite(linkNode), oldClasses); + } + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } else { + childBoundTranscludeFn = boundTranscludeFn; + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, + childBoundTranscludeFn, afterTemplateNodeLinkFn); + } + linkQueue = null; + }); + + return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { + var childBoundTranscludeFn = boundTranscludeFn; + if (scope.$$destroyed) return; + if (linkQueue) { + linkQueue.push(scope, + node, + rootElement, + childBoundTranscludeFn); + } else { + if (afterTemplateNodeLinkFn.transcludeOnThisElement) { + childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); + } + afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn, + afterTemplateNodeLinkFn); + } + }; + } + + + /** + * Sorting function for bound directives. + */ + function byPriority(a, b) { + var diff = b.priority - a.priority; + if (diff !== 0) return diff; + if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; + return a.index - b.index; + } + + function assertNoDuplicate(what, previousDirective, directive, element) { + + function wrapModuleNameIfDefined(moduleName) { + return moduleName ? + (' (module: ' + moduleName + ')') : + ''; + } + + if (previousDirective) { + throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}', + previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName), + directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element)); + } + } + + + function addTextInterpolateDirective(directives, text) { + var interpolateFn = $interpolate(text, true); + if (interpolateFn) { + directives.push({ + priority: 0, + compile: function textInterpolateCompileFn(templateNode) { + var templateNodeParent = templateNode.parent(), + hasCompileParent = !!templateNodeParent.length; + + // When transcluding a template that has bindings in the root + // we don't have a parent and thus need to add the class during linking fn. + if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); + + return function textInterpolateLinkFn(scope, node) { + var parent = node.parent(); + if (!hasCompileParent) compile.$$addBindingClass(parent); + compile.$$addBindingInfo(parent, interpolateFn.expressions); + scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { + node[0].nodeValue = value; + }); + }; + } + }); + } + } + + + function wrapTemplate(type, template) { + type = lowercase(type || 'html'); + switch (type) { + case 'svg': + case 'math': + var wrapper = document.createElement('div'); + wrapper.innerHTML = '<' + type + '>' + template + ''; + return wrapper.childNodes[0].childNodes; + default: + return template; + } + } + + + function getTrustedContext(node, attrNormalizedName) { + if (attrNormalizedName == "srcdoc") { + return $sce.HTML; + } + var tag = nodeName_(node); + // maction[xlink:href] can source SVG. It's not limited to . + if (attrNormalizedName == "xlinkHref" || + (tag == "form" && attrNormalizedName == "action") || + (tag != "img" && (attrNormalizedName == "src" || + attrNormalizedName == "ngSrc"))) { + return $sce.RESOURCE_URL; + } + } + + + function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { + var trustedContext = getTrustedContext(node, name); + allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; + + var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); + + // no interpolation found -> ignore + if (!interpolateFn) return; + + + if (name === "multiple" && nodeName_(node) === "select") { + throw $compileMinErr("selmulti", + "Binding to the 'multiple' attribute is not supported. Element: {0}", + startingTag(node)); + } + + directives.push({ + priority: 100, + compile: function() { + return { + pre: function attrInterpolatePreLinkFn(scope, element, attr) { + var $$observers = (attr.$$observers || (attr.$$observers = {})); + + if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { + throw $compileMinErr('nodomevents', + "Interpolations for HTML DOM event attributes are disallowed. Please use the " + + "ng- versions (such as ng-click instead of onclick) instead."); + } + + // If the attribute has changed since last $interpolate()ed + var newValue = attr[name]; + if (newValue !== value) { + // we need to interpolate again since the attribute value has been updated + // (e.g. by another directive's compile function) + // ensure unset/empty values make interpolateFn falsy + interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); + value = newValue; + } + + // if attribute was updated so that there is no interpolation going on we don't want to + // register any observers + if (!interpolateFn) return; + + // initialize attr object so that it's ready in case we need the value for isolate + // scope initialization, otherwise the value would not be available from isolate + // directive's linking fn during linking phase + attr[name] = interpolateFn(scope); + + ($$observers[name] || ($$observers[name] = [])).$$inter = true; + (attr.$$observers && attr.$$observers[name].$$scope || scope). + $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { + //special case for class attribute addition + removal + //so that class changes can tap into the animation + //hooks provided by the $animate service. Be sure to + //skip animations when the first digest occurs (when + //both the new and the old values are the same) since + //the CSS classes are the non-interpolated values + if (name === 'class' && newValue != oldValue) { + attr.$updateClass(newValue, oldValue); + } else { + attr.$set(name, newValue); + } + }); + } + }; + } + }); + } + + + /** + * This is a special jqLite.replaceWith, which can replace items which + * have no parents, provided that the containing jqLite collection is provided. + * + * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes + * in the root of the tree. + * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep + * the shell, but replace its DOM node reference. + * @param {Node} newNode The new DOM node. + */ + function replaceWith($rootElement, elementsToRemove, newNode) { + var firstElementToRemove = elementsToRemove[0], + removeCount = elementsToRemove.length, + parent = firstElementToRemove.parentNode, + i, ii; + + if ($rootElement) { + for (i = 0, ii = $rootElement.length; i < ii; i++) { + if ($rootElement[i] == firstElementToRemove) { + $rootElement[i++] = newNode; + for (var j = i, j2 = j + removeCount - 1, + jj = $rootElement.length; + j < jj; j++, j2++) { + if (j2 < jj) { + $rootElement[j] = $rootElement[j2]; + } else { + delete $rootElement[j]; + } + } + $rootElement.length -= removeCount - 1; + + // If the replaced element is also the jQuery .context then replace it + // .context is a deprecated jQuery api, so we should set it only when jQuery set it + // http://api.jquery.com/context/ + if ($rootElement.context === firstElementToRemove) { + $rootElement.context = newNode; + } + break; + } + } + } + + if (parent) { + parent.replaceChild(newNode, firstElementToRemove); + } + + // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it? + var fragment = document.createDocumentFragment(); + fragment.appendChild(firstElementToRemove); + + if (jqLite.hasData(firstElementToRemove)) { + // Copy over user data (that includes Angular's $scope etc.). Don't copy private + // data here because there's no public interface in jQuery to do that and copying over + // event listeners (which is the main use of private data) wouldn't work anyway. + jqLite(newNode).data(jqLite(firstElementToRemove).data()); + + // Remove data of the replaced element. We cannot just call .remove() + // on the element it since that would deallocate scope that is needed + // for the new node. Instead, remove the data "manually". + if (!jQuery) { + delete jqLite.cache[firstElementToRemove[jqLite.expando]]; + } else { + // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after + // the replaced element. The cleanData version monkey-patched by Angular would cause + // the scope to be trashed and we do need the very same scope to work with the new + // element. However, we cannot just cache the non-patched version and use it here as + // that would break if another library patches the method after Angular does (one + // example is jQuery UI). Instead, set a flag indicating scope destroying should be + // skipped this one time. + skipDestroyOnNextJQueryCleanData = true; + jQuery.cleanData([firstElementToRemove]); + } + } + + for (var k = 1, kk = elementsToRemove.length; k < kk; k++) { + var element = elementsToRemove[k]; + jqLite(element).remove(); // must do this way to clean up expando + fragment.appendChild(element); + delete elementsToRemove[k]; + } + + elementsToRemove[0] = newNode; + elementsToRemove.length = 1; + } + + + function cloneAndAnnotateFn(fn, annotation) { + return extend(function() { return fn.apply(null, arguments); }, fn, annotation); + } + + + function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { + try { + linkFn(scope, $element, attrs, controllers, transcludeFn); + } catch (e) { + $exceptionHandler(e, startingTag($element)); + } + } + + + // Set up $watches for isolate scope and controller bindings. This process + // only occurs for isolate scopes and new scopes with controllerAs. + function initializeDirectiveBindings(scope, attrs, destination, bindings, + directive, newScope) { + var onNewScopeDestroyed; + forEach(bindings, function(definition, scopeName) { + var attrName = definition.attrName, + optional = definition.optional, + mode = definition.mode, // @, =, or & + lastValue, + parentGet, parentSet, compare; + + if (!hasOwnProperty.call(attrs, attrName)) { + // In the case of user defined a binding with the same name as a method in Object.prototype but didn't set + // the corresponding attribute. We need to make sure subsequent code won't access to the prototype function + attrs[attrName] = undefined; + } + + switch (mode) { + + case '@': + if (!attrs[attrName] && !optional) { + destination[scopeName] = undefined; + } + + attrs.$observe(attrName, function(value) { + destination[scopeName] = value; + }); + attrs.$$observers[attrName].$$scope = scope; + if (attrs[attrName]) { + // If the attribute has been provided then we trigger an interpolation to ensure + // the value is there for use in the link fn + destination[scopeName] = $interpolate(attrs[attrName])(scope); + } + break; + + case '=': + if (optional && !attrs[attrName]) { + return; + } + parentGet = $parse(attrs[attrName]); + + if (parentGet.literal) { + compare = equals; + } else { + compare = function(a, b) { return a === b || (a !== a && b !== b); }; + } + parentSet = parentGet.assign || function() { + // reset the change, or we will throw this exception on every $digest + lastValue = destination[scopeName] = parentGet(scope); + throw $compileMinErr('nonassign', + "Expression '{0}' used with directive '{1}' is non-assignable!", + attrs[attrName], directive.name); + }; + lastValue = destination[scopeName] = parentGet(scope); + var parentValueWatch = function parentValueWatch(parentValue) { + if (!compare(parentValue, destination[scopeName])) { + // we are out of sync and need to copy + if (!compare(parentValue, lastValue)) { + // parent changed and it has precedence + destination[scopeName] = parentValue; + } else { + // if the parent can be assigned then do so + parentSet(scope, parentValue = destination[scopeName]); + } + } + return lastValue = parentValue; + }; + parentValueWatch.$stateful = true; + var unwatch; + if (definition.collection) { + unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch); + } else { + unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); + } + onNewScopeDestroyed = (onNewScopeDestroyed || []); + onNewScopeDestroyed.push(unwatch); + break; + + case '&': + parentGet = $parse(attrs[attrName]); + + // Don't assign noop to destination if expression is not valid + if (parentGet === noop && optional) break; + + destination[scopeName] = function(locals) { + return parentGet(scope, locals); + }; + break; + } + }); + var destroyBindings = onNewScopeDestroyed ? function destroyBindings() { + for (var i = 0, ii = onNewScopeDestroyed.length; i < ii; ++i) { + onNewScopeDestroyed[i](); + } + } : noop; + if (newScope && destroyBindings !== noop) { + newScope.$on('$destroy', destroyBindings); + return noop; + } + return destroyBindings; + } + }]; +} + +var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; +/** + * Converts all accepted directives format into proper directive name. + * @param name Name to normalize + */ +function directiveNormalize(name) { + return camelCase(name.replace(PREFIX_REGEXP, '')); +} + +/** + * @ngdoc type + * @name $compile.directive.Attributes + * + * @description + * A shared object between directive compile / linking functions which contains normalized DOM + * element attributes. The values reflect current binding state `{{ }}`. The normalization is + * needed since all of these are treated as equivalent in Angular: + * + * ``` + * + * ``` + */ + +/** + * @ngdoc property + * @name $compile.directive.Attributes#$attr + * + * @description + * A map of DOM element attribute names to the normalized name. This is + * needed to do reverse lookup from normalized name back to actual name. + */ + + +/** + * @ngdoc method + * @name $compile.directive.Attributes#$set + * @kind function + * + * @description + * Set DOM element attribute value. + * + * + * @param {string} name Normalized element attribute name of the property to modify. The name is + * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} + * property to the original name. + * @param {string} value Value to set the attribute to. The value can be an interpolated string. + */ + + + +/** + * Closure compiler type information + */ + +function nodesetLinkingFn( + /* angular.Scope */ scope, + /* NodeList */ nodeList, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function directiveLinkingFn( + /* nodesetLinkingFn */ nodesetLinkingFn, + /* angular.Scope */ scope, + /* Node */ node, + /* Element */ rootElement, + /* function(Function) */ boundTranscludeFn +) {} + +function tokenDifference(str1, str2) { + var values = '', + tokens1 = str1.split(/\s+/), + tokens2 = str2.split(/\s+/); + + outer: + for (var i = 0; i < tokens1.length; i++) { + var token = tokens1[i]; + for (var j = 0; j < tokens2.length; j++) { + if (token == tokens2[j]) continue outer; + } + values += (values.length > 0 ? ' ' : '') + token; + } + return values; +} + +function removeComments(jqNodes) { + jqNodes = jqLite(jqNodes); + var i = jqNodes.length; + + if (i <= 1) { + return jqNodes; + } + + while (i--) { + var node = jqNodes[i]; + if (node.nodeType === NODE_TYPE_COMMENT) { + splice.call(jqNodes, i, 1); + } + } + return jqNodes; +} + +var $controllerMinErr = minErr('$controller'); + + +var CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; +function identifierForController(controller, ident) { + if (ident && isString(ident)) return ident; + if (isString(controller)) { + var match = CNTRL_REG.exec(controller); + if (match) return match[3]; + } +} + + +/** + * @ngdoc provider + * @name $controllerProvider + * @description + * The {@link ng.$controller $controller service} is used by Angular to create new + * controllers. + * + * This provider allows controller registration via the + * {@link ng.$controllerProvider#register register} method. + */ +function $ControllerProvider() { + var controllers = {}, + globals = false; + + /** + * @ngdoc method + * @name $controllerProvider#register + * @param {string|Object} name Controller name, or an object map of controllers where the keys are + * the names and the values are the constructors. + * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI + * annotations in the array notation). + */ + this.register = function(name, constructor) { + assertNotHasOwnProperty(name, 'controller'); + if (isObject(name)) { + extend(controllers, name); + } else { + controllers[name] = constructor; + } + }; + + /** + * @ngdoc method + * @name $controllerProvider#allowGlobals + * @description If called, allows `$controller` to find controller constructors on `window` + */ + this.allowGlobals = function() { + globals = true; + }; + + + this.$get = ['$injector', '$window', function($injector, $window) { + + /** + * @ngdoc service + * @name $controller + * @requires $injector + * + * @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. + * @return {Object} Instance of given controller. + * + * @description + * `$controller` service is responsible for instantiating controllers. + * + * It's just a simple call to {@link auto.$injector $injector}, but extracted into + * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). + */ + return function(expression, locals, later, ident) { + // PRIVATE API: + // param `later` --- indicates that the controller's constructor is invoked at a later time. + // If true, $controller will allocate the object with the correct + // prototype chain, but will not invoke the controller until a returned + // callback is invoked. + // param `ident` --- An optional label which overrides the label parsed from the controller + // expression, if any. + var instance, match, constructor, identifier; + later = later === true; + if (ident && isString(ident)) { + identifier = ident; + } + + if (isString(expression)) { + match = expression.match(CNTRL_REG); + if (!match) { + throw $controllerMinErr('ctrlfmt', + "Badly formed controller string '{0}'. " + + "Must match `__name__ as __id__` or `__name__`.", expression); + } + constructor = match[1], + identifier = identifier || match[3]; + expression = controllers.hasOwnProperty(constructor) + ? controllers[constructor] + : getter(locals.$scope, constructor, true) || + (globals ? getter($window, constructor, true) : undefined); + + assertArgFn(expression, constructor, true); + } + + if (later) { + // Instantiate controller later: + // This machinery is used to create an instance of the object before calling the + // controller's constructor itself. + // + // This allows properties to be added to the controller before the constructor is + // invoked. Primarily, this is used for isolate scope bindings in $compile. + // + // This feature is not intended for use by applications, and is thus not documented + // publicly. + // Object creation: http://jsperf.com/create-constructor/2 + var controllerPrototype = (isArray(expression) ? + expression[expression.length - 1] : expression).prototype; + instance = Object.create(controllerPrototype || null); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + var instantiate; + return instantiate = extend(function() { + var result = $injector.invoke(expression, instance, locals, constructor); + if (result !== instance && (isObject(result) || isFunction(result))) { + instance = result; + if (identifier) { + // If result changed, re-assign controllerAs value to scope. + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + } + return instance; + }, { + instance: instance, + identifier: identifier + }); + } + + instance = $injector.instantiate(expression, locals, constructor); + + if (identifier) { + addIdentifier(locals, identifier, instance, constructor || expression.name); + } + + return instance; + }; + + function addIdentifier(locals, identifier, instance, name) { + if (!(locals && isObject(locals.$scope))) { + throw minErr('$controller')('noscp', + "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", + name, identifier); + } + + locals.$scope[identifier] = instance; + } + }]; +} + +/** + * @ngdoc service + * @name $document + * @requires $window + * + * @description + * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. + * + * @example + + +
+

$document title:

+

window.document title:

+
+
+ + angular.module('documentExample', []) + .controller('ExampleController', ['$scope', '$document', function($scope, $document) { + $scope.title = $document[0].title; + $scope.windowTitle = angular.element(window.document)[0].title; + }]); + +
+ */ +function $DocumentProvider() { + this.$get = ['$window', function(window) { + return jqLite(window.document); + }]; +} + +/** + * @ngdoc service + * @name $exceptionHandler + * @requires ng.$log + * + * @description + * Any uncaught exception in angular expressions is delegated to this service. + * The default implementation simply delegates to `$log.error` which logs it into + * the browser console. + * + * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by + * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. + * + * ## Example: + * + * ```js + * angular.module('exceptionOverride', []).factory('$exceptionHandler', function() { + * return function(exception, cause) { + * exception.message += ' (caused by "' + cause + '")'; + * throw exception; + * }; + * }); + * ``` + * + * This example will override the normal action of `$exceptionHandler`, to make angular + * exceptions fail hard when they happen, instead of just logging to the console. + * + *
+ * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` + * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} + * (unless executed during a digest). + * + * If you wish, you can manually delegate exceptions, e.g. + * `try { ... } catch(e) { $exceptionHandler(e); }` + * + * @param {Error} exception Exception associated with the error. + * @param {string=} cause optional information about the context in which + * the error was thrown. + * + */ +function $ExceptionHandlerProvider() { + this.$get = ['$log', function($log) { + return function(exception, cause) { + $log.error.apply($log, arguments); + }; + }]; +} + +var APPLICATION_JSON = 'application/json'; +var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; +var JSON_START = /^\[|^\{(?!\{)/; +var JSON_ENDS = { + '[': /]$/, + '{': /}$/ +}; +var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; + +function serializeValue(v) { + if (isObject(v)) { + return isDate(v) ? v.toISOString() : toJson(v); + } + return v; +} + + +function $HttpParamSerializerProvider() { + /** + * @ngdoc service + * @name $httpParamSerializer + * @description + * + * Default {@link $http `$http`} params serializer that converts objects to strings + * according to the following rules: + * + * * `{'foo': 'bar'}` results in `foo=bar` + * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object) + * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element) + * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object) + * + * Note that serializer will sort the request parameters alphabetically. + * */ + + this.$get = function() { + return function ngParamSerializer(params) { + if (!params) return ''; + var parts = []; + forEachSorted(params, function(value, key) { + if (value === null || isUndefined(value)) return; + if (isArray(value)) { + forEach(value, function(v, k) { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(v))); + }); + } else { + parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value))); + } + }); + + return parts.join('&'); + }; + }; +} + +function $HttpParamSerializerJQLikeProvider() { + /** + * @ngdoc service + * @name $httpParamSerializerJQLike + * @description + * + * Alternative {@link $http `$http`} params serializer that follows + * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic. + * The serializer will also sort the params alphabetically. + * + * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property: + * + * ```js + * $http({ + * url: myUrl, + * method: 'GET', + * params: myParams, + * paramSerializer: '$httpParamSerializerJQLike' + * }); + * ``` + * + * It is also possible to set it as the default `paramSerializer` in the + * {@link $httpProvider#defaults `$httpProvider`}. + * + * Additionally, you can inject the serializer and use it explicitly, for example to serialize + * form data for submission: + * + * ```js + * .controller(function($http, $httpParamSerializerJQLike) { + * //... + * + * $http({ + * url: myUrl, + * method: 'POST', + * data: $httpParamSerializerJQLike(myData), + * headers: { + * 'Content-Type': 'application/x-www-form-urlencoded' + * } + * }); + * + * }); + * ``` + * + * */ + this.$get = function() { + return function jQueryLikeParamSerializer(params) { + if (!params) return ''; + var parts = []; + serialize(params, '', true); + return parts.join('&'); + + function serialize(toSerialize, prefix, topLevel) { + if (toSerialize === null || isUndefined(toSerialize)) return; + if (isArray(toSerialize)) { + forEach(toSerialize, function(value) { + serialize(value, prefix + '[]'); + }); + } else if (isObject(toSerialize) && !isDate(toSerialize)) { + forEachSorted(toSerialize, function(value, key) { + serialize(value, prefix + + (topLevel ? '' : '[') + + key + + (topLevel ? '' : ']')); + }); + } else { + parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize))); + } + } + }; + }; +} + +function defaultHttpResponseTransform(data, headers) { + if (isString(data)) { + // Strip json vulnerability protection prefix and trim whitespace + var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); + + if (tempData) { + var contentType = headers('Content-Type'); + if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { + data = fromJson(tempData); + } + } + } + + return data; +} + +function isJsonLike(str) { + var jsonStart = str.match(JSON_START); + return jsonStart && JSON_ENDS[jsonStart[0]].test(str); +} + +/** + * Parse headers into key value object + * + * @param {string} headers Raw headers as a string + * @returns {Object} Parsed headers as key value object + */ +function parseHeaders(headers) { + var parsed = createMap(), i; + + function fillInParsed(key, val) { + if (key) { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + + if (isString(headers)) { + forEach(headers.split('\n'), function(line) { + i = line.indexOf(':'); + fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1))); + }); + } else if (isObject(headers)) { + forEach(headers, function(headerVal, headerKey) { + fillInParsed(lowercase(headerKey), trim(headerVal)); + }); + } + + return parsed; +} + + +/** + * Returns a function that provides access to parsed headers. + * + * Headers are lazy parsed when first requested. + * @see parseHeaders + * + * @param {(string|Object)} headers Headers to provide access to. + * @returns {function(string=)} Returns a getter function which if called with: + * + * - if called with single an argument returns a single header value or null + * - if called with no arguments returns an object containing all headers. + */ +function headersGetter(headers) { + var headersObj; + + return function(name) { + if (!headersObj) headersObj = parseHeaders(headers); + + if (name) { + var value = headersObj[lowercase(name)]; + if (value === void 0) { + value = null; + } + return value; + } + + return headersObj; + }; +} + + +/** + * Chain all given functions + * + * This function is used for both request and response transforming + * + * @param {*} data Data to transform. + * @param {function(string=)} headers HTTP headers getter fn. + * @param {number} status HTTP status code of the response. + * @param {(Function|Array.)} fns Function or an array of functions. + * @returns {*} Transformed data. + */ +function transformData(data, headers, status, fns) { + if (isFunction(fns)) { + return fns(data, headers, status); + } + + forEach(fns, function(fn) { + data = fn(data, headers, status); + }); + + return data; +} + + +function isSuccess(status) { + return 200 <= status && status < 300; +} + + +/** + * @ngdoc provider + * @name $httpProvider + * @description + * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. + * */ +function $HttpProvider() { + /** + * @ngdoc property + * @name $httpProvider#defaults + * @description + * + * Object containing default values for all {@link ng.$http $http} requests. + * + * - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`} + * that will provide the cache for all requests who set their `cache` property to `true`. + * If you set the `defaults.cache = false` then only requests that specify their own custom + * cache object will be cached. See {@link $http#caching $http Caching} for more information. + * + * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. + * Defaults value is `'XSRF-TOKEN'`. + * + * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the + * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. + * + * - **`defaults.headers`** - {Object} - Default headers for all $http requests. + * Refer to {@link ng.$http#setting-http-headers $http} for documentation on + * setting default headers. + * - **`defaults.headers.common`** + * - **`defaults.headers.post`** + * - **`defaults.headers.put`** + * - **`defaults.headers.patch`** + * + * + * - **`defaults.paramSerializer`** - `{string|function(Object):string}` - A function + * used to the prepare string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}. + * Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}. + * + **/ + var defaults = this.defaults = { + // transform incoming response data + transformResponse: [defaultHttpResponseTransform], + + // transform outgoing request data + transformRequest: [function(d) { + return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; + }], + + // default headers + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + }, + post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), + patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) + }, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + paramSerializer: '$httpParamSerializer' + }; + + var useApplyAsync = false; + /** + * @ngdoc method + * @name $httpProvider#useApplyAsync + * @description + * + * Configure $http service to combine processing of multiple http responses received at around + * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in + * significant performance improvement for bigger applications that make many HTTP requests + * concurrently (common during application bootstrap). + * + * Defaults to false. If no value is specified, returns the current configured value. + * + * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred + * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window + * to load and share the same digest cycle. + * + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + **/ + this.useApplyAsync = function(value) { + if (isDefined(value)) { + useApplyAsync = !!value; + return this; + } + return useApplyAsync; + }; + + /** + * @ngdoc property + * @name $httpProvider#interceptors + * @description + * + * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} + * pre-processing of request or postprocessing of responses. + * + * These service factories are ordered by request, i.e. they are applied in the same order as the + * array, on request, but reverse order, on response. + * + * {@link ng.$http#interceptors Interceptors detailed info} + **/ + var interceptorFactories = this.interceptors = []; + + this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', + function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) { + + var defaultCache = $cacheFactory('$http'); + + /** + * Make sure that default param serializer is exposed as a function + */ + defaults.paramSerializer = isString(defaults.paramSerializer) ? + $injector.get(defaults.paramSerializer) : defaults.paramSerializer; + + /** + * Interceptors stored in reverse order. Inner interceptors before outer interceptors. + * The reversal is needed so that we can build up the interception chain around the + * server request. + */ + var reversedInterceptors = []; + + forEach(interceptorFactories, function(interceptorFactory) { + reversedInterceptors.unshift(isString(interceptorFactory) + ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); + }); + + /** + * @ngdoc service + * @kind function + * @name $http + * @requires ng.$httpBackend + * @requires $cacheFactory + * @requires $rootScope + * @requires $q + * @requires $injector + * + * @description + * The `$http` service is a core Angular service that facilitates communication with the remote + * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) + * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). + * + * For unit testing applications that use `$http` service, see + * {@link ngMock.$httpBackend $httpBackend mock}. + * + * For a higher level of abstraction, please check out the {@link ngResource.$resource + * $resource} service. + * + * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by + * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage + * it is important to familiarize yourself with these APIs and the guarantees they provide. + * + * + * ## General usage + * The `$http` service is a function which takes a single argument — a configuration object — + * that is used to generate an HTTP request and returns a {@link ng.$q promise} + * with two $http specific methods: `success` and `error`. + * + * ```js + * // Simple GET request example : + * $http.get('/someUrl'). + * success(function(data, status, headers, config) { + * // this callback will be called asynchronously + * // when the response is available + * }). + * error(function(data, status, headers, config) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * ```js + * // Simple POST request example (passing data) : + * $http.post('/someUrl', {msg:'hello word!'}). + * success(function(data, status, headers, config) { + * // this callback will be called asynchronously + * // when the response is available + * }). + * error(function(data, status, headers, config) { + * // called asynchronously if an error occurs + * // or server returns response with an error status. + * }); + * ``` + * + * + * Since the returned value of calling the $http function is a `promise`, you can also use + * the `then` method to register callbacks, and these callbacks will receive a single argument – + * an object representing the response. See the API signature and type info below for more + * details. + * + * A response status code between 200 and 299 is considered a success status and + * will result in the success callback being called. Note that if the response is a redirect, + * XMLHttpRequest will transparently follow it, meaning that the error callback will not be + * called for such responses. + * + * ## Writing Unit Tests that use $http + * When unit testing (using {@link ngMock ngMock}), it is necessary to call + * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending + * request using trained responses. + * + * ``` + * $httpBackend.expectGET(...); + * $http.get(...); + * $httpBackend.flush(); + * ``` + * + * ## Shortcut methods + * + * Shortcut methods are also available. All shortcut methods require passing in the URL, and + * request data must be passed in for POST/PUT requests. + * + * ```js + * $http.get('/someUrl').success(successCallback); + * $http.post('/someUrl', data).success(successCallback); + * ``` + * + * Complete list of shortcut methods: + * + * - {@link ng.$http#get $http.get} + * - {@link ng.$http#head $http.head} + * - {@link ng.$http#post $http.post} + * - {@link ng.$http#put $http.put} + * - {@link ng.$http#delete $http.delete} + * - {@link ng.$http#jsonp $http.jsonp} + * - {@link ng.$http#patch $http.patch} + * + * + * ## Setting HTTP Headers + * + * The $http service will automatically add certain HTTP headers to all requests. These defaults + * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration + * object, which currently contains this default configuration: + * + * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): + * - `Accept: application/json, text/plain, * / *` + * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) + * - `Content-Type: application/json` + * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) + * - `Content-Type: application/json` + * + * To add or overwrite these defaults, simply add or remove a property from these configuration + * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object + * with the lowercased HTTP method name as the key, e.g. + * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`. + * + * The defaults can also be set at runtime via the `$http.defaults` object in the same + * fashion. For example: + * + * ``` + * module.run(function($http) { + * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' + * }); + * ``` + * + * In addition, you can supply a `headers` property in the config object passed when + * calling `$http(config)`, which overrides the defaults without changing them globally. + * + * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, + * Use the `headers` property, setting the desired header to `undefined`. For example: + * + * ```js + * var req = { + * method: 'POST', + * url: 'http://example.com', + * headers: { + * 'Content-Type': undefined + * }, + * data: { test: 'test' } + * } + * + * $http(req).success(function(){...}).error(function(){...}); + * ``` + * + * ## Transforming Requests and Responses + * + * Both requests and responses can be transformed using transformation functions: `transformRequest` + * and `transformResponse`. These properties can be a single function that returns + * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, + * which allows you to `push` or `unshift` a new transformation function into the transformation chain. + * + * ### Default Transformations + * + * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and + * `defaults.transformResponse` properties. If a request does not provide its own transformations + * then these will be applied. + * + * You can augment or replace the default transformations by modifying these properties by adding to or + * replacing the array. + * + * Angular provides the following default transformations: + * + * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): + * + * - If the `data` property of the request configuration object contains an object, serialize it + * into JSON format. + * + * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): + * + * - If XSRF prefix is detected, strip it (see Security Considerations section below). + * - If JSON response is detected, deserialize it using a JSON parser. + * + * + * ### Overriding the Default Transformations Per Request + * + * If you wish override the request/response transformations only for a single request then provide + * `transformRequest` and/or `transformResponse` properties on the configuration object passed + * into `$http`. + * + * Note that if you provide these properties on the config object the default transformations will be + * overwritten. If you wish to augment the default transformations then you must include them in your + * local transformation array. + * + * The following code demonstrates adding a new response transformation to be run after the default response + * transformations have been run. + * + * ```js + * function appendTransform(defaults, transform) { + * + * // We can't guarantee that the default transformation is an array + * defaults = angular.isArray(defaults) ? defaults : [defaults]; + * + * // Append the new transformation to the defaults + * return defaults.concat(transform); + * } + * + * $http({ + * url: '...', + * method: 'GET', + * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { + * return doTransform(value); + * }) + * }); + * ``` + * + * + * ## Caching + * + * To enable caching, set the request configuration `cache` property to `true` (to use default + * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}). + * When the cache is enabled, `$http` stores the response from the server in the specified + * cache. The next time the same request is made, the response is served from the cache without + * sending a request to the server. + * + * Note that even if the response is served from cache, delivery of the data is asynchronous in + * the same way that real requests are. + * + * If there are multiple GET requests for the same URL that should be cached using the same + * cache, but the cache is not populated yet, only one request to the server will be made and + * the remaining requests will be fulfilled using the response from the first request. + * + * You can change the default cache to a new object (built with + * {@link ng.$cacheFactory `$cacheFactory`}) by updating the + * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set + * their `cache` property to `true` will now use this cache object. + * + * If you set the default cache to `false` then only requests that specify their own custom + * cache object will be cached. + * + * ## Interceptors + * + * Before you start creating interceptors, be sure to understand the + * {@link ng.$q $q and deferred/promise APIs}. + * + * For purposes of global error handling, authentication, or any kind of synchronous or + * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be + * able to intercept requests before they are handed to the server and + * responses before they are handed over to the application code that + * initiated these requests. The interceptors leverage the {@link ng.$q + * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. + * + * The interceptors are service factories that are registered with the `$httpProvider` by + * adding them to the `$httpProvider.interceptors` array. The factory is called and + * injected with dependencies (if specified) and returns the interceptor. + * + * There are two kinds of interceptors (and two kinds of rejection interceptors): + * + * * `request`: interceptors get called with a http `config` object. The function is free to + * modify the `config` object or create a new one. The function needs to return the `config` + * object directly, or a promise containing the `config` or a new `config` object. + * * `requestError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * * `response`: interceptors get called with http `response` object. The function is free to + * modify the `response` object or create a new one. The function needs to return the `response` + * object directly, or as a promise containing the `response` or a new `response` object. + * * `responseError`: interceptor gets called when a previous interceptor threw an error or + * resolved with a rejection. + * + * + * ```js + * // register the interceptor as a service + * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { + * return { + * // optional method + * 'request': function(config) { + * // do something on success + * return config; + * }, + * + * // optional method + * 'requestError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * }, + * + * + * + * // optional method + * 'response': function(response) { + * // do something on success + * return response; + * }, + * + * // optional method + * 'responseError': function(rejection) { + * // do something on error + * if (canRecover(rejection)) { + * return responseOrNewPromise + * } + * return $q.reject(rejection); + * } + * }; + * }); + * + * $httpProvider.interceptors.push('myHttpInterceptor'); + * + * + * // alternatively, register the interceptor via an anonymous factory + * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { + * return { + * 'request': function(config) { + * // same as above + * }, + * + * 'response': function(response) { + * // same as above + * } + * }; + * }); + * ``` + * + * ## Security Considerations + * + * When designing web applications, consider security threats from: + * + * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) + * + * Both server and the client must cooperate in order to eliminate these threats. Angular comes + * pre-configured with strategies that address these issues, but for this to work backend server + * cooperation is required. + * + * ### JSON Vulnerability Protection + * + * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) + * allows third party website to turn your JSON resource URL into + * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To + * counter this your server can prefix all JSON requests with following string `")]}',\n"`. + * Angular will automatically strip the prefix before processing it as JSON. + * + * For example if your server needs to return: + * ```js + * ['one','two'] + * ``` + * + * which is vulnerable to attack, your server can return: + * ```js + * )]}', + * ['one','two'] + * ``` + * + * Angular will strip the prefix, before processing the JSON. + * + * + * ### Cross Site Request Forgery (XSRF) Protection + * + * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which + * an unauthorized site can gain your user's private data. Angular provides a mechanism + * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie + * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only + * JavaScript that runs on your domain could read the cookie, your server can be assured that + * the XHR came from JavaScript running on your domain. The header will not be set for + * cross-domain requests. + * + * To take advantage of this, your server needs to set a token in a JavaScript readable session + * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the + * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure + * that only JavaScript running on your domain could have sent the request. The token must be + * unique for each user and must be verifiable by the server (to prevent the JavaScript from + * making up its own tokens). We recommend that the token is a digest of your site's + * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) + * for added security. + * + * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName + * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, + * or the per-request config object. + * + * In order to prevent collisions in environments where multiple Angular apps share the + * same domain or subdomain, we recommend that each application uses unique cookie name. + * + * + * @param {object} config Object describing the request to be made and how it should be + * processed. The object has following properties: + * + * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) + * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. + * - **params** – `{Object.}` – Map of strings or objects which will be serialized + * with the `paramSerializer` and appended as GET parameters. + * - **data** – `{string|Object}` – Data to be sent as the request message data. + * - **headers** – `{Object}` – Map of strings or functions which return strings representing + * HTTP headers to send to the server. If the return value of a function is null, the + * header will not be sent. Functions accept a config object as an argument. + * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. + * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. + * - **transformRequest** – + * `{function(data, headersGetter)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * request body and headers and returns its transformed (typically serialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default Transformations} + * - **transformResponse** – + * `{function(data, headersGetter, status)|Array.}` – + * transform function or an array of such functions. The transform function takes the http + * response body, headers and status and returns its transformed (typically deserialized) version. + * See {@link ng.$http#overriding-the-default-transformations-per-request + * Overriding the Default TransformationjqLiks} + * - **paramSerializer** - `{string|function(Object):string}` - A function used to + * prepare the string representation of request parameters (specified as an object). + * If specified as string, it is interpreted as function registered with the + * {@link $injector $injector}, which means you can create your own serializer + * by registering it as a {@link auto.$provide#service service}. + * The default serializer is the {@link $httpParamSerializer $httpParamSerializer}; + * alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike} + * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the + * GET request, otherwise if a cache instance built with + * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for + * caching. + * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} + * that should abort the request when resolved. + * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the + * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) + * for more information. + * - **responseType** - `{string}` - see + * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype). + * + * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the + * standard `then` method and two http specific methods: `success` and `error`. The `then` + * method takes two arguments a success and an error callback which will be called with a + * response object. The `success` and `error` methods take a single argument - a function that + * will be called when the request succeeds or fails respectively. The arguments passed into + * these functions are destructured representation of the response object passed into the + * `then` method. The response object has these properties: + * + * - **data** – `{string|Object}` – The response body transformed with the transform + * functions. + * - **status** – `{number}` – HTTP status code of the response. + * - **headers** – `{function([headerName])}` – Header getter function. + * - **config** – `{Object}` – The configuration object that was used to generate the request. + * - **statusText** – `{string}` – HTTP status text of the response. + * + * @property {Array.} pendingRequests Array of config objects for currently pending + * requests. This is primarily meant to be used for debugging purposes. + * + * + * @example + + +
+ + +
+ + + +
http status code: {{status}}
+
http response data: {{data}}
+
+
+ + angular.module('httpExample', []) + .controller('FetchController', ['$scope', '$http', '$templateCache', + function($scope, $http, $templateCache) { + $scope.method = 'GET'; + $scope.url = 'http-hello.html'; + + $scope.fetch = function() { + $scope.code = null; + $scope.response = null; + + $http({method: $scope.method, url: $scope.url, cache: $templateCache}). + success(function(data, status) { + $scope.status = status; + $scope.data = data; + }). + error(function(data, status) { + $scope.data = data || "Request failed"; + $scope.status = status; + }); + }; + + $scope.updateModel = function(method, url) { + $scope.method = method; + $scope.url = url; + }; + }]); + + + Hello, $http! + + + var status = element(by.binding('status')); + var data = element(by.binding('data')); + var fetchBtn = element(by.id('fetchbtn')); + var sampleGetBtn = element(by.id('samplegetbtn')); + var sampleJsonpBtn = element(by.id('samplejsonpbtn')); + var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); + + it('should make an xhr GET request', function() { + sampleGetBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('200'); + expect(data.getText()).toMatch(/Hello, \$http!/); + }); + +// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 +// it('should make a JSONP request to angularjs.org', function() { +// sampleJsonpBtn.click(); +// fetchBtn.click(); +// expect(status.getText()).toMatch('200'); +// expect(data.getText()).toMatch(/Super Hero!/); +// }); + + it('should make JSONP request to invalid URL and invoke the error handler', + function() { + invalidJsonpBtn.click(); + fetchBtn.click(); + expect(status.getText()).toMatch('0'); + expect(data.getText()).toMatch('Request failed'); + }); + +
+ */ + function $http(requestConfig) { + + if (!angular.isObject(requestConfig)) { + throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); + } + + var config = extend({ + method: 'get', + transformRequest: defaults.transformRequest, + transformResponse: defaults.transformResponse, + paramSerializer: defaults.paramSerializer + }, requestConfig); + + config.headers = mergeHeaders(requestConfig); + config.method = uppercase(config.method); + config.paramSerializer = isString(config.paramSerializer) ? + $injector.get(config.paramSerializer) : config.paramSerializer; + + var serverRequest = function(config) { + var headers = config.headers; + var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); + + // strip content-type if data is undefined + if (isUndefined(reqData)) { + forEach(headers, function(value, header) { + if (lowercase(header) === 'content-type') { + delete headers[header]; + } + }); + } + + if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { + config.withCredentials = defaults.withCredentials; + } + + // send request + return sendReq(config, reqData).then(transformResponse, transformResponse); + }; + + var chain = [serverRequest, undefined]; + var promise = $q.when(config); + + // apply interceptors + forEach(reversedInterceptors, function(interceptor) { + if (interceptor.request || interceptor.requestError) { + chain.unshift(interceptor.request, interceptor.requestError); + } + if (interceptor.response || interceptor.responseError) { + chain.push(interceptor.response, interceptor.responseError); + } + }); + + while (chain.length) { + var thenFn = chain.shift(); + var rejectFn = chain.shift(); + + promise = promise.then(thenFn, rejectFn); + } + + promise.success = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + promise.error = function(fn) { + assertArgFn(fn, 'fn'); + + promise.then(null, function(response) { + fn(response.data, response.status, response.headers, config); + }); + return promise; + }; + + return promise; + + function transformResponse(response) { + // make a copy since the response must be cacheable + var resp = extend({}, response); + if (!response.data) { + resp.data = response.data; + } else { + resp.data = transformData(response.data, response.headers, response.status, config.transformResponse); + } + return (isSuccess(response.status)) + ? resp + : $q.reject(resp); + } + + function executeHeaderFns(headers, config) { + var headerContent, processedHeaders = {}; + + forEach(headers, function(headerFn, header) { + if (isFunction(headerFn)) { + headerContent = headerFn(config); + if (headerContent != null) { + processedHeaders[header] = headerContent; + } + } else { + processedHeaders[header] = headerFn; + } + }); + + return processedHeaders; + } + + function mergeHeaders(config) { + var defHeaders = defaults.headers, + reqHeaders = extend({}, config.headers), + defHeaderName, lowercaseDefHeaderName, reqHeaderName; + + defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); + + // using for-in instead of forEach to avoid unecessary iteration after header has been found + defaultHeadersIteration: + for (defHeaderName in defHeaders) { + lowercaseDefHeaderName = lowercase(defHeaderName); + + for (reqHeaderName in reqHeaders) { + if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { + continue defaultHeadersIteration; + } + } + + reqHeaders[defHeaderName] = defHeaders[defHeaderName]; + } + + // execute if header value is a function for merged headers + return executeHeaderFns(reqHeaders, shallowCopy(config)); + } + } + + $http.pendingRequests = []; + + /** + * @ngdoc method + * @name $http#get + * + * @description + * Shortcut method to perform `GET` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#delete + * + * @description + * Shortcut method to perform `DELETE` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#head + * + * @description + * Shortcut method to perform `HEAD` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#jsonp + * + * @description + * Shortcut method to perform `JSONP` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request. + * The name of the callback should be the string `JSON_CALLBACK`. + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethods('get', 'delete', 'head', 'jsonp'); + + /** + * @ngdoc method + * @name $http#post + * + * @description + * Shortcut method to perform `POST` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#put + * + * @description + * Shortcut method to perform `PUT` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + + /** + * @ngdoc method + * @name $http#patch + * + * @description + * Shortcut method to perform `PATCH` request. + * + * @param {string} url Relative or absolute URL specifying the destination of the request + * @param {*} data Request content + * @param {Object=} config Optional configuration object + * @returns {HttpPromise} Future object + */ + createShortMethodsWithData('post', 'put', 'patch'); + + /** + * @ngdoc property + * @name $http#defaults + * + * @description + * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of + * default headers, withCredentials as well as request and response transformations. + * + * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. + */ + $http.defaults = defaults; + + + return $http; + + + function createShortMethods(names) { + forEach(arguments, function(name) { + $http[name] = function(url, config) { + return $http(extend({}, config || {}, { + method: name, + url: url + })); + }; + }); + } + + + function createShortMethodsWithData(name) { + forEach(arguments, function(name) { + $http[name] = function(url, data, config) { + return $http(extend({}, config || {}, { + method: name, + url: url, + data: data + })); + }; + }); + } + + + /** + * Makes the request. + * + * !!! ACCESSES CLOSURE VARS: + * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests + */ + function sendReq(config, reqData) { + var deferred = $q.defer(), + promise = deferred.promise, + cache, + cachedResp, + reqHeaders = config.headers, + url = buildUrl(config.url, config.paramSerializer(config.params)); + + $http.pendingRequests.push(config); + promise.then(removePendingReq, removePendingReq); + + + if ((config.cache || defaults.cache) && config.cache !== false && + (config.method === 'GET' || config.method === 'JSONP')) { + cache = isObject(config.cache) ? config.cache + : isObject(defaults.cache) ? defaults.cache + : defaultCache; + } + + if (cache) { + cachedResp = cache.get(url); + if (isDefined(cachedResp)) { + if (isPromiseLike(cachedResp)) { + // cached request has already been sent, but there is no response yet + cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); + } else { + // serving from cache + if (isArray(cachedResp)) { + resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); + } else { + resolvePromise(cachedResp, 200, {}, 'OK'); + } + } + } else { + // put the promise for the non-transformed response into cache as a placeholder + cache.put(url, promise); + } + } + + + // if we won't have the response in cache, set the xsrf headers and + // send the request to the backend + if (isUndefined(cachedResp)) { + var xsrfValue = urlIsSameOrigin(config.url) + ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] + : undefined; + if (xsrfValue) { + reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; + } + + $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, + config.withCredentials, config.responseType); + } + + return promise; + + + /** + * Callback registered to $httpBackend(): + * - caches the response if desired + * - resolves the raw $http promise + * - calls $apply + */ + function done(status, response, headersString, statusText) { + if (cache) { + if (isSuccess(status)) { + cache.put(url, [status, response, parseHeaders(headersString), statusText]); + } else { + // remove promise from the cache + cache.remove(url); + } + } + + function resolveHttpPromise() { + resolvePromise(response, status, headersString, statusText); + } + + if (useApplyAsync) { + $rootScope.$applyAsync(resolveHttpPromise); + } else { + resolveHttpPromise(); + if (!$rootScope.$$phase) $rootScope.$apply(); + } + } + + + /** + * Resolves the raw $http promise. + */ + function resolvePromise(response, status, headers, statusText) { + // normalize internal statuses to 0 + status = Math.max(status, 0); + + (isSuccess(status) ? deferred.resolve : deferred.reject)({ + data: response, + status: status, + headers: headersGetter(headers), + config: config, + statusText: statusText + }); + } + + function resolvePromiseWithResult(result) { + resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); + } + + function removePendingReq() { + var idx = $http.pendingRequests.indexOf(config); + if (idx !== -1) $http.pendingRequests.splice(idx, 1); + } + } + + + function buildUrl(url, serializedParams) { + if (serializedParams.length > 0) { + url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams; + } + return url; + } + }]; +} + +function createXhr() { + return new window.XMLHttpRequest(); +} + +/** + * @ngdoc service + * @name $httpBackend + * @requires $window + * @requires $document + * + * @description + * HTTP backend used by the {@link ng.$http service} that delegates to + * XMLHttpRequest object or JSONP and deals with browser incompatibilities. + * + * You should never need to use this service directly, instead use the higher-level abstractions: + * {@link ng.$http $http} or {@link ngResource.$resource $resource}. + * + * During testing this implementation is swapped with {@link ngMock.$httpBackend mock + * $httpBackend} which can be trained with responses. + */ +function $HttpBackendProvider() { + this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { + return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]); + }]; +} + +function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { + // TODO(vojta): fix the signature + return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { + $browser.$$incOutstandingRequestCount(); + url = url || $browser.url(); + + if (lowercase(method) == 'jsonp') { + var callbackId = '_' + (callbacks.counter++).toString(36); + callbacks[callbackId] = function(data) { + callbacks[callbackId].data = data; + callbacks[callbackId].called = true; + }; + + var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), + callbackId, function(status, text) { + completeRequest(callback, status, callbacks[callbackId].data, "", text); + callbacks[callbackId] = noop; + }); + } else { + + var xhr = createXhr(); + + xhr.open(method, url, true); + forEach(headers, function(value, key) { + if (isDefined(value)) { + xhr.setRequestHeader(key, value); + } + }); + + xhr.onload = function requestLoaded() { + var statusText = xhr.statusText || ''; + + // responseText is the old-school way of retrieving response (supported by IE8 & 9) + // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) + var response = ('response' in xhr) ? xhr.response : xhr.responseText; + + // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) + var status = xhr.status === 1223 ? 204 : xhr.status; + + // fix status code when it is 0 (0 status is undocumented). + // Occurs when accessing file resources or on Android 4.1 stock browser + // while retrieving files from application cache. + if (status === 0) { + status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; + } + + completeRequest(callback, + status, + response, + xhr.getAllResponseHeaders(), + statusText); + }; + + var requestError = function() { + // The response is always empty + // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error + completeRequest(callback, -1, null, null, ''); + }; + + xhr.onerror = requestError; + xhr.onabort = requestError; + + if (withCredentials) { + xhr.withCredentials = true; + } + + if (responseType) { + try { + xhr.responseType = responseType; + } catch (e) { + // WebKit added support for the json responseType value on 09/03/2013 + // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are + // known to throw when setting the value "json" as the response type. Other older + // browsers implementing the responseType + // + // The json response type can be ignored if not supported, because JSON payloads are + // parsed on the client-side regardless. + if (responseType !== 'json') { + throw e; + } + } + } + + xhr.send(post); + } + + if (timeout > 0) { + var timeoutId = $browserDefer(timeoutRequest, timeout); + } else if (isPromiseLike(timeout)) { + timeout.then(timeoutRequest); + } + + + function timeoutRequest() { + jsonpDone && jsonpDone(); + xhr && xhr.abort(); + } + + function completeRequest(callback, status, response, headersString, statusText) { + // cancel timeout and subsequent timeout promise resolution + if (timeoutId !== undefined) { + $browserDefer.cancel(timeoutId); + } + jsonpDone = xhr = null; + + callback(status, response, headersString, statusText); + $browser.$$completeOutstandingRequest(noop); + } + }; + + function jsonpReq(url, callbackId, done) { + // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.: + // - fetches local scripts via XHR and evals them + // - adds and immediately removes script elements from the document + var script = rawDocument.createElement('script'), callback = null; + script.type = "text/javascript"; + script.src = url; + script.async = true; + + callback = function(event) { + removeEventListenerFn(script, "load", callback); + removeEventListenerFn(script, "error", callback); + rawDocument.body.removeChild(script); + script = null; + var status = -1; + var text = "unknown"; + + if (event) { + if (event.type === "load" && !callbacks[callbackId].called) { + event = { type: "error" }; + } + text = event.type; + status = event.type === "error" ? 404 : 200; + } + + if (done) { + done(status, text); + } + }; + + addEventListenerFn(script, "load", callback); + addEventListenerFn(script, "error", callback); + rawDocument.body.appendChild(script); + return callback; + } +} + +var $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate'); +$interpolateMinErr.throwNoconcat = function(text) { + throw $interpolateMinErr('noconcat', + "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + + "interpolations that concatenate multiple expressions when a trusted value is " + + "required. See http://docs.angularjs.org/api/ng.$sce", text); +}; + +$interpolateMinErr.interr = function(text, err) { + return $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, err.toString()); +}; + +/** + * @ngdoc provider + * @name $interpolateProvider + * + * @description + * + * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. + * + * @example + + + +
+ //demo.label// +
+
+ + it('should interpolate binding with custom symbols', function() { + expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); + }); + +
+ */ +function $InterpolateProvider() { + var startSymbol = '{{'; + var endSymbol = '}}'; + + /** + * @ngdoc method + * @name $interpolateProvider#startSymbol + * @description + * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. + * + * @param {string=} value new value to set the starting symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.startSymbol = function(value) { + if (value) { + startSymbol = value; + return this; + } else { + return startSymbol; + } + }; + + /** + * @ngdoc method + * @name $interpolateProvider#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * @param {string=} value new value to set the ending symbol to. + * @returns {string|self} Returns the symbol when used as getter and self if used as setter. + */ + this.endSymbol = function(value) { + if (value) { + endSymbol = value; + return this; + } else { + return endSymbol; + } + }; + + + this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { + var startSymbolLength = startSymbol.length, + endSymbolLength = endSymbol.length, + escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), + escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); + + function escape(ch) { + return '\\\\\\' + ch; + } + + function unescapeText(text) { + return text.replace(escapedStartRegexp, startSymbol). + replace(escapedEndRegexp, endSymbol); + } + + function stringify(value) { + if (value == null) { // null || undefined + return ''; + } + switch (typeof value) { + case 'string': + break; + case 'number': + value = '' + value; + break; + default: + value = toJson(value); + } + + return value; + } + + /** + * @ngdoc service + * @name $interpolate + * @kind function + * + * @requires $parse + * @requires $sce + * + * @description + * + * Compiles a string with markup into an interpolation function. This service is used by the + * HTML {@link ng.$compile $compile} service for data binding. See + * {@link ng.$interpolateProvider $interpolateProvider} for configuring the + * interpolation markup. + * + * + * ```js + * var $interpolate = ...; // injected + * var exp = $interpolate('Hello {{name | uppercase}}!'); + * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!'); + * ``` + * + * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is + * `true`, the interpolation function will return `undefined` unless all embedded expressions + * evaluate to a value other than `undefined`. + * + * ```js + * var $interpolate = ...; // injected + * var context = {greeting: 'Hello', name: undefined }; + * + * // default "forgiving" mode + * var exp = $interpolate('{{greeting}} {{name}}!'); + * expect(exp(context)).toEqual('Hello !'); + * + * // "allOrNothing" mode + * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); + * expect(exp(context)).toBeUndefined(); + * context.name = 'Angular'; + * expect(exp(context)).toEqual('Hello Angular!'); + * ``` + * + * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. + * + * ####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 + * or binding. + * + * This enables web-servers to prevent script injection attacks and defacing attacks, to some + * degree, while also enabling code examples to work without relying on the + * {@link ng.directive:ngNonBindable ngNonBindable} directive. + * + * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, + * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all + * interpolation start/end markers with their escaped counterparts.** + * + * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered + * output when the $interpolate service processes the text. So, for HTML elements interpolated + * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter + * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, + * 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"; \}\} + *

+ *

{{username}} attempts to inject code which will deface the + * application, but fails to accomplish their task, because the server has correctly + * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) + * characters.

+ *

Instead, the result of the attempted script injection is visible, and can be removed + * from the database by an administrator.

+ *
+ *
+ *
+ * + * @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 + * embedded expression will return null for the interpolation function. + * @param {string=} trustedContext when provided, the returned function passes the interpolated + * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, + * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that + * provides Strict Contextual Escaping for details. + * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined + * unless all embedded expressions evaluate to a value other than `undefined`. + * @returns {function(context)} an interpolation function which is used to compute the + * interpolated string. The function has these parameters: + * + * - `context`: evaluation context for all expressions embedded in the interpolated text + */ + function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { + allOrNothing = !!allOrNothing; + var startIndex, + endIndex, + index = 0, + expressions = [], + parseFns = [], + textLength = text.length, + exp, + concat = [], + expressionPositions = []; + + while (index < textLength) { + if (((startIndex = text.indexOf(startSymbol, index)) != -1) && + ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { + if (index !== startIndex) { + concat.push(unescapeText(text.substring(index, startIndex))); + } + exp = text.substring(startIndex + startSymbolLength, endIndex); + expressions.push(exp); + parseFns.push($parse(exp, parseStringifyInterceptor)); + index = endIndex + endSymbolLength; + expressionPositions.push(concat.length); + concat.push(''); + } else { + // we did not find an interpolation, so we have to add the remainder to the separators array + if (index !== textLength) { + concat.push(unescapeText(text.substring(index))); + } + break; + } + } + + // Concatenating expressions makes it hard to reason about whether some combination of + // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a + // single expression be used for iframe[src], object[src], etc., we ensure that the value + // that's used is assigned or constructed by some JS code somewhere that is more testable or + // make it obvious that you bound the value to some user controlled value. This helps reduce + // the load when auditing for XSS issues. + if (trustedContext && concat.length > 1) { + $interpolateMinErr.throwNoconcat(text); + } + + if (!mustHaveExpression || expressions.length) { + var compute = function(values) { + for (var i = 0, ii = expressions.length; i < ii; i++) { + if (allOrNothing && isUndefined(values[i])) return; + concat[expressionPositions[i]] = values[i]; + } + return concat.join(''); + }; + + var getValue = function(value) { + return trustedContext ? + $sce.getTrusted(trustedContext, value) : + $sce.valueOf(value); + }; + + return extend(function interpolationFn(context) { + var i = 0; + var ii = expressions.length; + var values = new Array(ii); + + try { + for (; i < ii; i++) { + values[i] = parseFns[i](context); + } + + return compute(values); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + + }, { + // all of these properties are undocumented for now + exp: text, //just for compatibility with regular watchers created via $watch + expressions: expressions, + $$watchDelegate: function(scope, listener) { + var lastValue; + return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { + var currValue = compute(values); + if (isFunction(listener)) { + listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); + } + lastValue = currValue; + }); + } + }); + } + + function parseStringifyInterceptor(value) { + try { + value = getValue(value); + return allOrNothing && !isDefined(value) ? value : stringify(value); + } catch (err) { + $exceptionHandler($interpolateMinErr.interr(text, err)); + } + } + } + + + /** + * @ngdoc method + * @name $interpolate#startSymbol + * @description + * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. + * + * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change + * the symbol. + * + * @returns {string} start symbol. + */ + $interpolate.startSymbol = function() { + return startSymbol; + }; + + + /** + * @ngdoc method + * @name $interpolate#endSymbol + * @description + * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. + * + * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change + * the symbol. + * + * @returns {string} end symbol. + */ + $interpolate.endSymbol = function() { + return endSymbol; + }; + + return $interpolate; + }]; +} + +function $IntervalProvider() { + this.$get = ['$rootScope', '$window', '$q', '$$q', + function($rootScope, $window, $q, $$q) { + var intervals = {}; + + + /** + * @ngdoc service + * @name $interval + * + * @description + * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` + * milliseconds. + * + * The return value of registering an interval function is a promise. This promise will be + * notified upon each tick of the interval, and will be resolved after `count` iterations, or + * run indefinitely if `count` is not defined. The value of the notification will be the + * number of iterations that have run. + * To cancel an interval, call `$interval.cancel(promise)`. + * + * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to + * move forward by `millis` milliseconds and trigger any functions scheduled to run in that + * time. + * + *
+ * **Note**: Intervals created by this service must be explicitly destroyed when you are finished + * with them. In particular they are not automatically destroyed when a controller's scope or a + * directive's element are destroyed. + * You should take this into consideration and make sure to always cancel the interval at the + * 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 {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. + * + * @example + * + * + * + * + *
+ *
+ *
+ * Current time is: + *
+ * Blood 1 : {{blood_1}} + * Blood 2 : {{blood_2}} + * + * + * + *
+ *
+ * + *
+ *
+ */ + function interval(fn, delay, count, invokeApply) { + var hasParams = arguments.length > 4, + args = hasParams ? sliceArgs(arguments, 4) : [], + setInterval = $window.setInterval, + clearInterval = $window.clearInterval, + iteration = 0, + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise; + + count = isDefined(count) ? count : 0; + + promise.then(null, null, (!hasParams) ? fn : function() { + fn.apply(null, args); + }); + + promise.$$intervalId = setInterval(function tick() { + deferred.notify(iteration++); + + if (count > 0 && iteration >= count) { + deferred.resolve(iteration); + clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + } + + if (!skipApply) $rootScope.$apply(); + + }, delay); + + intervals[promise.$$intervalId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $interval#cancel + * + * @description + * Cancels a task associated with the `promise`. + * + * @param {promise} promise returned by the `$interval` function. + * @returns {boolean} Returns `true` if the task was successfully canceled. + */ + interval.cancel = function(promise) { + if (promise && promise.$$intervalId in intervals) { + intervals[promise.$$intervalId].reject('canceled'); + $window.clearInterval(promise.$$intervalId); + delete intervals[promise.$$intervalId]; + return true; + } + return false; + }; + + return interval; + }]; +} + +/** + * @ngdoc service + * @name $locale + * + * @description + * $locale service provides localization rules for various Angular components. As of right now the + * only public api is: + * + * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) + */ +function $LocaleProvider() { + this.$get = function() { + return { + id: 'en-us', + + NUMBER_FORMATS: { + DECIMAL_SEP: '.', + GROUP_SEP: ',', + PATTERNS: [ + { // Decimal Pattern + minInt: 1, + minFrac: 0, + maxFrac: 3, + posPre: '', + posSuf: '', + negPre: '-', + negSuf: '', + gSize: 3, + lgSize: 3 + },{ //Currency Pattern + minInt: 1, + minFrac: 2, + maxFrac: 2, + posPre: '\u00A4', + posSuf: '', + negPre: '(\u00A4', + negSuf: ')', + gSize: 3, + lgSize: 3 + } + ], + CURRENCY_SYM: '$' + }, + + DATETIME_FORMATS: { + MONTH: + 'January,February,March,April,May,June,July,August,September,October,November,December' + .split(','), + SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), + DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), + SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), + AMPMS: ['AM','PM'], + medium: 'MMM d, y h:mm:ss a', + 'short': 'M/d/yy h:mm a', + fullDate: 'EEEE, MMMM d, y', + longDate: 'MMMM d, y', + mediumDate: 'MMM d, y', + shortDate: 'M/d/yy', + mediumTime: 'h:mm:ss a', + shortTime: 'h:mm a', + ERANAMES: [ + "Before Christ", + "Anno Domini" + ], + ERAS: [ + "BC", + "AD" + ] + }, + + pluralCat: function(num) { + if (num === 1) { + return 'one'; + } + return 'other'; + } + }; + }; +} + +var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, + DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; +var $locationMinErr = minErr('$location'); + + +/** + * Encode path using encodeUriSegment, ignoring forward slashes + * + * @param {string} path Path to encode + * @returns {string} + */ +function encodePath(path) { + var segments = path.split('/'), + i = segments.length; + + while (i--) { + segments[i] = encodeUriSegment(segments[i]); + } + + return segments.join('/'); +} + +function parseAbsoluteUrl(absoluteUrl, locationObj) { + var parsedUrl = urlResolve(absoluteUrl); + + locationObj.$$protocol = parsedUrl.protocol; + locationObj.$$host = parsedUrl.hostname; + locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; +} + + +function parseAppUrl(relativeUrl, locationObj) { + var prefixed = (relativeUrl.charAt(0) !== '/'); + if (prefixed) { + relativeUrl = '/' + relativeUrl; + } + var match = urlResolve(relativeUrl); + locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? + match.pathname.substring(1) : match.pathname); + locationObj.$$search = parseKeyValue(match.search); + locationObj.$$hash = decodeURIComponent(match.hash); + + // make sure path starts with '/'; + if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { + locationObj.$$path = '/' + locationObj.$$path; + } +} + + +/** + * + * @param {string} begin + * @param {string} whole + * @returns {string} returns text from whole after begin or undefined if it does not begin with + * expected string. + */ +function beginsWith(begin, whole) { + if (whole.indexOf(begin) === 0) { + return whole.substr(begin.length); + } +} + + +function stripHash(url) { + var index = url.indexOf('#'); + return index == -1 ? url : url.substr(0, index); +} + +function trimEmptyHash(url) { + return url.replace(/(#.+)|#$/, '$1'); +} + + +function stripFile(url) { + return url.substr(0, stripHash(url).lastIndexOf('/') + 1); +} + +/* return the server only (scheme://host:port) */ +function serverBase(url) { + return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); +} + + +/** + * LocationHtml5Url represents an url + * This object is exposed as $location service when HTML5 mode is enabled and supported + * + * @constructor + * @param {string} appBase application base URL + * @param {string} basePrefix url path prefix + */ +function LocationHtml5Url(appBase, basePrefix) { + this.$$html5 = true; + basePrefix = basePrefix || ''; + var appBaseNoFile = stripFile(appBase); + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given html5 (regular) url string into properties + * @param {string} url HTML5 url + * @private + */ + this.$$parse = function(url) { + var pathUrl = beginsWith(appBaseNoFile, url); + if (!isString(pathUrl)) { + throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, + appBaseNoFile); + } + + parseAppUrl(pathUrl, this); + + if (!this.$$path) { + this.$$path = '/'; + } + + this.$$compose(); + }; + + /** + * Compose url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + var appUrl, prevAppUrl; + var rewrittenUrl; + + if ((appUrl = beginsWith(appBase, url)) !== undefined) { + prevAppUrl = appUrl; + if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) { + rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); + } else { + rewrittenUrl = appBase + prevAppUrl; + } + } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) { + rewrittenUrl = appBaseNoFile + appUrl; + } else if (appBaseNoFile == url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when developer doesn't opt into html5 mode. + * It also serves as the base class for html5 mode fallback on legacy browsers. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangUrl(appBase, hashPrefix) { + var appBaseNoFile = stripFile(appBase); + + parseAbsoluteUrl(appBase, this); + + + /** + * Parse given hashbang url into properties + * @param {string} url Hashbang url + * @private + */ + this.$$parse = function(url) { + var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); + var withoutHashUrl; + + if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') { + + // The rest of the url starts with a hash so we have + // got either a hashbang path or a plain hash fragment + withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl); + if (isUndefined(withoutHashUrl)) { + // There was no hashbang prefix so we just have a hash fragment + withoutHashUrl = withoutBaseUrl; + } + + } else { + // There was no hashbang path nor hash fragment: + // If we are in HTML5 mode we use what is left as the path; + // Otherwise we ignore what is left + if (this.$$html5) { + withoutHashUrl = withoutBaseUrl; + } else { + withoutHashUrl = ''; + if (isUndefined(withoutBaseUrl)) { + appBase = url; + this.replace(); + } + } + } + + parseAppUrl(withoutHashUrl, this); + + this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); + + this.$$compose(); + + /* + * In Windows, on an anchor node on documents loaded from + * the filesystem, the browser will return a pathname + * prefixed with the drive name ('/C:/path') when a + * pathname without a drive is set: + * * a.setAttribute('href', '/foo') + * * a.pathname === '/C:/foo' //true + * + * Inside of Angular, we're always using pathnames that + * do not include drive names for routing. + */ + function removeWindowsDriveName(path, url, base) { + /* + Matches paths for file protocol on windows, + such as /C:/foo/bar, and captures only /foo/bar. + */ + var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; + + var firstPathSegmentMatch; + + //Get the relative path from the input URL. + if (url.indexOf(base) === 0) { + url = url.replace(base, ''); + } + + // The input URL intentionally contains a first path segment that ends with a colon. + if (windowsFilePathExp.exec(url)) { + return path; + } + + firstPathSegmentMatch = windowsFilePathExp.exec(path); + return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; + } + }; + + /** + * Compose hashbang url and update `absUrl` property + * @private + */ + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); + }; + + this.$$parseLinkUrl = function(url, relHref) { + if (stripHash(appBase) == stripHash(url)) { + this.$$parse(url); + return true; + } + return false; + }; +} + + +/** + * LocationHashbangUrl represents url + * This object is exposed as $location service when html5 history api is enabled but the browser + * does not support it. + * + * @constructor + * @param {string} appBase application base URL + * @param {string} hashPrefix hashbang prefix + */ +function LocationHashbangInHtml5Url(appBase, hashPrefix) { + this.$$html5 = true; + LocationHashbangUrl.apply(this, arguments); + + var appBaseNoFile = stripFile(appBase); + + this.$$parseLinkUrl = function(url, relHref) { + if (relHref && relHref[0] === '#') { + // special case for links to hash fragments: + // keep the old url and only replace the hash fragment + this.hash(relHref.slice(1)); + return true; + } + + var rewrittenUrl; + var appUrl; + + if (appBase == stripHash(url)) { + rewrittenUrl = url; + } else if ((appUrl = beginsWith(appBaseNoFile, url))) { + rewrittenUrl = appBase + hashPrefix + appUrl; + } else if (appBaseNoFile === url + '/') { + rewrittenUrl = appBaseNoFile; + } + if (rewrittenUrl) { + this.$$parse(rewrittenUrl); + } + return !!rewrittenUrl; + }; + + this.$$compose = function() { + var search = toKeyValue(this.$$search), + hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; + + this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; + // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#' + this.$$absUrl = appBase + hashPrefix + this.$$url; + }; + +} + + +var locationPrototype = { + + /** + * Are we in html5 mode? + * @private + */ + $$html5: false, + + /** + * Has any change been replacing? + * @private + */ + $$replace: false, + + /** + * @ngdoc method + * @name $location#absUrl + * + * @description + * This method is getter only. + * + * Return full url representation with all segments encoded according to rules specified in + * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var absUrl = $location.absUrl(); + * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" + * ``` + * + * @return {string} full url + */ + absUrl: locationGetter('$$absUrl'), + + /** + * @ngdoc method + * @name $location#url + * + * @description + * This method is getter / setter. + * + * Return url (e.g. `/path?a=b#hash`) when called without any parameter. + * + * Change path, search and hash, when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var url = $location.url(); + * // => "/some/path?foo=bar&baz=xoxo" + * ``` + * + * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) + * @return {string} url + */ + url: function(url) { + if (isUndefined(url)) { + return this.$$url; + } + + var match = PATH_MATCH.exec(url); + if (match[1] || url === '') this.path(decodeURIComponent(match[1])); + if (match[2] || match[1] || url === '') this.search(match[3] || ''); + this.hash(match[5] || ''); + + return this; + }, + + /** + * @ngdoc method + * @name $location#protocol + * + * @description + * This method is getter only. + * + * Return protocol of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var protocol = $location.protocol(); + * // => "http" + * ``` + * + * @return {string} protocol of current url + */ + protocol: locationGetter('$$protocol'), + + /** + * @ngdoc method + * @name $location#host + * + * @description + * This method is getter only. + * + * Return host of current url. + * + * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var host = $location.host(); + * // => "example.com" + * + * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo + * host = $location.host(); + * // => "example.com" + * host = location.host; + * // => "example.com:8080" + * ``` + * + * @return {string} host of current url. + */ + host: locationGetter('$$host'), + + /** + * @ngdoc method + * @name $location#port + * + * @description + * This method is getter only. + * + * Return port of current url. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var port = $location.port(); + * // => 80 + * ``` + * + * @return {Number} port + */ + port: locationGetter('$$port'), + + /** + * @ngdoc method + * @name $location#path + * + * @description + * This method is getter / setter. + * + * Return path of current url when called without any parameter. + * + * Change path when called with parameter and return `$location`. + * + * Note: Path should always begin with forward slash (/), this method will add the forward slash + * if it is missing. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var path = $location.path(); + * // => "/some/path" + * ``` + * + * @param {(string|number)=} path New path + * @return {string} path + */ + path: locationGetterSetter('$$path', function(path) { + path = path !== null ? path.toString() : ''; + return path.charAt(0) == '/' ? path : '/' + path; + }), + + /** + * @ngdoc method + * @name $location#search + * + * @description + * This method is getter / setter. + * + * Return search part (as object) of current url when called without any parameter. + * + * Change search part when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo + * var searchObject = $location.search(); + * // => {foo: 'bar', baz: 'xoxo'} + * + * // set foo to 'yipee' + * $location.search('foo', 'yipee'); + * // $location.search() => {foo: 'yipee', baz: 'xoxo'} + * ``` + * + * @param {string|Object.|Object.>} search New search params - string or + * hash object. + * + * When called with a single argument the method acts as a setter, setting the `search` component + * of `$location` to the specified value. + * + * If the argument is a hash object containing an array of values, these values will be encoded + * as duplicate search parameters in the url. + * + * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` + * will override only a single search property. + * + * If `paramValue` is an array, it will override the property of the `search` component of + * `$location` specified via the first argument. + * + * If `paramValue` is `null`, the property specified via the first argument will be deleted. + * + * If `paramValue` is `true`, the property specified via the first argument will be added with no + * value nor trailing equal sign. + * + * @return {Object} If called with no arguments returns the parsed `search` object. If called with + * one or more arguments returns `$location` object itself. + */ + search: function(search, paramValue) { + switch (arguments.length) { + case 0: + return this.$$search; + case 1: + if (isString(search) || isNumber(search)) { + search = search.toString(); + this.$$search = parseKeyValue(search); + } else if (isObject(search)) { + search = copy(search, {}); + // remove object undefined or null properties + forEach(search, function(value, key) { + if (value == null) delete search[key]; + }); + + this.$$search = search; + } else { + throw $locationMinErr('isrcharg', + 'The first argument of the `$location#search()` call must be a string or an object.'); + } + break; + default: + if (isUndefined(paramValue) || paramValue === null) { + delete this.$$search[search]; + } else { + this.$$search[search] = paramValue; + } + } + + this.$$compose(); + return this; + }, + + /** + * @ngdoc method + * @name $location#hash + * + * @description + * This method is getter / setter. + * + * Return hash fragment when called without any parameter. + * + * Change hash fragment when called with parameter and return `$location`. + * + * + * ```js + * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue + * var hash = $location.hash(); + * // => "hashValue" + * ``` + * + * @param {(string|number)=} hash New hash fragment + * @return {string} hash + */ + hash: locationGetterSetter('$$hash', function(hash) { + return hash !== null ? hash.toString() : ''; + }), + + /** + * @ngdoc method + * @name $location#replace + * + * @description + * If called, all changes to $location during current `$digest` will be replacing current history + * record, instead of adding new one. + */ + replace: function() { + this.$$replace = true; + return this; + } +}; + +forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { + Location.prototype = Object.create(locationPrototype); + + /** + * @ngdoc method + * @name $location#state + * + * @description + * This method is getter / setter. + * + * Return the history state object when called without any parameter. + * + * Change the history state object when called with one parameter and return `$location`. + * The state object is later passed to `pushState` or `replaceState`. + * + * NOTE: This method is supported only in HTML5 mode and only in browsers supporting + * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support + * older browsers (like IE9 or Android < 4.0), don't use this method. + * + * @param {object=} state State object for pushState or replaceState + * @return {object} state + */ + Location.prototype.state = function(state) { + if (!arguments.length) { + return this.$$state; + } + + if (Location !== LocationHtml5Url || !this.$$html5) { + throw $locationMinErr('nostate', 'History API state support is available only ' + + 'in HTML5 mode and only in browsers supporting HTML5 History API'); + } + // The user might modify `stateObject` after invoking `$location.state(stateObject)` + // but we're changing the $$state reference to $browser.state() during the $digest + // so the modification window is narrow. + this.$$state = isUndefined(state) ? null : state; + + return this; + }; +}); + + +function locationGetter(property) { + return function() { + return this[property]; + }; +} + + +function locationGetterSetter(property, preprocess) { + return function(value) { + if (isUndefined(value)) { + return this[property]; + } + + this[property] = preprocess(value); + this.$$compose(); + + return this; + }; +} + + +/** + * @ngdoc service + * @name $location + * + * @requires $rootElement + * + * @description + * The $location service parses the URL in the browser address bar (based on the + * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL + * available to your application. Changes to the URL in the address bar are reflected into + * $location service and changes to $location are reflected into the browser address bar. + * + * **The $location service:** + * + * - Exposes the current URL in the browser address bar, so you can + * - Watch and observe the URL. + * - Change the URL. + * - Synchronizes the URL with the browser when the user + * - Changes the address bar. + * - Clicks the back or forward button (or clicks a History link). + * - Clicks on a link. + * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). + * + * For more information see {@link guide/$location Developer Guide: Using $location} + */ + +/** + * @ngdoc provider + * @name $locationProvider + * @description + * Use the `$locationProvider` to configure how the application deep linking paths are stored. + */ +function $LocationProvider() { + var hashPrefix = '', + html5Mode = { + enabled: false, + requireBase: true, + rewriteLinks: true + }; + + /** + * @ngdoc method + * @name $locationProvider#hashPrefix + * @description + * @param {string=} prefix Prefix for hash part (containing path and search) + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.hashPrefix = function(prefix) { + if (isDefined(prefix)) { + hashPrefix = prefix; + return this; + } else { + return hashPrefix; + } + }; + + /** + * @ngdoc method + * @name $locationProvider#html5Mode + * @description + * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. + * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported + * properties: + * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to + * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not + * support `pushState`. + * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies + * whether or not a tag is required to be present. If `enabled` and `requireBase` are + * true, and a base tag is not present, an error will be thrown when `$location` is injected. + * See the {@link guide/$location $location guide for more information} + * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, + * enables/disables url rewriting for relative links. + * + * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter + */ + this.html5Mode = function(mode) { + if (isBoolean(mode)) { + html5Mode.enabled = mode; + return this; + } else if (isObject(mode)) { + + if (isBoolean(mode.enabled)) { + html5Mode.enabled = mode.enabled; + } + + if (isBoolean(mode.requireBase)) { + html5Mode.requireBase = mode.requireBase; + } + + if (isBoolean(mode.rewriteLinks)) { + html5Mode.rewriteLinks = mode.rewriteLinks; + } + + return this; + } else { + return html5Mode; + } + }; + + /** + * @ngdoc event + * @name $location#$locationChangeStart + * @eventType broadcast on root scope + * @description + * Broadcasted before a URL will change. + * + * This change can be prevented by calling + * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more + * details about event object. Upon successful change + * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + /** + * @ngdoc event + * @name $location#$locationChangeSuccess + * @eventType broadcast on root scope + * @description + * Broadcasted after a URL was changed. + * + * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when + * the browser supports the HTML5 History API. + * + * @param {Object} angularEvent Synthetic event object. + * @param {string} newUrl New URL + * @param {string=} oldUrl URL that was before it was changed. + * @param {string=} newState New history state object + * @param {string=} oldState History state object that was before it was changed. + */ + + this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', + function($rootScope, $browser, $sniffer, $rootElement, $window) { + var $location, + LocationMode, + baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' + initialUrl = $browser.url(), + appBase; + + if (html5Mode.enabled) { + if (!baseHref && html5Mode.requireBase) { + throw $locationMinErr('nobase', + "$location in HTML5 mode requires a tag to be present!"); + } + appBase = serverBase(initialUrl) + (baseHref || '/'); + LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; + } else { + appBase = stripHash(initialUrl); + LocationMode = LocationHashbangUrl; + } + $location = new LocationMode(appBase, '#' + hashPrefix); + $location.$$parseLinkUrl(initialUrl, initialUrl); + + $location.$$state = $browser.state(); + + var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; + + function setBrowserUrlWithFallback(url, replace, state) { + var oldUrl = $location.url(); + var oldState = $location.$$state; + try { + $browser.url(url, replace, state); + + // Make sure $location.state() returns referentially identical (not just deeply equal) + // state object; this makes possible quick checking if the state changed in the digest + // loop. Checking deep equality would be too expensive. + $location.$$state = $browser.state(); + } catch (e) { + // Restore old values if pushState fails + $location.url(oldUrl); + $location.$$state = oldState; + + throw e; + } + } + + $rootElement.on('click', function(event) { + // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) + // currently we open nice url link and redirect then + + if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; + + var elm = jqLite(event.target); + + // traverse the DOM up to find first A tag + while (nodeName_(elm[0]) !== 'a') { + // ignore rewriting if no A tag (reached root element, or no parent - removed from document) + if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; + } + + var absHref = elm.prop('href'); + // get the actual href attribute - see + // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx + var relHref = elm.attr('href') || elm.attr('xlink:href'); + + if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { + // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during + // an animation. + absHref = urlResolve(absHref.animVal).href; + } + + // Ignore when url is started with javascript: or mailto: + if (IGNORE_URI_REGEXP.test(absHref)) return; + + if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { + if ($location.$$parseLinkUrl(absHref, relHref)) { + // We do a preventDefault for all urls that are part of the angular application, + // in html5mode and also without, so that we are able to abort navigation without + // getting double entries in the location history. + event.preventDefault(); + // update location manually + if ($location.absUrl() != $browser.url()) { + $rootScope.$apply(); + // hack to work around FF6 bug 684208 when scenario runner clicks on links + $window.angular['ff-684208-preventDefault'] = true; + } + } + } + }); + + + // rewrite hashbang url <> html5 url + if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { + $browser.url($location.absUrl(), true); + } + + var initializing = true; + + // update $location when $browser url changes + $browser.onUrlChange(function(newUrl, newState) { + $rootScope.$evalAsync(function() { + var oldUrl = $location.absUrl(); + var oldState = $location.$$state; + var defaultPrevented; + + $location.$$parse(newUrl); + $location.$$state = newState; + + defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + newState, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + setBrowserUrlWithFallback(oldUrl, false, oldState); + } else { + initializing = false; + afterLocationChange(oldUrl, oldState); + } + }); + if (!$rootScope.$$phase) $rootScope.$digest(); + }); + + // update browser + $rootScope.$watch(function $locationWatch() { + var oldUrl = trimEmptyHash($browser.url()); + var newUrl = trimEmptyHash($location.absUrl()); + var oldState = $browser.state(); + var currentReplace = $location.$$replace; + var urlOrStateChanged = oldUrl !== newUrl || + ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); + + if (initializing || urlOrStateChanged) { + initializing = false; + + $rootScope.$evalAsync(function() { + var newUrl = $location.absUrl(); + var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, + $location.$$state, oldState).defaultPrevented; + + // if the location was changed by a `$locationChangeStart` handler then stop + // processing this location change + if ($location.absUrl() !== newUrl) return; + + if (defaultPrevented) { + $location.$$parse(oldUrl); + $location.$$state = oldState; + } else { + if (urlOrStateChanged) { + setBrowserUrlWithFallback(newUrl, currentReplace, + oldState === $location.$$state ? null : $location.$$state); + } + afterLocationChange(oldUrl, oldState); + } + }); + } + + $location.$$replace = false; + + // we don't need to return anything because $evalAsync will make the digest loop dirty when + // there is a change + }); + + return $location; + + function afterLocationChange(oldUrl, oldState) { + $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, + $location.$$state, oldState); + } +}]; +} + +/** + * @ngdoc service + * @name $log + * @requires $window + * + * @description + * Simple service for logging. Default implementation safely writes the message + * into the browser's console (if present). + * + * The main purpose of this service is to simplify debugging and troubleshooting. + * + * The default is to log `debug` messages. You can use + * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. + * + * @example + + + angular.module('logExample', []) + .controller('LogController', ['$scope', '$log', function($scope, $log) { + $scope.$log = $log; + $scope.message = 'Hello World!'; + }]); + + +
+

Reload this page with open console, enter text and hit the log button...

+ + + + + + +
+
+
+ */ + +/** + * @ngdoc provider + * @name $logProvider + * @description + * Use the `$logProvider` to configure how the application logs messages + */ +function $LogProvider() { + var debug = true, + self = this; + + /** + * @ngdoc method + * @name $logProvider#debugEnabled + * @description + * @param {boolean=} flag enable or disable debug level messages + * @returns {*} current value if used as getter or itself (chaining) if used as setter + */ + this.debugEnabled = function(flag) { + if (isDefined(flag)) { + debug = flag; + return this; + } else { + return debug; + } + }; + + this.$get = ['$window', function($window) { + return { + /** + * @ngdoc method + * @name $log#log + * + * @description + * Write a log message + */ + log: consoleLog('log'), + + /** + * @ngdoc method + * @name $log#info + * + * @description + * Write an information message + */ + info: consoleLog('info'), + + /** + * @ngdoc method + * @name $log#warn + * + * @description + * Write a warning message + */ + warn: consoleLog('warn'), + + /** + * @ngdoc method + * @name $log#error + * + * @description + * Write an error message + */ + error: consoleLog('error'), + + /** + * @ngdoc method + * @name $log#debug + * + * @description + * Write a debug message + */ + debug: (function() { + var fn = consoleLog('debug'); + + return function() { + if (debug) { + fn.apply(self, arguments); + } + }; + }()) + }; + + function formatError(arg) { + if (arg instanceof Error) { + if (arg.stack) { + arg = (arg.message && arg.stack.indexOf(arg.message) === -1) + ? 'Error: ' + arg.message + '\n' + arg.stack + : arg.stack; + } else if (arg.sourceURL) { + arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; + } + } + return arg; + } + + function consoleLog(type) { + var console = $window.console || {}, + logFn = console[type] || console.log || noop, + hasApply = false; + + // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. + // The reason behind this is that console.log has type "object" in IE8... + try { + hasApply = !!logFn.apply; + } catch (e) {} + + if (hasApply) { + return function() { + var args = []; + forEach(arguments, function(arg) { + args.push(formatError(arg)); + }); + return logFn.apply(console, args); + }; + } + + // we are IE which either doesn't have window.console => this is noop and we do nothing, + // or we are IE where console.log doesn't have apply so we log at least first 2 args + return function(arg1, arg2) { + logFn(arg1, arg2 == null ? '' : arg2); + }; + } + }]; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $parseMinErr = minErr('$parse'); + +// Sandboxing Angular Expressions +// ------------------------------ +// Angular expressions are generally considered safe because these expressions only have direct +// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by +// obtaining a reference to native JS functions such as the Function constructor. +// +// As an example, consider the following Angular expression: +// +// {}.toString.constructor('alert("evil JS code")') +// +// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits +// against the expression language, but not to prevent exploits that were enabled by exposing +// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good +// practice and therefore we are not even trying to protect against interaction with an object +// explicitly exposed in this way. +// +// In general, it is not possible to access a Window object from an angular expression unless a +// window or some DOM object that has a reference to window is published onto a Scope. +// Similarly we prevent invocations of function known to be dangerous, as well as assignments to +// native objects. +// +// See https://docs.angularjs.org/guide/security + + +function ensureSafeMemberName(name, fullExpression) { + if (name === "__defineGetter__" || name === "__defineSetter__" + || name === "__lookupGetter__" || name === "__lookupSetter__" + || name === "__proto__") { + throw $parseMinErr('isecfld', + 'Attempting to access a disallowed field in Angular expressions! ' + + 'Expression: {0}', fullExpression); + } + return name; +} + +function ensureSafeObject(obj, fullExpression) { + // nifty check if obj is Function that is fast and works across iframes and other contexts + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isWindow(obj) + obj.window === obj) { + throw $parseMinErr('isecwindow', + 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// isElement(obj) + obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { + throw $parseMinErr('isecdom', + 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (// block Object so that we can't get hold of dangerous Object.* methods + obj === Object) { + throw $parseMinErr('isecobj', + 'Referencing Object in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } + return obj; +} + +var CALL = Function.prototype.call; +var APPLY = Function.prototype.apply; +var BIND = Function.prototype.bind; + +function ensureSafeFunction(obj, fullExpression) { + if (obj) { + if (obj.constructor === obj) { + throw $parseMinErr('isecfn', + 'Referencing Function in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } else if (obj === CALL || obj === APPLY || obj === BIND) { + throw $parseMinErr('isecff', + 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', + fullExpression); + } + } +} + +var OPERATORS = createMap(); +forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; }); +var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; + + +///////////////////////////////////////// + + +/** + * @constructor + */ +var Lexer = function(options) { + this.options = options; +}; + +Lexer.prototype = { + constructor: Lexer, + + lex: function(text) { + this.text = text; + this.index = 0; + this.tokens = []; + + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (ch === '"' || ch === "'") { + this.readString(ch); + } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { + this.readNumber(); + } else if (this.isIdent(ch)) { + this.readIdent(); + } else if (this.is(ch, '(){}[].,;:?')) { + this.tokens.push({index: this.index, text: ch}); + this.index++; + } else if (this.isWhitespace(ch)) { + this.index++; + } else { + var ch2 = ch + this.peek(); + var ch3 = ch2 + this.peek(2); + var op1 = OPERATORS[ch]; + var op2 = OPERATORS[ch2]; + var op3 = OPERATORS[ch3]; + if (op1 || op2 || op3) { + var token = op3 ? ch3 : (op2 ? ch2 : ch); + this.tokens.push({index: this.index, text: token, operator: true}); + this.index += token.length; + } else { + this.throwError('Unexpected next character ', this.index, this.index + 1); + } + } + } + return this.tokens; + }, + + is: function(ch, chars) { + return chars.indexOf(ch) !== -1; + }, + + peek: function(i) { + var num = i || 1; + return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; + }, + + isNumber: function(ch) { + return ('0' <= ch && ch <= '9') && typeof ch === "string"; + }, + + isWhitespace: function(ch) { + // IE treats non-breaking space as \u00A0 + return (ch === ' ' || ch === '\r' || ch === '\t' || + ch === '\n' || ch === '\v' || ch === '\u00A0'); + }, + + isIdent: function(ch) { + return ('a' <= ch && ch <= 'z' || + 'A' <= ch && ch <= 'Z' || + '_' === ch || ch === '$'); + }, + + isExpOperator: function(ch) { + return (ch === '-' || ch === '+' || this.isNumber(ch)); + }, + + throwError: function(error, start, end) { + end = end || this.index; + var colStr = (isDefined(start) + ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' + : ' ' + end); + throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', + error, colStr, this.text); + }, + + readNumber: function() { + var number = ''; + var start = this.index; + while (this.index < this.text.length) { + var ch = lowercase(this.text.charAt(this.index)); + if (ch == '.' || this.isNumber(ch)) { + number += ch; + } else { + var peekCh = this.peek(); + if (ch == 'e' && this.isExpOperator(peekCh)) { + number += ch; + } else if (this.isExpOperator(ch) && + peekCh && this.isNumber(peekCh) && + number.charAt(number.length - 1) == 'e') { + number += ch; + } else if (this.isExpOperator(ch) && + (!peekCh || !this.isNumber(peekCh)) && + number.charAt(number.length - 1) == 'e') { + this.throwError('Invalid exponent'); + } else { + break; + } + } + this.index++; + } + this.tokens.push({ + index: start, + text: number, + constant: true, + value: Number(number) + }); + }, + + readIdent: function() { + var start = this.index; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + if (!(this.isIdent(ch) || this.isNumber(ch))) { + break; + } + this.index++; + } + this.tokens.push({ + index: start, + text: this.text.slice(start, this.index), + identifier: true + }); + }, + + readString: function(quote) { + var start = this.index; + this.index++; + var string = ''; + var rawString = quote; + var escape = false; + while (this.index < this.text.length) { + var ch = this.text.charAt(this.index); + rawString += ch; + if (escape) { + if (ch === 'u') { + var hex = this.text.substring(this.index + 1, this.index + 5); + if (!hex.match(/[\da-f]{4}/i)) { + this.throwError('Invalid unicode escape [\\u' + hex + ']'); + } + this.index += 4; + string += String.fromCharCode(parseInt(hex, 16)); + } else { + var rep = ESCAPE[ch]; + string = string + (rep || ch); + } + escape = false; + } else if (ch === '\\') { + escape = true; + } else if (ch === quote) { + this.index++; + this.tokens.push({ + index: start, + text: rawString, + constant: true, + value: string + }); + return; + } else { + string += ch; + } + this.index++; + } + this.throwError('Unterminated quote', start); + } +}; + +var AST = function(lexer, options) { + this.lexer = lexer; + this.options = options; +}; + +AST.Program = 'Program'; +AST.ExpressionStatement = 'ExpressionStatement'; +AST.AssignmentExpression = 'AssignmentExpression'; +AST.ConditionalExpression = 'ConditionalExpression'; +AST.LogicalExpression = 'LogicalExpression'; +AST.BinaryExpression = 'BinaryExpression'; +AST.UnaryExpression = 'UnaryExpression'; +AST.CallExpression = 'CallExpression'; +AST.MemberExpression = 'MemberExpression'; +AST.Identifier = 'Identifier'; +AST.Literal = 'Literal'; +AST.ArrayExpression = 'ArrayExpression'; +AST.Property = 'Property'; +AST.ObjectExpression = 'ObjectExpression'; +AST.ThisExpression = 'ThisExpression'; + +// Internal use only +AST.NGValueParameter = 'NGValueParameter'; + +AST.prototype = { + ast: function(text) { + this.text = text; + this.tokens = this.lexer.lex(text); + + var value = this.program(); + + if (this.tokens.length !== 0) { + this.throwError('is an unexpected token', this.tokens[0]); + } + + return value; + }, + + program: function() { + var body = []; + while (true) { + if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) + body.push(this.expressionStatement()); + if (!this.expect(';')) { + return { type: AST.Program, body: body}; + } + } + }, + + expressionStatement: function() { + return { type: AST.ExpressionStatement, expression: this.filterChain() }; + }, + + filterChain: function() { + var left = this.expression(); + var token; + while ((token = this.expect('|'))) { + left = this.filter(left); + } + return left; + }, + + expression: function() { + return this.assignment(); + }, + + assignment: function() { + var result = this.ternary(); + if (this.expect('=')) { + result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='}; + } + return result; + }, + + ternary: function() { + var test = this.logicalOR(); + var alternate; + var consequent; + if (this.expect('?')) { + alternate = this.expression(); + if (this.consume(':')) { + consequent = this.expression(); + return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent}; + } + } + return test; + }, + + logicalOR: function() { + var left = this.logicalAND(); + while (this.expect('||')) { + left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() }; + } + return left; + }, + + logicalAND: function() { + var left = this.equality(); + while (this.expect('&&')) { + left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()}; + } + return left; + }, + + equality: function() { + var left = this.relational(); + var token; + while ((token = this.expect('==','!=','===','!=='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() }; + } + return left; + }, + + relational: function() { + var left = this.additive(); + var token; + while ((token = this.expect('<', '>', '<=', '>='))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() }; + } + return left; + }, + + additive: function() { + var left = this.multiplicative(); + var token; + while ((token = this.expect('+','-'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() }; + } + return left; + }, + + multiplicative: function() { + var left = this.unary(); + var token; + while ((token = this.expect('*','/','%'))) { + left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() }; + } + return left; + }, + + unary: function() { + var token; + if ((token = this.expect('+', '-', '!'))) { + return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() }; + } else { + return this.primary(); + } + }, + + primary: function() { + var primary; + if (this.expect('(')) { + primary = this.filterChain(); + this.consume(')'); + } else if (this.expect('[')) { + primary = this.arrayDeclaration(); + } else if (this.expect('{')) { + primary = this.object(); + } else if (this.constants.hasOwnProperty(this.peek().text)) { + primary = copy(this.constants[this.consume().text]); + } else if (this.peek().identifier) { + primary = this.identifier(); + } else if (this.peek().constant) { + primary = this.constant(); + } else { + this.throwError('not a primary expression', this.peek()); + } + + var next; + while ((next = this.expect('(', '[', '.'))) { + if (next.text === '(') { + primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() }; + this.consume(')'); + } else if (next.text === '[') { + primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true }; + this.consume(']'); + } else if (next.text === '.') { + primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false }; + } else { + this.throwError('IMPOSSIBLE'); + } + } + return primary; + }, + + filter: function(baseExpression) { + var args = [baseExpression]; + var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true}; + + while (this.expect(':')) { + args.push(this.expression()); + } + + return result; + }, + + parseArguments: function() { + var args = []; + if (this.peekToken().text !== ')') { + do { + args.push(this.expression()); + } while (this.expect(',')); + } + return args; + }, + + identifier: function() { + var token = this.consume(); + if (!token.identifier) { + this.throwError('is not a valid identifier', token); + } + return { type: AST.Identifier, name: token.text }; + }, + + constant: function() { + // TODO check that it is a constant + return { type: AST.Literal, value: this.consume().value }; + }, + + arrayDeclaration: function() { + var elements = []; + if (this.peekToken().text !== ']') { + do { + if (this.peek(']')) { + // Support trailing commas per ES5.1. + break; + } + elements.push(this.expression()); + } while (this.expect(',')); + } + this.consume(']'); + + return { type: AST.ArrayExpression, elements: elements }; + }, + + object: function() { + var properties = [], property; + if (this.peekToken().text !== '}') { + do { + if (this.peek('}')) { + // Support trailing commas per ES5.1. + break; + } + property = {type: AST.Property, kind: 'init'}; + if (this.peek().constant) { + property.key = this.constant(); + } else if (this.peek().identifier) { + property.key = this.identifier(); + } else { + this.throwError("invalid key", this.peek()); + } + this.consume(':'); + property.value = this.expression(); + properties.push(property); + } while (this.expect(',')); + } + this.consume('}'); + + return {type: AST.ObjectExpression, properties: properties }; + }, + + throwError: function(msg, token) { + throw $parseMinErr('syntax', + 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', + token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); + }, + + consume: function(e1) { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + + var token = this.expect(e1); + if (!token) { + this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); + } + return token; + }, + + peekToken: function() { + if (this.tokens.length === 0) { + throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); + } + return this.tokens[0]; + }, + + peek: function(e1, e2, e3, e4) { + return this.peekAhead(0, e1, e2, e3, e4); + }, + + peekAhead: function(i, e1, e2, e3, e4) { + if (this.tokens.length > i) { + var token = this.tokens[i]; + var t = token.text; + if (t === e1 || t === e2 || t === e3 || t === e4 || + (!e1 && !e2 && !e3 && !e4)) { + return token; + } + } + return false; + }, + + expect: function(e1, e2, e3, e4) { + var token = this.peek(e1, e2, e3, e4); + if (token) { + this.tokens.shift(); + return token; + } + return false; + }, + + + /* `undefined` is not a constant, it is an identifier, + * but using it as an identifier is not supported + */ + constants: { + 'true': { type: AST.Literal, value: true }, + 'false': { type: AST.Literal, value: false }, + 'null': { type: AST.Literal, value: null }, + 'undefined': {type: AST.Literal, value: undefined }, + 'this': {type: AST.ThisExpression } + } +}; + +function ifDefined(v, d) { + return typeof v !== 'undefined' ? v : d; +} + +function plusFn(l, r) { + if (typeof l === 'undefined') return r; + if (typeof r === 'undefined') return l; + return l + r; +} + +function isStateless($filter, filterName) { + var fn = $filter(filterName); + return !fn.$stateful; +} + +function findConstantAndWatchExpressions(ast, $filter) { + var allConstants; + var argsToWatch; + switch (ast.type) { + case AST.Program: + allConstants = true; + forEach(ast.body, function(expr) { + findConstantAndWatchExpressions(expr.expression, $filter); + allConstants = allConstants && expr.expression.constant; + }); + ast.constant = allConstants; + break; + case AST.Literal: + ast.constant = true; + ast.toWatch = []; + break; + case AST.UnaryExpression: + findConstantAndWatchExpressions(ast.argument, $filter); + ast.constant = ast.argument.constant; + ast.toWatch = ast.argument.toWatch; + break; + case AST.BinaryExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch); + break; + case AST.LogicalExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.ConditionalExpression: + findConstantAndWatchExpressions(ast.test, $filter); + findConstantAndWatchExpressions(ast.alternate, $filter); + findConstantAndWatchExpressions(ast.consequent, $filter); + ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant; + ast.toWatch = ast.constant ? [] : [ast]; + break; + case AST.Identifier: + ast.constant = false; + ast.toWatch = [ast]; + break; + case AST.MemberExpression: + findConstantAndWatchExpressions(ast.object, $filter); + if (ast.computed) { + findConstantAndWatchExpressions(ast.property, $filter); + } + ast.constant = ast.object.constant && (!ast.computed || ast.property.constant); + ast.toWatch = [ast]; + break; + case AST.CallExpression: + allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false; + argsToWatch = []; + forEach(ast.arguments, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast]; + break; + case AST.AssignmentExpression: + findConstantAndWatchExpressions(ast.left, $filter); + findConstantAndWatchExpressions(ast.right, $filter); + ast.constant = ast.left.constant && ast.right.constant; + ast.toWatch = [ast]; + break; + case AST.ArrayExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.elements, function(expr) { + findConstantAndWatchExpressions(expr, $filter); + allConstants = allConstants && expr.constant; + if (!expr.constant) { + argsToWatch.push.apply(argsToWatch, expr.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ObjectExpression: + allConstants = true; + argsToWatch = []; + forEach(ast.properties, function(property) { + findConstantAndWatchExpressions(property.value, $filter); + allConstants = allConstants && property.value.constant; + if (!property.value.constant) { + argsToWatch.push.apply(argsToWatch, property.value.toWatch); + } + }); + ast.constant = allConstants; + ast.toWatch = argsToWatch; + break; + case AST.ThisExpression: + ast.constant = false; + ast.toWatch = []; + break; + } +} + +function getInputs(body) { + if (body.length != 1) return; + var lastExpression = body[0].expression; + var candidate = lastExpression.toWatch; + if (candidate.length !== 1) return candidate; + return candidate[0] !== lastExpression ? candidate : undefined; +} + +function isAssignable(ast) { + return ast.type === AST.Identifier || ast.type === AST.MemberExpression; +} + +function assignableAST(ast) { + if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) { + return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='}; + } +} + +function isLiteral(ast) { + return ast.body.length === 0 || + ast.body.length === 1 && ( + ast.body[0].expression.type === AST.Literal || + ast.body[0].expression.type === AST.ArrayExpression || + ast.body[0].expression.type === AST.ObjectExpression); +} + +function isConstant(ast) { + return ast.constant; +} + +function ASTCompiler(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTCompiler.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.state = { + nextId: 0, + filters: {}, + expensiveChecks: expensiveChecks, + fn: {vars: [], body: [], own: {}}, + assign: {vars: [], body: [], own: {}}, + inputs: [] + }; + findConstantAndWatchExpressions(ast, self.$filter); + var extra = ''; + var assignable; + this.stage = 'assign'; + if ((assignable = assignableAST(ast))) { + this.state.computing = 'assign'; + var result = this.nextId(); + this.recurse(assignable, result); + extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l'); + } + var toWatch = getInputs(ast.body); + self.stage = 'inputs'; + forEach(toWatch, function(watch, key) { + var fnKey = 'fn' + key; + self.state[fnKey] = {vars: [], body: [], own: {}}; + self.state.computing = fnKey; + var intoId = self.nextId(); + self.recurse(watch, intoId); + self.return_(intoId); + self.state.inputs.push(fnKey); + watch.watchId = key; + }); + this.state.computing = 'fn'; + this.stage = 'main'; + this.recurse(ast); + var fnString = + // The build and minification steps remove the string "use strict" from the code, but this is done using a regex. + // This is a workaround for this until we do a better job at only removing the prefix only when we should. + '"' + this.USE + ' ' + this.STRICT + '";\n' + + this.filterPrefix() + + 'var fn=' + this.generateFunction('fn', 's,l,a,i') + + extra + + this.watchFns() + + 'return fn;'; + + /* jshint -W054 */ + var fn = (new Function('$filter', + 'ensureSafeMemberName', + 'ensureSafeObject', + 'ensureSafeFunction', + 'ifDefined', + 'plus', + 'text', + fnString))( + this.$filter, + ensureSafeMemberName, + ensureSafeObject, + ensureSafeFunction, + ifDefined, + plusFn, + expression); + /* jshint +W054 */ + this.state = this.stage = undefined; + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + USE: 'use', + + STRICT: 'strict', + + watchFns: function() { + var result = []; + var fns = this.state.inputs; + var self = this; + forEach(fns, function(name) { + result.push('var ' + name + '=' + self.generateFunction(name, 's')); + }); + if (fns.length) { + result.push('fn.inputs=[' + fns.join(',') + '];'); + } + return result.join(''); + }, + + generateFunction: function(name, params) { + return 'function(' + params + '){' + + this.varsPrefix(name) + + this.body(name) + + '};'; + }, + + filterPrefix: function() { + var parts = []; + var self = this; + forEach(this.state.filters, function(id, filter) { + parts.push(id + '=$filter(' + self.escape(filter) + ')'); + }); + if (parts.length) return 'var ' + parts.join(',') + ';'; + return ''; + }, + + varsPrefix: function(section) { + return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : ''; + }, + + body: function(section) { + return this.state[section].body.join(''); + }, + + recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var left, right, self = this, args, expression; + recursionFn = recursionFn || noop; + if (!skipWatchIdCheck && isDefined(ast.watchId)) { + intoId = intoId || this.nextId(); + this.if_('i', + this.lazyAssign(intoId, this.computedMember('i', ast.watchId)), + this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true) + ); + return; + } + switch (ast.type) { + case AST.Program: + forEach(ast.body, function(expression, pos) { + self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; }); + if (pos !== ast.body.length - 1) { + self.current().body.push(right, ';'); + } else { + self.return_(right); + } + }); + break; + case AST.Literal: + expression = this.escape(ast.value); + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.UnaryExpression: + this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; }); + expression = ast.operator + '(' + this.ifDefined(right, 0) + ')'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.BinaryExpression: + this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; }); + this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; }); + if (ast.operator === '+') { + expression = this.plus(left, right); + } else if (ast.operator === '-') { + expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0); + } else { + expression = '(' + left + ')' + ast.operator + '(' + right + ')'; + } + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.LogicalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.left, intoId); + self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId)); + recursionFn(intoId); + break; + case AST.ConditionalExpression: + intoId = intoId || this.nextId(); + self.recurse(ast.test, intoId); + self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId)); + recursionFn(intoId); + break; + case AST.Identifier: + intoId = intoId || this.nextId(); + if (nameId) { + nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s'); + nameId.computed = false; + nameId.name = ast.name; + } + ensureSafeMemberName(ast.name); + self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)), + function() { + self.if_(self.stage === 'inputs' || 's', function() { + if (create && create !== 1) { + self.if_( + self.not(self.nonComputedMember('s', ast.name)), + self.lazyAssign(self.nonComputedMember('s', ast.name), '{}')); + } + self.assign(intoId, self.nonComputedMember('s', ast.name)); + }); + }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name)) + ); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) { + self.addEnsureSafeObject(intoId); + } + recursionFn(intoId); + break; + case AST.MemberExpression: + left = nameId && (nameId.context = this.nextId()) || this.nextId(); + intoId = intoId || this.nextId(); + self.recurse(ast.object, left, undefined, function() { + self.if_(self.notNull(left), function() { + if (ast.computed) { + right = self.nextId(); + self.recurse(ast.property, right); + self.addEnsureSafeMemberName(right); + if (create && create !== 1) { + self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}')); + } + expression = self.ensureSafeObject(self.computedMember(left, right)); + self.assign(intoId, expression); + if (nameId) { + nameId.computed = true; + nameId.name = right; + } + } else { + ensureSafeMemberName(ast.property.name); + if (create && create !== 1) { + self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}')); + } + expression = self.nonComputedMember(left, ast.property.name); + if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) { + expression = self.ensureSafeObject(expression); + } + self.assign(intoId, expression); + if (nameId) { + nameId.computed = false; + nameId.name = ast.property.name; + } + } + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }, !!create); + break; + case AST.CallExpression: + intoId = intoId || this.nextId(); + if (ast.filter) { + right = self.filter(ast.callee.name); + args = []; + forEach(ast.arguments, function(expr) { + var argument = self.nextId(); + self.recurse(expr, argument); + args.push(argument); + }); + expression = right + '(' + args.join(',') + ')'; + self.assign(intoId, expression); + recursionFn(intoId); + } else { + right = self.nextId(); + left = {}; + args = []; + self.recurse(ast.callee, right, left, function() { + self.if_(self.notNull(right), function() { + self.addEnsureSafeFunction(right); + forEach(ast.arguments, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(self.ensureSafeObject(argument)); + }); + }); + if (left.name) { + if (!self.state.expensiveChecks) { + self.addEnsureSafeObject(left.context); + } + expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')'; + } else { + expression = right + '(' + args.join(',') + ')'; + } + expression = self.ensureSafeObject(expression); + self.assign(intoId, expression); + }, function() { + self.assign(intoId, 'undefined'); + }); + recursionFn(intoId); + }); + } + break; + case AST.AssignmentExpression: + right = this.nextId(); + left = {}; + if (!isAssignable(ast.left)) { + throw $parseMinErr('lval', 'Trying to assing a value to a non l-value'); + } + this.recurse(ast.left, undefined, left, function() { + self.if_(self.notNull(left.context), function() { + self.recurse(ast.right, right); + self.addEnsureSafeObject(self.member(left.context, left.name, left.computed)); + expression = self.member(left.context, left.name, left.computed) + ast.operator + right; + self.assign(intoId, expression); + recursionFn(intoId || expression); + }); + }, 1); + break; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + self.recurse(expr, self.nextId(), undefined, function(argument) { + args.push(argument); + }); + }); + expression = '[' + args.join(',') + ']'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + self.recurse(property.value, self.nextId(), undefined, function(expr) { + args.push(self.escape( + property.key.type === AST.Identifier ? property.key.name : + ('' + property.key.value)) + + ':' + expr); + }); + }); + expression = '{' + args.join(',') + '}'; + this.assign(intoId, expression); + recursionFn(expression); + break; + case AST.ThisExpression: + this.assign(intoId, 's'); + recursionFn('s'); + break; + case AST.NGValueParameter: + this.assign(intoId, 'v'); + recursionFn('v'); + break; + } + }, + + getHasOwnProperty: function(element, property) { + var key = element + '.' + property; + var own = this.current().own; + if (!own.hasOwnProperty(key)) { + own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')'); + } + return own[key]; + }, + + assign: function(id, value) { + if (!id) return; + this.current().body.push(id, '=', value, ';'); + return id; + }, + + filter: function(filterName) { + if (!this.state.filters.hasOwnProperty(filterName)) { + this.state.filters[filterName] = this.nextId(true); + } + return this.state.filters[filterName]; + }, + + ifDefined: function(id, defaultValue) { + return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')'; + }, + + plus: function(left, right) { + return 'plus(' + left + ',' + right + ')'; + }, + + return_: function(id) { + this.current().body.push('return ', id, ';'); + }, + + if_: function(test, alternate, consequent) { + if (test === true) { + alternate(); + } else { + var body = this.current().body; + body.push('if(', test, '){'); + alternate(); + body.push('}'); + if (consequent) { + body.push('else{'); + consequent(); + body.push('}'); + } + } + }, + + not: function(expression) { + return '!(' + expression + ')'; + }, + + notNull: function(expression) { + return expression + '!=null'; + }, + + nonComputedMember: function(left, right) { + return left + '.' + right; + }, + + computedMember: function(left, right) { + return left + '[' + right + ']'; + }, + + member: function(left, right, computed) { + if (computed) return this.computedMember(left, right); + return this.nonComputedMember(left, right); + }, + + addEnsureSafeObject: function(item) { + this.current().body.push(this.ensureSafeObject(item), ';'); + }, + + addEnsureSafeMemberName: function(item) { + this.current().body.push(this.ensureSafeMemberName(item), ';'); + }, + + addEnsureSafeFunction: function(item) { + this.current().body.push(this.ensureSafeFunction(item), ';'); + }, + + ensureSafeObject: function(item) { + return 'ensureSafeObject(' + item + ',text)'; + }, + + ensureSafeMemberName: function(item) { + return 'ensureSafeMemberName(' + item + ',text)'; + }, + + ensureSafeFunction: function(item) { + return 'ensureSafeFunction(' + item + ',text)'; + }, + + lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) { + var self = this; + return function() { + self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck); + }; + }, + + lazyAssign: function(id, value) { + var self = this; + return function() { + self.assign(id, value); + }; + }, + + stringEscapeRegex: /[^ a-zA-Z0-9]/g, + + stringEscapeFn: function(c) { + return '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4); + }, + + escape: function(value) { + if (isString(value)) return "'" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + "'"; + if (isNumber(value)) return value.toString(); + if (value === true) return 'true'; + if (value === false) return 'false'; + if (value === null) return 'null'; + if (typeof value === 'undefined') return 'undefined'; + + throw $parseMinErr('esc', 'IMPOSSIBLE'); + }, + + nextId: function(skip, init) { + var id = 'v' + (this.state.nextId++); + if (!skip) { + this.current().vars.push(id + (init ? '=' + init : '')); + } + return id; + }, + + current: function() { + return this.state[this.state.computing]; + } +}; + + +function ASTInterpreter(astBuilder, $filter) { + this.astBuilder = astBuilder; + this.$filter = $filter; +} + +ASTInterpreter.prototype = { + compile: function(expression, expensiveChecks) { + var self = this; + var ast = this.astBuilder.ast(expression); + this.expression = expression; + this.expensiveChecks = expensiveChecks; + findConstantAndWatchExpressions(ast, self.$filter); + var assignable; + var assign; + if ((assignable = assignableAST(ast))) { + assign = this.recurse(assignable); + } + var toWatch = getInputs(ast.body); + var inputs; + if (toWatch) { + inputs = []; + forEach(toWatch, function(watch, key) { + var input = self.recurse(watch); + watch.input = input; + inputs.push(input); + watch.watchId = key; + }); + } + var expressions = []; + forEach(ast.body, function(expression) { + expressions.push(self.recurse(expression.expression)); + }); + var fn = ast.body.length === 0 ? function() {} : + ast.body.length === 1 ? expressions[0] : + function(scope, locals) { + var lastValue; + forEach(expressions, function(exp) { + lastValue = exp(scope, locals); + }); + return lastValue; + }; + if (assign) { + fn.assign = function(scope, value, locals) { + return assign(scope, locals, value); + }; + } + if (inputs) { + fn.inputs = inputs; + } + fn.literal = isLiteral(ast); + fn.constant = isConstant(ast); + return fn; + }, + + recurse: function(ast, context, create) { + var left, right, self = this, args, expression; + if (ast.input) { + return this.inputs(ast.input, ast.watchId); + } + switch (ast.type) { + case AST.Literal: + return this.value(ast.value, context); + case AST.UnaryExpression: + right = this.recurse(ast.argument); + return this['unary' + ast.operator](right, context); + case AST.BinaryExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.LogicalExpression: + left = this.recurse(ast.left); + right = this.recurse(ast.right); + return this['binary' + ast.operator](left, right, context); + case AST.ConditionalExpression: + return this['ternary?:']( + this.recurse(ast.test), + this.recurse(ast.alternate), + this.recurse(ast.consequent), + context + ); + case AST.Identifier: + ensureSafeMemberName(ast.name, self.expression); + return self.identifier(ast.name, + self.expensiveChecks || isPossiblyDangerousMemberName(ast.name), + context, create, self.expression); + case AST.MemberExpression: + left = this.recurse(ast.object, false, !!create); + if (!ast.computed) { + ensureSafeMemberName(ast.property.name, self.expression); + right = ast.property.name; + } + if (ast.computed) right = this.recurse(ast.property); + return ast.computed ? + this.computedMember(left, right, context, create, self.expression) : + this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression); + case AST.CallExpression: + args = []; + forEach(ast.arguments, function(expr) { + args.push(self.recurse(expr)); + }); + if (ast.filter) right = this.$filter(ast.callee.name); + if (!ast.filter) right = this.recurse(ast.callee, true); + return ast.filter ? + function(scope, locals, assign, inputs) { + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(args[i](scope, locals, assign, inputs)); + } + var value = right.apply(undefined, values, inputs); + return context ? {context: undefined, name: undefined, value: value} : value; + } : + function(scope, locals, assign, inputs) { + var rhs = right(scope, locals, assign, inputs); + var value; + if (rhs.value != null) { + ensureSafeObject(rhs.context, self.expression); + ensureSafeFunction(rhs.value, self.expression); + var values = []; + for (var i = 0; i < args.length; ++i) { + values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression)); + } + value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression); + } + return context ? {value: value} : value; + }; + case AST.AssignmentExpression: + left = this.recurse(ast.left, true, 1); + right = this.recurse(ast.right); + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + ensureSafeObject(lhs.value, self.expression); + lhs.context[lhs.name] = rhs; + return context ? {value: rhs} : rhs; + }; + case AST.ArrayExpression: + args = []; + forEach(ast.elements, function(expr) { + args.push(self.recurse(expr)); + }); + return function(scope, locals, assign, inputs) { + var value = []; + for (var i = 0; i < args.length; ++i) { + value.push(args[i](scope, locals, assign, inputs)); + } + return context ? {value: value} : value; + }; + case AST.ObjectExpression: + args = []; + forEach(ast.properties, function(property) { + args.push({key: property.key.type === AST.Identifier ? + property.key.name : + ('' + property.key.value), + value: self.recurse(property.value) + }); + }); + return function(scope, locals, assign, inputs) { + var value = {}; + for (var i = 0; i < args.length; ++i) { + value[args[i].key] = args[i].value(scope, locals, assign, inputs); + } + return context ? {value: value} : value; + }; + case AST.ThisExpression: + return function(scope) { + return context ? {value: scope} : scope; + }; + case AST.NGValueParameter: + return function(scope, locals, assign, inputs) { + return context ? {value: assign} : assign; + }; + } + }, + + 'unary+': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = +arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary-': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = argument(scope, locals, assign, inputs); + if (isDefined(arg)) { + arg = -arg; + } else { + arg = 0; + } + return context ? {value: arg} : arg; + }; + }, + 'unary!': function(argument, context) { + return function(scope, locals, assign, inputs) { + var arg = !argument(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary+': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = plusFn(lhs, rhs); + return context ? {value: arg} : arg; + }; + }, + 'binary-': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs = right(scope, locals, assign, inputs); + var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0); + return context ? {value: arg} : arg; + }; + }, + 'binary*': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary/': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary%': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary===': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary==': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary!=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary<=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary>=': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary&&': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'binary||': function(left, right, context) { + return function(scope, locals, assign, inputs) { + var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + 'ternary?:': function(test, alternate, consequent, context) { + return function(scope, locals, assign, inputs) { + var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs); + return context ? {value: arg} : arg; + }; + }, + value: function(value, context) { + return function() { return context ? {context: undefined, name: undefined, value: value} : value; }; + }, + identifier: function(name, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var base = locals && (name in locals) ? locals : scope; + if (create && create !== 1 && base && !(base[name])) { + base[name] = {}; + } + var value = base ? base[name] : undefined; + if (expensiveChecks) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: base, name: name, value: value}; + } else { + return value; + } + }; + }, + computedMember: function(left, right, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + var rhs; + var value; + if (lhs != null) { + rhs = right(scope, locals, assign, inputs); + ensureSafeMemberName(rhs, expression); + if (create && create !== 1 && lhs && !(lhs[rhs])) { + lhs[rhs] = {}; + } + value = lhs[rhs]; + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: rhs, value: value}; + } else { + return value; + } + }; + }, + nonComputedMember: function(left, right, expensiveChecks, context, create, expression) { + return function(scope, locals, assign, inputs) { + var lhs = left(scope, locals, assign, inputs); + if (create && create !== 1 && lhs && !(lhs[right])) { + lhs[right] = {}; + } + var value = lhs != null ? lhs[right] : undefined; + if (expensiveChecks || isPossiblyDangerousMemberName(right)) { + ensureSafeObject(value, expression); + } + if (context) { + return {context: lhs, name: right, value: value}; + } else { + return value; + } + }; + }, + inputs: function(input, watchId) { + return function(scope, value, locals, inputs) { + if (inputs) return inputs[watchId]; + return input(scope, value, locals); + }; + } +}; + +/** + * @constructor + */ +var Parser = function(lexer, $filter, options) { + this.lexer = lexer; + this.$filter = $filter; + this.options = options; + this.ast = new AST(this.lexer); + this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) : + new ASTCompiler(this.ast, $filter); +}; + +Parser.prototype = { + constructor: Parser, + + parse: function(text) { + return this.astCompiler.compile(text, this.options.expensiveChecks); + } +}; + +////////////////////////////////////////////////// +// Parser helper functions +////////////////////////////////////////////////// + +function setter(obj, path, setValue, fullExp) { + ensureSafeObject(obj, fullExp); + + var element = path.split('.'), key; + for (var i = 0; element.length > 1; i++) { + key = ensureSafeMemberName(element.shift(), fullExp); + var propertyObj = ensureSafeObject(obj[key], fullExp); + if (!propertyObj) { + propertyObj = {}; + obj[key] = propertyObj; + } + obj = propertyObj; + } + key = ensureSafeMemberName(element.shift(), fullExp); + ensureSafeObject(obj[key], fullExp); + obj[key] = setValue; + return setValue; +} + +var getterFnCacheDefault = createMap(); +var getterFnCacheExpensive = createMap(); + +function isPossiblyDangerousMemberName(name) { + return name == 'constructor'; +} + +var objectValueOf = Object.prototype.valueOf; + +function getValueOf(value) { + return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); +} + +/////////////////////////////////// + +/** + * @ngdoc service + * @name $parse + * @kind function + * + * @description + * + * Converts Angular {@link guide/expression expression} into a function. + * + * ```js + * var getter = $parse('user.name'); + * var setter = getter.assign; + * var context = {user:{name:'angular'}}; + * var locals = {user:{name:'local'}}; + * + * expect(getter(context)).toEqual('angular'); + * setter(context, 'newValue'); + * expect(context.user.name).toEqual('newValue'); + * expect(getter(context, locals)).toEqual('local'); + * ``` + * + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + * + * The returned function also has the following properties: + * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript + * literal. + * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript + * constant literals. + * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be + * set to a function to change its value on the given context. + * + */ + + +/** + * @ngdoc provider + * @name $parseProvider + * + * @description + * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} + * service. + */ +function $ParseProvider() { + var cacheDefault = createMap(); + var cacheExpensive = createMap(); + + this.$get = ['$filter', '$sniffer', function($filter, $sniffer) { + var $parseOptions = { + csp: $sniffer.csp, + expensiveChecks: false + }, + $parseOptionsExpensive = { + csp: $sniffer.csp, + expensiveChecks: true + }; + + return function $parse(exp, interceptorFn, expensiveChecks) { + var parsedExpression, oneTime, cacheKey; + + switch (typeof exp) { + case 'string': + exp = exp.trim(); + cacheKey = exp; + + var cache = (expensiveChecks ? cacheExpensive : cacheDefault); + parsedExpression = cache[cacheKey]; + + if (!parsedExpression) { + if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { + oneTime = true; + exp = exp.substring(2); + } + var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; + var lexer = new Lexer(parseOptions); + var parser = new Parser(lexer, $filter, parseOptions); + parsedExpression = parser.parse(exp); + if (parsedExpression.constant) { + parsedExpression.$$watchDelegate = constantWatchDelegate; + } else if (oneTime) { + parsedExpression.$$watchDelegate = parsedExpression.literal ? + oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; + } else if (parsedExpression.inputs) { + parsedExpression.$$watchDelegate = inputsWatchDelegate; + } + cache[cacheKey] = parsedExpression; + } + return addInterceptor(parsedExpression, interceptorFn); + + case 'function': + return addInterceptor(exp, interceptorFn); + + default: + return noop; + } + }; + + function expressionInputDirtyCheck(newValue, oldValueOfValue) { + + if (newValue == null || oldValueOfValue == null) { // null/undefined + return newValue === oldValueOfValue; + } + + if (typeof newValue === 'object') { + + // attempt to convert the value to a primitive type + // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can + // be cheaply dirty-checked + newValue = getValueOf(newValue); + + if (typeof newValue === 'object') { + // objects/arrays are not supported - deep-watching them would be too expensive + return false; + } + + // fall-through to the primitive equality check + } + + //Primitive or NaN + return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); + } + + function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) { + var inputExpressions = parsedExpression.inputs; + var lastResult; + + if (inputExpressions.length === 1) { + var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails + inputExpressions = inputExpressions[0]; + return scope.$watch(function expressionInputWatch(scope) { + var newInputValue = inputExpressions(scope); + if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) { + lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]); + oldInputValueOf = newInputValue && getValueOf(newInputValue); + } + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + var oldInputValueOfValues = []; + var oldInputValues = []; + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails + oldInputValues[i] = null; + } + + return scope.$watch(function expressionInputsWatch(scope) { + var changed = false; + + for (var i = 0, ii = inputExpressions.length; i < ii; i++) { + var newInputValue = inputExpressions[i](scope); + if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { + oldInputValues[i] = newInputValue; + oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); + } + } + + if (changed) { + lastResult = parsedExpression(scope, undefined, undefined, oldInputValues); + } + + return lastResult; + }, listener, objectEquality, prettyPrintExpression); + } + + function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.apply(this, arguments); + } + if (isDefined(value)) { + scope.$$postDigest(function() { + if (isDefined(lastValue)) { + unwatch(); + } + }); + } + }, objectEquality); + } + + function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch, lastValue; + return unwatch = scope.$watch(function oneTimeWatch(scope) { + return parsedExpression(scope); + }, function oneTimeListener(value, old, scope) { + lastValue = value; + if (isFunction(listener)) { + listener.call(this, value, old, scope); + } + if (isAllDefined(value)) { + scope.$$postDigest(function() { + if (isAllDefined(lastValue)) unwatch(); + }); + } + }, objectEquality); + + function isAllDefined(value) { + var allDefined = true; + forEach(value, function(val) { + if (!isDefined(val)) allDefined = false; + }); + return allDefined; + } + } + + function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { + var unwatch; + return unwatch = scope.$watch(function constantWatch(scope) { + return parsedExpression(scope); + }, function constantListener(value, old, scope) { + if (isFunction(listener)) { + listener.apply(this, arguments); + } + unwatch(); + }, objectEquality); + } + + function addInterceptor(parsedExpression, interceptorFn) { + if (!interceptorFn) return parsedExpression; + var watchDelegate = parsedExpression.$$watchDelegate; + + var regularWatch = + watchDelegate !== oneTimeLiteralWatchDelegate && + watchDelegate !== oneTimeWatchDelegate; + + var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + return interceptorFn(value, scope, locals); + } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) { + var value = parsedExpression(scope, locals, assign, inputs); + var result = interceptorFn(value, scope, locals); + // we only return the interceptor's result if the + // initial value is defined (for bind-once) + return isDefined(value) ? result : value; + }; + + // Propagate $$watchDelegates other then inputsWatchDelegate + if (parsedExpression.$$watchDelegate && + parsedExpression.$$watchDelegate !== inputsWatchDelegate) { + fn.$$watchDelegate = parsedExpression.$$watchDelegate; + } else if (!interceptorFn.$stateful) { + // If there is an interceptor, but no watchDelegate then treat the interceptor like + // we treat filters - it is assumed to be a pure function unless flagged with $stateful + fn.$$watchDelegate = inputsWatchDelegate; + fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression]; + } + + return fn; + } + }]; +} + +/** + * @ngdoc service + * @name $q + * @requires $rootScope + * + * @description + * A service that helps you run functions asynchronously, and use their return values (or exceptions) + * when they are done processing. + * + * This is an implementation of promises/deferred objects inspired by + * [Kris Kowal's Q](https://github.com/kriskowal/q). + * + * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred + * implementations, and the other which resembles ES6 promises to some degree. + * + * # $q constructor + * + * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` + * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony, + * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). + * + * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are + * available yet. + * + * It can be used like so: + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * // perform some asynchronous operation, resolve or reject the promise when appropriate. + * return $q(function(resolve, reject) { + * setTimeout(function() { + * if (okToGreet(name)) { + * resolve('Hello, ' + name + '!'); + * } else { + * reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * }); + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }); + * ``` + * + * Note: progress/notify callbacks are not currently supported via the ES6-style interface. + * + * However, the more traditional CommonJS-style usage is still available, and documented below. + * + * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an + * interface for interacting with an object that represents the result of an action that is + * performed asynchronously, and may or may not be finished at any given point in time. + * + * From the perspective of dealing with error handling, deferred and promise APIs are to + * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. + * + * ```js + * // for the purpose of this example let's assume that variables `$q` and `okToGreet` + * // are available in the current lexical scope (they could have been injected or passed in). + * + * function asyncGreet(name) { + * var deferred = $q.defer(); + * + * setTimeout(function() { + * deferred.notify('About to greet ' + name + '.'); + * + * if (okToGreet(name)) { + * deferred.resolve('Hello, ' + name + '!'); + * } else { + * deferred.reject('Greeting ' + name + ' is not allowed.'); + * } + * }, 1000); + * + * return deferred.promise; + * } + * + * var promise = asyncGreet('Robin Hood'); + * promise.then(function(greeting) { + * alert('Success: ' + greeting); + * }, function(reason) { + * alert('Failed: ' + reason); + * }, function(update) { + * alert('Got notification: ' + update); + * }); + * ``` + * + * At first it might not be obvious why this extra complexity is worth the trouble. The payoff + * comes in the way of guarantees that promise and deferred APIs make, see + * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. + * + * Additionally the promise api allows for composition that is very hard to do with the + * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. + * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the + * section on serial or parallel joining of promises. + * + * # The Deferred API + * + * A new instance of deferred is constructed by calling `$q.defer()`. + * + * The purpose of the deferred object is to expose the associated Promise instance as well as APIs + * that can be used for signaling the successful or unsuccessful completion, as well as the status + * of the task. + * + * **Methods** + * + * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection + * constructed via `$q.reject`, the promise will be rejected instead. + * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to + * resolving it with a rejection constructed via `$q.reject`. + * - `notify(value)` - provides updates on the status of the promise's execution. This may be called + * multiple times before the promise is either resolved or rejected. + * + * **Properties** + * + * - promise – `{Promise}` – promise object associated with this deferred. + * + * + * # The Promise API + * + * A new promise instance is created when a deferred instance is created and can be retrieved by + * calling `deferred.promise`. + * + * The purpose of the promise object is to allow for interested parties to get access to the result + * of the deferred task when it completes. + * + * **Methods** + * + * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or + * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously + * as soon as the result is available. The callbacks are called with a single argument: the result + * or rejection reason. Additionally, the notify callback may be called zero or more times to + * provide a progress indication, before the promise is resolved or rejected. + * + * This method *returns a new promise* which is resolved or rejected via the return value of the + * `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved + * with the value which is resolved in that promise using + * [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)). + * It also notifies via the return value of the `notifyCallback` method. The promise cannot be + * resolved or rejected from the notifyCallback method. + * + * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` + * + * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. + * + * # Chaining promises + * + * Because calling the `then` method of a promise returns a new derived promise, it is easily + * possible to create a chain of promises: + * + * ```js + * promiseB = promiseA.then(function(result) { + * return result + 1; + * }); + * + * // promiseB will be resolved immediately after promiseA is resolved and its value + * // will be the result of promiseA incremented by 1 + * ``` + * + * It is possible to create chains of any length and since a promise can be resolved with another + * promise (which will defer its resolution further), it is possible to pause/defer resolution of + * the promises at any point in the chain. This makes it possible to implement powerful APIs like + * $http's response interceptors. + * + * + * # Differences between Kris Kowal's Q and $q + * + * There are two main differences: + * + * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation + * mechanism in angular, which means faster propagation of resolution or rejection into your + * models and avoiding unnecessary browser repaints, which would result in flickering UI. + * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains + * all the important functionality needed for common async tasks. + * + * # Testing + * + * ```js + * it('should simulate promise', inject(function($q, $rootScope) { + * var deferred = $q.defer(); + * var promise = deferred.promise; + * var resolvedValue; + * + * promise.then(function(value) { resolvedValue = value; }); + * expect(resolvedValue).toBeUndefined(); + * + * // Simulate resolving of promise + * deferred.resolve(123); + * // Note that the 'then' function does not get called synchronously. + * // This is because we want the promise API to always be async, whether or not + * // it got called synchronously or asynchronously. + * expect(resolvedValue).toBeUndefined(); + * + * // Propagate promise resolution to 'then' functions using $apply(). + * $rootScope.$apply(); + * expect(resolvedValue).toEqual(123); + * })); + * ``` + * + * @param {function(function, function)} resolver Function which is responsible for resolving or + * rejecting the newly created promise. The first parameter is a function which resolves the + * promise, the second parameter is a function which rejects the promise. + * + * @returns {Promise} The newly created promise. + */ +function $QProvider() { + + this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { + return qFactory(function(callback) { + $rootScope.$evalAsync(callback); + }, $exceptionHandler); + }]; +} + +function $$QProvider() { + this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { + return qFactory(function(callback) { + $browser.defer(callback); + }, $exceptionHandler); + }]; +} + +/** + * Constructs a promise manager. + * + * @param {function(function)} nextTick Function for executing functions in the next turn. + * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for + * debugging purposes. + * @returns {object} Promise manager. + */ +function qFactory(nextTick, exceptionHandler) { + var $qMinErr = minErr('$q', TypeError); + function callOnce(self, resolveFn, rejectFn) { + var called = false; + function wrap(fn) { + return function(value) { + if (called) return; + called = true; + fn.call(self, value); + }; + } + + return [wrap(resolveFn), wrap(rejectFn)]; + } + + /** + * @ngdoc method + * @name ng.$q#defer + * @kind function + * + * @description + * Creates a `Deferred` object which represents a task which will finish in the future. + * + * @returns {Deferred} Returns a new instance of deferred. + */ + var defer = function() { + return new Deferred(); + }; + + function Promise() { + this.$$state = { status: 0 }; + } + + Promise.prototype = { + then: function(onFulfilled, onRejected, progressBack) { + var result = new Deferred(); + + this.$$state.pending = this.$$state.pending || []; + this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); + if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); + + return result.promise; + }, + + "catch": function(callback) { + return this.then(null, callback); + }, + + "finally": function(callback, progressBack) { + return this.then(function(value) { + return handleCallback(value, true, callback); + }, function(error) { + return handleCallback(error, false, callback); + }, progressBack); + } + }; + + //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native + function simpleBind(context, fn) { + return function(value) { + fn.call(context, value); + }; + } + + function processQueue(state) { + var fn, deferred, pending; + + pending = state.pending; + state.processScheduled = false; + state.pending = undefined; + for (var i = 0, ii = pending.length; i < ii; ++i) { + deferred = pending[i][0]; + fn = pending[i][state.status]; + try { + if (isFunction(fn)) { + deferred.resolve(fn(state.value)); + } else if (state.status === 1) { + deferred.resolve(state.value); + } else { + deferred.reject(state.value); + } + } catch (e) { + deferred.reject(e); + exceptionHandler(e); + } + } + } + + function scheduleProcessQueue(state) { + if (state.processScheduled || !state.pending) return; + state.processScheduled = true; + nextTick(function() { processQueue(state); }); + } + + function Deferred() { + this.promise = new Promise(); + //Necessary to support unbound execution :/ + this.resolve = simpleBind(this, this.resolve); + this.reject = simpleBind(this, this.reject); + this.notify = simpleBind(this, this.notify); + } + + Deferred.prototype = { + resolve: function(val) { + if (this.promise.$$state.status) return; + if (val === this.promise) { + this.$$reject($qMinErr( + 'qcycle', + "Expected promise to be resolved with value other than itself '{0}'", + val)); + } else { + this.$$resolve(val); + } + + }, + + $$resolve: function(val) { + var then, fns; + + fns = callOnce(this, this.$$resolve, this.$$reject); + try { + if ((isObject(val) || isFunction(val))) then = val && val.then; + if (isFunction(then)) { + this.promise.$$state.status = -1; + then.call(val, fns[0], fns[1], this.notify); + } else { + this.promise.$$state.value = val; + this.promise.$$state.status = 1; + scheduleProcessQueue(this.promise.$$state); + } + } catch (e) { + fns[1](e); + exceptionHandler(e); + } + }, + + reject: function(reason) { + if (this.promise.$$state.status) return; + this.$$reject(reason); + }, + + $$reject: function(reason) { + this.promise.$$state.value = reason; + this.promise.$$state.status = 2; + scheduleProcessQueue(this.promise.$$state); + }, + + notify: function(progress) { + var callbacks = this.promise.$$state.pending; + + if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { + nextTick(function() { + var callback, result; + for (var i = 0, ii = callbacks.length; i < ii; i++) { + result = callbacks[i][0]; + callback = callbacks[i][3]; + try { + result.notify(isFunction(callback) ? callback(progress) : progress); + } catch (e) { + exceptionHandler(e); + } + } + }); + } + } + }; + + /** + * @ngdoc method + * @name $q#reject + * @kind function + * + * @description + * Creates a promise that is resolved as rejected with the specified `reason`. This api should be + * used to forward rejection in a chain of promises. If you are dealing with the last promise in + * a promise chain, you don't need to worry about it. + * + * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of + * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via + * a promise error callback and you want to forward the error to the promise derived from the + * current promise, you have to "rethrow" the error by returning a rejection constructed via + * `reject`. + * + * ```js + * promiseB = promiseA.then(function(result) { + * // success: do something and resolve promiseB + * // with the old or a new result + * return result; + * }, function(reason) { + * // error: handle the error if possible and + * // resolve promiseB with newPromiseOrValue, + * // otherwise forward the rejection to promiseB + * if (canHandle(reason)) { + * // handle the error and recover + * return newPromiseOrValue; + * } + * return $q.reject(reason); + * }); + * ``` + * + * @param {*} reason Constant, message, exception or an object representing the rejection reason. + * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. + */ + var reject = function(reason) { + var result = new Deferred(); + result.reject(reason); + return result.promise; + }; + + var makePromise = function makePromise(value, resolved) { + var result = new Deferred(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + }; + + var handleCallback = function handleCallback(value, isResolved, callback) { + var callbackOutput = null; + try { + if (isFunction(callback)) callbackOutput = callback(); + } catch (e) { + return makePromise(e, false); + } + if (isPromiseLike(callbackOutput)) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + }; + + /** + * @ngdoc method + * @name $q#when + * @kind function + * + * @description + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. + * This is useful when you are dealing with an object that might or might not be a promise, or if + * the promise comes from a source that can't be trusted. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + + + var when = function(value, callback, errback, progressBack) { + var result = new Deferred(); + result.resolve(value); + return result.promise.then(callback, errback, progressBack); + }; + + /** + * @ngdoc method + * @name $q#resolve + * @kind function + * + * @description + * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6. + * + * @param {*} value Value or a promise + * @returns {Promise} Returns a promise of the passed value or promise + */ + var resolve = when; + + /** + * @ngdoc method + * @name $q#all + * @kind function + * + * @description + * Combines multiple promises into a single promise that is resolved when all of the input + * promises are resolved. + * + * @param {Array.|Object.} promises An array or hash of promises. + * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, + * each value corresponding to the promise at the same index/key in the `promises` array/hash. + * If any of the promises is resolved with a rejection, this resulting promise will be rejected + * with the same rejection value. + */ + + function all(promises) { + var deferred = new Deferred(), + counter = 0, + results = isArray(promises) ? [] : {}; + + forEach(promises, function(promise, key) { + counter++; + when(promise).then(function(value) { + if (results.hasOwnProperty(key)) return; + results[key] = value; + if (!(--counter)) deferred.resolve(results); + }, function(reason) { + if (results.hasOwnProperty(key)) return; + deferred.reject(reason); + }); + }); + + if (counter === 0) { + deferred.resolve(results); + } + + return deferred.promise; + } + + var $Q = function Q(resolver) { + if (!isFunction(resolver)) { + throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); + } + + if (!(this instanceof Q)) { + // More useful when $Q is the Promise itself. + return new Q(resolver); + } + + var deferred = new Deferred(); + + function resolveFn(value) { + deferred.resolve(value); + } + + function rejectFn(reason) { + deferred.reject(reason); + } + + resolver(resolveFn, rejectFn); + + return deferred.promise; + }; + + $Q.defer = defer; + $Q.reject = reject; + $Q.when = when; + $Q.resolve = resolve; + $Q.all = all; + + return $Q; +} + +function $$RAFProvider() { //rAF + this.$get = ['$window', '$timeout', function($window, $timeout) { + var requestAnimationFrame = $window.requestAnimationFrame || + $window.webkitRequestAnimationFrame; + + var cancelAnimationFrame = $window.cancelAnimationFrame || + $window.webkitCancelAnimationFrame || + $window.webkitCancelRequestAnimationFrame; + + var rafSupported = !!requestAnimationFrame; + var rafFn = rafSupported + ? function(fn) { + var id = requestAnimationFrame(fn); + return function() { + cancelAnimationFrame(id); + }; + } + : function(fn) { + var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 + return function() { + $timeout.cancel(timer); + }; + }; + + queueFn.supported = rafSupported; + + var cancelLastRAF; + var taskCount = 0; + var taskQueue = []; + return queueFn; + + function flush() { + for (var i = 0; i < taskQueue.length; i++) { + var task = taskQueue[i]; + if (task) { + taskQueue[i] = null; + task(); + } + } + taskCount = taskQueue.length = 0; + } + + function queueFn(asyncFn) { + var index = taskQueue.length; + + taskCount++; + taskQueue.push(asyncFn); + + if (index === 0) { + cancelLastRAF = rafFn(flush); + } + + return function cancelQueueFn() { + if (index >= 0) { + taskQueue[index] = null; + index = null; + + if (--taskCount === 0 && cancelLastRAF) { + cancelLastRAF(); + cancelLastRAF = null; + taskQueue.length = 0; + } + } + }; + } + }]; +} + +/** + * DESIGN NOTES + * + * The design decisions behind the scope are heavily favored for speed and memory consumption. + * + * The typical use of scope is to watch the expressions, which most of the time return the same + * value as last time so we optimize the operation. + * + * Closures construction is expensive in terms of speed as well as memory: + * - No closures, instead use prototypical inheritance for API + * - Internal state needs to be stored on scope directly, which means that private state is + * exposed as $$____ properties + * + * Loop operations are optimized by using while(count--) { ... } + * - this means that in order to keep the same order of execution as addition we have to add + * items to the array at the beginning (unshift) instead of at the end (push) + * + * Child scopes are created and removed often + * - Using an array would be slow since inserts in middle are expensive so we use linked list + * + * There are few watches then a lot of observers. This is why you don't want the observer to be + * implemented in the same way as watch. Watch requires return of initialization function which + * are expensive to construct. + */ + + +/** + * @ngdoc provider + * @name $rootScopeProvider + * @description + * + * Provider for the $rootScope service. + */ + +/** + * @ngdoc method + * @name $rootScopeProvider#digestTtl + * @description + * + * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and + * assuming that the model is unstable. + * + * The current default is 10 iterations. + * + * In complex applications it's possible that the dependencies between `$watch`s will result in + * several digest iterations. However if an application needs more than the default 10 digest + * iterations for its model to stabilize then you should investigate what is causing the model to + * continuously change during the digest. + * + * Increasing the TTL could have performance implications, so you should not change it without + * proper justification. + * + * @param {number} limit The number of digest iterations. + */ + + +/** + * @ngdoc service + * @name $rootScope + * @description + * + * Every application has a single root {@link ng.$rootScope.Scope scope}. + * All other scopes are descendant scopes of the root scope. Scopes provide separation + * between the model and the view, via a mechanism for watching the model for changes. + * They also provide an event emission/broadcast and subscription facility. See the + * {@link guide/scope developer guide on scopes}. + */ +function $RootScopeProvider() { + var TTL = 10; + var $rootScopeMinErr = minErr('$rootScope'); + var lastDirtyWatch = null; + var applyAsyncId = null; + + this.digestTtl = function(value) { + if (arguments.length) { + TTL = value; + } + return TTL; + }; + + function createChildScopeClass(parent) { + function ChildScope() { + this.$$watchers = this.$$nextSibling = + this.$$childHead = this.$$childTail = null; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$id = nextUid(); + this.$$ChildScope = null; + } + ChildScope.prototype = parent; + return ChildScope; + } + + this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', + function($injector, $exceptionHandler, $parse, $browser) { + + function destroyChildScope($event) { + $event.currentScope.$$destroyed = true; + } + + /** + * @ngdoc type + * @name $rootScope.Scope + * + * @description + * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the + * {@link auto.$injector $injector}. Child scopes are created using the + * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when + * compiled HTML template is executed.) + * + * Here is a simple scope snippet to show how you can interact with the scope. + * ```html + * + * ``` + * + * # Inheritance + * A scope can inherit from a parent scope, as in this example: + * ```js + var parent = $rootScope; + var child = parent.$new(); + + parent.salutation = "Hello"; + expect(child.salutation).toEqual('Hello'); + + child.salutation = "Welcome"; + expect(child.salutation).toEqual('Welcome'); + expect(parent.salutation).toEqual('Hello'); + * ``` + * + * When interacting with `Scope` in tests, additional helper methods are available on the + * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional + * details. + * + * + * @param {Object.=} providers Map of service factory which need to be + * provided for the current scope. Defaults to {@link ng}. + * @param {Object.=} instanceCache Provides pre-instantiated services which should + * append/override services provided by `providers`. This is handy + * when unit-testing and having the need to override a default + * service. + * @returns {Object} Newly created scope. + * + */ + function Scope() { + this.$id = nextUid(); + this.$$phase = this.$parent = this.$$watchers = + this.$$nextSibling = this.$$prevSibling = + this.$$childHead = this.$$childTail = null; + this.$root = this; + this.$$destroyed = false; + this.$$listeners = {}; + this.$$listenerCount = {}; + this.$$watchersCount = 0; + this.$$isolateBindings = null; + } + + /** + * @ngdoc property + * @name $rootScope.Scope#$id + * + * @description + * Unique scope ID (monotonically increasing) useful for debugging. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$parent + * + * @description + * Reference to the parent scope. + */ + + /** + * @ngdoc property + * @name $rootScope.Scope#$root + * + * @description + * Reference to the root scope. + */ + + Scope.prototype = { + constructor: Scope, + /** + * @ngdoc method + * @name $rootScope.Scope#$new + * @kind function + * + * @description + * Creates a new child {@link ng.$rootScope.Scope scope}. + * + * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. + * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. + * + * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is + * desired for the scope and its child scopes to be permanently detached from the parent and + * thus stop participating in model change detection and listener notification by invoking. + * + * @param {boolean} isolate If true, then the scope does not prototypically inherit from the + * parent scope. The scope is isolated, as it can not see parent scope properties. + * When creating widgets, it is useful for the widget to not accidentally read parent + * state. + * + * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` + * of the newly created scope. Defaults to `this` scope if not provided. + * This is used when creating a transclude scope to correctly place it + * in the scope hierarchy while maintaining the correct prototypical + * inheritance. + * + * @returns {Object} The newly created child scope. + * + */ + $new: function(isolate, parent) { + var child; + + parent = parent || this; + + if (isolate) { + child = new Scope(); + child.$root = this.$root; + } else { + // Only create a child scope class if somebody asks for one, + // but cache it to allow the VM to optimize lookups. + if (!this.$$ChildScope) { + this.$$ChildScope = createChildScopeClass(this); + } + child = new this.$$ChildScope(); + } + child.$parent = parent; + child.$$prevSibling = parent.$$childTail; + if (parent.$$childHead) { + parent.$$childTail.$$nextSibling = child; + parent.$$childTail = child; + } else { + parent.$$childHead = parent.$$childTail = child; + } + + // When the new scope is not isolated or we inherit from `this`, and + // the parent scope is destroyed, the property `$$destroyed` is inherited + // prototypically. In all other cases, this property needs to be set + // when the parent scope is destroyed. + // The listener needs to be added after the parent is set + if (isolate || parent != this) child.$on('$destroy', destroyChildScope); + + return child; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watch + * @kind function + * + * @description + * Registers a `listener` callback to be executed whenever the `watchExpression` changes. + * + * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest + * $digest()} and should return the value that will be watched. (Since + * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the + * `watchExpression` can execute multiple times per + * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.) + * - The `listener` is called only when the value from the current `watchExpression` and the + * previous call to `watchExpression` are not equal (with the exception of the initial run, + * see below). Inequality is determined according to reference inequality, + * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) + * via the `!==` Javascript operator, unless `objectEquality == true` + * (see next point) + * - When `objectEquality == true`, inequality of the `watchExpression` is determined + * according to the {@link angular.equals} function. To save the value of the object for + * later comparison, the {@link angular.copy} function is used. This therefore means that + * watching complex objects will have adverse memory and performance implications. + * - The watch `listener` may change the model, which may trigger other `listener`s to fire. + * This is achieved by rerunning the watchers until no changes are detected. The rerun + * iteration limit is 10 to prevent an infinite loop deadlock. + * + * + * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, + * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` + * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a + * change is detected, be prepared for multiple calls to your listener.) + * + * After a watcher is registered with the scope, the `listener` fn is called asynchronously + * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the + * watcher. In rare cases, this is undesirable because the listener is called when the result + * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you + * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the + * listener was called due to initialization. + * + * + * + * # Example + * ```js + // let's assume that scope was dependency injected as the $rootScope + var scope = $rootScope; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + + + + // Using a function as a watchExpression + var food; + scope.foodCounter = 0; + expect(scope.foodCounter).toEqual(0); + scope.$watch( + // This function returns the value being watched. It is called for each turn of the $digest loop + function() { return food; }, + // This is the change listener, called when the value returned from the above function changes + function(newValue, oldValue) { + if ( newValue !== oldValue ) { + // Only increment the counter if the value changed + scope.foodCounter = scope.foodCounter + 1; + } + } + ); + // No digest has been run so the counter will be zero + expect(scope.foodCounter).toEqual(0); + + // Run the digest but since food has not changed count will still be zero + scope.$digest(); + expect(scope.foodCounter).toEqual(0); + + // Update food and run digest. Now the counter will increment + food = 'cheeseburger'; + scope.$digest(); + expect(scope.foodCounter).toEqual(1); + + * ``` + * + * + * + * @param {(function()|string)} watchExpression Expression that is evaluated on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers + * a call to the `listener`. + * + * - `string`: Evaluated as {@link guide/expression expression} + * - `function(scope)`: called with current `scope` as a parameter. + * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value + * of `watchExpression` changes. + * + * - `newVal` contains the current value of the `watchExpression` + * - `oldVal` contains the previous value of the `watchExpression` + * - `scope` refers to the current scope + * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of + * comparing for reference equality. + * @returns {function()} Returns a deregistration function for this listener. + */ + $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) { + var get = $parse(watchExp); + + if (get.$$watchDelegate) { + return get.$$watchDelegate(this, listener, objectEquality, get, watchExp); + } + var scope = this, + array = scope.$$watchers, + watcher = { + fn: listener, + last: initWatchVal, + get: get, + exp: prettyPrintExpression || watchExp, + eq: !!objectEquality + }; + + lastDirtyWatch = null; + + if (!isFunction(listener)) { + watcher.fn = noop; + } + + if (!array) { + array = scope.$$watchers = []; + } + // we use unshift since we use a while loop in $digest for speed. + // the while loop reads in reverse order. + array.unshift(watcher); + incrementWatchersCount(this, 1); + + return function deregisterWatch() { + if (arrayRemove(array, watcher) >= 0) { + incrementWatchersCount(scope, -1); + } + lastDirtyWatch = null; + }; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchGroup + * @kind function + * + * @description + * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. + * If any one expression in the collection changes the `listener` is executed. + * + * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every + * call to $digest() to see if any items changes. + * - The `listener` is called whenever any expression in the `watchExpressions` array changes. + * + * @param {Array.} watchExpressions Array of expressions that will be individually + * watched using {@link ng.$rootScope.Scope#$watch $watch()} + * + * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any + * expression in `watchExpressions` changes + * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching + * those of `watchExpression` + * The `scope` refers to the current scope. + * @returns {function()} Returns a de-registration function for all listeners. + */ + $watchGroup: function(watchExpressions, listener) { + var oldValues = new Array(watchExpressions.length); + var newValues = new Array(watchExpressions.length); + var deregisterFns = []; + var self = this; + var changeReactionScheduled = false; + var firstRun = true; + + if (!watchExpressions.length) { + // No expressions means we call the listener ASAP + var shouldCall = true; + self.$evalAsync(function() { + if (shouldCall) listener(newValues, newValues, self); + }); + return function deregisterWatchGroup() { + shouldCall = false; + }; + } + + if (watchExpressions.length === 1) { + // Special case size of one + return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { + newValues[0] = value; + oldValues[0] = oldValue; + listener(newValues, (value === oldValue) ? newValues : oldValues, scope); + }); + } + + forEach(watchExpressions, function(expr, i) { + var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { + newValues[i] = value; + oldValues[i] = oldValue; + if (!changeReactionScheduled) { + changeReactionScheduled = true; + self.$evalAsync(watchGroupAction); + } + }); + deregisterFns.push(unwatchFn); + }); + + function watchGroupAction() { + changeReactionScheduled = false; + + if (firstRun) { + firstRun = false; + listener(newValues, newValues, self); + } else { + listener(newValues, oldValues, self); + } + } + + return function deregisterWatchGroup() { + while (deregisterFns.length) { + deregisterFns.shift()(); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$watchCollection + * @kind function + * + * @description + * Shallow watches the properties of an object and fires whenever any of the properties change + * (for arrays, this implies watching the array items; for object maps, this implies watching + * the properties). If a change is detected, the `listener` callback is fired. + * + * - The `obj` collection is observed via standard $watch operation and is examined on every + * call to $digest() to see if any items have been added, removed, or moved. + * - The `listener` is called whenever anything within the `obj` has changed. Examples include + * adding, removing, and moving items belonging to an object or array. + * + * + * # Example + * ```js + $scope.names = ['igor', 'matias', 'misko', 'james']; + $scope.dataCount = 4; + + $scope.$watchCollection('names', function(newNames, oldNames) { + $scope.dataCount = newNames.length; + }); + + expect($scope.dataCount).toEqual(4); + $scope.$digest(); + + //still at 4 ... no changes + expect($scope.dataCount).toEqual(4); + + $scope.names.pop(); + $scope.$digest(); + + //now there's been a change + expect($scope.dataCount).toEqual(3); + * ``` + * + * + * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The + * expression value should evaluate to an object or an array which is observed on each + * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the + * collection will trigger a call to the `listener`. + * + * @param {function(newCollection, oldCollection, scope)} listener a callback function called + * when a change is detected. + * - The `newCollection` object is the newly modified data obtained from the `obj` expression + * - The `oldCollection` object is a copy of the former collection data. + * Due to performance considerations, the`oldCollection` value is computed only if the + * `listener` function declares two or more arguments. + * - The `scope` argument refers to the current scope. + * + * @returns {function()} Returns a de-registration function for this listener. When the + * de-registration function is executed, the internal watch operation is terminated. + */ + $watchCollection: function(obj, listener) { + $watchCollectionInterceptor.$stateful = true; + + var self = this; + // the current value, updated on each dirty-check run + var newValue; + // a shallow copy of the newValue from the last dirty-check run, + // updated to match newValue during dirty-check run + var oldValue; + // a shallow copy of the newValue from when the last change happened + var veryOldValue; + // only track veryOldValue if the listener is asking for it + var trackVeryOldValue = (listener.length > 1); + var changeDetected = 0; + var changeDetector = $parse(obj, $watchCollectionInterceptor); + var internalArray = []; + var internalObject = {}; + var initRun = true; + var oldLength = 0; + + function $watchCollectionInterceptor(_value) { + newValue = _value; + var newLength, key, bothNaN, newItem, oldItem; + + // If the new value is undefined, then return undefined as the watch may be a one-time watch + if (isUndefined(newValue)) return; + + if (!isObject(newValue)) { // if primitive + if (oldValue !== newValue) { + oldValue = newValue; + changeDetected++; + } + } else if (isArrayLike(newValue)) { + if (oldValue !== internalArray) { + // we are transitioning from something which was not an array into array. + oldValue = internalArray; + oldLength = oldValue.length = 0; + changeDetected++; + } + + newLength = newValue.length; + + if (oldLength !== newLength) { + // if lengths do not match we need to trigger change notification + changeDetected++; + oldValue.length = oldLength = newLength; + } + // copy the items to oldValue and look for changes. + for (var i = 0; i < newLength; i++) { + oldItem = oldValue[i]; + newItem = newValue[i]; + + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[i] = newItem; + } + } + } else { + if (oldValue !== internalObject) { + // we are transitioning from something which was not an object into object. + oldValue = internalObject = {}; + oldLength = 0; + changeDetected++; + } + // copy the items to oldValue and look for changes. + newLength = 0; + for (key in newValue) { + if (newValue.hasOwnProperty(key)) { + newLength++; + newItem = newValue[key]; + oldItem = oldValue[key]; + + if (key in oldValue) { + bothNaN = (oldItem !== oldItem) && (newItem !== newItem); + if (!bothNaN && (oldItem !== newItem)) { + changeDetected++; + oldValue[key] = newItem; + } + } else { + oldLength++; + oldValue[key] = newItem; + changeDetected++; + } + } + } + if (oldLength > newLength) { + // we used to have more keys, need to find them and destroy them. + changeDetected++; + for (key in oldValue) { + if (!newValue.hasOwnProperty(key)) { + oldLength--; + delete oldValue[key]; + } + } + } + } + return changeDetected; + } + + function $watchCollectionAction() { + if (initRun) { + initRun = false; + listener(newValue, newValue, self); + } else { + listener(newValue, veryOldValue, self); + } + + // make a copy for the next time a collection is changed + if (trackVeryOldValue) { + if (!isObject(newValue)) { + //primitive + veryOldValue = newValue; + } else if (isArrayLike(newValue)) { + veryOldValue = new Array(newValue.length); + for (var i = 0; i < newValue.length; i++) { + veryOldValue[i] = newValue[i]; + } + } else { // if object + veryOldValue = {}; + for (var key in newValue) { + if (hasOwnProperty.call(newValue, key)) { + veryOldValue[key] = newValue[key]; + } + } + } + } + } + + return this.$watch(changeDetector, $watchCollectionAction); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$digest + * @kind function + * + * @description + * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and + * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change + * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} + * until no more listeners are firing. This means that it is possible to get into an infinite + * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of + * iterations exceeds 10. + * + * Usually, you don't call `$digest()` directly in + * {@link ng.directive:ngController controllers} or in + * {@link ng.$compileProvider#directive directives}. + * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within + * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. + * + * If you want to be notified whenever `$digest()` is called, + * you can register a `watchExpression` function with + * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. + * + * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. + * + * # Example + * ```js + var scope = ...; + scope.name = 'misko'; + scope.counter = 0; + + expect(scope.counter).toEqual(0); + scope.$watch('name', function(newValue, oldValue) { + scope.counter = scope.counter + 1; + }); + expect(scope.counter).toEqual(0); + + scope.$digest(); + // the listener is always called during the first $digest loop after it was registered + expect(scope.counter).toEqual(1); + + scope.$digest(); + // but now it will not be called unless the value changes + expect(scope.counter).toEqual(1); + + scope.name = 'adam'; + scope.$digest(); + expect(scope.counter).toEqual(2); + * ``` + * + */ + $digest: function() { + var watch, value, last, + watchers, + length, + dirty, ttl = TTL, + next, current, target = this, + watchLog = [], + logIdx, logMsg, asyncTask; + + beginPhase('$digest'); + // Check for changes to browser url that happened in sync before the call to $digest + $browser.$$checkUrlChange(); + + if (this === $rootScope && applyAsyncId !== null) { + // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then + // cancel the scheduled $apply and flush the queue of expressions to be evaluated. + $browser.defer.cancel(applyAsyncId); + flushApplyAsync(); + } + + lastDirtyWatch = null; + + do { // "while dirty" loop + dirty = false; + current = target; + + while (asyncQueue.length) { + try { + asyncTask = asyncQueue.shift(); + asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); + } catch (e) { + $exceptionHandler(e); + } + lastDirtyWatch = null; + } + + traverseScopesLoop: + do { // "traverse the scopes" loop + if ((watchers = current.$$watchers)) { + // process our watches + length = watchers.length; + while (length--) { + try { + watch = watchers[length]; + // Most common watches are on primitives, in which case we can short + // circuit it with === operator, only when === fails do we use .equals + if (watch) { + if ((value = watch.get(current)) !== (last = watch.last) && + !(watch.eq + ? equals(value, last) + : (typeof value === 'number' && typeof last === 'number' + && isNaN(value) && isNaN(last)))) { + dirty = true; + lastDirtyWatch = watch; + watch.last = watch.eq ? copy(value, null) : value; + watch.fn(value, ((last === initWatchVal) ? value : last), current); + if (ttl < 5) { + logIdx = 4 - ttl; + if (!watchLog[logIdx]) watchLog[logIdx] = []; + watchLog[logIdx].push({ + msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, + newVal: value, + oldVal: last + }); + } + } else if (watch === lastDirtyWatch) { + // If the most recently dirty watcher is now clean, short circuit since the remaining watchers + // have already been tested. + dirty = false; + break traverseScopesLoop; + } + } + } catch (e) { + $exceptionHandler(e); + } + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $broadcast + if (!(next = ((current.$$watchersCount && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } while ((current = next)); + + // `break traverseScopesLoop;` takes us to here + + if ((dirty || asyncQueue.length) && !(ttl--)) { + clearPhase(); + throw $rootScopeMinErr('infdig', + '{0} $digest() iterations reached. Aborting!\n' + + 'Watchers fired in the last 5 iterations: {1}', + TTL, watchLog); + } + + } while (dirty || asyncQueue.length); + + clearPhase(); + + while (postDigestQueue.length) { + try { + postDigestQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + }, + + + /** + * @ngdoc event + * @name $rootScope.Scope#$destroy + * @eventType broadcast on scope being destroyed + * + * @description + * Broadcasted when a scope and its children are being destroyed. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + + /** + * @ngdoc method + * @name $rootScope.Scope#$destroy + * @kind function + * + * @description + * Removes the current scope (and all of its children) from the parent scope. Removal implies + * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer + * propagate to the current scope and its children. Removal also implies that the current + * scope is eligible for garbage collection. + * + * The `$destroy()` is usually used by directives such as + * {@link ng.directive:ngRepeat ngRepeat} for managing the + * unrolling of the loop. + * + * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. + * Application code can register a `$destroy` event handler that will give it a chance to + * perform any necessary cleanup. + * + * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to + * clean up DOM bindings before an element is removed from the DOM. + */ + $destroy: function() { + // We can't destroy a scope that has been already destroyed. + if (this.$$destroyed) return; + var parent = this.$parent; + + this.$broadcast('$destroy'); + this.$$destroyed = true; + + if (this === $rootScope) { + //Remove handlers attached to window when $rootScope is removed + $browser.$$applicationDestroyed(); + } + + incrementWatchersCount(this, -this.$$watchersCount); + for (var eventName in this.$$listenerCount) { + decrementListenerCount(this, this.$$listenerCount[eventName], eventName); + } + + // sever all the references to parent scopes (after this cleanup, the current scope should + // not be retained by any of our references and should be eligible for garbage collection) + if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; + if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; + if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; + if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; + + // Disable listeners, watchers and apply/digest methods + this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; + this.$on = this.$watch = this.$watchGroup = function() { return noop; }; + this.$$listeners = {}; + + // All of the code below is bogus code that works around V8's memory leak via optimized code + // and inline caches. + // + // see: + // - https://code.google.com/p/v8/issues/detail?id=2073#c26 + // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 + // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 + + this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = + this.$$childTail = this.$root = this.$$watchers = null; + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$eval + * @kind function + * + * @description + * Executes the `expression` on the current scope and returns the result. Any exceptions in + * the expression are propagated (uncaught). This is useful when evaluating Angular + * expressions. + * + * # Example + * ```js + var scope = ng.$rootScope.Scope(); + scope.a = 1; + scope.b = 2; + + expect(scope.$eval('a+b')).toEqual(3); + expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); + * ``` + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + * @returns {*} The result of evaluating the expression. + */ + $eval: function(expr, locals) { + return $parse(expr)(this, locals); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$evalAsync + * @kind function + * + * @description + * Executes the expression on the current scope at a later point in time. + * + * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only + * that: + * + * - it will execute after the function that scheduled the evaluation (preferably before DOM + * rendering). + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after + * `expression` execution. + * + * Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle + * will be scheduled. However, it is encouraged to always call code that changes the model + * from within an `$apply` call. That includes code evaluated via `$evalAsync`. + * + * @param {(string|function())=} expression An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with the current `scope` parameter. + * + * @param {(object)=} locals Local variables object, useful for overriding values in scope. + */ + $evalAsync: function(expr, locals) { + // if we are outside of an $digest loop and this is the first time we are scheduling async + // task also schedule async auto-flush + if (!$rootScope.$$phase && !asyncQueue.length) { + $browser.defer(function() { + if (asyncQueue.length) { + $rootScope.$digest(); + } + }); + } + + asyncQueue.push({scope: this, expression: expr, locals: locals}); + }, + + $$postDigest: function(fn) { + postDigestQueue.push(fn); + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$apply + * @kind function + * + * @description + * `$apply()` is used to execute an expression in angular from outside of the angular + * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). + * Because we are calling into the angular framework we need to perform proper scope life + * cycle of {@link ng.$exceptionHandler exception handling}, + * {@link ng.$rootScope.Scope#$digest executing watches}. + * + * ## Life cycle + * + * # Pseudo-Code of `$apply()` + * ```js + function $apply(expr) { + try { + return $eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + $root.$digest(); + } + } + * ``` + * + * + * Scope's `$apply()` method transitions through the following stages: + * + * 1. The {@link guide/expression expression} is executed using the + * {@link ng.$rootScope.Scope#$eval $eval()} method. + * 2. Any exceptions from the execution of the expression are forwarded to the + * {@link ng.$exceptionHandler $exceptionHandler} service. + * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the + * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. + * + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + * + * @returns {*} The result of evaluating the expression. + */ + $apply: function(expr) { + try { + beginPhase('$apply'); + return this.$eval(expr); + } catch (e) { + $exceptionHandler(e); + } finally { + clearPhase(); + try { + $rootScope.$digest(); + } catch (e) { + $exceptionHandler(e); + throw e; + } + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$applyAsync + * @kind function + * + * @description + * Schedule the invocation of $apply to occur at a later time. The actual time difference + * varies across browsers, but is typically around ~10 milliseconds. + * + * This can be used to queue up multiple expressions which need to be evaluated in the same + * digest. + * + * @param {(string|function())=} exp An angular expression to be executed. + * + * - `string`: execute using the rules as defined in {@link guide/expression expression}. + * - `function(scope)`: execute the function with current `scope` parameter. + */ + $applyAsync: function(expr) { + var scope = this; + expr && applyAsyncQueue.push($applyAsyncExpression); + scheduleApplyAsync(); + + function $applyAsyncExpression() { + scope.$eval(expr); + } + }, + + /** + * @ngdoc method + * @name $rootScope.Scope#$on + * @kind function + * + * @description + * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for + * discussion of event life cycle. + * + * The event listener function format is: `function(event, args...)`. The `event` object + * passed into the listener has the following attributes: + * + * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or + * `$broadcast`-ed. + * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the + * event propagates through the scope hierarchy, this property is set to null. + * - `name` - `{string}`: name of the event. + * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel + * further event propagation (available only for events that were `$emit`-ed). + * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag + * to true. + * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. + * + * @param {string} name Event name to listen on. + * @param {function(event, ...args)} listener Function to call when the event is emitted. + * @returns {function()} Returns a deregistration function for this listener. + */ + $on: function(name, listener) { + var namedListeners = this.$$listeners[name]; + if (!namedListeners) { + this.$$listeners[name] = namedListeners = []; + } + namedListeners.push(listener); + + var current = this; + do { + if (!current.$$listenerCount[name]) { + current.$$listenerCount[name] = 0; + } + current.$$listenerCount[name]++; + } while ((current = current.$parent)); + + var self = this; + return function() { + var indexOfListener = namedListeners.indexOf(listener); + if (indexOfListener !== -1) { + namedListeners[indexOfListener] = null; + decrementListenerCount(self, 1, name); + } + }; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$emit + * @kind function + * + * @description + * Dispatches an event `name` upwards through the scope hierarchy notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$emit` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event traverses upwards toward the root scope and calls all + * registered listeners along the way. The event will stop propagating if one of the listeners + * cancels it. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to emit. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). + */ + $emit: function(name, args) { + var empty = [], + namedListeners, + scope = this, + stopPropagation = false, + event = { + name: name, + targetScope: scope, + stopPropagation: function() {stopPropagation = true;}, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }, + listenerArgs = concat([event], arguments, 1), + i, length; + + do { + namedListeners = scope.$$listeners[name] || empty; + event.currentScope = scope; + for (i = 0, length = namedListeners.length; i < length; i++) { + + // if listeners were deregistered, defragment the array + if (!namedListeners[i]) { + namedListeners.splice(i, 1); + i--; + length--; + continue; + } + try { + //allow all listeners attached to the current scope to run + namedListeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + //if any listener on the current scope stops propagation, prevent bubbling + if (stopPropagation) { + event.currentScope = null; + return event; + } + //traverse upwards + scope = scope.$parent; + } while (scope); + + event.currentScope = null; + + return event; + }, + + + /** + * @ngdoc method + * @name $rootScope.Scope#$broadcast + * @kind function + * + * @description + * Dispatches an event `name` downwards to all child scopes (and their children) notifying the + * registered {@link ng.$rootScope.Scope#$on} listeners. + * + * The event life cycle starts at the scope on which `$broadcast` was called. All + * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get + * notified. Afterwards, the event propagates to all direct and indirect scopes of the current + * scope and calls all registered listeners along the way. The event cannot be canceled. + * + * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed + * onto the {@link ng.$exceptionHandler $exceptionHandler} service. + * + * @param {string} name Event name to broadcast. + * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. + * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} + */ + $broadcast: function(name, args) { + var target = this, + current = target, + next = target, + event = { + name: name, + targetScope: target, + preventDefault: function() { + event.defaultPrevented = true; + }, + defaultPrevented: false + }; + + if (!target.$$listenerCount[name]) return event; + + var listenerArgs = concat([event], arguments, 1), + listeners, i, length; + + //down while you can, then up and next sibling or up and next sibling until back at root + while ((current = next)) { + event.currentScope = current; + listeners = current.$$listeners[name] || []; + for (i = 0, length = listeners.length; i < length; i++) { + // if listeners were deregistered, defragment the array + if (!listeners[i]) { + listeners.splice(i, 1); + i--; + length--; + continue; + } + + try { + listeners[i].apply(null, listenerArgs); + } catch (e) { + $exceptionHandler(e); + } + } + + // Insanity Warning: scope depth-first traversal + // yes, this code is a bit crazy, but it works and we have tests to prove it! + // this piece should be kept in sync with the traversal in $digest + // (though it differs due to having the extra check for $$listenerCount) + if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || + (current !== target && current.$$nextSibling)))) { + while (current !== target && !(next = current.$$nextSibling)) { + current = current.$parent; + } + } + } + + event.currentScope = null; + return event; + } + }; + + var $rootScope = new Scope(); + + //The internal queues. Expose them on the $rootScope for debugging/testing purposes. + var asyncQueue = $rootScope.$$asyncQueue = []; + var postDigestQueue = $rootScope.$$postDigestQueue = []; + var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; + + return $rootScope; + + + function beginPhase(phase) { + if ($rootScope.$$phase) { + throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); + } + + $rootScope.$$phase = phase; + } + + function clearPhase() { + $rootScope.$$phase = null; + } + + function incrementWatchersCount(current, count) { + do { + current.$$watchersCount += count; + } while ((current = current.$parent)); + } + + function decrementListenerCount(current, count, name) { + do { + current.$$listenerCount[name] -= count; + + if (current.$$listenerCount[name] === 0) { + delete current.$$listenerCount[name]; + } + } while ((current = current.$parent)); + } + + /** + * function used as an initial value for watchers. + * because it's unique we can easily tell it apart from other values + */ + function initWatchVal() {} + + function flushApplyAsync() { + while (applyAsyncQueue.length) { + try { + applyAsyncQueue.shift()(); + } catch (e) { + $exceptionHandler(e); + } + } + applyAsyncId = null; + } + + function scheduleApplyAsync() { + if (applyAsyncId === null) { + applyAsyncId = $browser.defer(function() { + $rootScope.$apply(flushApplyAsync); + }); + } + } + }]; +} + +/** + * @description + * Private service to sanitize uris for links and images. Used by $compile and $sanitize. + */ +function $$SanitizeUriProvider() { + var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, + imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during a[href] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to a[href] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.aHrefSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + aHrefSanitizationWhitelist = regexp; + return this; + } + return aHrefSanitizationWhitelist; + }; + + + /** + * @description + * Retrieves or overrides the default regular expression that is used for whitelisting of safe + * urls during img[src] sanitization. + * + * The sanitization is a security measure aimed at prevent XSS attacks via html links. + * + * Any url about to be assigned to img[src] via data-binding is first normalized and turned into + * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` + * regular expression. If a match is found, the original url is written into the dom. Otherwise, + * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. + * + * @param {RegExp=} regexp New regexp to whitelist urls with. + * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for + * chaining otherwise. + */ + this.imgSrcSanitizationWhitelist = function(regexp) { + if (isDefined(regexp)) { + imgSrcSanitizationWhitelist = regexp; + return this; + } + return imgSrcSanitizationWhitelist; + }; + + this.$get = function() { + return function sanitizeUri(uri, isImage) { + var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; + var normalizedVal; + normalizedVal = urlResolve(uri).href; + if (normalizedVal !== '' && !normalizedVal.match(regex)) { + return 'unsafe:' + normalizedVal; + } + return uri; + }; + }; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Any commits to this file should be reviewed with security in mind. * + * Changes to this file can potentially create security vulnerabilities. * + * An approval from 2 Core members with history of modifying * + * this file is required. * + * * + * Does the change somehow allow for arbitrary javascript to be executed? * + * Or allows for someone to change the prototype of built-in objects? * + * Or gives undesired access to variables likes document or window? * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +var $sceMinErr = minErr('$sce'); + +var SCE_CONTEXTS = { + HTML: 'html', + CSS: 'css', + URL: 'url', + // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a + // url. (e.g. ng-include, script src, templateUrl) + RESOURCE_URL: 'resourceUrl', + JS: 'js' +}; + +// Helper functions follow. + +function adjustMatcher(matcher) { + if (matcher === 'self') { + return matcher; + } else if (isString(matcher)) { + // Strings match exactly except for 2 wildcards - '*' and '**'. + // '*' matches any character except those from the set ':/.?&'. + // '**' matches any character (like .* in a RegExp). + // More than 2 *'s raises an error as it's ill defined. + if (matcher.indexOf('***') > -1) { + throw $sceMinErr('iwcard', + 'Illegal sequence *** in string matcher. String: {0}', matcher); + } + matcher = escapeForRegexp(matcher). + replace('\\*\\*', '.*'). + replace('\\*', '[^:/.?&;]*'); + return new RegExp('^' + matcher + '$'); + } else if (isRegExp(matcher)) { + // The only other type of matcher allowed is a Regexp. + // Match entire URL / disallow partial matches. + // Flags are reset (i.e. no global, ignoreCase or multiline) + return new RegExp('^' + matcher.source + '$'); + } else { + throw $sceMinErr('imatcher', + 'Matchers may only be "self", string patterns or RegExp objects'); + } +} + + +function adjustMatchers(matchers) { + var adjustedMatchers = []; + if (isDefined(matchers)) { + forEach(matchers, function(matcher) { + adjustedMatchers.push(adjustMatcher(matcher)); + }); + } + return adjustedMatchers; +} + + +/** + * @ngdoc service + * @name $sceDelegate + * @kind function + * + * @description + * + * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict + * Contextual Escaping (SCE)} services to AngularJS. + * + * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of + * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is + * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to + * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things + * work because `$sce` delegates to `$sceDelegate` for these operations. + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. + * + * The default instance of `$sceDelegate` should work out of the box with little pain. While you + * can override it completely to change the behavior of `$sce`, the common case would + * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting + * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as + * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist + * $sceDelegateProvider.resourceUrlWhitelist} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + */ + +/** + * @ngdoc provider + * @name $sceDelegateProvider + * @description + * + * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate + * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure + * that the URLs used for sourcing Angular templates are safe. Refer {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and + * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} + * + * For the general details about this service in Angular, read the main page for {@link ng.$sce + * Strict Contextual Escaping (SCE)}. + * + * **Example**: Consider the following case. + * + * - your app is hosted at url `http://myapp.example.com/` + * - but some of your templates are hosted on other domains you control such as + * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. + * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. + * + * Here is what a secure configuration for this scenario might look like: + * + * ``` + * angular.module('myApp', []).config(function($sceDelegateProvider) { + * $sceDelegateProvider.resourceUrlWhitelist([ + * // Allow same origin resource loads. + * 'self', + * // Allow loading from our assets domain. Notice the difference between * and **. + * 'http://srv*.assets.example.com/**' + * ]); + * + * // The blacklist overrides the whitelist so the open redirect here is blocked. + * $sceDelegateProvider.resourceUrlBlacklist([ + * 'http://myapp.example.com/clickThru**' + * ]); + * }); + * ``` + */ + +function $SceDelegateProvider() { + this.SCE_CONTEXTS = SCE_CONTEXTS; + + // Resource URLs can also be trusted by policy. + var resourceUrlWhitelist = ['self'], + resourceUrlBlacklist = []; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlWhitelist + * @kind function + * + * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * Note: **an empty whitelist array will block all URLs**! + * + * @return {Array} the currently set whitelist array. + * + * The **default value** when no whitelist has been explicitly set is `['self']` allowing only + * same origin resource requests. + * + * @description + * Sets/Gets the whitelist of trusted resource URLs. + */ + this.resourceUrlWhitelist = function(value) { + if (arguments.length) { + resourceUrlWhitelist = adjustMatchers(value); + } + return resourceUrlWhitelist; + }; + + /** + * @ngdoc method + * @name $sceDelegateProvider#resourceUrlBlacklist + * @kind function + * + * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value + * provided. This must be an array or null. A snapshot of this array is used so further + * changes to the array are ignored. + * + * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items + * allowed in this array. + * + * The typical usage for the blacklist is to **block + * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as + * these would otherwise be trusted but actually return content from the redirected domain. + * + * Finally, **the blacklist overrides the whitelist** and has the final say. + * + * @return {Array} the currently set blacklist array. + * + * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there + * is no blacklist.) + * + * @description + * Sets/Gets the blacklist of trusted resource URLs. + */ + + this.resourceUrlBlacklist = function(value) { + if (arguments.length) { + resourceUrlBlacklist = adjustMatchers(value); + } + return resourceUrlBlacklist; + }; + + this.$get = ['$injector', function($injector) { + + var htmlSanitizer = function htmlSanitizer(html) { + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + }; + + if ($injector.has('$sanitize')) { + htmlSanitizer = $injector.get('$sanitize'); + } + + + function matchUrl(matcher, parsedUrl) { + if (matcher === 'self') { + return urlIsSameOrigin(parsedUrl); + } else { + // definitely a regex. See adjustMatchers() + return !!matcher.exec(parsedUrl.href); + } + } + + function isResourceUrlAllowedByPolicy(url) { + var parsedUrl = urlResolve(url.toString()); + var i, n, allowed = false; + // Ensure that at least one item from the whitelist allows this url. + for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { + if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { + allowed = true; + break; + } + } + if (allowed) { + // Ensure that no item from the blacklist blocked this url. + for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { + if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { + allowed = false; + break; + } + } + } + return allowed; + } + + function generateHolderType(Base) { + var holderType = function TrustedValueHolderType(trustedValue) { + this.$$unwrapTrustedValue = function() { + return trustedValue; + }; + }; + if (Base) { + holderType.prototype = new Base(); + } + holderType.prototype.valueOf = function sceValueOf() { + return this.$$unwrapTrustedValue(); + }; + holderType.prototype.toString = function sceToString() { + return this.$$unwrapTrustedValue().toString(); + }; + return holderType; + } + + var trustedValueHolderBase = generateHolderType(), + byType = {}; + + byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); + byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); + + /** + * @ngdoc method + * @name $sceDelegate#trustAs + * + * @description + * Returns an object that is trusted by angular for use in specified strict + * contextual escaping contexts (such as ng-bind-html, ng-include, any src + * attribute interpolation, any dom event binding attribute interpolation + * such as for onclick, etc.) that uses the provided value. + * See {@link ng.$sce $sce} for enabling strict contextual escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + function trustAs(type, trustedValue) { + var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (!Constructor) { + throw $sceMinErr('icontext', + 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', + type, trustedValue); + } + if (trustedValue === null || trustedValue === undefined || trustedValue === '') { + return trustedValue; + } + // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting + // mutable objects, we ensure here that the value passed in is actually a string. + if (typeof trustedValue !== 'string') { + throw $sceMinErr('itype', + 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', + type); + } + return new Constructor(trustedValue); + } + + /** + * @ngdoc method + * @name $sceDelegate#valueOf + * + * @description + * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. + * + * If the passed parameter is not a value that had been returned by {@link + * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. + * + * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} + * call or anything else. + * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns + * `value` unchanged. + */ + function valueOf(maybeTrusted) { + if (maybeTrusted instanceof trustedValueHolderBase) { + return maybeTrusted.$$unwrapTrustedValue(); + } else { + return maybeTrusted; + } + } + + /** + * @ngdoc method + * @name $sceDelegate#getTrusted + * + * @description + * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and + * returns the originally supplied value if the queried context type is a supertype of the + * created type. If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} call. + * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs + * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. + */ + function getTrusted(type, maybeTrusted) { + if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') { + return maybeTrusted; + } + var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); + if (constructor && maybeTrusted instanceof constructor) { + return maybeTrusted.$$unwrapTrustedValue(); + } + // If we get here, then we may only take one of two actions. + // 1. sanitize the value for the requested type, or + // 2. throw an exception. + if (type === SCE_CONTEXTS.RESOURCE_URL) { + if (isResourceUrlAllowedByPolicy(maybeTrusted)) { + return maybeTrusted; + } else { + throw $sceMinErr('insecurl', + 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', + maybeTrusted.toString()); + } + } else if (type === SCE_CONTEXTS.HTML) { + return htmlSanitizer(maybeTrusted); + } + throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); + } + + return { trustAs: trustAs, + getTrusted: getTrusted, + valueOf: valueOf }; + }]; +} + + +/** + * @ngdoc provider + * @name $sceProvider + * @description + * + * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. + * - enable/disable Strict Contextual Escaping (SCE) in a module + * - override the default implementation with a custom delegate + * + * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. + */ + +/* jshint maxlen: false*/ + +/** + * @ngdoc service + * @name $sce + * @kind function + * + * @description + * + * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. + * + * # Strict Contextual Escaping + * + * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain + * contexts to result in a value that is marked as safe to use for that context. One example of + * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer + * to these contexts as privileged or SCE contexts. + * + * As of version 1.2, Angular ships with SCE enabled by default. + * + * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow + * one to execute arbitrary javascript by the use of the expression() syntax. Refer + * to learn more about them. + * You can ensure your document is in standards mode and not quirks mode by adding `` + * to the top of your HTML document. + * + * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for + * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. + * + * Here's an example of a binding in a privileged context: + * + * ``` + * + *
+ * ``` + * + * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE + * disabled, this application allows the user to render arbitrary HTML into the DIV. + * In a more realistic example, one may be rendering user comments, blog articles, etc. via + * bindings. (HTML is just one example of a context where rendering user controlled input creates + * security vulnerabilities.) + * + * For the case of HTML, you might use a library, either on the client side, or on the server side, + * to sanitize unsafe HTML before binding to the value and rendering it in the document. + * + * How would you ensure that every place that used these types of bindings was bound to a value that + * was sanitized by your library (or returned as safe for rendering by your server?) How can you + * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some + * properties/fields and forgot to update the binding to the sanitized value? + * + * To be secure by default, you want to ensure that any such bindings are disallowed unless you can + * determine that something explicitly says it's safe to use a value for binding in that + * context. You can then audit your code (a simple grep would do) to ensure that this is only done + * for those values that you can easily tell are safe - because they were received from your server, + * sanitized by your library, etc. You can organize your codebase to help with this - perhaps + * allowing only the files in a specific directory to do this. Ensuring that the internal API + * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. + * + * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} + * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to + * obtain values that will be accepted by SCE / privileged contexts. + * + * + * ## How does it work? + * + * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted + * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link + * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the + * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. + * + * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link + * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly + * simplified): + * + * ``` + * var ngBindHtmlDirective = ['$sce', function($sce) { + * return function(scope, element, attr) { + * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { + * element.html(value || ''); + * }); + * }; + * }]; + * ``` + * + * ## Impact on loading templates + * + * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as + * `templateUrl`'s specified by {@link guide/directive directives}. + * + * By default, Angular only loads templates from the same domain and protocol as the application + * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or + * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist + * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. + * + * *Please note*: + * The browser's + * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) + * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) + * policy apply in addition to this and may further restrict whether the template is successfully + * loaded. This means that without the right CORS policy, loading templates from a different domain + * won't work on all browsers. Also, loading templates from `file://` URL does not work on some + * browsers. + * + * ## This feels like too much overhead + * + * It's important to remember that SCE only applies to interpolation expressions. + * + * If your expressions are constant literals, they're automatically trusted and you don't need to + * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. + * `
`) just works. + * + * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them + * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. + * + * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load + * templates in `ng-include` from your application's domain without having to even know about SCE. + * It blocks loading templates from other domains or loading templates over http from an https + * served document. You can change these by setting your own custom {@link + * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link + * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. + * + * This significantly reduces the overhead. It is far easier to pay the small overhead and have an + * application that's secure and can be audited to verify that with much more ease than bolting + * security onto an application later. + * + * + * ## What trusted context types are supported? + * + * | Context | Notes | + * |---------------------|----------------| + * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | + * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | + * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | + * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | + * + * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
+ * + * Each element in these arrays must be one of the following: + * + * - **'self'** + * - The special **string**, `'self'`, can be used to match against all URLs of the **same + * domain** as the application document using the **same protocol**. + * - **String** (except the special value `'self'`) + * - The string is matched against the full *normalized / absolute URL* of the resource + * being tested (substring matches are not good enough.) + * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters + * match themselves. + * - `*`: matches zero or more occurrences of any character other than one of the following 6 + * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use + * in a whitelist. + * - `**`: matches zero or more occurrences of *any* character. As such, it's not + * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g. + * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might + * not have been the intention.) Its usage at the very end of the path is ok. (e.g. + * http://foo.example.com/templates/**). + * - **RegExp** (*see caveat below*) + * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax + * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to + * accidentally introduce a bug when one updates a complex expression (imho, all regexes should + * have good test coverage.). For instance, the use of `.` in the regex is correct only in a + * small number of cases. A `.` character in the regex used when matching the scheme or a + * subdomain could be matched against a `:` or literal `.` that was likely not intended. It + * is highly recommended to use the string patterns and only fall back to regular expressions + * if they as a last resort. + * - The regular expression must be an instance of RegExp (i.e. not a string.) It is + * matched against the **entire** *normalized / absolute URL* of the resource being tested + * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags + * present on the RegExp (such as multiline, global, ignoreCase) are ignored. + * - If you are generating your JavaScript from some other templating engine (not + * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), + * remember to escape your regular expression (and be aware that you might need more than + * one level of escaping depending on your templating engine and the way you interpolated + * the value.) Do make use of your platform's escaping mechanism as it might be good + * enough before coding your own. e.g. Ruby has + * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) + * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). + * Javascript lacks a similar built in function for escaping. Take a look at Google + * Closure library's [goog.string.regExpEscape(s)]( + * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). + * + * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. + * + * ## Show me an example using SCE. + * + * + * + *
+ *

+ * User comments
+ * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when + * $sanitize is available. If $sanitize isn't available, this results in an error instead of an + * exploit. + *
+ *
+ * {{userComment.name}}: + * + *
+ *
+ *
+ *
+ *
+ * + * + * angular.module('mySceApp', ['ngSanitize']) + * .controller('AppController', ['$http', '$templateCache', '$sce', + * function($http, $templateCache, $sce) { + * var self = this; + * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { + * self.userComments = userComments; + * }); + * self.explicitlyTrustedHtml = $sce.trustAsHtml( + * 'Hover over this text.'); + * }]); + * + * + * + * [ + * { "name": "Alice", + * "htmlComment": + * "Is anyone reading this?" + * }, + * { "name": "Bob", + * "htmlComment": "Yes! Am I the only other one?" + * } + * ] + * + * + * + * describe('SCE doc demo', function() { + * it('should sanitize untrusted values', function() { + * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) + * .toBe('Is anyone reading this?'); + * }); + * + * it('should NOT sanitize explicitly trusted values', function() { + * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( + * 'Hover over this text.'); + * }); + * }); + * + *
+ * + * + * + * ## Can I disable SCE completely? + * + * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits + * for little coding overhead. It will be much harder to take an SCE disabled application and + * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE + * for cases where you have a lot of existing code that was written before SCE was introduced and + * you're migrating them a module at a time. + * + * That said, here's how you can completely disable SCE: + * + * ``` + * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { + * // Completely disable SCE. For demonstration purposes only! + * // Do not use in new projects. + * $sceProvider.enabled(false); + * }); + * ``` + * + */ +/* jshint maxlen: 100 */ + +function $SceProvider() { + var enabled = true; + + /** + * @ngdoc method + * @name $sceProvider#enabled + * @kind function + * + * @param {boolean=} value If provided, then enables/disables SCE. + * @return {boolean} true if SCE is enabled, false otherwise. + * + * @description + * Enables/disables SCE and returns the current value. + */ + this.enabled = function(value) { + if (arguments.length) { + enabled = !!value; + } + return enabled; + }; + + + /* Design notes on the default implementation for SCE. + * + * The API contract for the SCE delegate + * ------------------------------------- + * The SCE delegate object must provide the following 3 methods: + * + * - trustAs(contextEnum, value) + * This method is used to tell the SCE service that the provided value is OK to use in the + * contexts specified by contextEnum. It must return an object that will be accepted by + * getTrusted() for a compatible contextEnum and return this value. + * + * - valueOf(value) + * For values that were not produced by trustAs(), return them as is. For values that were + * produced by trustAs(), return the corresponding input value to trustAs. Basically, if + * trustAs is wrapping the given values into some type, this operation unwraps it when given + * such a value. + * + * - getTrusted(contextEnum, value) + * This function should return the a value that is safe to use in the context specified by + * contextEnum or throw and exception otherwise. + * + * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be + * opaque or wrapped in some holder object. That happens to be an implementation detail. For + * instance, an implementation could maintain a registry of all trusted objects by context. In + * such a case, trustAs() would return the same object that was passed in. getTrusted() would + * return the same object passed in if it was found in the registry under a compatible context or + * throw an exception otherwise. An implementation might only wrap values some of the time based + * on some criteria. getTrusted() might return a value and not throw an exception for special + * constants or objects even if not wrapped. All such implementations fulfill this contract. + * + * + * A note on the inheritance model for SCE contexts + * ------------------------------------------------ + * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This + * is purely an implementation details. + * + * The contract is simply this: + * + * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) + * will also succeed. + * + * Inheritance happens to capture this in a natural way. In some future, we + * may not use inheritance anymore. That is OK because no code outside of + * sce.js and sceSpecs.js would need to be aware of this detail. + */ + + this.$get = ['$parse', '$sceDelegate', function( + $parse, $sceDelegate) { + // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow + // the "expression(javascript expression)" syntax which is insecure. + if (enabled && msie < 8) { + throw $sceMinErr('iequirks', + 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + + 'mode. You can fix this by adding the text to the top of your HTML ' + + 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); + } + + var sce = shallowCopy(SCE_CONTEXTS); + + /** + * @ngdoc method + * @name $sce#isEnabled + * @kind function + * + * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you + * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. + * + * @description + * Returns a boolean indicating if SCE is enabled. + */ + sce.isEnabled = function() { + return enabled; + }; + sce.trustAs = $sceDelegate.trustAs; + sce.getTrusted = $sceDelegate.getTrusted; + sce.valueOf = $sceDelegate.valueOf; + + if (!enabled) { + sce.trustAs = sce.getTrusted = function(type, value) { return value; }; + sce.valueOf = identity; + } + + /** + * @ngdoc method + * @name $sce#parseAs + * + * @description + * Converts Angular {@link guide/expression expression} into a function. This is like {@link + * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it + * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, + * *result*)} + * + * @param {string} type The kind of SCE context in which this result will be used. + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + sce.parseAs = function sceParseAs(type, expr) { + var parsed = $parse(expr); + if (parsed.literal && parsed.constant) { + return parsed; + } else { + return $parse(expr, function(value) { + return sce.getTrusted(type, value); + }); + } + }; + + /** + * @ngdoc method + * @name $sce#trustAs + * + * @description + * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, + * returns an object that is trusted by angular for use in specified strict contextual + * escaping contexts (such as ng-bind-html, ng-include, any src attribute + * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) + * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual + * escaping. + * + * @param {string} type The kind of context in which this value is safe for use. e.g. url, + * resourceUrl, html, js and css. + * @param {*} value The value that that should be considered trusted/safe. + * @returns {*} A value that can be used to stand in for the provided `value` in places + * where Angular expects a $sce.trustAs() return value. + */ + + /** + * @ngdoc method + * @name $sce#trustAsHtml + * + * @description + * Shorthand method. `$sce.trustAsHtml(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml + * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsUrl + * + * @description + * Shorthand method. `$sce.trustAsUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl + * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsResourceUrl + * + * @description + * Shorthand method. `$sce.trustAsResourceUrl(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl + * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the return + * value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#trustAsJs + * + * @description + * Shorthand method. `$sce.trustAsJs(value)` → + * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} + * + * @param {*} value The value to trustAs. + * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs + * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives + * only accept expressions that are either literal constants or are the + * return value of {@link ng.$sce#trustAs $sce.trustAs}.) + */ + + /** + * @ngdoc method + * @name $sce#getTrusted + * + * @description + * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, + * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the + * originally supplied value if the queried context type is a supertype of the created type. + * If this condition isn't satisfied, throws an exception. + * + * @param {string} type The kind of context in which this value is to be used. + * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} + * call. + * @returns {*} The value the was originally provided to + * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. + * Otherwise, throws an exception. + */ + + /** + * @ngdoc method + * @name $sce#getTrustedHtml + * + * @description + * Shorthand method. `$sce.getTrustedHtml(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedCss + * + * @description + * Shorthand method. `$sce.getTrustedCss(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedUrl + * + * @description + * Shorthand method. `$sce.getTrustedUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedResourceUrl + * + * @description + * Shorthand method. `$sce.getTrustedResourceUrl(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} + * + * @param {*} value The value to pass to `$sceDelegate.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` + */ + + /** + * @ngdoc method + * @name $sce#getTrustedJs + * + * @description + * Shorthand method. `$sce.getTrustedJs(value)` → + * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} + * + * @param {*} value The value to pass to `$sce.getTrusted`. + * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` + */ + + /** + * @ngdoc method + * @name $sce#parseAsHtml + * + * @description + * Shorthand method. `$sce.parseAsHtml(expression string)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsCss + * + * @description + * Shorthand method. `$sce.parseAsCss(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsUrl + * + * @description + * Shorthand method. `$sce.parseAsUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsResourceUrl + * + * @description + * Shorthand method. `$sce.parseAsResourceUrl(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + /** + * @ngdoc method + * @name $sce#parseAsJs + * + * @description + * Shorthand method. `$sce.parseAsJs(value)` → + * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} + * + * @param {string} expression String expression to compile. + * @returns {function(context, locals)} a function which represents the compiled expression: + * + * * `context` – `{object}` – an object against which any expressions embedded in the strings + * are evaluated against (typically a scope object). + * * `locals` – `{object=}` – local variables context object, useful for overriding values in + * `context`. + */ + + // Shorthand delegations. + var parse = sce.parseAs, + getTrusted = sce.getTrusted, + trustAs = sce.trustAs; + + forEach(SCE_CONTEXTS, function(enumValue, name) { + var lName = lowercase(name); + sce[camelCase("parse_as_" + lName)] = function(expr) { + return parse(enumValue, expr); + }; + sce[camelCase("get_trusted_" + lName)] = function(value) { + return getTrusted(enumValue, value); + }; + sce[camelCase("trust_as_" + lName)] = function(value) { + return trustAs(enumValue, value); + }; + }); + + return sce; + }]; +} + +/** + * !!! This is an undocumented "private" service !!! + * + * @name $sniffer + * @requires $window + * @requires $document + * + * @property {boolean} history Does the browser support html5 history api ? + * @property {boolean} transitions Does the browser support CSS transition events ? + * @property {boolean} animations Does the browser support CSS animation events ? + * + * @description + * This is very simple implementation of testing browser's features. + */ +function $SnifferProvider() { + this.$get = ['$window', '$document', function($window, $document) { + var eventSupport = {}, + android = + toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), + boxee = /Boxee/i.test(($window.navigator || {}).userAgent), + document = $document[0] || {}, + vendorPrefix, + vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, + bodyStyle = document.body && document.body.style, + transitions = false, + animations = false, + match; + + if (bodyStyle) { + for (var prop in bodyStyle) { + if (match = vendorRegex.exec(prop)) { + vendorPrefix = match[0]; + vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); + break; + } + } + + if (!vendorPrefix) { + vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; + } + + transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); + animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); + + if (android && (!transitions || !animations)) { + transitions = isString(bodyStyle.webkitTransition); + animations = isString(bodyStyle.webkitAnimation); + } + } + + + return { + // Android has history.pushState, but it does not update location correctly + // so let's not use the history API at all. + // http://code.google.com/p/android/issues/detail?id=17471 + // https://github.com/angular/angular.js/issues/904 + + // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has + // so let's not use the history API also + // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined + // jshint -W018 + history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), + // jshint +W018 + hasEvent: function(event) { + // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have + // it. In particular the event is not fired when backspace or delete key are pressed or + // when cut operation is performed. + // IE10+ implements 'input' event but it erroneously fires under various situations, + // e.g. when placeholder changes, or a form is focused. + if (event === 'input' && msie <= 11) return false; + + if (isUndefined(eventSupport[event])) { + var divElm = document.createElement('div'); + eventSupport[event] = 'on' + event in divElm; + } + + return eventSupport[event]; + }, + csp: csp(), + vendorPrefix: vendorPrefix, + transitions: transitions, + animations: animations, + android: android + }; + }]; +} + +var $compileMinErr = minErr('$compile'); + +/** + * @ngdoc service + * @name $templateRequest + * + * @description + * The `$templateRequest` service runs security checks then downloads the provided template using + * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request + * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the + * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the + * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted + * when `tpl` is of type string and `$templateCache` has the matching entry. + * + * @param {string|TrustedResourceUrl} tpl The HTTP request template URL + * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty + * + * @return {Promise} a promise for the HTTP response data of the given URL. + * + * @property {number} totalPendingRequests total amount of pending template requests being downloaded. + */ +function $TemplateRequestProvider() { + this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) { + function handleRequestFn(tpl, ignoreRequestError) { + handleRequestFn.totalPendingRequests++; + + // We consider the template cache holds only trusted templates, so + // there's no need to go through whitelisting again for keys that already + // are included in there. This also makes Angular accept any script + // directive, no matter its name. However, we still need to unwrap trusted + // types. + if (!isString(tpl) || !$templateCache.get(tpl)) { + tpl = $sce.getTrustedResourceUrl(tpl); + } + + var transformResponse = $http.defaults && $http.defaults.transformResponse; + + if (isArray(transformResponse)) { + transformResponse = transformResponse.filter(function(transformer) { + return transformer !== defaultHttpResponseTransform; + }); + } else if (transformResponse === defaultHttpResponseTransform) { + transformResponse = null; + } + + var httpOptions = { + cache: $templateCache, + transformResponse: transformResponse + }; + + return $http.get(tpl, httpOptions) + ['finally'](function() { + handleRequestFn.totalPendingRequests--; + }) + .then(function(response) { + $templateCache.put(tpl, response.data); + return response.data; + }, handleError); + + function handleError(resp) { + if (!ignoreRequestError) { + throw $compileMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})', + tpl, resp.status, resp.statusText); + } + return $q.reject(resp); + } + } + + handleRequestFn.totalPendingRequests = 0; + + return handleRequestFn; + }]; +} + +function $$TestabilityProvider() { + this.$get = ['$rootScope', '$browser', '$location', + function($rootScope, $browser, $location) { + + /** + * @name $testability + * + * @description + * The private $$testability service provides a collection of methods for use when debugging + * or by automated test and debugging tools. + */ + var testability = {}; + + /** + * @name $$testability#findBindings + * + * @description + * Returns an array of elements that are bound (via ng-bind or {{}}) + * to expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The binding expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. Filters and whitespace are ignored. + */ + testability.findBindings = function(element, expression, opt_exactMatch) { + var bindings = element.getElementsByClassName('ng-binding'); + var matches = []; + forEach(bindings, function(binding) { + var dataBinding = angular.element(binding).data('$binding'); + if (dataBinding) { + forEach(dataBinding, function(bindingName) { + if (opt_exactMatch) { + var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); + if (matcher.test(bindingName)) { + matches.push(binding); + } + } else { + if (bindingName.indexOf(expression) != -1) { + matches.push(binding); + } + } + }); + } + }); + return matches; + }; + + /** + * @name $$testability#findModels + * + * @description + * Returns an array of elements that are two-way found via ng-model to + * expressions matching the input. + * + * @param {Element} element The element root to search from. + * @param {string} expression The model expression to match. + * @param {boolean} opt_exactMatch If true, only returns exact matches + * for the expression. + */ + testability.findModels = function(element, expression, opt_exactMatch) { + var prefixes = ['ng-', 'data-ng-', 'ng\\:']; + for (var p = 0; p < prefixes.length; ++p) { + var attributeEquals = opt_exactMatch ? '=' : '*='; + var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; + var elements = element.querySelectorAll(selector); + if (elements.length) { + return elements; + } + } + }; + + /** + * @name $$testability#getLocation + * + * @description + * Shortcut for getting the location in a browser agnostic way. Returns + * the path, search, and hash. (e.g. /path?a=b#hash) + */ + testability.getLocation = function() { + return $location.url(); + }; + + /** + * @name $$testability#setLocation + * + * @description + * Shortcut for navigating to a location without doing a full page reload. + * + * @param {string} url The location url (path, search and hash, + * e.g. /path?a=b#hash) to go to. + */ + testability.setLocation = function(url) { + if (url !== $location.url()) { + $location.url(url); + $rootScope.$digest(); + } + }; + + /** + * @name $$testability#whenStable + * + * @description + * Calls the callback when $timeout and $http requests are completed. + * + * @param {function} callback + */ + testability.whenStable = function(callback) { + $browser.notifyWhenNoOutstandingRequests(callback); + }; + + return testability; + }]; +} + +function $TimeoutProvider() { + this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', + function($rootScope, $browser, $q, $$q, $exceptionHandler) { + + var deferreds = {}; + + + /** + * @ngdoc service + * @name $timeout + * + * @description + * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch + * block and delegates any exceptions to + * {@link ng.$exceptionHandler $exceptionHandler} service. + * + * The return value of calling `$timeout` is a promise, which will be resolved when + * the delay has passed and the timeout function, if provided, is executed. + * + * To cancel a timeout request, call `$timeout.cancel(promise)`. + * + * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to + * synchronously flush the queue of deferred functions. + * + * If you only want a promise that will be resolved after some specified delay + * then you can call `$timeout` without the `fn` function. + * + * @param {function()=} fn A function, whose execution should be delayed. + * @param {number=} [delay=0] Delay in milliseconds. + * @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} Promise that will be resolved when the timeout is reached. The value this + * promise will be resolved with is the return value of the `fn` function. + * + */ + function timeout(fn, delay, invokeApply) { + if (!isFunction(fn)) { + invokeApply = delay; + delay = fn; + fn = noop; + } + + var args = sliceArgs(arguments, 3), + skipApply = (isDefined(invokeApply) && !invokeApply), + deferred = (skipApply ? $$q : $q).defer(), + promise = deferred.promise, + timeoutId; + + timeoutId = $browser.defer(function() { + try { + deferred.resolve(fn.apply(null, args)); + } catch (e) { + deferred.reject(e); + $exceptionHandler(e); + } + finally { + delete deferreds[promise.$$timeoutId]; + } + + if (!skipApply) $rootScope.$apply(); + }, delay); + + promise.$$timeoutId = timeoutId; + deferreds[timeoutId] = deferred; + + return promise; + } + + + /** + * @ngdoc method + * @name $timeout#cancel + * + * @description + * Cancels a task associated with the `promise`. As a result of this, the promise will be + * resolved with a rejection. + * + * @param {Promise=} promise Promise returned by the `$timeout` function. + * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully + * canceled. + */ + timeout.cancel = function(promise) { + if (promise && promise.$$timeoutId in deferreds) { + deferreds[promise.$$timeoutId].reject('canceled'); + delete deferreds[promise.$$timeoutId]; + return $browser.defer.cancel(promise.$$timeoutId); + } + return false; + }; + + return timeout; + }]; +} + +// NOTE: The usage of window and document instead of $window and $document here is +// deliberate. This service depends on the specific behavior of anchor nodes created by the +// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and +// cause us to break tests. In addition, when the browser resolves a URL for XHR, it +// doesn't know about mocked locations and resolves URLs to the real document - which is +// exactly the behavior needed here. There is little value is mocking these out for this +// service. +var urlParsingNode = document.createElement("a"); +var originUrl = urlResolve(window.location.href); + + +/** + * + * Implementation Notes for non-IE browsers + * ---------------------------------------- + * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, + * results both in the normalizing and parsing of the URL. Normalizing means that a relative + * URL will be resolved into an absolute URL in the context of the application document. + * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related + * properties are all populated to reflect the normalized URL. This approach has wide + * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * + * Implementation Notes for IE + * --------------------------- + * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other + * browsers. However, the parsed components will not be set if the URL assigned did not specify + * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We + * work around that by performing the parsing in a 2nd step by taking a previously normalized + * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the + * properties such as protocol, hostname, port, etc. + * + * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one + * uses the inner HTML approach to assign the URL as part of an HTML snippet - + * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL. + * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception. + * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that + * method and IE < 8 is unsupported. + * + * References: + * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement + * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html + * http://url.spec.whatwg.org/#urlutils + * https://github.com/angular/angular.js/pull/2902 + * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ + * + * @kind function + * @param {string} url The URL to be parsed. + * @description Normalizes and parses a URL. + * @returns {object} Returns the normalized URL as a dictionary. + * + * | member name | Description | + * |---------------|----------------| + * | href | A normalized version of the provided URL if it was not an absolute URL | + * | protocol | The protocol including the trailing colon | + * | host | The host and port (if the port is non-default) of the normalizedUrl | + * | search | The search params, minus the question mark | + * | hash | The hash string, minus the hash symbol + * | hostname | The hostname + * | port | The port, without ":" + * | pathname | The pathname, beginning with "/" + * + */ +function urlResolve(url) { + var href = url; + + if (msie) { + // Normalize before parse. Refer Implementation Notes on why this is + // done in two steps on IE. + urlParsingNode.setAttribute("href", href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') + ? urlParsingNode.pathname + : '/' + urlParsingNode.pathname + }; +} + +/** + * Parse a request URL and determine whether this is a same-origin request as the application document. + * + * @param {string|object} requestUrl The url of the request as a string that will be resolved + * or a parsed URL object. + * @returns {boolean} Whether the request is for the same origin as the application document. + */ +function urlIsSameOrigin(requestUrl) { + var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; + return (parsed.protocol === originUrl.protocol && + parsed.host === originUrl.host); +} + +/** + * @ngdoc service + * @name $window + * + * @description + * A reference to the browser's `window` object. While `window` + * is globally available in JavaScript, it causes testability problems, because + * it is a global variable. In angular we always refer to it through the + * `$window` service, so it may be overridden, removed or mocked for testing. + * + * Expressions, like the one defined for the `ngClick` directive in the example + * below, are evaluated with respect to the current scope. Therefore, there is + * no risk of inadvertently coding in a dependency on a global value in such an + * expression. + * + * @example + + + +
+ + +
+
+ + it('should display the greeting in the input box', function() { + element(by.model('greeting')).sendKeys('Hello, E2E Tests'); + // If we click the button it will block the test runner + // element(':button').click(); + }); + +
+ */ +function $WindowProvider() { + this.$get = valueFn(window); +} + +/** + * @name $$cookieReader + * @requires $document + * + * @description + * This is a private service for reading cookies used by $http and ngCookies + * + * @return {Object} a key/value map of the current cookies + */ +function $$CookieReader($document) { + var rawDocument = $document[0] || {}; + var lastCookies = {}; + var lastCookieString = ''; + + function safeDecodeURIComponent(str) { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + } + + return function() { + var cookieArray, cookie, i, index, name; + var currentCookieString = rawDocument.cookie || ''; + + if (currentCookieString !== lastCookieString) { + lastCookieString = currentCookieString; + cookieArray = lastCookieString.split('; '); + lastCookies = {}; + + for (i = 0; i < cookieArray.length; i++) { + cookie = cookieArray[i]; + index = cookie.indexOf('='); + if (index > 0) { //ignore nameless cookies + name = safeDecodeURIComponent(cookie.substring(0, index)); + // the first value that is seen for a cookie is the most + // specific one. values for the same cookie name that + // follow are for less specific paths. + if (lastCookies[name] === undefined) { + lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); + } + } + } + } + return lastCookies; + }; +} + +$$CookieReader.$inject = ['$document']; + +function $$CookieReaderProvider() { + this.$get = $$CookieReader; +} + +/* global currencyFilter: true, + dateFilter: true, + filterFilter: true, + jsonFilter: true, + limitToFilter: true, + lowercaseFilter: true, + numberFilter: true, + orderByFilter: true, + uppercaseFilter: true, + */ + +/** + * @ngdoc provider + * @name $filterProvider + * @description + * + * Filters are just functions which transform input to an output. However filters need to be + * Dependency Injected. To achieve this a filter definition consists of a factory function which is + * annotated with dependencies and is responsible for creating a filter function. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ * + * ```js + * // Filter registration + * function MyModule($provide, $filterProvider) { + * // create a service to demonstrate injection (not always needed) + * $provide.value('greet', function(name){ + * return 'Hello ' + name + '!'; + * }); + * + * // register a filter factory which uses the + * // greet service to demonstrate DI. + * $filterProvider.register('greet', function(greet){ + * // return the filter function which uses the greet service + * // to generate salutation + * return function(text) { + * // filters need to be forgiving so check input validity + * return text && greet(text) || text; + * }; + * }); + * } + * ``` + * + * The filter function is registered with the `$injector` under the filter name suffix with + * `Filter`. + * + * ```js + * it('should be the same instance', inject( + * function($filterProvider) { + * $filterProvider.register('reverse', function(){ + * return ...; + * }); + * }, + * function($filter, reverseFilter) { + * expect($filter('reverse')).toBe(reverseFilter); + * }); + * ``` + * + * + * For more information about how angular filters work, and how to create your own filters, see + * {@link guide/filter Filters} in the Angular Developer Guide. + */ + +/** + * @ngdoc service + * @name $filter + * @kind function + * @description + * Filters are used for formatting data displayed to the user. + * + * The general syntax in templates is as follows: + * + * {{ expression [| filter_name[:parameter_value] ... ] }} + * + * @param {String} name Name of the filter function to retrieve + * @return {Function} the filter function + * @example + + +
+

{{ originalText }}

+

{{ filteredText }}

+
+
+ + + angular.module('filterExample', []) + .controller('MainCtrl', function($scope, $filter) { + $scope.originalText = 'hello'; + $scope.filteredText = $filter('uppercase')($scope.originalText); + }); + +
+ */ +$FilterProvider.$inject = ['$provide']; +function $FilterProvider($provide) { + var suffix = 'Filter'; + + /** + * @ngdoc method + * @name $filterProvider#register + * @param {string|Object} name Name of the filter function, or an object map of filters where + * the keys are the filter names and the values are the filter factories. + * + *
+ * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`. + * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace + * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores + * (`myapp_subsection_filterx`). + *
+ * @returns {Object} Registered filter instance, or if a map of filters was provided then a map + * of the registered filter instances. + */ + function register(name, factory) { + if (isObject(name)) { + var filters = {}; + forEach(name, function(filter, key) { + filters[key] = register(key, filter); + }); + return filters; + } else { + return $provide.factory(name + suffix, factory); + } + } + this.register = register; + + this.$get = ['$injector', function($injector) { + return function(name) { + return $injector.get(name + suffix); + }; + }]; + + //////////////////////////////////////// + + /* global + currencyFilter: false, + dateFilter: false, + filterFilter: false, + jsonFilter: false, + limitToFilter: false, + lowercaseFilter: false, + numberFilter: false, + orderByFilter: false, + uppercaseFilter: false, + */ + + register('currency', currencyFilter); + register('date', dateFilter); + register('filter', filterFilter); + register('json', jsonFilter); + register('limitTo', limitToFilter); + register('lowercase', lowercaseFilter); + register('number', numberFilter); + register('orderBy', orderByFilter); + register('uppercase', uppercaseFilter); +} + +/** + * @ngdoc filter + * @name filter + * @kind function + * + * @description + * Selects a subset of items from `array` and returns it as a new array. + * + * @param {Array} array The source array. + * @param {string|Object|function()} expression The predicate to be used for selecting items from + * `array`. + * + * Can be one of: + * + * - `string`: The string is used for matching against the contents of the `array`. All strings or + * objects with string properties in `array` that match this string will be returned. This also + * applies to nested object properties. + * The predicate can be negated by prefixing the string with `!`. + * + * - `Object`: A pattern object can be used to filter specific properties on objects contained + * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items + * which have property `name` containing "M" and property `phone` containing "1". A special + * property name `$` can be used (as in `{$:"text"}`) to accept a match against any + * property of the object or its nested object properties. That's equivalent to the simple + * substring match with a `string` as described above. The predicate can be negated by prefixing + * the string with `!`. + * For example `{name: "!M"}` predicate will return an array of items which have property `name` + * not containing "M". + * + * Note that a named property will match properties on the same level only, while the special + * `$` property will match properties on the same level or deeper. E.g. an array item like + * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but + * **will** be matched by `{$: 'John'}`. + * + * - `function(value, index, array)`: A predicate function can be used to write arbitrary filters. + * The function is called for each element of the array, with the element, its index, and + * the entire array itself as arguments. + * + * The final result is an array of those elements that the predicate returned true for. + * + * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in + * determining if the expected value (from the filter expression) and actual value (from + * the object in the array) should be considered a match. + * + * Can be one of: + * + * - `function(actual, expected)`: + * The function will be given the object value and the predicate value to compare and + * should return true if both values should be considered equal. + * + * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. + * This is essentially strict comparison of expected and actual. + * + * - `false|undefined`: A short hand for a function which will look for a substring match in case + * insensitive way. + * + * Primitive values are converted to strings. Objects are not compared against primitives, + * unless they have a custom `toString` method (e.g. `Date` objects). + * + * @example + + +
+ + + + + + + + +
NamePhone
{{friend.name}}{{friend.phone}}
+
+
+
+
+
+ + + + + + +
NamePhone
{{friendObj.name}}{{friendObj.phone}}
+
+ + var expectFriendNames = function(expectedNames, key) { + element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { + arr.forEach(function(wd, i) { + expect(wd.getText()).toMatch(expectedNames[i]); + }); + }); + }; + + it('should search across all fields when filtering with a string', function() { + var searchText = element(by.model('searchText')); + searchText.clear(); + searchText.sendKeys('m'); + expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); + + searchText.clear(); + searchText.sendKeys('76'); + expectFriendNames(['John', 'Julie'], 'friend'); + }); + + it('should search in specific fields when filtering with a predicate object', function() { + var searchAny = element(by.model('search.$')); + searchAny.clear(); + searchAny.sendKeys('i'); + expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); + }); + it('should use a equal comparison when comparator is true', function() { + var searchName = element(by.model('search.name')); + var strict = element(by.model('strict')); + searchName.clear(); + searchName.sendKeys('Julie'); + strict.click(); + expectFriendNames(['Julie'], 'friendObj'); + }); + +
+ */ +function filterFilter() { + return function(array, expression, comparator) { + if (!isArrayLike(array)) { + if (array == null) { + return array; + } else { + throw minErr('filter')('notarray', 'Expected array but received: {0}', array); + } + } + + var expressionType = getTypeForFilter(expression); + var predicateFn; + var matchAgainstAnyProp; + + switch (expressionType) { + case 'function': + predicateFn = expression; + break; + case 'boolean': + case 'null': + case 'number': + case 'string': + matchAgainstAnyProp = true; + //jshint -W086 + case 'object': + //jshint +W086 + predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp); + break; + default: + return array; + } + + return Array.prototype.filter.call(array, predicateFn); + }; +} + +// Helper functions for `filterFilter` +function createPredicateFn(expression, comparator, matchAgainstAnyProp) { + var shouldMatchPrimitives = isObject(expression) && ('$' in expression); + var predicateFn; + + if (comparator === true) { + comparator = equals; + } else if (!isFunction(comparator)) { + comparator = function(actual, expected) { + if (isUndefined(actual)) { + // No substring matching against `undefined` + return false; + } + if ((actual === null) || (expected === null)) { + // No substring matching against `null`; only match against `null` + return actual === expected; + } + if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) { + // Should not compare primitives against objects, unless they have custom `toString` method + return false; + } + + actual = lowercase('' + actual); + expected = lowercase('' + expected); + return actual.indexOf(expected) !== -1; + }; + } + + predicateFn = function(item) { + if (shouldMatchPrimitives && !isObject(item)) { + return deepCompare(item, expression.$, comparator, false); + } + return deepCompare(item, expression, comparator, matchAgainstAnyProp); + }; + + return predicateFn; +} + +function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { + var actualType = getTypeForFilter(actual); + var expectedType = getTypeForFilter(expected); + + if ((expectedType === 'string') && (expected.charAt(0) === '!')) { + return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); + } else if (isArray(actual)) { + // In case `actual` is an array, consider it a match + // if ANY of it's items matches `expected` + return actual.some(function(item) { + return deepCompare(item, expected, comparator, matchAgainstAnyProp); + }); + } + + switch (actualType) { + case 'object': + var key; + if (matchAgainstAnyProp) { + for (key in actual) { + if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { + return true; + } + } + return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); + } else if (expectedType === 'object') { + for (key in expected) { + var expectedVal = expected[key]; + if (isFunction(expectedVal) || isUndefined(expectedVal)) { + continue; + } + + var matchAnyProperty = key === '$'; + var actualVal = matchAnyProperty ? actual : actual[key]; + if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { + return false; + } + } + return true; + } else { + return comparator(actual, expected); + } + break; + case 'function': + return false; + default: + return comparator(actual, expected); + } +} + +// Used for easily differentiating between `null` and actual `object` +function getTypeForFilter(val) { + return (val === null) ? 'null' : typeof val; +} + +/** + * @ngdoc filter + * @name currency + * @kind function + * + * @description + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default + * symbol for current locale is used. + * + * @param {number} amount Input to filter. + * @param {string=} symbol Currency symbol or identifier to be displayed. + * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale + * @returns {string} Formatted number. + * + * + * @example + + + +
+
+ default currency symbol ($): {{amount | currency}}
+ custom currency identifier (USD$): {{amount | currency:"USD$"}} + no fractions (0): {{amount | currency:"USD$":0}} +
+
+ + it('should init with 1234.56', function() { + expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); + expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); + }); + it('should update', function() { + if (browser.params.browser == 'safari') { + // Safari does not understand the minus key. See + // https://github.com/angular/protractor/issues/481 + return; + } + element(by.model('amount')).clear(); + element(by.model('amount')).sendKeys('-1234'); + expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)'); + expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)'); + expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)'); + }); + +
+ */ +currencyFilter.$inject = ['$locale']; +function currencyFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(amount, currencySymbol, fractionSize) { + if (isUndefined(currencySymbol)) { + currencySymbol = formats.CURRENCY_SYM; + } + + if (isUndefined(fractionSize)) { + fractionSize = formats.PATTERNS[1].maxFrac; + } + + // if null or undefined pass it through + return (amount == null) + ? amount + : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). + replace(/\u00A4/g, currencySymbol); + }; +} + +/** + * @ngdoc filter + * @name number + * @kind function + * + * @description + * Formats a number as text. + * + * If the input is null or undefined, it will just be returned. + * If the input is infinite (Infinity/-Infinity) the Infinity symbol '∞' is returned. + * If the input is not a number an empty string is returned. + * + * + * @param {number|string} number Number to format. + * @param {(number|string)=} fractionSize Number of decimal places to round the number to. + * If this is not provided then the fraction size is computed from the current locale's number + * formatting pattern. In the case of the default locale, it will be 3. + * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. + * + * @example + + + +
+
+ Default formatting: {{val | number}}
+ No fractions: {{val | number:0}}
+ Negative number: {{-val | number:4}} +
+
+ + it('should format numbers', function() { + expect(element(by.id('number-default')).getText()).toBe('1,234.568'); + expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); + }); + + it('should update', function() { + element(by.model('val')).clear(); + element(by.model('val')).sendKeys('3374.333'); + expect(element(by.id('number-default')).getText()).toBe('3,374.333'); + expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); + expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); + }); + +
+ */ + + +numberFilter.$inject = ['$locale']; +function numberFilter($locale) { + var formats = $locale.NUMBER_FORMATS; + return function(number, fractionSize) { + + // if null or undefined pass it through + return (number == null) + ? number + : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, + fractionSize); + }; +} + +var DECIMAL_SEP = '.'; +function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { + if (isObject(number)) return ''; + + var isNegative = number < 0; + number = Math.abs(number); + + var isInfinity = number === Infinity; + if (!isInfinity && !isFinite(number)) return ''; + + var numStr = number + '', + formatedText = '', + hasExponent = false, + parts = []; + + if (isInfinity) formatedText = '\u221e'; + + if (!isInfinity && numStr.indexOf('e') !== -1) { + var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); + if (match && match[2] == '-' && match[3] > fractionSize + 1) { + number = 0; + } else { + formatedText = numStr; + hasExponent = true; + } + } + + if (!isInfinity && !hasExponent) { + var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; + + // determine fractionSize if it is not specified + if (isUndefined(fractionSize)) { + fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); + } + + // safely round numbers in JS without hitting imprecisions of floating-point arithmetics + // inspired by: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round + number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); + + var fraction = ('' + number).split(DECIMAL_SEP); + var whole = fraction[0]; + fraction = fraction[1] || ''; + + var i, pos = 0, + lgroup = pattern.lgSize, + group = pattern.gSize; + + if (whole.length >= (lgroup + group)) { + pos = whole.length - lgroup; + for (i = 0; i < pos; i++) { + if ((pos - i) % group === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + } + + for (i = pos; i < whole.length; i++) { + if ((whole.length - i) % lgroup === 0 && i !== 0) { + formatedText += groupSep; + } + formatedText += whole.charAt(i); + } + + // format fraction part. + while (fraction.length < fractionSize) { + fraction += '0'; + } + + if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); + } else { + if (fractionSize > 0 && number < 1) { + formatedText = number.toFixed(fractionSize); + number = parseFloat(formatedText); + } + } + + if (number === 0) { + isNegative = false; + } + + parts.push(isNegative ? pattern.negPre : pattern.posPre, + formatedText, + isNegative ? pattern.negSuf : pattern.posSuf); + return parts.join(''); +} + +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; +} + + +function dateGetter(name, size, offset, trim) { + offset = offset || 0; + return function(date) { + var value = date['get' + name](); + if (offset > 0 || value > -offset) { + value += offset; + } + if (value === 0 && offset == -12) value = 12; + return padNumber(value, size, trim); + }; +} + +function dateStrGetter(name, shortForm) { + return function(date, formats) { + var value = date['get' + name](); + var get = uppercase(shortForm ? ('SHORT' + name) : name); + + return formats[get][value]; + }; +} + +function timeZoneGetter(date, formats, offset) { + var zone = -1 * offset; + var paddedZone = (zone >= 0) ? "+" : ""; + + paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + + padNumber(Math.abs(zone % 60), 2); + + return paddedZone; +} + +function getFirstThursdayOfYear(year) { + // 0 = index of January + var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); + // 4 = index of Thursday (+1 to account for 1st = 5) + // 11 = index of *next* Thursday (+1 account for 1st = 12) + return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); +} + +function getThursdayThisWeek(datetime) { + return new Date(datetime.getFullYear(), datetime.getMonth(), + // 4 = index of Thursday + datetime.getDate() + (4 - datetime.getDay())); +} + +function weekGetter(size) { + return function(date) { + var firstThurs = getFirstThursdayOfYear(date.getFullYear()), + thisThurs = getThursdayThisWeek(date); + + var diff = +thisThurs - +firstThurs, + result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week + + return padNumber(result, size); + }; +} + +function ampmGetter(date, formats) { + return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; +} + +function eraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1]; +} + +function longEraGetter(date, formats) { + return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1]; +} + +var DATE_FORMATS = { + yyyy: dateGetter('FullYear', 4), + yy: dateGetter('FullYear', 2, 0, true), + y: dateGetter('FullYear', 1), + MMMM: dateStrGetter('Month'), + MMM: dateStrGetter('Month', true), + MM: dateGetter('Month', 2, 1), + M: dateGetter('Month', 1, 1), + dd: dateGetter('Date', 2), + d: dateGetter('Date', 1), + HH: dateGetter('Hours', 2), + H: dateGetter('Hours', 1), + hh: dateGetter('Hours', 2, -12), + h: dateGetter('Hours', 1, -12), + mm: dateGetter('Minutes', 2), + m: dateGetter('Minutes', 1), + ss: dateGetter('Seconds', 2), + s: dateGetter('Seconds', 1), + // while ISO 8601 requires fractions to be prefixed with `.` or `,` + // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions + sss: dateGetter('Milliseconds', 3), + EEEE: dateStrGetter('Day'), + EEE: dateStrGetter('Day', true), + a: ampmGetter, + Z: timeZoneGetter, + ww: weekGetter(2), + w: weekGetter(1), + G: eraGetter, + GG: eraGetter, + GGG: eraGetter, + GGGG: longEraGetter +}; + +var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/, + NUMBER_STRING = /^\-?\d+$/; + +/** + * @ngdoc filter + * @name date + * @kind function + * + * @description + * Formats `date` to a string based on the requested `format`. + * + * `format` string can be composed of the following elements: + * + * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) + * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) + * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) + * * `'MMMM'`: Month in year (January-December) + * * `'MMM'`: Month in year (Jan-Dec) + * * `'MM'`: Month in year, padded (01-12) + * * `'M'`: Month in year (1-12) + * * `'dd'`: Day in month, padded (01-31) + * * `'d'`: Day in month (1-31) + * * `'EEEE'`: Day in Week,(Sunday-Saturday) + * * `'EEE'`: Day in Week, (Sun-Sat) + * * `'HH'`: Hour in day, padded (00-23) + * * `'H'`: Hour in day (0-23) + * * `'hh'`: Hour in AM/PM, padded (01-12) + * * `'h'`: Hour in AM/PM, (1-12) + * * `'mm'`: Minute in hour, padded (00-59) + * * `'m'`: Minute in hour (0-59) + * * `'ss'`: Second in minute, padded (00-59) + * * `'s'`: Second in minute (0-59) + * * `'sss'`: Millisecond in second, padded (000-999) + * * `'a'`: AM/PM marker + * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) + * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year + * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year + * * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD') + * * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini') + * + * `format` string can also be one of the following predefined + * {@link guide/i18n localizable formats}: + * + * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale + * (e.g. Sep 3, 2010 12:05:08 PM) + * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) + * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale + * (e.g. Friday, September 3, 2010) + * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) + * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) + * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) + * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) + * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) + * + * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. + * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence + * (e.g. `"h 'o''clock'"`). + * + * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or + * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its + * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is + * specified in the string input, the time is considered to be in the local timezone. + * @param {string=} format Formatting rules (see Description). If not specified, + * `mediumDate` is used. + * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the + * continental US time zone abbreviations, but for general use, use a time zone offset, for + * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian) + * If not specified, the timezone of the browser will be used. + * @returns {string} Formatted string or the input if input is not recognized as date/millis. + * + * @example + + + {{1288323623006 | date:'medium'}}: + {{1288323623006 | date:'medium'}}
+ {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: + {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
+ {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: + {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
+ {{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: + {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
+
+ + it('should format date', function() { + expect(element(by.binding("1288323623006 | date:'medium'")).getText()). + toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); + expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). + toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); + expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). + toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); + expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). + toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); + }); + +
+ */ +dateFilter.$inject = ['$locale']; +function dateFilter($locale) { + + + var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; + // 1 2 3 4 5 6 7 8 9 10 11 + function jsonStringToDate(string) { + var match; + if (match = string.match(R_ISO8601_STR)) { + var date = new Date(0), + tzHour = 0, + tzMin = 0, + dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, + timeSetter = match[8] ? date.setUTCHours : date.setHours; + + if (match[9]) { + tzHour = toInt(match[9] + match[10]); + tzMin = toInt(match[9] + match[11]); + } + dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3])); + var h = toInt(match[4] || 0) - tzHour; + var m = toInt(match[5] || 0) - tzMin; + var s = toInt(match[6] || 0); + var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); + timeSetter.call(date, h, m, s, ms); + return date; + } + return string; + } + + + return function(date, format, timezone) { + var text = '', + parts = [], + fn, match; + + format = format || 'mediumDate'; + format = $locale.DATETIME_FORMATS[format] || format; + if (isString(date)) { + date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date); + } + + if (isNumber(date)) { + date = new Date(date); + } + + if (!isDate(date) || !isFinite(date.getTime())) { + return date; + } + + while (format) { + match = DATE_FORMATS_SPLIT.exec(format); + if (match) { + parts = concat(parts, match, 1); + format = parts.pop(); + } else { + parts.push(format); + format = null; + } + } + + var dateTimezoneOffset = date.getTimezoneOffset(); + if (timezone) { + dateTimezoneOffset = timezoneToOffset(timezone, date.getTimezoneOffset()); + date = convertTimezoneToLocal(date, timezone, true); + } + forEach(parts, function(value) { + fn = DATE_FORMATS[value]; + text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset) + : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); + }); + + return text; + }; +} + + +/** + * @ngdoc filter + * @name json + * @kind function + * + * @description + * Allows you to convert a JavaScript object into JSON string. + * + * This filter is mostly useful for debugging. When using the double curly {{value}} notation + * the binding is automatically converted to JSON. + * + * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. + * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. + * @returns {string} JSON string. + * + * + * @example + + +
{{ {'name':'value'} | json }}
+
{{ {'name':'value'} | json:4 }}
+
+ + it('should jsonify filtered objects', function() { + expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); + }); + +
+ * + */ +function jsonFilter() { + return function(object, spacing) { + if (isUndefined(spacing)) { + spacing = 2; + } + return toJson(object, spacing); + }; +} + + +/** + * @ngdoc filter + * @name lowercase + * @kind function + * @description + * Converts string to lowercase. + * @see angular.lowercase + */ +var lowercaseFilter = valueFn(lowercase); + + +/** + * @ngdoc filter + * @name uppercase + * @kind function + * @description + * Converts string to uppercase. + * @see angular.uppercase + */ +var uppercaseFilter = valueFn(uppercase); + +/** + * @ngdoc filter + * @name limitTo + * @kind function + * + * @description + * Creates a new array or string containing only a specified number of elements. The elements + * are taken from either the beginning or the end of the source array, string or number, as specified by + * the value and sign (positive or negative) of `limit`. If a number is used as input, it is + * converted to a string. + * + * @param {Array|string|number} input Source array, string or number to be limited. + * @param {string|number} limit The length of the returned array or string. If the `limit` number + * is positive, `limit` number of items from the beginning of the source array/string are copied. + * If the number is negative, `limit` number of items from the end of the source array/string + * are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined, + * the input will be returned unchanged. + * @param {(string|number)=} begin Index at which to begin limitation. As a negative index, `begin` + * indicates an offset from the end of `input`. Defaults to `0`. + * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array + * had less than `limit` elements. + * + * @example + + + +
+ +

Output numbers: {{ numbers | limitTo:numLimit }}

+ +

Output letters: {{ letters | limitTo:letterLimit }}

+ +

Output long number: {{ longNumber | limitTo:longNumberLimit }}

+
+
+ + var numLimitInput = element(by.model('numLimit')); + var letterLimitInput = element(by.model('letterLimit')); + var longNumberLimitInput = element(by.model('longNumberLimit')); + var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); + var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); + var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); + + it('should limit the number array to first three items', function() { + expect(numLimitInput.getAttribute('value')).toBe('3'); + expect(letterLimitInput.getAttribute('value')).toBe('3'); + expect(longNumberLimitInput.getAttribute('value')).toBe('3'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); + expect(limitedLetters.getText()).toEqual('Output letters: abc'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); + }); + + // There is a bug in safari and protractor that doesn't like the minus key + // it('should update the output when -3 is entered', function() { + // numLimitInput.clear(); + // numLimitInput.sendKeys('-3'); + // letterLimitInput.clear(); + // letterLimitInput.sendKeys('-3'); + // longNumberLimitInput.clear(); + // longNumberLimitInput.sendKeys('-3'); + // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); + // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); + // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); + // }); + + it('should not exceed the maximum size of input array', function() { + numLimitInput.clear(); + numLimitInput.sendKeys('100'); + letterLimitInput.clear(); + letterLimitInput.sendKeys('100'); + longNumberLimitInput.clear(); + longNumberLimitInput.sendKeys('100'); + expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); + expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); + expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); + }); + +
+*/ +function limitToFilter() { + return function(input, limit, begin) { + if (Math.abs(Number(limit)) === Infinity) { + limit = Number(limit); + } else { + limit = toInt(limit); + } + if (isNaN(limit)) return input; + + if (isNumber(input)) input = input.toString(); + if (!isArray(input) && !isString(input)) return input; + + begin = (!begin || isNaN(begin)) ? 0 : toInt(begin); + begin = (begin < 0 && begin >= -input.length) ? input.length + begin : begin; + + if (limit >= 0) { + return input.slice(begin, begin + limit); + } else { + if (begin === 0) { + return input.slice(limit, input.length); + } else { + return input.slice(Math.max(0, begin + limit), begin); + } + } + }; +} + +/** + * @ngdoc filter + * @name orderBy + * @kind function + * + * @description + * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically + * for strings and numerically for numbers. Note: if you notice numbers are not being sorted + * as expected, make sure they are actually being saved as numbers and not strings. + * + * @param {Array} array The array to sort. + * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be + * used by the comparator to determine the order of elements. + * + * Can be one of: + * + * - `function`: Getter function. The result of this function will be sorted using the + * `<`, `===`, `>` operator. + * - `string`: An Angular expression. The result of this expression is used to compare elements + * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by + * 3 first characters of a property called `name`). The result of a constant expression + * is interpreted as a property name to be used in comparisons (for example `"special name"` + * to sort object by the value of their `special name` property). An expression can be + * optionally prefixed with `+` or `-` to control ascending or descending sort order + * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array + * element itself is used to compare where sorting. + * - `Array`: An array of function or string predicates. The first predicate in the array + * is used for sorting, but when two items are equivalent, the next predicate is used. + * + * If the predicate is missing or empty then it defaults to `'+'`. + * + * @param {boolean=} reverse Reverse the order of the array. + * @returns {Array} Sorted copy of the source array. + * + * + * @example + * The example below demonstrates a simple ngRepeat, where the data is sorted + * by age in descending order (predicate is set to `'-age'`). + * `reverse` is not set, which means it defaults to `false`. + + + +
+ + + + + + + + + + + +
NamePhone NumberAge
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+
+ * + * The predicate and reverse parameters can be controlled dynamically through scope properties, + * as shown in the next example. + * @example + + + + +
+
Sorting predicate = {{predicate}}; reverse = {{reverse}}
+
+ [ unsorted ] + + + + + + + + + + + +
+ Name + + + Phone Number + + + Age + +
{{friend.name}}{{friend.phone}}{{friend.age}}
+
+
+
+ * + * 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}}
+
+
+ + + 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); + }]); + +
+ */ +orderByFilter.$inject = ['$parse']; +function orderByFilter($parse) { + return function(array, sortPredicate, reverseOrder) { + + if (!(isArrayLike(array))) return array; + + if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; } + if (sortPredicate.length === 0) { sortPredicate = ['+']; } + + var predicates = processPredicates(sortPredicate, reverseOrder); + + // The next three lines are a version of a Swartzian Transform idiom from Perl + // (sometimes called the Decorate-Sort-Undecorate idiom) + // See https://en.wikipedia.org/wiki/Schwartzian_transform + var compareValues = Array.prototype.map.call(array, getComparisonObject); + compareValues.sort(doComparison); + array = compareValues.map(function(item) { return item.value; }); + + return array; + + function getComparisonObject(value, index) { + return { + value: value, + predicateValues: predicates.map(function(predicate) { + return getPredicateValue(predicate.get(value), index); + }) + }; + } + + 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; + } + return result; + } + }; + + function processPredicates(sortPredicate, reverseOrder) { + reverseOrder = reverseOrder ? -1 : 1; + return sortPredicate.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; + predicate = predicate.substring(1); + } + if (predicate !== '') { + get = $parse(predicate); + if (get.constant) { + var key = get(); + get = function(value) { return value[key]; }; + } + } + } + return { get: get, descending: descending * reverseOrder }; + }); + } + + function isPrimitive(value) { + switch (typeof value) { + case 'number': /* falls through */ + case 'boolean': /* falls through */ + case 'string': + return true; + default: + return false; + } + } + + function objectValue(value, index) { + // If `valueOf` is a valid function use that + if (typeof value.valueOf === 'function') { + value = value.valueOf(); + if (isPrimitive(value)) return value; + } + // If `toString` is a valid function and not the one from `Object.prototype` use that + if (hasCustomToString(value)) { + 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; + } + + function getPredicateValue(value, index) { + var type = typeof value; + if (value === null) { + type = 'string'; + value = 'null'; + } else if (type === 'string') { + value = value.toLowerCase(); + } else if (type === 'object') { + value = objectValue(value, index); + } + return { value: value, type: type }; + } + + function compare(v1, v2) { + var result = 0; + if (v1.type === v2.type) { + if (v1.value !== v2.value) { + result = v1.value < v2.value ? -1 : 1; + } + } else { + result = v1.type < v2.type ? -1 : 1; + } + return result; + } +} + +function ngDirective(directive) { + if (isFunction(directive)) { + directive = { + link: directive + }; + } + directive.restrict = directive.restrict || 'AC'; + return valueFn(directive); +} + +/** + * @ngdoc directive + * @name a + * @restrict E + * + * @description + * 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` + */ +var htmlAnchorDirective = valueFn({ + restrict: 'E', + compile: function(element, attr) { + if (!attr.href && !attr.xlinkHref) { + return function(scope, element) { + // If the linked element is not an anchor tag anymore, do nothing + if (element[0].nodeName.toLowerCase() !== 'a') return; + + // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. + var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? + 'xlink:href' : 'href'; + element.on('click', function(event) { + // if we have no href url, then don't navigate anywhere. + if (!element.attr(href)) { + event.preventDefault(); + } + }); + }; + } + } +}); + +/** + * @ngdoc directive + * @name ngHref + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in an href attribute will + * make the link go to the wrong URL if the user clicks it before + * Angular has a chance to replace the `{{hash}}` markup with its + * value. Until Angular replaces the markup the link will be broken + * and will most likely return a 404 error. The `ngHref` directive + * solves this problem. + * + * The wrong way to write it: + * ```html + * link1 + * ``` + * + * The correct way to write it: + * ```html + * link1 + * ``` + * + * @element A + * @param {template} ngHref any string which can contain `{{}}` markup. + * + * @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)
+ link 2 (link, don't reload)
+ link 3 (link, reload!)
+ anchor (link, don't reload)
+ anchor (no link)
+ link (link, change location) +
+ + it('should execute ng-click but not reload when href without value', function() { + element(by.id('link-1')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('1'); + expect(element(by.id('link-1')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when href empty string', function() { + element(by.id('link-2')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('2'); + expect(element(by.id('link-2')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click and change url when ng-href specified', function() { + expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); + + element(by.id('link-3')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/123$/); + }); + }, 5000, 'page should navigate to /123'); + }); + + it('should execute ng-click but not reload when href empty string and name specified', function() { + element(by.id('link-4')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('4'); + expect(element(by.id('link-4')).getAttribute('href')).toBe(''); + }); + + it('should execute ng-click but not reload when no href but name specified', function() { + element(by.id('link-5')).click(); + expect(element(by.model('value')).getAttribute('value')).toEqual('5'); + expect(element(by.id('link-5')).getAttribute('href')).toBe(null); + }); + + it('should only change url when only ng-href', function() { + element(by.model('value')).clear(); + element(by.model('value')).sendKeys('6'); + expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); + + element(by.id('link-6')).click(); + + // At this point, we navigate away from an Angular page, so we need + // to use browser.driver to get the base webdriver. + browser.wait(function() { + return browser.driver.getCurrentUrl().then(function(url) { + return url.match(/\/6$/); + }); + }, 5000, 'page should navigate to /6'); + }); + +
+ */ + +/** + * @ngdoc directive + * @name ngSrc + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `src` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrc` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrc any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngSrcset + * @restrict A + * @priority 99 + * + * @description + * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't + * work right: The browser will fetch from the URL with the literal + * text `{{hash}}` until Angular replaces the expression inside + * `{{hash}}`. The `ngSrcset` directive solves this problem. + * + * The buggy way to write it: + * ```html + * Description + * ``` + * + * The correct way to write it: + * ```html + * Description + * ``` + * + * @element IMG + * @param {template} ngSrcset any string which can contain `{{}}` markup. + */ + +/** + * @ngdoc directive + * @name ngDisabled + * @restrict A + * @priority 100 + * + * @description + * + * This directive sets the `disabled` attribute on the element if the + * {@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. + * + * @example + + +
+ +
+ + it('should toggle button', function() { + expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, + * then the `disabled` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngChecked + * @restrict A + * @priority 100 + * + * @description + * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy. + * + * 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`? + * + * 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 + + +
+ +
+ + it('should check both checkBoxes', function() { + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); + element(by.model('master')).click(); + expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, + * then the `checked` attribute will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngReadonly + * @restrict A + * @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. + * @example + + +
+ +
+ + it('should toggle readonly attr', function() { + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); + element(by.model('checked')).click(); + expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); + }); + +
+ * + * @element INPUT + * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, + * then special attribute "readonly" will be set on the element + */ + + +/** + * @ngdoc directive + * @name ngSelected + * @restrict A + * @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. + * + * @example + + +
+ +
+ + it('should select Greetings!', function() { + expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); + element(by.model('selected')).click(); + expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); + }); + +
+ * + * @element OPTION + * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, + * then special attribute "selected" will be set on the element + */ + +/** + * @ngdoc directive + * @name ngOpen + * @restrict A + * @priority 100 + * + * @description + * The HTML specification does not require browsers to preserve the values of boolean attributes + * such as open. (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 `ngOpen` directive solves this problem for the `open` attribute. + * This complementary directive is not removed by the browser and so provides + * a permanent reliable place to store the binding information. + * @example + + +
+
+ Show/Hide me +
+
+ + it('should toggle open', function() { + expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); + element(by.model('open')).click(); + expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); + }); + +
+ * + * @element DETAILS + * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, + * then special attribute "open" will be set on the element + */ + +var ngAttributeAliasDirectives = {}; + +// boolean attrs are evaluated +forEach(BOOLEAN_ATTR, function(propName, attrName) { + // binding to multiple is not supported + if (propName == "multiple") return; + + function defaultLinkFn(scope, element, attr) { + scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { + attr.$set(attrName, !!value); + }); + } + + var normalized = directiveNormalize('ng-' + attrName); + var linkFn = defaultLinkFn; + + if (propName === 'checked') { + linkFn = function(scope, element, attr) { + // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input + if (attr.ngModel !== attr[normalized]) { + defaultLinkFn(scope, element, attr); + } + }; + } + + ngAttributeAliasDirectives[normalized] = function() { + return { + restrict: 'A', + priority: 100, + link: linkFn + }; + }; +}); + +// aliased input attrs are evaluated +forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { + ngAttributeAliasDirectives[ngAttr] = function() { + return { + priority: 100, + 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) == "/") { + var match = attr.ngPattern.match(REGEX_STRING_REGEXP); + if (match) { + attr.$set("ngPattern", new RegExp(match[1], match[2])); + return; + } + } + + scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { + attr.$set(ngAttr, value); + }); + } + }; + }; +}); + +// ng-src, ng-srcset, ng-href are interpolated +forEach(['src', 'srcset', 'href'], function(attrName) { + var normalized = directiveNormalize('ng-' + attrName); + ngAttributeAliasDirectives[normalized] = function() { + return { + priority: 99, // it needs to run after the attributes are interpolated + link: function(scope, element, attr) { + var propName = attrName, + name = attrName; + + if (attrName === 'href' && + toString.call(element.prop('href')) === '[object SVGAnimatedString]') { + name = 'xlinkHref'; + attr.$attr[name] = 'xlink:href'; + propName = null; + } + + attr.$observe(normalized, function(value) { + if (!value) { + if (attrName === 'href') { + attr.$set(name, null); + } + return; + } + + attr.$set(name, value); + + // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist + // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need + // to set the property as well to achieve the desired effect. + // we use attr[attrName] value since $set can sanitize the url. + if (msie && propName) element.prop(propName, attr[name]); + }); + } + }; + }; +}); + +/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true + */ +var nullFormCtrl = { + $addControl: noop, + $$renameControl: nullFormRenameControl, + $removeControl: noop, + $setValidity: noop, + $setDirty: noop, + $setPristine: noop, + $setSubmitted: noop +}, +SUBMITTED_CLASS = 'ng-submitted'; + +function nullFormRenameControl(control, name) { + control.$name = name; +} + +/** + * @ngdoc type + * @name form.FormController + * + * @property {boolean} $pristine True if user has not interacted with the form yet. + * @property {boolean} $dirty True if user has already interacted with the form. + * @property {boolean} $valid True if all of the containing forms and controls are valid. + * @property {boolean} $invalid True if at least one containing control or form is invalid. + * @property {boolean} $submitted True if user has submitted the form even if its invalid. + * + * @property {Object} $error Is an object hash, containing references to controls or + * forms with failing validators, where: + * + * - keys are validation tokens (error names), + * - values are arrays of controls or forms that have a failing validator for given error name. + * + * Built-in validation tokens: + * + * - `email` + * - `max` + * - `maxlength` + * - `min` + * - `minlength` + * - `number` + * - `pattern` + * - `required` + * - `url` + * - `date` + * - `datetimelocal` + * - `time` + * - `week` + * - `month` + * + * @description + * `FormController` keeps track of all its controls and nested forms as well as the state of them, + * such as being valid/invalid or dirty/pristine. + * + * Each {@link ng.directive:form form} directive creates an instance + * of `FormController`. + * + */ +//asks for $scope to fool the BC controller module +FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; +function FormController(element, attrs, $scope, $animate, $interpolate) { + var form = this, + controls = []; + + var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl; + + // init state + form.$error = {}; + form.$$success = {}; + form.$pending = undefined; + form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); + form.$dirty = false; + form.$pristine = true; + form.$valid = true; + form.$invalid = false; + form.$submitted = false; + + parentForm.$addControl(form); + + /** + * @ngdoc method + * @name form.FormController#$rollbackViewValue + * + * @description + * Rollback all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is typically needed by the reset button of + * a form that uses `ng-model-options` to pend updates. + */ + form.$rollbackViewValue = function() { + forEach(controls, function(control) { + control.$rollbackViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$commitViewValue + * + * @description + * Commit all form controls pending updates to the `$modelValue`. + * + * Updates may be pending by a debounced event or because the input is waiting for a some future + * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` + * usually handles calling this in response to input events. + */ + form.$commitViewValue = function() { + forEach(controls, function(control) { + control.$commitViewValue(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$addControl + * + * @description + * Register a control with the form. + * + * Input elements using ngModelController do this automatically when they are linked. + */ + form.$addControl = function(control) { + // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored + // and not added to the scope. Now we throw an error. + assertNotHasOwnProperty(control.$name, 'input'); + controls.push(control); + + if (control.$name) { + form[control.$name] = control; + } + }; + + // Private API: rename a form control + form.$$renameControl = function(control, newName) { + var oldName = control.$name; + + if (form[oldName] === control) { + delete form[oldName]; + } + form[newName] = control; + control.$name = newName; + }; + + /** + * @ngdoc method + * @name form.FormController#$removeControl + * + * @description + * Deregister a control from the form. + * + * Input elements using ngModelController do this automatically when they are destroyed. + */ + form.$removeControl = function(control) { + if (control.$name && form[control.$name] === control) { + delete form[control.$name]; + } + forEach(form.$pending, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$error, function(value, name) { + form.$setValidity(name, null, control); + }); + forEach(form.$$success, function(value, name) { + form.$setValidity(name, null, control); + }); + + arrayRemove(controls, control); + }; + + + /** + * @ngdoc method + * @name form.FormController#$setValidity + * + * @description + * Sets the validity of a form control. + * + * This method will also propagate to parent forms. + */ + addSetValidityMethod({ + ctrl: this, + $element: element, + set: function(object, property, controller) { + var list = object[property]; + if (!list) { + object[property] = [controller]; + } else { + var index = list.indexOf(controller); + if (index === -1) { + list.push(controller); + } + } + }, + unset: function(object, property, controller) { + var list = object[property]; + if (!list) { + return; + } + arrayRemove(list, controller); + if (list.length === 0) { + delete object[property]; + } + }, + parentForm: parentForm, + $animate: $animate + }); + + /** + * @ngdoc method + * @name form.FormController#$setDirty + * + * @description + * Sets the form to a dirty state. + * + * This method can be called to add the 'ng-dirty' class and set the form to a dirty + * state (ng-dirty class). This method will also propagate to parent forms. + */ + form.$setDirty = function() { + $animate.removeClass(element, PRISTINE_CLASS); + $animate.addClass(element, DIRTY_CLASS); + form.$dirty = true; + form.$pristine = false; + parentForm.$setDirty(); + }; + + /** + * @ngdoc method + * @name form.FormController#$setPristine + * + * @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. + * + * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after + * saving or resetting it. + */ + form.$setPristine = function() { + $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); + form.$dirty = false; + form.$pristine = true; + form.$submitted = false; + forEach(controls, function(control) { + control.$setPristine(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setUntouched + * + * @description + * Sets the form to its untouched state. + * + * This method can be called to remove the 'ng-touched' class and set the form controls to their + * untouched state (ng-untouched class). + * + * Setting a form controls back to their untouched state is often useful when setting the form + * back to its pristine state. + */ + form.$setUntouched = function() { + forEach(controls, function(control) { + control.$setUntouched(); + }); + }; + + /** + * @ngdoc method + * @name form.FormController#$setSubmitted + * + * @description + * Sets the form to its submitted state. + */ + form.$setSubmitted = function() { + $animate.addClass(element, SUBMITTED_CLASS); + form.$submitted = true; + parentForm.$setSubmitted(); + }; +} + +/** + * @ngdoc directive + * @name ngForm + * @restrict EAC + * + * @description + * Nestable alias of {@link ng.directive:form `form`} directive. HTML + * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a + * sub-group of controls needs to be determined. + * + * Note: the purpose of `ngForm` is to group controls, + * but not to be a replacement for the `
` tag with all of its capabilities + * (e.g. posting to the server, ...). + * + * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + * + */ + + /** + * @ngdoc directive + * @name form + * @restrict E + * + * @description + * Directive that instantiates + * {@link form.FormController FormController}. + * + * If the `name` attribute is specified, the form controller is published onto the current scope under + * this name. + * + * # Alias: {@link ng.directive:ngForm `ngForm`} + * + * 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. + * + * + * # CSS classes + * - `ng-valid` is set if the form is valid. + * - `ng-invalid` is set if the form is invalid. + * - `ng-pristine` is set if the form is pristine. + * - `ng-dirty` is set if the form is dirty. + * - `ng-submitted` is set if the form was submitted. + * + * Keep in mind that ngAnimate can detect each of these classes when added and removed. + * + * + * # Submitting a form and preventing the default action + * + * Since the role of forms in client-side Angular applications is different than in classical + * roundtrip apps, it is desirable for the browser not to translate the form submission into a full + * page reload that sends the data to the server. Instead some javascript logic should be triggered + * to handle the form submission in an application-specific way. + * + * For this reason, Angular prevents the default action (form submission to the server) unless the + * `` element has an `action` attribute specified. + * + * You can use one of the following two ways to specify what javascript method should be called when + * a form is submitted: + * + * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element + * - {@link ng.directive:ngClick ngClick} directive on the first + * button or input field of type submit (input[type=submit]) + * + * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} + * or {@link ng.directive:ngClick ngClick} directives. + * This is because of the following form submission rules in the HTML specification: + * + * - If a form has only one input field then hitting enter in this field triggers form submit + * (`ngSubmit`) + * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter + * doesn't trigger submit + * - if a form has one or more input fields and one or more buttons or input[type=submit] then + * hitting enter in any of the input fields will trigger the click handler on the *first* button or + * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) + * + * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is + * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` + * to have access to the updated model. + * + * ## Animation Hooks + * + * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. + * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any + * other validations that are performed within the form. Animations in ngForm are similar to how + * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well + * as JS animations. + * + * The following example shows a simple way to utilize CSS transitions to style a form element + * that has been rendered as invalid after it has been validated: + * + *
+ * //be sure to include ngAnimate as a module to hook into more
+ * //advanced animations
+ * .my-form {
+ *   transition:0.5s linear all;
+ *   background: white;
+ * }
+ * .my-form.ng-invalid {
+ *   background: red;
+ *   color:white;
+ * }
+ * 
+ * + * @example + + + + + + userType: + Required!
+ userType = {{userType}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ +
+ + it('should initialize to model', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + + expect(userType.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + var userType = element(by.binding('userType')); + var valid = element(by.binding('myForm.input.$valid')); + var userInput = element(by.model('userType')); + + userInput.clear(); + userInput.sendKeys(''); + + expect(userType.getText()).toEqual('userType ='); + expect(valid.getText()).toContain('false'); + }); + +
+ * + * @param {string=} name Name of the form. If specified, the form controller will be published into + * related scope, under this name. + */ +var formDirectiveFactory = function(isNgForm) { + return ['$timeout', function($timeout) { + var formDirective = { + name: 'form', + restrict: isNgForm ? 'EAC' : 'E', + controller: FormController, + compile: function ngFormCompile(formElement, attr) { + // Setup initial state of the control + formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); + + var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false); + + return { + pre: function ngFormPreLink(scope, formElement, attr, controller) { + // if `action` attr is not present on the form, prevent the default action (submission) + if (!('action' in attr)) { + // we can't use jq events because if a form is destroyed during submission the default + // action is not prevented. see #1238 + // + // IE 9 is not affected because it doesn't fire a submit event and try to do a full + // page reload if the form was destroyed by submission of the form via a click handler + // on a button in the form. Looks like an IE9 specific bug. + var handleFormSubmission = function(event) { + scope.$apply(function() { + controller.$commitViewValue(); + controller.$setSubmitted(); + }); + + event.preventDefault(); + }; + + addEventListenerFn(formElement[0], 'submit', handleFormSubmission); + + // unregister the preventDefault listener so that we don't not leak memory but in a + // way that will achieve the prevention of the default action. + formElement.on('$destroy', function() { + $timeout(function() { + removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); + }, 0, false); + }); + } + + var parentFormCtrl = controller.$$parentForm; + + if (nameAttr) { + setter(scope, controller.$name, controller, controller.$name); + attr.$observe(nameAttr, function(newValue) { + if (controller.$name === newValue) return; + setter(scope, controller.$name, undefined, controller.$name); + parentFormCtrl.$$renameControl(controller, newValue); + setter(scope, controller.$name, controller, controller.$name); + }); + } + formElement.on('$destroy', function() { + parentFormCtrl.$removeControl(controller); + if (nameAttr) { + setter(scope, attr[nameAttr], undefined, controller.$name); + } + extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards + }); + } + }; + } + }; + + return formDirective; + }]; +}; + +var formDirective = formDirectiveFactory(); +var ngFormDirective = formDirectiveFactory(true); + +/* global VALID_CLASS: false, + INVALID_CLASS: false, + PRISTINE_CLASS: false, + DIRTY_CLASS: false, + UNTOUCHED_CLASS: false, + TOUCHED_CLASS: false, + $ngModelMinErr: false, +*/ + +// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 +var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/; +var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; +var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; +var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/; +var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/; +var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; +var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/; +var MONTH_REGEXP = /^(\d{4})-(\d\d)$/; +var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; + +var inputType = { + + /** + * @ngdoc input + * @name input[text] + * + * @description + * Standard HTML text input with angular data binding, inherited by most of the `input` elements. + * + * + * @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=} required Adds `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @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=} 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. + * 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. + * @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. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
+ +
+ + Required! + + Single word only! +
+ text = {{example.text}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var text = element(by.binding('example.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('guest'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if multi word', function() { + input.clear(); + input.sendKeys('hello world'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'text': textInputType, + + /** + * @ngdoc input + * @name input[date] + * + * @description + * Input with date validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 + * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many + * modern browsers do not yet support this input type, it is important to provide cues to users on the + * expected input format via a placeholder or label. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @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 error key if the value entered is less than `min`. This must be a + * valid ISO date string (yyyy-MM-dd). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO date string (yyyy-MM-dd). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-MM-dd"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); + 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 + // for various browsers (see https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10-22'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'date': createDateInputType('date', DATE_REGEXP, + createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), + 'yyyy-MM-dd'), + + /** + * @ngdoc input + * @name input[datetime-local] + * + * @description + * Input with datetime validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @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 error key if the value entered is less than `min`. This must be a + * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH: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 + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2010-12-28T14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01-01T23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, + createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), + 'yyyy-MM-ddTHH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[time] + * + * @description + * Input with time validation and transformation. In browsers that do not yet support + * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a + * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @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 error key if the value entered is less than `min`. This must be a + * valid ISO time format (HH:mm:ss). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a + * valid ISO time format (HH:mm:ss). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "HH:mm:ss"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + 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 + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('14:57:00'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('23:59:00'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'time': createDateInputType('time', TIME_REGEXP, + createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), + 'HH:mm:ss.sss'), + + /** + * @ngdoc input + * @name input[week] + * + * @description + * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support + * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * week format (yyyy-W##), for example: `2013-W02`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @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 error key if the value entered is less than `min`. This must be a + * valid ISO week format (yyyy-W##). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be + * a valid ISO week format (yyyy-W##). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not a valid date! +
+ value = {{example.value | date: "yyyy-Www"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + 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 + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-W01'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-W01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), + + /** + * @ngdoc input + * @name input[month] + * + * @description + * Input with month validation and transformation. In browsers that do not yet support + * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 + * month format (yyyy-MM), for example: `2009-01`. + * + * The model must always be a Date object, otherwise Angular will throw an error. + * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. + * If the model is not set to the first of the month, the next view to model update will set it + * to the first of the month. + * + * The timezone to be used to read/write the `Date` instance in the model can be defined using + * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. + * + * @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 error key if the value entered is less than `min`. This must be + * a valid ISO month format (yyyy-MM). + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must + * be a valid ISO month format (yyyy-MM). + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ + +
+ + Required! + + Not a valid month! +
+ value = {{example.value | date: "yyyy-MM"}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + 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 + // for various browsers (https://github.com/angular/protractor/issues/562). + function setInput(val) { + // set the value of the element and force validation. + var scr = "var ipt = document.getElementById('exampleInput'); " + + "ipt.value = '" + val + "';" + + "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; + browser.executeScript(scr); + } + + it('should initialize to model', function() { + expect(value.getText()).toContain('2013-10'); + expect(valid.getText()).toContain('myForm.input.$valid = true'); + }); + + it('should be invalid if empty', function() { + setInput(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + + it('should be invalid if over max', function() { + setInput('2015-01'); + expect(value.getText()).toContain(''); + expect(valid.getText()).toContain('myForm.input.$valid = false'); + }); + +
+ */ + 'month': createDateInputType('month', MONTH_REGEXP, + createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), + 'yyyy-MM'), + + /** + * @ngdoc input + * @name input[number] + * + * @description + * Text input with number validation and transformation. Sets the `number` validation + * error if not a valid number. + * + *
+ * The model must always be of type `number` otherwise Angular will throw an error. + * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt} + * error docs for more information and an example of how to convert your model if necessary. + *
+ * + * ## Issues with HTML5 constraint validation + * + * In browsers that follow the + * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29), + * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}. + * If a non-number is entered in the input, the browser will report the value as an empty string, + * which means the view / model values in `ngModel` and subsequently the scope value + * will also be an empty string. + * + * + * @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 error key if the value entered is less than `min`. + * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. + * @param {string=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @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=} 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. + * 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. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not valid number! +
+ value = {{example.value}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+
+
+ + var value = element(by.binding('example.value')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('example.value')); + + it('should initialize to model', function() { + expect(value.getText()).toContain('12'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if over max', function() { + input.clear(); + input.sendKeys('123'); + expect(value.getText()).toEqual('value ='); + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'number': numberInputType, + + + /** + * @ngdoc input + * @name input[url] + * + * @description + * Text input with URL validation. Sets the `url` validation error key if the content is not a + * valid URL. + * + *
+ * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex + * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify + * the built-in validators (see the {@link guide/forms Forms guide}) + *
+ * + * @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=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @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=} 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. + * 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. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+
+ + var text = element(by.binding('url.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('url.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('http://google.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not url', function() { + input.clear(); + input.sendKeys('box'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'url': urlInputType, + + + /** + * @ngdoc input + * @name input[email] + * + * @description + * Text input with email validation. Sets the `email` validation error key if not a valid email + * address. + * + *
+ * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex + * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can + * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) + *
+ * + * @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=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @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=} 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. + * 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. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+ +
+ + Required! + + Not valid email! +
+ text = {{email.text}}
+ myForm.input.$valid = {{myForm.input.$valid}}
+ myForm.input.$error = {{myForm.input.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ myForm.$error.email = {{!!myForm.$error.email}}
+
+
+ + var text = element(by.binding('email.text')); + var valid = element(by.binding('myForm.input.$valid')); + var input = element(by.model('email.text')); + + it('should initialize to model', function() { + expect(text.getText()).toContain('me@example.com'); + expect(valid.getText()).toContain('true'); + }); + + it('should be invalid if empty', function() { + input.clear(); + input.sendKeys(''); + expect(text.getText()).toEqual('text ='); + expect(valid.getText()).toContain('false'); + }); + + it('should be invalid if not email', function() { + input.clear(); + input.sendKeys('xxx'); + + expect(valid.getText()).toContain('false'); + }); + +
+ */ + 'email': emailInputType, + + + /** + * @ngdoc input + * @name input[radio] + * + * @description + * HTML radio button. + * + * @param {string} ngModel Assignable angular expression to data-bind to. + * @param {string} value The value to which the `ngModel` expression should be set when selected. + * Note that `value` only supports `string` values, i.e. the scope model needs to be a string, + * too. Use `ngValue` if you need complex models (`number`, `object`, ...). + * @param {string=} name Property name of the form under which the control is published. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio + * is selected. Should be used instead of the `value` attribute if you need + * a non-string `ngModel` (`boolean`, `array`, ...). + * + * @example + + + +
+
+
+
+ color = {{color.name | json}}
+
+ Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. +
+ + it('should change state', function() { + var color = element(by.binding('color.name')); + + expect(color.getText()).toContain('blue'); + + element.all(by.model('color.name')).get(0).click(); + + expect(color.getText()).toContain('red'); + }); + +
+ */ + 'radio': radioInputType, + + + /** + * @ngdoc input + * @name input[checkbox] + * + * @description + * HTML checkbox. + * + * @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 {expression=} ngTrueValue The value to which the expression should be set when selected. + * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. + * @param {string=} ngChange Angular expression to be executed when input changes due to user + * interaction with the input element. + * + * @example + + + +
+
+
+ value1 = {{checkboxModel.value1}}
+ value2 = {{checkboxModel.value2}}
+
+
+ + it('should change state', function() { + var value1 = element(by.binding('checkboxModel.value1')); + var value2 = element(by.binding('checkboxModel.value2')); + + expect(value1.getText()).toContain('true'); + expect(value2.getText()).toContain('YES'); + + element(by.model('checkboxModel.value1')).click(); + element(by.model('checkboxModel.value2')).click(); + + expect(value1.getText()).toContain('false'); + expect(value2.getText()).toContain('NO'); + }); + +
+ */ + 'checkbox': checkboxInputType, + + 'hidden': noop, + 'button': noop, + 'submit': noop, + 'reset': noop, + 'file': noop +}; + +function stringBasedInputType(ctrl) { + ctrl.$formatters.push(function(value) { + return ctrl.$isEmpty(value) ? value : value.toString(); + }); +} + +function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); +} + +function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { + var type = lowercase(element[0].type); + + // In composition mode, users are still inputing 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) { + composing = true; + }); + + element.on('compositionend', function() { + composing = false; + listener(); + }); + } + + var listener = function(ev) { + if (timeout) { + $browser.defer.cancel(timeout); + timeout = null; + } + if (composing) return; + var value = element.val(), + event = ev && ev.type; + + // By default we will trim the value + // If the attribute ng-trim exists we will avoid trimming + // If input type is 'password', the value is never trimmed + if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { + value = trim(value); + } + + // If a control is suffering from bad input (due to native validators), browsers discard its + // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the + // control's value is the same empty value twice in a row. + if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { + ctrl.$setViewValue(value, event); + } + }; + + // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the + // input event on backspace, delete or cut + if ($sniffer.hasEvent('input')) { + element.on('input', listener); + } else { + var timeout; + + var deferListener = function(ev, input, origValue) { + if (!timeout) { + timeout = $browser.defer(function() { + timeout = null; + if (!input || input.value !== origValue) { + listener(ev); + } + }); + } + }; + + element.on('keydown', function(event) { + var key = event.keyCode; + + // ignore + // command modifiers arrows + if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; + + deferListener(event, this, this.value); + }); + + // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it + if ($sniffer.hasEvent('paste')) { + element.on('paste cut', deferListener); + } + } + + // if user paste into input using mouse on older browser + // or form autocomplete on newer browser, we need "change" event to catch it + element.on('change', listener); + + ctrl.$render = function() { + element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); + }; +} + +function weekParser(isoWeek, existingDate) { + if (isDate(isoWeek)) { + return isoWeek; + } + + if (isString(isoWeek)) { + WEEK_REGEXP.lastIndex = 0; + var parts = WEEK_REGEXP.exec(isoWeek); + if (parts) { + var year = +parts[1], + week = +parts[2], + hours = 0, + minutes = 0, + seconds = 0, + milliseconds = 0, + firstThurs = getFirstThursdayOfYear(year), + addDays = (week - 1) * 7; + + if (existingDate) { + hours = existingDate.getHours(); + minutes = existingDate.getMinutes(); + seconds = existingDate.getSeconds(); + milliseconds = existingDate.getMilliseconds(); + } + + return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); + } + } + + return NaN; +} + +function createDateParser(regexp, mapping) { + return function(iso, date) { + var parts, map; + + if (isDate(iso)) { + return iso; + } + + if (isString(iso)) { + // 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) == '"') { + iso = iso.substring(1, iso.length - 1); + } + if (ISO_DATE_REGEXP.test(iso)) { + return new Date(iso); + } + regexp.lastIndex = 0; + parts = regexp.exec(iso); + + if (parts) { + parts.shift(); + if (date) { + map = { + yyyy: date.getFullYear(), + MM: date.getMonth() + 1, + dd: date.getDate(), + HH: date.getHours(), + mm: date.getMinutes(), + ss: date.getSeconds(), + sss: date.getMilliseconds() / 1000 + }; + } else { + map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; + } + + forEach(parts, function(part, index) { + if (index < mapping.length) { + map[mapping[index]] = +part; + } + }); + return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); + } + } + + return NaN; + }; +} + +function createDateInputType(type, regexp, parseDate, format) { + return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; + var previousDate; + + ctrl.$$parserName = type; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (regexp.test(value)) { + // Note: We cannot read ctrl.$modelValue, as there might be a different + // parser/formatter in the processing chain so that the model + // contains some different data format! + var parsedDate = parseDate(value, previousDate); + if (timezone) { + parsedDate = convertTimezoneToLocal(parsedDate, timezone); + } + return parsedDate; + } + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (value && !isDate(value)) { + throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); + } + if (isValidDate(value)) { + previousDate = value; + if (previousDate && timezone) { + previousDate = convertTimezoneToLocal(previousDate, timezone, true); + } + return $filter('date')(value, format, timezone); + } else { + previousDate = null; + return ''; + } + }); + + if (isDefined(attr.min) || attr.ngMin) { + var minVal; + ctrl.$validators.min = function(value) { + return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; + }; + attr.$observe('min', function(val) { + minVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + if (isDefined(attr.max) || attr.ngMax) { + var maxVal; + ctrl.$validators.max = function(value) { + return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; + }; + attr.$observe('max', function(val) { + maxVal = parseObservedDateValue(val); + ctrl.$validate(); + }); + } + + function isValidDate(value) { + // Invalid Date: getTime() returns NaN + return value && !(value.getTime && value.getTime() !== value.getTime()); + } + + function parseObservedDateValue(val) { + return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined; + } + }; +} + +function badInputChecker(scope, element, attr, ctrl) { + var node = element[0]; + var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); + 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; + }); + } +} + +function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { + badInputChecker(scope, element, attr, ctrl); + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + + ctrl.$$parserName = 'number'; + ctrl.$parsers.push(function(value) { + if (ctrl.$isEmpty(value)) return null; + if (NUMBER_REGEXP.test(value)) return parseFloat(value); + return undefined; + }); + + ctrl.$formatters.push(function(value) { + if (!ctrl.$isEmpty(value)) { + if (!isNumber(value)) { + throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); + } + value = value.toString(); + } + return value; + }); + + 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; + // 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; + // 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! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'url'; + ctrl.$validators.url = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || URL_REGEXP.test(value); + }; +} + +function emailInputType(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! + baseInputType(scope, element, attr, ctrl, $sniffer, $browser); + stringBasedInputType(ctrl); + + ctrl.$$parserName = 'email'; + ctrl.$validators.email = function(modelValue, viewValue) { + var value = modelValue || viewValue; + return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); + }; +} + +function radioInputType(scope, element, attr, ctrl) { + // make the name unique, if not defined + if (isUndefined(attr.name)) { + element.attr('name', nextUid()); + } + + var listener = function(ev) { + if (element[0].checked) { + ctrl.$setViewValue(attr.value, ev && ev.type); + } + }; + + element.on('click', listener); + + ctrl.$render = function() { + var value = attr.value; + element[0].checked = (value == ctrl.$viewValue); + }; + + attr.$observe('value', ctrl.$render); +} + +function parseConstantExpr($parse, context, name, expression, fallback) { + var parseFn; + if (isDefined(expression)) { + parseFn = $parse(expression); + if (!parseFn.constant) { + throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' + + '`{1}`.', name, expression); + } + return parseFn(context); + } + return fallback; +} + +function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { + var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); + var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); + + var listener = function(ev) { + ctrl.$setViewValue(element[0].checked, ev && ev.type); + }; + + element.on('click', listener); + + ctrl.$render = function() { + element[0].checked = ctrl.$viewValue; + }; + + // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` + // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert + // it to a boolean. + ctrl.$isEmpty = function(value) { + return value === false; + }; + + ctrl.$formatters.push(function(value) { + return equals(value, trueValue); + }); + + ctrl.$parsers.push(function(value) { + return value ? trueValue : falseValue; + }); +} + + +/** + * @ngdoc directive + * @name textarea + * @restrict E + * + * @description + * HTML textarea element control with angular data-binding. The data-binding and validation + * properties of this element are exactly the same as those of the + * {@link ng.directive:input input element}. + * + * @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=} required Sets `required` validation error key if the value is not entered. + * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to + * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of + * `required` when you want to data-bind to the `required` attribute. + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @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. + * 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. + * @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. + */ + + +/** + * @ngdoc directive + * @name input + * @restrict E + * + * @description + * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, + * input state control, and validation. + * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. + * + *
+ * **Note:** Not every feature offered is available for all input types. + * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. + *
+ * + * @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=} required Sets `required` validation error key if the value is not entered. + * @param {boolean=} ngRequired Sets `required` attribute if set to true + * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than + * minlength. + * @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. + * 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. + * @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. + * This parameter is ignored for input[type=password] controls, which will never trim the + * input. + * + * @example + + + +
+
+ +
+ + Required! +
+ +
+ + Too short! + + Too long! +
+
+
+ user = {{user}}
+ myForm.userName.$valid = {{myForm.userName.$valid}}
+ myForm.userName.$error = {{myForm.userName.$error}}
+ myForm.lastName.$valid = {{myForm.lastName.$valid}}
+ myForm.lastName.$error = {{myForm.lastName.$error}}
+ myForm.$valid = {{myForm.$valid}}
+ myForm.$error.required = {{!!myForm.$error.required}}
+ myForm.$error.minlength = {{!!myForm.$error.minlength}}
+ myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
+
+
+ + var user = element(by.exactBinding('user')); + var userNameValid = element(by.binding('myForm.userName.$valid')); + var lastNameValid = element(by.binding('myForm.lastName.$valid')); + var lastNameError = element(by.binding('myForm.lastName.$error')); + var formValid = element(by.binding('myForm.$valid')); + var userNameInput = element(by.model('user.name')); + var userLastInput = element(by.model('user.last')); + + it('should initialize to model', function() { + expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); + expect(userNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if empty when required', function() { + userNameInput.clear(); + userNameInput.sendKeys(''); + + expect(user.getText()).toContain('{"last":"visitor"}'); + expect(userNameValid.getText()).toContain('false'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be valid if empty when min length is set', function() { + userLastInput.clear(); + userLastInput.sendKeys(''); + + expect(user.getText()).toContain('{"name":"guest","last":""}'); + expect(lastNameValid.getText()).toContain('true'); + expect(formValid.getText()).toContain('true'); + }); + + it('should be invalid if less than required min length', function() { + userLastInput.clear(); + userLastInput.sendKeys('xx'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('minlength'); + expect(formValid.getText()).toContain('false'); + }); + + it('should be invalid if longer than max length', function() { + userLastInput.clear(); + userLastInput.sendKeys('some ridiculously long name'); + + expect(user.getText()).toContain('{"name":"guest"}'); + expect(lastNameValid.getText()).toContain('false'); + expect(lastNameError.getText()).toContain('maxlength'); + expect(formValid.getText()).toContain('false'); + }); + +
+ */ +var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', + function($browser, $sniffer, $filter, $parse) { + return { + restrict: 'E', + require: ['?ngModel'], + link: { + pre: function(scope, element, attr, ctrls) { + if (ctrls[0]) { + (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, + $browser, $filter, $parse); + } + } + } + }; +}]; + + + +var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; +/** + * @ngdoc directive + * @name ngValue + * + * @description + * Binds the given expression to the value of `
+ + it('should check ng-options', function() { + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red'); + element.all(by.model('myColor')).first().click(); + element.all(by.css('select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black'); + element(by.css('.nullable select[ng-model="myColor"]')).click(); + element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click(); + expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null'); + }); + + + */ + +// jshint maxlen: false +// //00001111111111000000000002222222222000000000000000000000333333333300000000000000000000000004444444444400000000000005555555555555550000000006666666666666660000000777777777777777000000000000000888888888800000000000000000009999999999 +var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/; + // 1: value expression (valueFn) + // 2: label expression (displayFn) + // 3: group by expression (groupByFn) + // 4: disable when expression (disableWhenFn) + // 5: array item variable name + // 6: object item key variable name + // 7: object item value variable name + // 8: collection expression + // 9: track by expression +// jshint maxlen: 100 + + +var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) { + + function parseOptionsExpression(optionsExp, selectElement, scope) { + + var match = optionsExp.match(NG_OPTIONS_REGEXP); + if (!(match)) { + throw ngOptionsMinErr('iexp', + "Expected expression in form of " + + "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" + + " but got '{0}'. Element: {1}", + optionsExp, startingTag(selectElement)); + } + + // Extract the parts from the ngOptions expression + + // The variable name for the value of the item in the collection + var valueName = match[5] || match[7]; + // The variable name for the key of the item in the collection + var keyName = match[6]; + + // An expression that generates the viewValue for an option if there is a label expression + var selectAs = / as /.test(match[0]) && match[1]; + // An expression that is used to track the id of each object in the options collection + var trackBy = match[9]; + // An expression that generates the viewValue for an option if there is no label expression + var valueFn = $parse(match[2] ? match[1] : valueName); + var selectAsFn = selectAs && $parse(selectAs); + var viewValueFn = selectAsFn || valueFn; + var trackByFn = trackBy && $parse(trackBy); + + // Get the value by which we are going to track the option + // if we have a trackFn then use that (passing scope and locals) + // otherwise just hash the given viewValue + var getTrackByValueFn = trackBy ? + function(value, locals) { return trackByFn(scope, locals); } : + function getHashOfValue(value) { return hashKey(value); }; + var getTrackByValue = function(value, key) { + return getTrackByValueFn(value, getLocals(value, key)); + }; + + var displayFn = $parse(match[2] || match[1]); + var groupByFn = $parse(match[3] || ''); + var disableWhenFn = $parse(match[4] || ''); + var valuesFn = $parse(match[8]); + + var locals = {}; + var getLocals = keyName ? function(value, key) { + locals[keyName] = key; + locals[valueName] = value; + return locals; + } : function(value) { + locals[valueName] = value; + return locals; + }; + + + function Option(selectValue, viewValue, label, group, disabled) { + this.selectValue = selectValue; + this.viewValue = viewValue; + this.label = label; + this.group = group; + this.disabled = disabled; + } + + function getOptionValuesKeys(optionValues) { + var optionValuesKeys; + + if (!keyName && isArrayLike(optionValues)) { + optionValuesKeys = optionValues; + } else { + // if object, extract keys, in enumeration order, unsorted + optionValuesKeys = []; + for (var itemKey in optionValues) { + if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') { + optionValuesKeys.push(itemKey); + } + } + } + return optionValuesKeys; + } + + return { + trackBy: trackBy, + getTrackByValue: getTrackByValue, + getWatchables: $parse(valuesFn, function(optionValues) { + // Create a collection of things that we would like to watch (watchedArray) + // so that they can all be watched using a single $watchCollection + // that only runs the handler once if anything changes + var watchedArray = []; + optionValues = optionValues || []; + + var optionValuesKeys = getOptionValuesKeys(optionValues); + var optionValuesLength = optionValuesKeys.length; + for (var index = 0; index < optionValuesLength; index++) { + var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index]; + var value = optionValues[key]; + + var locals = getLocals(optionValues[key], key); + var selectValue = getTrackByValueFn(optionValues[key], locals); + watchedArray.push(selectValue); + + // Only need to watch the displayFn if there is a specific label expression + if (match[2] || match[1]) { + var label = displayFn(scope, locals); + watchedArray.push(label); + } + + // Only need to watch the disableWhenFn if there is a specific disable expression + if (match[4]) { + var disableWhen = disableWhenFn(scope, locals); + watchedArray.push(disableWhen); + } + } + return watchedArray; + }), + + getOptions: function() { + + var optionItems = []; + var selectValueMap = {}; + + // The option values were already computed in the `getWatchables` fn, + // which must have been called to trigger `getOptions` + var optionValues = valuesFn(scope) || []; + var optionValuesKeys = getOptionValuesKeys(optionValues); + var optionValuesLength = optionValuesKeys.length; + + for (var index = 0; index < optionValuesLength; index++) { + var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index]; + var value = optionValues[key]; + var locals = getLocals(value, key); + var viewValue = viewValueFn(scope, locals); + var selectValue = getTrackByValueFn(viewValue, locals); + var label = displayFn(scope, locals); + var group = groupByFn(scope, locals); + var disabled = disableWhenFn(scope, locals); + var optionItem = new Option(selectValue, viewValue, label, group, disabled); + + optionItems.push(optionItem); + selectValueMap[selectValue] = optionItem; + } + + return { + items: optionItems, + selectValueMap: selectValueMap, + getOptionFromViewValue: function(value) { + return selectValueMap[getTrackByValue(value)]; + }, + getViewValueFromOption: function(option) { + // If the viewValue could be an object that may be mutated by the application, + // we need to make a copy and not return the reference to the value on the option. + return trackBy ? angular.copy(option.viewValue) : option.viewValue; + } + }; + } + }; + } + + + // we can't just jqLite(' + * + * + * + * {{ model }} + * + * + * angular.module('nonStringSelect', []) + * .run(function($rootScope) { + * $rootScope.model = { id: 2 }; + * }) + * .directive('convertToNumber', function() { + * return { + * require: 'ngModel', + * link: function(scope, element, attrs, ngModel) { + * ngModel.$parsers.push(function(val) { + * return parseInt(val, 10); + * }); + * ngModel.$formatters.push(function(val) { + * return '' + val; + * }); + * } + * }; + * }); + * + * + * it('should initialize to model', function() { + * var select = element(by.css('select')); + * expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two'); + * }); + * + * + * + */ +var selectDirective = function() { + + return { + restrict: 'E', + require: ['select', '?ngModel'], + controller: SelectController, + link: function(scope, element, attr, ctrls) { + + // if ngModel is not defined, we don't need to do anything + var ngModelCtrl = ctrls[1]; + if (!ngModelCtrl) return; + + var selectCtrl = ctrls[0]; + + selectCtrl.ngModelCtrl = ngModelCtrl; + + // We delegate rendering to the `writeValue` method, which can be changed + // if the select can have multiple selected values or if the options are being + // generated by `ngOptions` + ngModelCtrl.$render = function() { + selectCtrl.writeValue(ngModelCtrl.$viewValue); + }; + + // When the selected item(s) changes we delegate getting the value of the select control + // to the `readValue` method, which can be changed if the select can have multiple + // selected values or if the options are being generated by `ngOptions` + element.on('change', function() { + scope.$apply(function() { + ngModelCtrl.$setViewValue(selectCtrl.readValue()); + }); + }); + + // If the select allows multiple values then we need to modify how we read and write + // values from and to the control; also what it means for the value to be empty and + // we have to add an extra watch since ngModel doesn't work well with arrays - it + // doesn't trigger rendering if only an item in the array changes. + if (attr.multiple) { + + // Read value now needs to check each option to see if it is selected + selectCtrl.readValue = function readMultipleValue() { + var array = []; + forEach(element.find('option'), function(option) { + if (option.selected) { + array.push(option.value); + } + }); + return array; + }; + + // Write value now needs to set the selected property of each matching option + selectCtrl.writeValue = function writeMultipleValue(value) { + var items = new HashMap(value); + forEach(element.find('option'), function(option) { + option.selected = isDefined(items.get(option.value)); + }); + }; + + // we have to do it on each watch since ngModel watches reference, but + // we need to work of an array, so we need to see if anything was inserted/removed + var lastView, lastViewRef = NaN; + scope.$watch(function selectMultipleWatch() { + if (lastViewRef === ngModelCtrl.$viewValue && !equals(lastView, ngModelCtrl.$viewValue)) { + lastView = shallowCopy(ngModelCtrl.$viewValue); + ngModelCtrl.$render(); + } + lastViewRef = ngModelCtrl.$viewValue; + }); + + // If we are a multiple select then value is now a collection + // so the meaning of $isEmpty changes + ngModelCtrl.$isEmpty = function(value) { + return !value || value.length === 0; + }; + + } + } + }; +}; + + +// The option directive is purely designed to communicate the existence (or lack of) +// of dynamically created (and destroyed) option elements to their containing select +// directive via its controller. +var optionDirective = ['$interpolate', function($interpolate) { + + function chromeHack(optionElement) { + // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459 + // Adding an

55SGtg$R?a9TYQsnbaiwi3@L3lpt{$s#p1sbNxE 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 V)A2w7aX)_)nHgO`RT#L({STJyPAvcc literal 0 HcmV?d00001 diff --git a/src/MCM.KidsIdApp/www/img/login-header-img.png b/src/MCM.KidsIdApp/www/img/login-header-img.png new file mode 100644 index 0000000000000000000000000000000000000000..52987dbeb2875bc5b01196b458b1fcd0d38225a5 GIT binary patch literal 4058 zcmeHK)msw|xE?UNl@39EFeIcA=@>OcLUMFBD2jwQNmCwb9tWUTzubq^L`g^+axfF7c+{p26Q{!KO&#lL+@mf!{e z&}e#t!6pzenBV02Qx9)HcK|@2K0iCe+-#980fSaRPuvpV7dqp5Ma@5@tj`KGO@u_5 zkjBS?g0;zYS(rsE-ORg5^b!PIby#TM#JJ2;pD>vW_Lyqx;FjUO)Q2_lrz?5HA?WJj zR?GaN=OJvq4PbH|1MCg5CW(?mS+gAM_SoIJJ=%Xx%E3g!U`^7!?%@H{yU-?`xkjtz z=6=#2Y{VZ(M7gyuiFcWRUd-J@rVA*51t|bDI%8NxLN?)U+0JaxGB~?l7j?optzvpoE>rn@OG1xJfZaxI1pu*BedpO@|w~eZ4Su; z;Lh(&PhWg61W2*uI*x6DP=1LrIxL(Ai6^80s;qv+j^_-?mx^8mfY5T!jU-?q#HE~h zKF1rkJ?wFH+-P>`A}yBH_jvtns3GR8iSC^gdsN-iY#kCIsDG|k`hE@1{yubW)9bQp zarI7w8Bulk6~W>dw1+9sgcm?p{r0LQ(QE*`pv`;U#!iF+tAqO9?+U#q-?J1A?V;IlFrFe-Kt#cO6{$ z$MQ$oV`Fp-NQ@itoaqMJt?2!Iq)+@qVK@76+_r`3b{2JPqE~yIO0;#Fgd0t4`9!Zg` zM0-=k95JyLYgVSQl``gP%`tJ?P=$dtO&+q44S*BVm@+gjCqSP#MBh}Rz$U6^{{?Zi zQQ5z_Dx#d=m!lw(z+#zmNT;3Y7XV+P7VDLHsPuYA*R(@fKTxuFFRdH2vZ*n&^s=vW z9|6SU9D6gVG={0jCUvc;xR159(yRqZnD6?g3zU*p=;Wm_lyZMf(N7QDAfre?Ip=V& z4RT@=pzw7UOXoQk1F6{@*Bnbj_RR+#OtR6JF=Z~Z4dvFt)#}02518Ml-0!z^N_DcW zM>dcxIPWR*Fbs8b{^EHS(aK>b6Chs;Y+;;-w@2;v(XWG!LpwxQSPo+tdtMy5yuRB> z6Uh^KXEl{?uuC|N+6L$w!+1BFU(ip`oQaESi;5V_+$(1q{mD2;Af73#-_Av(;oX8} z2ZRS?l*s~#7i51TD3aS0Z4U7fum`Dv(04OOl-%^5b3ip5jB5o8`5lEAGt^D8?txg0 z4S0047L61QzG{SNgn`SR(0>Y;v98Q%%eOH`Yr_m+l6sl4$WtVCq$aZ}-50To3>Pxa znn#8p9VH5d9q&dO{4Kw3B{l8Q=rM~fskcPwt~d3n#zA!QiV-evUGiKKUEchXA21c_ z$cWBpxn*3Tu~R=KRCbq3Yq~6Ks z#nV}q+5AfXO5+(RACQl;&!P`uR-!5e^AQtLfXR21yVL zsaCpNrCQ_qsnOcA#Hexnwta?#t%7EYU5iik8@vC=Wh#{SugTtcJA()hFgdG9W1wto_+l?Tf0#^2G4*O zAb<$cl&T4#3227%g`nVj?Xj>~=H2b}*70LFmQpxexM3RdaWx-0E;3F(UP4R9e#Aa= zpX2#t;Cd_1^K=O}3AkhEGt`X55&~+lv?XO(VM*OGDWa_DpTQB6rLQ7uL7c4u&B6-@HNnMg_uzFIz=KiayQCl~`C z0;{RFX-a{*KubzBS{dqFdSXE*Sj0;(TiPQ37`F7Y+76Le?(3aqq|TW?aQ6rZ&y72O21PhntUgmFXt& zc5emFu=dRHYX}ZFpV^*3$k-Yb+e$gMzi_`!2O?uX$4+V^`|T55A+-=z2$s}Xvw7|1 zXUCK1jf$+atP&B~iph%a-my&=P19OJ&PnxR_OhzNXvsdg5-D)oH}Ba4i`&H-lj(-{ zUO+wCbKd!(l{rUa%7mr4DM^oInR|Aq(W=xAr>pPvi8V@%I zwZ3YZuA}dd+cNkK__6x!FMBlB_$(m>947y`jQ&dcWi0eFV|Nt_v$|X!!^iHU%kX7{ zkhNf{ke|ytZKu|`E>MTXiP|;$8r;}P@kvX&)n2Eivu&Ugqj#!XYLm>T&uD`>AHCU+ zze|5dbEW2OqJM|C?C1X&TAJ@#^^cq;Ng*4cRJ+5%(-Ap*ZsJ>`=|AB7bG^C`vs?VT zt;;jgF;aV9|2Q3^7pGS?)SLQpR(WP#;gdqvgWi;k!3J#L&{N{tA8`2XsvQ&AlCKxQ zhj$f^e+^ym9Tw23EQTe)DtCm5h4?QMHc2+9xu0{1UrHZ%hZ}~k?nF)J^N#c0SAT!= z`V5ZG&1?MT`3RFf&idiKVqr+ciPm7;adIMif|6B`T3ge`RDNxJ?aF90vd-c7>+^~w zG~wC;S>;))Xs-;*hoSf5i79h;+6%HB_aeM^nh*WaJI@-4+1Q$Qo#e2sD|>?E3cd}7 zdv}x1O_oe?bs*6he&g^{bqBUWoTRK^bWk6A^^oXAblt-i3)2{j7F4R&5N9vuJu1*= zdqwk3n8vrBsqw8~$s5FFopB#IrUE0T+obzjuSO38zl1NpYB(D>8igaLv2k4@f4`g~ zCaVe~LI`M2my!M>-^txvb%T{por+g;c>gW8?TzUW@5AzsNh?*I>iB3Pir{)Sl)kfP zd|`|zOi>ScO?`b53i9{ZTs@CHCCDg2BLDz$bBMO4c__(#PS~R}eUARZ3wo=AiOs?vEl6C#{n=~$^Oi|}c_;tY7g(4=3{ zys#04qE(}c57>@jpfU)aqPL$Q(Ht>qL(wYn-&=$z1Zh$Ng_L*VCAOoA+=Q1W$a$Hv z_DZ?iipXLz@`J$aK^i8XGyhK?OT3&?S5u>jraM2ryoA0D_ud5k$lEy+Cin#e3=#<8 z)ipIbR#sMRtb2$1`vc#MX1?IRp2@KAho0%+;J^h2Q!OYc zxW#gCdUA5>#fujW4GqjuGk$~s@ej$n^b8E;yWcUG$ge+-j|11*|1p2O!IyzaLTDKC zZ+{?$!(fjq4!5`8;_-N(5MLku@=~#_y?weNJKOP=G`YHpN@?xFobkwN3ZgCnO5qyF zr$X0?jE;_$!>(zHg9$i&&I9~mI1evx3J!T;!4EOHloK;>^qp((Nxhe`wSZw`y0JYy4Wg^idaJ zZT{v1HbSRTY}Th)B~nO!$1Vc(tD<$pj60a@S|xuzq&GB7u|nOlpZEksEQDXHJ8v~` zkqjLda!95UZZA!BqHkh3Md#&$Sf@&-Cr0QHQxg{YnMPn?S#txh)!oNR^!Z~ZBJ}og oayxQCGT^fRC;qSP`PKzcHJ1IOd{XWC?`H= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/MCM.KidsIdApp/www/lib/angular-animate/.bower.json b/src/MCM.KidsIdApp/www/lib/angular-animate/.bower.json new file mode 100644 index 0000000..df96d34 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-animate/.bower.json @@ -0,0 +1,19 @@ +{ + "name": "angular-animate", + "version": "1.4.3", + "main": "./angular-animate.js", + "ignore": [], + "dependencies": { + "angular": "1.4.3" + }, + "homepage": "https://github.com/angular/bower-angular-animate", + "_release": "1.4.3", + "_resolution": { + "type": "version", + "tag": "v1.4.3", + "commit": "4ce2a76359401102d2e0146ccf69e6c060799ff8" + }, + "_source": "git://github.com/angular/bower-angular-animate.git", + "_target": "1.4.3", + "_originalSource": "angular-animate" +} \ No newline at end of file diff --git a/src/MCM.KidsIdApp/www/lib/angular-animate/README.md b/src/MCM.KidsIdApp/www/lib/angular-animate/README.md new file mode 100644 index 0000000..8313da6 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-animate/README.md @@ -0,0 +1,68 @@ +# packaged angular-animate + +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/ngAnimate). +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-animate +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', [require('angular-animate')]); +``` + +### bower + +```shell +bower install angular-animate +``` + +Then add a ` +``` + +Then add `ngAnimate` as a dependency for your app: + +```javascript +angular.module('myApp', ['ngAnimate']); +``` + +## Documentation + +Documentation is available on the +[AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). + +## 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/src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.js b/src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.js new file mode 100644 index 0000000..fc0e217 --- /dev/null +++ b/src/MCM.KidsIdApp/www/lib/angular-animate/angular-animate.js @@ -0,0 +1,3721 @@ +/** + * @license AngularJS v1.4.3 + * (c) 2010-2015 Google, Inc. http://angularjs.org + * License: MIT + */ +(function(window, angular, undefined) {'use strict'; + +/* jshint ignore:start */ +var noop = angular.noop; +var extend = angular.extend; +var jqLite = angular.element; +var forEach = angular.forEach; +var isArray = angular.isArray; +var isString = angular.isString; +var isObject = angular.isObject; +var isUndefined = angular.isUndefined; +var isDefined = angular.isDefined; +var isFunction = angular.isFunction; +var isElement = angular.isElement; + +var ELEMENT_NODE = 1; +var COMMENT_NODE = 8; + +var NG_ANIMATE_CLASSNAME = 'ng-animate'; +var NG_ANIMATE_CHILDREN_DATA = '$$ngAnimateChildren'; + +var isPromiseLike = function(p) { + return p && p.then ? true : false; +} + +function assertArg(arg, name, reason) { + if (!arg) { + throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); + } + return arg; +} + +function mergeClasses(a,b) { + if (!a && !b) return ''; + if (!a) return b; + if (!b) return a; + if (isArray(a)) a = a.join(' '); + if (isArray(b)) b = b.join(' '); + return a + ' ' + b; +} + +function packageStyles(options) { + var styles = {}; + if (options && (options.to || options.from)) { + styles.to = options.to; + styles.from = options.from; + } + return styles; +} + +function pendClasses(classes, fix, isPrefix) { + var className = ''; + classes = isArray(classes) + ? classes + : classes && isString(classes) && classes.length + ? classes.split(/\s+/) + : []; + forEach(classes, function(klass, i) { + if (klass && klass.length > 0) { + className += (i > 0) ? ' ' : ''; + className += isPrefix ? fix + klass + : klass + fix; + } + }); + return className; +} + +function removeFromArray(arr, val) { + var index = arr.indexOf(val); + if (val >= 0) { + arr.splice(index, 1); + } +} + +function stripCommentsFromElement(element) { + if (element instanceof jqLite) { + switch (element.length) { + case 0: + return []; + break; + + case 1: + // there is no point of stripping anything if the element + // is the only element within the jqLite wrapper. + // (it's important that we retain the element instance.) + if (element[0].nodeType === ELEMENT_NODE) { + return element; + } + break; + + default: + return jqLite(extractElementNode(element)); + break; + } + } + + if (element.nodeType === ELEMENT_NODE) { + return jqLite(element); + } +} + +function extractElementNode(element) { + if (!element[0]) return element; + for (var i = 0; i < element.length; i++) { + var elm = element[i]; + if (elm.nodeType == ELEMENT_NODE) { + return elm; + } + } +} + +function $$addClass($$jqLite, element, className) { + forEach(element, function(elm) { + $$jqLite.addClass(elm, className); + }); +} + +function $$removeClass($$jqLite, element, className) { + forEach(element, function(elm) { + $$jqLite.removeClass(elm, className); + }); +} + +function applyAnimationClassesFactory($$jqLite) { + return function(element, options) { + if (options.addClass) { + $$addClass($$jqLite, element, options.addClass); + options.addClass = null; + } + if (options.removeClass) { + $$removeClass($$jqLite, element, options.removeClass); + options.removeClass = null; + } + } +} + +function prepareAnimationOptions(options) { + options = options || {}; + if (!options.$$prepared) { + var domOperation = options.domOperation || noop; + options.domOperation = function() { + options.$$domOperationFired = true; + domOperation(); + domOperation = noop; + }; + options.$$prepared = true; + } + return options; +} + +function applyAnimationStyles(element, options) { + applyAnimationFromStyles(element, options); + applyAnimationToStyles(element, options); +} + +function applyAnimationFromStyles(element, options) { + if (options.from) { + element.css(options.from); + options.from = null; + } +} + +function applyAnimationToStyles(element, options) { + if (options.to) { + element.css(options.to); + options.to = null; + } +} + +function mergeAnimationOptions(element, target, newOptions) { + var toAdd = (target.addClass || '') + ' ' + (newOptions.addClass || ''); + var toRemove = (target.removeClass || '') + ' ' + (newOptions.removeClass || ''); + var classes = resolveElementClasses(element.attr('class'), toAdd, toRemove); + + extend(target, newOptions); + + if (classes.addClass) { + target.addClass = classes.addClass; + } else { + target.addClass = null; + } + + if (classes.removeClass) { + target.removeClass = classes.removeClass; + } else { + target.removeClass = null; + } + + return target; +} + +function resolveElementClasses(existing, toAdd, toRemove) { + var ADD_CLASS = 1; + var REMOVE_CLASS = -1; + + var flags = {}; + existing = splitClassesToLookup(existing); + + toAdd = splitClassesToLookup(toAdd); + forEach(toAdd, function(value, key) { + flags[key] = ADD_CLASS; + }); + + toRemove = splitClassesToLookup(toRemove); + forEach(toRemove, function(value, key) { + flags[key] = flags[key] === ADD_CLASS ? null : REMOVE_CLASS; + }); + + var classes = { + addClass: '', + removeClass: '' + }; + + forEach(flags, function(val, klass) { + var prop, allow; + if (val === ADD_CLASS) { + prop = 'addClass'; + allow = !existing[klass]; + } else if (val === REMOVE_CLASS) { + prop = 'removeClass'; + allow = existing[klass]; + } + if (allow) { + if (classes[prop].length) { + classes[prop] += ' '; + } + classes[prop] += klass; + } + }); + + function splitClassesToLookup(classes) { + if (isString(classes)) { + classes = classes.split(' '); + } + + var obj = {}; + forEach(classes, function(klass) { + // sometimes the split leaves empty string values + // incase extra spaces were applied to the options + if (klass.length) { + obj[klass] = true; + } + }); + return obj; + } + + return classes; +} + +function getDomNode(element) { + return (element instanceof angular.element) ? element[0] : element; +} + +var $$rAFSchedulerFactory = ['$$rAF', function($$rAF) { + var tickQueue = []; + var cancelFn; + + function scheduler(tasks) { + // we make a copy since RAFScheduler mutates the state + // of the passed in array variable and this would be difficult + // to track down on the outside code + tickQueue.push([].concat(tasks)); + nextTick(); + } + + /* waitUntilQuiet does two things: + * 1. It will run the FINAL `fn` value only when an uncancelled RAF has passed through + * 2. It will delay the next wave of tasks from running until the quiet `fn` has run. + * + * The motivation here is that animation code can request more time from the scheduler + * before the next wave runs. This allows for certain DOM properties such as classes to + * be resolved in time for the next animation to run. + */ + scheduler.waitUntilQuiet = function(fn) { + if (cancelFn) cancelFn(); + + cancelFn = $$rAF(function() { + cancelFn = null; + fn(); + nextTick(); + }); + }; + + return scheduler; + + function nextTick() { + if (!tickQueue.length) return; + + var updatedQueue = []; + for (var i = 0; i < tickQueue.length; i++) { + var innerQueue = tickQueue[i]; + runNextTask(innerQueue); + if (innerQueue.length) { + updatedQueue.push(innerQueue); + } + } + tickQueue = updatedQueue; + + if (!cancelFn) { + $$rAF(function() { + if (!cancelFn) nextTick(); + }); + } + } + + function runNextTask(tasks) { + var nextTask = tasks.shift(); + nextTask(); + } +}]; + +var $$AnimateChildrenDirective = [function() { + return function(scope, element, attrs) { + var val = attrs.ngAnimateChildren; + if (angular.isString(val) && val.length === 0) { //empty attribute + element.data(NG_ANIMATE_CHILDREN_DATA, true); + } else { + attrs.$observe('ngAnimateChildren', function(value) { + value = value === 'on' || value === 'true'; + element.data(NG_ANIMATE_CHILDREN_DATA, value); + }); + } + }; +}]; + +/** + * @ngdoc service + * @name $animateCss + * @kind object + * + * @description + * The `$animateCss` service is a useful utility to trigger customized CSS-based transitions/keyframes + * from a JavaScript-based animation or directly from a directive. The purpose of `$animateCss` is NOT + * to side-step how `$animate` and ngAnimate work, but the goal is to allow pre-existing animations or + * directives to create more complex animations that can be purely driven using CSS code. + * + * Note that only browsers that support CSS transitions and/or keyframe animations are capable of + * rendering animations triggered via `$animateCss` (bad news for IE9 and lower). + * + * ## Usage + * Once again, `$animateCss` is designed to be used inside of a registered JavaScript animation that + * is powered by ngAnimate. It is possible to use `$animateCss` directly inside of a directive, however, + * any automatic control over cancelling animations and/or preventing animations from being run on + * child elements will not be handled by Angular. For this to work as expected, please use `$animate` to + * trigger the animation and then setup a JavaScript animation that injects `$animateCss` to trigger + * the CSS animation. + * + * The example below shows how we can create a folding animation on an element using `ng-if`: + * + * ```html + * + *