From 929c1f13697f338245571694beb73adbd39a5b78 Mon Sep 17 00:00:00 2001 From: Soumendu Sekhar Acharya Date: Wed, 1 Aug 2018 17:21:15 +0530 Subject: [PATCH] SDN-C support&provide network layer tests Using IP SDNC-252,SDNC-253,SDNC-264,SDNC-266 are added as part of this story Change-Id: Ic65ca32c4786fac1be9269dbc6a2162b433f0630 Issue-ID: SDNC-264 Signed-off-by: Soumendu Sekhar Acharya Former-commit-id: d90280efcad173fd2250b8e2e98cb8f480007657 --- SdncReports/README.md | 11 + SdncReports/SdncReportsApi/pom.xml | 210 +++++++ .../java/com/onap/sdnc/reports/Application.java | 42 ++ .../com/onap/sdnc/reports/ServletInitializer.java | 32 ++ .../sdnc/reports/config/EmbeddedMariaDbConfig.java | 5 + .../sdnc/reports/config/JpaApplicationConfig.java | 30 + .../controller/CertificationController.java | 54 ++ .../sdnc/reports/controller/ReportController.java | 59 ++ .../service/CertificationClientService.java | 210 +++++++ .../onap/sdnc/reports/service/IReportService.java | 35 ++ .../sdnc/reports/service/LayerTestService.java | 31 + .../sdnc/reports/service/LayerTestServiceImpl.java | 93 +++ .../sdnc/reports/service/ReportServiceImpl.java | 89 +++ .../src/main/resources/application.properties | 30 + .../SdncReportsApi/src/main/resources/log4j2.xml | 38 ++ .../src/main/resources/static/footer.html | 3 + .../main/resources/static/form-validationTest.html | 148 +++++ .../src/main/resources/static/form-viewReport.html | 129 +++++ .../src/main/resources/static/header.html | 3 + .../src/main/resources/static/images/FailImage.png | Bin 0 -> 2950 bytes .../src/main/resources/static/images/download.png | Bin 0 -> 1066 bytes .../main/resources/static/images/downloadImage.png | Bin 0 -> 3524 bytes .../src/main/resources/static/images/error.png | Bin 0 -> 5610 bytes .../src/main/resources/static/images/fail.png | Bin 0 -> 1850 bytes .../src/main/resources/static/images/images.png | Bin 0 -> 3716 bytes .../main/resources/static/images/networklayer.png | Bin 0 -> 4580 bytes .../src/main/resources/static/images/protocaol.png | Bin 0 -> 2625 bytes .../src/main/resources/static/images/protocol.png | Bin 0 -> 10646 bytes .../src/main/resources/static/images/reachable.png | Bin 0 -> 1219 bytes .../src/main/resources/static/images/router.jpg | Bin 0 -> 3142 bytes .../src/main/resources/static/images/router.png | Bin 0 -> 5693 bytes .../src/main/resources/static/images/search.png | Bin 0 -> 3284 bytes .../src/main/resources/static/images/success.png | Bin 0 -> 4416 bytes .../main/resources/static/images/validation.png | Bin 0 -> 5110 bytes .../src/main/resources/static/images/waning.png | Bin 0 -> 6481 bytes .../resources/static/sdnc-stubs/getAllDevices.json | 17 + .../resources/static/sdnc-stubs/getAllReports.json | 75 +++ .../resources/static/sdnc-stubs/getAllTest.json | 17 + .../resources/static/sdnc-stubs/getAllVNF.json | 29 + .../resources/static/sdnc-stubs/getTestResult.json | 42 ++ .../src/main/resources/static/style/sdnc-style.css | 240 ++++++++ .../src/main/resources/static/style/w3.css | 231 ++++++++ .../src/main/resources/static/tabs.html | 10 + .../src/main/webapp/WEB-INF/views/index.jsp | 67 +++ .../SdncReportsApi/src/main/webapp/js/app.js | 47 ++ .../sdnc-validationTest-controller.js | 207 +++++++ .../sdnc-controller/sdnc-viewreport-controller.js | 169 ++++++ .../sdnc-services/sdnc-validationTest-service.js | 62 ++ .../js/sdnc-services/sdnc-viewReport-service.js | 53 ++ .../main/webapp/node_modules/angular-growl.min.css | 7 + .../main/webapp/node_modules/angular-growl.min.js | 6 + .../main/webapp/node_modules/angular-route.min.js | 15 + .../webapp/node_modules/angular-sanitize.min.js | 16 + .../angular-utils-pagination/dirPagination.js | 639 +++++++++++++++++++++ .../src/main/webapp/node_modules/angular.min.js | 250 ++++++++ .../angularjs-datetime-picker.css | 74 +++ .../angularjs-datetime-picker.js | 332 +++++++++++ .../angularjs-datetime-picker.min.js | 1 + .../node_modules/bootstrap-3.3.7/package.json | 89 +++ .../src/main/webapp/node_modules/jquery.min.js | 2 + .../webapp/node_modules/ng-csv/build/ng-csv.js | 319 ++++++++++ .../webapp/node_modules/ng-csv/build/ng-csv.min.js | 2 + .../node_modules/ng-ip-address/ngIpAddress.min.js | 1 + .../ng-ip-address/ngIpAddress.vanilla.min.js | 1 + .../webapp/node_modules/ng-ip-address/package.json | 67 +++ .../src/main/webapp/node_modules/tether.min.js | 1 + .../SdncReportsApi/src/main/webapp/package.json | 32 ++ .../com/onap/sdnc/reports/ApplicationTest.java | 35 ++ .../reports/controller/ReportControllerTest.java | 100 ++++ .../service/CertificationClientServiceTest.java | 94 +++ .../reports/service/LayerTestServiceImplTest.java | 84 +++ .../reports/service/NetworkCertificationTest.java | 109 ++++ .../reports/service/ReportServiceImplTest.java | 127 ++++ .../testapi/model/CertificationInputsTest.java | 61 ++ .../com/onap/sdnc/testapi/model/InputTest.java | 34 ++ .../onap/sdnc/testapi/model/OdlResponseTest.java | 60 ++ .../com/onap/sdnc/testapi/model/OutputTest.java | 65 +++ .../sdnc/testapi/model/PreTestResponseTest.java | 59 ++ .../com/onap/sdnc/testapi/model/RequestTest.java | 75 +++ .../com/onap/sdnc/testapi/model/ResponseTest.java | 66 +++ .../onap/sdnc/testapi/model/ValidationTest.java | 48 ++ .../com/onap/sdnc/testapi/model/VnfListTest.java | 53 ++ .../java/com/onap/sdnc/testapi/model/VnfTest.java | 61 ++ .../src/test/resources/application.properties | 17 + SdncReports/SdncReportsApi/start.sh | 6 + SdncReports/SdncReportsDao/pom.xml | 65 +++ .../sdnc/reports/model/CertificationInputs.java | 35 ++ .../com/onap/sdnc/reports/model/DeviceConfig.java | 92 +++ .../java/com/onap/sdnc/reports/model/Input.java | 53 ++ .../onap/sdnc/reports/model/ODLClientResponse.java | 34 ++ .../java/com/onap/sdnc/reports/model/Output.java | 101 ++++ .../com/onap/sdnc/reports/model/PreTestConfig.java | 120 ++++ .../onap/sdnc/reports/model/PreTestResponse.java | 85 +++ .../java/com/onap/sdnc/reports/model/Request.java | 43 ++ .../java/com/onap/sdnc/reports/model/Response.java | 39 ++ .../sdnc/reports/model/ValidationTestType.java | 47 ++ .../main/java/com/onap/sdnc/reports/model/Vnf.java | 47 ++ .../java/com/onap/sdnc/reports/model/VnfList.java | 54 ++ .../sdnc/reports/repository/DeviceRepository.java | 43 ++ .../repository/PreTestConfigRepository.java | 48 ++ .../reports/rest/model/ConfigDetailsRestModel.java | 51 ++ .../com/onap/sdnc/reports/rest/model/JSONTags.java | 55 ++ .../onap/sdnc/reports/rest/model/PreTestModel.java | 113 ++++ .../src/main/resources/application.properties | 11 + .../src/test/resources/application.properties | 17 + SdncReports/pom.xml | 65 +++ pom.xml | 1 + 107 files changed, 6745 insertions(+) create mode 100644 SdncReports/README.md create mode 100644 SdncReports/SdncReportsApi/pom.xml create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/Application.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/ServletInitializer.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/EmbeddedMariaDbConfig.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/JpaApplicationConfig.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/CertificationController.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/ReportController.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/CertificationClientService.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/IReportService.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestService.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestServiceImpl.java create mode 100644 SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/ReportServiceImpl.java create mode 100644 SdncReports/SdncReportsApi/src/main/resources/application.properties create mode 100644 SdncReports/SdncReportsApi/src/main/resources/log4j2.xml create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/footer.html create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/form-validationTest.html create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/form-viewReport.html create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/header.html create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/FailImage.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/download.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/downloadImage.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/error.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/fail.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/images.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/networklayer.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/protocaol.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/protocol.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/reachable.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/router.jpg create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/router.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/search.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/success.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/validation.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/images/waning.png create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllDevices.json create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllReports.json create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllTest.json create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllVNF.json create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getTestResult.json create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/style/sdnc-style.css create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/style/w3.css create mode 100644 SdncReports/SdncReportsApi/src/main/resources/static/tabs.html create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/WEB-INF/views/index.jsp create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/js/app.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-validationTest-controller.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-viewreport-controller.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-validationTest-service.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-viewReport-service.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.css create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-route.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-sanitize.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-utils-pagination/dirPagination.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/bootstrap-3.3.7/package.json create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/jquery.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/ng-csv/build/ng-csv.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/ng-csv/build/ng-csv.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/ng-ip-address/ngIpAddress.vanilla.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/ng-ip-address/package.json create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/node_modules/tether.min.js create mode 100644 SdncReports/SdncReportsApi/src/main/webapp/package.json create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/reports/ApplicationTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/reports/controller/ReportControllerTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/reports/service/CertificationClientServiceTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/reports/service/LayerTestServiceImplTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/reports/service/NetworkCertificationTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/reports/service/ReportServiceImplTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/CertificationInputsTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/InputTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/OdlResponseTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/OutputTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/PreTestResponseTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/RequestTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/ResponseTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/ValidationTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/VnfListTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/java/com/onap/sdnc/testapi/model/VnfTest.java create mode 100644 SdncReports/SdncReportsApi/src/test/resources/application.properties create mode 100644 SdncReports/SdncReportsApi/start.sh create mode 100644 SdncReports/SdncReportsDao/pom.xml create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/CertificationInputs.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/DeviceConfig.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/Input.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/ODLClientResponse.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/Output.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/PreTestConfig.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/PreTestResponse.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/Request.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/Response.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/ValidationTestType.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/Vnf.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/model/VnfList.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/repository/DeviceRepository.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/repository/PreTestConfigRepository.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/rest/model/ConfigDetailsRestModel.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/rest/model/JSONTags.java create mode 100644 SdncReports/SdncReportsDao/src/main/java/com/onap/sdnc/reports/rest/model/PreTestModel.java create mode 100644 SdncReports/SdncReportsDao/src/main/resources/application.properties create mode 100644 SdncReports/SdncReportsDao/src/test/resources/application.properties create mode 100644 SdncReports/pom.xml diff --git a/SdncReports/README.md b/SdncReports/README.md new file mode 100644 index 00000000..651f64bd --- /dev/null +++ b/SdncReports/README.md @@ -0,0 +1,11 @@ +Parent-SdncReports (ccsdk is used as parent) +--------------------------------------------- +Child- + SdncReportsApi + SdncReportsDao +DB information:- +Need to change below DB details inside application.properties. + + spring.datasource.url=jdbc:mariadb://localhost:3306/testreports + spring.datasource.username=root + spring.datasource.password=root \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/pom.xml b/SdncReports/SdncReportsApi/pom.xml new file mode 100644 index 00000000..2529a054 --- /dev/null +++ b/SdncReports/SdncReportsApi/pom.xml @@ -0,0 +1,210 @@ + + 4.0.0 + jar + SdncReportsApi + + org.onap.ccsdk.parent + SdncReports + 0.0.1-SNAPSHOT + + + + + UTF-8 + UTF-8 + 1.8 + + + + + + + + ch.vorburger.mariaDB4j + mariaDB4j + 2.2.3 + + + + + com.google.code.gson + gson + 2.8.2 + + + + + + org.onap.ccsdk.parent + SdncReportsDao + 0.0.1-SNAPSHOT + + + + org.mariadb.jdbc + mariadb-java-client + 1.1.9 + + + + org.springframework.boot + spring-boot-starter-web + 1.5.4.RELEASE + + + + org.springframework + spring-context + 4.3.9.RELEASE + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + + + org.springframework.boot + spring-boot-devtools + true + + + + org.springframework.boot + spring-boot-starter-test + test + 1.5.3.RELEASE + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + org.jacoco + jacoco-maven-plugin + 0.7.5.201505241946 + + + + pre-unit-test + + prepare-agent + + + + ${project.build.directory}/coverage-reports/jacoco-ut.exec + + surefireArgLine + + + + + post-unit-test + test + + report + + + + ${project.build.directory}/coverage-reports/jacoco-ut.exec + + ${project.reporting.outputDirectory}/jacoco-ut + + + + + + + io.fabric8 + docker-maven-plugin + 0.15.3 + + http://127.0.0.1:9092 + true + + + vishal/sdnc_report + + Dockerfile + + artifact + + + + + + + + + + \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/Application.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/Application.java new file mode 100644 index 00000000..b7cd50f5 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/Application.java @@ -0,0 +1,42 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ + +package com.onap.sdnc.reports; + + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + +@SpringBootApplication(scanBasePackages = {"com.onap.sdnc.reports.*","com.onap.sdnc.testapi.*"}) +@EnableAutoConfiguration +public class Application { + private static final Logger logger = LogManager.getLogger(Application.class); + public static void main(String[] args) { + + SpringApplication.run(Application.class, args); + logger.info("SDNC REPORTS API Has Started.."); + } +} + + diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/ServletInitializer.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/ServletInitializer.java new file mode 100644 index 00000000..55678cb1 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/ServletInitializer.java @@ -0,0 +1,32 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ +package com.onap.sdnc.reports; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/EmbeddedMariaDbConfig.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/EmbeddedMariaDbConfig.java new file mode 100644 index 00000000..ca45838f --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/EmbeddedMariaDbConfig.java @@ -0,0 +1,5 @@ +package com.onap.sdnc.reports.config; + +public class EmbeddedMariaDbConfig { + +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/JpaApplicationConfig.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/JpaApplicationConfig.java new file mode 100644 index 00000000..97ff2820 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/config/JpaApplicationConfig.java @@ -0,0 +1,30 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ +package com.onap.sdnc.reports.config; + + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@EnableJpaRepositories("com.onap.sdnc.reports.repository") +@EntityScan("com.onap.sdnc.reports.*") +public class JpaApplicationConfig { + +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/CertificationController.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/CertificationController.java new file mode 100644 index 00000000..7d69794a --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/CertificationController.java @@ -0,0 +1,54 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ +package com.onap.sdnc.reports.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import com.onap.sdnc.reports.model.Request; +import com.onap.sdnc.reports.model.Response; +import com.onap.sdnc.reports.service.LayerTestService; + + +@RestController +public class CertificationController { + + @Autowired + LayerTestService ltService; + + @RequestMapping("/") + ModelAndView home(ModelAndView modelAndView) { + + modelAndView.setViewName("index"); + + return modelAndView; + } + + @RequestMapping(value="/runtest",method=RequestMethod.POST, consumes="application/json",produces=MediaType.APPLICATION_JSON_VALUE) + public Response findReportByTestName(@RequestBody Request req) { + + return ltService.networkCertification(req); + } +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/ReportController.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/ReportController.java new file mode 100644 index 00000000..55a63604 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/controller/ReportController.java @@ -0,0 +1,59 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ +package com.onap.sdnc.reports.controller; + +import java.util.Date; +import java.util.List; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.onap.sdnc.reports.rest.model.PreTestModel; +import com.onap.sdnc.reports.service.IReportService; + +@RestController +public class ReportController { + + private static final Logger logger = LogManager.getLogger(ReportController.class); + + @Autowired + IReportService reportService; + @RequestMapping(value="/findReportByDeviceIP/{startDate}/{endDate}/{deviceIP:.+}", produces = "application/json",method=RequestMethod.GET) + public List findReportByDeviceIP(@PathVariable("startDate") Date startDate,@PathVariable("endDate") Date endDate,@PathVariable("deviceIP") String deviceIP) { + + try{ + logger.info("findReportByDeviceIP Started Working.."); + if(logger.isDebugEnabled()) + logger.debug("Received StartDate : "+startDate+" ,EndDate : "+endDate+" ,DeviceIP : "+deviceIP); + + return reportService.findReportByDeviceIP(startDate,endDate,deviceIP); + } + catch(Exception ex) + { + logger.info("Exception Occured : "+ex.getLocalizedMessage()); + return java.util.Collections.emptyList(); + } + } +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/CertificationClientService.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/CertificationClientService.java new file mode 100644 index 00000000..589fecf0 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/CertificationClientService.java @@ -0,0 +1,210 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package com.onap.sdnc.reports.service; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.onap.sdnc.reports.model.CertificationInputs; +import com.onap.sdnc.reports.model.DeviceConfig; +import com.onap.sdnc.reports.model.ODLClientResponse; +import com.onap.sdnc.reports.model.Output; +import com.onap.sdnc.reports.model.PreTestResponse; +import com.onap.sdnc.reports.repository.DeviceRepository; +import com.onap.sdnc.reports.repository.PreTestConfigRepository; + +@Service +public class CertificationClientService { + + private static final Logger logger = Logger.getLogger(CertificationClientService.class); + + + @Autowired + DeviceRepository deviceRepository; + + @Autowired + PreTestConfigRepository preTestRepo; + + ObjectMapper mapper = new ObjectMapper(); + + public void restClient(CertificationInputs vnfinfo, List preTestNew, String testType) { + + PreTestResponse preTest = new PreTestResponse(); + + Output output = new Output(); + if ("network".equalsIgnoreCase(testType)) { + output = pingTest(vnfinfo); + } + if ("protocol".equalsIgnoreCase(testType)) { + output = protocolTest(vnfinfo); + } + preTest.setStatus(output.getStatus()); + preTest.setIpaddress(output.getIpaddress()); + preTest.setStatistics(output.getStatistics()); + preTest.setAvgTime(output.getAvgTime()); + preTest.setTesttype(testType); + preTest.setHostname(output.getHostname()); + preTestNew.add(preTest); + + ODLClientResponse odlClientResponse=new ODLClientResponse(); + odlClientResponse.setOutput(output); + + testSaveResults(preTest, odlClientResponse); + } + + public static Output pingTest(CertificationInputs vnfinfo) { + + Output output = new Output(); + String pingCmd = "ping " + vnfinfo.getInput().getIpaddress(); + String pingResult = ""; + String testResult = "fail"; + String status = "unreachable"; + String reason = null; + String timeRes = null; + String percentile = null; + boolean flag = false; + boolean flag1 = false; + try { + InetAddress byIpaddress = InetAddress.getByName(vnfinfo.getInput().getIpaddress()); + String byHostName=vnfinfo.getInput().getHostname(); + flag = byIpaddress.isReachable(5000); + + } catch (UnknownHostException e) { + logger.info("Network certification Exception : " + e); + } catch (IOException e) { + logger.info("Network certification Exception : " + e); + } + + if (flag ) { + try { + Runtime r = Runtime.getRuntime(); + Process p = r.exec(pingCmd); + BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); + String inputLine; + while ((inputLine = in.readLine()) != null) { + if (pingResult.equals("")) { + pingResult = inputLine; + } else { + pingResult += "~" + inputLine; + } + } + String[] results = pingResult.split("~"); + for (String res : results) { + if (res.trim().contains("Packets:")) { + testResult = "pass"; + status = "reachable"; + String packets = res.trim(); + String[] lossPercentile = packets.split("\\("); + percentile = lossPercentile[1].replace(")", "").replace(",", "").trim(); + } + if (res.trim().contains("Minimum")) { + String timeMs = res.trim(); + String[] time = timeMs.split(","); + timeRes = time[0]; + } + } + in.close(); + } catch (Exception e) { + logger.info("Network certification Exception : " + e); + testResult = "fail"; + status = "unreachable"; + reason = e.toString(); + } + } + output.setAvgTime(timeRes); + output.setStatistics(percentile); + output.setHostname(vnfinfo.getInput().getHostname()); + output.setIpaddress(vnfinfo.getInput().getIpaddress()); + output.setReason(reason); + output.setTestresult(testResult); + output.setStatus(status); + + return output; + } + + public static Output protocolTest(CertificationInputs vnfinfo) { + Output output = new Output(); + Socket s = null; + String status = "unreachable"; + String reason = null; + try { + s = new Socket(vnfinfo.getInput().getIpaddress(), Integer.parseInt("445")); + status = "reachable"; + } catch (Exception e) { + logger.info("Protocol certification Exception : " + e); + reason = e.toString(); + status = "unreachable"; + } finally { + if (s != null) + try { + s.close(); + } catch (Exception e) { + logger.info("Protocol certification Exception : " + e); + reason = e.toString(); + status = "unreachable"; + } + } + output.setStatus(status); + output.setIpaddress(vnfinfo.getInput().getIpaddress()); + output.setReason(reason); + + return output; + } + + public void testSaveResults(PreTestResponse preTest,ODLClientResponse output) { + boolean flag=false; + long devId = 1; + + String timeStamp = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); + try { + DeviceConfig devicename = deviceRepository.findDeviceIP(preTest.getIpaddress()); + devId = devicename.getId(); + } catch (Exception e) { + flag=true; + } + if(flag) { + deviceRepository.logDeviceName(preTest.getIpaddress(), timeStamp); + } + + DeviceConfig devicename = deviceRepository.findDeviceIP(preTest.getIpaddress()); + devId = devicename.getId(); + + Gson gson = new Gson(); + String testName= preTest.getTesttype(); + String result = preTest.getStatus(); + String execuationDetails = gson.toJson(output); + + preTestRepo.logPreTestReport(testName, result, execuationDetails, timeStamp, devId); + } + +} \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/IReportService.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/IReportService.java new file mode 100644 index 00000000..cdf7b167 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/IReportService.java @@ -0,0 +1,35 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ +package com.onap.sdnc.reports.service; + +import java.util.Date; +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; + +import com.onap.sdnc.reports.rest.model.PreTestModel; + +public interface IReportService { + + public List findReportByDeviceIP(@PathVariable("startDate") Date startDate,@PathVariable("endDate") Date endDate,@RequestParam("deviceIP") String deviceIP) throws Exception; + + +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestService.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestService.java new file mode 100644 index 00000000..85afdc92 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestService.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package com.onap.sdnc.reports.service; + +import com.onap.sdnc.reports.model.Request; +import com.onap.sdnc.reports.model.Response; + + +public interface LayerTestService { + + public Response networkCertification(Request restReq); + +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestServiceImpl.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestServiceImpl.java new file mode 100644 index 00000000..0565e51a --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/LayerTestServiceImpl.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package com.onap.sdnc.reports.service; + +import java.util.ArrayList; +import java.util.List; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.stereotype.Service; +import com.onap.sdnc.reports.model.CertificationInputs; +import com.onap.sdnc.reports.model.Input; +import com.onap.sdnc.reports.model.PreTestResponse; +import com.onap.sdnc.reports.model.Request; +import com.onap.sdnc.reports.model.Response; +import com.onap.sdnc.reports.model.ValidationTestType; +import com.onap.sdnc.reports.model.VnfList; +import com.onap.sdnc.reports.repository.DeviceRepository; +import com.onap.sdnc.reports.repository.PreTestConfigRepository; + + +@EnableJpaRepositories("com.onap.sdnc.reports.repository") +@EntityScan("com.onap.sdnc.*") +@EnableAutoConfiguration +@Service +public class LayerTestServiceImpl implements LayerTestService { + + private static final Logger logger = Logger.getLogger(CertificationClientService.class); + + @Autowired + CertificationClientService certificationClientservice; + + @Autowired + DeviceRepository deviceRepository; + + @Autowired + PreTestConfigRepository preTestRepo; + + @Override + public Response networkCertification(Request restReq) { + + String testType = "network"; + + VnfList[] vnf = restReq.getVnfList(); + + ValidationTestType[] validationType = restReq.getValidationTestType(); + + CertificationInputs vnfRequestParams = new CertificationInputs(); + + Response resOutput = new Response(); + + Input input = new Input(); + + List preTestNew = new ArrayList(); + for (ValidationTestType validationTestType : validationType) { + if (validationTestType.getValidationType().equalsIgnoreCase("Network Layer")) { + testType = "network"; + } + if (validationTestType.getValidationType().equalsIgnoreCase("Protocol Layer")) { + testType = "protocol"; + } + for (VnfList vnfList : vnf) { + input.setIpaddress(vnfList.getIpAddress()); + input.setHostname(vnfList.getHostName()); + vnfRequestParams.setInput(input); + certificationClientservice.restClient(vnfRequestParams, preTestNew, testType); + } + } + resOutput.setPreTestResponse(preTestNew); + return resOutput; + } + +} diff --git a/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/ReportServiceImpl.java b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/ReportServiceImpl.java new file mode 100644 index 00000000..68e28987 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/java/com/onap/sdnc/reports/service/ReportServiceImpl.java @@ -0,0 +1,89 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ +package com.onap.sdnc.reports.service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.onap.sdnc.reports.model.PreTestConfig; +import com.onap.sdnc.reports.repository.DeviceRepository; +import com.onap.sdnc.reports.repository.PreTestConfigRepository; +import com.onap.sdnc.reports.rest.model.PreTestModel; + +@Service +public class ReportServiceImpl implements IReportService { + + private static final Logger logger = LogManager.getLogger(ReportServiceImpl.class); + + @Autowired + DeviceRepository deviceRepository; + + @Autowired + PreTestConfigRepository preTestConfigRepository; + + + @Override + public List findReportByDeviceIP(Date startDate, Date endDate, String deviceIP) throws Exception{ + + try{ + + List resultSet= preTestConfigRepository.findReportByDeviceIP(startDate, endDate, deviceIP); + + if(logger.isDebugEnabled()) + logger.debug("Received Output From Repository Is: "+resultSet); + + List preTestList=new ArrayList(); + for(PreTestConfig config : resultSet) + { + try{ + long deviceid=config.getDevice().getId(); + long testid=config.getTestId(); + String testName=config.getTestName(); + String deviceIp=config.getDevice().getDeviceIP(); + String execuationDetails=config.getExecuationDetails(); + String result=config.getResult(); + Date timeStamp=config.getTimestamp(); + + PreTestModel model=new PreTestModel(testid, deviceid, testName, deviceIp, execuationDetails, result, timeStamp); + preTestList.add(model); + } + catch(Exception ex) + { + logger.info("Exception Occured : "+ex.getLocalizedMessage()); + logger.error(ex); + } + } + logger.info("Final PreTestConfig List Size : "+preTestList.size()); + logger.info("findReportByDeviceIP Finished Working.."); + return preTestList; + } + catch(Exception ex) + { + logger.info("Exception Occured : "+ex.getLocalizedMessage()); + logger.error(ex); + throw new Exception("Exception occurred while processing findReportByDeviceIP ",ex); + } + } +} diff --git a/SdncReports/SdncReportsApi/src/main/resources/application.properties b/SdncReports/SdncReportsApi/src/main/resources/application.properties new file mode 100644 index 00000000..c680ce20 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/application.properties @@ -0,0 +1,30 @@ +server.port = 9003 + +spring.jackson.serialization.fail-on-empty-beans=false + +server.tomcat.uri-encoding=utf-8 + +server.error.whitelabel.enabled=false +spring.mvc.view.prefix = /WEB-INF/views/ +spring.mvc.view.suffix = .jsp + +spring.datasource.url=jdbc:mariadb://localhost:3306/testreports +spring.datasource.username=root +spring.datasource.password=12345 +spring.datasource.driver-class-name=org.mariadb.jdbc.Driver +# Keep the connection alive if idle for a long time (needed in production) +spring.datasource.testWhileIdle=true +spring.datasource.validationQuery=SELECT 1 +# =============================== +# = JPA / HIBERNATE +# =============================== +# Show or not log for each sql query +spring.jpa.show-sql=true +# Hibernate ddl auto (create, create-drop, update): with "create-drop" the database +# schema will be automatically created afresh for every start of application +spring.jpa.hibernate.ddl-auto=update +# Naming strategy +spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl +spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy +# Allows Hibernate to generate SQL optimized for a particular DBMS +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/log4j2.xml b/SdncReports/SdncReportsApi/src/main/resources/log4j2.xml new file mode 100644 index 00000000..e443b529 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/log4j2.xml @@ -0,0 +1,38 @@ + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex + + + + + + + + + + ${LOG_PATTERN} + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/footer.html b/SdncReports/SdncReportsApi/src/main/resources/static/footer.html new file mode 100644 index 00000000..0b31ef70 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/footer.html @@ -0,0 +1,3 @@ + diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/form-validationTest.html b/SdncReports/SdncReportsApi/src/main/resources/static/form-validationTest.html new file mode 100644 index 00000000..7ca70cc0 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/form-validationTest.html @@ -0,0 +1,148 @@ + +
+
+   Pre-test/Certification +
+
+
+ + + + +
+
+
+ +
+
+ +
+ Required! +
+
+ Not + a valid IPAddress! +
+
+ Not + a valid IPAddress! +
+
+
+
+
+ +
+
+ +
+ Required! +
+
+ Not + a valid HostName! +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
SNo.TestNameDevice IPStatusStatistics (%Loss)Average Time (ms)Result
{{$index+1}}{{test.testtype}}{{test.ipaddress}}{{test.status | uppercase}}{{test.statistics | uppercase}}{{test.avgTime | uppercase}}
+ +
+ +
+
+    +    + +    +
+
+
\ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/form-viewReport.html b/SdncReports/SdncReportsApi/src/main/resources/static/form-viewReport.html new file mode 100644 index 00000000..ac6b86ee --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/form-viewReport.html @@ -0,0 +1,129 @@ + +
+
  Search For Historical Test Reports
+
+
+
+ + + +
+
+ + +
+ + Required! + + Not a valid date! +
+
+
+ + +
+ + Required! + + Not a valid date! +
+
+
+
+
+ + +
+ + Required! + + Not a valid date! +
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
SNo. + TestName + DeviceIP + Timestamp + Status + Statistics (%Loss)Average Time (ms)Result +
{{$index+1}} + {{test.testname}} + {{test.deviceIP}} + {{test.timeStamp}} + {{test.executionDetails.status | uppercase}} + {{test.executionDetails.statistics}} + {{test.executionDetails.avgTime}} + {{test.result}} +
+
+ +
+
+ + +
+
+ +    + + +
+
+
+ + +
+
+ + \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/header.html b/SdncReports/SdncReportsApi/src/main/resources/static/header.html new file mode 100644 index 00000000..23851589 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/header.html @@ -0,0 +1,3 @@ +
+

ONAP Certification Test Page

+
diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/FailImage.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/FailImage.png new file mode 100644 index 0000000000000000000000000000000000000000..22c44f7c22bffe52f9bbbfa97dbd6b6d1bdf8b5b GIT binary patch literal 2950 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 literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/downloadImage.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/downloadImage.png new file mode 100644 index 0000000000000000000000000000000000000000..e72e1285f5486cd07a3024ca34c6eb87c38dbfab GIT binary patch literal 3524 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 Hv*G^$PR(nG literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/error.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..3f44964b18de992e318edb8e8c70ccb582b3629c GIT binary patch literal 5610 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 literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/fail.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/fail.png new file mode 100644 index 0000000000000000000000000000000000000000..898fa264b64f0a84a2b0e3e7936648474159321b GIT binary patch literal 1850 zcmV-A2gUe_P);b36kXlT|32Gl*~oYx#2^1{OP*VpKb zjNepL{`mO)^Yi0wZu#Kg{O|APfPmU8EZsyz_0G=hqodwSOWZv@?yRiolatscCggQ> z*)lTVSy}SFzVNiP>X?}AsHojWMou(aQ~&@5bV)=(RCt{2oa=V#AP|Km#2~g7FGSPE zd#yd~`#<1;Tr^ck6RRPR`Tn#0e&$ZjWMFMlgwL2XgVHK^b6@A5@K#T9z!gP=^ztgVmcx-#1#FYqqTF3 z(FOQuIwk{fL@srp%ydu&m|mrWNQj;3s2XR1uhKzwl_S$}HO)Yg4k97mO~=(RL!}HN zA(o~iYnBaF>VW9RbYzWkT{BNDClPV`B5PqL_!Qq$N6B!m1GbJF*F_NV`0D4%pAw(oiEkWLAH!9)3H8~ zh*sz%^OoW8^45FhbPx&gYC777p?o&0PY7qNA(snSza)gK%UjPiT16s+o7ND1sFe<) zb{ z2#2g8ikgXMs*1QwC)>xOYz|pNt|t~6m%}g}IQ^WE1?xtGeH;qYhsGGE)WH>N2=^47 zqL2K*pYMoEN~$*$JHjpZ%n!#J!S7HD)Jfdk81z9Johxq3pa(ZPk62h|=_-+j64S!TRN`FZIMivwW%50pZU^!@f76dY(x&UNF55)U$e;@uW)DVnguMPJLaHF z2YYRmI@1Tmb4^<>)xlP4NT_QSv377+t^*0Id}gbznL>vT?N`cmu+ti%H%jWCtEisK z6%)e7<*k`^0gF)O7Z%6WJKlfC@%KTipnbMV-ES%h*7KD9)2YRO5iAfI3G{0|_E|&r zWu^~`Gx7n|VpDAyn7$dksrpnheVqEe5w5xlY}o-zr8}_BHVGTV>^LFa2d}TZSyLhEz97rh|dnhC&ipQ9Bi;4-IrZ9FK=@wXIWDoVZoT zD4C3}>pRG-IC1MXqhviSuvOk@l&nentsytrhigOkEq_F(G<`e({Ll2AmQrg6)?XmF z)wQ$EhP=Pg>MaSJG?WhV$yAFMz$={Xa4)o;nl_-a2tEjUXmiDAs$8`Fh(=!Vx$|Ek zYX4<>;I9F0fMD9@RsjG2000000000000000000000D#Rze!qx6>h(s0?8RwQPJY4X zQT{>w7Dqd|@RG|t6uFg(f^FhB-m^r9aQmKWg9iC$Ugh1>-4_qH^W@_%cJAmdV=8}aB)wfz%+kF@ z^DIZa-03vNGCdOS^eT`aZ?OgHR-_J$NF6@o^+s+$iLh)Zg@#eo;YI2|EItB6N3KH{ z=6=5|_So!O2to2~1YOa=LwtyFew@XId35?E?>9ekv@<#|KV~R%crC5dKropgwqD5JyijGY@sXLMk%KFM^L$a`iOv%*lSD>^X3 zmzb?juf241DH=vUxu(=%F_~Df8>=$s@k0s`04f1k+nYU<(+#>C_Ik@zGO+N+y>Psf{|2k0 z`1q5YYOup*a}eFBJ38d^O`Pt{4p}mv4ECaI;N%U0PxH;-Jl{=U$ z$9i^#J3&H+{OLqE`f(xz*&B}jenc}rC7nv}{^`|I_J-dZePsX5c;x?}Z#a4Y00000 o0000000000000000KgFc0ZIN;LUdiv6aWAK07*qoM6N<$f~0eCr2qf` literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/images.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/images.png new file mode 100644 index 0000000000000000000000000000000000000000..3bce57312222a6ba45feff7d2e542c50b45309c9 GIT binary patch literal 3716 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 K{Tqj;x&H@=DjVSd literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/reachable.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/reachable.png new file mode 100644 index 0000000000000000000000000000000000000000..bb771b32cb4a9a48945455309247c615f94328d4 GIT binary patch literal 1219 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 literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/success.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..76689fefc7a126dcf5a0844c111421eabb8c704a GIT binary patch literal 4416 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 IL1CBmKbrLWF#rGn literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/validation.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/validation.png new file mode 100644 index 0000000000000000000000000000000000000000..77c53ffa070c1d889ba6b97496d7e489c8f30aa0 GIT binary patch literal 5110 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 YKfGF4@TO^MH~;_u07*qoM6N<$g5}c4lmGw# literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/images/waning.png b/SdncReports/SdncReportsApi/src/main/resources/static/images/waning.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae298774b230aafd8e3808e34ed779d3f4bdede GIT binary patch literal 6481 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 literal 0 HcmV?d00001 diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllDevices.json b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllDevices.json new file mode 100644 index 00000000..d7faef5a --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllDevices.json @@ -0,0 +1,17 @@ + +{ + "deviceList":[ + { + "deviceId":"1", + "deviceName":"Device1" + }, + { + "deviceId":"2", + "deviceName":"Device2" + }, + { + "deviceId":"3", + "deviceName":"Device3" + } + ] +} \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllReports.json b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllReports.json new file mode 100644 index 00000000..cd0723f1 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllReports.json @@ -0,0 +1,75 @@ + +{ + "data":[ + { + "testid":1, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "pass", "status": "reachable","statistics": "0% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 70ms"}}, + "result":"Pass", + "timeStamp":"2018-03-16" + }, + { + "testid":2, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "fail", "status": "unreachable","statistics": "100% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 33ms"}}, + "result":"Pass", + "timeStamp":"2018-03-16" + }, + { + "testid":4, + "deviceid":1, + "testName":"Protocol Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"status": "unreachable"}}, + "result":"Fail", + "timeStamp":"2018-03-08" + }, + { + "testid":5, + "deviceid":1, + "testName":"Protocol Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"status": "reachable"}}, + "result":"Pass", + "timeStamp":"2018-03-15" + }, + { + "testid":6, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "fail", "status": "unreachable","statistics": "100% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 33ms"}}, + "result":"Fail", + "timeStamp":"2018-03-15" + }, + { + "testid":7, + "deviceid":1, + "testName":"Network Layer", + "deviceName":"Router", + "execuationDetails":{"output": {"hostname": "google.com","testresult": "fail", "status": "unreachable","statistics": "100% loss","ipaddress": "10.53.122.44","avgTime": "Minimum = 50ms"}}, + "result":"Fail", + "timeStamp":"2018-03-15" + } + ], + "status":200, + "config":{ + "method":"GET", + "transformRequest":[ + null + ], + "transformResponse":[ + null + ], + "params":"", + "headers":{ + "Accept":"application/json" + }, + "url":"/findReportByDeviceName/Thu Mar 15 2018 00:00:00 GMT+0530 (India Standard Time)/Fri Mar 16 2018 00:00:00 GMT+0530 (India Standard Time)/Router" + }, + "statusText":"" +} \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllTest.json b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllTest.json new file mode 100644 index 00000000..fc9b2901 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllTest.json @@ -0,0 +1,17 @@ + +{ + "testList":[ + { + "testId":"1", + "testName":"Test1" + }, + { + "testId":"2", + "testName":"Test2" + }, + { + "testId":"3", + "testName":"Test3" + } + ] +} \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllVNF.json b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllVNF.json new file mode 100644 index 00000000..4ebf9511 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getAllVNF.json @@ -0,0 +1,29 @@ + +{ + "vnfList":[ + { + "IpAddress":"1.160.10.240", + "HostName":"Host1", + "Selected":false, + "PortNo":"8282" + }, + { + "IpAddress":"1.160.10.241", + "HostName":"Host2", + "Selected":false, + "PortNo":"8080" + }, + { + "IpAddress":"1.160.10.242", + "HostName":"Host3", + "Selected":false, + "PortNo":"8285" + }, + { + "IpAddress":"1.160.10.243", + "HostName":"Host4", + "Selected":false, + "PortNo":"8286" + } + ] +} \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getTestResult.json b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getTestResult.json new file mode 100644 index 00000000..581c8b08 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/sdnc-stubs/getTestResult.json @@ -0,0 +1,42 @@ + +{ + "preTestResponse":[ + { + "ipaddress":"1.160.10.240", + "status":"unreachable", + "testtype":"Network Layer", + "statistics":null, + "avgTime":null + }, + { + "ipaddress":"1.160.10.240", + "status":"unreachable", + "testtype":"Protocol Layer", + "statistics":null, + "avgTime":null + }, + { + "ipaddress":"1.160.10.240", + "status":"reachable", + "testtype":"Network Layer", + "statistics":"0% loss", + "avgTime":"Minimum = 70ms" + } + ], + "status":200, + "config":{ + "method":"GET", + "transformRequest":[ + null + ], + "transformResponse":[ + null + ], + "params":"", + "headers":{ + "Accept":"application/json" + }, + "url":"/findReportByDeviceName/Thu Mar 15 2018 00:00:00 GMT+0530 (India Standard Time)/Fri Mar 16 2018 00:00:00 GMT+0530 (India Standard Time)/Router" + }, + "statusText":"" +} \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/style/sdnc-style.css b/SdncReports/SdncReportsApi/src/main/resources/static/style/sdnc-style.css new file mode 100644 index 00000000..361591cf --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/style/sdnc-style.css @@ -0,0 +1,240 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ + + body{ + padding-top:10px; + overflow-y:scroll; + padding-bottom:10px; + } + +/* form styling */ +#form-container{ + margin-bottom:20px; + border-radius:5px; +} +#form-container .page-header{ + margin:0; padding:30px; + border-top-left-radius:5px; border-top-right-radius:5px; + } + + table.tableDisplay{ + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + width: 100%; + table-layout: auto; +} + table.tableDisplay tr:nth-child(even){ + background-color: #C0C0C0; +} + table.tableDisplay th{ + padding-top: 12px; + padding-bottom: 12px; + text-align: left; + background: linear-gradient(to top, #f8f8f8 0%, #cce5ff 83%); + color: black; +} + table.tableDisplay td,table.tableDisplay th { + border: 1px solid #ddd; + padding: 8px; + width:30px; + +} + table.tableDisplay tr:{ + text-align: left; +} + table.tableDisplay tr:hover { + background-color:#cce5ff; +} + .first_row{ + background-color: #cce5ff; + color: black; + text-align:left; +} + .column { + float: left; + width: 32.2%; + padding: 10px; + margin-left:20px; + height: 60px; + /* Should be removed. Only for demonstration */ +} +/* Clear floats after the columns */ + .row:after { + content: ""; + display: table; + clear: both; +} + #btnSubmit{ + background-color: #cce5ff; + margin-top:20px; + margin-left:20px; + margin-bottom:10px; + width:100px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #ddd; + font-weight:700; +} + .btndownload{ + background-color: #cce5ff; + margin-top:20px; + margin-bottom:10px; + margin-left:20px; + width:130px; + height:30px; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + border: 1px solid #ddd; + font-weight:700; +} + #exampleInput{ + margin-left:25px; + width:160px; +} + #exampleEndInput{ + margin-left:10px; +} + .error{ + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + color:Red; + font-size: 14px; + margin-bottom:10px; +} + .labeltext{ + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; +} + .sort-icon { + font-size: 9px; + margin-left: 5px; +} + th { + cursor:pointer; +} + .heading{ + margin-top:30px; + width:100%; + height:45px; + margin-bottom:20px; + font-family:Trebuchet MS, Arial, Helvetica, sans-serif; + margin-right: -15px; + margin-left: 5px; + font-size: 20px; + background: linear-gradient(to top, #f8f8f8 0%, #cce5ff 83%); + padding-top:15px; + +} +form_validationBody{ + width:900px; + margin-left:15px; + margin-top:60px; + margin-bottom:20px; +} +button:hover { + position: relative; +} +button[title]:hover:after { + padding: 4px 8px; + position: absolute; + left: 0; + top: 100%; + white-space: nowrap; + z-index: 20px; + background:red; +} +.arrowRed { +font-size: 30px; +color: red; +} +.arrowGreen { +font-size: 30px; +color: green; +} +.ng-invalid { border: 1px solid red; } +.testMain{ + width:100%; + margin-bottom:20px; + height:400px; + margin-top:10px; +} +.testNotification{ + padding:0px; +} +.testImgIcon{ + margin-left:5px; + margin-right:10px; + padding-right:10px; +} +.testCol{ + background-color:#f2f2f2; + width:25%; + margin-left:35px; +} +.check{ + margin-left:10px; + margin-right:10px; +} +.btnRunTest{ + background-color:#f2f2f2; + width:75%; + height:75px; + margin-left:35px; + margin-bottom:35px; +} +.ReportMain{ + width:100%; + height:400px; + margin-top:10px; +} +.ReportNotification{ + padding:0px; + margin-right:10px; + text-align:center; +} +.ReportImgIcon{ + margin-left:5px; + margin-right:10px; +} +input[type=checkbox] { + padding-right: 3px;!important; + } + +.header{ + margin-top:20px; + width:1145px; + height:45px; + margin-bottom:5px; + font-family:Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 20px; + background: linear-gradient(to top, #f8f8f8 0%, #8F8484 83%); + padding-top:15px; + +} +.footer{ + margin-top:10px; + width:1145px; + height:30px; + margin-bottom:5px; + font-family:Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 15px; + background: linear-gradient(to top, #f8f8f8 0%, #8F8484 83%); + padding-top:15px; + +} diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/style/w3.css b/SdncReports/SdncReportsApi/src/main/resources/static/style/w3.css new file mode 100644 index 00000000..e73d2696 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/style/w3.css @@ -0,0 +1,231 @@ +/* W3.CSS 4.10 February 2018 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent;-webkit-text-decoration-skip:objects} +a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}svg:not(:root){overflow:hidden} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-input-placeholder{color:inherit;opacity:0.54} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}.w3-serif{font-family:serif} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} +.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block} +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-content{max-width:980px;margin:auto}.w3-rest{overflow:hidden} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* Colors */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} +.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} +.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/resources/static/tabs.html b/SdncReports/SdncReportsApi/src/main/resources/static/tabs.html new file mode 100644 index 00000000..ab1ec32b --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/resources/static/tabs.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/WEB-INF/views/index.jsp b/SdncReports/SdncReportsApi/src/main/webapp/WEB-INF/views/index.jsp new file mode 100644 index 00000000..f48a1924 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/WEB-INF/views/index.jsp @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/js/app.js b/SdncReports/SdncReportsApi/src/main/webapp/js/app.js new file mode 100644 index 00000000..82fac469 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/js/app.js @@ -0,0 +1,47 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ + +// app.js This is first entry point for the application +// ============================================================================= +var myApp = angular.module('myApp', ['ngRoute', 'ngSanitize', 'ngCsv', 'angularUtils.directives.dirPagination', 'angular-growl','ng-ip-address']); + +// configuring our routes +// ============================================================================= +myApp.config(['$routeProvider', function($routeProvider) { + + //Called when user select pre validation test from the UI + $routeProvider. + when('/testValidation', { + templateUrl: 'form-validationTest.html', + controller: 'TestController' + }). + when('/', { + templateUrl: 'form-validationTest.html', + controller: 'TestController' + }). + //Called when user select view test report from the UI + when('/testReports', { + templateUrl: 'form-viewReport.html', + controller: 'ReportController' + }). + otherwise({ + redirectTo: 'form-validationTest.html' + }); +}]); \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-validationTest-controller.js b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-validationTest-controller.js new file mode 100644 index 00000000..bf7005be --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-validationTest-controller.js @@ -0,0 +1,207 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ + +myApp.controller('TestController', ['$scope', '$http', 'growl', 'viewReportService', 'validationTestService', function($scope, $http, growl, viewReportService, validationTestService) { + + $scope.showTestReport = false; + + //Input data for validation test dropdown + var validationTestList = [{ + "typeId": 1, + "validationType": "Network Layer", + "Selected": false + } + + ]; + + $scope.validationTestList = validationTestList; + + + $scope.getselectval = function() { + $scope.selectedvalues = 'Name: ' + $scope.selitem.validationType + ' Id: ' + $scope.selitem.typeId; + } + + $scope.showError = false; + $scope.errorMessage = ""; + $scope.showSuccess = false; + $scope.successMessage = ""; + $scope.showWarning = false; + $scope.warningMessage = ""; + $scope.showInfo = false; + $scope.infoMessage = ""; + $scope.ShowResult = false; + $scope.allowTestSelection = false; + $scope.hostNamePattern = /([a-z0-9](.[a-z0-9-]*[a-z0-9]))/; + + //Called when user clicks on runtest button + $scope.runTest = function() { + + $scope.showError = false; + $scope.vnfSelected = []; + $scope.testSelected = []; + + var message = ""; + for (var i = 0; i < $scope.validationTestList.length; i++) { + if ($scope.validationTestList[i].Selected) { + var typeId = $scope.validationTestList[i].typeId; + var validationType = $scope.validationTestList[i].validationType; + message += "typeId: " + typeId + " validationType: " + validationType + "\n"; + console.log("--TestController::Runtest--", message); + var testDetails = {}; + testDetails.typeId = typeId; + testDetails.validationType = validationType; + $scope.testSelected.push(testDetails); + } + } + console.log("--TestController::Runtest--", JSON.stringify($scope.testSelected)); + + var vnfDetails = {}; + if ($scope.IPAddress != null && $scope.HostName != null && $scope.testSelected.length >= 1) { + vnfDetails.ipAddress = $scope.IPAddress; + vnfDetails.hostName = $scope.HostName; + $scope.vnfSelected.push(vnfDetails); + console.log("--TestController::Runtest--", JSON.stringify($scope.vnfSelected)); + + //Call the validation test service with vnfselected and testType as the parameter + + validationTestService.runPretest($scope.vnfSelected, $scope.testSelected).then(function(response) { + console.log("--TestController::runTest--", JSON.stringify(response)); + var status = response.status; + var response = response.data; + //in case of success, build the model object to store the service output here + if (status === 200) { + if (response.preTestResponse != null && response.preTestResponse.length >= 1) { + $scope.ShowResult = true; + $scope.createTestModel(response.preTestResponse); + $scope.showMessage(response.preTestResponse); + + } else { + console.log(response); + $scope.showError = true; + $scope.errorMessage = "Something went wrong!!!"; + growl.error($scope.errorMessage, { + title: 'Error!' + }); + } + } else { + console.log(response); + $scope.showError = true; + $scope.errorMessage = "Pre test validation failed!!! Check the report for more details"; + growl.error($scope.errorMessage, { + title: 'Error!' + }); + } + }, + function(response) { + console.log("--TestController--", response); + }); + } else { + $scope.showError = true; + $scope.errorMessage = "Please provide the inputs for VNF and test to be performed!!"; + growl.error($scope.errorMessage, { + title: 'Error!' + }); + } + + }; + + $scope.showMessage=function(data){ + + if(angular.isDefined(data) && data.length>=1){ + + angular.forEach(data, function(value, key){ + if(value.status == "unreachable"){ + console.log("--TestController::showMessage--",value.status); + $scope.showError = true; + $scope.errorMessage = "PreTest validation Failed, Please check logs for further details!!!"; + growl.error($scope.errorMessage, { + title: 'Error!' + }); + } + else + { + $scope.showSuccess = true; + $scope.successMessage = "Pre test validation completed!!"; + growl.success($scope.successMessage, { + title: 'Success!' + }); + } + + }); + + } + } + + //Function to build the UI model to be shown + $scope.createTestModel = function(result) { + + $scope.showError = false; + $scope.showWarning = false; + $scope.objPreTestModel = result; + $scope.objPreTest = []; + + + if ($scope.objPreTestModel.length >= 1) { + for (var i = 0; i < $scope.objPreTestModel.length; i++) { + var objTestReport = {}; + objTestReport.ipaddress = $scope.objPreTestModel[i].ipaddress; + objTestReport.status = $scope.objPreTestModel[i].status; + objTestReport.testtype = $scope.objPreTestModel[i].testtype; + objTestReport.statistics = $scope.objPreTestModel[i].statistics; + objTestReport.avgTime = $scope.objPreTestModel[i].avgTime; + + + if ($scope.objPreTestModel[i].testtype === "Network Layer") { + if (objTestReport.statistics != null) { + //fetching the statistics to show in progress bar + + var statistics = objTestReport.statistics; + statistics = statistics.split("%"); + objTestReport.statistics = statistics[0]; + if (objTestReport.statistics == 0) { + objTestReport.statisticPer = parseInt(objTestReport.statistics) + 50; + } else + objTestReport.statisticPer = objTestReport.statistics; + } + + //fetching the avg time to show in progress bar + + if (objTestReport.avgTime != null) { + var avgTime = objTestReport.avgTime; + avgTime = avgTime.split("="); + var Testtime = avgTime[1]; + objTestReport.avgTime = Testtime.slice(0, -2).trim(); + console.log("--TestController::createTestModel--", objTestReport.avgTime); + if (objTestReport.avgTime < 50) { + objTestReport.avgTimePer = parseInt(objTestReport.avgTime) + 10; + } else + objTestReport.avgTimePer = objTestReport.avgTime; + + } + } + $scope.objPreTest.push(objTestReport); + console.log("--TestController::createTestModel--", JSON.stringify($scope.objPreTest)); + } + } + console.log("--TestController::createTestModel::final PreTestModel--" + JSON.stringify($scope.objPreTest)); + + } + +}]); \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-viewreport-controller.js b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-viewreport-controller.js new file mode 100644 index 00000000..62158d57 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-controller/sdnc-viewreport-controller.js @@ -0,0 +1,169 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ + +myApp.controller('ReportController', ['$scope', '$http', 'viewReportService', 'growl', function($scope, $http, viewReportService, growl) { + $scope.isDisabled = true; + $scope.pagination = false; + $scope.selectedDevice; + $scope.ShowResult = false; + $scope.dateValidation = false; + $scope.NoSearchResult = false; + $scope.showError = false; + $scope.errorMessage = ""; + $scope.showSuccess = false; + $scope.successMessage = ""; + $scope.showWarning = false; + $scope.warningMessage = ""; + $scope.showExecutionDetails = true; + + //THIS FUNCTION WILL BE CALLED WHEN USER CLICK SUBMIT FROM UI + $scope.getReports = function(deviceIP, startdate, enddate) { + + $scope.ShowResult = false; + if (new Date(startdate) > new Date(enddate)) { + $scope.dateValidation = true; + $scope.showError = true; + $scope.errorMessage = "Start date cannot be greated than End date"; + growl.error($scope.errorMessage, { + title: 'Error!' + }); + return false; + } + var date = new Date(startdate); + if (angular.isDefined(deviceIP)) { + $scope.DeviceIP = deviceIP; + } + if (angular.isDefined(startdate)) { + $scope.startDate = startdate; + } + if (angular.isDefined(enddate)) { + $scope.endDate = enddate; + } + + if (deviceIP != null && startdate != null && enddate != null) { + + //service call to fetch the reports start date,end date,test name + viewReportService.getData($scope.startDate, $scope.endDate, $scope.DeviceIP).then(function(result) { + console.log("--ReportController::getdata called from controler--", JSON.stringify(result.data)); + if (result.status == 200) { + if (result.data != null && result.data.length >= 1) { + + //in case of success, build the model object to store the service output here + $scope.createTestReportModel(result.data); + } else { + $scope.ShowResult = false; + $scope.showWarning = true; + $scope.warningMessage = "No result found for specified Device name !!"; + growl.warning($scope.warningMessage, { + title: 'Warning!' + }); + } + } else { + $scope.ShowResult = false; + $scope.showWarning = true; + $scope.warningMessage = "No result found for specified Device name !!"; + growl.warning($scope.warningMessage, { + title: 'Warning!' + }); + } + }, + function(response) { + console.log("--ReportController::getdata::Error--", response); + }); + } + } + + + //FUNCTION WILL BE CALLED WHEN USER CLICK DOWNLOAD FROM UI + $scope.exportToExcel = function(tableId) { // ex: '#my-table' + var exportHref = Excel.tableToExcel(tableId, 'export'); + $timeout(function() { + location.href = exportHref; + }, 100); // trigger download + + console.log("--ReportController::exportToexcel--"); + } + + $scope.createTestReportModel = function(result) { + + $scope.showError = false; + $scope.showWarning = false; + $scope.objTestReportModel = result; + $scope.objTestModel = []; + + + if ($scope.objTestReportModel.length >= 1) { + for (var i = 0; i < $scope.objTestReportModel.length; i++) { + var objTestReport = {}; + objTestReport.testid = $scope.objTestReportModel[i].testid; + objTestReport.deviceid = $scope.objTestReportModel[i].deviceid; + objTestReport.deviceIP = $scope.objTestReportModel[i].deviceIP; + objTestReport.result = $scope.objTestReportModel[i].result; + objTestReport.timeStamp = $scope.objTestReportModel[i].timeStamp; + objTestReport.testname = $scope.objTestReportModel[i].testName; + + var executionDetails = {}; + $scope.tmp = angular.fromJson($scope.objTestReportModel[i].execuationDetails); + executionDetails = $scope.tmp.output; + + if ($scope.objTestReportModel[i].testName === "Network Layer") { + + //fetching the statistics to show in progress bar + var statistics = executionDetails.statistics; + objTestReport.status = executionDetails.status; + objTestReport.statistics = executionDetails.statistics; + statistics = statistics.split("%"); + executionDetails.statistics = statistics[0]; + if (executionDetails.statistics == 0) { + executionDetails.statisticPer = parseInt(executionDetails.statistics) + 50; + } else + executionDetails.statisticPer = executionDetails.statistics; + + console.log("--ReportController::CreateTestReportModel--", executionDetails.statistics); + + //fetching the avg time to show in progress bar + + var avgTime = executionDetails.avgTime; + objTestReport.avgTime = executionDetails.avgTime; + avgTime = avgTime.split("="); + var Testtime = avgTime[1]; + executionDetails.avgTime = Testtime.slice(0, -2).trim(); + console.log("--ReportController::CreateTestReportModel--", executionDetails.avgTime); + if (executionDetails.avgTime < 50) { + executionDetails.avgTimePer = parseInt(executionDetails.avgTime) + 10; + } else + executionDetails.avgTimePer = executionDetails.avgTime; + + } + + + objTestReport.executionDetails = executionDetails; + $scope.objTestModel.push(objTestReport); + console.log("--ReportController::CreateTestReportModel--", JSON.stringify($scope.objTestModel)); + + } + $scope.ShowResult = true; + $scope.pagination = true; + } + console.log("--ReportController::createTestReportModel::final TestReportModel--" + JSON.stringify($scope.objTestModel)); + $scope.csvOrder = ['testname', 'deviceIP', 'timeStamp', 'status', 'statistics', 'avgTime', 'result']; + + } +}]); \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-validationTest-service.js b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-validationTest-service.js new file mode 100644 index 00000000..aa985ac3 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-validationTest-service.js @@ -0,0 +1,62 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ +myApp.service('validationTestService', ['$http', function($http) { + + this.runPretest = function(vnfList, validationTestType) { + + + var data = {}; + data.vnfList = vnfList; + data.validationTestType = validationTestType; + + var config = { + params: data, + headers: { + 'Accept': 'application/json' + } + }; + + console.log("validationTestService::runPretest::config", JSON.stringify(config)); + + // Call the pre validation service + var request = { + method: 'POST', + url: '/runtest', + data: data, + headers: { + 'Content-Type': "application/json" + } + }; + + // // SEND VNF FOR VALIDATION + return $http(request) + .then(function(response) { + console.log("---validationTestService::runPretest::Response---" + JSON.stringify(response)); + return response; + }, + function(response) { + console.log("--validationTestService::Status Code--", response.status); + return response; + }); + + + } + +}]); \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-viewReport-service.js b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-viewReport-service.js new file mode 100644 index 00000000..de22ff3c --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/js/sdnc-services/sdnc-viewReport-service.js @@ -0,0 +1,53 @@ +/* +* ============LICENSE_START======================================================= +* ONAP : SDNC-FEATURES +* ================================================================================ +* Copyright 2018 TechMahindra +*================================================================================= +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +*/ + +myApp.service('viewReportService', ['$http', function($http) { + this.getData = function(startDate, endDate, deviceName) { + + var data = {}; + if (startDate != null && endDate != null && deviceName != null) { + + data.startdate = startDate; + data.enddate = endDate; + data.devicename = deviceName; + + } + var config = { + params: '', + headers: { + 'Accept': 'application/json' + } + }; + + var sdate = new Date(startDate); + var edate = new Date(endDate); + + var objTestList = {}; + + return $http.get('/findReportByDeviceIP/'+sdate+'/'+edate+'/'+deviceName,config) + .then(function(result) { + console.log("--viewReportService::getdata::TestResponse--", JSON.stringify(result)); + objTestList = result.data; + console.log("--viewReportService::getdata::TestResponse--", +JSON.stringify(objTestList)); + return result; + }); + }; + +}]); \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.css b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.css new file mode 100644 index 00000000..4b326d1e --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.css @@ -0,0 +1,7 @@ +/** + * angular-growl - v0.4.0 - 2013-11-19 + * https://github.com/marcorinck/angular-growl + * Copyright (c) 2013 Marco Rinck; Licensed MIT + */ + +.growl{position:fixed;top:10px;right:10px;float:right;width:250px}.growl-item.ng-enter,.growl-item.ng-leave{-webkit-transition:.5s linear all;-moz-transition:.5s linear all;-o-transition:.5s linear all;transition:.5s linear all}.growl-item.ng-enter,.growl-item.ng-leave.ng-leave-active{opacity:0}.growl-item.ng-leave,.growl-item.ng-enter.ng-enter-active{opacity:1} diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.js b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.js new file mode 100644 index 00000000..e07b22bc --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-growl.min.js @@ -0,0 +1,6 @@ +/** + * angular-growl - v0.4.0 - 2013-11-19 + * https://github.com/marcorinck/angular-growl + * Copyright (c) 2013 Marco Rinck; Licensed MIT + */ +angular.module("angular-growl",[]),angular.module("angular-growl").directive("growl",["$rootScope",function(a){"use strict";return{restrict:"A",template:'
',replace:!1,scope:!0,controller:["$scope","$timeout","growl",function(b,c,d){function e(a){b.messages.push(a),a.ttl&&-1!==a.ttl&&c(function(){b.deleteMessage(a)},a.ttl)}var f=d.onlyUnique();b.messages=[],a.$on("growlMessage",function(a,c){var d;f?(angular.forEach(b.messages,function(a){c.text===a.text&&c.severity===a.severity&&(d=!0)}),d||e(c)):e(c)}),b.deleteMessage=function(a){var c=b.messages.indexOf(a);c>-1&&b.messages.splice(c,1)},b.computeClasses=function(a){return{"alert-success":"success"===a.severity,"alert-error":"error"===a.severity,"alert-danger":"error"===a.severity,"alert-info":"info"===a.severity,"alert-warning":"warn"===a.severity}}}]}}]),angular.module("angular-growl").provider("growl",function(){"use strict";var a=null,b=!1,c="messages",d="text",e="severity",f=!0;this.globalTimeToLive=function(b){a=b},this.globalEnableHtml=function(a){b=a},this.messagesKey=function(a){c=a},this.messageTextKey=function(a){d=a},this.messageSeverityKey=function(a){e=a},this.onlyUniqueMessages=function(a){f=a},this.serverMessagesInterceptor=["$q","growl",function(a,b){function d(a){a.data[c]&&a.data[c].length>0&&b.addServerMessages(a.data[c])}function e(a){return d(a),a}function f(b){return d(b),a.reject(b)}return function(a){return a.then(e,f)}}],this.$get=["$rootScope","$filter",function(c,g){function h(a){p&&(a.text=p(a.text)),c.$broadcast("growlMessage",a)}function i(c,d,e){var f,g=d||{};f={text:c,severity:e,ttl:g.ttl||a,enableHtml:g.enableHtml||b},h(f)}function j(a,b){i(a,b,"warn")}function k(a,b){i(a,b,"error")}function l(a,b){i(a,b,"info")}function m(a,b){i(a,b,"success")}function n(a){var b,c,f,g;for(g=a.length,b=0;g>b;b++)if(c=a[b],c[d]&&c[e]){switch(c[e]){case"warn":f="warn";break;case"success":f="success";break;case"info":f="info";break;case"error":f="error"}i(c[d],void 0,f)}}function o(){return f}var p;try{p=g("translate")}catch(q){}return{addWarnMessage:j,addErrorMessage:k,addInfoMessage:l,addSuccessMessage:m,addServerMessages:n,onlyUnique:o}}]}); diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-route.min.js b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-route.min.js new file mode 100644 index 00000000..a30b8ab9 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-route.min.js @@ -0,0 +1,15 @@ +/* + AngularJS v1.3.14 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(q,d,C){'use strict';function v(r,k,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,f,b,c,y){function z(){l&&(h.cancel(l),l=null);m&&(m.$destroy(),m=null);n&&(l=h.leave(n),l.then(function(){l=null}),n=null)}function x(){var b=r.current&&r.current.locals;if(d.isDefined(b&&b.$template)){var b=a.$new(),c=r.current;n=y(b,function(b){h.enter(b,null,n||f).then(function(){!d.isDefined(t)||t&&!a.$eval(t)||k()});z()});m=c.scope=b;m.$emit("$viewContentLoaded"); +m.$eval(w)}else z()}var m,n,l,t=b.autoscroll,w=b.onload||"";a.$on("$routeChangeSuccess",x);x()}}}function A(d,k,h){return{restrict:"ECA",priority:-400,link:function(a,f){var b=h.current,c=b.locals;f.html(c.$template);var y=d(f.contents());b.controller&&(c.$scope=a,c=k(b.controller,c),b.controllerAs&&(a[b.controllerAs]=c),f.data("$ngControllerController",c),f.children().data("$ngControllerController",c));y(a)}}}q=d.module("ngRoute",["ng"]).provider("$route",function(){function r(a,f){return d.extend(Object.create(a), +f)}function k(a,d){var b=d.caseInsensitiveMatch,c={originalPath:a,regexp:a},h=c.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,d,b,c){a="?"===c?c:null;c="*"===c?c:null;h.push({name:b,optional:!!a});d=d||"";return""+(a?"":d)+"(?:"+(a?d:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");c.regexp=new RegExp("^"+a+"$",b?"i":"");return c}var h={};this.when=function(a,f){var b=d.copy(f);d.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0); +d.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);h[a]=d.extend(b,a&&k(a,b));if(a){var c="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";h[c]=d.extend({redirectTo:a},k(c,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(a,f,b,c,k,q,x){function m(b){var e=s.current; +(v=(p=l())&&e&&p.$$route===e.$$route&&d.equals(p.pathParams,e.pathParams)&&!p.reloadOnSearch&&!w)||!e&&!p||a.$broadcast("$routeChangeStart",p,e).defaultPrevented&&b&&b.preventDefault()}function n(){var u=s.current,e=p;if(v)u.params=e.params,d.copy(u.params,b),a.$broadcast("$routeUpdate",u);else if(e||u)w=!1,(s.current=e)&&e.redirectTo&&(d.isString(e.redirectTo)?f.path(t(e.redirectTo,e.params)).search(e.params).replace():f.url(e.redirectTo(e.pathParams,f.path(),f.search())).replace()),c.when(e).then(function(){if(e){var a= +d.extend({},e.resolve),b,g;d.forEach(a,function(b,e){a[e]=d.isString(b)?k.get(b):k.invoke(b,null,null,e)});d.isDefined(b=e.template)?d.isFunction(b)&&(b=b(e.params)):d.isDefined(g=e.templateUrl)&&(d.isFunction(g)&&(g=g(e.params)),g=x.getTrustedResourceUrl(g),d.isDefined(g)&&(e.loadedTemplateUrl=g,b=q(g)));d.isDefined(b)&&(a.$template=b);return c.all(a)}}).then(function(c){e==s.current&&(e&&(e.locals=c,d.copy(e.params,b)),a.$broadcast("$routeChangeSuccess",e,u))},function(b){e==s.current&&a.$broadcast("$routeChangeError", +e,u,b)})}function l(){var a,b;d.forEach(h,function(c,h){var g;if(g=!b){var k=f.path();g=c.keys;var m={};if(c.regexp)if(k=c.regexp.exec(k)){for(var l=1,n=k.length;l=c;d--)e.end&&e.end(f[d]);f.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,f=[],m=a,l;for(f.last=function(){return f[f.length-1]};a;){l="";k=!0;if(f.last()&&w[f.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");e.chars&&e.chars(q(b));return""}),c("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(e.comment&& +e.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),e.chars&&e.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,e){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,f){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,f){var k=h.lowercase(f),g="img"===a&&"src"===k||"background"=== +k;!0!==O[k]||!0===D[k]&&!e(d,g)||(c(" "),c(f),c('="'),c(B(d)),c('"'))}),c(f?"/>":">"))},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]/,d=/^mailto:/;return function(c,b){function k(a){a&&g.push(E(a))}function f(a,c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(e);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),f(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 \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-utils-pagination/dirPagination.js b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-utils-pagination/dirPagination.js new file mode 100644 index 00000000..a1a72652 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular-utils-pagination/dirPagination.js @@ -0,0 +1,639 @@ +/** + * dirPagination - AngularJS module for paginating (almost) anything. + * + * + * Credits + * ======= + * + * Daniel Tabuenca: https://groups.google.com/d/msg/angular/an9QpzqIYiM/r8v-3W1X5vcJ + * for the idea on how to dynamically invoke the ng-repeat directive. + * + * I borrowed a couple of lines and a few attribute names from the AngularUI Bootstrap project: + * https://github.com/angular-ui/bootstrap/blob/master/src/pagination/pagination.js + * + * Copyright 2014 Michael Bromley + */ + +(function() { + + /** + * Config + */ + var moduleName = 'angularUtils.directives.dirPagination'; + var DEFAULT_ID = '__default'; + + /** + * Module + */ + angular.module(moduleName, []) + .directive('dirPaginate', ['$compile', '$parse', 'paginationService', dirPaginateDirective]) + .directive('dirPaginateNoCompile', noCompileDirective) + .directive('dirPaginationControls', ['paginationService', 'paginationTemplate', dirPaginationControlsDirective]) + .filter('itemsPerPage', ['paginationService', itemsPerPageFilter]) + .service('paginationService', paginationService) + .provider('paginationTemplate', paginationTemplateProvider) + .run(['$templateCache',dirPaginationControlsTemplateInstaller]); + + function dirPaginateDirective($compile, $parse, paginationService) { + + return { + terminal: true, + multiElement: true, + priority: 100, + compile: dirPaginationCompileFn + }; + + function dirPaginationCompileFn(tElement, tAttrs){ + + var expression = tAttrs.dirPaginate; + // regex taken directly from https://github.com/angular/angular.js/blob/v1.4.x/src/ng/directive/ngRepeat.js#L339 + var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/); + + var filterPattern = /\|\s*itemsPerPage\s*:\s*(.*\(\s*\w*\)|([^\)]*?(?=\s+as\s+))|[^\)]*)/; + if (match[2].match(filterPattern) === null) { + throw 'pagination directive: the \'itemsPerPage\' filter must be set.'; + } + var itemsPerPageFilterRemoved = match[2].replace(filterPattern, ''); + var collectionGetter = $parse(itemsPerPageFilterRemoved); + + addNoCompileAttributes(tElement); + + // If any value is specified for paginationId, we register the un-evaluated expression at this stage for the benefit of any + // dir-pagination-controls directives that may be looking for this ID. + var rawId = tAttrs.paginationId || DEFAULT_ID; + paginationService.registerInstance(rawId); + + return function dirPaginationLinkFn(scope, element, attrs){ + + // Now that we have access to the `scope` we can interpolate any expression given in the paginationId attribute and + // potentially register a new ID if it evaluates to a different value than the rawId. + var paginationId = $parse(attrs.paginationId)(scope) || attrs.paginationId || DEFAULT_ID; + + // (TODO: this seems sound, but I'm reverting as many bug reports followed it's introduction in 0.11.0. + // Needs more investigation.) + // In case rawId != paginationId we deregister using rawId for the sake of general cleanliness + // before registering using paginationId + // paginationService.deregisterInstance(rawId); + paginationService.registerInstance(paginationId); + + var repeatExpression = getRepeatExpression(expression, paginationId); + addNgRepeatToElement(element, attrs, repeatExpression); + + removeTemporaryAttributes(element); + var compiled = $compile(element); + + var currentPageGetter = makeCurrentPageGetterFn(scope, attrs, paginationId); + paginationService.setCurrentPageParser(paginationId, currentPageGetter, scope); + + if (typeof attrs.totalItems !== 'undefined') { + paginationService.setAsyncModeTrue(paginationId); + scope.$watch(function() { + return $parse(attrs.totalItems)(scope); + }, function (result) { + if (0 <= result) { + paginationService.setCollectionLength(paginationId, result); + } + }); + } else { + paginationService.setAsyncModeFalse(paginationId); + scope.$watchCollection(function() { + return collectionGetter(scope); + }, function(collection) { + if (collection) { + var collectionLength = (collection instanceof Array) ? collection.length : Object.keys(collection).length; + paginationService.setCollectionLength(paginationId, collectionLength); + } + }); + } + + // Delegate to the link function returned by the new compilation of the ng-repeat + compiled(scope); + + // (TODO: Reverting this due to many bug reports in v 0.11.0. Needs investigation as the + // principle is sound) + // When the scope is destroyed, we make sure to remove the reference to it in paginationService + // so that it can be properly garbage collected + // scope.$on('$destroy', function destroyDirPagination() { + // paginationService.deregisterInstance(paginationId); + // }); + }; + } + + /** + * If a pagination id has been specified, we need to check that it is present as the second argument passed to + * the itemsPerPage filter. If it is not there, we add it and return the modified expression. + * + * @param expression + * @param paginationId + * @returns {*} + */ + function getRepeatExpression(expression, paginationId) { + var repeatExpression, + idDefinedInFilter = !!expression.match(/(\|\s*itemsPerPage\s*:[^|]*:[^|]*)/); + + if (paginationId !== DEFAULT_ID && !idDefinedInFilter) { + repeatExpression = expression.replace(/(\|\s*itemsPerPage\s*:\s*[^|\s]*)/, "$1 : '" + paginationId + "'"); + } else { + repeatExpression = expression; + } + + return repeatExpression; + } + + /** + * Adds the ng-repeat directive to the element. In the case of multi-element (-start, -end) it adds the + * appropriate multi-element ng-repeat to the first and last element in the range. + * @param element + * @param attrs + * @param repeatExpression + */ + function addNgRepeatToElement(element, attrs, repeatExpression) { + if (element[0].hasAttribute('dir-paginate-start') || element[0].hasAttribute('data-dir-paginate-start')) { + // using multiElement mode (dir-paginate-start, dir-paginate-end) + attrs.$set('ngRepeatStart', repeatExpression); + element.eq(element.length - 1).attr('ng-repeat-end', true); + } else { + attrs.$set('ngRepeat', repeatExpression); + } + } + + /** + * Adds the dir-paginate-no-compile directive to each element in the tElement range. + * @param tElement + */ + function addNoCompileAttributes(tElement) { + angular.forEach(tElement, function(el) { + if (el.nodeType === 1) { + angular.element(el).attr('dir-paginate-no-compile', true); + } + }); + } + + /** + * Removes the variations on dir-paginate (data-, -start, -end) and the dir-paginate-no-compile directives. + * @param element + */ + function removeTemporaryAttributes(element) { + angular.forEach(element, function(el) { + if (el.nodeType === 1) { + angular.element(el).removeAttr('dir-paginate-no-compile'); + } + }); + element.eq(0).removeAttr('dir-paginate-start').removeAttr('dir-paginate').removeAttr('data-dir-paginate-start').removeAttr('data-dir-paginate'); + element.eq(element.length - 1).removeAttr('dir-paginate-end').removeAttr('data-dir-paginate-end'); + } + + /** + * Creates a getter function for the current-page attribute, using the expression provided or a default value if + * no current-page expression was specified. + * + * @param scope + * @param attrs + * @param paginationId + * @returns {*} + */ + function makeCurrentPageGetterFn(scope, attrs, paginationId) { + var currentPageGetter; + if (attrs.currentPage) { + currentPageGetter = $parse(attrs.currentPage); + } else { + // If the current-page attribute was not set, we'll make our own. + // Replace any non-alphanumeric characters which might confuse + // the $parse service and give unexpected results. + // See https://github.com/michaelbromley/angularUtils/issues/233 + var defaultCurrentPage = (paginationId + '__currentPage').replace(/\W/g, '_'); + scope[defaultCurrentPage] = 1; + currentPageGetter = $parse(defaultCurrentPage); + } + return currentPageGetter; + } + } + + /** + * This is a helper directive that allows correct compilation when in multi-element mode (ie dir-paginate-start, dir-paginate-end). + * It is dynamically added to all elements in the dir-paginate compile function, and it prevents further compilation of + * any inner directives. It is then removed in the link function, and all inner directives are then manually compiled. + */ + function noCompileDirective() { + return { + priority: 5000, + terminal: true + }; + } + + function dirPaginationControlsTemplateInstaller($templateCache) { + $templateCache.put('angularUtils.directives.dirPagination.template', ''); + } + + function dirPaginationControlsDirective(paginationService, paginationTemplate) { + + var numberRegex = /^\d+$/; + + var DDO = { + restrict: 'AE', + scope: { + maxSize: '=?', + onPageChange: '&?', + paginationId: '=?', + autoHide: '=?' + }, + link: dirPaginationControlsLinkFn + }; + + // We need to check the paginationTemplate service to see whether a template path or + // string has been specified, and add the `template` or `templateUrl` property to + // the DDO as appropriate. The order of priority to decide which template to use is + // (highest priority first): + // 1. paginationTemplate.getString() + // 2. attrs.templateUrl + // 3. paginationTemplate.getPath() + var templateString = paginationTemplate.getString(); + if (templateString !== undefined) { + DDO.template = templateString; + } else { + DDO.templateUrl = function(elem, attrs) { + return attrs.templateUrl || paginationTemplate.getPath(); + }; + } + return DDO; + + function dirPaginationControlsLinkFn(scope, element, attrs) { + + // rawId is the un-interpolated value of the pagination-id attribute. This is only important when the corresponding dir-paginate directive has + // not yet been linked (e.g. if it is inside an ng-if block), and in that case it prevents this controls directive from assuming that there is + // no corresponding dir-paginate directive and wrongly throwing an exception. + var rawId = attrs.paginationId || DEFAULT_ID; + var paginationId = scope.paginationId || attrs.paginationId || DEFAULT_ID; + + if (!paginationService.isRegistered(paginationId) && !paginationService.isRegistered(rawId)) { + var idMessage = (paginationId !== DEFAULT_ID) ? ' (id: ' + paginationId + ') ' : ' '; + if (window.console) { + console.warn('Pagination directive: the pagination controls' + idMessage + 'cannot be used without the corresponding pagination directive, which was not found at link time.'); + } + } + + if (!scope.maxSize) { scope.maxSize = 9; } + scope.autoHide = scope.autoHide === undefined ? true : scope.autoHide; + scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : true; + scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : false; + + var paginationRange = Math.max(scope.maxSize, 5); + scope.pages = []; + scope.pagination = { + last: 1, + current: 1 + }; + scope.range = { + lower: 1, + upper: 1, + total: 1 + }; + + scope.$watch('maxSize', function(val) { + if (val) { + paginationRange = Math.max(scope.maxSize, 5); + generatePagination(); + } + }); + + scope.$watch(function() { + if (paginationService.isRegistered(paginationId)) { + return (paginationService.getCollectionLength(paginationId) + 1) * paginationService.getItemsPerPage(paginationId); + } + }, function(length) { + if (0 < length) { + generatePagination(); + } + }); + + scope.$watch(function() { + if (paginationService.isRegistered(paginationId)) { + return (paginationService.getItemsPerPage(paginationId)); + } + }, function(current, previous) { + if (current != previous && typeof previous !== 'undefined') { + goToPage(scope.pagination.current); + } + }); + + scope.$watch(function() { + if (paginationService.isRegistered(paginationId)) { + return paginationService.getCurrentPage(paginationId); + } + }, function(currentPage, previousPage) { + if (currentPage != previousPage) { + goToPage(currentPage); + } + }); + + scope.setCurrent = function(num) { + if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) { + num = parseInt(num, 10); + paginationService.setCurrentPage(paginationId, num); + } + }; + + /** + * Custom "track by" function which allows for duplicate "..." entries on long lists, + * yet fixes the problem of wrongly-highlighted links which happens when using + * "track by $index" - see https://github.com/michaelbromley/angularUtils/issues/153 + * @param id + * @param index + * @returns {string} + */ + scope.tracker = function(id, index) { + return id + '_' + index; + }; + + function goToPage(num) { + if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) { + var oldPageNumber = scope.pagination.current; + + scope.pages = generatePagesArray(num, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange); + scope.pagination.current = num; + updateRangeValues(); + + // if a callback has been set, then call it with the page number as the first argument + // and the previous page number as a second argument + if (scope.onPageChange) { + scope.onPageChange({ + newPageNumber : num, + oldPageNumber : oldPageNumber + }); + } + } + } + + function generatePagination() { + if (paginationService.isRegistered(paginationId)) { + var page = parseInt(paginationService.getCurrentPage(paginationId)) || 1; + scope.pages = generatePagesArray(page, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange); + scope.pagination.current = page; + scope.pagination.last = scope.pages[scope.pages.length - 1]; + if (scope.pagination.last < scope.pagination.current) { + scope.setCurrent(scope.pagination.last); + } else { + updateRangeValues(); + } + } + } + + /** + * This function updates the values (lower, upper, total) of the `scope.range` object, which can be used in the pagination + * template to display the current page range, e.g. "showing 21 - 40 of 144 results"; + */ + function updateRangeValues() { + if (paginationService.isRegistered(paginationId)) { + var currentPage = paginationService.getCurrentPage(paginationId), + itemsPerPage = paginationService.getItemsPerPage(paginationId), + totalItems = paginationService.getCollectionLength(paginationId); + + scope.range.lower = (currentPage - 1) * itemsPerPage + 1; + scope.range.upper = Math.min(currentPage * itemsPerPage, totalItems); + scope.range.total = totalItems; + } + } + function isValidPageNumber(num) { + return (numberRegex.test(num) && (0 < num && num <= scope.pagination.last)); + } + } + + /** + * Generate an array of page numbers (or the '...' string) which is used in an ng-repeat to generate the + * links used in pagination + * + * @param currentPage + * @param rowsPerPage + * @param paginationRange + * @param collectionLength + * @returns {Array} + */ + function generatePagesArray(currentPage, collectionLength, rowsPerPage, paginationRange) { + var pages = []; + var totalPages = Math.ceil(collectionLength / rowsPerPage); + var halfWay = Math.ceil(paginationRange / 2); + var position; + + if (currentPage <= halfWay) { + position = 'start'; + } else if (totalPages - halfWay < currentPage) { + position = 'end'; + } else { + position = 'middle'; + } + + var ellipsesNeeded = paginationRange < totalPages; + var i = 1; + while (i <= totalPages && i <= paginationRange) { + var pageNumber = calculatePageNumber(i, currentPage, paginationRange, totalPages); + + var openingEllipsesNeeded = (i === 2 && (position === 'middle' || position === 'end')); + var closingEllipsesNeeded = (i === paginationRange - 1 && (position === 'middle' || position === 'start')); + if (ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)) { + pages.push('...'); + } else { + pages.push(pageNumber); + } + i ++; + } + return pages; + } + + /** + * Given the position in the sequence of pagination links [i], figure out what page number corresponds to that position. + * + * @param i + * @param currentPage + * @param paginationRange + * @param totalPages + * @returns {*} + */ + function calculatePageNumber(i, currentPage, paginationRange, totalPages) { + var halfWay = Math.ceil(paginationRange/2); + if (i === paginationRange) { + return totalPages; + } else if (i === 1) { + return i; + } else if (paginationRange < totalPages) { + if (totalPages - halfWay < currentPage) { + return totalPages - paginationRange + i; + } else if (halfWay < currentPage) { + return currentPage - halfWay + i; + } else { + return i; + } + } else { + return i; + } + } + } + + /** + * This filter slices the collection into pages based on the current page number and number of items per page. + * @param paginationService + * @returns {Function} + */ + function itemsPerPageFilter(paginationService) { + + return function(collection, itemsPerPage, paginationId) { + if (typeof (paginationId) === 'undefined') { + paginationId = DEFAULT_ID; + } + if (!paginationService.isRegistered(paginationId)) { + throw 'pagination directive: the itemsPerPage id argument (id: ' + paginationId + ') does not match a registered pagination-id.'; + } + var end; + var start; + if (angular.isObject(collection)) { + itemsPerPage = parseInt(itemsPerPage) || 9999999999; + if (paginationService.isAsyncMode(paginationId)) { + start = 0; + } else { + start = (paginationService.getCurrentPage(paginationId) - 1) * itemsPerPage; + } + end = start + itemsPerPage; + paginationService.setItemsPerPage(paginationId, itemsPerPage); + + if (collection instanceof Array) { + // the array just needs to be sliced + return collection.slice(start, end); + } else { + // in the case of an object, we need to get an array of keys, slice that, then map back to + // the original object. + var slicedObject = {}; + angular.forEach(keys(collection).slice(start, end), function(key) { + slicedObject[key] = collection[key]; + }); + return slicedObject; + } + } else { + return collection; + } + }; + } + + /** + * Shim for the Object.keys() method which does not exist in IE < 9 + * @param obj + * @returns {Array} + */ + function keys(obj) { + if (!Object.keys) { + var objKeys = []; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + objKeys.push(i); + } + } + return objKeys; + } else { + return Object.keys(obj); + } + } + + /** + * This service allows the various parts of the module to communicate and stay in sync. + */ + function paginationService() { + + var instances = {}; + var lastRegisteredInstance; + + this.registerInstance = function(instanceId) { + if (typeof instances[instanceId] === 'undefined') { + instances[instanceId] = { + asyncMode: false + }; + lastRegisteredInstance = instanceId; + } + }; + + this.deregisterInstance = function(instanceId) { + delete instances[instanceId]; + }; + + this.isRegistered = function(instanceId) { + return (typeof instances[instanceId] !== 'undefined'); + }; + + this.getLastInstanceId = function() { + return lastRegisteredInstance; + }; + + this.setCurrentPageParser = function(instanceId, val, scope) { + instances[instanceId].currentPageParser = val; + instances[instanceId].context = scope; + }; + this.setCurrentPage = function(instanceId, val) { + instances[instanceId].currentPageParser.assign(instances[instanceId].context, val); + }; + this.getCurrentPage = function(instanceId) { + var parser = instances[instanceId].currentPageParser; + return parser ? parser(instances[instanceId].context) : 1; + }; + + this.setItemsPerPage = function(instanceId, val) { + instances[instanceId].itemsPerPage = val; + }; + this.getItemsPerPage = function(instanceId) { + return instances[instanceId].itemsPerPage; + }; + + this.setCollectionLength = function(instanceId, val) { + instances[instanceId].collectionLength = val; + }; + this.getCollectionLength = function(instanceId) { + return instances[instanceId].collectionLength; + }; + + this.setAsyncModeTrue = function(instanceId) { + instances[instanceId].asyncMode = true; + }; + + this.setAsyncModeFalse = function(instanceId) { + instances[instanceId].asyncMode = false; + }; + + this.isAsyncMode = function(instanceId) { + return instances[instanceId].asyncMode; + }; + } + + /** + * This provider allows global configuration of the template path used by the dir-pagination-controls directive. + */ + function paginationTemplateProvider() { + + var templatePath = 'angularUtils.directives.dirPagination.template'; + var templateString; + + /** + * Set a templateUrl to be used by all instances of + * @param {String} path + */ + this.setPath = function(path) { + templatePath = path; + }; + + /** + * Set a string of HTML to be used as a template by all instances + * of . If both a path *and* a string have been set, + * the string takes precedence. + * @param {String} str + */ + this.setString = function(str) { + templateString = str; + }; + + this.$get = function() { + return { + getPath: function() { + return templatePath; + }, + getString: function() { + return templateString; + } + }; + }; + } +})(); diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular.min.js b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular.min.js new file mode 100644 index 00000000..7f3704c9 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angular.min.js @@ -0,0 +1,250 @@ +/* + AngularJS v1.3.14 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(P,X,u){'use strict';function M(b){return function(){var a=arguments[0],c;c="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.3.14/"+(b?b+"/":"")+a;for(a=1;a").append(b).html();try{return b[0].nodeType===qb?R(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+R(b)})}catch(d){return R(c)}}function qc(b){try{return decodeURIComponent(b)}catch(a){}}function rc(b){var a= +{},c,d;s((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=qc(c[0]),y(d)&&(b=y(c[1])?qc(c[1]):!0,sc.call(a,d)?E(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Qb(b){var a=[];s(b,function(b,d){E(b)?s(b,function(b){a.push(Fa(d,!0)+(!0===b?"":"="+Fa(b,!0)))}):a.push(Fa(d,!0)+(!0===b?"":"="+Fa(b,!0)))});return a.length?a.join("&"):""}function rb(b){return Fa(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Fa(b,a){return encodeURIComponent(b).replace(/%40/gi, +"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Id(b,a){var c,d,e=sb.length;b=C(b);for(d=0;d/,">"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");d=ab(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector", +d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;P&&e.test(P.name)&&(c.debugInfoEnabled=!0,P.name=P.name.replace(e,""));if(P&&!f.test(P.name))return d();P.name=P.name.replace(f,"");aa.resumeBootstrap=function(b){s(b,function(b){a.push(b)});return d()};G(aa.resumeDeferredBootstrap)&&aa.resumeDeferredBootstrap()}function Kd(){P.name="NG_ENABLE_DEBUG_INFO!"+P.name;P.location.reload()}function Ld(b){b=aa.element(b).injector();if(!b)throw Ka("test");return b.get("$$testability")} +function uc(b,a){a=a||"_";return b.replace(Md,function(b,d){return(d?a:"")+b.toLowerCase()})}function Nd(){var b;vc||((ra=P.jQuery)&&ra.fn.on?(C=ra,w(ra.fn,{scope:La.scope,isolateScope:La.isolateScope,controller:La.controller,injector:La.injector,inheritedData:La.inheritedData}),b=ra.cleanData,ra.cleanData=function(a){var c;if(Rb)Rb=!1;else for(var d=0,e;null!=(e=a[d]);d++)(c=ra._data(e,"events"))&&c.$destroy&&ra(e).triggerHandler("$destroy");b(a)}):C=Q,aa.element=C,vc=!0)}function Sb(b,a,c){if(!b)throw Ka("areq", +a||"?",c||"required");return b}function tb(b,a,c){c&&E(b)&&(b=b[b.length-1]);Sb(G(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Ma(b,a){if("hasOwnProperty"===b)throw Ka("badname",a);}function wc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g")+d[2];for(d=d[0];d--;)c=c.lastChild;f=Ya(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";s(f,function(a){e.appendChild(a)}); +return e}function Q(b){if(b instanceof Q)return b;var a;x(b)&&(b=T(b),a=!0);if(!(this instanceof Q)){if(a&&"<"!=b.charAt(0))throw Ub("nosel");return new Q(b)}if(a){a=X;var c;b=(c=gf.exec(b))?[a.createElement(c[1])]:(c=Gc(b,a))?c.childNodes:[]}Hc(this,b)}function Vb(b){return b.cloneNode(!0)}function xb(b,a){a||yb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;d 4096 bytes)!"));else{if(p.cookie!==y)for(y=p.cookie,d=y.split("; "),wa={},f=0;fk&&this.remove(q.key),b},get:function(a){if(k").parent()[0])});var f=ba(a,b,a,c,d,e);F.$$addScopeClass(a);var g=null;return function(b, +c,d){Sb(b,"scope");d=d||{};var e=d.parentBoundTranscludeFn,h=d.transcludeControllers;d=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ta(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?C(Xb(g,C("
").append(a).html())):c?La.clone.call(a):a;if(h)for(var l in h)d.data("$"+l+"Controller",h[l].instance);F.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,e);return d}}function ba(a,b,c,d,e,f){function g(a,c,d,e){var f,l,k,q,p,r,D;if(n)for(D= +Array(c.length),q=0;qL.priority)break;if(U=L.scope)L.templateUrl||(J(U)?(Oa("new/isolated scope",I||N,L,w),I=L):Oa("new/isolated scope",I,L,w)),N=N||L;ca=L.name;!L.templateUrl&&L.controller&&(U=L.controller,H=H||{},Oa("'"+ca+"' controller",H[ca],L,w),H[ca]=L);if(U=L.transclude)ha=!0,L.$$tlb||(Oa("transclusion",wa,L,w),wa=L),"element"==U?(B=!0,v=L.priority,U=w,w=e.$$element=C(X.createComment(" "+ca+": "+e[ca]+" ")),d=w[0],V(g,Za.call(U, +0),d),R=F(U,f,v,l&&l.name,{nonTlbTranscludeDirective:wa})):(U=C(Vb(d)).contents(),w.empty(),R=F(U,f));if(L.template)if(fb=!0,Oa("template",ja,L,w),ja=L,U=G(L.template)?L.template(w,e):L.template,U=Tc(U),L.replace){l=L;U=Tb.test(U)?Uc(Xb(L.templateNamespace,T(U))):[];d=U[0];if(1!=U.length||d.nodeType!==na)throw ia("tplrt",ca,"");V(g,w,d);Aa={$attr:{}};U=W(d,[],Aa);var of=a.splice(Q+1,a.length-(Q+1));I&&z(U);a=a.concat(U).concat(of);Rc(e,Aa);Aa=a.length}else w.html(U);if(L.templateUrl)fb=!0,Oa("template", +ja,L,w),ja=L,L.replace&&(l=L),A=M(a.splice(Q,a.length-Q),w,e,g,ha&&R,k,p,{controllerDirectives:H,newIsolateScopeDirective:I,templateDirective:ja,nonTlbTranscludeDirective:wa}),Aa=a.length;else if(L.compile)try{P=L.compile(w,e,R),G(P)?r(null,P,Pa,$):P&&r(P.pre,P.post,Pa,$)}catch(aa){c(aa,ua(w))}L.terminal&&(A.terminal=!0,v=Math.max(v,L.priority))}A.scope=N&&!0===N.scope;A.transcludeOnThisElement=ha;A.elementTranscludeOnThisElement=B;A.templateOnThisElement=fb;A.transclude=R;n.hasElementTranscludeDirective= +B;return A}function z(a){for(var b=0,c=a.length;bq.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Pb(q,{$$start:l,$$end:k})),b.push(q),h=q)}catch(D){c(D)}}return h}function fb(b){if(d.hasOwnProperty(b))for(var c=a.get(b+"Directive"),e=0,f=c.length;e"+b+"";return c.childNodes[0].childNodes;default:return b}}function Q(a,b){if("srcdoc"== +b)return H.HTML;var c=ta(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return H.RESOURCE_URL}function Aa(a,c,d,e,f){var h=Q(a,e);f=g[e]||f;var k=b(d,!0,h,f);if(k){if("multiple"===e&&"select"===ta(a))throw ia("selmulti",ua(a));c.push({priority:100,compile:function(){return{pre:function(a,c,g){c=g.$$observers||(g.$$observers={});if(l.test(e))throw ia("nodomevents");var n=g[e];n!==d&&(k=n&&b(n,!0,h,f),d=n);k&&(g[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope|| +a).$watch(k,function(a,b){"class"===e&&a!=b?g.$updateClass(a,b):g.$set(e,a)}))}}}})}}function V(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=a)return b;for(;a--;)8===b[a].nodeType&&pf.call(b,a,1);return b}function Fe(){var b={},a=!1,c=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,c){Ma(a,"controller");J(a)?w(b,a):b[a]=c};this.allowGlobals=function(){a= +!0};this.$get=["$injector","$window",function(d,e){function f(a,b,c,d){if(!a||!J(a.$scope))throw M("$controller")("noscp",d,b);a.$scope[b]=c}return function(g,h,l,k){var m,p,q;l=!0===l;k&&x(k)&&(q=k);if(x(g)){k=g.match(c);if(!k)throw qf("ctrlfmt",g);p=k[1];q=q||k[3];g=b.hasOwnProperty(p)?b[p]:wc(h.$scope,p,!0)||(a?wc(e,p,!0):u);tb(g,p,!0)}if(l)return l=(E(g)?g[g.length-1]:g).prototype,m=Object.create(l||null),q&&f(h,q,m,p||g.name),w(function(){d.invoke(g,m,h,p);return m},{instance:m,identifier:q}); +m=d.instantiate(g,h,p);q&&f(h,q,m,p||g.name);return m}}]}function Ge(){this.$get=["$window",function(b){return C(b.document)}]}function He(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Zb(b,a){if(x(b)){var c=b.replace(rf,"").trim();if(c){var d=a("Content-Type");(d=d&&0===d.indexOf(Wc))||(d=(d=c.match(sf))&&tf[d[0]].test(c));d&&(b=pc(c))}}return b}function Xc(b){var a=fa(),c,d,e;if(!b)return a;s(b.split("\n"),function(b){e=b.indexOf(":");c=R(T(b.substr(0, +e)));d=T(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function Yc(b){var a=J(b)?b:u;return function(c){a||(a=Xc(b));return c?(c=a[R(c)],void 0===c&&(c=null),c):a}}function Zc(b,a,c,d){if(G(d))return d(b,a,c);s(d,function(d){b=d(b,a,c)});return b}function Ke(){var b=this.defaults={transformResponse:[Zb],transformRequest:[function(a){return J(a)&&"[object File]"!==Da.call(a)&&"[object Blob]"!==Da.call(a)&&"[object FormData]"!==Da.call(a)?$a(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"}, +post:qa($b),put:qa($b),patch:qa($b)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},a=!1;this.useApplyAsync=function(b){return y(b)?(a=!!b,this):a};var c=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(d,e,f,g,h,l){function k(a){function c(a){var b=w({},a);b.data=a.data?Zc(a.data,a.headers,a.status,e.transformResponse):a.data;a=a.status;return 200<=a&&300>a?b:h.reject(b)}function d(a){var b,c={};s(a,function(a,d){G(a)?(b= +a(),null!=b&&(c[d]=b)):c[d]=a});return c}if(!aa.isObject(a))throw M("$http")("badreq",a);var e=w({method:"get",transformRequest:b.transformRequest,transformResponse:b.transformResponse},a);e.headers=function(a){var c=b.headers,e=w({},a.headers),f,g,c=w({},c.common,c[R(a.method)]);a:for(f in c){a=R(f);for(g in e)if(R(g)===a)continue a;e[f]=c[f]}return d(e)}(a);e.method=vb(e.method);var f=[function(a){var d=a.headers,e=Zc(a.data,Yc(d),u,a.transformRequest);z(e)&&s(d,function(a,b){"content-type"===R(b)&& +delete d[b]});z(a.withCredentials)&&!z(b.withCredentials)&&(a.withCredentials=b.withCredentials);return m(a,e).then(c,c)},u],g=h.when(e);for(s(t,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var l=f.shift(),g=g.then(a,l)}g.success=function(a){g.then(function(b){a(b.data,b.status,b.headers,e)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,e)}); +return g};return g}function m(c,f){function l(b,c,d,e){function f(){n(c,b,d,e)}N&&(200<=b&&300>b?N.put(I,[b,c,Xc(d),e]):N.remove(I));a?g.$applyAsync(f):(f(),g.$$phase||g.$apply())}function n(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?v.resolve:v.reject)({data:a,status:b,headers:Yc(d),config:c,statusText:e})}function m(a){n(a.data,a.status,qa(a.headers()),a.statusText)}function t(){var a=k.pendingRequests.indexOf(c);-1!==a&&k.pendingRequests.splice(a,1)}var v=h.defer(),A=v.promise,N,F,s=c.headers,I=p(c.url, +c.params);k.pendingRequests.push(c);A.then(t,t);!c.cache&&!b.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(N=J(c.cache)?c.cache:J(b.cache)?b.cache:q);N&&(F=N.get(I),y(F)?F&&G(F.then)?F.then(m,m):E(F)?n(F[1],F[0],qa(F[2]),F[3]):n(F,200,{},"OK"):N.put(I,A));z(F)&&((F=$c(c.url)?e.cookies()[c.xsrfCookieName||b.xsrfCookieName]:u)&&(s[c.xsrfHeaderName||b.xsrfHeaderName]=F),d(c.method,I,f,l,s,c.timeout,c.withCredentials,c.responseType));return A}function p(a,b){if(!b)return a;var c=[];Ed(b, +function(a,b){null===a||z(a)||(E(a)||(a=[a]),s(a,function(a){J(a)&&(a=pa(a)?a.toISOString():$a(a));c.push(Fa(b)+"="+Fa(a))}))});0=l&&(r.resolve(q),p(S.$$intervalId),delete f[S.$$intervalId]);t||b.$apply()},h);f[S.$$intervalId]=r;return S}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]} +function Rd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{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"},pluralCat:function(b){return 1===b?"one":"other"}}}}function bc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=rb(b[a]);return b.join("/")}function ad(b,a){var c=Ba(b);a.$$protocol= +c.protocol;a.$$host=c.hostname;a.$$port=$(c.port)||wf[c.protocol]||null}function bd(b,a){var c="/"!==b.charAt(0);c&&(b="/"+b);var d=Ba(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search=rc(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function za(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ha(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Gb(b){return b.replace(/(#.+)|#$/, +"$1")}function cc(b){return b.substr(0,Ha(b).lastIndexOf("/")+1)}function dc(b,a){this.$$html5=!0;a=a||"";var c=cc(b);ad(b,this);this.$$parse=function(a){var b=za(c,a);if(!x(b))throw Hb("ipthprfx",a,c);bd(b,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Qb(this.$$search),b=this.$$hash?"#"+rb(this.$$hash):"";this.$$url=bc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)), +!0;var f,g;(f=za(b,d))!==u?(g=f,g=(f=za(a,f))!==u?c+(za("/",f)||f):b+g):(f=za(c,d))!==u?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function ec(b,a){var c=cc(b);ad(b,this);this.$$parse=function(d){d=za(b,d)||za(c,d);var e;"#"===d.charAt(0)?(e=za(a,d),z(e)&&(e=d)):e=this.$$html5?d:"";bd(e,this);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Qb(this.$$search),e=this.$$hash? +"#"+rb(this.$$hash):"";this.$$url=bc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Ha(b)==Ha(a)?(this.$$parse(a),!0):!1}}function cd(b,a){this.$$html5=!0;ec.apply(this,arguments);var c=cc(b);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Ha(d)?f=d:(g=za(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Qb(this.$$search),e=this.$$hash?"#"+rb(this.$$hash): +"";this.$$url=bc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function Ib(b){return function(){return this[b]}}function dd(b,a){return function(c){if(z(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Me(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return y(a)?(b=a,this):b};this.html5Mode=function(b){return Wa(b)?(a.enabled=b,this):J(b)?(Wa(b.enabled)&&(a.enabled=b.enabled),Wa(b.requireBase)&&(a.requireBase=b.requireBase),Wa(b.rewriteLinks)&& +(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(c,d,e,f,g){function h(a,b,c){var e=k.url(),f=k.$$state;try{d.url(a,b,c),k.$$state=d.state()}catch(g){throw k.url(e),k.$$state=f,g;}}function l(a,b){c.$broadcast("$locationChangeSuccess",k.absUrl(),a,k.$$state,b)}var k,m;m=d.baseHref();var p=d.url(),q;if(a.enabled){if(!m&&a.requireBase)throw Hb("nobase");q=p.substring(0,p.indexOf("/",p.indexOf("//")+2))+(m||"/");m=e.history?dc:cd}else q= +Ha(p),m=ec;k=new m(q,"#"+b);k.$$parseLinkUrl(p,p);k.$$state=d.state();var t=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&!b.shiftKey&&2!=b.which&&2!=b.button){for(var e=C(b.target);"a"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),l=e.attr("href")||e.attr("xlink:href");J(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=Ba(h.animVal).href);t.test(h)||!h||e.attr("target")||b.isDefaultPrevented()||!k.$$parseLinkUrl(h, +l)||(b.preventDefault(),k.absUrl()!=d.url()&&(c.$apply(),g.angular["ff-684208-preventDefault"]=!0))}});Gb(k.absUrl())!=Gb(p)&&d.url(k.absUrl(),!0);var r=!0;d.onUrlChange(function(a,b){c.$evalAsync(function(){var d=k.absUrl(),e=k.$$state,f;k.$$parse(a);k.$$state=b;f=c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented;k.absUrl()===a&&(f?(k.$$parse(d),k.$$state=e,h(d,!1,e)):(r=!1,l(d,e)))});c.$$phase||c.$digest()});c.$watch(function(){var a=Gb(d.url()),b=Gb(k.absUrl()),f=d.state(),g=k.$$replace, +q=a!==b||k.$$html5&&e.history&&f!==k.$$state;if(r||q)r=!1,c.$evalAsync(function(){var b=k.absUrl(),d=c.$broadcast("$locationChangeStart",b,a,k.$$state,f).defaultPrevented;k.absUrl()===b&&(d?(k.$$parse(a),k.$$state=f):(q&&h(b,g,f===k.$$state?null:k.$$state),l(a,f)))});k.$$replace=!1});return k}]}function Ne(){var b=!0,a=this;this.debugEnabled=function(a){return y(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)? +"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||B;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a=[];s(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function sa(b,a){if("__defineGetter__"=== +b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw ka("isecfld",a);return b}function la(b,a){if(b){if(b.constructor===b)throw ka("isecfn",a);if(b.window===b)throw ka("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ka("isecdom",a);if(b===Object)throw ka("isecobj",a);}return b}function fc(b){return b.constant}function hb(b,a,c,d,e){la(b,e);la(a,e);c=c.split(".");for(var f,g=0;1h?ed(g[0],g[1],g[2],g[3],g[4],c,d):function(a,b){var e=0,f;do f=ed(g[e++],g[e++],g[e++],g[e++],g[e++],c,d)(a,b),b=u,a=f;while(e=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;fa)for(b in k++,f)e.hasOwnProperty(b)||(t--,delete f[b])}else f!==e&&(f=e,k++);return k}}c.$stateful=!0;var d=this,e,f,h,l=1s&&(y=4-s,W[y]||(W[y]=[]),W[y].push({msg:G(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,newVal:g,oldVal:l}));else if(e===c){t=!1;break a}}catch(C){f(C)}if(!(m=I.$$childHead||I!==this&&I.$$nextSibling))for(;I!==this&&!(m=I.$$nextSibling);)I=I.$parent}while(I=m);if((t||S.length)&&!s--)throw r.$$phase=null,a("infdig",b,W);}while(t||S.length); +for(r.$$phase=null;u.length;)try{u.shift()()}catch(B){f(B)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(this!==r){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling); +this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=B;this.$on=this.$watch=this.$watchGroup=function(){return B};this.$$listeners={};this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){r.$$phase||S.length||h.defer(function(){S.length&&r.$digest()});S.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){u.push(a)},$apply:function(a){try{return k("$apply"), +this.$eval(a)}catch(b){f(b)}finally{r.$$phase=null;try{r.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&n.push(b);t()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,m(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e, +stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},l=Ya([h],arguments,1),k,m;do{d=e.$$listeners[a]||c;h.currentScope=e;k=0;for(m=d.length;kRa)throw Ca("iequirks");var d=qa(ma);d.isEnabled=function(){return b};d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=oa);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs,f=d.getTrusted,g=d.trustAs;s(ma,function(a,b){var c=R(b);d[db("parse_as_"+c)]=function(b){return e(a, +b)};d[db("get_trusted_"+c)]=function(b){return f(a,b)};d[db("trust_as_"+c)]=function(b){return g(a,b)}});return d}]}function Ue(){this.$get=["$window","$document",function(b,a){var c={},d=$((/android (\d+)/.exec(R((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,l=f.body&&f.body.style,k=!1,m=!1;if(l){for(var p in l)if(k=h.exec(p)){g=k[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in l&&"webkit"); +k=!!("transition"in l||g+"Transition"in l);m=!!("animation"in l||g+"Animation"in l);!d||k&&m||(k=x(f.body.style.webkitTransition),m=x(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if("input"===a&&11>=Ra)return!1;if(z(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:bb(),vendorPrefix:g,transitions:k,animations:m,android:d}}]}function We(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){d.totalPendingRequests++; +var g=a.defaults&&a.defaults.transformResponse;E(g)?g=g.filter(function(a){return a!==Zb}):g===Zb&&(g=null);return a.get(e,{cache:b,transformResponse:g}).finally(function(){d.totalPendingRequests--}).then(function(a){return a.data},function(a){if(!f)throw ia("tpload",e);return c.reject(a)})}d.totalPendingRequests=0;return d}]}function Xe(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];s(a,function(a){var d= +aa.element(a).data("$binding");d&&s(d,function(d){c?(new RegExp("(^|\\s)"+gd(b)+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=d.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],h=0;hb;b=Math.abs(b);var g=b+"",h="",l=[],k=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?b=0:(h=g,k=!0)}if(k)0b&&(h=b.toFixed(e),b=parseFloat(h));else{g=(g.split(od)[1]||"").length;z(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);var g=(""+b).split(od),k=g[0],g=g[1]||"",p=0,q=a.lgSize,t=a.gSize;if(k.length>=q+t)for(p=k.length-q,m=0;mb&&(d="-",b=-b);for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Jb(e,a,d)}}function Kb(b,a){return function(c,d){var e=c["get"+b](),f=vb(a?"SHORT"+b:b);return d[f][e]}} +function pd(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function qd(b){return function(a){var c=pd(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Jb(a,b)}}function kd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=$(b[9]+b[10]),g=$(b[9]+b[11]));h.call(a,$(b[1]),$(b[2])-1,$(b[3]));f=$(b[4]||0)-f;g=$(b[5]|| +0)-g;h=$(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));l.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var g="",h=[],l,k;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;x(c)&&(c=Jf.test(c)?$(c):a(c));V(c)&&(c=new Date(c));if(!pa(c))return c;for(;e;)(k=Kf.exec(e))?(h=Ya(h,k,1),e=h.pop()):(h.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset())); +s(h,function(a){l=Lf[a];g+=l?l(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ef(){return function(b,a){z(a)&&(a=2);return $a(b,a)}}function Ff(){return function(b,a){V(b)&&(b=b.toString());return E(b)||x(b)?(a=Infinity===Math.abs(Number(a))?Number(a):$(a))?0b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))a.on("paste cut",m)}a.on("change",l);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)}} +function Nb(b,a){return function(c,d){var e,f;if(pa(c))return c;if(x(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(Mf.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},s(e,function(b,c){c=s};g.$observe("min",function(a){s=q(a);h.$validate()})}if(y(g.max)||g.ngMax){var K;h.$validators.max=function(a){return!p(a)||z(K)||c(a)<=K};g.$observe("max",function(a){K=q(a);h.$validate()})}}}function td(b,a,c,d){(d.$$hasNativeValidators=J(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{}; +return c.badInput&&!c.typeMismatch?u:b})}function ud(b,a,c,d,e){if(y(d)){b=b(d);if(!b.constant)throw M("ngModel")("constexpr",c,d);return b(a)}return e}function jc(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Tb=/<|&#?\w+;/,ef=/<([\w:]+)/,ff=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, +ga={option:[1,'"],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ga.optgroup=ga.option;ga.tbody=ga.tfoot=ga.colgroup=ga.caption=ga.thead;ga.th=ga.td;var La=Q.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===X.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),Q(P).on("load",a))}, +toString:function(){var b=[];s(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?C(this[b]):C(this[this.length+b])},length:0,push:Of,sort:[].sort,splice:[].splice},Fb={};s("multiple selected checked disabled readOnly required open".split(" "),function(b){Fb[R(b)]=b});var Nc={};s("input select option textarea button form details".split(" "),function(b){Nc[b]=!0});var Oc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"}; +s({data:Wb,removeData:yb},function(b,a){Q[a]=b});s({data:Wb,inheritedData:Eb,scope:function(b){return C.data(b,"$scope")||Eb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return C.data(b,"$isolateScope")||C.data(b,"$isolateScopeNoTemplate")},controller:Jc,injector:function(b){return Eb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Bb,css:function(b,a,c){a=db(a);if(y(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=R(a);if(Fb[d])if(y(c))c? +(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||B).specified?d:u;else if(y(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(y(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(z(b)){var d=a.nodeType;return d===na||d===qb?a.textContent:""}a.textContent=b}b.$dv="";return b}(),val:function(b,a){if(z(a)){if(b.multiple&&"select"===ta(b)){var c=[];s(b.options,function(a){a.selected&& +c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(z(a))return b.innerHTML;xb(b,!0);b.innerHTML=a},empty:Kc},function(b,a){Q.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Kc&&(2==b.length&&b!==Bb&&b!==Jc?a:d)===u){if(J(a)){for(e=0;e":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a, +c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Yf={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},hc=function(a){this.options=a};hc.prototype={constructor:hc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=y(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw ka("lexerr",a,c,this.text); +},readNumber:function(){for(var a="",c=this.index;this.indexa){a=this.tokens[a];var g=a.text;if(g===c||g===d||g===e||g=== +f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){if(0===this.tokens.length)throw ka("ueoe",this.text);var c=this.expect(a);c||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return c},unaryFn:function(a,c){var d=nb[a];return w(function(a,f){return d(a,f,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a,c,d,e){var f=nb[c];return w(function(c,e){return f(c,e,a,d)},{constant:a.constant&& +d.constant,inputs:!e&&[a,d]})},identifier:function(){for(var a=this.consume().text;this.peek(".")&&this.peekAhead(1).identifier&&!this.peekAhead(2,"(");)a+=this.consume().text+this.consume().text;return yf(a,this.options,this.text)},constant:function(){var a=this.consume().value;return w(function(){return a},{constant:!0,literal:!0})},statements:function(){for(var a=[];;)if(0","<=",">=");)a=this.binaryFn(a,c.text, +this.additive());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.text,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.text,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(ib.ZERO,a.text,this.unary()):(a=this.expect("!"))?this.unaryFn(a.text,this.unary()):this.primary()},fieldAccess:function(a){var c= +this.identifier();return w(function(d,e,f){d=f||a(d,e);return null==d?u:c(d)},{assign:function(d,e,f){var g=a(d,f);g||a.assign(d,g={},f);return c.assign(g,e)}})},objectIndex:function(a){var c=this.text,d=this.expression();this.consume("]");return w(function(e,f){var g=a(e,f),h=d(e,f);sa(h,c);return g?la(g[h],c):u},{assign:function(e,f,g){var h=sa(d(e,g),c),l=la(a(e,g),c);l||a.assign(e,l={},g);return l[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression()); +while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,h){var l=c?c(g,h):y(c)?u:g,k=a(g,h,l)||B;if(f)for(var m=d.length;m--;)f[m]=la(d[m](g,h),e);la(l,e);if(k){if(k.constructor===k)throw ka("isecfn",e);if(k===Vf||k===Wf||k===Xf)throw ka("isecff",e);}l=k.apply?k.apply(l,f):k(f[0],f[1],f[2],f[3],f[4]);f&&(f.length=0);return la(l,e)}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(",")) +}this.consume("]");return w(function(c,d){for(var e=[],f=0,g=a.length;fa.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Jb(Math[0=h};d.$observe("min",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));h=V(a)&&!isNaN(a)?a:u;e.$validate()})}if(y(d.max)|| +d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)||z(l)||a<=l};d.$observe("max",function(a){y(a)&&!V(a)&&(a=parseFloat(a,10));l=V(a)&&!isNaN(a)?a:u;e.$validate()})}},url:function(a,c,d,e,f,g){jb(a,c,d,e,f,g);ic(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||Zf.test(d)}},email:function(a,c,d,e,f,g){jb(a,c,d,e,f,g);ic(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||$f.test(d)}},radio:function(a,c, +d,e){z(d.name)&&c.attr("name",++ob);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e,f,g,h,l){var k=ud(l,a,"ngTrueValue",d.ngTrueValue,!0),m=ud(l,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return ea(a, +k)});e.$parsers.push(function(a){return a?k:m})},hidden:B,button:B,submit:B,reset:B,file:B},yc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,g,h,l){l[0]&&(Dd[R(h.type)]||Dd.text)(f,g,h,l[0],c,a,d,e)}}}}],bg=/^(true|false|\d+)$/,ye=function(){return{restrict:"A",priority:100,compile:function(a,c){return bg.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value", +a)})}}}},Zd=["$compile",function(a){return{restrict:"AC",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],ae=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],$d=["$sce", +"$parse","$compile",function(a,c,d){return{restrict:"A",compile:function(e,f){var g=c(f.ngBindHtml),h=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(h,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],xe=da({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),be=jc("",!0),de=jc("Odd",0),ce=jc("Even",1),ee=Ja({compile:function(a,c){c.$set("ngCloak", +u);a.removeClass("ng-cloak")}}),fe=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Dc={},cg={blur:!0,focus:!0};s("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=ya("ng-"+a);Dc[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var h=d(g[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})}; +cg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var ie=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,l,k;c.$watch(e.ngIf,function(c){c?l||g(function(c,f){l=f;c[c.length++]=X.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),h&&(k=ub(h.clone),a.leave(k).then(function(){k=null}),h=null))})}}}],je=["$templateRequest","$anchorScroll", +"$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:aa.noop,compile:function(f,g){var h=g.ngInclude||g.src,l=g.onload||"",k=g.autoscroll;return function(f,g,q,s,r){var u=0,w,n,D,H=function(){n&&(n.remove(),n=null);w&&(w.$destroy(),w=null);D&&(d.leave(D).then(function(){n=null}),n=D,D=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!y(k)||k&&!f.$eval(k)||c()},n=++u;e?(a(e,!0).then(function(a){if(n===u){var c=f.$new(); +s.template=a;a=r(c,function(a){H();d.enter(a,null,g).then(h)});w=c;D=a;w.$emit("$includeContentLoaded",e);f.$eval(l)}},function(){n===u&&(H(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(H(),s.template=null)})}}}}],Ae=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Gc(f.template,X).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}], +ke=Ja({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),we=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,h=g?T(f):f;e.$parsers.push(function(a){if(!z(a)){var c=[];a&&s(a.split(h),function(a){a&&c.push(g?T(a):a)});return c}});e.$formatters.push(function(a){return E(a)?a.join(f):u});e.$isEmpty=function(a){return!a||!a.length}}}},lb="ng-valid",vd="ng-invalid",Sa="ng-pristine", +Mb="ng-dirty",xd="ng-pending",Ob=new M("ngModel"),dg=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,h,l,k,m){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success= +{};this.$pending=u;this.$name=m(d.name||"",!1)(a);var p=f(d.ngModel),q=p.assign,t=p,r=q,w=null,C,n=this;this.$$setOptions=function(a){if((n.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");t=function(a){var d=p(a);G(d)&&(d=c(a));return d};r=function(a,c){G(p(a))?g(a,{$$$p:n.$modelValue}):q(a,n.$modelValue)}}else if(!p.assign)throw Ob("nonassign",d.ngModel,ua(e));};this.$render=B;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};var D=e.inheritedData("$formController")|| +Lb,H=0;sd({ctrl:this,$element:e,set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:D,$animate:g});this.$setPristine=function(){n.$dirty=!1;n.$pristine=!0;g.removeClass(e,Mb);g.addClass(e,Sa)};this.$setDirty=function(){n.$dirty=!0;n.$pristine=!1;g.removeClass(e,Sa);g.addClass(e,Mb);D.$setDirty()};this.$setUntouched=function(){n.$touched=!1;n.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){n.$touched=!0;n.$untouched=!1;g.setClass(e,"ng-touched", +"ng-untouched")};this.$rollbackViewValue=function(){h.cancel(w);n.$viewValue=n.$$lastCommittedViewValue;n.$render()};this.$validate=function(){if(!V(n.$modelValue)||!isNaN(n.$modelValue)){var a=n.$$rawModelValue,c=n.$valid,d=n.$modelValue,e=n.$options&&n.$options.allowInvalid;n.$$runValidators(a,n.$$lastCommittedViewValue,function(f){e||c===f||(n.$modelValue=f?a:u,n.$modelValue!==d&&n.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d){function e(){var d=!0;s(n.$validators,function(e, +f){var h=e(a,c);d=d&&h;g(f,h)});return d?!0:(s(n.$asyncValidators,function(a,c){g(c,null)}),!1)}function f(){var d=[],e=!0;s(n.$asyncValidators,function(f,h){var k=f(a,c);if(!k||!G(k.then))throw Ob("$asyncValidators",k);g(h,u);d.push(k.then(function(){g(h,!0)},function(a){e=!1;g(h,!1)}))});d.length?k.all(d).then(function(){h(e)},B):h(!0)}function g(a,c){l===H&&n.$setValidity(a,c)}function h(a){l===H&&d(a)}H++;var l=H;(function(){var a=n.$$parserName||"parse";if(C===u)g(a,null);else return C||(s(n.$validators, +function(a,c){g(c,null)}),s(n.$asyncValidators,function(a,c){g(c,null)})),g(a,C),C;return!0})()?e()?f():h(!1):h(!1)};this.$commitViewValue=function(){var a=n.$viewValue;h.cancel(w);if(n.$$lastCommittedViewValue!==a||""===a&&n.$$hasNativeValidators)n.$$lastCommittedViewValue=a,n.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=n.$$lastCommittedViewValue;if(C=z(c)?u:!0)for(var d=0;dA;)d=u.pop(),m(O,d.label,!1),d.element.remove()}for(;P.length> +x;){l=P.pop();for(A=1;Aa&&q.removeOption(c)})}var v;if(!(v=r.match(d)))throw fg("iexp",r,ua(f));var C=c(v[2]||v[1]),B=v[4]||v[6],x=/ as /.test(v[0])&&v[1],z=x?c(x):null,G=v[5],J=c(v[3]||""),A=c(v[2]?v[1]:B),N=c(v[7]),K=v[8]?c(v[8]):null,Q={},P=[[{element:f,label:""}]],R={};w&&(a(w)(e),w.removeClass("ng-scope"),w.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=N(e)||[],c;if(t)c=[],s(f.val(), +function(d){d=K?Q[d]:d;c.push("?"===d?u:""===d?null:h(z?z:A,d,a[d]))});else{var d=K?Q[f.val()]:f.val();c="?"===d?u:""===d?null:h(z?z:A,d,a[d])}g.$setViewValue(c);p()})});g.$render=p;e.$watchCollection(N,l);e.$watchCollection(function(){var a=N(e),c;if(a&&E(a)){c=Array(a.length);for(var d=0,f=a.length;df||e.$isEmpty(c)||c.length<=f}}}}},Bc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=$(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}};P.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(Nd(),Pd(aa),C(X).ready(function(){Jd(X,tc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend(''); +//# sourceMappingURL=angular.min.js.map \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css new file mode 100644 index 00000000..240be45b --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.css @@ -0,0 +1,74 @@ +.angularjs-datetime-picker { + color: #333; + font: normal 14px sans-serif; + border: 1px solid #ddd; + display: inline-block; + background: #fff; +} +.angularjs-datetime-picker > .adp-month { + text-align: center; + line-height: 22px; + padding: 10px; + background: #fcfcfc; + text-transform: uppercase; + font-weight: bold; + border-bottom: 1px solid #ddd; + position: relative; +} +.angularjs-datetime-picker > .adp-month > button { + color: #555; + font: normal 14px sans-serif; + outline: none; + position: absolute; + background: transparent; + border: none; + cursor: pointer; +} +.angularjs-datetime-picker > .adp-month > button:hover { + color: #333; +} +.angularjs-datetime-picker > .adp-month > button.adp-prev { + left: 10px; +} +.angularjs-datetime-picker > .adp-month > button.adp-next { + right: 10px; +} +.angularjs-datetime-picker > .adp-days { + width: 210px; /* 30 x 7 */ + margin: 10px; + text-align: center; +} +.angularjs-datetime-picker > .adp-days > .adp-day-of-week, .angularjs-datetime-picker > .adp-days > .adp-day { + box-sizing: border-box; + -moz-box-sizing: border-box; + border: 1px solid transparent; + width: 30px; + line-height: 28px; + float: left; +} +.angularjs-datetime-picker > .adp-days > .adp-day-of-week { + font-weight: bold; +} +.angularjs-datetime-picker > .adp-days > .adp-day:not(.selectable) { + opacity: 0.15; + cursor: default; +} +.angularjs-datetime-picker > .adp-days > .adp-day.selectable { + cursor: pointer; +} +.angularjs-datetime-picker > .adp-days > .adp-day.selected { + background: #e0e0e0; +} +.angularjs-datetime-picker > .adp-days > .adp-day.selectable:hover { + background: #eee; +} +.angularjs-datetime-picker > .adp-days:after { + content: ''; + display: block; + clear: left; + height: 0; +} + +.angularjs-datetime-picker input[type=range] { + width: 150px; +} diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js new file mode 100644 index 00000000..946f12e8 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.js @@ -0,0 +1,332 @@ +(function() { + 'use strict'; + + angular.module('angularjs-datetime-picker', []); + + var getTimezoneOffset = function(date) { + (typeof date == 'string') && (date = new Date(date)); + var jan = new Date(date.getFullYear(), 0, 1); + var jul = new Date(date.getFullYear(), 6, 1); + var stdTimezoneOffset = Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); + var isDST = date.getTimezoneOffset() < stdTimezoneOffset; + var offset = isDST ? stdTimezoneOffset - 60 : stdTimezoneOffset; + var diff = offset >=0 ? '-' : '+'; + return diff + + ("0"+ (offset / 60)).slice(-2) + ':' + + ("0"+ (offset % 60)).slice(-2); + }; + + var DatetimePicker = function($compile, $document, $controller){ + var datetimePickerCtrl = $controller('DatetimePickerCtrl'); //directive controller + return { + open: function(options) { + datetimePickerCtrl.openDatetimePicker(options); + }, + close: function() { + datetimePickerCtrl.closeDatetimePicker(); + } + }; + }; + DatetimePicker.$inject = ['$compile', '$document', '$controller']; + angular.module('angularjs-datetime-picker').factory('DatetimePicker', DatetimePicker); + + var DatetimePickerCtrl = function($compile, $document) { + var datetimePickerEl; + var _this = this; + var removeEl = function(el) { + el && el.remove(); + $document[0].body.removeEventListener('click', _this.closeDatetimePicker); + }; + + this.openDatetimePicker = function(options) { + this.closeDatetimePicker(); + var div = angular.element('
'); + options.dateFormat && div.attr('date-format', options.dateFormat); + options.ngModel && div.attr('ng-model', options.ngModel); + options.year && div.attr('year', parseInt(options.year)); + options.month && div.attr('month', parseInt(options.month)); + options.day && div.attr('day', parseInt(options.day)); + options.hour && div.attr('hour', parseInt(options.hour)); + options.minute && div.attr('minute', parseInt(options.minute)); + if (options.dateOnly === '' || options.dateOnly === true) { + div.attr('date-only', 'true'); + } + if (options.closeOnSelect === 'false') { + div.attr('close-on-select', 'false'); + } + + var triggerEl = options.triggerEl; + options.scope = options.scope || angular.element(triggerEl).scope(); + datetimePickerEl = $compile(div)(options.scope)[0]; + datetimePickerEl.triggerEl = options.triggerEl; + + $document[0].body.appendChild(datetimePickerEl); + + //show datetimePicker below triggerEl + var bcr = triggerEl.getBoundingClientRect(); + datetimePickerEl.style.position='absolute'; + datetimePickerEl.style.left= (bcr.left + window.scrollX) + 'px'; + + options.scope.$apply(); + + var datePickerElBcr = datetimePickerEl.getBoundingClientRect(); + + if (bcr.top < 300 || window.innerHeight - bcr.bottom > 300) { + datetimePickerEl.style.top = (bcr.bottom + window.scrollY) + 'px'; + } else { + datetimePickerEl.style.top = (bcr.top - datePickerElBcr.height + window.scrollY) + 'px'; + } + + $document[0].body.addEventListener('click', this.closeDatetimePicker); + }; + + this.closeDatetimePicker = function(evt) { + var target = evt && evt.target; + var popupEl = $document[0].querySelector('div[datetime-picker-popup]'); + if (evt && target) { + if (target.hasAttribute('datetime-picker')) { // element with datetimePicker behaviour + // do nothing + } else if (popupEl && popupEl.contains(target)) { // datetimePicker itself + // do nothing + } else { + removeEl(popupEl); + } + } else { + removeEl(popupEl); + } + } + }; + DatetimePickerCtrl.$inject = ['$compile', '$document']; + angular.module('angularjs-datetime-picker').controller('DatetimePickerCtrl', DatetimePickerCtrl); + + var tmpl = [ + '
' , + '
', + ' ', + ' {{months[mv.month].shortName}} {{mv.year}}', + ' ', + '
', + '
', + '
{{::dayOfWeek.firstLetter}}
', + '
{{::day}}
', + '
{{::day}}
', + '
{{::day}}
', + '
', + '
', + ' Time : {{("0"+inputHour).slice(-2)}} : {{("0"+inputMinute).slice(-2)}}
', + ' ', + ' ', + '
', + '
'].join("\n"); + + var datetimePickerPopup = function($locale, dateFilter){ + var days, months, daysOfWeek, firstDayOfWeek; + + var initVars = function() { + days =[], months=[]; daysOfWeek=[], firstDayOfWeek=0; + for (var i = 1; i <= 31; i++) { + days.push(i); + } + + for (var i = 0; i < 12; i++) { //jshint ignore:line + months.push({ + fullName: $locale.DATETIME_FORMATS.MONTH[i], + shortName: $locale.DATETIME_FORMATS.SHORTMONTH[i] + }); + } + + for (var i = 0; i < 7; i++) { //jshint ignore:line + var day = $locale.DATETIME_FORMATS.DAY[(i + firstDayOfWeek) % 7]; + + daysOfWeek.push({ + fullName: day, + firstLetter: day.substr(0, 2) + }); + } + firstDayOfWeek = $locale.DATETIME_FORMATS.FIRSTDAYOFWEEK || 0; + }; + + var getMonthView = function(year, month) { + if (month>11) { + year++; + } else if (month < 0) { + year--; + } + month = (month + 12) % 12; + var firstDayOfMonth = new Date(year, month, 1), + lastDayOfMonth = new Date(year, month + 1, 0), + lastDayOfPreviousMonth = new Date(year, month, 0), + daysInMonth = lastDayOfMonth.getDate(), + daysInLastMonth = lastDayOfPreviousMonth.getDate(), + dayOfWeek = firstDayOfMonth.getDay(), + leadingDays = (dayOfWeek - firstDayOfWeek + 7) % 7 || 7, // Ensure there are always leading days to give context + trailingDays = days.slice(0, 6 * 7 - (leadingDays + daysInMonth)); + if (trailingDays.length > 7) { + trailingDays = trailingDays.slice(0, trailingDays.length-7); + } + + return { + year: year, + month: month, + days: days.slice(0, daysInMonth), + leadingDays: days.slice(- leadingDays - (31 - daysInLastMonth), daysInLastMonth), + trailingDays: trailingDays + }; + }; + + var linkFunc = function(scope, element, attrs, ctrl) { //jshint ignore:line + initVars(); //initialize days, months, daysOfWeek, and firstDayOfWeek; + var dateFormat = attrs.dateFormat || 'short'; + scope.months = months; + scope.daysOfWeek = daysOfWeek; + scope.inputHour; + scope.inputMinute; + + if (scope.dateOnly === true){ + element[0].querySelector('#adp-time').style.display = 'none'; + } + + scope.$applyAsync( function() { + ctrl.triggerEl = angular.element(element[0].triggerEl); + if (attrs.ngModel) { // need to parse date string + var dateStr = ''+ctrl.triggerEl.scope().$eval(attrs.ngModel); + if (dateStr) { + if (!dateStr.match(/[0-9]{2}:/)) { // if no time is given, add 00:00:00 at the end + dateStr += " 00:00:00"; + } + dateStr = dateStr.replace(/([0-9]{2}-[0-9]{2})-([0-9]{4})/,'$2-$1'); //mm-dd-yyyy to yyyy-mm-dd + dateStr = dateStr.replace(/([\/-][0-9]{2,4})\ ([0-9]{2}\:[0-9]{2}\:)/,'$1T$2'); //reformat for FF + dateStr = dateStr.replace(/EDT|EST|CDT|CST|MDT|PDT|PST|UT|GMT/g,''); //remove timezone + dateStr = dateStr.replace(/\s*\(\)\s*/,''); //remove timezone + dateStr = dateStr.replace(/[\-\+][0-9]{2}:?[0-9]{2}$/,''); //remove timezone + dateStr += getTimezoneOffset(dateStr); + var d = new Date(dateStr); + scope.selectedDate = new Date( + d.getFullYear(), + d.getMonth(), + d.getDate(), + d.getHours(), + d.getMinutes(), + d.getSeconds() + ); + } + } + + if (!scope.selectedDate || isNaN(scope.selectedDate.getTime())) { // no predefined date + var today = new Date(); + var year = scope.year || today.getFullYear(); + var month = scope.month ? (scope.month-1) : today.getMonth(); + var day = scope.day || today.getDate(); + var hour = scope.hour || today.getHours(); + var minute = scope.minute || today.getMinutes(); + scope.selectedDate = new Date(year, month, day, hour, minute, 0); + } + scope.inputHour = scope.selectedDate.getHours(); + scope.inputMinute = scope.selectedDate.getMinutes(); + + // Default to current year and month + scope.mv = getMonthView(scope.selectedDate.getFullYear(), scope.selectedDate.getMonth()); + if (scope.mv.year == scope.selectedDate.getFullYear() && scope.mv.month == scope.selectedDate.getMonth()) { + scope.selectedDay = scope.selectedDate.getDate(); + } else { + scope.selectedDay = null; + } + }); + + scope.addMonth = function (amount) { + scope.mv = getMonthView(scope.mv.year, scope.mv.month + amount); + }; + + scope.setDate = function (evt) { + var target = angular.element(evt.target)[0]; + if (target.className.indexOf('selectable')) { + scope.updateNgModel(parseInt(target.innerHTML)); + if (scope.closeOnSelect !== false) { + ctrl.closeDatetimePicker(); + } + } + }; + + scope.updateNgModel = function(day) { + day = day ? day : scope.selectedDate.getDate(); + scope.selectedDate = new Date( + scope.mv.year, scope.mv.month, day, scope.inputHour, scope.inputMinute, 0 + ); + scope.selectedDay = scope.selectedDate.getDate(); + if (attrs.ngModel) { + //console.log('attrs.ngModel',attrs.ngModel); + var elScope = ctrl.triggerEl.scope(), dateValue; + if (elScope.$eval(attrs.ngModel) && elScope.$eval(attrs.ngModel).constructor.name === 'Date') { + dateValue = new Date(dateFilter(scope.selectedDate, dateFormat)); + } else { + dateValue = dateFilter(scope.selectedDate, dateFormat); + } + elScope.$eval(attrs.ngModel + '= date', {date: dateValue}); + } + }; + + scope.$on('$destroy', ctrl.closeDatetimePicker); + }; + + return { + restrict: 'A', + template: tmpl, + controller: 'DatetimePickerCtrl', + replace: true, + scope: { + year: '=', + month: '=', + day: '=', + hour: '=', + minute: '=', + dateOnly: '=', + closeOnSelect: '=' + }, + link: linkFunc + }; + }; + datetimePickerPopup.$inject = ['$locale', 'dateFilter']; + angular.module('angularjs-datetime-picker').directive('datetimePickerPopup', datetimePickerPopup); + + var datetimePicker = function($parse, DatetimePicker) { + return { + // An ngModel is required to get the controller argument + require: 'ngModel', + link: function(scope, element, attrs, ctrl) { + // Attach validation watcher + scope.$watch(attrs.ngModel, function(value) { + if( !value || value == '' ){ + return; + } + // The value has already been cleaned by the above code + var date = new Date(value); + ctrl.$setValidity('date', !date? false : true); + var now = new Date(); + if( attrs.hasOwnProperty('futureOnly') ){ + ctrl.$setValidity('future-only', date < now? false : true); + } + }); + + element[0].addEventListener('click', function() { + DatetimePicker.open({ + triggerEl: element[0], + dateFormat: attrs.dateFormat, + ngModel: attrs.ngModel, + year: attrs.year, + month: attrs.month, + day: attrs.day, + hour: attrs.hour, + minute: attrs.minute, + dateOnly: attrs.dateOnly, + futureOnly: attrs.futureOnly, + closeOnSelect: attrs.closeOnSelect + }); + }); + } + }; + }; + datetimePicker.$inject=['$parse', 'DatetimePicker']; + angular.module('angularjs-datetime-picker').directive('datetimePicker', datetimePicker); + +})(); diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.min.js b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.min.js new file mode 100644 index 00000000..bc6c19ac --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/angularjs-datetime-picker/angularjs-datetime-picker.min.js @@ -0,0 +1 @@ +!function(){"use strict";angular.module("angularjs-datetime-picker",[]);var e=function(e){"string"==typeof e&&(e=new Date(e));var t=new Date(e.getFullYear(),0,1),a=new Date(e.getFullYear(),6,1),n=Math.max(t.getTimezoneOffset(),a.getTimezoneOffset()),l=e.getTimezoneOffset()=0?"-":"+";return i+("0"+r/60).slice(-2)+":"+("0"+r%60).slice(-2)},t=function(e,t,a){var n=a("DatetimePickerCtrl");return{open:function(e){n.openDatetimePicker(e)},close:function(){n.closeDatetimePicker()}}};t.$inject=["$compile","$document","$controller"],angular.module("angularjs-datetime-picker").factory("DatetimePicker",t);var a=function(e,t){var a,n=this,l=function(e){e&&e.remove(),t[0].body.removeEventListener("click",n.closeDatetimePicker)};this.openDatetimePicker=function(n){this.closeDatetimePicker();var l=angular.element("
");n.dateFormat&&l.attr("date-format",n.dateFormat),n.ngModel&&l.attr("ng-model",n.ngModel),n.year&&l.attr("year",parseInt(n.year)),n.month&&l.attr("month",parseInt(n.month)),n.day&&l.attr("day",parseInt(n.day)),n.hour&&l.attr("hour",parseInt(n.hour)),n.minute&&l.attr("minute",parseInt(n.minute)),(""===n.dateOnly||n.dateOnly===!0)&&l.attr("date-only","true"),"false"===n.closeOnSelect&&l.attr("close-on-select","false");var r=n.triggerEl;n.scope=n.scope||angular.element(r).scope(),a=e(l)(n.scope)[0],a.triggerEl=n.triggerEl,t[0].body.appendChild(a);var i=r.getBoundingClientRect();a.style.position="absolute",a.style.left=i.left+window.scrollX+"px",n.scope.$apply();var o=a.getBoundingClientRect();a.style.top=i.top<300||window.innerHeight-i.bottom>300?i.bottom+window.scrollY+"px":i.top-o.height+window.scrollY+"px",t[0].body.addEventListener("click",this.closeDatetimePicker)},this.closeDatetimePicker=function(e){var a=e&&e.target,n=t[0].querySelector("div[datetime-picker-popup]");e&&a?a.hasAttribute("datetime-picker")||n&&n.contains(a)||l(n):l(n)}};a.$inject=["$compile","$document"],angular.module("angularjs-datetime-picker").controller("DatetimePickerCtrl",a);var n=['
','
',' ',' {{months[mv.month].shortName}} {{mv.year}}',' ',"
",'
','
{{::dayOfWeek.firstLetter}}
','
{{::day}}
','
{{::day}}
','
{{::day}}
',"
",'
',' Time : {{("0"+inputHour).slice(-2)}} : {{("0"+inputMinute).slice(-2)}}
',' ',' ',"
","
"].join("\n"),l=function(t,a){var l,r,i,o,c=function(){l=[],r=[],i=[],o=0;for(var e=1;31>=e;e++)l.push(e);for(var e=0;12>e;e++)r.push({fullName:t.DATETIME_FORMATS.MONTH[e],shortName:t.DATETIME_FORMATS.SHORTMONTH[e]});for(var e=0;7>e;e++){var a=t.DATETIME_FORMATS.DAY[(e+o)%7];i.push({fullName:a,firstLetter:a.substr(0,2)})}o=t.DATETIME_FORMATS.FIRSTDAYOFWEEK||0},d=function(e,t){t>11?e++:0>t&&e--,t=(t+12)%12;var a=new Date(e,t,1),n=new Date(e,t+1,0),r=new Date(e,t,0),i=n.getDate(),c=r.getDate(),d=a.getDay(),s=(d-o+7)%7||7,u=l.slice(0,42-(s+i));return u.length>7&&(u=u.slice(0,u.length-7)),{year:e,month:t,days:l.slice(0,i),leadingDays:l.slice(-s-(31-c),c),trailingDays:u}},s=function(t,n,l,o){c();var s=l.dateFormat||"short";t.months=r,t.daysOfWeek=i,t.inputHour,t.inputMinute,t.dateOnly===!0&&(n[0].querySelector("#adp-time").style.display="none"),t.$applyAsync(function(){if(o.triggerEl=angular.element(n[0].triggerEl),l.ngModel){var a=""+o.triggerEl.scope().$eval(l.ngModel);if(a){a.match(/[0-9]{2}:/)||(a+=" 00:00:00"),a=a.replace(/([0-9]{2}-[0-9]{2})-([0-9]{4})/,"$2-$1"),a=a.replace(/([\/-][0-9]{2,4})\ ([0-9]{2}\:[0-9]{2}\:)/,"$1T$2"),a=a.replace(/EDT|EST|CDT|CST|MDT|PDT|PST|UT|GMT/g,""),a=a.replace(/\s*\(\)\s*/,""),a=a.replace(/[\-\+][0-9]{2}:?[0-9]{2}$/,""),a+=e(a);var r=new Date(a);t.selectedDate=new Date(r.getFullYear(),r.getMonth(),r.getDate(),r.getHours(),r.getMinutes(),r.getSeconds())}}if(!t.selectedDate||isNaN(t.selectedDate.getTime())){var i=new Date,c=t.year||i.getFullYear(),s=t.month?t.month-1:i.getMonth(),u=t.day||i.getDate(),m=t.hour||i.getHours(),g=t.minute||i.getMinutes();t.selectedDate=new Date(c,s,u,m,g,0)}t.inputHour=t.selectedDate.getHours(),t.inputMinute=t.selectedDate.getMinutes(),t.mv=d(t.selectedDate.getFullYear(),t.selectedDate.getMonth()),t.selectedDay=t.mv.year==t.selectedDate.getFullYear()&&t.mv.month==t.selectedDate.getMonth()?t.selectedDate.getDate():null}),t.addMonth=function(e){t.mv=d(t.mv.year,t.mv.month+e)},t.setDate=function(e){var a=angular.element(e.target)[0];a.className.indexOf("selectable")&&(t.updateNgModel(parseInt(a.innerHTML)),t.closeOnSelect!==!1&&o.closeDatetimePicker())},t.updateNgModel=function(e){if(e=e?e:t.selectedDate.getDate(),t.selectedDate=new Date(t.mv.year,t.mv.month,e,t.inputHour,t.inputMinute,0),t.selectedDay=t.selectedDate.getDate(),l.ngModel){var n,r=o.triggerEl.scope();n=r.$eval(l.ngModel)&&"Date"===r.$eval(l.ngModel).constructor.name?new Date(a(t.selectedDate,s)):a(t.selectedDate,s),r.$eval(l.ngModel+"= date",{date:n})}},t.$on("$destroy",o.closeDatetimePicker)};return{restrict:"A",template:n,controller:"DatetimePickerCtrl",replace:!0,scope:{year:"=",month:"=",day:"=",hour:"=",minute:"=",dateOnly:"=",closeOnSelect:"="},link:s}};l.$inject=["$locale","dateFilter"],angular.module("angularjs-datetime-picker").directive("datetimePickerPopup",l);var r=function(e,t){return{require:"ngModel",link:function(e,a,n,l){e.$watch(n.ngModel,function(e){if(e&&""!=e){var t=new Date(e);l.$setValidity("date",t?!0:!1);var a=new Date;n.hasOwnProperty("futureOnly")&&l.$setValidity("future-only",a>t?!1:!0)}}),a[0].addEventListener("click",function(){t.open({triggerEl:a[0],dateFormat:n.dateFormat,ngModel:n.ngModel,year:n.year,month:n.month,day:n.day,hour:n.hour,minute:n.minute,dateOnly:n.dateOnly,futureOnly:n.futureOnly,closeOnSelect:n.closeOnSelect})})}}};r.$inject=["$parse","DatetimePicker"],angular.module("angularjs-datetime-picker").directive("datetimePicker",r)}(); \ No newline at end of file diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/bootstrap-3.3.7/package.json b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/bootstrap-3.3.7/package.json new file mode 100644 index 00000000..fe4b31de --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/bootstrap-3.3.7/package.json @@ -0,0 +1,89 @@ +{ + "name": "bootstrap", + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "version": "3.3.7", + "keywords": [ + "css", + "less", + "mobile-first", + "responsive", + "front-end", + "framework", + "web" + ], + "homepage": "http://getbootstrap.com", + "author": "Twitter, Inc.", + "scripts": { + "change-version": "node grunt/change-version.js", + "update-shrinkwrap": "npm shrinkwrap --dev && shx mv ./npm-shrinkwrap.json ./grunt/npm-shrinkwrap.json", + "test": "grunt test" + }, + "style": "dist/css/bootstrap.css", + "less": "less/bootstrap.less", + "main": "./dist/js/npm", + "repository": { + "type": "git", + "url": "https://github.com/twbs/bootstrap.git" + }, + "bugs": { + "url": "https://github.com/twbs/bootstrap/issues" + }, + "license": "MIT", + "devDependencies": { + "btoa": "~1.1.2", + "glob": "~7.0.3", + "grunt": "~1.0.1", + "grunt-autoprefixer": "~3.0.4", + "grunt-contrib-clean": "~1.0.0", + "grunt-contrib-compress": "~1.3.0", + "grunt-contrib-concat": "~1.0.0", + "grunt-contrib-connect": "~1.0.0", + "grunt-contrib-copy": "~1.0.0", + "grunt-contrib-csslint": "~1.0.0", + "grunt-contrib-cssmin": "~1.0.0", + "grunt-contrib-htmlmin": "~1.5.0", + "grunt-contrib-jshint": "~1.0.0", + "grunt-contrib-less": "~1.3.0", + "grunt-contrib-pug": "~1.0.0", + "grunt-contrib-qunit": "~0.7.0", + "grunt-contrib-uglify": "~1.0.0", + "grunt-contrib-watch": "~1.0.0", + "grunt-csscomb": "~3.1.0", + "grunt-exec": "~1.0.0", + "grunt-html": "~8.0.1", + "grunt-jekyll": "~0.4.4", + "grunt-jscs": "~3.0.1", + "grunt-saucelabs": "~9.0.0", + "load-grunt-tasks": "~3.5.0", + "markdown-it": "^7.0.0", + "shelljs": "^0.7.0", + "shx": "^0.1.2", + "time-grunt": "^1.3.0" + }, + "engines": { + "node": ">=0.10.1" + }, + "files": [ + "dist", + "fonts", + "grunt", + "js/*.js", + "less/**/*.less", + "Gruntfile.js", + "LICENSE" + ], + "jspm": { + "main": "js/bootstrap", + "shim": { + "js/bootstrap": { + "deps": "jquery", + "exports": "$" + } + }, + "files": [ + "css", + "fonts", + "js" + ] + } +} diff --git a/SdncReports/SdncReportsApi/src/main/webapp/node_modules/jquery.min.js b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/jquery.min.js new file mode 100644 index 00000000..4d9b3a25 --- /dev/null +++ b/SdncReports/SdncReportsApi/src/main/webapp/node_modules/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("