UI adaptation for supporting ONAP portal SDK 44/1044/5
authorIoakeim Samaras <ioakeim.samaras@ericsson.com>
Mon, 24 Jun 2019 16:08:46 +0000 (19:08 +0300)
committerIoakeim Samaras <ioakeim.samaras@ericsson.com>
Tue, 2 Jul 2019 10:08:18 +0000 (13:08 +0300)
JIRA: VAL-29

Signed-off-by: Ioakeim Samaras <ioakeim.samaras@ericsson.com>
Change-Id: I1ff3118e09b7cc91b465fb8293a0e7765c82a581

198 files changed:
.coafile
docker/README.rst
docker/mariadb/Dockerfile [new file with mode: 0644]
docker/mariadb/Makefile [moved from docker/postgresql/Makefile with 100% similarity]
docker/mariadb/deploy.sh [new file with mode: 0755]
docker/mariadb/mariadb.conf [moved from docker/postgresql/Dockerfile with 83% similarity]
docker/postgresql/akraino-blueprint_validation_db.sql [deleted file]
docker/postgresql/deploy.sh [deleted file]
docker/ui/Dockerfile
docker/ui/deploy.sh
ui/CHANGELOG.md
ui/README.rst
ui/db-scripts/EcompSdkDDLMySql_2_4_Common.sql [new file with mode: 0644]
ui/db-scripts/EcompSdkDDLMySql_2_4_OS.sql [new file with mode: 0644]
ui/db-scripts/EcompSdkDMLMySql_2_4_Common.sql [new file with mode: 0644]
ui/db-scripts/EcompSdkDMLMySql_2_4_OS.sql [new file with mode: 0644]
ui/db-scripts/akraino-blueprint_validation_db.sql [new file with mode: 0644]
ui/db-scripts/examples/initialize_db_example.sql [new file with mode: 0644]
ui/distribution.xml [new file with mode: 0644]
ui/pom.xml [changed mode: 0755->0644]
ui/src/main/java/org/akraino/validation/ui/client/jenkins/JenkinsExecutorClient.java
ui/src/main/java/org/akraino/validation/ui/client/nexus/NexusExecutorClient.java
ui/src/main/java/org/akraino/validation/ui/client/nexus/resources/WrapperRobotTestResult.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/common/PropertyUtil.java [deleted file]
ui/src/main/java/org/akraino/validation/ui/common/SessionManagerFilter.java [deleted file]
ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppConfig.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppInitializer.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/conf/HibernateMappingLocations.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/conf/UiUtils.java [moved from ui/src/main/java/org/akraino/validation/ui/config/AppInitializer.java with 55% similarity]
ui/src/main/java/org/akraino/validation/ui/config/AppConfig.java [deleted file]
ui/src/main/java/org/akraino/validation/ui/config/HibernateConfig.java [deleted file]
ui/src/main/java/org/akraino/validation/ui/controller/BlueprintController.java
ui/src/main/java/org/akraino/validation/ui/controller/BlueprintInstanceController.java [deleted file]
ui/src/main/java/org/akraino/validation/ui/controller/BlueprintInstanceForValidationController.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/controller/JenkinsJobNotificationController.java
ui/src/main/java/org/akraino/validation/ui/controller/ModelsViewsController.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/controller/OnapLoginController.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/controller/ResultsController.java
ui/src/main/java/org/akraino/validation/ui/controller/SubmissionController.java
ui/src/main/java/org/akraino/validation/ui/controller/TimeslotsController.java [moved from ui/src/main/java/org/akraino/validation/ui/controller/TimeSlotsController.java with 51% similarity]
ui/src/main/java/org/akraino/validation/ui/dao/BlueprintInstanceForValidationDAO.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/dao/LabDAO.java [moved from ui/src/main/java/org/akraino/validation/ui/dao/BlueprintInstanceDAO.java with 64% similarity]
ui/src/main/java/org/akraino/validation/ui/dao/SiloDAO.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/dao/SubmissionDAO.java
ui/src/main/java/org/akraino/validation/ui/dao/TimeslotDAO.java
ui/src/main/java/org/akraino/validation/ui/daoimpl/BlueprintDAOImpl.java
ui/src/main/java/org/akraino/validation/ui/daoimpl/BlueprintInstanceDAOImpl.java [deleted file]
ui/src/main/java/org/akraino/validation/ui/daoimpl/BlueprintInstanceForValidationDAOImpl.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/daoimpl/LabDAOImpl.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/daoimpl/SiloDAOImpl.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/daoimpl/SubmissionDAOImpl.java
ui/src/main/java/org/akraino/validation/ui/daoimpl/TimeslotDAOImpl.java
ui/src/main/java/org/akraino/validation/ui/data/BlueprintLayer.java
ui/src/main/java/org/akraino/validation/ui/entity/Blueprint.java
ui/src/main/java/org/akraino/validation/ui/entity/BlueprintInstanceForValidation.java [moved from ui/src/main/java/org/akraino/validation/ui/entity/BlueprintInstance.java with 76% similarity]
ui/src/main/java/org/akraino/validation/ui/entity/LabInfo.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/entity/LabSilo.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/entity/Submission.java
ui/src/main/java/org/akraino/validation/ui/entity/Timeslot.java
ui/src/main/java/org/akraino/validation/ui/filter/SecurityXssFilter.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/login/LoginStrategyImpl.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/scheduler/Register.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/scheduler/RegistryAdapter.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/service/AdminAuthExtension.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/service/BlueprintInstanceForValidationService.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/service/BlueprintInstanceService.java [deleted file]
ui/src/main/java/org/akraino/validation/ui/service/BlueprintService.java
ui/src/main/java/org/akraino/validation/ui/service/JenkinsJobNotificationService.java
ui/src/main/java/org/akraino/validation/ui/service/LabService.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/service/ResultService.java
ui/src/main/java/org/akraino/validation/ui/service/SiloService.java [new file with mode: 0644]
ui/src/main/java/org/akraino/validation/ui/service/SubmissionService.java
ui/src/main/java/org/akraino/validation/ui/service/TimeslotService.java
ui/src/main/java/org/akraino/validation/ui/service/utils/SubmissionHelper.java
ui/src/main/resources/app.properties [deleted file]
ui/src/main/resources/hibernate.properties [deleted file]
ui/src/main/resources/key.properties [new file with mode: 0644]
ui/src/main/resources/log4j.properties [deleted file]
ui/src/main/resources/logback.xml [new file with mode: 0644]
ui/src/main/resources/music.properties [new file with mode: 0644]
ui/src/main/resources/portal.properties [new file with mode: 0644]
ui/src/main/webapp/.eslintrc
ui/src/main/webapp/WEB-INF/conf/system.properties [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/defs/definitions.xml [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/fusion/conf/fusion.properties [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/footer.jsp [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/header.jsp [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/fusion/orm/Analytics.hbm.xml [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/index.jsp [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/jsp/login.jsp [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/jsp/login_external.jsp [new file with mode: 0644]
ui/src/main/webapp/WEB-INF/web.xml [changed mode: 0755->0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/App.Config.js [moved from ui/src/main/webapp/resources/js/App.Config.js with 93% similarity]
ui/src/main/webapp/app/AECBlueprintValidationUI/App.Services.js [moved from ui/src/main/webapp/resources/js/App.Services.js with 96% similarity]
ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissions.js [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissionsController.js [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissions.html [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissionsTemplate.html [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/Route.js [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionId.js [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionIdController.js [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionId.html [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionIdTemplate.html [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/Route.js [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/AECNewSubmission.js [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/AECNewSubmissionController.js [moved from ui/src/main/webapp/resources/js/AECNewSubmissionController.js with 62% similarity]
ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/NewSubmission.html [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/NewSubmissionTemplate.html [new file with mode: 0644]
ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/Route.js [moved from ui/src/main/java/org/akraino/validation/ui/common/ServiceInitializationListener.java with 60% similarity]
ui/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/font_icons.css [new file with mode: 0644]
ui/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css [new file with mode: 0644]
ui/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ionicons.css [new file with mode: 0644]
ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.eot [new file with mode: 0644]
ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.svg [new file with mode: 0644]
ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.ttf [new file with mode: 0644]
ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.woff [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-controllers/ds-profile/post-controller.js [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-controllers/samplePage-route.js [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-services/postSearch.js [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/post.html [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/profile_searchDS2.html [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/self_profile.html [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-samplePages/samplePage.html [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-view-models/footer.html [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html [new file with mode: 0644]
ui/src/main/webapp/app/fusion/scripts/DS2-view-models/welcome-content.html [moved from ui/src/main/webapp/WEB-INF/views/welcome.jsp with 64% similarity, mode: 0644]
ui/src/main/webapp/app/fusion/scripts/view-models/footer.html [new file with mode: 0644]
ui/src/main/webapp/index.html [deleted file]
ui/src/main/webapp/resources/css/ngDialog-theme-default.css [deleted file]
ui/src/main/webapp/resources/css/style.css [deleted file]
ui/src/main/webapp/resources/images/logo_akraino_edge_stack.png [deleted file]
ui/src/main/webapp/resources/js/AECCommittedSubmissionsController.js [deleted file]
ui/src/main/webapp/resources/js/AECFindBySubmissionIdController.js [deleted file]
ui/src/main/webapp/resources/js/App.js [deleted file]
ui/src/main/webapp/resources/js/CommonController.js [deleted file]
ui/src/main/webapp/reusable_chart.js [deleted file]
ui/src/main/webapp/static/fusion/css/att_angular_gridster/sandbox-gridster.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/css/att_angular_gridster/ui-gridster.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/css/fusion-sunny.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/images/att_angular_gridster/grips.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack2.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/js/att_angular_gridster/angular-gridster.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/js/att_angular_gridster/ui-gridster-tpls.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/css/images/blank.gif [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/css/scribble.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/css/slider.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/css/spacegallery.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/css/welcome.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/area_chart.html [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/bar_chart.html [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/d3_gauges_demo.html [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/data/speedometer2.csv [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/data/speedometer3.csv [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/data/worddata.csv [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/donut_d3.html [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/js/area_chart.min.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/js/donut.min.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/js/gauges.min.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/js/line_chart.min.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/js/pie_chart.min.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/js/worddata.min.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/line_chart.html [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/pie_chart.html [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/html/wordcloud.html [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_drive_test_map.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_county.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_regression.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_ios_throughput.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map_legend.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/1_mon.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/2_tue.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/3_wed.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/4_thu.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/5_fri.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/6_sat.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/7_sun.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_IN.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_OUT.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Def.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Priority.png [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/js/FusionCharts.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/js/charts.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/js/scribble.js [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/org_chart/css/bootstrap.min.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/org_chart/css/custom.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/org_chart/css/prettify.css [new file with mode: 0644]
ui/src/main/webapp/static/fusion/sample/org_chart/prettify.js [new file with mode: 0644]
ui/src/main/webapp/views/committedSubmissions.html [deleted file]
ui/src/main/webapp/views/findBySubmissionId.html [deleted file]
ui/src/main/webapp/views/indexMain.html [deleted file]
ui/src/main/webapp/views/login.html [deleted file]
ui/src/main/webapp/views/newSubmission.html [deleted file]

index 95a31b4..0514a52 100644 (file)
--- a/.coafile
+++ b/.coafile
@@ -46,6 +46,12 @@ bears = SpaceConsistencyBear,JavaPMDBear
 files = ui/**.java
 language = java
 use_spaces = true
+ignore = ui/target/**,
+    ui/src/main/java/org/akraino/validation/ui/login/LoginStrategyImpl.java,
+    ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppInitializer.java,
+    ui/src/main/java/org/akraino/validation/ui/scheduler/RegistryAdapter.java,
+    ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppConfig.java,
+    ui/src/main/java/org/akraino/validation/ui/filter/SecurityXssFilter.java
 
 [all.JS]
 bears = ESLintBear,JSComplexityBear
@@ -53,6 +59,10 @@ files = ui/**.js
 language = javascript
 javascript_strictness = False
 use_spaces = true
-ignore = ui/src/main/webapp/reusable_chart.js,
+ignore = ui/src/main/webapp/app/fusion/**,
+    ui/src/main/webapp/static/**,
     ui/bin/**,
-    ui/target/**
+    ui/target/**,
+    ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/AECNewSubmission.js,
+    ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissions.js,
+    ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionId.js
index 34e7641..e4c4f4b 100644 (file)
@@ -76,9 +76,8 @@ stored on the local server.
 By default, the container will run the k8s conformance test. If you want to
 enter the container, add */bin/sh* at the end of the command above
 
-
-The postgresql container
-========================
+The mariadb container
+=====================
 
 Building and pushing the container
 ----------------------------------
@@ -87,25 +86,35 @@ To build just the postgresql container, use the command:
 
 .. code-block:: console
 
-    make postgresql-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+   make mariadb-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
 
 To both build and push the container, use the command:
 
 .. code-block:: console
 
-    make postgresql [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+   make mariadb [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
 
 Using the container
 -------------------
+In order for the container to be easily created, the deploy.sh script has been developed. This script accepts the following as input parameters:
 
-If you want to deploy the container, you can run the corresponding deploy.sh script with the appropriate parameters.
+CONTAINER_NAME, name of the container, default value is akraino-validation-mariadb
+MARIADB_ROOT_PASSWORD, the desired mariadb root user password, this variable is required
+UI_ADMIN_PASSWORD, the desired Blueprint Validation UI password for the admin user, this variable is required
+UI_AKRAINO_PASSWORD, the desired Blueprint Validation UI password for the akraino user, this variable is required
+REGISTRY, registry of the mariadb image, default value is akraino
+NAME, name of the mariadb image, default value is validation
+TAG_PRE, first part of the image version, default value is mariadb
+TAG_VER, last part of the image version, default value is latest
+MARIADB_HOST_PORT, port on which mariadb is exposed on host, default value is 3307
 
-Example:
+If you want to deploy the container, you can run this script with the appropriate parameters.
 
-.. code-block:: console
+Example (assuming you have used the default variables for building the image using the make command):
 
-    ./deploy.sh POSTGRES_PASSWORD=password
+.. code-block:: console
 
+    ./deploy.sh MARIADB_ROOT_PASSWORD=password UI_ADMIN_PASSWORD=admin UI_AKRAINO_PASSWORD=akraino
 
 The ui container
 ================
@@ -113,8 +122,7 @@ The ui container
 Building and pushing the container
 ----------------------------------
 
-To build just the ui container, you must first compile the ui project.
-Then use the command:
+To build just the UI container, use the command:
 
 .. code-block:: console
 
@@ -128,15 +136,37 @@ To both build and push the container, use the command:
 
 Using the container
 -------------------
+In order for the container to be easily created, the deploy.sh script has been developed. This script accepts the following as input parameters:
 
-If you want to deploy the container, you can run the corresponding deploy.sh script with the appropriate parameters.
-Note, that you must also build and run the postgresql container for a functional UI.
+CONTAINER_NAME, name of the contaner, default value is akraino-validation-ui
+DB_CONNECTION_URL, the URL connection with the akraino database of the maridb instance, this variable is required
+MARIADB_ROOT_PASSWORD, mariadb root user password, this variable is required
+REGISTRY, registry of the mariadb image, default value is akraino
+NAME, name of the mariadb image, default value is validation
+TAG_PRE, first part of the image version, default value is ui
+TAG_VER, last part of the image version, default value is latest
+JENKINS_URL, the URL of the Jenkins instance, this variable is required
+JENKINS_USERNAME, the Jenkins user name, this variable is required
+JENKINS_USER_PASSWORD, the Jenkins user password, this variable is required
+JENKINS_JOB_NAME, the name of Jenkins job capable of executing the blueprint validation tests, this variable is required
+NEXUS_PROXY, the proxy needed in order for the Nexus server to be reachable, default value is none
+JENKINS_PROXY, the proxy needed in order for the Jenkins server to be reachable, default value is none
 
-Example:
+Note that, for a functional UI, the following prerequisites are needed:
+
+- The mariadb container in up and running state
+- A Jenkins instance capable of running the blueprint validation test
+- A Nexus repo in which all the test results are stored.
+
+Look at the UI README file for more info.
+
+If you want to deploy the container, you can run the aforementioned script with the appropriate parameters.
+
+Example (assuming you have used the default variables for building the image using the make command):
 
 .. code-block:: console
 
-    ./deploy.sh postgres_db_user_pwd=password jenkins_url=http://192.168.2.2:8080 jenkins_user_name=name jenkins_user_pwd=jenkins_pwd jenkins_job_name=job1 nexus_results_url=https://nexus.akraino.org/content/sites/logs proxy_ip=172.28.40.9 proxy_port=3128
+    ./deploy.sh DB_CONNECTION_URL=172.17.0.3:3306/akraino MARIADB_ROOT_PASSWORD=password JENKINS_URL=http://192.168.2.2:8080 JENKINS_USERNAME=name JENKINS_USER_PASSWORD=jenkins_pwd JENKINS_JOB_NAME=job1
 
 The kube-conformance container
 ==============================
diff --git a/docker/mariadb/Dockerfile b/docker/mariadb/Dockerfile
new file mode 100644 (file)
index 0000000..7d109bc
--- /dev/null
@@ -0,0 +1,25 @@
+##############################################################################
+# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.        #
+#                                                                            #
+# Licensed under the Apache License, Version 2.0 (the "License");            #
+# you maynot 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.                                             #
+##############################################################################
+
+FROM alpine/git:1.0.7
+RUN git clone https://gerrit.akraino.org/r/validation /opt/akraino/validation/repo
+
+FROM mariadb:10.4.6
+COPY --from=0 /opt/akraino/validation/repo/ui/db-scripts/EcompSdkDDLMySql_2_4_Common.sql /docker-entrypoint-initdb.d
+COPY --from=0 /opt/akraino/validation/repo/ui/db-scripts/EcompSdkDDLMySql_2_4_OS.sql /docker-entrypoint-initdb.d
+COPY --from=0 /opt/akraino/validation/repo/ui/db-scripts/EcompSdkDMLMySql_2_4_Common.sql /docker-entrypoint-initdb.d
+COPY --from=0 /opt/akraino/validation/repo/ui/db-scripts/EcompSdkDMLMySql_2_4_OS.sql /docker-entrypoint-initdb.d
+COPY --from=0 /opt/akraino/validation/repo/ui/db-scripts/akraino-blueprint_validation_db.sql /docker-entrypoint-initdb.d
diff --git a/docker/mariadb/deploy.sh b/docker/mariadb/deploy.sh
new file mode 100755 (executable)
index 0000000..12c985c
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/bash
+#
+# Copyright (c) 2019 AT&T Intellectual Property.  All other 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.
+
+# Directory on host in where database data will be stored
+HOST_STORAGE_DIR="/var/lib/mariadb"
+# Container name
+CONTAINER_NAME="akraino-validation-mariadb"
+# Container input variables
+MARIADB_ROOT_PASSWORD=""
+UI_ADMIN_PASSWORD=""
+UI_AKRAINO_PASSWORD=""
+# Image data
+REGISTRY=akraino
+NAME=validation
+TAG_PRE=mariadb
+TAG_VER=latest
+MARIADB_HOST_PORT=3307
+
+for ARGUMENT in "$@"
+do
+    KEY=$(echo $ARGUMENT | cut -f1 -d=)
+    VALUE=$(echo $ARGUMENT | cut -f2 -d=)
+    case "$KEY" in
+            REGISTRY)              REGISTRY=${VALUE} ;;
+            NAME)    NAME=${VALUE} ;;
+            TAG_VER)    TAG_VER=${VALUE} ;;
+            TAG_PRE)    TAG_PRE=${VALUE} ;;
+            MARIADB_ROOT_PASSWORD)    MARIADB_ROOT_PASSWORD=${VALUE} ;;
+            CONTAINER_NAME)    CONTAINER_NAME=${VALUE} ;;
+            MARIADB_HOST_PORT)    MARIADB_HOST_PORT=${VALUE} ;;
+            UI_ADMIN_PASSWORD)    UI_ADMIN_PASSWORD=${VALUE} ;;
+            UI_AKRAINO_PASSWORD)    UI_AKRAINO_PASSWORD=${VALUE} ;;
+            *)
+    esac
+done
+
+if [ -z "$MARIADB_ROOT_PASSWORD" ]
+  then
+    echo "ERROR: You must specify the mariadb database root password"
+    exit 1
+fi
+
+if [ -z "$UI_ADMIN_PASSWORD" ]
+  then
+    echo "ERROR: You must specify the password of the UI admin user"
+    exit 1
+fi
+
+if [ -z "$UI_AKRAINO_PASSWORD" ]
+  then
+    echo "ERROR: You must specify the password for the UI akraino user"
+    exit 1
+fi
+
+IMAGE="$REGISTRY"/"$NAME":"$TAG_PRE"-"$TAG_VER"
+docker run --detach --name $CONTAINER_NAME --publish $MARIADB_HOST_PORT:3306 --volume $HOST_STORAGE_DIR:/var/lib/mysql -v "/$(pwd)/mariadb.conf:/etc/mysql/conf.d/my.cnf" -e MYSQL_ROOT_PASSWORD="$MARIADB_ROOT_PASSWORD" -e UI_ADMIN_PASSWORD="$UI_ADMIN_PASSWORD" -e UI_AKRAINO_PASSWORD="$UI_AKRAINO_PASSWORD" $IMAGE
+sleep 10
+docker exec $CONTAINER_NAME /bin/bash -c 'sed -i 's/admin_password/'"$UI_ADMIN_PASSWORD"'/g' /docker-entrypoint-initdb.d/EcompSdkDMLMySql_2_4_OS.sql ; sed -i 's/akraino_password/'"$UI_AKRAINO_PASSWORD"'/g' /docker-entrypoint-initdb.d/akraino-blueprint_validation_db.sql; continue=`ps aux | grep mysql` ; while [ -z "$continue" ]; do continue=`ps aux | grep mysql`; sleep 5; done ; sleep 10 ;'
similarity index 83%
rename from docker/postgresql/Dockerfile
rename to docker/mariadb/mariadb.conf
index 0259da2..0819156 100644 (file)
@@ -14,8 +14,6 @@
 # limitations under the License.                                             #
 ##############################################################################
 
-FROM postgres:9.6.9
+[mysqld]
+lower_case_table_names = 1
 
-COPY akraino-blueprint_validation_db.sql  /akraino-blueprint_validation_db.sql
-RUN chown -R postgres:postgres /var/lib/postgresql/data && \
-    chown -R postgres:postgres /akraino-blueprint_validation_db.sql
\ No newline at end of file
diff --git a/docker/postgresql/akraino-blueprint_validation_db.sql b/docker/postgresql/akraino-blueprint_validation_db.sql
deleted file mode 100644 (file)
index fb27ad5..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-
-drop sequence IF EXISTS akraino.seq_timeslot;
-drop sequence IF EXISTS akraino.seq_blueprint;
-drop sequence IF EXISTS akraino.seq_blueprint_instance;
-drop sequence IF EXISTS akraino.seq_submission;
-
-drop table IF EXISTS akraino.submission;
-drop table IF EXISTS akraino.blueprint_instance;
-drop table IF EXISTS akraino.blueprint;
-drop table IF EXISTS akraino.timeslot;
-
-CREATE SCHEMA IF NOT EXISTS akraino
- AUTHORIZATION postgres;
-
-CREATE TABLE akraino.timeslot
-(
-   timeslot_id bigint not NULL unique,
-   start_date_time text not NULL,
-   duration int not NULL,
-   lab text not NULL
-)
-WITH (
-  OIDS = FALSE
-)
-;
-ALTER TABLE akraino.timeslot
-  OWNER TO postgres;
-
-CREATE TABLE akraino.blueprint
-(
-   blueprint_id bigint not NULL,
-   blueprint_name text not NULL unique,
-   CONSTRAINT blueprint_id_pk PRIMARY KEY (blueprint_id)
-)
-WITH (
-  OIDS = FALSE
-)
-;
-ALTER TABLE akraino.blueprint
-  OWNER TO postgres;
-
-CREATE TABLE akraino.blueprint_instance
-(
-   blueprint_instance_id bigint not NULL,
-   blueprint_id bigint not NULL,
-   version text not NULL,
-   layer text not NULL,
-   layer_description text not NULL,
-   timeslot_id bigint not NULL unique,
-   CONSTRAINT blueprint_instance_id_pk PRIMARY KEY (blueprint_instance_id),
-   CONSTRAINT blueprint_id_fk FOREIGN KEY (blueprint_id)
-      REFERENCES akraino.blueprint (blueprint_id) MATCH SIMPLE
-      ON UPDATE NO ACTION ON DELETE NO ACTION,
-   CONSTRAINT timeslot_id_fk FOREIGN KEY (timeslot_id)
-      REFERENCES akraino.timeslot (timeslot_id) MATCH SIMPLE
-      ON UPDATE NO ACTION ON DELETE NO ACTION
-)
-WITH (
-  OIDS = FALSE
-)
-;
-ALTER TABLE akraino.blueprint_instance
-  OWNER TO postgres;
-
-CREATE TABLE akraino.submission
-(
-   submission_id bigint not NULL,
-   status text not NULL,
-   jenkins_queue_job_item_url text,
-   nexus_result_url text,
-   blueprint_instance_id bigint not NULL,
-   CONSTRAINT submission_id_pk PRIMARY KEY (submission_id),
-   CONSTRAINT blueprint_instance_id_fk FOREIGN KEY (blueprint_instance_id)
-      REFERENCES akraino.blueprint_instance (blueprint_instance_id) MATCH SIMPLE
-      ON UPDATE NO ACTION ON DELETE NO ACTION
-)
-WITH (
-  OIDS = FALSE
-)
-;
-ALTER TABLE akraino.submission
-  OWNER TO postgres;
-
-CREATE SEQUENCE akraino.seq_timeslot
-  START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE akraino.seq_blueprint
-  START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE akraino.seq_blueprint_instance
-  START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE akraino.seq_submission
-  START WITH 1 INCREMENT BY 1;
-
-insert into akraino.timeslot values(1, now(), 10, 0);  /* stands for AT&T lab */
-insert into akraino.timeslot values(2, now(), 1000, 0); /* stands for AT&T lab */
-insert into akraino.timeslot values(3, now(), 10000, 0); /* stands for AT&T lab */
-insert into akraino.timeslot values(4, now(), 100000, 0); /* stands for AT&T lab */
-insert into akraino.timeslot values(5, now(), 100000, 0); /* stands for AT&T lab */
-
-insert into akraino.blueprint (blueprint_id, blueprint_name) values(1, 'dummy');
-insert into akraino.blueprint (blueprint_id, blueprint_name) values(2, 'Unicycle');
-insert into akraino.blueprint (blueprint_id, blueprint_name) values(3, 'REC');
-
-insert into akraino.blueprint_instance (blueprint_instance_id, blueprint_id, version, layer, layer_description, timeslot_id) values(1, 1, '0.0.2-SNAPSHOT', 0, 'Dell Hardware', 1);  /* 0 Stands for hardware layer */
-insert into akraino.blueprint_instance (blueprint_instance_id, blueprint_id, version, layer, layer_description, timeslot_id) values(2, 2, '0.0.1-SNAPSHOT', 0, 'Dell Hardware', 2); /* 0 Stands for hardware layer */
-insert into akraino.blueprint_instance (blueprint_instance_id, blueprint_id, version, layer, layer_description, timeslot_id) values(3, 2, '0.0.7-SNAPSHOT', 1, 'CentOS Linux 7 (Core)', 3); /* 1 Stands for OS layer */
-insert into akraino.blueprint_instance (blueprint_instance_id, blueprint_id, version, layer, layer_description, timeslot_id) values(4, 3, '0.0.4-SNAPSHOT', 2, 'K8s with High Availability Ingress controller', 4); /* 2 Stands for k8s layer */
-insert into akraino.blueprint_instance (blueprint_instance_id, blueprint_id, version, layer, layer_description, timeslot_id) values(5, 3, '0.0.8-SNAPSHOT', 2, 'K8s with High Availability Ingress controller', 5); /* 2 Stands for k8s layer */
-
-commit;
diff --git a/docker/postgresql/deploy.sh b/docker/postgresql/deploy.sh
deleted file mode 100755 (executable)
index 60af84e..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2019 AT&T Intellectual Property.  All other 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.
-
-export DROOT=/var/lib
-CONTAINER_NAME="validation_postgresql"
-POSTGRES_HOST_PORT=6432
-REGISTRY=akraino
-NAME=validation
-TAG_PRE=`echo "${PWD##*/}"`
-TAG_VER=latest
-POSTGRES_PASSWORD=""
-HOST_ARCH=amd64
-
-# get the architecture of the host
-if [ "`uname -m`" = "aarch64" ]; then
-    HOST_ARCH=arm64
-fi
-
-for ARGUMENT in "$@"
-do
-    KEY=$(echo $ARGUMENT | cut -f1 -d=)
-    VALUE=$(echo $ARGUMENT | cut -f2 -d=)
-    case "$KEY" in
-            REGISTRY)              REGISTRY=${VALUE} ;;
-            NAME)    NAME=${VALUE} ;;
-            TAG_VER)    TAG_VER=${VALUE} ;;
-            POSTGRES_PASSWORD)    POSTGRES_PASSWORD=${VALUE} ;;
-            *)
-    esac
-done
-
-if [ -z "$POSTGRES_PASSWORD" ]
-  then
-    echo "ERROR: You must specify at least the postgreSQL database password"
-    exit 1
-fi
-
-IMAGE="$REGISTRY"/"$NAME":"$TAG_PRE"-"$HOST_ARCH"-"$TAG_VER"
-docker run --detach --name $CONTAINER_NAME --restart=always --publish $POSTGRES_HOST_PORT:5432 --volume $DROOT/postgres:/var/lib/postgresql/data --env POSTGRES_USER=admin --env POSTGRES_PASSWORD="$POSTGRES_PASSWORD" $IMAGE
-sleep 10
-docker exec $CONTAINER_NAME /bin/bash -c "psql -h localhost -p 5432 -U admin -f /akraino-blueprint_validation_db.sql"
index cec47f9..3f5c98a 100644 (file)
@@ -16,7 +16,7 @@
 
 FROM maven:3.6.1-jdk-11 as build
 RUN git clone https://gerrit.akraino.org/r/validation /opt/akraino/validation/repo
-RUN cd /opt/akraino/validation/repo/ui && mvn clean install
+RUN cd /opt/akraino/validation/repo/ui && mvn clean package
 
 FROM tomcat:8.5.37
 COPY  --from=build /opt/akraino/validation/repo/ui/target/AECBlueprintValidationUI.war /usr/local/tomcat/webapps
index fef0bed..6b77dd9 100755 (executable)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CONTAINER_NAME="validation-ui"
+# Container name
+CONTAINER_NAME="akraino-validation-ui"
+# Image data
 REGISTRY=akraino
 NAME=validation
-TAG_PRE=`echo "${PWD##*/}"`
+TAG_PRE=ui
 TAG_VER=latest
-HOST_ARCH=amd64
-postgres_db_user_pwd=""
-jenkins_url=""
-jenkins_user_name=""
-jenkins_user_pwd=""
-jenkins_job_name=""
-nexus_results_url=""
-proxy_ip=""
-proxy_port=""
-
-# get the architecture of the host
-if [ "`uname -m`" = "aarch64" ]
-  then
-    HOST_ARCH=arm64
-fi
+# Container input parameters
+MARIADB_ROOT_PASSWORD=""
+JENKINS_URL=""
+JENKINS_USERNAME=""
+JENKINS_USER_PASSWORD=""
+JENKINS_JOB_NAME=""
+DB_CONNECTION_URL=""
+NEXUS_PROXY=""
+JENKINS_PROXY=""
 
 for ARGUMENT in "$@"
 do
@@ -42,55 +38,57 @@ do
     case "$KEY" in
             REGISTRY)              REGISTRY=${VALUE} ;;
             NAME)    NAME=${VALUE} ;;
+            TAG_PRE)    TAG_PRE=${VALUE} ;;
             TAG_VER)    TAG_VER=${VALUE} ;;
-            postgres_db_user_pwd)    postgres_db_user_pwd=${VALUE} ;;
-            jenkins_url)    jenkins_url=${VALUE} ;;
-            jenkins_user_name)    jenkins_user_name=${VALUE} ;;
-            jenkins_user_pwd)    jenkins_user_pwd=${VALUE} ;;
-            jenkins_job_name)    jenkins_job_name=${VALUE} ;;
-            nexus_results_url)    nexus_results_url=${VALUE} ;;
-            proxy_ip)    proxy_ip=${VALUE} ;;
-            proxy_port)    proxy_port=${VALUE} ;;
+            MARIADB_ROOT_PASSWORD)    MARIADB_ROOT_PASSWORD=${VALUE} ;;
+            JENKINS_URL)    JENKINS_URL=${VALUE} ;;
+            JENKINS_USERNAME)    JENKINS_USERNAME=${VALUE} ;;
+            JENKINS_USER_PASSWORD)    JENKINS_USER_PASSWORD=${VALUE} ;;
+            JENKINS_JOB_NAME)    JENKINS_JOB_NAME=${VALUE} ;;
+            DB_CONNECTION_URL)    DB_CONNECTION_URL=${VALUE} ;;
+            CONTAINER_NAME)    CONTAINER_NAME=${VALUE} ;;
+            NEXUS_PROXY) NEXUS_PROXY=${VALUE} ;;
+            JENKINS_PROXY) JENKINS_PROXY=${VALUE} ;;
             *)
     esac
 done
 
-if [ -z "$postgres_db_user_pwd" ]
+if [ -z "$DB_CONNECTION_URL" ]
   then
-    echo "ERROR: You must specify the postgresql root user password"
+    echo "ERROR: You must specify the database connection url"
     exit 1
 fi
 
-if [ -z "$jenkins_url" ]
+if [ -z "$MARIADB_ROOT_PASSWORD" ]
   then
-    echo "ERROR: You must specify the Jenkins Url"
+    echo "ERROR: You must specify the mariadb root user password"
     exit 1
 fi
 
-if [ -z "$jenkins_user_name" ]
+if [ -z "$JENKINS_URL" ]
   then
-    echo "ERROR: You must specify the Jenkins username"
+    echo "ERROR: You must specify the Jenkins Url"
     exit 1
 fi
 
-if [ -z "$jenkins_user_pwd" ]
+if [ -z "$JENKINS_USERNAME" ]
   then
-    echo "ERROR: You must specify the Jenkins user password"
+    echo "ERROR: You must specify the Jenkins username"
     exit 1
 fi
 
-if [ -z "$jenkins_job_name" ]
+if [ -z "$JENKINS_USER_PASSWORD" ]
   then
-    echo "ERROR: You must specify the Jenkins job name"
+    echo "ERROR: You must specify the Jenkins user password"
     exit 1
 fi
 
-if [ -z "$nexus_results_url" ]
+if [ -z "$JENKINS_JOB_NAME" ]
   then
-    echo "ERROR: You must specify the Nexus Url"
+    echo "ERROR: You must specify the Jenkins job name"
     exit 1
 fi
 
-IMAGE="$REGISTRY"/"$NAME":"$TAG_PRE"-"$HOST_ARCH"-"$TAG_VER"
-docker run --name $CONTAINER_NAME --network="host" -it --rm -e postgres_db_user_pwd="$postgres_db_user_pwd" -e jenkins_url="$jenkins_url" -e jenkins_user_name="$jenkins_user_name" -e jenkins_user_pwd="$jenkins_user_pwd" -e jenkins_job_name="$jenkins_job_name" -e nexus_results_url="$nexus_results_url" -e proxy_ip="$proxy_ip" -e proxy_port="$proxy_port" $IMAGE
+IMAGE="$REGISTRY"/"$NAME":"$TAG_PRE"-"$TAG_VER"
+docker run --name $CONTAINER_NAME --network="host" -it --rm -e DB_CONNECTION_URL="$DB_CONNECTION_URL" -e MARIADB_ROOT_PASSWORD="$MARIADB_ROOT_PASSWORD" -e JENKINS_URL="$JENKINS_URL" -e JENKINS_USERNAME="$JENKINS_USERNAME" -e JENKINS_USER_PASSWORD="$JENKINS_USER_PASSWORD" -e JENKINS_JOB_NAME="$JENKINS_JOB_NAME" -e NEXUS_PROXY="$NEXUS_PROXY" -e JENKINS_PROXY="$JENKINS_PROXY" $IMAGE
 sleep 10
index fd87d9b..beb7192 100644 (file)
@@ -59,4 +59,39 @@ All notable changes to this project will be documented in this file.
 - Trailing spaces removed from all files.
 - README file is updated.
 
-### Removed
\ No newline at end of file
+### Removed
+
+## [0.1.0-SNAPSHOT] - 24 June 2019
+### Added
+- The following database initialization scripts of ONAP portal SDK project have been added (but modified in order to support the Akraino database) : epsdk-app-common/db-scripts/EcompSdkDDLMySql_2_4_Common.sql, epsdk-app-os/db-scripts/EcompSdkDDLMySql_2_4_OS.sql, epsdk-app-common/db-scripts/EcompSdkDMLMySql_2_4_Common.sql and epsdk-app-os/db-scripts/EcompSdkDMLMySql_2_4_OS.sql. The copyrights of these files have not been changed.
+- Proxies for connecting with Nexus and Jenkins are now supported.
+- io.fabric8/docker-maven-plugin can now be used for creating UI container for development purposes
+
+### Changed
+- Adaptation to ONAP portal SDK completed. Version 2.4.0 (Casablanca) has been used.
+- The new URL of the results stored in Nexus is now used.
+- Jenkins API is used by utilizing lower case for blueprint names and layers
+- README file is updated
+- Bug fixed when test suite is selected
+- Jenkins job name is dynamically defined in the Nexus result URL
+- Shell script input variables are now declared using capital letters
+
+### Removed
+
+## [0.1.0-SNAPSHOT] - 2 Jule 2019
+### Added
+- "All" blueprint layers is now supported.
+- Pop up windows inform UI user about the status of result retrieval
+- Blueprint version is now passed as a parameter to the Jenkins validation job
+- Database tables have been added, namely 'lab' and 'silo'
+
+### Changed
+- Start date time and duration are initialized to 'now' and null respectively, as they are not taken into account
+- As the blueprint, bluprint_instance_for_validation and timeslot tables must be initialized differently for each lab use case, the previous initialization data was extracted from the db-scripts/akraino-blueprint_validation_db_example.sql file and was placed inside a new file, namely db-scripts/examples/initialize_db_example.sql.
+- The table 'blueprint_instance' has been renamed to 'blueprint_instance_for_validation'
+- DB scripts are now copied to the /docker-entrypoint-initdb.d directory
+- Lab field has been removed from timeslot table and placed in the submission table.
+- README file has been updated
+- Definition of system architecture removed from the pom.xml
+
+### Removed
index 73ec832..afb7c16 100644 (file)
 Akraino Blueprint Validation UI
 ========
 
-This project contains the source code of the Akraino Blueprint Validation UI.
+Introduction
+------------
+
+This project contains the source code of the Akraino Blueprint Validation UI. It is based on the ONAP portal SDK, version 2.4.0. It should be noted that the copyright of all the files of the aforementioned project that were left intact, has not been changed.
 
 This UI consists of the front-end and back-end parts.
-The front-end part is based on HTML, CSS, and AngularJS technologies.
-The back-end part is based on Spring MVC and Apache Tomcat technologies.
+
+The front-end part is based on HTML, CSS, and AngularJS technologies. The back-end part is based on Spring MVC and Apache Tomcat technologies.
 
 Based on these instructions, a user can provide the prerequisites, compile the source code and deploy the UI.
 
+Scope
+-----
+
+The blueprint validation UI aims to be hosted by LF servers and will be exposed using public IP and domain names.
+
+It provides a user-friendly way for displaying blueprints validation test results. Based on these results, the status of a blueprint can be determined (mature, incubation state, etc.).
+
+In specific, the purpose of the UI is twofold:
+
+1) Support full control loop of producing results. In this mode, the UI must be connected with a Jenkins instance capable of running blueprint validation tests.
+   It will enable the user to define a blueprint for validation using its name, version, layer, desired lab and desired timeslot. This data constitutes a submission. It should be noted that the blueprint family is derived from the blueprint name.
+   Also, the UI will have the ability to track the lifecycle of a submission. A submission state can be one of the following: submitted, waiting, running and completed. The implementation vehicle for this action is the REST API of Jenkins.
+   Moreover, the UI must be connected with a mariadb instance and the Nexus server where the results are stored.
+   Then, it will be able to trigger the appropriate job in Jenkins and receive the corresponding results from Nexus.
+   Note that it makes no difference whether the Jenkins instance is the community one or a private one.
+2) Partial control of producing results. In this mode, the UI must be connected with a mariadb instance and the Nexus server where the results are stored.
+   Every blueprint owner is responsible of executing tests and storing results in Nexus using his/her own Jenkins instance. The UI only retrieves results from Nexus and displays them.
+
+Currently, the partial control loop is not supported.
+
+In both modes, user authentication, authorization and accounting (AAA) will be supported in order to control access to resources, enforce policies on these resources and audit their usage.
+
+Prerequisites:
+~~~~~~~~~~~~~~
+
+In order for the blueprint validation UI to be functional, the following items are taken for granted:
+
+- An appropriate mariadb instance is up and running (look at the Database subsection).
+  This prerequisite concerns both of the UI modes.
+
+- The available labs for blueprint validation execution are defined by the corresponding lab owners (look at the Database subsection). It is their responsibility to publish them. Currently, this data is statically stored in the blueprint validation UI mariadb database. In order for a lab owner to update them, he/her must update the corresponding table entries. This inconvenience will be handled in the future.
+  This prerequisite concerns only the full control loop mode.
+
+- The available timeslots for blueprint validation execution of every lab are defined by the corresponding lab owners (look at the Database subsection). It is their responsibility to publish them. Currently, this data is statically stored in the blueprint validation UI mariadb database. In order for a lab owner to update them, he/her must update the corresponding table entries. This inconvenience will be handled in the future.
+  This prerequisite concerns only the full control loop mode.
+
+- The data of the lab silos (i.e. which silo is used by a lab in order to store results in Nexus) is stored in the mariadb database (look at the Database subsection). It is the blueprint owner's responsibility to publish it. Currently, this data is statically stored in the blueprint validation UI mariadb database. In order for a blueprint owner to update it, he/her must update the corresponding table entries. This inconvenience will be handled in the future.
+  This prerequisite concerns only the full control loop mode.
+
+- The data of available blueprints (i.e. blueprint name) is stored in the mariadb database (look at the Database subsection). It is the blueprint owner's responsibility to publish it. Currently, this data is statically stored in the blueprint validation UI mariadb database. In order for a blueprint owner to update it, he/her must update the corresponding table entries. This inconvenience will be handled in the future.
+  This prerequisite concerns only the full control loop mode.
+
+- The data of an available blueprint instance for validation (i.e. version, layer and description of the layer) is stored in the mariadb database (look at the Database subsection). It is the blueprint owner's responsibility to publish it. Currently, this data is statically stored in the blueprint validation UI mariadb database. In order for a blueprint owner to update it, he/her must update the corresponding table entries. This inconvenience will be handled in the future.
+  This prerequisite concerns only the full control loop mode.
+
+- A Jenkins instance exists capable of executing blueprint validation tests on the specified lab and storing the results to Nexus server (look at the Jenkins configuration subsection).
+  This prerequisite concerns only the full control loop mode.
+
+- A Nexus server exists where all the blueprint validation results are stored (look at the Nexus subsection).
+  This prerequisite concerns both of the UI modes.
+
+- The whole installation and deployment of a blueprint and its corresponding blueprint family components (i.e. the appropriate edge cloud stack with its combination of infrastructure hardware components, OS, K8s, software, etc) are already performed in the appropriate lab.
+  Recall that multiple labs can be used for a specific blueprint validation. Also, it is the responsibility of the blueprint submitter to ensure that the edge validation and community CI labs can support comprehensive validation of the blueprint and cover all use case characteristics.
+  This prerequisite concerns both of the UI modes.
+
+Developer's guide
+-----------------
+
 Download the project
---------------------
+~~~~~~~~~~~~~~~~~~~~
 
 .. code-block:: console
 
     git clone "https://gerrit.akraino.org/r/validation"
 
 Prerequisites
----------------
+~~~~~~~~~~~~~
 
 - Database
 
-A PostgreSQL database instance is needed with the appropriate relations in order for the back-end system to store and retrieve data.
-Configure the postgreSQL root password in the variable POSTGRES_PASSWORD and execute the following commands in order to build and deploy this database container:
+A mariadb database instance is needed for both modes of the UI with the appropriate databases and tables in order for the back-end system to store and retrieve data.
+
+The pom.xml file supports the creation of an appropriate docker image for development purposes. The initialization scripts reside under the db-scripts directory.
+
+Also, a script has been developed, namely validation/docker/mariadb/deploy.sh which easily deploys the container. This script accepts the following as input parameters:
+
+CONTAINER_NAME, name of the container, default value is akraino-validation-mariadb
+MARIADB_ROOT_PASSWORD, the desired mariadb root user password, this variable is required
+UI_ADMIN_PASSWORD, the desired Blueprint Validation UI password for the admin user, this variable is required
+UI_AKRAINO_PASSWORD, the desired Blueprint Validation UI password for the akraino user, this variable is required
+REGISTRY, registry of the mariadb image, default value is akraino
+NAME, name of the mariadb image, default value is validation
+TAG_PRE, first part of the image version, default value is mariadb
+TAG_VER, last part of the image version, default value is latest
+MARIADB_HOST_PORT, port on which mariadb is exposed on host, default value is 3307
+
+Currently, two users are supported for the UI, namely admin (full privileges) and akraino (limited privileges). Their passwords must be defined in the database.
+
+Let's build and deploy the image using only the required parameters.
+
+Configure the mariadb root user password (currently the UI connects to the database using root privileges), the UI admin password and the UI akraino password in the appropriate variables and execute the following commands in order to build and deploy this database container:
+
+.. code-block:: console
+
+    cd validation/ui
+    mvn docker:build
+    cd ../docker/mariadb
+    ./deploy.sh TAG_PRE=dev-mariadb MARIADB_ROOT_PASSWORD=<root user password> UI_ADMIN_PASSWORD=<UI admin user password> UI_AKRAINO_PASSWORD=<UI akraino user password>
+    mysql -p<MARIADB_ROOT_PASSWORD> -uroot -h <IP of the mariadb container> < ../../ui/db-scripts/examples/initialize_db_example.sql
+
+In order to retrieve the IP of the mariadb container, execute the following command:
 
 .. code-block:: console
 
-    cd validation/docker/postgresql
-    make build
-    ./deploy.sh POSTGRES_PASSWORD=password
+    docker inspect <name of the mariadb container>
+
+It should be noted that, currently, both images (UI and mariadb) are built using the mvn docker:build command.
+
+Furthermore, the TAG_PRE variable should be defined as the default value is 'mariadb' (note that the 'dev-mariadb' is used for development purposes - look at pom.xml file).
+
+If you want to re-deploy the database, you must first delete the container and the directory on the host machine where data are stored. To this end, execute the following command:
+
+.. code-block:: console
+
+    docker stop <name of the mariadb container> ; docker rm <name of the mariadb container> ; sudo rm -rf /var/lib/mariadb
+
+In the context of the full control loop mode, the following tables must be initialized with appropriate data:
+
+- lab (here every lab owner should store the name of the lab)
+- timeslot (here every lab owner should register the available timeslots that can be used for blueprint validation test execution)
+- silo (here every lab owner should register the silo which is used for storing results in Nexus, for example for AT&T lab the value is 'att-blu-val')
+- blueprint (here every blueprint owner should register the name of the blueprint)
+- blueprint_instance_for_validation (here every blueprint owner should register the blueprint instances for validation, i.e. version, layer and description of a layer)
+
+The following file can be used for initializing the aforementioned data (as we did in the above example using the 'mysql -p<MARIADB_ROOT_PASSWORD> -uroot -h <IP of the mariadb container> < ../../ui/db-scripts/examples/initialize_db_example.sql' command):
+
+    db-scripts/examples/initialize_db_example.sql
 
-Below, some data that is initialized in the aforementioned database is illustrated (note that this data is used mainly for testing purposes):
+Some of this data is illustrated below (refer to 'org.akraino.validation.ui.data' package for more info regarding available values):
 
 .. code-block:: console
 
+    Lab
+    id:1, lab:0 (0 stands for AT&T)
+
     Timeslots:
-    id:1 , start date and time: now() (i.e. the time of the postgreSQL container deployment), duration: 10 (sec), lab: 0 (i.e. AT&T)
-    id:2 , start date and time: now() (i.e. the time of the postgreSQL container deployment), duration: 1000 (sec), lab: 0 (i.e. AT&T)
+    id:1 , start date and time: 'now', duration: null, lab: 1
+
+    Silo
+    id:1, silo: 'att-blu-val', lab: 1
 
     Blueprints:
-    id: 1 , name : 'dummy'
-    id: 2 , name : 'Unicycle'
+    id: 3 , name : 'REC'
 
     Blueprint Instances:
-    id: 1, blueprint_id: 1 (i.e. dummy), version: "0.0.2-SNAPSHOT", layer: 0 (i.e. Hardware), layer_description: "Dell Hardware", timeslot id: 1
-    id: 2, blueprint_id: 2 (i.e. Unicycle), version: "0.0.1-SNAPSHOT", layer: 0 (i.e. Hardware), layer_description: "Dell Hardware", timeslot id: 2
-
-For more information about this data, please refer to the file:
+    id: 2, blueprint_id: 3 (i.e. REC), version: "latest", layer: 0 (i.e. Hardware), layer_description: "AT&T Hardware"
 
-    validation/docker/postgresql/akraino-blueprint_validation_db.sql
+It should be noted that currently the start date and time and the duration of the timeslot are not taken into account by the UI (see limitation section). Therefore, a user should define 'now' and null respectively for their content.
 
 Based on this data, the UI enables the user to select an appropriate blueprint instance for validation.
 
-Currently, this data cannot be retrieved dynamically by the UI (see limitations subsection).
+Currently, this data cannot be retrieved dynamically by the UI (see limitations subsection). For this reason, in cases of new data, a user should define new entries in this database.
 
-For this reason, in cases of new blueprint data, a user should define new entries in this database.
+For example, if a user wants to define a new lab with the following data:
+
+    lab: Community
+
+the following file should be created:
+
+name: dbscript
+content:
+    SET FOREIGN_KEY_CHECKS=1;
+    use akraino;
+    insert into lab values(2, 2);
+
+2 stands for community lab. Refer to 'org.akraino.validation.ui.data' package for more info.
+
+Then, the following command should be executed:
+
+.. code-block:: console
+
+    mysql -p<MARIADB_ROOT_PASSWORD> -uroot -h <IP of the mariadb container> < ./dbscript.sql
 
 For example, if a user wants to define a new timeslot with the following data:
 
-    start date and time:now, duration: 123 in secs, lab: Community
+    start date and time:'now', duration: 0, lab: AT&T
+
+the following file should be created:
+
+name: dbscript
+content:
+    SET FOREIGN_KEY_CHECKS=1;
+    use akraino;
+    insert into timeslot values(2, 'now', null, 1);
+
+1 is the id of the AT&T lab.
+
+Then, the following command should be executed:
+
+.. code-block:: console
+
+    mysql -p<MARIADB_ROOT_PASSWORD> -uroot -h <IP of the mariadb container> < ./dbscript.sql
+
+For example, if a user wants to define a new silo with the following data:
+
+    silo: 'community-blu-val', lab: AT&T
 
 the following file should be created:
 
 name: dbscript
 content:
-    insert into akraino.timeslot values(5, now(), 123, 2);
+    SET FOREIGN_KEY_CHECKS=1;
+    use akraino;
+    insert into silo values(2, 'community-blu-val', 2);
+
+2 is the id of the community lab.
 
 Then, the following command should be executed:
 
 .. code-block:: console
 
-    psql -h <IP of the postgreSQL container> -p 6432 -U admin -f ./dbscript
+    mysql -p<MARIADB_ROOT_PASSWORD> -uroot -h <IP of the mariadb container> < ./dbscript.sql
 
 Furthermore, if a user wants to define a new blueprint, namely "newBlueprint" and a new instance of this blueprint with the following data:
 
-    version: "0.0.1-SNAPSHOT", layer: 2 (i.e. K8s), layer_description: "K8s with High Availability Ingress controller", timeslot id: 5 (i.e. the new timeslot)
+    version: "latest", layer: 2 (i.e. K8s), layer_description: "K8s with High Availability Ingress controller"
 
 the following file should be created:
 
 name: dbscript
 content:
-    insert into akraino.blueprint (blueprint_id, blueprint_name) values(4, 'newBlueprint');
-    insert into akraino.blueprint_instance (blueprint_instance_id, blueprint_id, version, layer, layer_description, timeslot_id) values(6, 4, '0.0.1-SNAPSHOT', 2, 'K8s with High Availability Ingress controller', 5);
+    SET FOREIGN_KEY_CHECKS=1;
+    use akraino;
+    insert into blueprint (blueprint_id, blueprint_name) values(4, 'newBlueprint');
+    insert into blueprint_instance (blueprint_instance_id, blueprint_id, version, layer, layer_description) values(6, 4, 'latest', 2, 'K8s with High Availability Ingress controller');
 
 Then, the following command should be executed:
 
 .. code-block:: console
 
-    psql -h <IP of the postgreSQL container> -p 6432 -U admin -f ./dbscript
+    mysql -p<MARIADB_ROOT_PASSWORD> -uroot -h <IP of the mariadb container> < ./dbscript.sql
 
 The UI will automatically retrieve this new data and display it to the user.
 
 - Jenkins Configuration
 
-The Blueprint validation UI will trigger job executions in a Jenkins instance.
+Recall that for full control loop, a Jenkins instance is needed capable of executing blueprint validation tests to the specified lab. The Blueprint validation UI will trigger job executions in that instance.
+
+It should be noted that it is not the UI responsibility to deploy a Jenkins instance.
 
-This instance must have the following option enabled: "Manage Jenkins -> Configure Global Security -> Prevent Cross Site Request Forgery exploits".
+Furthermore, this instance must have the following option enabled: "Manage Jenkins -> Configure Global Security -> Prevent Cross Site Request Forgery exploits".
 
-Also, currently corresponding Jenkins job should accept the following as input parameters: "SUBMISSION_ID", "BLUEPRINT", "LAYER" and "UI_IP".
-The "SUBMISSION_ID" and "UI_IP" parameters (i.e. IP address of the UI host machine-this is needed by the Jenkins instance in order to send back Job completion notification) are created and provided by the backend part of the UI.
-The "BLUEPRINT" and "LAYER" parameters are configured by the UI user.
+Also, currently, the corresponding Jenkins job should accept the following as input parameters: "SUBMISSION_ID", "BLUEPRINT", "VERSION", "LAYER" and "UI_IP".
+The "SUBMISSION_ID" and "UI_IP" parameters (i.e. IP address of the UI host machine-this is needed by the Jenkins instance in order to send back Job completion notification) are created and provided by the back-end part of the UI.
+The "BLUEPRINT", "VERSION" and "LAYER" parameters are configured by the UI user.
 
-Moreover, as the Jenkins notification plugin (https://wiki.jenkins.io/display/JENKINS/Notification+Plugin) seems to ignore proxy settings, the corresponding Jenkins job must be configured to execute the following command at the end (Post-build Actions)
+Moreover, as the Jenkins notification plugin (https://wiki.jenkins.io/display/JENKINS/Notification+Plugin) seems to ignore proxy settings, the corresponding Jenkins job must be configured to execute the following commands at the end (Post-build Actions)
 
 .. code-block:: console
 
-    curl -v -H "Content-Type: application/json" -X POST --insecure --silent http://$UI_IP:8080/AECBlueprintValidationUI/api/jenkinsJobNotification/ --data '{"submissionId": "'"$SUBMISSION_ID"'" , "name":"'"$JOB_NAME"'", "buildNumber":"'"$BUILD_NUMBER"'"}'
+    cookie=`curl -v -H "Content-Type: application/x-www-form-urlencoded" -X POST --insecure --silent http://$UI_IP:8080/AECBlueprintValidationUI/login_external -d "loginId=akraino&password=akraino" 2>&1 | grep "Set-Cookie: " | awk -F ':' '{print $2}'`
+    curl -v --cookie $cookie -H "Content-Type: application/json" -X POST --insecure --silent http://$UI_IP:8080/AECBlueprintValidationUI/api/jenkinsJobNotification/ --data '{"submissionId": "'"$SUBMISSION_ID"'" , "name":"'"$JOB_NAME"'", "buildNumber":"'"$BUILD_NUMBER"'"}'
 
-Finally, the Jenkins instance must be accessible from the UI host without using system proxy.
+It should be noted that the credentials user=akraino and password=akraino defined in the above commands should be replaced with the credentials of a real UI user. Recall that these credentials are defined in the database.
 
 - Nexus server
 
-All the blueprint validation results are stored in Nexus server.
+All the blueprint validation results are stored in Nexus server for both modes of the UI.
+
+It should be noted that it is not the UI responsibility to deploy a Nexus server.
+
+In the context of the full control loop, these results must be available in the following url:
 
-These results must be available in the following url:
+    https://nexus.akraino.org/content/sites/logs/<lab_silo>/job/<Jenkins Job name>/<Jenkins job number>/results/<layer>/<name_of_the_test_suite>.
 
-    https://nexus.akraino.org/content/sites/logs/"lab"-blu-val/job/validation/"Jenkins job number"/results/"name_of_the_test_suite".
+where <lab_silo> is the silo used by a lab for storing results in Nexus (for example 'att-blu-val'), <Jenkins job name> is the Jenkins job name that is triggered by the UI, <Jenkins job number> is the number of the Jenkins job that produced this result, <layer> is the blueprint layer and <name_of_the_test_suite> is the name of the corresponding test suite.
 
-where "lab" is the name of the lab (for example 'att'), "Jenkins job number" is the number of the Jenkins job that produced this result, and "name_of_the_test_suite" is the name of the test suite.
-If multiple test suites must run, multiple directories should be created.
+If multiple test suites are available, multiple test suite names should be created.
 
-Moreover, the results should be stored in the 'output.xml' file using the following format:
+Moreover, the results should be stored in the 'output.xml' file and placed in the aforementioned URL using the following format:
 
 TBD
 
-Finally, the Nexus server must be accessible from the UI (with or without using system proxy).
+In the context of partial control, the results must be available in the following url:
 
+TBD
 
 Compiling
----------
+~~~~~~~~~
 
 .. code-block:: console
 
     cd validation/ui
-    mvn clean install
+    mvn clean package
 
 Deploying
----------
-
-In the context of deploying, the following data is needed:
-
-- The postgres root user password
+~~~~~~~~~
+
+The pom.xml file supports the building of an appropriate container image using the produced war file. Also, a script has been developed, namely validation/docker/ui/deploy.sh which easily deploys the container.
+
+This script accepts the following as input parameters:
+
+CONTAINER_NAME, name of the contaner, default value is akraino-validation-ui
+DB_CONNECTION_URL, the URL connection with the akraino database of the maridb instance, this variable is required
+MARIADB_ROOT_PASSWORD, mariadb root user password, this variable is required
+REGISTRY, registry of the mariadb image, default value is akraino
+NAME, name of the mariadb image, default value is validation
+TAG_PRE, first part of the image version, default value is ui
+TAG_VER, last part of the image version, default value is latest
+JENKINS_URL, the URL of the Jenkins instance, this variable is required
+JENKINS_USERNAME, the Jenkins user name, this variable is required
+JENKINS_USER_PASSWORD, the Jenkins user password, this variable is required
+JENKINS_JOB_NAME, the name of Jenkins job capable of executing the blueprint validation tests, this variable is required
+NEXUS_PROXY, the proxy needed in order for the Nexus server to be reachable, default value is none
+JENKINS_PROXY, the proxy needed in order for the Jenkins server to be reachable, default value is none
+
+Let's build the image using only the required parameters. To this end, the following data is needed:
+
+- The mariadb root user password (look at the Database subsection)
+- The URL for connecting to the akraino database of the mariadb
 - The Jenkins url
 - The Jenkins username and password
 - The name of Jenkins Job
-- The Url of the Nexus results
-- The host system's proxy ip and port
 
-These variables must be configured as content of the deploy script input parameters. Execute the following commands in order to build and deploy the UI container:
+Execute the following commands in order to build and deploy the UI container:
 
 .. code-block:: console
 
-    cd validation/docker/ui
-    make build
-    ./deploy.sh postgres_db_user_pwd=password jenkins_url=http://192.168.2.2:8080 jenkins_user_name=name jenkins_user_pwd=jenkins_pwd jenkins_job_name=job1 nexus_results_url=https://nexus.akraino.org/content/sites/logs proxy_ip=172.28.40.9 proxy_port=3128
+    cd validation/ui
+    mvn docker:build
+    cd ../docker/ui
+    ./deploy.sh TAG_PRE=dev-ui DB_CONNECTION_URL=<Url in order to connect to akraino database of the mariadb> MARIADB_ROOT_PASSWORD=<mariadb root password> JENKINS_URL=<http://jenkinsIP:port> JENKINS_USERNAME=<Jenkins user> JENKINS_USER_PASSWORD=<Jenkins password> JENKINS_JOB_NAME=<Jenkins job name>
+
+The content of the DB_CONNECTION_URL can be for example 172.17.0.3:3306/akraino (i.e. IP and port of the database container plus '/akraino').
+
+Furthermore, the TAG_PRE variable should be defined as the default value is 'ui' (note that the 'dev-ui' is used for development purposes - look at pom.xml file).
 
 If no proxy exists, just do not define proxy ip and port variables.
 
@@ -162,16 +346,20 @@ The UI should be available in the following url:
 
     http://localhost:8080/AECBlueprintValidationUI
 
+Note that the deployment uses the network host mode, so the 8080 must be available on the host.
+
+User's guide
+-----------------
+TBD
+
 Limitations
 -----------
-
+- The partial loop mode is not currently supported.
 - The UI has been tested using Chrome and Firefox browsers.
-- The UI is not connected to any LDAP server. Currently, any user can login.
-- The UI and postgreSQL containers must be deployed on the same server.
-- The back-end part of the UI does not take into account the configured timeslot. It immediately triggers the corresponding Jenkins Job.
+- The back-end part of the UI does not take into account the start date and time and duration of the configured timeslot. It immediately triggers the corresponding Jenkins Job.
 - Results data manipulation (filtering, graphical representation, indexing in time order, etc) is not supported.
 - Only the following labs are supported: AT&T, Ericsson, Community and Arm.
 - Only the following tabs are functional: 'Committed Submissions', 'Blueprint Validation Results -> Get by submission id'.
-- The UI configures only the "BLUEPRINT" and "LAYER" input parameters of the Jenkins job.
-- The available blueprints and timeslots must be manually configured in the PostgreSQL database.
-- The Jenkins instance must be accessible from the UI host without using system proxy.
\ No newline at end of file
+- The UI configures only the "BLUEPRINT", "VERSION", "LAYER", "SUBMISSION_ID" and "UI_IP" input parameters of the Jenkins job.
+- The silos, labs, and the available blueprints and timeslots must be manually configured in the mariadb database.
+- Logout action is not currently supported.
\ No newline at end of file
diff --git a/ui/db-scripts/EcompSdkDDLMySql_2_4_Common.sql b/ui/db-scripts/EcompSdkDDLMySql_2_4_Common.sql
new file mode 100644 (file)
index 0000000..bdfb647
--- /dev/null
@@ -0,0 +1,1392 @@
+-- ---------------------------------------------------------------------------------------------------------------
+-- This script creates tables in the COMMON version 2.1.0 of the ONAP SDK application database.
+-- Additional DDL scripts may be required!
+--
+-- Note to database admin: set the MySQL system variable called lower_case_table_names to 1
+-- It can be set 3 different ways:
+--   command-line options (Cmd-line),
+--   options valid in configuration files (Option file), or
+--   server system variables (System Var).
+--
+-- When set to 1 table names are stored in lowercase on disk and comparisons are not case sensitive.
+--
+-- MySql/MariaDB Version compatibility information
+--
+-- bash-4.2$ mysql --version  – cluster version
+-- mysql  Ver 15.1 Distrib 10.1.17-MariaDB, for Linux (x86_64) using readline 5.1
+--
+-- All versions newer or older than these DO NOT necessarily mean they are compatible.
+-- ---------------------------------------------------------------------------------------------------------------
+
+SET FOREIGN_KEY_CHECKS=1;
+
+CREATE DATABASE IF NOT EXISTS akraino;
+
+USE akraino;
+
+-- ---------- create table SECTION
+--
+-- NAME: CR_FAVORITE_REPORTS; TYPE: TABLE
+--
+create table cr_favorite_reports (
+    USER_ID INTEGER NOT NULL,
+    REP_ID INTEGER NOT NULL
+);
+
+--
+-- NAME: CR_FILEHIST_LOG; TYPE: TABLE
+--
+create table cr_filehist_log (
+    SCHEDULE_ID NUMERIC(11,0) NOT NULL,
+    URL CHARACTER VARYING(4000),
+    NOTES CHARACTER VARYING(3500),
+    RUN_TIME TIMESTAMP
+);
+
+--
+-- NAME: CR_FOLDER; TYPE: TABLE
+--
+create table cr_folder (
+    FOLDER_ID INTEGER NOT NULL,
+    FOLDER_NAME CHARACTER VARYING(50) NOT NULL,
+    DESCR CHARACTER VARYING(500),
+    CREATE_ID INTEGER NOT NULL,
+    CREATE_DATE TIMESTAMP NOT NULL,
+    PARENT_FOLDER_ID INTEGER,
+    PUBLIC_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL
+);
+
+--
+-- NAME: CR_FOLDER_ACCESS; TYPE: TABLE
+--
+create table cr_folder_access (
+    FOLDER_ACCESS_ID NUMERIC(11,0) NOT NULL,
+    FOLDER_ID NUMERIC(11,0) NOT NULL,
+    ORDER_NO NUMERIC(11,0) NOT NULL,
+    ROLE_ID NUMERIC(11,0),
+    USER_ID NUMERIC(11,0),
+    READ_ONLY_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL
+);
+
+--
+-- NAME: CR_HIST_USER_MAP; TYPE: TABLE
+--
+create table cr_hist_user_map (
+    HIST_ID INT(11) NOT NULL,
+    USER_ID INT(11) NOT NULL
+);
+
+--
+-- NAME: CR_LU_FILE_TYPE; TYPE: TABLE
+--
+create table cr_lu_file_type (
+    LOOKUP_ID NUMERIC(2,0) NOT NULL,
+    LOOKUP_DESCR CHARACTER VARYING(255) NOT NULL,
+    ACTIVE_YN CHARACTER(1) DEFAULT 'Y',
+    ERROR_CODE NUMERIC(11,0)
+);
+
+--
+-- NAME: CR_RAPTOR_ACTION_IMG; TYPE: TABLE
+--
+create table cr_raptor_action_img (
+    IMAGE_ID CHARACTER VARYING(100) NOT NULL,
+    IMAGE_LOC CHARACTER VARYING(400)
+);
+
+--
+-- NAME: CR_RAPTOR_PDF_IMG; TYPE: TABLE
+--
+create table cr_raptor_pdf_img (
+    IMAGE_ID CHARACTER VARYING(100) NOT NULL,
+    IMAGE_LOC CHARACTER VARYING(400)
+);
+
+--
+-- NAME: CR_REMOTE_SCHEMA_INFO; TYPE: TABLE
+--
+create table cr_remote_schema_info (
+    SCHEMA_PREFIX CHARACTER VARYING(5) NOT NULL,
+    SCHEMA_DESC CHARACTER VARYING(75) NOT NULL,
+    DATASOURCE_TYPE CHARACTER VARYING(100)
+);
+
+--
+-- NAME: CR_REPORT; TYPE: TABLE
+--
+create table cr_report (
+    REP_ID NUMERIC(11,0) NOT NULL,
+    TITLE CHARACTER VARYING(100) NOT NULL,
+    DESCR CHARACTER VARYING(255),
+    PUBLIC_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL,
+    REPORT_XML TEXT,
+    CREATE_ID NUMERIC(11,0),
+    CREATE_DATE TIMESTAMP default now(),
+    MAINT_ID NUMERIC(11,0),
+    MAINT_DATE TIMESTAMP DEFAULT NOW(),
+    MENU_ID CHARACTER VARYING(500),
+    MENU_APPROVED_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL,
+    OWNER_ID NUMERIC(11,0),
+    FOLDER_ID INTEGER DEFAULT 0,
+    DASHBOARD_TYPE_YN CHARACTER VARYING(1) DEFAULT 'N',
+    DASHBOARD_YN CHARACTER VARYING(1) DEFAULT 'N'
+);
+
+--
+-- NAME: CR_REPORT_ACCESS; TYPE: TABLE
+--
+create table cr_report_access (
+    REP_ID NUMERIC(11,0) NOT NULL,
+    ORDER_NO NUMERIC(11,0) NOT NULL,
+    ROLE_ID NUMERIC(11,0),
+    USER_ID NUMERIC(11,0),
+    READ_ONLY_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL
+);
+
+--
+-- NAME: CR_REPORT_DWNLD_LOG; TYPE: TABLE
+--
+create table cr_report_dwnld_log (
+    USER_ID NUMERIC(11,0) NOT NULL,
+    REP_ID INTEGER NOT NULL,
+    FILE_NAME CHARACTER VARYING(100) NOT NULL,
+    DWNLD_START_TIME TIMESTAMP DEFAULT NOW() NOT NULL,
+    RECORD_READY_TIME TIMESTAMP DEFAULT NOW(),
+    FILTER_PARAMS CHARACTER VARYING(2000)
+);
+
+--
+-- NAME: CR_REPORT_EMAIL_SENT_LOG; TYPE: TABLE
+--
+create table cr_report_email_sent_log (
+    LOG_ID INTEGER NOT NULL,
+    SCHEDULE_ID NUMERIC(11,0),
+    GEN_KEY CHARACTER VARYING(25) NOT NULL,
+    REP_ID NUMERIC(11,0) NOT NULL,
+    USER_ID NUMERIC(11,0),
+    SENT_DATE TIMESTAMP DEFAULT NOW(),
+    ACCESS_FLAG CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL,
+    TOUCH_DATE TIMESTAMP DEFAULT NOW()
+);
+
+--
+-- NAME: CR_REPORT_FILE_HISTORY; TYPE: TABLE
+--
+create table cr_report_file_history (
+    HIST_ID INT(11) NOT NULL,
+    SCHED_USER_ID NUMERIC(11,0) NOT NULL,
+    SCHEDULE_ID NUMERIC(11,0) NOT NULL,
+    USER_ID NUMERIC(11,0) NOT NULL,
+    REP_ID NUMERIC(11,0),
+    RUN_DATE TIMESTAMP,
+    RECURRENCE CHARACTER VARYING(50),
+    FILE_TYPE_ID NUMERIC(2,0),
+    FILE_NAME CHARACTER VARYING(80),
+    FILE_BLOB BLOB,
+    FILE_SIZE NUMERIC(11,0),
+    RAPTOR_URL CHARACTER VARYING(4000),
+    ERROR_YN CHARACTER(1) DEFAULT 'N',
+    ERROR_CODE NUMERIC(11,0),
+    DELETED_YN CHARACTER(1) DEFAULT 'N',
+    DELETED_BY NUMERIC(38,0)
+);
+
+--
+-- NAME: CR_REPORT_LOG; TYPE: TABLE
+--
+create table cr_report_log (
+    REP_ID NUMERIC(11,0) NOT NULL,
+    LOG_TIME TIMESTAMP NOT NULL,
+    USER_ID NUMERIC(11,0) NOT NULL,
+    ACTION CHARACTER VARYING(2000) NOT NULL,
+    ACTION_VALUE CHARACTER VARYING(50),
+    FORM_FIELDS CHARACTER VARYING(4000)
+);
+
+--
+-- NAME: CR_REPORT_SCHEDULE; TYPE: TABLE
+--
+create table cr_report_schedule (
+    SCHEDULE_ID NUMERIC(11,0) NOT NULL,
+    SCHED_USER_ID NUMERIC(11,0) NOT NULL,
+    REP_ID NUMERIC(11,0) NOT NULL,
+    ENABLED_YN CHARACTER VARYING(1) NOT NULL,
+    START_DATE TIMESTAMP DEFAULT NOW(),
+    END_DATE TIMESTAMP DEFAULT NOW(),
+    RUN_DATE TIMESTAMP DEFAULT NOW(),
+    RECURRENCE CHARACTER VARYING(50),
+    CONDITIONAL_YN CHARACTER VARYING(1) NOT NULL,
+    CONDITION_SQL CHARACTER VARYING(4000),
+    NOTIFY_TYPE INTEGER DEFAULT 0,
+    MAX_ROW INTEGER DEFAULT 1000,
+    INITIAL_FORMFIELDS CHARACTER VARYING(3500),
+    PROCESSED_FORMFIELDS CHARACTER VARYING(3500),
+    FORMFIELDS CHARACTER VARYING(3500),
+    CONDITION_LARGE_SQL TEXT,
+    ENCRYPT_YN CHARACTER(1) DEFAULT 'N',
+    ATTACHMENT_YN CHARACTER(1) DEFAULT 'Y'
+);
+
+--
+-- NAME: CR_REPORT_SCHEDULE_USERS; TYPE: TABLE
+--
+create table cr_report_schedule_users (
+    SCHEDULE_ID NUMERIC(11,0) NOT NULL,
+    REP_ID NUMERIC(11,0) NOT NULL,
+    USER_ID NUMERIC(11,0) NOT NULL,
+    ROLE_ID NUMERIC(11,0),
+    ORDER_NO NUMERIC(11,0) NOT NULL
+);
+
+--
+-- NAME: CR_REPORT_TEMPLATE_MAP; TYPE: TABLE
+--
+create table cr_report_template_map (
+    REPORT_ID INTEGER NOT NULL,
+    TEMPLATE_FILE CHARACTER VARYING(200)
+);
+
+--
+-- NAME: CR_SCHEDULE_ACTIVITY_LOG; TYPE: TABLE
+--
+create table cr_schedule_activity_log (
+    SCHEDULE_ID NUMERIC(11,0) NOT NULL,
+    URL CHARACTER VARYING(4000),
+    NOTES CHARACTER VARYING(2000),
+    RUN_TIME TIMESTAMP
+);
+
+--
+-- NAME: CR_TABLE_JOIN; TYPE: TABLE
+--
+create table cr_table_join (
+    SRC_TABLE_NAME CHARACTER VARYING(30) NOT NULL,
+    DEST_TABLE_NAME CHARACTER VARYING(30) NOT NULL,
+    JOIN_EXPR CHARACTER VARYING(500) NOT NULL
+);
+
+--
+-- NAME: CR_TABLE_ROLE; TYPE: TABLE
+--
+create table cr_table_role (
+    TABLE_NAME CHARACTER VARYING(30) NOT NULL,
+    ROLE_ID NUMERIC(11,0) NOT NULL
+);
+
+--
+-- NAME: CR_TABLE_SOURCE; TYPE: TABLE
+--
+create table cr_table_source (
+    TABLE_NAME CHARACTER VARYING(30) NOT NULL,
+    DISPLAY_NAME CHARACTER VARYING(30) NOT NULL,
+    PK_FIELDS CHARACTER VARYING(200),
+    WEB_VIEW_ACTION CHARACTER VARYING(50),
+    LARGE_DATA_SOURCE_YN CHARACTER VARYING(1) DEFAULT 'N' NOT NULL,
+    FILTER_SQL CHARACTER VARYING(4000),
+    SOURCE_DB CHARACTER VARYING(50)
+);
+
+--
+-- NAME: FN_LU_TIMEZONE; TYPE: TABLE
+--
+create table fn_lu_timezone (
+    TIMEZONE_ID INT(11) NOT NULL,
+    TIMEZONE_NAME CHARACTER VARYING(100) NOT NULL,
+    TIMEZONE_VALUE CHARACTER VARYING(100) NOT NULL
+);
+
+create table fn_user (
+    USER_ID INT(11) NOT NULL PRIMARY KEY  AUTO_INCREMENT,
+    ORG_ID INT(11),
+    MANAGER_ID INT(11),
+    FIRST_NAME CHARACTER VARYING(50),
+    MIDDLE_NAME CHARACTER VARYING(50),
+    LAST_NAME CHARACTER VARYING(50),
+    PHONE CHARACTER VARYING(25),
+    FAX CHARACTER VARYING(25),
+    CELLULAR CHARACTER VARYING(25),
+    EMAIL CHARACTER VARYING(50),
+    ADDRESS_ID NUMERIC(11,0),
+    ALERT_METHOD_CD CHARACTER VARYING(10),
+    HRID CHARACTER VARYING(20),
+    ORG_USER_ID CHARACTER VARYING(20),
+    ORG_CODE CHARACTER VARYING(30),
+    LOGIN_ID CHARACTER VARYING(25),
+    LOGIN_PWD CHARACTER VARYING(25),
+    LAST_LOGIN_DATE TIMESTAMP,
+    ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL,
+    CREATED_ID INT(11),
+    CREATED_DATE TIMESTAMP DEFAULT NOW(),
+    MODIFIED_ID INT(11),
+    MODIFIED_DATE TIMESTAMP default now(),
+    IS_INTERNAL_YN CHARACTER(1) DEFAULT 'N' NOT NULL,
+    ADDRESS_LINE_1 CHARACTER VARYING(100),
+    ADDRESS_LINE_2 CHARACTER VARYING(100),
+    CITY CHARACTER VARYING(50),
+    STATE_CD CHARACTER VARYING(3),
+    ZIP_CODE CHARACTER VARYING(11),
+    COUNTRY_CD CHARACTER VARYING(3),
+    LOCATION_CLLI CHARACTER VARYING(8),
+    ORG_MANAGER_USERID CHARACTER VARYING(20),
+    COMPANY CHARACTER VARYING(100),
+    DEPARTMENT_NAME CHARACTER VARYING(100),
+    JOB_TITLE CHARACTER VARYING(100),
+    TIMEZONE INT(11),
+    DEPARTMENT CHARACTER VARYING(25),
+    BUSINESS_UNIT CHARACTER VARYING(25),
+    BUSINESS_UNIT_NAME CHARACTER VARYING(100),
+    COST_CENTER CHARACTER VARYING(25),
+    FIN_LOC_CODE CHARACTER VARYING(10),
+    SILO_STATUS CHARACTER VARYING(10)
+);
+
+--
+-- NAME: FN_ROLE; TYPE: TABLE
+--
+create table fn_role (
+    ROLE_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+    ROLE_NAME CHARACTER VARYING(300) NOT NULL,
+    ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL,
+    PRIORITY NUMERIC(4,0)
+);
+
+--
+-- NAME: FN_AUDIT_ACTION; TYPE: TABLE
+--
+create table fn_audit_action (
+    AUDIT_ACTION_ID INTEGER NOT NULL,
+    CLASS_NAME CHARACTER VARYING(500) NOT NULL,
+    METHOD_NAME CHARACTER VARYING(50) NOT NULL,
+    AUDIT_ACTION_CD CHARACTER VARYING(20) NOT NULL,
+    AUDIT_ACTION_DESC CHARACTER VARYING(200),
+    ACTIVE_YN CHARACTER VARYING(1)
+);
+
+--
+-- NAME: FN_AUDIT_ACTION_LOG; TYPE: TABLE
+--
+create table fn_audit_action_log (
+    AUDIT_LOG_ID INTEGER NOT NULL PRIMARY KEY  AUTO_INCREMENT,
+    AUDIT_ACTION_CD CHARACTER VARYING(200),
+    ACTION_TIME TIMESTAMP,
+    USER_ID NUMERIC(11,0),
+    CLASS_NAME CHARACTER VARYING(100),
+    METHOD_NAME CHARACTER VARYING(50),
+    SUCCESS_MSG CHARACTER VARYING(20),
+    ERROR_MSG CHARACTER VARYING(500)
+);
+
+--
+-- NAME: FN_LU_ACTIVITY; TYPE: TABLE
+--
+create table fn_lu_activity (
+    ACTIVITY_CD CHARACTER VARYING(50) NOT NULL PRIMARY KEY,
+    ACTIVITY CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_AUDIT_LOG; TYPE: TABLE
+--
+create table fn_audit_log (
+    LOG_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+    USER_ID INT(11) NOT NULL,
+    ACTIVITY_CD CHARACTER VARYING(50) NOT NULL,
+    AUDIT_DATE TIMESTAMP DEFAULT NOW() NOT NULL,
+    COMMENTS CHARACTER VARYING(1000),
+    AFFECTED_RECORD_ID_BK CHARACTER VARYING(500),
+    AFFECTED_RECORD_ID CHARACTER VARYING(4000),
+    CONSTRAINT FK_FN_AUDIT_REF_209_FN_USER FOREIGN KEY (USER_ID) REFERENCES FN_USER(USER_ID)
+);
+
+--
+-- NAME: FN_BROADCAST_MESSAGE; TYPE: TABLE
+--
+create table fn_broadcast_message (
+    MESSAGE_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+    MESSAGE_TEXT CHARACTER VARYING(1000) NOT NULL,
+    MESSAGE_LOCATION_ID NUMERIC(11,0) NOT NULL,
+    BROADCAST_START_DATE TIMESTAMP NOT NULL  DEFAULT NOW(),
+    BROADCAST_END_DATE TIMESTAMP NOT NULL DEFAULT NOW(),
+    ACTIVE_YN CHARACTER(1) DEFAULT 'Y' NOT NULL,
+    SORT_ORDER NUMERIC(4,0) NOT NULL,
+    BROADCAST_SITE_CD CHARACTER VARYING(50)
+);
+
+--
+-- NAME: FN_CHAT_LOGS; TYPE: TABLE
+--
+create table fn_chat_logs (
+    CHAT_LOG_ID INTEGER NOT NULL,
+    CHAT_ROOM_ID INTEGER,
+    USER_ID INTEGER,
+    MESSAGE CHARACTER VARYING(1000),
+    MESSAGE_DATE_TIME TIMESTAMP
+);
+
+--
+-- NAME: FN_CHAT_ROOM; TYPE: TABLE
+--
+create table fn_chat_room (
+    CHAT_ROOM_ID INTEGER NOT NULL,
+    NAME CHARACTER VARYING(50) NOT NULL,
+    DESCRIPTION CHARACTER VARYING(500),
+    OWNER_ID INTEGER,
+    CREATED_DATE TIMESTAMP DEFAULT NOW(),
+    UPDATED_DATE TIMESTAMP DEFAULT NOW()
+);
+
+--
+-- NAME: FN_CHAT_USERS; TYPE: TABLE
+--
+create table fn_chat_users (
+    CHAT_ROOM_ID INTEGER,
+    USER_ID INTEGER,
+    LAST_ACTIVITY_DATE_TIME TIMESTAMP,
+    CHAT_STATUS CHARACTER VARYING(20),
+    ID INTEGER NOT NULL
+);
+
+--
+-- NAME: FN_DATASOURCE; TYPE: TABLE
+--
+create table fn_datasource (
+    ID INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
+    NAME CHARACTER VARYING(50),
+    DRIVER_NAME CHARACTER VARYING(256),
+    SERVER CHARACTER VARYING(256),
+    PORT INTEGER,
+    USER_NAME CHARACTER VARYING(256),
+    PASSWORD CHARACTER VARYING(256),
+    URL CHARACTER VARYING(256),
+    MIN_POOL_SIZE INTEGER,
+    MAX_POOL_SIZE INTEGER,
+    ADAPTER_ID INTEGER,
+    DS_TYPE CHARACTER VARYING(20)
+);
+
+--
+-- NAME: FN_FUNCTION; TYPE: TABLE
+--
+create table fn_function (
+    FUNCTION_CD CHARACTER VARYING(30) NOT NULL PRIMARY KEY,
+    FUNCTION_NAME CHARACTER VARYING(50) NOT NULL,
+    TYPE VARCHAR(20) NOT NULL,
+    ACTION VARCHAR(20) NOT NULL,
+    UNIQUE KEY function (FUNCTION_CD,TYPE,ACTION)
+);
+
+--
+-- NAME: FN_LU_ALERT_METHOD; TYPE: TABLE
+--
+create table fn_lu_alert_method (
+    ALERT_METHOD_CD CHARACTER VARYING(10) NOT NULL,
+    ALERT_METHOD CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_LU_BROADCAST_SITE; TYPE: TABLE
+--
+create table fn_lu_broadcast_site (
+    BROADCAST_SITE_CD CHARACTER VARYING(50) NOT NULL,
+    BROADCAST_SITE_DESCR CHARACTER VARYING(100)
+);
+--
+-- NAME: FN_LU_MENU_SET; TYPE: TABLE
+--
+create table fn_lu_menu_set (
+    MENU_SET_CD CHARACTER VARYING(10) NOT NULL PRIMARY KEY,
+    MENU_SET_NAME CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_LU_PRIORITY; TYPE: TABLE
+--
+create table fn_lu_priority (
+    PRIORITY_ID NUMERIC(11,0) NOT NULL,
+    PRIORITY CHARACTER VARYING(50) NOT NULL,
+    ACTIVE_YN CHARACTER(1) NOT NULL,
+    SORT_ORDER NUMERIC(5,0)
+);
+
+--
+-- NAME: FN_LU_ROLE_TYPE; TYPE: TABLE
+--
+create table fn_lu_role_type (
+    ROLE_TYPE_ID NUMERIC(11,0) NOT NULL,
+    ROLE_TYPE CHARACTER VARYING(50) NOT NULL
+);
+--
+-- NAME: FN_LU_TAB_SET; TYPE: TABLE
+--
+create table fn_lu_tab_set (
+    TAB_SET_CD CHARACTER VARYING(30) NOT NULL,
+    TAB_SET_NAME CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_MENU; TYPE: TABLE
+--
+create table fn_menu (
+    MENU_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+    LABEL CHARACTER VARYING(100),
+    PARENT_ID INT(11),
+    SORT_ORDER NUMERIC(4,0),
+    ACTION CHARACTER VARYING(200),
+    FUNCTION_CD CHARACTER VARYING(30),
+    ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL,
+    SERVLET CHARACTER VARYING(50),
+    QUERY_STRING CHARACTER VARYING(200),
+    EXTERNAL_URL CHARACTER VARYING(200),
+    TARGET CHARACTER VARYING(25),
+    MENU_SET_CD CHARACTER VARYING(10) DEFAULT 'APP',
+    SEPARATOR_YN CHARACTER(1) DEFAULT 'N',
+    IMAGE_SRC CHARACTER VARYING(100),
+    CONSTRAINT FK_FN_MENU_REF_196_FN_MENU FOREIGN KEY (PARENT_ID) REFERENCES FN_MENU(MENU_ID),
+    CONSTRAINT FK_FN_MENU_MENU_SET_CD FOREIGN KEY (MENU_SET_CD) REFERENCES FN_LU_MENU_SET(MENU_SET_CD)
+);
+
+--
+-- NAME: FN_ORG; TYPE: TABLE
+--
+create table fn_org (
+    ORG_ID INT(11) NOT NULL,
+    ORG_NAME CHARACTER VARYING(50) NOT NULL,
+    ACCESS_CD CHARACTER VARYING(10)
+);
+
+--
+-- NAME: FN_RESTRICTED_URL; TYPE: TABLE
+--
+create table fn_restricted_url (
+    RESTRICTED_URL CHARACTER VARYING(250) NOT NULL,
+    FUNCTION_CD CHARACTER VARYING(30) NOT NULL
+);
+
+--
+-- NAME: FN_ROLE_COMPOSITE; TYPE: TABLE
+--
+create table fn_role_composite (
+    PARENT_ROLE_ID INT(11) NOT NULL,
+    CHILD_ROLE_ID INT(11) NOT NULL,
+    CONSTRAINT FK_FN_ROLE_COMPOSITE_CHILD FOREIGN KEY (CHILD_ROLE_ID) REFERENCES FN_ROLE(ROLE_ID),
+    CONSTRAINT FK_FN_ROLE_COMPOSITE_PARENT FOREIGN KEY (PARENT_ROLE_ID) REFERENCES FN_ROLE(ROLE_ID)
+);
+
+--
+-- NAME: FN_ROLE_FUNCTION; TYPE: TABLE
+--
+create table fn_role_function (
+    ROLE_ID INT(11) NOT NULL,
+    FUNCTION_CD CHARACTER VARYING(30) NOT NULL,
+    CONSTRAINT FK_FN_ROLE__REF_198_FN_ROLE FOREIGN KEY (ROLE_ID) REFERENCES FN_ROLE(ROLE_ID)
+);
+
+--
+-- NAME: FN_TAB; TYPE: TABLE
+--
+create table fn_tab (
+    TAB_CD CHARACTER VARYING(30) NOT NULL,
+    TAB_NAME CHARACTER VARYING(50) NOT NULL,
+    TAB_DESCR CHARACTER VARYING(100),
+    ACTION CHARACTER VARYING(100) NOT NULL,
+    FUNCTION_CD CHARACTER VARYING(30) NOT NULL,
+    ACTIVE_YN CHARACTER(1) NOT NULL,
+    SORT_ORDER NUMERIC(11,0) NOT NULL,
+    PARENT_TAB_CD CHARACTER VARYING(30),
+    TAB_SET_CD CHARACTER VARYING(30)
+);
+
+--
+-- NAME: FN_TAB_SELECTED; TYPE: TABLE
+--
+create table fn_tab_selected (
+    SELECTED_TAB_CD CHARACTER VARYING(30) NOT NULL,
+    TAB_URI CHARACTER VARYING(40) NOT NULL
+);
+
+--
+-- NAME: FN_USER_PSEUDO_ROLE; TYPE: TABLE
+--
+create table fn_user_pseudo_role (
+    PSEUDO_ROLE_ID INT(11) NOT NULL,
+    USER_ID INT(11) NOT NULL
+);
+
+--
+-- NAME: FN_USER_ROLE; TYPE: TABLE
+--
+create table fn_user_role (
+    USER_ID INT(10) NOT NULL,
+    ROLE_ID INT(10) NOT NULL,
+    PRIORITY NUMERIC(4,0),
+    APP_ID INT(11) DEFAULT 1,
+    CONSTRAINT FK_FN_USER__REF_172_FN_USER FOREIGN KEY (USER_ID) REFERENCES FN_USER(USER_ID),
+    CONSTRAINT FK_FN_USER__REF_175_FN_ROLE FOREIGN KEY (ROLE_ID) REFERENCES FN_ROLE(ROLE_ID)
+);
+--
+-- NAME: SCHEMA_INFO; TYPE: TABLE
+--
+create table schema_info (
+    SCHEMA_ID CHARACTER VARYING(25) NOT NULL,
+    SCHEMA_DESC CHARACTER VARYING(75) NOT NULL,
+    DATASOURCE_TYPE CHARACTER VARYING(100),
+    CONNECTION_URL VARCHAR(200) NOT NULL,
+    USER_NAME VARCHAR(45) NOT NULL,
+    PASSWORD VARCHAR(45) NULL DEFAULT NULL,
+    DRIVER_CLASS VARCHAR(100) NOT NULL,
+    MIN_POOL_SIZE INT NOT NULL,
+    MAX_POOL_SIZE INT NOT NULL,
+    IDLE_CONNECTION_TEST_PERIOD INT NOT NULL
+
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_APP; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_app (
+  APP_ID int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
+  APP_NAME varchar(100) NOT NULL DEFAULT '?',
+  APP_IMAGE_URL varchar(256) DEFAULT NULL,
+  APP_DESCRIPTION varchar(512) DEFAULT NULL,
+  APP_NOTES varchar(4096) DEFAULT NULL,
+  APP_URL varchar(256) DEFAULT NULL,
+  APP_ALTERNATE_URL varchar(256) DEFAULT NULL,
+  APP_REST_ENDPOINT varchar(2000) DEFAULT NULL,
+  ML_APP_NAME varchar(50) NOT NULL DEFAULT '?',
+  ML_APP_ADMIN_ID varchar(7) NOT NULL DEFAULT '?',
+  MOTS_ID int(11) DEFAULT NULL,
+  APP_PASSWORD varchar(256) NOT NULL DEFAULT '?',
+  OPEN char(1) DEFAULT 'N',
+  ENABLED char(1) DEFAULT 'Y',
+  THUMBNAIL mediumblob,
+  APP_USERNAME varchar(50),
+  UEB_KEY VARCHAR(256) DEFAULT NULL,
+  UEB_SECRET VARCHAR(256) DEFAULT NULL,
+  UEB_TOPIC_NAME VARCHAR(256) DEFAULT NULL
+
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_FN_WORKFLOW; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_workflow (
+  id mediumint(9) NOT NULL AUTO_INCREMENT,
+  name varchar(20) NOT NULL,
+  description varchar(500) DEFAULT NULL,
+  run_link varchar(300) DEFAULT NULL,
+  suspend_link varchar(300) DEFAULT NULL,
+  modified_link varchar(300) DEFAULT NULL,
+  active_yn varchar(300) DEFAULT NULL,
+  created varchar(300) DEFAULT NULL,
+  created_by int(11) DEFAULT NULL,
+  modified varchar(300) DEFAULT NULL,
+  modified_by int(11) DEFAULT NULL,
+  workflow_key varchar(50) DEFAULT NULL,
+  PRIMARY KEY (id),
+  UNIQUE KEY name (name)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_SCHEDULE_WORKFLOWS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_schedule_workflows (
+  id_schedule_workflows bigint(25) PRIMARY KEY NOT NULL AUTO_INCREMENT,
+  workflow_server_url varchar(45) DEFAULT NULL,
+  workflow_key varchar(45) NOT NULL,
+  workflow_arguments varchar(45) DEFAULT NULL,
+  startDateTimeCron varchar(45) DEFAULT NULL,
+  endDateTime TIMESTAMP DEFAULT NOW(),
+  start_date_time TIMESTAMP DEFAULT NOW(),
+  recurrence varchar(45) DEFAULT NULL
+  );
+
+--  For demo reporting application add : demo_bar_chart, demo_bar_chart_inter, demo_line_chart, demo_pie_chart and demo_util_chart
+--                                                                             demo_scatter_chart, demo_scatter_plot
+-- ----------------------------------------------------------
+-- NAME: DEMO_BAR_CHART; TYPE: TABLE
+-- ----------------------------------------------------------
+create table demo_bar_chart (
+    label varchar(20),
+    value numeric(25,15)
+  );
+
+-- ----------------------------------------------------------
+-- NAME: DEMO_BAR_CHART_INTER; TYPE: TABLE
+-- ----------------------------------------------------------
+create table demo_bar_chart_inter (
+    spam_date date,
+    num_rpt_sources numeric(10,0),
+    num_det_sources numeric(10,0)
+  );
+
+-- ----------------------------------------------------------
+-- NAME: DEMO_LINE_CHART; TYPE: TABLE
+-- ----------------------------------------------------------
+create table demo_line_chart (
+    series varchar(20),
+    log_date date,
+    data_value numeric(10,5)
+  );
+
+-- ----------------------------------------------------------
+-- NAME: DEMO_PIE_CHART; TYPE: TABLE
+-- ----------------------------------------------------------
+create table demo_pie_chart (
+    legend varchar(20),
+    data_value numeric(10,5)
+  );
+
+-- ----------------------------------------------------------
+-- NAME: DEMO_UTIL_CHART; TYPE: TABLE
+-- ----------------------------------------------------------
+create table demo_util_chart (
+    traffic_date date,
+    util_perc numeric(10,5)
+  );
+
+-- ----------------------------------------------------------
+-- NAME: DEMO_SCATTER_CHART; TYPE: TABLE
+-- ----------------------------------------------------------
+create table demo_scatter_chart (
+  rainfall numeric(10,2),
+  key_value varchar(20),
+  measurements numeric(10,2)
+);
+
+-- ----------------------------------------------------------
+-- NAME: DEMO_SCATTER_PLOT; TYPE: TABLE
+-- ----------------------------------------------------------
+create table demo_scatter_plot
+(
+  SERIES  VARCHAR(20),
+  VALUEX  numeric(25,15),
+  VALUEY  numeric(25,15)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_JOB_DETAILS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_job_details (
+SCHED_NAME VARCHAR(120) NOT NULL,
+JOB_NAME VARCHAR(200) NOT NULL,
+JOB_GROUP VARCHAR(200) NOT NULL,
+DESCRIPTION VARCHAR(250) NULL,
+JOB_CLASS_NAME VARCHAR(250) NOT NULL,
+IS_DURABLE VARCHAR(1) NOT NULL,
+IS_NONCONCURRENT VARCHAR(1) NOT NULL,
+IS_UPDATE_DATA VARCHAR(1) NOT NULL,
+REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
+JOB_DATA BLOB NULL,
+PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_TRIGGERS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_triggers (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+JOB_NAME VARCHAR(200) NOT NULL,
+JOB_GROUP VARCHAR(200) NOT NULL,
+DESCRIPTION VARCHAR(250) NULL,
+NEXT_FIRE_TIME BIGINT(13) NULL,
+PREV_FIRE_TIME BIGINT(13) NULL,
+PRIORITY INTEGER NULL,
+TRIGGER_STATE VARCHAR(16) NOT NULL,
+TRIGGER_TYPE VARCHAR(8) NOT NULL,
+START_TIME BIGINT(13) NOT NULL,
+END_TIME BIGINT(13) NULL,
+CALENDAR_NAME VARCHAR(200) NULL,
+MISFIRE_INSTR SMALLINT(2) NULL,
+JOB_DATA BLOB NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
+REFERENCES FN_QZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_SIMPLE_TRIGGERS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_simple_triggers (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+REPEAT_COUNT BIGINT(7) NOT NULL,
+REPEAT_INTERVAL BIGINT(12) NOT NULL,
+TIMES_TRIGGERED BIGINT(10) NOT NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_CRON_TRIGGERS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_cron_triggers (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+CRON_EXPRESSION VARCHAR(120) NOT NULL,
+TIME_ZONE_ID VARCHAR(80),
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_SIMPROP_TRIGGERS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_simprop_triggers
+  (
+    SCHED_NAME VARCHAR(120) NOT NULL,
+    TRIGGER_NAME VARCHAR(200) NOT NULL,
+    TRIGGER_GROUP VARCHAR(200) NOT NULL,
+    STR_PROP_1 VARCHAR(512) NULL,
+    STR_PROP_2 VARCHAR(512) NULL,
+    STR_PROP_3 VARCHAR(512) NULL,
+    INT_PROP_1 INT NULL,
+    INT_PROP_2 INT NULL,
+    LONG_PROP_1 BIGINT NULL,
+    LONG_PROP_2 BIGINT NULL,
+    DEC_PROP_1 NUMERIC(13,4) NULL,
+    DEC_PROP_2 NUMERIC(13,4) NULL,
+    BOOL_PROP_1 VARCHAR(1) NULL,
+    BOOL_PROP_2 VARCHAR(1) NULL,
+    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+    REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_BLOB_TRIGGERS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_blob_triggers (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+BLOB_DATA BLOB NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
+FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+REFERENCES FN_QZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_CALENDARS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_calendars (
+SCHED_NAME VARCHAR(120) NOT NULL,
+CALENDAR_NAME VARCHAR(200) NOT NULL,
+CALENDAR BLOB NOT NULL,
+PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_PAUSED_TRIGGER_GRPS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_paused_trigger_grps (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_FIRED_TRIGGERS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_fired_triggers (
+SCHED_NAME VARCHAR(120) NOT NULL,
+ENTRY_ID VARCHAR(95) NOT NULL,
+TRIGGER_NAME VARCHAR(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+INSTANCE_NAME VARCHAR(200) NOT NULL,
+FIRED_TIME BIGINT(13) NOT NULL,
+SCHED_TIME BIGINT(13) NOT NULL,
+PRIORITY INTEGER NOT NULL,
+STATE VARCHAR(16) NOT NULL,
+JOB_NAME VARCHAR(200) NULL,
+JOB_GROUP VARCHAR(200) NULL,
+IS_NONCONCURRENT VARCHAR(1) NULL,
+REQUESTS_RECOVERY VARCHAR(1) NULL,
+PRIMARY KEY (SCHED_NAME,ENTRY_ID)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_SCHEDULER_STATE; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_scheduler_state (
+SCHED_NAME VARCHAR(120) NOT NULL,
+INSTANCE_NAME VARCHAR(200) NOT NULL,
+LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
+CHECKIN_INTERVAL BIGINT(13) NOT NULL,
+PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_QZ_LOCKS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_qz_locks (
+SCHED_NAME VARCHAR(120) NOT NULL,
+LOCK_NAME VARCHAR(40) NOT NULL,
+PRIMARY KEY (SCHED_NAME,LOCK_NAME)
+);
+
+--
+-- name: rcloudinvocation; type: table
+--
+create table rcloudinvocation (
+    id varchar(128) not null primary key,
+    created timestamp not null,
+    userinfo varchar(2048) not null,
+    notebookid varchar(128) not null,
+    parameters varchar(2048) default null,
+    tokenreaddate timestamp null
+);
+
+--
+-- name: rcloudnotebook; type: table
+--
+create table rcloudnotebook (
+    notebookname varchar(128) not null primary key,
+    notebookid varchar(128) not null
+);
+
+--
+-- Name: fn_lu_message_location; Type: TABLE
+--
+
+CREATE TABLE fn_lu_message_location (
+    message_location_id numeric(11,0) NOT NULL,
+    message_location_descr character varying(30) NOT NULL
+);
+
+-- ------------------ CREATE VIEW SECTION
+--
+-- NAME: V_URL_ACCESS; TYPE: VIEW
+--
+CREATE VIEW v_url_access AS
+ SELECT DISTINCT M.ACTION AS URL,
+    M.FUNCTION_CD
+   FROM FN_MENU M
+  WHERE (M.ACTION IS NOT NULL)
+UNION
+ SELECT DISTINCT T.ACTION AS URL,
+    T.FUNCTION_CD
+   FROM FN_TAB T
+  WHERE (T.ACTION IS NOT NULL)
+UNION
+ SELECT R.RESTRICTED_URL AS URL,
+    R.FUNCTION_CD
+   FROM FN_RESTRICTED_URL R;
+
+-- ------------------ ALTER TABLE ADD CONSTRAINT PRIMARY KEY SECTION
+--
+-- NAME: CR_FAVORITE_REPORTS_USER_IDREP_ID; TYPE: CONSTRAINT
+--
+alter table cr_favorite_reports
+    add constraint cr_favorite_reports_user_idrep_id primary key (user_id, rep_id);
+--
+-- NAME: CR_FOLDER_FOLDER_ID; TYPE: CONSTRAINT
+--
+alter table cr_folder
+    add constraint cr_folder_folder_id primary key (folder_id);
+--
+-- NAME: CR_FOLDER_ACCESS_FOLDER_ACCESS_ID; TYPE: CONSTRAINT
+--
+alter table cr_folder_access
+    add constraint cr_folder_access_folder_access_id primary key (folder_access_id);
+--
+-- NAME: CR_HIST_USER_MAP_HIST_IDUSER_ID; TYPE: CONSTRAINT
+--
+alter table cr_hist_user_map
+    add constraint cr_hist_user_map_hist_iduser_id primary key (hist_id, user_id);
+--
+-- NAME: CR_LU_FILE_TYPE_LOOKUP_ID; TYPE: CONSTRAINT
+--
+alter table cr_lu_file_type
+    add constraint cr_lu_file_type_lookup_id primary key (lookup_id);
+--
+-- NAME: CR_RAPTOR_ACTION_IMG_IMAGE_ID; TYPE: CONSTRAINT
+--
+alter table cr_raptor_action_img
+    add constraint cr_raptor_action_img_image_id primary key (image_id);
+--
+-- NAME: CR_RAPTOR_PDF_IMG_IMAGE_ID; TYPE: CONSTRAINT
+--
+alter table cr_raptor_pdf_img
+    add constraint cr_raptor_pdf_img_image_id primary key (image_id);
+--
+-- NAME: CR_REMOTE_SCHEMA_INFO_SCHEMA_PREFIX; TYPE: CONSTRAINT
+--
+alter table cr_remote_schema_info
+    add constraint cr_remote_schema_info_schema_prefix primary key (schema_prefix);
+--
+-- NAME: CR_REPORT_REP_ID; TYPE: CONSTRAINT
+--
+alter table cr_report
+    add constraint cr_report_rep_id primary key (rep_id);
+--
+-- NAME: CR_REPORT_ACCESS_REP_IDORDER_NO; TYPE: CONSTRAINT
+--
+alter table cr_report_access
+    add constraint cr_report_access_rep_idorder_no primary key (rep_id, order_no);
+--
+-- NAME: CR_REPORT_EMAIL_SENT_LOG_LOG_ID; TYPE: CONSTRAINT
+--
+alter table cr_report_email_sent_log
+    add constraint cr_report_email_sent_log_log_id primary key (log_id);
+--
+-- NAME: CR_REPORT_FILE_HISTORY_HIST_ID; TYPE: CONSTRAINT
+--
+alter table cr_report_file_history
+    add constraint cr_report_file_history_hist_id primary key (hist_id);
+--
+-- NAME: CR_REPORT_SCHEDULE_SCHEDULE_ID; TYPE: CONSTRAINT
+--
+alter table cr_report_schedule
+    add constraint cr_report_schedule_schedule_id primary key (schedule_id);
+--
+-- NAME: CR_REPORT_SCHEDULE_USERS_SCHEDULE_IDREP_IDUSER_IDORDER_NO; TYPE: CONSTRAINT
+--
+alter table cr_report_schedule_users
+    add constraint cr_report_schedule_users_schedule_idrep_iduser_idorder_no primary key (schedule_id, rep_id, user_id, order_no);
+--
+-- NAME: CR_REPORT_TEMPLATE_MAP_REPORT_ID; TYPE: CONSTRAINT
+--
+alter table cr_report_template_map
+    add constraint cr_report_template_map_report_id primary key (report_id);
+--
+-- NAME: CR_TABLE_ROLE_TABLE_NAMEROLE_ID; TYPE: CONSTRAINT
+--
+alter table cr_table_role
+    add constraint cr_table_role_table_namerole_id primary key (table_name, role_id);
+--
+-- NAME: CR_TABLE_SOURCE_TABLE_NAME; TYPE: CONSTRAINT
+--
+alter table cr_table_source
+    add constraint cr_table_source_table_name primary key (table_name);
+--
+-- NAME: FN_AUDIT_ACTION_AUDIT_ACTION_ID; TYPE: CONSTRAINT
+--
+alter table fn_audit_action
+    add constraint fn_audit_action_audit_action_id primary key (audit_action_id);
+--
+-- NAME: FN_CHAT_LOGS_CHAT_LOG_ID; TYPE: CONSTRAINT
+--
+alter table fn_chat_logs
+    add constraint fn_chat_logs_chat_log_id primary key (chat_log_id);
+--
+-- NAME: FN_CHAT_ROOM_CHAT_ROOM_ID; TYPE: CONSTRAINT
+--
+alter table fn_chat_room
+    add constraint fn_chat_room_chat_room_id primary key (chat_room_id);
+--
+-- NAME: FN_CHAT_USERS_ID; TYPE: CONSTRAINT
+--
+alter table fn_chat_users
+    add constraint fn_chat_users_id primary key (id);
+--
+-- NAME: FN_LU_ALERT_METHOD_ALERT_METHOD_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_alert_method
+    add constraint fn_lu_alert_method_alert_method_cd primary key (alert_method_cd);
+--
+-- NAME: FN_LU_BROADCAST_SITE_BROADCAST_SITE_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_broadcast_site
+    add constraint fn_lu_broadcast_site_broadcast_site_cd primary key (broadcast_site_cd);
+--
+-- NAME: FN_LU_PRIORITY_PRIORITY_ID; TYPE: CONSTRAINT
+--
+alter table fn_lu_priority
+    add constraint fn_lu_priority_priority_id primary key (priority_id);
+--
+-- NAME: FN_LU_ROLE_TYPE_ROLE_TYPE_ID; TYPE: CONSTRAINT
+--
+alter table fn_lu_role_type
+    add constraint fn_lu_role_type_role_type_id primary key (role_type_id);
+--
+-- NAME: FN_LU_TAB_SET_TAB_SET_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_tab_set
+    add constraint fn_lu_tab_set_tab_set_cd primary key (tab_set_cd);
+--
+-- NAME: FN_LU_TIMEZONE_TIMEZONE_ID; TYPE: CONSTRAINT
+--
+alter table fn_lu_timezone
+    add constraint fn_lu_timezone_timezone_id primary key (timezone_id);
+--
+-- NAME: FN_ORG_ORG_ID; TYPE: CONSTRAINT
+--
+alter table fn_org
+    add constraint fn_org_org_id primary key (org_id);
+--
+-- NAME: FN_RESTRICTED_URL_RESTRICTED_URLFUNCTION_CD; TYPE: CONSTRAINT
+--
+alter table fn_restricted_url
+    add constraint fn_restricted_url_restricted_urlfunction_cd primary key (restricted_url, function_cd);
+--
+-- NAME: FN_ROLE_COMPOSITE_PARENT_ROLE_IDCHILD_ROLE_ID; TYPE: CONSTRAINT
+--
+alter table fn_role_composite
+    add constraint fn_role_composite_parent_role_idchild_role_id primary key (parent_role_id, child_role_id);
+--
+-- NAME: FN_ROLE_FUNCTION_ROLE_IDFUNCTION_CD; TYPE: CONSTRAINT
+--
+alter table fn_role_function
+    add constraint fn_role_function_role_idfunction_cd primary key (role_id, function_cd);
+--
+-- NAME: FN_TAB_TAB_CD; TYPE: CONSTRAINT
+--
+alter table fn_tab
+    add constraint fn_tab_tab_cd primary key (tab_cd);
+--
+-- NAME: FN_TAB_SELECTED_SELECTED_TAB_CDTAB_URI; TYPE: CONSTRAINT
+--
+alter table fn_tab_selected
+    add constraint fn_tab_selected_selected_tab_cdtab_uri primary key (selected_tab_cd, tab_uri);
+--
+-- NAME: FN_USER_PSEUDO_ROLE_PSEUDO_ROLE_IDUSER_ID; TYPE: CONSTRAINT
+--
+alter table fn_user_pseudo_role
+    add constraint fn_user_pseudo_role_pseudo_role_iduser_id primary key (pseudo_role_id, user_id);
+--
+-- NAME: FN_USER_ROLE_USER_IDROLE_ID; TYPE: CONSTRAINT
+--
+alter table fn_user_role
+    add constraint fn_user_role_user_idrole_id primary key (user_id, role_id, app_id);
+--
+-- Name: fn_lu_message_location_MESSAGE_LOCATION_ID; Type: CONSTRAINT
+--
+
+ALTER TABLE fn_lu_message_location
+    ADD CONSTRAINT fn_lu_message_location_MESSAGE_LOCATION_ID PRIMARY KEY (message_location_id);
+
+-- ------------------ CREATE INDEX SECTION
+--
+-- NAME: CR_REPORT_CREATE_IDPUBLIC_YNTITLE; TYPE: INDEX
+--
+create index cr_report_create_idpublic_yntitle using btree on cr_report (create_id, public_yn, title);
+--
+-- NAME: CR_TABLE_JOIN_DEST_TABLE_NAME; TYPE: INDEX
+--
+create index cr_table_join_dest_table_name using btree on cr_table_join (dest_table_name);
+--
+-- NAME: CR_TABLE_JOIN_SRC_TABLE_NAME; TYPE: INDEX
+--
+create index cr_table_join_src_table_name using btree on cr_table_join (src_table_name);
+--
+-- NAME: FN_AUDIT_LOG_ACTIVITY_CD; TYPE: INDEX
+--
+create index fn_audit_log_activity_cd using btree on fn_audit_log (activity_cd);
+--
+-- NAME: FN_AUDIT_LOG_USER_ID; TYPE: INDEX
+--
+create index fn_audit_log_user_id using btree on fn_audit_log (user_id);
+--
+-- NAME: FN_ORG_ACCESS_CD; TYPE: INDEX
+--
+create index fn_org_access_cd using btree on fn_org (access_cd);
+--
+-- NAME: FN_ROLE_FUNCTION_FUNCTION_CD; TYPE: INDEX
+--
+create index fn_role_function_function_cd using btree on fn_role_function (function_cd);
+--
+-- NAME: FN_ROLE_FUNCTION_ROLE_ID; TYPE: INDEX
+--
+create index fn_role_function_role_id using btree on fn_role_function (role_id);
+--
+-- NAME: FN_USER_ADDRESS_ID; TYPE: INDEX
+--
+create index fn_user_address_id using btree on fn_user (address_id);
+--
+-- NAME: FN_USER_ALERT_METHOD_CD; TYPE: INDEX
+--
+create index fn_user_alert_method_cd using btree on fn_user (alert_method_cd);
+--
+-- NAME: FN_USER_HRID; TYPE: INDEX
+--
+create unique index fn_user_hrid using btree on fn_user (hrid);
+--
+-- NAME: FN_USER_LOGIN_ID; TYPE: INDEX
+--
+create unique index fn_user_login_id using btree on fn_user (login_id);
+--
+-- NAME: FN_USER_ORG_ID; TYPE: INDEX
+--
+create index fn_user_org_id using btree on fn_user (org_id);
+--
+-- NAME: FN_USER_ROLE_ROLE_ID; TYPE: INDEX
+--
+create index fn_user_role_role_id using btree on fn_user_role (role_id);
+--
+-- NAME: FN_USER_ROLE_USER_ID; TYPE: INDEX
+--
+create index fn_user_role_user_id using btree on fn_user_role (user_id);
+--
+-- NAME: FK_FN_USER__REF_178_FN_APP_idx; TYPE: INDEX
+--
+create index fk_fn_user__ref_178_fn_app_IDX on fn_user_role (app_id);
+
+-- ----------------------------------------------------------
+-- NAME: QUARTZ TYPE: INDEXES
+-- ----------------------------------------------------------
+create index idx_fn_qz_j_req_recovery on fn_qz_job_details(sched_name,requests_recovery);
+create index idx_fn_qz_j_grp on fn_qz_job_details(sched_name,job_group);
+create index idx_fn_qz_t_j on fn_qz_triggers(sched_name,job_name,job_group);
+create index idx_fn_qz_t_jg on fn_qz_triggers(sched_name,job_group);
+create index idx_fn_qz_t_c on fn_qz_triggers(sched_name,calendar_name);
+create index idx_fn_qz_t_g on fn_qz_triggers(sched_name,trigger_group);
+create index idx_fn_qz_t_state on fn_qz_triggers(sched_name,trigger_state);
+create index idx_fn_qz_t_n_state on fn_qz_triggers(sched_name,trigger_name,trigger_group,trigger_state);
+create index idx_fn_qz_t_n_g_state on fn_qz_triggers(sched_name,trigger_group,trigger_state);
+create index idx_fn_qz_t_next_fire_time on fn_qz_triggers(sched_name,next_fire_time);
+create index idx_fn_qz_t_nft_st on fn_qz_triggers(sched_name,trigger_state,next_fire_time);
+create index idx_fn_qz_t_nft_misfire on fn_qz_triggers(sched_name,misfire_instr,next_fire_time);
+create index idx_fn_qz_t_nft_st_misfire on fn_qz_triggers(sched_name,misfire_instr,next_fire_time,trigger_state);
+create index idx_fn_qz_t_nft_st_misfire_grp on fn_qz_triggers(sched_name,misfire_instr,next_fire_time,trigger_group,trigger_state);
+create index idx_fn_qz_ft_trig_inst_name on fn_qz_fired_triggers(sched_name,instance_name);
+create index idx_fn_qz_ft_inst_job_req_rcvry on fn_qz_fired_triggers(sched_name,instance_name,requests_recovery);
+create index idx_fn_qz_ft_j_g on fn_qz_fired_triggers(sched_name,job_name,job_group);
+create index idx_fn_qz_ft_jg on fn_qz_fired_triggers(sched_name,job_group);
+create index idx_fn_qz_ft_t_g on fn_qz_fired_triggers(sched_name,trigger_name,trigger_group);
+create index idx_fn_qz_ft_tg on fn_qz_fired_triggers(sched_name,trigger_group);
+
+-- ------------------ ALTER TABLE ADD CONSTRAINT FOREIGN KEY SECTION
+--
+-- NAME: FK_FN_AUDIT_REF_205_FN_LU_AC; TYPE: CONSTRAINT
+--
+alter table fn_audit_log
+       add constraint fk_fn_audit_ref_205_fn_lu_ac foreign key (activity_cd) references fn_lu_activity(activity_cd);
+--
+-- NAME: FK_FN_ROLE__REF_201_FN_FUNCT; TYPE: CONSTRAINT
+--
+alter table fn_role_function
+       add constraint fk_fn_role__ref_201_fn_funct foreign key (function_cd) references fn_function(function_cd);
+--
+-- NAME: FK_FN_USER__REF_178_FN_APP; TYPE: FK CONSTRAINT
+--
+alter table fn_user_role
+       add constraint fk_fn_user__ref_178_fn_app foreign key (app_id) references fn_app(app_id);
+--
+-- NAME: FK_CR_REPOR_REF_14707_CR_REPOR; TYPE: FK CONSTRAINT
+--
+alter table cr_report_schedule
+    add constraint fk_cr_repor_ref_14707_cr_repor foreign key (rep_id) references cr_report(rep_id);
+--
+-- NAME: FK_CR_REPOR_REF_14716_CR_REPOR; TYPE: FK CONSTRAINT
+--
+alter table cr_report_schedule_users
+    add constraint fk_cr_repor_ref_14716_cr_repor foreign key (schedule_id) references cr_report_schedule(schedule_id);
+--
+-- NAME: FK_CR_REPOR_REF_17645_CR_REPOR; TYPE: FK CONSTRAINT
+--
+alter table cr_report_log
+    add constraint fk_cr_repor_ref_17645_cr_repor foreign key (rep_id) references cr_report(rep_id);
+--
+-- NAME: FK_CR_REPOR_REF_8550_CR_REPOR; TYPE: FK CONSTRAINT
+--
+alter table cr_report_access
+    add constraint fk_cr_repor_ref_8550_cr_repor foreign key (rep_id) references cr_report(rep_id);
+--
+-- NAME: FK_CR_REPORT_REP_ID; TYPE: FK CONSTRAINT
+--
+alter table cr_report_email_sent_log
+    add constraint fk_cr_report_rep_id foreign key (rep_id) references cr_report(rep_id);
+--
+-- NAME: FK_CR_TABLE_REF_311_CR_TAB; TYPE: FK CONSTRAINT
+--
+alter table cr_table_join
+    add constraint fk_cr_table_ref_311_cr_tab foreign key (src_table_name) references cr_table_source(table_name);
+--
+-- NAME: FK_CR_TABLE_REF_315_CR_TAB; TYPE: FK CONSTRAINT
+--
+alter table cr_table_join
+    add constraint fk_cr_table_ref_315_cr_tab foreign key (dest_table_name) references cr_table_source(table_name);
+--
+-- NAME: FK_CR_TABLE_REF_32384_CR_TABLE; TYPE: FK CONSTRAINT
+--
+alter table cr_table_role
+    add constraint fk_cr_table_ref_32384_cr_table foreign key (table_name) references cr_table_source(table_name);
+--
+-- NAME: FK_FN_TAB_FUNCTION_CD; TYPE: FK CONSTRAINT
+--
+alter table fn_tab
+    add constraint fk_fn_tab_function_cd foreign key (function_cd) references fn_function(function_cd);
+--
+-- NAME: FK_FN_TAB_SELECTED_TAB_CD; TYPE: FK CONSTRAINT
+--
+alter table fn_tab_selected
+    add constraint fk_fn_tab_selected_tab_cd foreign key (selected_tab_cd) references fn_tab(tab_cd);
+--
+-- NAME: FK_FN_TAB_SET_CD; TYPE: FK CONSTRAINT
+--
+alter table fn_tab
+    add constraint fk_fn_tab_set_cd foreign key (tab_set_cd) references fn_lu_tab_set(tab_set_cd);
+--
+-- NAME: FK_FN_USER_REF_110_FN_ORG; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+    add constraint fk_fn_user_ref_110_fn_org foreign key (org_id) references fn_org(org_id);
+--
+-- NAME: FK_FN_USER_REF_123_FN_LU_AL; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+    add constraint fk_fn_user_ref_123_fn_lu_al foreign key (alert_method_cd) references fn_lu_alert_method(alert_method_cd);
+--
+-- NAME: FK_FN_USER_REF_197_FN_USER; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+    add constraint fk_fn_user_ref_197_fn_user foreign key (manager_id) references fn_user(user_id);
+--
+-- NAME: FK_FN_USER_REF_198_FN_USER; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+    add constraint fk_fn_user_ref_198_fn_user foreign key (created_id) references fn_user(user_id);
+--
+-- NAME: FK_FN_USER_REF_199_FN_USER; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+    add constraint fk_fn_user_ref_199_fn_user foreign key (modified_id) references fn_user(user_id);
+--
+-- NAME: FK_PARENT_KEY_CR_FOLDER; TYPE: FK CONSTRAINT
+--
+alter table cr_folder
+    add constraint fk_parent_key_cr_folder foreign key (parent_folder_id) references cr_folder(folder_id);
+--
+-- NAME: FK_PSEUDO_ROLE_PSEUDO_ROLE_ID; TYPE: FK CONSTRAINT
+--
+alter table fn_user_pseudo_role
+    add constraint fk_pseudo_role_pseudo_role_id foreign key (pseudo_role_id) references fn_role(role_id);
+--
+-- NAME: FK_PSEUDO_ROLE_USER_ID; TYPE: FK CONSTRAINT
+--
+alter table fn_user_pseudo_role
+    add constraint fk_pseudo_role_user_id foreign key (user_id) references fn_user(user_id);
+--
+-- NAME: FK_TIMEZONE; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+    add constraint fk_timezone foreign key (timezone) references fn_lu_timezone(timezone_id);
+--
+-- NAME: SYS_C0014614; TYPE: FK CONSTRAINT
+--
+alter table cr_report_file_history
+    add constraint sys_c0014614 foreign key (file_type_id) references cr_lu_file_type(lookup_id);
+--
+-- NAME: SYS_C0014615; TYPE: FK CONSTRAINT
+--
+alter table cr_report_file_history
+    add constraint sys_c0014615 foreign key (rep_id) references cr_report(rep_id);
+--
+-- NAME: SYS_C0014616; TYPE: FK CONSTRAINT
+--
+alter table cr_hist_user_map
+    add constraint sys_c0014616 foreign key (hist_id) references cr_report_file_history(hist_id);
+--
+-- NAME: SYS_C0014617; TYPE: FK CONSTRAINT
+--
+alter table cr_hist_user_map
+    add constraint sys_c0014617 foreign key (user_id) references fn_user(user_id);
+
+commit;
diff --git a/ui/db-scripts/EcompSdkDDLMySql_2_4_OS.sql b/ui/db-scripts/EcompSdkDDLMySql_2_4_OS.sql
new file mode 100644 (file)
index 0000000..4a35dd6
--- /dev/null
@@ -0,0 +1,12 @@
+-- ---------------------------------------------------------------------------------------------------------------
+-- This script adds tables for the OPEN-SOURCE version 2.1.0 of the ECOMP SDK application database.
+-- The DDL COMMON script must be executed first!
+-- ---------------------------------------------------------------------------------------------------------------
+
+SET FOREIGN_KEY_CHECKS=1;
+
+USE akraino;
+
+-- No additional tables required at this time
+
+commit;
diff --git a/ui/db-scripts/EcompSdkDMLMySql_2_4_Common.sql b/ui/db-scripts/EcompSdkDMLMySql_2_4_Common.sql
new file mode 100644 (file)
index 0000000..611c6f8
--- /dev/null
@@ -0,0 +1,2881 @@
+-- ---------------------------------------------------------------------------------------------------------------
+-- This script populates tables in the COMMON version 2.1.0 of the ONAP SDK application database.
+-- Additional DML scripts may be required!
+-- ---------------------------------------------------------------------------------------------------------------
+
+SET FOREIGN_KEY_CHECKS=1;
+
+USE akraino;
+
+-- fn_function
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_process','Process List','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_job','Job Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_job_create','Job Create','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_job_designer','Process in Designer view','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_task','Task Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_task_search','Task Search','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_map','Map Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_sample','Sample Pages Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('login','Login','url','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_home','Home Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_customer','Customer Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_reports','Reports Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_profile','Profile Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_admin','Admin Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_feedback','Feedback Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_help','Help Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_logout','Logout Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_notes','Notes Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_ajax','Ajax Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_customer_create','Customer Create','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_profile_create','Profile Create','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_profile_import','Profile Import','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_tab','Sample Tab Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('view_reports','View Raptor reports','menu','*');
+
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_itracker_admin','Itracker Admin/Support menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('quantum_bd','Big Data Function','url','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_hiveconfig','Hive Configuration','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_mapreduce_create','Map Reduce Configuration Create','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_mapreduce_search','Map Reduce Configuration Search','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_hiveconfig_search','Hive Configuration Search','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_hiveconfig_create','Hive Configuration Create','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_test','Test Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_doclib','Document Library Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('doclib','Document Library','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('doclib_admin','Document Library Admin','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_concept','CoNCEPT','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_itracker','iTracker Menu','menu','*');
+Insert into fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_mapreduce','Map Reduce Configuration','menu','*');
+
+-- fn_lu_activity
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_role','add_role');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_role','remove_role');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_user_role','add_user_role');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_user_role','remove_user_role');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_role_function','add_role_function');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_role_function','remove_role_function');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('add_child_role','add_child_role');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('remove_child_role','remove_child_role');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('mobile_login','Mobile Login');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('mobile_logout','Mobile Logout');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('login','Login');
+Insert into fn_lu_activity (ACTIVITY_CD,ACTIVITY) values ('logout','Logout');
+
+-- fn_lu_alert_method
+Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('PHONE','Phone');
+Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('FAX','Fax');
+Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('PAGER','Pager');
+Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('EMAIL','Email');
+Insert into fn_lu_alert_method (ALERT_METHOD_CD,ALERT_METHOD) values ('SMS','SMS');
+
+-- fn_lu_menu_set
+Insert into fn_lu_menu_set (MENU_SET_CD,MENU_SET_NAME) values ('APP','Application Menu');
+
+-- fn_lu_priority
+Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (10,'Low','Y',10);
+Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (20,'Normal','Y',20);
+Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (30,'High','Y',30);
+Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (40,'Urgent','Y',40);
+Insert into fn_lu_priority (PRIORITY_ID,PRIORITY,ACTIVE_YN,SORT_ORDER) values (50,'Fatal','Y',50);
+
+-- fn_lu_tab_set
+Insert into fn_lu_tab_set (TAB_SET_CD,TAB_SET_NAME) values ('APP','Application Tabs');
+
+-- fn_lu_timezone
+Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (10,'US/Eastern','US/Eastern');
+Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (20,'US/Central','US/Central');
+Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (30,'US/Mountain','US/Mountain');
+Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (40,'US/Arizona','America/Phoenix');
+Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (50,'US/Pacific','US/Pacific');
+Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (60,'US/Alaska','US/Alaska');
+Insert into fn_lu_timezone (TIMEZONE_ID,TIMEZONE_NAME,TIMEZONE_VALUE) values (70,'US/Hawaii','US/Hawaii');
+
+-- fn_restricted_url
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('attachment.htm','menu_admin');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('broadcast.htm','menu_admin');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('file_upload.htm','menu_admin');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('job.htm','menu_admin');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('role.htm','menu_admin');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('role_function.htm','menu_admin');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('test.htm','menu_admin');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('async_test.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('chatWindow.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('contact_list.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('customer_dynamic_list.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('event.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('event_list.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('mobile_welcome.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_map.htm','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('template.jsp','menu_home');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('jbpm_designer.htm','menu_job_create');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('jbpm_drools.htm','menu_job_create');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('process_job.htm','menu_job_create');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('profile.htm','menu_profile_create');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor.htm','menu_reports');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor2.htm','menu_reports');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_blob_extract.htm','menu_reports');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_email_attachment.htm','menu_reports');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_search.htm','menu_reports');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('report_list.htm','menu_reports');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('gauge.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('gmap_controller.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('gmap_frame.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('map.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('map_download.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('map_grid_search.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_animated_map.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_map_2.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('sample_map_3.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub1.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub2_link1.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub2_link2.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab2_sub3.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab3.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('tab4.htm','menu_tab');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor.htm','view_reports');
+INSERT INTO fn_restricted_url (restricted_url, function_cd) VALUES ('raptor_blob_extract.htm','view_reports');
+INSERT INTO fn_restricted_url VALUES('admin','menu_admin');
+INSERT INTO fn_restricted_url VALUES('get_role','menu_admin');
+INSERT INTO fn_restricted_url VALUES('get_role_functions','menu_admin');
+INSERT INTO fn_restricted_url VALUES('role_list/*','menu_admin');
+INSERT INTO fn_restricted_url VALUES('role_function_list/*','menu_admin');
+INSERT INTO fn_restricted_url VALUES('addRole','menu_admin');
+INSERT INTO fn_restricted_url VALUES('addRoleFunction','menu_admin');
+INSERT INTO fn_restricted_url VALUES('removeRole','menu_admin');
+INSERT INTO fn_restricted_url VALUES('removeRoleFunction','menu_admin');
+INSERT INTO fn_restricted_url VALUES('profile/*','menu_admin');
+INSERT INTO fn_restricted_url VALUES('samplePage','menu_sample');
+INSERT INTO fn_restricted_url VALUES('workflows','menu_admin');
+INSERT INTO fn_restricted_url VALUES('workflows/list','menu_admin');
+INSERT INTO fn_restricted_url VALUES('workflows/addWorkflow','menu_admin');
+INSERT INTO fn_restricted_url VALUES('workflows/saveCronJob','menu_admin');
+INSERT INTO fn_restricted_url VALUES('workflows/editWorkflow','menu_admin');
+INSERT INTO fn_restricted_url VALUES('workflows/removeWorkflow','menu_admin');
+INSERT INTO fn_restricted_url VALUES('workflows/removeAllWorkflows','menu_admin');
+INSERT INTO fn_restricted_url VALUES('role/saveRole.htm','menu_admin');
+INSERT INTO fn_restricted_url VALUES('post_search/process','menu_admin');
+INSERT INTO fn_restricted_url VALUES('post_search/search','menu_admin');
+INSERT INTO fn_restricted_url VALUES('post_search/search','menu_profile');
+INSERT INTO fn_restricted_url VALUES('report/wizard/retrieve_def_tab_wise_data/*','menu_reports');
+INSERT INTO fn_restricted_url VALUES('report/wizard/retrieve_form_tab_wise_data/*','menu_reports');
+INSERT INTO fn_restricted_url VALUES('report/wizard/retrieve_sql_tab_wise_data/*','menu_reports');
+INSERT INTO fn_restricted_url VALUES('report/wizard/security/*','menu_reports');
+INSERT INTO fn_restricted_url VALUES('report/wizard/copy_report/*','menu_reports');
+INSERT INTO fn_restricted_url VALUES('report/wizard/save_def_tab_data/*','menu_reports');
+INSERT INTO fn_restricted_url VALUES('report/wizard/retrieve_data/true','menu_reports');
+
+-- fn_role
+Insert into fn_role (ROLE_ID,ROLE_NAME,ACTIVE_YN,PRIORITY) values (16,'Standard User','Y',5);
+Insert into fn_role (ROLE_ID,ROLE_NAME,ACTIVE_YN,PRIORITY) values (1,'System Administrator','Y',1);
+
+-- fn_role_composite
+Insert into fn_role_composite (PARENT_ROLE_ID,CHILD_ROLE_ID) values (1,16);
+
+-- fn_role_function
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'login');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_admin');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_ajax');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_customer');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_customer_create');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_feedback');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_help');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_home');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_job');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_job_create');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_logout');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_notes');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_process');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_profile');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_profile_create');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_profile_import');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_reports');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_sample');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_tab');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'login');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_ajax');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_customer');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_customer_create');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_home');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_logout');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_map');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_profile');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_reports');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_tab');
+
+-- fn_tab
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB1_S1','Left Tab 1','Sub - Sub Tab 1 Information','tab2_sub1.htm','menu_tab','Y',10,'TAB2_SUB1','APP');
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB1','Tab 1','Tab 1 Information','tab1.htm','menu_tab','Y',10,null,'APP');
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2','Tab 2','Tab 2 Information','tab2_sub1.htm','menu_tab','Y',20,null,'APP');
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB3','Tab 3','Tab 3 Information','tab3.htm','menu_tab','Y',30,null,'APP');
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB4','Tab 4','Tab 4 Information','tab4.htm','menu_tab','Y',40,null,'APP');
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB1','Sub Tab 1','Sub Tab 1 Information','tab2_sub1.htm','menu_tab','Y',10,'TAB2','APP');
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB2','Sub Tab 2','Sub Tab 2 Information','tab2_sub2.htm','menu_tab','Y',20,'TAB2','APP');
+Insert into fn_tab (TAB_CD,TAB_NAME,TAB_DESCR,ACTION,FUNCTION_CD,ACTIVE_YN,SORT_ORDER,PARENT_TAB_CD,TAB_SET_CD) values ('TAB2_SUB3','Sub Tab 3','Sub Tab 3 Information','tab2_sub3.htm','menu_tab','Y',30,'TAB2','APP');
+
+-- fn_tab_selected
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB1','tab1');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2','tab2_sub1');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2','tab2_sub2');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2','tab2_sub3');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB1','tab2_sub1');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB1_S1','tab2_sub1');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB2','tab2_sub2');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB2_SUB3','tab2_sub3');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB3','tab3');
+Insert into fn_tab_selected (SELECTED_TAB_CD,TAB_URI) values ('TAB4','tab4');
+
+-- DEMO_BAR_CHART
+Insert into demo_bar_chart (label, value) values ('A', 29.765957771107);
+Insert into demo_bar_chart (label, value) values ('B', 0);
+Insert into demo_bar_chart (label, value) values ('C', 32.807804682612);
+Insert into demo_bar_chart (label, value) values ('D', 196.45946739256);
+Insert into demo_bar_chart (label, value) values ('E', 0.19434030906893);
+Insert into demo_bar_chart (label, value) values ('F', 98.079782601442);
+Insert into demo_bar_chart (label, value) values ('G', 13.925743130903);
+Insert into demo_bar_chart (label, value) values ('H', 5.1387322875705);
+
+-- DEMO_BAR_CHART_INTER
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('6-Mar-13','%e-%b-%y'), 198, 220);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('5-Mar-13','%e-%b-%y'), 198, 220);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('4-Mar-13','%e-%b-%y'), 238, 235);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('3-Mar-13','%e-%b-%y'), 238, 235);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('2-Mar-13','%e-%b-%y'), 256, 275);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('1-Mar-13','%e-%b-%y'), 239, 260);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('28-Feb-13','%e-%b-%y'), 247, 255);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('27-Feb-13','%e-%b-%y'), 252, 265);
+Insert into demo_bar_chart_inter (spam_date, num_rpt_sources, num_det_sources) values (STR_TO_DATE('26-Feb-13','%e-%b-%y'), 198, 220);
+
+-- DEMO_LINE_CHART
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-May-12','%e-%b-%y'),582.13);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Apr-12','%e-%b-%y'),583.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Apr-12','%e-%b-%y'),603);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Apr-12','%e-%b-%y'),607.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Apr-12','%e-%b-%y'),610);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Apr-12','%e-%b-%y'),560.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Apr-12','%e-%b-%y'),571.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Apr-12','%e-%b-%y'),572.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Apr-12','%e-%b-%y'),587.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Apr-12','%e-%b-%y'),608.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Apr-12','%e-%b-%y'),609.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Apr-12','%e-%b-%y'),580.13);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Apr-12','%e-%b-%y'),605.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Apr-12','%e-%b-%y'),622.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Apr-12','%e-%b-%y'),626.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Apr-12','%e-%b-%y'),628.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Apr-12','%e-%b-%y'),636.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Apr-12','%e-%b-%y'),633.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Apr-12','%e-%b-%y'),624.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Apr-12','%e-%b-%y'),629.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Apr-12','%e-%b-%y'),618.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Mar-12','%e-%b-%y'),599.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Mar-12','%e-%b-%y'),609.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Mar-12','%e-%b-%y'),617.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Mar-12','%e-%b-%y'),614.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-12','%e-%b-%y'),606.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Mar-12','%e-%b-%y'),596.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Mar-12','%e-%b-%y'),599.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Mar-12','%e-%b-%y'),602.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Mar-12','%e-%b-%y'),605.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Mar-12','%e-%b-%y'),601.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Mar-12','%e-%b-%y'),585.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Mar-12','%e-%b-%y'),585.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Mar-12','%e-%b-%y'),589.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Mar-12','%e-%b-%y'),568.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Mar-12','%e-%b-%y'),552);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Mar-12','%e-%b-%y'),545.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Mar-12','%e-%b-%y'),541.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Mar-12','%e-%b-%y'),530.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Mar-12','%e-%b-%y'),530.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Mar-12','%e-%b-%y'),533.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Mar-12','%e-%b-%y'),545.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Mar-12','%e-%b-%y'),544.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Feb-12','%e-%b-%y'),542.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Feb-12','%e-%b-%y'),535.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Feb-12','%e-%b-%y'),525.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Feb-12','%e-%b-%y'),522.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Feb-12','%e-%b-%y'),516.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Feb-12','%e-%b-%y'),513.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Feb-12','%e-%b-%y'),514.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-12','%e-%b-%y'),502.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Feb-12','%e-%b-%y'),502.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Feb-12','%e-%b-%y'),497.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Feb-12','%e-%b-%y'),509.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Feb-12','%e-%b-%y'),502.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Feb-12','%e-%b-%y'),493.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Feb-12','%e-%b-%y'),493.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Feb-12','%e-%b-%y'),476.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Feb-12','%e-%b-%y'),468.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Feb-12','%e-%b-%y'),463.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Feb-12','%e-%b-%y'),459.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Feb-12','%e-%b-%y'),455.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Feb-12','%e-%b-%y'),456.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jan-12','%e-%b-%y'),456.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jan-12','%e-%b-%y'),453.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jan-12','%e-%b-%y'),447.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jan-12','%e-%b-%y'),444.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jan-12','%e-%b-%y'),446.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Jan-12','%e-%b-%y'),420.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jan-12','%e-%b-%y'),427.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jan-12','%e-%b-%y'),420.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jan-12','%e-%b-%y'),427.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-12','%e-%b-%y'),429.11);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jan-12','%e-%b-%y'),424.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Jan-12','%e-%b-%y'),419.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jan-12','%e-%b-%y'),421.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jan-12','%e-%b-%y'),422.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jan-12','%e-%b-%y'),423.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Jan-12','%e-%b-%y'),421.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jan-12','%e-%b-%y'),422.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Jan-12','%e-%b-%y'),418.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jan-12','%e-%b-%y'),413.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jan-12','%e-%b-%y'),411.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Dec-11','%e-%b-%y'),405);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Dec-11','%e-%b-%y'),405.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Dec-11','%e-%b-%y'),402.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Dec-11','%e-%b-%y'),406.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Dec-11','%e-%b-%y'),403.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Dec-11','%e-%b-%y'),398.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Dec-11','%e-%b-%y'),396.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Dec-11','%e-%b-%y'),395.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Dec-11','%e-%b-%y'),382.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Dec-11','%e-%b-%y'),381.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Dec-11','%e-%b-%y'),378.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Dec-11','%e-%b-%y'),380.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Dec-11','%e-%b-%y'),388.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Dec-11','%e-%b-%y'),391.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Dec-11','%e-%b-%y'),393.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Dec-11','%e-%b-%y'),390.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Dec-11','%e-%b-%y'),389.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Dec-11','%e-%b-%y'),390.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Dec-11','%e-%b-%y'),393.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Dec-11','%e-%b-%y'),389.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Dec-11','%e-%b-%y'),387.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Nov-11','%e-%b-%y'),382.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Nov-11','%e-%b-%y'),373.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Nov-11','%e-%b-%y'),376.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Nov-11','%e-%b-%y'),363.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Nov-11','%e-%b-%y'),366.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Nov-11','%e-%b-%y'),376.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Nov-11','%e-%b-%y'),369.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Nov-11','%e-%b-%y'),374.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Nov-11','%e-%b-%y'),377.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Nov-11','%e-%b-%y'),384.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Nov-11','%e-%b-%y'),388.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Nov-11','%e-%b-%y'),379.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Nov-11','%e-%b-%y'),384.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Nov-11','%e-%b-%y'),385.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Nov-11','%e-%b-%y'),395.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Nov-11','%e-%b-%y'),406.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Nov-11','%e-%b-%y'),399.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Nov-11','%e-%b-%y'),400.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Nov-11','%e-%b-%y'),403.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Nov-11','%e-%b-%y'),397.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Nov-11','%e-%b-%y'),396.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Oct-11','%e-%b-%y'),404.78);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Oct-11','%e-%b-%y'),404.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Oct-11','%e-%b-%y'),404.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Oct-11','%e-%b-%y'),400.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Oct-11','%e-%b-%y'),397.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Oct-11','%e-%b-%y'),405.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Oct-11','%e-%b-%y'),392.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Oct-11','%e-%b-%y'),395.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Oct-11','%e-%b-%y'),398.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Oct-11','%e-%b-%y'),422.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Oct-11','%e-%b-%y'),419.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Oct-11','%e-%b-%y'),422);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Oct-11','%e-%b-%y'),408.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Oct-11','%e-%b-%y'),402.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Oct-11','%e-%b-%y'),400.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Oct-11','%e-%b-%y'),388.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Oct-11','%e-%b-%y'),369.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Oct-11','%e-%b-%y'),377.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Oct-11','%e-%b-%y'),378.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Oct-11','%e-%b-%y'),372.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Oct-11','%e-%b-%y'),374.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Sep-11','%e-%b-%y'),381.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Sep-11','%e-%b-%y'),390.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Sep-11','%e-%b-%y'),397.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Sep-11','%e-%b-%y'),399.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Sep-11','%e-%b-%y'),403.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Sep-11','%e-%b-%y'),404.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Sep-11','%e-%b-%y'),401.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Sep-11','%e-%b-%y'),412.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Sep-11','%e-%b-%y'),413.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Sep-11','%e-%b-%y'),411.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Sep-11','%e-%b-%y'),400.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Sep-11','%e-%b-%y'),392.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Sep-11','%e-%b-%y'),389.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Sep-11','%e-%b-%y'),384.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Sep-11','%e-%b-%y'),379.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Sep-11','%e-%b-%y'),377.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Sep-11','%e-%b-%y'),384.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Sep-11','%e-%b-%y'),383.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Sep-11','%e-%b-%y'),379.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Sep-11','%e-%b-%y'),374.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Sep-11','%e-%b-%y'),381.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Aug-11','%e-%b-%y'),384.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Aug-11','%e-%b-%y'),389.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Aug-11','%e-%b-%y'),389.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Aug-11','%e-%b-%y'),383.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-11','%e-%b-%y'),373.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Aug-11','%e-%b-%y'),376.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Aug-11','%e-%b-%y'),373.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Aug-11','%e-%b-%y'),356.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-11','%e-%b-%y'),356.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Aug-11','%e-%b-%y'),366.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Aug-11','%e-%b-%y'),380.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Aug-11','%e-%b-%y'),380.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Aug-11','%e-%b-%y'),383.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Aug-11','%e-%b-%y'),376.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Aug-11','%e-%b-%y'),373.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Aug-11','%e-%b-%y'),363.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Aug-11','%e-%b-%y'),374.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Aug-11','%e-%b-%y'),353.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Aug-11','%e-%b-%y'),373.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Aug-11','%e-%b-%y'),377.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Aug-11','%e-%b-%y'),392.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Aug-11','%e-%b-%y'),388.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Aug-11','%e-%b-%y'),396.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jul-11','%e-%b-%y'),390.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jul-11','%e-%b-%y'),391.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Jul-11','%e-%b-%y'),392.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jul-11','%e-%b-%y'),403.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Jul-11','%e-%b-%y'),398.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jul-11','%e-%b-%y'),393.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jul-11','%e-%b-%y'),387.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jul-11','%e-%b-%y'),386.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Jul-11','%e-%b-%y'),376.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jul-11','%e-%b-%y'),373.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Jul-11','%e-%b-%y'),364.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jul-11','%e-%b-%y'),357.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Jul-11','%e-%b-%y'),358.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jul-11','%e-%b-%y'),353.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jul-11','%e-%b-%y'),354);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jul-11','%e-%b-%y'),359.71);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Jul-11','%e-%b-%y'),357.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jul-11','%e-%b-%y'),351.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Jul-11','%e-%b-%y'),349.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jul-11','%e-%b-%y'),343.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jun-11','%e-%b-%y'),335.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jun-11','%e-%b-%y'),334.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Jun-11','%e-%b-%y'),335.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jun-11','%e-%b-%y'),332.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jun-11','%e-%b-%y'),326.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jun-11','%e-%b-%y'),331.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Jun-11','%e-%b-%y'),322.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jun-11','%e-%b-%y'),325.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Jun-11','%e-%b-%y'),315.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jun-11','%e-%b-%y'),320.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jun-11','%e-%b-%y'),325.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jun-11','%e-%b-%y'),326.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jun-11','%e-%b-%y'),332.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jun-11','%e-%b-%y'),326.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Jun-11','%e-%b-%y'),325.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jun-11','%e-%b-%y'),331.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jun-11','%e-%b-%y'),332.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jun-11','%e-%b-%y'),332.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jun-11','%e-%b-%y'),338.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jun-11','%e-%b-%y'),343.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Jun-11','%e-%b-%y'),346.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jun-11','%e-%b-%y'),345.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-May-11','%e-%b-%y'),347.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-May-11','%e-%b-%y'),337.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-May-11','%e-%b-%y'),335);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-May-11','%e-%b-%y'),336.78);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-May-11','%e-%b-%y'),332.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-May-11','%e-%b-%y'),334.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-May-11','%e-%b-%y'),335.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-11','%e-%b-%y'),340.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-May-11','%e-%b-%y'),339.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-May-11','%e-%b-%y'),336.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-May-11','%e-%b-%y'),333.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-11','%e-%b-%y'),340.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-May-11','%e-%b-%y'),346.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-May-11','%e-%b-%y'),347.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-May-11','%e-%b-%y'),349.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-May-11','%e-%b-%y'),347.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-May-11','%e-%b-%y'),346.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-11','%e-%b-%y'),346.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-May-11','%e-%b-%y'),349.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-May-11','%e-%b-%y'),348.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-May-11','%e-%b-%y'),346.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-11','%e-%b-%y'),350.13);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Apr-11','%e-%b-%y'),346.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Apr-11','%e-%b-%y'),350.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Apr-11','%e-%b-%y'),350.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Apr-11','%e-%b-%y'),353.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Apr-11','%e-%b-%y'),350.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Apr-11','%e-%b-%y'),342.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Apr-11','%e-%b-%y'),337.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Apr-11','%e-%b-%y'),331.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Apr-11','%e-%b-%y'),327.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Apr-11','%e-%b-%y'),332.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Apr-11','%e-%b-%y'),336.13);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Apr-11','%e-%b-%y'),332.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Apr-11','%e-%b-%y'),330.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Apr-11','%e-%b-%y'),335.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Apr-11','%e-%b-%y'),338.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Apr-11','%e-%b-%y'),338.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Apr-11','%e-%b-%y'),338.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Apr-11','%e-%b-%y'),341.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Apr-11','%e-%b-%y'),344.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Mar-11','%e-%b-%y'),348.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Mar-11','%e-%b-%y'),348.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Mar-11','%e-%b-%y'),350.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Mar-11','%e-%b-%y'),350.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Mar-11','%e-%b-%y'),351.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Mar-11','%e-%b-%y'),344.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Mar-11','%e-%b-%y'),339.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Mar-11','%e-%b-%y'),341.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Mar-11','%e-%b-%y'),339.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Mar-11','%e-%b-%y'),330.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Mar-11','%e-%b-%y'),334.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Mar-11','%e-%b-%y'),330.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Mar-11','%e-%b-%y'),345.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Mar-11','%e-%b-%y'),353.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Mar-11','%e-%b-%y'),351.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Mar-11','%e-%b-%y'),346.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Mar-11','%e-%b-%y'),352.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Mar-11','%e-%b-%y'),355.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Mar-11','%e-%b-%y'),355.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Mar-11','%e-%b-%y'),360);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Mar-11','%e-%b-%y'),359.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Mar-11','%e-%b-%y'),352.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Mar-11','%e-%b-%y'),349.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Feb-11','%e-%b-%y'),353.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Feb-11','%e-%b-%y'),348.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Feb-11','%e-%b-%y'),342.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Feb-11','%e-%b-%y'),342.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Feb-11','%e-%b-%y'),338.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Feb-11','%e-%b-%y'),350.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-11','%e-%b-%y'),358.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Feb-11','%e-%b-%y'),363.13);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Feb-11','%e-%b-%y'),359.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Feb-11','%e-%b-%y'),359.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Feb-11','%e-%b-%y'),356.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Feb-11','%e-%b-%y'),354.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Feb-11','%e-%b-%y'),358.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Feb-11','%e-%b-%y'),355.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Feb-11','%e-%b-%y'),351.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Feb-11','%e-%b-%y'),346.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Feb-11','%e-%b-%y'),343.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Feb-11','%e-%b-%y'),344.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Feb-11','%e-%b-%y'),345.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jan-11','%e-%b-%y'),339.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Jan-11','%e-%b-%y'),336.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jan-11','%e-%b-%y'),343.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jan-11','%e-%b-%y'),343.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jan-11','%e-%b-%y'),341.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Jan-11','%e-%b-%y'),337.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jan-11','%e-%b-%y'),326.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jan-11','%e-%b-%y'),332.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jan-11','%e-%b-%y'),338.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-11','%e-%b-%y'),340.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jan-11','%e-%b-%y'),348.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Jan-11','%e-%b-%y'),345.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jan-11','%e-%b-%y'),344.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jan-11','%e-%b-%y'),341.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jan-11','%e-%b-%y'),342.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jan-11','%e-%b-%y'),336.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jan-11','%e-%b-%y'),333.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Jan-11','%e-%b-%y'),334);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jan-11','%e-%b-%y'),331.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jan-11','%e-%b-%y'),329.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Dec-10','%e-%b-%y'),322.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Dec-10','%e-%b-%y'),323.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Dec-10','%e-%b-%y'),325.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Dec-10','%e-%b-%y'),325.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Dec-10','%e-%b-%y'),324.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Dec-10','%e-%b-%y'),323.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Dec-10','%e-%b-%y'),325.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Dec-10','%e-%b-%y'),324.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Dec-10','%e-%b-%y'),322.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Dec-10','%e-%b-%y'),320.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Dec-10','%e-%b-%y'),321.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Dec-10','%e-%b-%y'),320.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Dec-10','%e-%b-%y'),320.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Dec-10','%e-%b-%y'),321.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-10','%e-%b-%y'),320.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Dec-10','%e-%b-%y'),319.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Dec-10','%e-%b-%y'),321.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Dec-10','%e-%b-%y'),318.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Dec-10','%e-%b-%y'),320.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Dec-10','%e-%b-%y'),317.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Dec-10','%e-%b-%y'),318.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Dec-10','%e-%b-%y'),316.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Nov-10','%e-%b-%y'),311.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Nov-10','%e-%b-%y'),316.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-10','%e-%b-%y'),315);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Nov-10','%e-%b-%y'),314.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Nov-10','%e-%b-%y'),308.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Nov-10','%e-%b-%y'),313.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Nov-10','%e-%b-%y'),306.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Nov-10','%e-%b-%y'),308.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Nov-10','%e-%b-%y'),300.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Nov-10','%e-%b-%y'),301.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Nov-10','%e-%b-%y'),307.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Nov-10','%e-%b-%y'),308.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Nov-10','%e-%b-%y'),316.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Nov-10','%e-%b-%y'),318.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Nov-10','%e-%b-%y'),316.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Nov-10','%e-%b-%y'),318.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Nov-10','%e-%b-%y'),317.13);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Nov-10','%e-%b-%y'),318.27);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Nov-10','%e-%b-%y'),312.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Nov-10','%e-%b-%y'),309.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Nov-10','%e-%b-%y'),304.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Oct-10','%e-%b-%y'),300.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Oct-10','%e-%b-%y'),305.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Oct-10','%e-%b-%y'),307.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Oct-10','%e-%b-%y'),308.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Oct-10','%e-%b-%y'),308.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Oct-10','%e-%b-%y'),307.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Oct-10','%e-%b-%y'),309.52);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Oct-10','%e-%b-%y'),310.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Oct-10','%e-%b-%y'),309.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Oct-10','%e-%b-%y'),318);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Oct-10','%e-%b-%y'),314.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Oct-10','%e-%b-%y'),302.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Oct-10','%e-%b-%y'),300.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Oct-10','%e-%b-%y'),298.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Oct-10','%e-%b-%y'),295.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Oct-10','%e-%b-%y'),294.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Oct-10','%e-%b-%y'),289.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Oct-10','%e-%b-%y'),289.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Oct-10','%e-%b-%y'),288.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Oct-10','%e-%b-%y'),278.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Oct-10','%e-%b-%y'),282.52);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Sep-10','%e-%b-%y'),283.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Sep-10','%e-%b-%y'),287.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Sep-10','%e-%b-%y'),286.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Sep-10','%e-%b-%y'),291.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Sep-10','%e-%b-%y'),292.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Sep-10','%e-%b-%y'),288.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Sep-10','%e-%b-%y'),287.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Sep-10','%e-%b-%y'),283.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Sep-10','%e-%b-%y'),283.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Sep-10','%e-%b-%y'),275.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Sep-10','%e-%b-%y'),276.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Sep-10','%e-%b-%y'),270.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Sep-10','%e-%b-%y'),268.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Sep-10','%e-%b-%y'),267.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Sep-10','%e-%b-%y'),263.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Sep-10','%e-%b-%y'),263.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Sep-10','%e-%b-%y'),262.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Sep-10','%e-%b-%y'),257.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Sep-10','%e-%b-%y'),258.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Sep-10','%e-%b-%y'),258.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Sep-10','%e-%b-%y'),252.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Sep-10','%e-%b-%y'),250.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Aug-10','%e-%b-%y'),243.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Aug-10','%e-%b-%y'),242.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Aug-10','%e-%b-%y'),241.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Aug-10','%e-%b-%y'),240.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-10','%e-%b-%y'),242.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Aug-10','%e-%b-%y'),239.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Aug-10','%e-%b-%y'),245.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Aug-10','%e-%b-%y'),249.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-10','%e-%b-%y'),249.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Aug-10','%e-%b-%y'),253.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Aug-10','%e-%b-%y'),251.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Aug-10','%e-%b-%y'),247.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Aug-10','%e-%b-%y'),249.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Aug-10','%e-%b-%y'),251.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Aug-10','%e-%b-%y'),250.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Aug-10','%e-%b-%y'),259.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Aug-10','%e-%b-%y'),261.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Aug-10','%e-%b-%y'),260.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Aug-10','%e-%b-%y'),261.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Aug-10','%e-%b-%y'),262.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Aug-10','%e-%b-%y'),261.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Aug-10','%e-%b-%y'),261.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jul-10','%e-%b-%y'),257.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jul-10','%e-%b-%y'),258.11);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jul-10','%e-%b-%y'),260.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Jul-10','%e-%b-%y'),264.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jul-10','%e-%b-%y'),259.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jul-10','%e-%b-%y'),259.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jul-10','%e-%b-%y'),259.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jul-10','%e-%b-%y'),254.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jul-10','%e-%b-%y'),251.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Jul-10','%e-%b-%y'),245.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Jul-10','%e-%b-%y'),249.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Jul-10','%e-%b-%y'),251.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jul-10','%e-%b-%y'),252.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Jul-10','%e-%b-%y'),251.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jul-10','%e-%b-%y'),257.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Jul-10','%e-%b-%y'),259.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jul-10','%e-%b-%y'),258.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jul-10','%e-%b-%y'),258.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jul-10','%e-%b-%y'),248.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Jul-10','%e-%b-%y'),246.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Jul-10','%e-%b-%y'),246.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Jul-10','%e-%b-%y'),248.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jun-10','%e-%b-%y'),251.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jun-10','%e-%b-%y'),256.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jun-10','%e-%b-%y'),268.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Jun-10','%e-%b-%y'),266.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Jun-10','%e-%b-%y'),269);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Jun-10','%e-%b-%y'),270.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jun-10','%e-%b-%y'),273.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jun-10','%e-%b-%y'),270.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jun-10','%e-%b-%y'),274.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Jun-10','%e-%b-%y'),271.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Jun-10','%e-%b-%y'),267.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Jun-10','%e-%b-%y'),259.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jun-10','%e-%b-%y'),254.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jun-10','%e-%b-%y'),253.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jun-10','%e-%b-%y'),250.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Jun-10','%e-%b-%y'),243.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jun-10','%e-%b-%y'),249.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Jun-10','%e-%b-%y'),250.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jun-10','%e-%b-%y'),255.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jun-10','%e-%b-%y'),263.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Jun-10','%e-%b-%y'),263.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Jun-10','%e-%b-%y'),260.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-May-10','%e-%b-%y'),256.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-May-10','%e-%b-%y'),256.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-May-10','%e-%b-%y'),253.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-May-10','%e-%b-%y'),244.11);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-May-10','%e-%b-%y'),245.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-May-10','%e-%b-%y'),246.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-May-10','%e-%b-%y'),242.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-May-10','%e-%b-%y'),237.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-10','%e-%b-%y'),248.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-May-10','%e-%b-%y'),252.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-May-10','%e-%b-%y'),254.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-May-10','%e-%b-%y'),253.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-10','%e-%b-%y'),258.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-May-10','%e-%b-%y'),262.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-May-10','%e-%b-%y'),256.52);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-May-10','%e-%b-%y'),253.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-May-10','%e-%b-%y'),235.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-May-10','%e-%b-%y'),246.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-10','%e-%b-%y'),255.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-May-10','%e-%b-%y'),258.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-May-10','%e-%b-%y'),266.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Apr-10','%e-%b-%y'),261.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-10','%e-%b-%y'),268.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Apr-10','%e-%b-%y'),261.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Apr-10','%e-%b-%y'),262.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Apr-10','%e-%b-%y'),269.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Apr-10','%e-%b-%y'),270.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Apr-10','%e-%b-%y'),266.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Apr-10','%e-%b-%y'),259.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Apr-10','%e-%b-%y'),244.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Apr-10','%e-%b-%y'),247.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Apr-10','%e-%b-%y'),247.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Apr-10','%e-%b-%y'),248.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Apr-10','%e-%b-%y'),245.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Apr-10','%e-%b-%y'),242.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Apr-10','%e-%b-%y'),242.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Apr-10','%e-%b-%y'),241.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Apr-10','%e-%b-%y'),239.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Apr-10','%e-%b-%y'),240.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Apr-10','%e-%b-%y'),239.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Apr-10','%e-%b-%y'),238.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Apr-10','%e-%b-%y'),235.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Apr-10','%e-%b-%y'),235.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('31-Mar-10','%e-%b-%y'),235);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Mar-10','%e-%b-%y'),235.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Mar-10','%e-%b-%y'),232.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-10','%e-%b-%y'),230.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Mar-10','%e-%b-%y'),226.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Mar-10','%e-%b-%y'),229.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Mar-10','%e-%b-%y'),228.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Mar-10','%e-%b-%y'),224.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Mar-10','%e-%b-%y'),222.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Mar-10','%e-%b-%y'),224.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Mar-10','%e-%b-%y'),224.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Mar-10','%e-%b-%y'),224.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('15-Mar-10','%e-%b-%y'),223.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Mar-10','%e-%b-%y'),226.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Mar-10','%e-%b-%y'),225.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Mar-10','%e-%b-%y'),224.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Mar-10','%e-%b-%y'),223.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Mar-10','%e-%b-%y'),219.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Mar-10','%e-%b-%y'),218.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Mar-10','%e-%b-%y'),210.71);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Mar-10','%e-%b-%y'),209.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Mar-10','%e-%b-%y'),208.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Mar-10','%e-%b-%y'),208.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Feb-10','%e-%b-%y'),204.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Feb-10','%e-%b-%y'),202);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Feb-10','%e-%b-%y'),200.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Feb-10','%e-%b-%y'),197.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Feb-10','%e-%b-%y'),200.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Feb-10','%e-%b-%y'),201.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Feb-10','%e-%b-%y'),202.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-10','%e-%b-%y'),202.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Feb-10','%e-%b-%y'),203.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Feb-10','%e-%b-%y'),200.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Feb-10','%e-%b-%y'),200.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Feb-10','%e-%b-%y'),198.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Feb-10','%e-%b-%y'),195.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Feb-10','%e-%b-%y'),196.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Feb-10','%e-%b-%y'),194.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Feb-10','%e-%b-%y'),195.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Feb-10','%e-%b-%y'),192.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Feb-10','%e-%b-%y'),199.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Feb-10','%e-%b-%y'),195.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Feb-10','%e-%b-%y'),194.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jan-10','%e-%b-%y'),192.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Jan-10','%e-%b-%y'),199.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jan-10','%e-%b-%y'),207.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jan-10','%e-%b-%y'),205.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jan-10','%e-%b-%y'),203.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Jan-10','%e-%b-%y'),197.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jan-10','%e-%b-%y'),208.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jan-10','%e-%b-%y'),211.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jan-10','%e-%b-%y'),215.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-10','%e-%b-%y'),205.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jan-10','%e-%b-%y'),205.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Jan-10','%e-%b-%y'),209.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jan-10','%e-%b-%y'),210.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Jan-10','%e-%b-%y'),207.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jan-10','%e-%b-%y'),210.11);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jan-10','%e-%b-%y'),211.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jan-10','%e-%b-%y'),210.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Jan-10','%e-%b-%y'),210.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jan-10','%e-%b-%y'),214.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Jan-10','%e-%b-%y'),214.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jan-10','%e-%b-%y'),210.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Dec-09','%e-%b-%y'),210.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Dec-09','%e-%b-%y'),211.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Dec-09','%e-%b-%y'),209.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Dec-09','%e-%b-%y'),211.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Dec-09','%e-%b-%y'),209.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Dec-09','%e-%b-%y'),209.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Dec-09','%e-%b-%y'),202.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Dec-09','%e-%b-%y'),200.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Dec-09','%e-%b-%y'),198.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Dec-09','%e-%b-%y'),195.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Dec-09','%e-%b-%y'),191.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Dec-09','%e-%b-%y'),195.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Dec-09','%e-%b-%y'),194.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Dec-09','%e-%b-%y'),196.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Dec-09','%e-%b-%y'),194.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-09','%e-%b-%y'),196.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Dec-09','%e-%b-%y'),197.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Dec-09','%e-%b-%y'),189.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Dec-09','%e-%b-%y'),188.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Dec-09','%e-%b-%y'),193.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Dec-09','%e-%b-%y'),196.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Dec-09','%e-%b-%y'),196.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Dec-09','%e-%b-%y'),196.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Nov-09','%e-%b-%y'),199.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Nov-09','%e-%b-%y'),200.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-09','%e-%b-%y'),204.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Nov-09','%e-%b-%y'),204.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Nov-09','%e-%b-%y'),204.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Nov-09','%e-%b-%y'),205.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Nov-09','%e-%b-%y'),199.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Nov-09','%e-%b-%y'),200.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Nov-09','%e-%b-%y'),205.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Nov-09','%e-%b-%y'),207);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Nov-09','%e-%b-%y'),206.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Nov-09','%e-%b-%y'),204.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Nov-09','%e-%b-%y'),201.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Nov-09','%e-%b-%y'),203.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Nov-09','%e-%b-%y'),202.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Nov-09','%e-%b-%y'),201.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Nov-09','%e-%b-%y'),194.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Nov-09','%e-%b-%y'),194.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Nov-09','%e-%b-%y'),190.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Nov-09','%e-%b-%y'),188.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Nov-09','%e-%b-%y'),189.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Oct-09','%e-%b-%y'),188.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Oct-09','%e-%b-%y'),196.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Oct-09','%e-%b-%y'),192.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Oct-09','%e-%b-%y'),197.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Oct-09','%e-%b-%y'),202.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Oct-09','%e-%b-%y'),203.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Oct-09','%e-%b-%y'),205.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Oct-09','%e-%b-%y'),204.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Oct-09','%e-%b-%y'),198.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Oct-09','%e-%b-%y'),189.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Oct-09','%e-%b-%y'),188.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Oct-09','%e-%b-%y'),190.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Oct-09','%e-%b-%y'),191.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Oct-09','%e-%b-%y'),190.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Oct-09','%e-%b-%y'),190.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Oct-09','%e-%b-%y'),190.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Oct-09','%e-%b-%y'),189.27);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Oct-09','%e-%b-%y'),190.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Oct-09','%e-%b-%y'),190.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Oct-09','%e-%b-%y'),186.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Oct-09','%e-%b-%y'),184.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Oct-09','%e-%b-%y'),180.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Sep-09','%e-%b-%y'),185.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Sep-09','%e-%b-%y'),185.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Sep-09','%e-%b-%y'),186.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Sep-09','%e-%b-%y'),182.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Sep-09','%e-%b-%y'),183.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Sep-09','%e-%b-%y'),185.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Sep-09','%e-%b-%y'),184.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Sep-09','%e-%b-%y'),184.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Sep-09','%e-%b-%y'),185.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Sep-09','%e-%b-%y'),184.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Sep-09','%e-%b-%y'),181.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Sep-09','%e-%b-%y'),175.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Sep-09','%e-%b-%y'),173.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Sep-09','%e-%b-%y'),172.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Sep-09','%e-%b-%y'),172.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Sep-09','%e-%b-%y'),171.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Sep-09','%e-%b-%y'),172.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Sep-09','%e-%b-%y'),170.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Sep-09','%e-%b-%y'),166.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Sep-09','%e-%b-%y'),165.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Sep-09','%e-%b-%y'),165.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Aug-09','%e-%b-%y'),168.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Aug-09','%e-%b-%y'),170.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Aug-09','%e-%b-%y'),169.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Aug-09','%e-%b-%y'),167.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-09','%e-%b-%y'),169.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Aug-09','%e-%b-%y'),169.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Aug-09','%e-%b-%y'),169.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Aug-09','%e-%b-%y'),166.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-09','%e-%b-%y'),164.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Aug-09','%e-%b-%y'),164);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Aug-09','%e-%b-%y'),159.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Aug-09','%e-%b-%y'),166.78);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Aug-09','%e-%b-%y'),168.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Aug-09','%e-%b-%y'),165.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Aug-09','%e-%b-%y'),164.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Aug-09','%e-%b-%y'),165.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Aug-09','%e-%b-%y'),163.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Aug-09','%e-%b-%y'),165.11);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Aug-09','%e-%b-%y'),165.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Aug-09','%e-%b-%y'),166.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jul-09','%e-%b-%y'),163.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jul-09','%e-%b-%y'),162.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jul-09','%e-%b-%y'),160.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Jul-09','%e-%b-%y'),160);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jul-09','%e-%b-%y'),160.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jul-09','%e-%b-%y'),159.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jul-09','%e-%b-%y'),157.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Jul-09','%e-%b-%y'),156.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Jul-09','%e-%b-%y'),151.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Jul-09','%e-%b-%y'),152.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jul-09','%e-%b-%y'),151.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jul-09','%e-%b-%y'),147.52);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jul-09','%e-%b-%y'),146.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jul-09','%e-%b-%y'),142.27);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jul-09','%e-%b-%y'),142.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Jul-09','%e-%b-%y'),138.52);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jul-09','%e-%b-%y'),136.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jul-09','%e-%b-%y'),137.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jul-09','%e-%b-%y'),135.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jul-09','%e-%b-%y'),138.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jul-09','%e-%b-%y'),140.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Jul-09','%e-%b-%y'),140.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jul-09','%e-%b-%y'),142.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jun-09','%e-%b-%y'),142.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Jun-09','%e-%b-%y'),141.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jun-09','%e-%b-%y'),142.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jun-09','%e-%b-%y'),139.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Jun-09','%e-%b-%y'),136.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jun-09','%e-%b-%y'),134.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Jun-09','%e-%b-%y'),137.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jun-09','%e-%b-%y'),139.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jun-09','%e-%b-%y'),135.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jun-09','%e-%b-%y'),135.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Jun-09','%e-%b-%y'),136.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jun-09','%e-%b-%y'),136.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Jun-09','%e-%b-%y'),136.97);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jun-09','%e-%b-%y'),139.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Jun-09','%e-%b-%y'),140.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jun-09','%e-%b-%y'),142.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Jun-09','%e-%b-%y'),143.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jun-09','%e-%b-%y'),144.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Jun-09','%e-%b-%y'),143.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jun-09','%e-%b-%y'),140.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jun-09','%e-%b-%y'),139.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jun-09','%e-%b-%y'),139.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-May-09','%e-%b-%y'),135.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-May-09','%e-%b-%y'),135.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-May-09','%e-%b-%y'),133.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-May-09','%e-%b-%y'),130.78);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-May-09','%e-%b-%y'),122.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-May-09','%e-%b-%y'),124.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-May-09','%e-%b-%y'),125.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-09','%e-%b-%y'),127.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-May-09','%e-%b-%y'),126.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-May-09','%e-%b-%y'),122.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-May-09','%e-%b-%y'),122.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-09','%e-%b-%y'),119.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-May-09','%e-%b-%y'),124.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-May-09','%e-%b-%y'),129.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-May-09','%e-%b-%y'),129.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-May-09','%e-%b-%y'),129.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-May-09','%e-%b-%y'),132.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-09','%e-%b-%y'),132.71);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-May-09','%e-%b-%y'),132.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-May-09','%e-%b-%y'),127.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Apr-09','%e-%b-%y'),125.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-09','%e-%b-%y'),125.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Apr-09','%e-%b-%y'),123.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Apr-09','%e-%b-%y'),124.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Apr-09','%e-%b-%y'),123.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Apr-09','%e-%b-%y'),125.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Apr-09','%e-%b-%y'),121.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Apr-09','%e-%b-%y'),121.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Apr-09','%e-%b-%y'),120.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Apr-09','%e-%b-%y'),123.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Apr-09','%e-%b-%y'),121.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Apr-09','%e-%b-%y'),117.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Apr-09','%e-%b-%y'),118.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Apr-09','%e-%b-%y'),120.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Apr-09','%e-%b-%y'),119.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Apr-09','%e-%b-%y'),119.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Apr-09','%e-%b-%y'),116.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Apr-09','%e-%b-%y'),115);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Apr-09','%e-%b-%y'),118.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Apr-09','%e-%b-%y'),115.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Apr-09','%e-%b-%y'),112.71);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Apr-09','%e-%b-%y'),108.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('31-Mar-09','%e-%b-%y'),105.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Mar-09','%e-%b-%y'),104.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Mar-09','%e-%b-%y'),106.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-09','%e-%b-%y'),109.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Mar-09','%e-%b-%y'),106.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Mar-09','%e-%b-%y'),106.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Mar-09','%e-%b-%y'),107.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Mar-09','%e-%b-%y'),101.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Mar-09','%e-%b-%y'),101.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Mar-09','%e-%b-%y'),101.52);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Mar-09','%e-%b-%y'),99.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Mar-09','%e-%b-%y'),95.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Mar-09','%e-%b-%y'),95.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Mar-09','%e-%b-%y'),96.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Mar-09','%e-%b-%y'),92.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Mar-09','%e-%b-%y'),88.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Mar-09','%e-%b-%y'),83.11);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Mar-09','%e-%b-%y'),85.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Mar-09','%e-%b-%y'),88.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Mar-09','%e-%b-%y'),91.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Mar-09','%e-%b-%y'),88.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Mar-09','%e-%b-%y'),87.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Feb-09','%e-%b-%y'),89.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Feb-09','%e-%b-%y'),89.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Feb-09','%e-%b-%y'),91.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Feb-09','%e-%b-%y'),90.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Feb-09','%e-%b-%y'),86.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Feb-09','%e-%b-%y'),91.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Feb-09','%e-%b-%y'),90.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Feb-09','%e-%b-%y'),94.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Feb-09','%e-%b-%y'),94.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Feb-09','%e-%b-%y'),99.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Feb-09','%e-%b-%y'),99.27);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Feb-09','%e-%b-%y'),96.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Feb-09','%e-%b-%y'),97.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Feb-09','%e-%b-%y'),102.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Feb-09','%e-%b-%y'),99.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Feb-09','%e-%b-%y'),96.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Feb-09','%e-%b-%y'),93.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Feb-09','%e-%b-%y'),92.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Feb-09','%e-%b-%y'),91.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jan-09','%e-%b-%y'),90.13);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Jan-09','%e-%b-%y'),93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jan-09','%e-%b-%y'),94.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Jan-09','%e-%b-%y'),90.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jan-09','%e-%b-%y'),89.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jan-09','%e-%b-%y'),88.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jan-09','%e-%b-%y'),88.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Jan-09','%e-%b-%y'),82.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jan-09','%e-%b-%y'),78.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jan-09','%e-%b-%y'),82.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jan-09','%e-%b-%y'),83.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jan-09','%e-%b-%y'),85.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jan-09','%e-%b-%y'),87.71);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Jan-09','%e-%b-%y'),88.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jan-09','%e-%b-%y'),90.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Jan-09','%e-%b-%y'),92.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jan-09','%e-%b-%y'),91.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jan-09','%e-%b-%y'),93.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jan-09','%e-%b-%y'),94.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Jan-09','%e-%b-%y'),90.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jan-09','%e-%b-%y'),85.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Dec-08','%e-%b-%y'),85.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Dec-08','%e-%b-%y'),86.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Dec-08','%e-%b-%y'),86.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Dec-08','%e-%b-%y'),85.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Dec-08','%e-%b-%y'),85.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Dec-08','%e-%b-%y'),85.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Dec-08','%e-%b-%y'),86.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Dec-08','%e-%b-%y'),85.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Dec-08','%e-%b-%y'),90);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Dec-08','%e-%b-%y'),89.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Dec-08','%e-%b-%y'),89.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Dec-08','%e-%b-%y'),95.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Dec-08','%e-%b-%y'),94.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Dec-08','%e-%b-%y'),98.27);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Dec-08','%e-%b-%y'),95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-08','%e-%b-%y'),98.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Dec-08','%e-%b-%y'),100.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Dec-08','%e-%b-%y'),99.72);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Dec-08','%e-%b-%y'),94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Dec-08','%e-%b-%y'),91.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Dec-08','%e-%b-%y'),95.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Dec-08','%e-%b-%y'),92.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-Dec-08','%e-%b-%y'),88.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Nov-08','%e-%b-%y'),92.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Nov-08','%e-%b-%y'),95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-08','%e-%b-%y'),95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Nov-08','%e-%b-%y'),90.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Nov-08','%e-%b-%y'),92.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Nov-08','%e-%b-%y'),82.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Nov-08','%e-%b-%y'),80.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Nov-08','%e-%b-%y'),86.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Nov-08','%e-%b-%y'),89.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Nov-08','%e-%b-%y'),88.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Nov-08','%e-%b-%y'),90.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Nov-08','%e-%b-%y'),96.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Nov-08','%e-%b-%y'),90.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Nov-08','%e-%b-%y'),94.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Nov-08','%e-%b-%y'),95.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Nov-08','%e-%b-%y'),98.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Nov-08','%e-%b-%y'),99.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Nov-08','%e-%b-%y'),103.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Nov-08','%e-%b-%y'),110.99);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Nov-08','%e-%b-%y'),106.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Oct-08','%e-%b-%y'),107.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Oct-08','%e-%b-%y'),111.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Oct-08','%e-%b-%y'),104.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Oct-08','%e-%b-%y'),99.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Oct-08','%e-%b-%y'),92.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Oct-08','%e-%b-%y'),96.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Oct-08','%e-%b-%y'),98.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Oct-08','%e-%b-%y'),96.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Oct-08','%e-%b-%y'),91.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Oct-08','%e-%b-%y'),98.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Oct-08','%e-%b-%y'),97.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Oct-08','%e-%b-%y'),101.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Oct-08','%e-%b-%y'),97.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Oct-08','%e-%b-%y'),104.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Oct-08','%e-%b-%y'),110.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Oct-08','%e-%b-%y'),96.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Oct-08','%e-%b-%y'),88.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Oct-08','%e-%b-%y'),89.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Oct-08','%e-%b-%y'),89.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Oct-08','%e-%b-%y'),98.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Oct-08','%e-%b-%y'),97.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('2-Oct-08','%e-%b-%y'),100.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Oct-08','%e-%b-%y'),109.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Sep-08','%e-%b-%y'),113.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Sep-08','%e-%b-%y'),105.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Sep-08','%e-%b-%y'),128.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Sep-08','%e-%b-%y'),131.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('24-Sep-08','%e-%b-%y'),128.71);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Sep-08','%e-%b-%y'),126.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Sep-08','%e-%b-%y'),131.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Sep-08','%e-%b-%y'),140.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Sep-08','%e-%b-%y'),134.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Sep-08','%e-%b-%y'),127.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Sep-08','%e-%b-%y'),139.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Sep-08','%e-%b-%y'),140.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Sep-08','%e-%b-%y'),148.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Sep-08','%e-%b-%y'),152.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Sep-08','%e-%b-%y'),151.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Sep-08','%e-%b-%y'),151.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Sep-08','%e-%b-%y'),157.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Sep-08','%e-%b-%y'),160.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Sep-08','%e-%b-%y'),161.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Sep-08','%e-%b-%y'),166.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Sep-08','%e-%b-%y'),166.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Aug-08','%e-%b-%y'),169.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Aug-08','%e-%b-%y'),173.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Aug-08','%e-%b-%y'),174.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Aug-08','%e-%b-%y'),173.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Aug-08','%e-%b-%y'),172.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-Aug-08','%e-%b-%y'),176.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Aug-08','%e-%b-%y'),174.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Aug-08','%e-%b-%y'),175.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Aug-08','%e-%b-%y'),173.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Aug-08','%e-%b-%y'),175.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Aug-08','%e-%b-%y'),175.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Aug-08','%e-%b-%y'),179.32);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Aug-08','%e-%b-%y'),179.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Aug-08','%e-%b-%y'),176.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Aug-08','%e-%b-%y'),173.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Aug-08','%e-%b-%y'),169.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Aug-08','%e-%b-%y'),163.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Aug-08','%e-%b-%y'),164.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Aug-08','%e-%b-%y'),160.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Aug-08','%e-%b-%y'),153.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Aug-08','%e-%b-%y'),156.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Jul-08','%e-%b-%y'),158.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jul-08','%e-%b-%y'),159.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jul-08','%e-%b-%y'),157.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jul-08','%e-%b-%y'),154.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Jul-08','%e-%b-%y'),162.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Jul-08','%e-%b-%y'),159.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jul-08','%e-%b-%y'),166.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jul-08','%e-%b-%y'),162.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Jul-08','%e-%b-%y'),166.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jul-08','%e-%b-%y'),165.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Jul-08','%e-%b-%y'),171.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Jul-08','%e-%b-%y'),172.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Jul-08','%e-%b-%y'),169.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jul-08','%e-%b-%y'),173.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jul-08','%e-%b-%y'),172.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Jul-08','%e-%b-%y'),176.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-Jul-08','%e-%b-%y'),174.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jul-08','%e-%b-%y'),179.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jul-08','%e-%b-%y'),175.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jul-08','%e-%b-%y'),170.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jul-08','%e-%b-%y'),168.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Jul-08','%e-%b-%y'),174.68);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Jun-08','%e-%b-%y'),167.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jun-08','%e-%b-%y'),170.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Jun-08','%e-%b-%y'),168.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jun-08','%e-%b-%y'),177.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jun-08','%e-%b-%y'),173.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jun-08','%e-%b-%y'),173.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('20-Jun-08','%e-%b-%y'),175.27);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jun-08','%e-%b-%y'),180.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jun-08','%e-%b-%y'),178.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jun-08','%e-%b-%y'),181.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jun-08','%e-%b-%y'),176.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jun-08','%e-%b-%y'),172.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Jun-08','%e-%b-%y'),173.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jun-08','%e-%b-%y'),180.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Jun-08','%e-%b-%y'),185.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jun-08','%e-%b-%y'),181.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jun-08','%e-%b-%y'),185.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jun-08','%e-%b-%y'),189.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Jun-08','%e-%b-%y'),185.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jun-08','%e-%b-%y'),185.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jun-08','%e-%b-%y'),186.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-May-08','%e-%b-%y'),188.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-May-08','%e-%b-%y'),186.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-May-08','%e-%b-%y'),187.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-May-08','%e-%b-%y'),186.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-May-08','%e-%b-%y'),181.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('22-May-08','%e-%b-%y'),177.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-May-08','%e-%b-%y'),178.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-May-08','%e-%b-%y'),185.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-May-08','%e-%b-%y'),183.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-May-08','%e-%b-%y'),187.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-May-08','%e-%b-%y'),189.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-May-08','%e-%b-%y'),186.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-May-08','%e-%b-%y'),189.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-May-08','%e-%b-%y'),188.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-May-08','%e-%b-%y'),183.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-May-08','%e-%b-%y'),185.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-May-08','%e-%b-%y'),182.59);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-May-08','%e-%b-%y'),186.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-May-08','%e-%b-%y'),184.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-May-08','%e-%b-%y'),180.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-May-08','%e-%b-%y'),180);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('30-Apr-08','%e-%b-%y'),173.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-Apr-08','%e-%b-%y'),175.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('28-Apr-08','%e-%b-%y'),172.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Apr-08','%e-%b-%y'),169.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Apr-08','%e-%b-%y'),168.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Apr-08','%e-%b-%y'),162.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('22-Apr-08','%e-%b-%y'),160.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Apr-08','%e-%b-%y'),168.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Apr-08','%e-%b-%y'),161.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Apr-08','%e-%b-%y'),154.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Apr-08','%e-%b-%y'),153.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Apr-08','%e-%b-%y'),148.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Apr-08','%e-%b-%y'),147.78);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Apr-08','%e-%b-%y'),147.14);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Apr-08','%e-%b-%y'),154.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Apr-08','%e-%b-%y'),151.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Apr-08','%e-%b-%y'),152.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Apr-08','%e-%b-%y'),155.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Apr-08','%e-%b-%y'),153.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Apr-08','%e-%b-%y'),151.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Apr-08','%e-%b-%y'),147.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Apr-08','%e-%b-%y'),149.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Mar-08','%e-%b-%y'),143.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Mar-08','%e-%b-%y'),143.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('27-Mar-08','%e-%b-%y'),140.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Mar-08','%e-%b-%y'),145.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Mar-08','%e-%b-%y'),140.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Mar-08','%e-%b-%y'),139.53);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Mar-08','%e-%b-%y'),133.27);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Mar-08','%e-%b-%y'),129.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Mar-08','%e-%b-%y'),132.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Mar-08','%e-%b-%y'),126.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Mar-08','%e-%b-%y'),126.61);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Mar-08','%e-%b-%y'),127.94);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Mar-08','%e-%b-%y'),126.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Mar-08','%e-%b-%y'),127.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Mar-08','%e-%b-%y'),119.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Mar-08','%e-%b-%y'),122.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Mar-08','%e-%b-%y'),120.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Mar-08','%e-%b-%y'),124.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Mar-08','%e-%b-%y'),124.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Mar-08','%e-%b-%y'),121.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Feb-08','%e-%b-%y'),125.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Feb-08','%e-%b-%y'),129.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Feb-08','%e-%b-%y'),122.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Feb-08','%e-%b-%y'),119.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Feb-08','%e-%b-%y'),119.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Feb-08','%e-%b-%y'),119.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Feb-08','%e-%b-%y'),121.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Feb-08','%e-%b-%y'),123.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Feb-08','%e-%b-%y'),122.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Feb-08','%e-%b-%y'),124.63);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Feb-08','%e-%b-%y'),127.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Feb-08','%e-%b-%y'),129.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('12-Feb-08','%e-%b-%y'),124.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Feb-08','%e-%b-%y'),129.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Feb-08','%e-%b-%y'),125.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Feb-08','%e-%b-%y'),121.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Feb-08','%e-%b-%y'),122);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Feb-08','%e-%b-%y'),129.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('4-Feb-08','%e-%b-%y'),131.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Feb-08','%e-%b-%y'),133.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Jan-08','%e-%b-%y'),135.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Jan-08','%e-%b-%y'),132.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Jan-08','%e-%b-%y'),131.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jan-08','%e-%b-%y'),130.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Jan-08','%e-%b-%y'),130.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Jan-08','%e-%b-%y'),135.6);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Jan-08','%e-%b-%y'),139.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jan-08','%e-%b-%y'),155.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('18-Jan-08','%e-%b-%y'),161.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jan-08','%e-%b-%y'),160.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('16-Jan-08','%e-%b-%y'),159.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Jan-08','%e-%b-%y'),169.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('14-Jan-08','%e-%b-%y'),178.78);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jan-08','%e-%b-%y'),172.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('10-Jan-08','%e-%b-%y'),178.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jan-08','%e-%b-%y'),179.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('8-Jan-08','%e-%b-%y'),171.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Jan-08','%e-%b-%y'),177.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('4-Jan-08','%e-%b-%y'),180.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('3-Jan-08','%e-%b-%y'),194.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Jan-08','%e-%b-%y'),194.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Dec-07','%e-%b-%y'),198.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('28-Dec-07','%e-%b-%y'),199.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Dec-07','%e-%b-%y'),198.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('26-Dec-07','%e-%b-%y'),198.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Dec-07','%e-%b-%y'),198.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Dec-07','%e-%b-%y'),193.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Dec-07','%e-%b-%y'),187.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Dec-07','%e-%b-%y'),183.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Dec-07','%e-%b-%y'),182.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Dec-07','%e-%b-%y'),184.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Dec-07','%e-%b-%y'),190.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Dec-07','%e-%b-%y'),191.83);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Dec-07','%e-%b-%y'),190.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Dec-07','%e-%b-%y'),188.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Dec-07','%e-%b-%y'),194.21);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Dec-07','%e-%b-%y'),194.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Dec-07','%e-%b-%y'),189.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Dec-07','%e-%b-%y'),185.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Dec-07','%e-%b-%y'),179.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Dec-07','%e-%b-%y'),178.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Nov-07','%e-%b-%y'),182.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('29-Nov-07','%e-%b-%y'),184.29);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Nov-07','%e-%b-%y'),180.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Nov-07','%e-%b-%y'),174.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Nov-07','%e-%b-%y'),172.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('23-Nov-07','%e-%b-%y'),171.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('21-Nov-07','%e-%b-%y'),168.46);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Nov-07','%e-%b-%y'),168.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Nov-07','%e-%b-%y'),163.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Nov-07','%e-%b-%y'),166.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('15-Nov-07','%e-%b-%y'),164.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('14-Nov-07','%e-%b-%y'),166.11);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Nov-07','%e-%b-%y'),169.96);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Nov-07','%e-%b-%y'),153.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Nov-07','%e-%b-%y'),165.37);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('8-Nov-07','%e-%b-%y'),175.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('7-Nov-07','%e-%b-%y'),186.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('6-Nov-07','%e-%b-%y'),191.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Nov-07','%e-%b-%y'),186.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('2-Nov-07','%e-%b-%y'),187.87);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('1-Nov-07','%e-%b-%y'),187.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Oct-07','%e-%b-%y'),189.95);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Oct-07','%e-%b-%y'),187);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Oct-07','%e-%b-%y'),185.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Oct-07','%e-%b-%y'),184.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Oct-07','%e-%b-%y'),182.78);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Oct-07','%e-%b-%y'),185.93);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Oct-07','%e-%b-%y'),186.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Oct-07','%e-%b-%y'),174.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('19-Oct-07','%e-%b-%y'),170.42);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Oct-07','%e-%b-%y'),173.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Oct-07','%e-%b-%y'),172.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Oct-07','%e-%b-%y'),169.58);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Oct-07','%e-%b-%y'),166.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Oct-07','%e-%b-%y'),167.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('11-Oct-07','%e-%b-%y'),162.23);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Oct-07','%e-%b-%y'),166.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Oct-07','%e-%b-%y'),167.86);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Oct-07','%e-%b-%y'),167.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Oct-07','%e-%b-%y'),161.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Oct-07','%e-%b-%y'),156.24);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Oct-07','%e-%b-%y'),157.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Oct-07','%e-%b-%y'),158.45);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Oct-07','%e-%b-%y'),156.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Sep-07','%e-%b-%y'),153.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Sep-07','%e-%b-%y'),154.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Sep-07','%e-%b-%y'),152.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-Sep-07','%e-%b-%y'),153.18);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Sep-07','%e-%b-%y'),148.28);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-Sep-07','%e-%b-%y'),144.15);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Sep-07','%e-%b-%y'),140.31);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Sep-07','%e-%b-%y'),140.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Sep-07','%e-%b-%y'),140.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-Sep-07','%e-%b-%y'),138.41);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Sep-07','%e-%b-%y'),138.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('13-Sep-07','%e-%b-%y'),137.2);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Sep-07','%e-%b-%y'),136.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Sep-07','%e-%b-%y'),135.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Sep-07','%e-%b-%y'),136.71);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('7-Sep-07','%e-%b-%y'),131.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Sep-07','%e-%b-%y'),135.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('5-Sep-07','%e-%b-%y'),136.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Sep-07','%e-%b-%y'),144.16);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('31-Aug-07','%e-%b-%y'),138.48);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Aug-07','%e-%b-%y'),136.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Aug-07','%e-%b-%y'),134.08);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Aug-07','%e-%b-%y'),126.82);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Aug-07','%e-%b-%y'),132.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Aug-07','%e-%b-%y'),135.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-Aug-07','%e-%b-%y'),131.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Aug-07','%e-%b-%y'),132.51);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Aug-07','%e-%b-%y'),127.57);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Aug-07','%e-%b-%y'),122.22);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('17-Aug-07','%e-%b-%y'),122.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-Aug-07','%e-%b-%y'),117.05);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Aug-07','%e-%b-%y'),119.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Aug-07','%e-%b-%y'),124.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Aug-07','%e-%b-%y'),127.79);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-Aug-07','%e-%b-%y'),125);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('9-Aug-07','%e-%b-%y'),126.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Aug-07','%e-%b-%y'),134.01);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Aug-07','%e-%b-%y'),135.03);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Aug-07','%e-%b-%y'),135.25);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('3-Aug-07','%e-%b-%y'),131.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Aug-07','%e-%b-%y'),136.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Aug-07','%e-%b-%y'),135);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-Jul-07','%e-%b-%y'),131.76);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-Jul-07','%e-%b-%y'),141.43);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('27-Jul-07','%e-%b-%y'),143.85);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('26-Jul-07','%e-%b-%y'),146);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('25-Jul-07','%e-%b-%y'),137.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('24-Jul-07','%e-%b-%y'),134.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('23-Jul-07','%e-%b-%y'),143.7);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('20-Jul-07','%e-%b-%y'),143.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('19-Jul-07','%e-%b-%y'),140);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('18-Jul-07','%e-%b-%y'),138.12);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('17-Jul-07','%e-%b-%y'),138.91);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('16-Jul-07','%e-%b-%y'),138.1);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('13-Jul-07','%e-%b-%y'),137.73);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('12-Jul-07','%e-%b-%y'),134.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('11-Jul-07','%e-%b-%y'),132.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('10-Jul-07','%e-%b-%y'),132.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('9-Jul-07','%e-%b-%y'),130.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('6-Jul-07','%e-%b-%y'),132.3);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('5-Jul-07','%e-%b-%y'),132.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-Jul-07','%e-%b-%y'),127.17);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-Jul-07','%e-%b-%y'),121.26);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('29-Jun-07','%e-%b-%y'),122.04);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('28-Jun-07','%e-%b-%y'),120.56);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Jun-07','%e-%b-%y'),121.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Jun-07','%e-%b-%y'),119.65);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Jun-07','%e-%b-%y'),122.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-Jun-07','%e-%b-%y'),123);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('21-Jun-07','%e-%b-%y'),123.9);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('20-Jun-07','%e-%b-%y'),121.55);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('19-Jun-07','%e-%b-%y'),123.66);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-Jun-07','%e-%b-%y'),125.09);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-Jun-07','%e-%b-%y'),120.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-Jun-07','%e-%b-%y'),118.75);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('13-Jun-07','%e-%b-%y'),117.5);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('12-Jun-07','%e-%b-%y'),120.38);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-Jun-07','%e-%b-%y'),120.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-Jun-07','%e-%b-%y'),124.49);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-Jun-07','%e-%b-%y'),124.07);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('6-Jun-07','%e-%b-%y'),123.64);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('5-Jun-07','%e-%b-%y'),122.67);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-Jun-07','%e-%b-%y'),121.33);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('1-Jun-07','%e-%b-%y'),118.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('31-May-07','%e-%b-%y'),121.19);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('30-May-07','%e-%b-%y'),118.77);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('29-May-07','%e-%b-%y'),114.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('25-May-07','%e-%b-%y'),113.62);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-May-07','%e-%b-%y'),110.69);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('23-May-07','%e-%b-%y'),112.89);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('22-May-07','%e-%b-%y'),113.54);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('21-May-07','%e-%b-%y'),111.98);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('18-May-07','%e-%b-%y'),110.02);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('17-May-07','%e-%b-%y'),109.44);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('16-May-07','%e-%b-%y'),107.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('15-May-07','%e-%b-%y'),107.52);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('14-May-07','%e-%b-%y'),109.36);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('11-May-07','%e-%b-%y'),108.74);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('10-May-07','%e-%b-%y'),107.34);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('9-May-07','%e-%b-%y'),106.88);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('8-May-07','%e-%b-%y'),105.06);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('7-May-07','%e-%b-%y'),103.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('4-May-07','%e-%b-%y'),100.81);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('3-May-07','%e-%b-%y'),100.4);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('2-May-07','%e-%b-%y'),100.39);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series3',STR_TO_DATE('1-May-07','%e-%b-%y'),99.47);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('30-Apr-07','%e-%b-%y'),99.8);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('27-Apr-07','%e-%b-%y'),99.92);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('26-Apr-07','%e-%b-%y'),98.84);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series2',STR_TO_DATE('25-Apr-07','%e-%b-%y'),95.35);
+Insert into demo_line_chart (series, log_date, data_value) values ('Series1',STR_TO_DATE('24-Apr-07','%e-%b-%y'),93.24);
+
+-- DEMO_PIE_CHART
+Insert into demo_pie_chart (legend, data_value) values ('One', 5);
+Insert into demo_pie_chart (legend, data_value) values ('Two', 2);
+Insert into demo_pie_chart (legend, data_value) values ('Three', 9);
+Insert into demo_pie_chart (legend, data_value) values ('Four', 7);
+Insert into demo_pie_chart (legend, data_value) values ('Five', 4);
+Insert into demo_pie_chart (legend, data_value) values ('Six', 3);
+Insert into demo_pie_chart (legend, data_value) values ('Seven', .5);
+
+
+-- DEMO_SCATTER_CHART
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.1, 'Particulate', 122);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.3, 'Particulate', 117);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.7, 'Particulate', 112);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.4, 'Particulate', 114);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.9, 'Particulate', 110);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (5.0, 'Particulate', 114);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (3.6, 'Particulate', 128);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (1.9, 'Particulate', 137);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (7.3, 'Particulate', 104);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (6.9, 'Humidity', 119);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (7.9, 'Humidity', 118);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (9.8, 'Humidity', 103);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.9, 'Humidity', 137);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (6.8, 'Humidity', 102);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (4.7, 'Humidity', 89);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (2.7, 'Humidity', 98);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (3.7, 'Humidity', 145);
+Insert into demo_scatter_chart (rainfall, key_value, measurements) values (7.4, 'Humidity', 118);
+
+-- DEMO_SCATTER_PLOT
+
+-- SET DEFINE OFF;
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -46.5901128883449, -464.477370615131);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -85.0293361247543, -362.252178232471);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 70.9700275365898, 402.214363675566);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -50.1110580054506, -310.108907443154);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 85.043005750476, 813.481841353449);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -14.2356123424179, -134.200903707809);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -66.7014933188071, -445.754374526706);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -79.941582021797, -694.089097548454);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -64.4665101305822, -431.660620986243);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 13.718818366452, 100.010719918027);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 35.457456199233, 223.254643848734);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 55.2326402548387, 268.940835852805);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -32.9989160276248, -237.280626944034);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -0.464911506111831, -2.65656324666862);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -59.0205101710777, -498.895652307826);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 28.0939970575828, 117.200615553207);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 31.7305239061572, 186.662624012256);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 50.9035126419798, 440.937283203403);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 58.3875046571053, 547.879249694999);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 76.7846997917459, 525.020578968308);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 1.73485745801611, 7.28149474936192);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 15.304841061276, 71.2374666595537);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 75.1342455000693, 381.145932349436);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -58.2087417684623, -573.630956069476);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 76.7977837302114, 624.733726327778);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 56.3295585433654, 309.697529902676);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -9.27601440680639, -49.5126219388194);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 98.3002030040236, 765.653589829535);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -25.0987502451517, -174.651201240269);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 39.9215299020147, 337.889176256456);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 77.9225832868337, 356.183903852096);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 75.4311841137638, 14.5258766665983);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 58.9445375968278, 376.359576288564);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', 46.9521897141796, 3.5679984193934);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -49.0378307695689, -230.816092788509);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -96.2461776340861, -863.765255159092);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -96.3388912796447, -538.147283544646);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -21.4684477767032, -200.140077054848);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -30.3532837083366, -226.462637188158);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample0', -17.5055590488884, -118.709622452841);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 56.6394671790491, 385.48951169801);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 70.4622912302344, 356.986529538635);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 58.2647422222769, 489.418744916999);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -92.16093253903, -425.576081634713);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -2.64574970943097, -26.190027661226);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -16.7568654181289, -117.460886096034);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 68.215377945908, 606.917788617984);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 53.7387814434413, 367.53491797949);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -51.8861573715238, -289.998186955562);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -15.9721784074351, -75.335027134323);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 63.2540648905791, 602.546517566905);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -53.376167960458, -470.921238684285);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 40.8307443439851, 276.112653117961);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -13.0540977188468, -127.648158921993);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -43.7358336047599, -435.080470107322);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -74.5673321340732, -617.960236798371);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -6.47907144443936, -55.654651151187);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 68.1915507628225, 352.320728639801);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -23.5393521654339, -137.714557244391);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 28.3621412621467, 141.103859877604);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -99.5615230664525, -974.857161307048);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -77.7132553058204, -736.182131225006);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 95.9321864873013, 478.286112499176);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 97.7451855292708, 940.301427763062);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -10.2483179758141, -70.1145330070458);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -24.0750124187893, -113.523998470537);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -5.5721118558967, -43.8516395203455);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -55.5378338160537, -368.506951528332);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 52.6669516338013, 38.2926120131942);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -74.1981412067658, -436.990411988621);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -8.70511941690364, -71.3277811558721);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 63.2921735621378, 534.825008407329);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 97.9066635843841, 678.994971737474);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -83.1613916743288, -494.53303650568);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 23.4730547863992, 223.031148353333);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 40.6105099506845, 199.937366405274);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 35.4473225526307, 331.61786915261);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 27.2050975460142, 146.277993239147);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', -1.54684302938646, -12.6706471561247);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample1', 45.8386162291745, 401.780882699918);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 43.4241956158593, 228.71488367607);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -23.4517134254585, -165.958577325218);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -98.8954664030229, -829.964553125469);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 48.0527046113198, 451.527720751234);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -77.8912947988124, -416.867729852279);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 23.8325471824168, 206.907438743452);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 83.2787398847467, 814.01250022556);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 49.1572992549647, 451.03037365466);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -11.1351768833872, -57.3863334655361);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 71.1980242104626, 572.745863967841);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 15.0952976022392, 103.30274980367);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 75.0300005037414, 406.581640027236);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -82.0092720309019, -690.340287049552);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 40.2433497232209, 363.579616486762);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 26.8157962678174, 262.150124949525);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -83.9563210001448, -432.739081022174);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -20.6480437627346, -161.330015497217);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 37.1388896882226, 161.352404658606);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 20.2126667486174, 168.833789818416);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 58.3723632769494, 293.206814023827);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -20.2876832456236, -88.0090685884954);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 72.9768050433371, 691.684023528398);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -21.6612128833675, -130.834158714088);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 97.4870524045038, 806.47904449193);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 60.6688063197852, 255.749289305775);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -44.235772358471, -336.262226570567);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -47.39573087854, -321.133647936626);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -24.7522484346097, -204.548308435727);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -42.903238078129, -239.651563752902);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 20.4656734934697, 172.700213789797);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 56.0665747085147, 365.360390019834);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 31.9979219049038, 237.490140339893);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -29.9884426739069, -203.821484170813);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 13.5011085362703, 79.4784314297668);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 41.8402945507358, 297.04934398378);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -84.9323678979223, -345.2331996232);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', -42.2469964847455, -361.468816319656);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 98.1057699772752, 445.181262282444);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 95.5327901766563, 522.663100406047);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample2', 35.0916611161316, 246.796980313209);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 99.3987950082867, 401.97428571655);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -3.0419413965969, -14.5325761725203);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -79.388026451666, -701.817589967372);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -88.451242397524, -668.370526000304);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 34.3131838963851, 254.418322223563);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -61.518208630511, -347.521623572776);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 45.6124480237487, 356.33565541369);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -1.0716036518037, -7.80544934354423);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 31.7371714687412, 283.925868763573);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -76.771029786315, -626.268489584739);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -67.913690110843, -614.736930677921);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 34.9311671860034, 171.384205820777);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 94.3264454603021, 914.267819214392);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 76.7493996267558, 705.649611960615);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -87.795202856922, -749.505178721718);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 2.10914716736019, 15.4036733330536);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -50.456669557937, -318.410608422062);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -94.646644883092, -734.660992935541);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 34.9170862075359, 347.583881438806);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 44.3524585090071, 294.615219199443);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -67.191016143335, -609.956472872497);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -78.826443879164, -369.129912603377);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -50.427554400015, -418.144241602024);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -70.371769526721, -307.02193189609);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 16.3220947890044, 97.0997346831135);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -47.067245718878, -398.27032236792);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 5.91206661301702, 24.7239863780181);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -99.621681801868, -843.593457399484);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 87.4503492670535, 695.345037859433);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -91.176921118057, -683.305064255346);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -0.6632900001386, -5.34157539224209);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 2.98188785882178, 12.1181973600389);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 30.6008700087597, 205.922863867274);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 7.90348761612496, 65.5271597329641);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 40.3565229854156, 268.058138389501);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 37.6892733312091, 247.519083233639);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 16.4759733864001, 107.72661087278);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -53.578492311122, -369.768816039059);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', 77.1292326560541, 765.262108306778);
+Insert into demo_scatter_plot
+   (SERIES, VALUEX, VALUEY)
+ Values
+   ('Sample3', -79.566811593352, -677.545127214159);
+
+-- DEMO_UTIL_CHART
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-17','%Y-%m-%d'),53.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-10','%Y-%m-%d'),62.95747);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-21','%Y-%m-%d'),48.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-22','%Y-%m-%d'),51.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-11','%Y-%m-%d'),56.13373);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-23','%Y-%m-%d'),53.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-12','%Y-%m-%d'),57.05287);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-24','%Y-%m-%d'),51.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-13','%Y-%m-%d'),55.78947);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-25','%Y-%m-%d'),54.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-14','%Y-%m-%d'),63.34907);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-26','%Y-%m-%d'),50.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-15','%Y-%m-%d'),52.21327);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-27','%Y-%m-%d'),48.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-16','%Y-%m-%d'),51.32080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-28','%Y-%m-%d'),50.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-17','%Y-%m-%d'),58.35720);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-29','%Y-%m-%d'),51.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-18','%Y-%m-%d'),57.62293);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-04-30','%Y-%m-%d'),67.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-19','%Y-%m-%d'),55.25000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-01','%Y-%m-%d'),59.89393);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-20','%Y-%m-%d'),58.79573);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-02','%Y-%m-%d'),61.20753);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-21','%Y-%m-%d'),54.09720);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-03','%Y-%m-%d'),58.98340);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-22','%Y-%m-%d'),59.95813);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-04','%Y-%m-%d'),59.55873);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-23','%Y-%m-%d'),62.03067);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-05','%Y-%m-%d'),58.73680);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-24','%Y-%m-%d'),61.97620);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-06','%Y-%m-%d'),59.89967);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-25','%Y-%m-%d'),58.00207);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-07','%Y-%m-%d'),60.67973);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-26','%Y-%m-%d'),59.95440);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-08','%Y-%m-%d'),60.85913);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-27','%Y-%m-%d'),55.43747);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-09','%Y-%m-%d'),60.62460);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-28','%Y-%m-%d'),52.53933);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-10','%Y-%m-%d'),59.51887);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-29','%Y-%m-%d'),57.46260);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-11','%Y-%m-%d'),61.57187);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-30','%Y-%m-%d'),60.04787);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-12','%Y-%m-%d'),60.70000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-31','%Y-%m-%d'),58.79480);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-13','%Y-%m-%d'),69.85133);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-01','%Y-%m-%d'),54.40107);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-14','%Y-%m-%d'),68.99620);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-02','%Y-%m-%d'),62.26007);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-15','%Y-%m-%d'),67.64080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-03','%Y-%m-%d'),60.72360);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-16','%Y-%m-%d'),59.71433);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-04','%Y-%m-%d'),60.95847);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-17','%Y-%m-%d'),59.99667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-05','%Y-%m-%d'),59.45920);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-18','%Y-%m-%d'),63.27207);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-06','%Y-%m-%d'),60.58620);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-19','%Y-%m-%d'),60.32080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-07','%Y-%m-%d'),61.94207);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-20','%Y-%m-%d'),57.32907);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-08','%Y-%m-%d'),59.03327);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-21','%Y-%m-%d'),59.76933);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-09','%Y-%m-%d'),62.83087);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-22','%Y-%m-%d'),59.12453);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-10','%Y-%m-%d'),59.36840);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-23','%Y-%m-%d'),57.10167);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-11','%Y-%m-%d'),56.11480);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-24','%Y-%m-%d'),58.45820);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-12','%Y-%m-%d'),62.23393);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-25','%Y-%m-%d'),59.45440);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-13','%Y-%m-%d'),59.72313);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-26','%Y-%m-%d'),60.12807);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-14','%Y-%m-%d'),53.37093);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-27','%Y-%m-%d'),59.11760);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-15','%Y-%m-%d'),52.99233);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-28','%Y-%m-%d'),57.32020);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-16','%Y-%m-%d'),55.99080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-29','%Y-%m-%d'),59.80360);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-17','%Y-%m-%d'),53.93853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-30','%Y-%m-%d'),66.73280);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-18','%Y-%m-%d'),55.99313);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-05-31','%Y-%m-%d'),58.78673);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-19','%Y-%m-%d'),68.23393);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-01','%Y-%m-%d'),58.82773);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-20','%Y-%m-%d'),61.86213);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-02','%Y-%m-%d'),63.12100);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-21','%Y-%m-%d'),61.20307);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-03','%Y-%m-%d'),59.70467);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-22','%Y-%m-%d'),61.05900);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-04','%Y-%m-%d'),58.85173);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-23','%Y-%m-%d'),58.41040);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-05','%Y-%m-%d'),61.21880);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-24','%Y-%m-%d'),59.15967);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-06','%Y-%m-%d'),58.99920);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-25','%Y-%m-%d'),56.42153);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-07','%Y-%m-%d'),59.94693);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-26','%Y-%m-%d'),60.46580);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-08','%Y-%m-%d'),66.27293);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-27','%Y-%m-%d'),57.44333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-09','%Y-%m-%d'),61.46773);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-28','%Y-%m-%d'),56.88887);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-10','%Y-%m-%d'),59.70467);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-29','%Y-%m-%d'),61.85773);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-11','%Y-%m-%d'),60.16000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-09-30','%Y-%m-%d'),61.96400);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-12','%Y-%m-%d'),61.20300);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-01','%Y-%m-%d'),65.88833);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-13','%Y-%m-%d'),60.95673);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-02','%Y-%m-%d'),62.67920);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-14','%Y-%m-%d'),60.70207);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-03','%Y-%m-%d'),63.52047);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-15','%Y-%m-%d'),61.02520);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-04','%Y-%m-%d'),58.60280);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-16','%Y-%m-%d'),60.33953);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-05','%Y-%m-%d'),63.74487);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-17','%Y-%m-%d'),61.20300);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-06','%Y-%m-%d'),59.94880);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-18','%Y-%m-%d'),63.12100);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-07','%Y-%m-%d'),59.44380);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-23','%Y-%m-%d'),61.09153);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-08','%Y-%m-%d'),59.16320);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-24','%Y-%m-%d'),61.28867);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-09','%Y-%m-%d'),60.84593);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-25','%Y-%m-%d'),60.95673);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-10','%Y-%m-%d'),58.84113);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-26','%Y-%m-%d'),60.61100);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-11','%Y-%m-%d'),62.59827);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-27','%Y-%m-%d'),61.22913);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-12','%Y-%m-%d'),60.94660);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-28','%Y-%m-%d'),58.88507);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-13','%Y-%m-%d'),59.37593);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-29','%Y-%m-%d'),59.73693);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-14','%Y-%m-%d'),67.21840);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-06-30','%Y-%m-%d'),62.45307);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-15','%Y-%m-%d'),68.56020);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-01','%Y-%m-%d'),61.30167);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-16','%Y-%m-%d'),57.56493);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-02','%Y-%m-%d'),62.92727);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-17','%Y-%m-%d'),57.02280);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-03','%Y-%m-%d'),60.05887);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-18','%Y-%m-%d'),56.20947);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-06','%Y-%m-%d'),61.20100);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-19','%Y-%m-%d'),55.69353);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-07','%Y-%m-%d'),60.66120);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-20','%Y-%m-%d'),57.17640);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-08','%Y-%m-%d'),59.78180);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-21','%Y-%m-%d'),57.50867);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-09','%Y-%m-%d'),58.74653);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-22','%Y-%m-%d'),61.67860);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-10','%Y-%m-%d'),59.77893);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-23','%Y-%m-%d'),57.34867);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-11','%Y-%m-%d'),67.34500);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-24','%Y-%m-%d'),61.68080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-12','%Y-%m-%d'),57.07293);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-25','%Y-%m-%d'),55.55793);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-13','%Y-%m-%d'),57.37567);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-26','%Y-%m-%d'),55.81013);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-14','%Y-%m-%d'),63.97820);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-27','%Y-%m-%d'),59.85540);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-15','%Y-%m-%d'),56.06647);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-28','%Y-%m-%d'),61.05073);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-16','%Y-%m-%d'),53.66347);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-29','%Y-%m-%d'),59.81253);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-23','%Y-%m-%d'),56.50813);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-30','%Y-%m-%d'),61.02047);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-24','%Y-%m-%d'),53.19667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-10-31','%Y-%m-%d'),60.60413);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-25','%Y-%m-%d'),51.57133);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-01','%Y-%m-%d'),57.43067);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-26','%Y-%m-%d'),45.98160);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-02','%Y-%m-%d'),58.63027);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-27','%Y-%m-%d'),49.21113);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-03','%Y-%m-%d'),59.08127);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-28','%Y-%m-%d'),49.67213);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-04','%Y-%m-%d'),59.37373);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-29','%Y-%m-%d'),52.94053);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-05','%Y-%m-%d'),58.13413);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-30','%Y-%m-%d'),57.55727);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-06','%Y-%m-%d'),57.18893);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-07-31','%Y-%m-%d'),61.76900);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-07','%Y-%m-%d'),56.72853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-01','%Y-%m-%d'),56.51953);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-08','%Y-%m-%d'),56.47340);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-02','%Y-%m-%d'),61.04853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-09','%Y-%m-%d'),62.02333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-03','%Y-%m-%d'),70.06067);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-10','%Y-%m-%d'),61.21787);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-04','%Y-%m-%d'),60.97787);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-11','%Y-%m-%d'),62.01087);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-05','%Y-%m-%d'),59.25967);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-12','%Y-%m-%d'),62.67573);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-06','%Y-%m-%d'),56.12287);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-13','%Y-%m-%d'),59.23993);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-07','%Y-%m-%d'),63.99913);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-14','%Y-%m-%d'),67.34973);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-08','%Y-%m-%d'),58.71127);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-15','%Y-%m-%d'),60.93753);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-08-09','%Y-%m-%d'),64.01913);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-16','%Y-%m-%d'),54.52607);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-17','%Y-%m-%d'),57.81127);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-18','%Y-%m-%d'),63.53027);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-19','%Y-%m-%d'),58.13000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-20','%Y-%m-%d'),58.46827);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-21','%Y-%m-%d'),65.27807);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-22','%Y-%m-%d'),53.74513);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-23','%Y-%m-%d'),60.99107);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-24','%Y-%m-%d'),60.45427);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-25','%Y-%m-%d'),56.16847);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-26','%Y-%m-%d'),59.04040);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-27','%Y-%m-%d'),54.62040);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-28','%Y-%m-%d'),56.34687);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-29','%Y-%m-%d'),54.81560);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-11-30','%Y-%m-%d'),60.22753);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-01','%Y-%m-%d'),59.07307);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-02','%Y-%m-%d'),59.73553);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-03','%Y-%m-%d'),68.69447);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-04','%Y-%m-%d'),68.91767);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-05','%Y-%m-%d'),67.86460);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-06','%Y-%m-%d'),64.43120);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-01','%Y-%m-%d'),61.22507);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-07','%Y-%m-%d'),60.67793);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-02','%Y-%m-%d'),63.27533);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-08','%Y-%m-%d'),62.47060);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-03','%Y-%m-%d'),69.88087);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-09','%Y-%m-%d'),58.26053);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-04','%Y-%m-%d'),66.84920);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-10','%Y-%m-%d'),61.03340);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-05','%Y-%m-%d'),61.57367);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-11','%Y-%m-%d'),57.32620);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-06','%Y-%m-%d'),60.52293);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-12','%Y-%m-%d'),63.10353);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-07','%Y-%m-%d'),62.21027);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-13','%Y-%m-%d'),61.73167);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-08','%Y-%m-%d'),63.20380);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-14','%Y-%m-%d'),65.31080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-09','%Y-%m-%d'),62.72427);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-15','%Y-%m-%d'),64.67620);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-10','%Y-%m-%d'),61.59373);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-16','%Y-%m-%d'),62.87287);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-11','%Y-%m-%d'),61.21280);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-17','%Y-%m-%d'),60.14680);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-12','%Y-%m-%d'),60.79787);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-18','%Y-%m-%d'),63.01007);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-13','%Y-%m-%d'),60.00080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-19','%Y-%m-%d'),57.82680);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-14','%Y-%m-%d'),60.82333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-20','%Y-%m-%d'),62.59173);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-15','%Y-%m-%d'),59.62020);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-21','%Y-%m-%d'),61.65607);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-16','%Y-%m-%d'),60.27420);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-23','%Y-%m-%d'),61.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-17','%Y-%m-%d'),60.06200);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-24','%Y-%m-%d'),59.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-18','%Y-%m-%d'),60.88900);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-25','%Y-%m-%d'),50.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-19','%Y-%m-%d'),59.92547);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-26','%Y-%m-%d'),60.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-20','%Y-%m-%d'),59.99853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-27','%Y-%m-%d'),62.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-21','%Y-%m-%d'),58.65873);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-28','%Y-%m-%d'),61.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-22','%Y-%m-%d'),60.61000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-29','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-23','%Y-%m-%d'),59.92280);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-30','%Y-%m-%d'),61.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-24','%Y-%m-%d'),59.52427);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2014-12-31','%Y-%m-%d'),62.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-25','%Y-%m-%d'),59.44887);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-01','%Y-%m-%d'),60.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-26','%Y-%m-%d'),60.23540);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-02','%Y-%m-%d'),62.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-27','%Y-%m-%d'),61.18333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-03','%Y-%m-%d'),62.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-28','%Y-%m-%d'),60.88133);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-04','%Y-%m-%d'),60.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-29','%Y-%m-%d'),61.74160);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-06','%Y-%m-%d'),62.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-30','%Y-%m-%d'),60.25647);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-08','%Y-%m-%d'),61.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-03-31','%Y-%m-%d'),60.41220);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-09','%Y-%m-%d'),63.20000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-01','%Y-%m-%d'),59.21053);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-10','%Y-%m-%d'),61.82227);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-02','%Y-%m-%d'),55.04713);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-11','%Y-%m-%d'),61.89553);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-03','%Y-%m-%d'),56.08473);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-12','%Y-%m-%d'),60.90127);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-04','%Y-%m-%d'),64.51107);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-13','%Y-%m-%d'),62.23660);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-05','%Y-%m-%d'),56.75193);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-14','%Y-%m-%d'),61.76947);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-06','%Y-%m-%d'),61.64240);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-15','%Y-%m-%d'),63.08853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-07','%Y-%m-%d'),61.33653);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-16','%Y-%m-%d'),60.12627);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-08','%Y-%m-%d'),69.28867);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-17','%Y-%m-%d'),60.60020);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-09','%Y-%m-%d'),60.87507);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-18','%Y-%m-%d'),60.43440);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-10','%Y-%m-%d'),68.08707);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-19','%Y-%m-%d'),65.02820);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-11','%Y-%m-%d'),60.57680);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-20','%Y-%m-%d'),62.95593);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-12','%Y-%m-%d'),61.52467);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-21','%Y-%m-%d'),61.23967);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-13','%Y-%m-%d'),58.06567);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-22','%Y-%m-%d'),62.61853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-14','%Y-%m-%d'),59.80807);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-23','%Y-%m-%d'),63.64227);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-15','%Y-%m-%d'),79.90007);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-24','%Y-%m-%d'),63.42147);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-16','%Y-%m-%d'),54.75020);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-25','%Y-%m-%d'),60.82687);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-17','%Y-%m-%d'),65.69500);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-26','%Y-%m-%d'),60.66260);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-18','%Y-%m-%d'),68.56247);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-27','%Y-%m-%d'),60.12767);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-19','%Y-%m-%d'),72.67153);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-28','%Y-%m-%d'),60.51513);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-20','%Y-%m-%d'),71.30720);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-29','%Y-%m-%d'),61.71520);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-21','%Y-%m-%d'),57.75233);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-30','%Y-%m-%d'),60.89553);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-22','%Y-%m-%d'),59.04200);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-01-31','%Y-%m-%d'),63.50540);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-23','%Y-%m-%d'),62.30153);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-01','%Y-%m-%d'),62.37533);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-24','%Y-%m-%d'),67.68287);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-02','%Y-%m-%d'),60.31400);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-25','%Y-%m-%d'),69.21800);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-03','%Y-%m-%d'),63.43920);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-26','%Y-%m-%d'),69.75993);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-04','%Y-%m-%d'),61.20487);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-27','%Y-%m-%d'),64.64113);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-05','%Y-%m-%d'),62.11167);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-28','%Y-%m-%d'),60.10053);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-06','%Y-%m-%d'),59.96140);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-29','%Y-%m-%d'),58.67653);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-07','%Y-%m-%d'),62.60727);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-04-30','%Y-%m-%d'),58.29180);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-08','%Y-%m-%d'),61.95493);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-01','%Y-%m-%d'),60.56173);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-09','%Y-%m-%d'),58.89653);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-02','%Y-%m-%d'),57.15840);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-10','%Y-%m-%d'),66.20167);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-03','%Y-%m-%d'),54.49167);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-11','%Y-%m-%d'),64.76873);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-04','%Y-%m-%d'),61.54087);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-12','%Y-%m-%d'),69.90680);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-05','%Y-%m-%d'),63.86073);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-13','%Y-%m-%d'),68.49253);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-06','%Y-%m-%d'),64.13460);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-14','%Y-%m-%d'),63.19360);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-07','%Y-%m-%d'),65.30087);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-15','%Y-%m-%d'),63.35453);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-08','%Y-%m-%d'),64.46353);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-16','%Y-%m-%d'),59.78020);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-09','%Y-%m-%d'),62.81193);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-17','%Y-%m-%d'),60.70760);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-10','%Y-%m-%d'),56.14480);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-18','%Y-%m-%d'),58.05167);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-11','%Y-%m-%d'),61.47853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-19','%Y-%m-%d'),57.12700);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-12','%Y-%m-%d'),63.39287);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-20','%Y-%m-%d'),59.49013);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-13','%Y-%m-%d'),64.30640);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-21','%Y-%m-%d'),59.18607);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-14','%Y-%m-%d'),64.29447);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-22','%Y-%m-%d'),60.94680);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-15','%Y-%m-%d'),65.63307);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-23','%Y-%m-%d'),59.85807);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-16','%Y-%m-%d'),62.32887);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-24','%Y-%m-%d'),60.06767);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-17','%Y-%m-%d'),56.52853);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-25','%Y-%m-%d'),61.60267);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-18','%Y-%m-%d'),70.26520);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-26','%Y-%m-%d'),60.94220);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-19','%Y-%m-%d'),64.38267);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-27','%Y-%m-%d'),59.99040);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-20','%Y-%m-%d'),63.01447);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-02-28','%Y-%m-%d'),63.05567);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-21','%Y-%m-%d'),61.89200);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-22','%Y-%m-%d'),62.06920);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-23','%Y-%m-%d'),68.49253);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-24','%Y-%m-%d'),69.98867);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-25','%Y-%m-%d'),60.26940);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-26','%Y-%m-%d'),62.91493);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-09','%Y-%m-%d'),62.28433);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-27','%Y-%m-%d'),62.36827);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-10','%Y-%m-%d'),64.38787);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-11','%Y-%m-%d'),61.17093);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-28','%Y-%m-%d'),60.33887);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-12','%Y-%m-%d'),57.17713);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-29','%Y-%m-%d'),83.89220);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-13','%Y-%m-%d'),57.69653);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-30','%Y-%m-%d'),60.96747);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-14','%Y-%m-%d'),55.97980);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-05-31','%Y-%m-%d'),57.80627);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-15','%Y-%m-%d'),62.08940);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-01','%Y-%m-%d'),61.60173);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-16','%Y-%m-%d'),83.81047);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-02','%Y-%m-%d'),63.23627);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-17','%Y-%m-%d'),61.32540);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-03','%Y-%m-%d'),58.39987);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-18','%Y-%m-%d'),61.08900);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-04','%Y-%m-%d'),69.51947);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-19','%Y-%m-%d'),67.26267);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-05','%Y-%m-%d'),69.67787);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-20','%Y-%m-%d'),58.71120);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-06','%Y-%m-%d'),62.40513);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-21','%Y-%m-%d'),55.77320);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-07','%Y-%m-%d'),61.01893);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-22','%Y-%m-%d'),59.99420);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-08','%Y-%m-%d'),61.34813);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-23','%Y-%m-%d'),60.83867);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-24','%Y-%m-%d'),59.57020);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-25','%Y-%m-%d'),63.20393);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-17','%Y-%m-%d'),67.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-26','%Y-%m-%d'),58.30480);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-18','%Y-%m-%d'),64.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-27','%Y-%m-%d'),58.79667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-19','%Y-%m-%d'),60.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-28','%Y-%m-%d'),54.04967);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-20','%Y-%m-%d'),57.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-29','%Y-%m-%d'),57.88313);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-21','%Y-%m-%d'),58.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-06-30','%Y-%m-%d'),56.94940);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-22','%Y-%m-%d'),59.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-01','%Y-%m-%d'),65.01080);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-23','%Y-%m-%d'),59.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-02','%Y-%m-%d'),64.97013);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-24','%Y-%m-%d'),59.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-03','%Y-%m-%d'),65.06647);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-25','%Y-%m-%d'),59.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-04','%Y-%m-%d'),64.08287);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-26','%Y-%m-%d'),76.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-05','%Y-%m-%d'),65.40367);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-27','%Y-%m-%d'),59.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-06','%Y-%m-%d'),72.61373);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-28','%Y-%m-%d'),59.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-07','%Y-%m-%d'),72.53120);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-29','%Y-%m-%d'),58.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-08','%Y-%m-%d'),72.54133);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-26','%Y-%m-%d'),58.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-30','%Y-%m-%d'),54.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-01','%Y-%m-%d'),58.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-02','%Y-%m-%d'),59.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-03','%Y-%m-%d'),58.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-04','%Y-%m-%d'),60.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-05','%Y-%m-%d'),101.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-06','%Y-%m-%d'),58.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-07','%Y-%m-%d'),59.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-08','%Y-%m-%d'),56.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-09','%Y-%m-%d'),57.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-10','%Y-%m-%d'),65.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-11','%Y-%m-%d'),56.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-12','%Y-%m-%d'),54.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-13','%Y-%m-%d'),68.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-14','%Y-%m-%d'),69.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-15','%Y-%m-%d'),66.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-16','%Y-%m-%d'),58.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-17','%Y-%m-%d'),60.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-18','%Y-%m-%d'),58.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-19','%Y-%m-%d'),55.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-20','%Y-%m-%d'),55.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-21','%Y-%m-%d'),57.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-22','%Y-%m-%d'),57.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-23','%Y-%m-%d'),58.20000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-24','%Y-%m-%d'),57.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-25','%Y-%m-%d'),58.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-26','%Y-%m-%d'),61.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-27','%Y-%m-%d'),57.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-28','%Y-%m-%d'),58.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-29','%Y-%m-%d'),59.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-30','%Y-%m-%d'),55.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-10-31','%Y-%m-%d'),53.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-01','%Y-%m-%d'),56.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-02','%Y-%m-%d'),57.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-03','%Y-%m-%d'),55.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-04','%Y-%m-%d'),57.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-05','%Y-%m-%d'),65.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-06','%Y-%m-%d'),55.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-07','%Y-%m-%d'),57.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-08','%Y-%m-%d'),59.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-09','%Y-%m-%d'),60.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-10','%Y-%m-%d'),58.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-11','%Y-%m-%d'),58.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-12','%Y-%m-%d'),57.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-13','%Y-%m-%d'),57.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-14','%Y-%m-%d'),55.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-15','%Y-%m-%d'),55.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-16','%Y-%m-%d'),58.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-17','%Y-%m-%d'),58.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-18','%Y-%m-%d'),64.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-19','%Y-%m-%d'),59.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-20','%Y-%m-%d'),57.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-21','%Y-%m-%d'),57.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-22','%Y-%m-%d'),59.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-23','%Y-%m-%d'),56.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-24','%Y-%m-%d'),58.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-25','%Y-%m-%d'),57.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-26','%Y-%m-%d'),57.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-27','%Y-%m-%d'),53.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-28','%Y-%m-%d'),58.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-29','%Y-%m-%d'),56.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-11-30','%Y-%m-%d'),58.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-01','%Y-%m-%d'),60.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-02','%Y-%m-%d'),59.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-03','%Y-%m-%d'),58.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-04','%Y-%m-%d'),77.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-05','%Y-%m-%d'),56.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-06','%Y-%m-%d'),55.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-07','%Y-%m-%d'),57.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-08','%Y-%m-%d'),57.20000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-09','%Y-%m-%d'),71.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-10','%Y-%m-%d'),62.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-11','%Y-%m-%d'),59.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-12','%Y-%m-%d'),59.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-13','%Y-%m-%d'),62.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-14','%Y-%m-%d'),59.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-15','%Y-%m-%d'),59.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-16','%Y-%m-%d'),62.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-17','%Y-%m-%d'),66.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-18','%Y-%m-%d'),59.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-19','%Y-%m-%d'),60.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-20','%Y-%m-%d'),57.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-21','%Y-%m-%d'),60.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-22','%Y-%m-%d'),59.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-23','%Y-%m-%d'),61.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-24','%Y-%m-%d'),57.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-25','%Y-%m-%d'),52.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-09','%Y-%m-%d'),70.77980);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-10','%Y-%m-%d'),70.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-11','%Y-%m-%d'),60.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-12','%Y-%m-%d'),58.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-13','%Y-%m-%d'),58.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-14','%Y-%m-%d'),58.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-15','%Y-%m-%d'),68.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-16','%Y-%m-%d'),84.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-17','%Y-%m-%d'),61.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-18','%Y-%m-%d'),64.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-19','%Y-%m-%d'),59.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-20','%Y-%m-%d'),77.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-21','%Y-%m-%d'),60.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-22','%Y-%m-%d'),65.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-23','%Y-%m-%d'),68.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-24','%Y-%m-%d'),58.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-25','%Y-%m-%d'),56.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-26','%Y-%m-%d'),58.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-27','%Y-%m-%d'),59.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-28','%Y-%m-%d'),59.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-29','%Y-%m-%d'),58.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-30','%Y-%m-%d'),59.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-27','%Y-%m-%d'),59.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-07-31','%Y-%m-%d'),57.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-28','%Y-%m-%d'),305.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-01','%Y-%m-%d'),59.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-29','%Y-%m-%d'),62.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-02','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-30','%Y-%m-%d'),60.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-03','%Y-%m-%d'),59.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-12-31','%Y-%m-%d'),60.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-04','%Y-%m-%d'),83.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-01','%Y-%m-%d'),55.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-05','%Y-%m-%d'),59.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-02','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-06','%Y-%m-%d'),58.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-03','%Y-%m-%d'),61.20000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-07','%Y-%m-%d'),59.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-04','%Y-%m-%d'),62.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-08','%Y-%m-%d'),57.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-05','%Y-%m-%d'),61.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-09','%Y-%m-%d'),58.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-06','%Y-%m-%d'),61.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-10','%Y-%m-%d'),59.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-07','%Y-%m-%d'),62.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-11','%Y-%m-%d'),58.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-08','%Y-%m-%d'),100.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-12','%Y-%m-%d'),57.20000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-09','%Y-%m-%d'),62.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-13','%Y-%m-%d'),61.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-10','%Y-%m-%d'),66.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-14','%Y-%m-%d'),58.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-11','%Y-%m-%d'),61.20000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-15','%Y-%m-%d'),59.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-12','%Y-%m-%d'),60.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-16','%Y-%m-%d'),61.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-13','%Y-%m-%d'),61.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-17','%Y-%m-%d'),59.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-14','%Y-%m-%d'),60.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-18','%Y-%m-%d'),59.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-15','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-19','%Y-%m-%d'),59.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-16','%Y-%m-%d'),61.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-20','%Y-%m-%d'),60.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-17','%Y-%m-%d'),70.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-21','%Y-%m-%d'),63.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-18','%Y-%m-%d'),61.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-22','%Y-%m-%d'),58.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-19','%Y-%m-%d'),61.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-23','%Y-%m-%d'),59.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-20','%Y-%m-%d'),61.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-24','%Y-%m-%d'),59.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-21','%Y-%m-%d'),61.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-25','%Y-%m-%d'),63.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-22','%Y-%m-%d'),60.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-26','%Y-%m-%d'),61.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-23','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-27','%Y-%m-%d'),60.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-24','%Y-%m-%d'),60.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-28','%Y-%m-%d'),57.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-25','%Y-%m-%d'),61.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-29','%Y-%m-%d'),59.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-26','%Y-%m-%d'),61.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-30','%Y-%m-%d'),57.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-27','%Y-%m-%d'),61.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-08-31','%Y-%m-%d'),59.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-28','%Y-%m-%d'),61.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-01','%Y-%m-%d'),58.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-29','%Y-%m-%d'),61.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-02','%Y-%m-%d'),61.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-30','%Y-%m-%d'),61.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-03','%Y-%m-%d'),59.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-01-31','%Y-%m-%d'),59.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-04','%Y-%m-%d'),59.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-01','%Y-%m-%d'),60.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-05','%Y-%m-%d'),59.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-02','%Y-%m-%d'),60.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-06','%Y-%m-%d'),61.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-03','%Y-%m-%d'),60.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-07','%Y-%m-%d'),59.20000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-04','%Y-%m-%d'),61.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-08','%Y-%m-%d'),61.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-05','%Y-%m-%d'),60.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-09','%Y-%m-%d'),61.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-06','%Y-%m-%d'),60.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-10','%Y-%m-%d'),60.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-07','%Y-%m-%d'),60.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-11','%Y-%m-%d'),58.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-08','%Y-%m-%d'),61.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-12','%Y-%m-%d'),58.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-09','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-13','%Y-%m-%d'),58.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-10','%Y-%m-%d'),60.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-14','%Y-%m-%d'),60.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-11','%Y-%m-%d'),60.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-15','%Y-%m-%d'),62.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-12','%Y-%m-%d'),59.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2015-09-16','%Y-%m-%d'),65.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-13','%Y-%m-%d'),61.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-14','%Y-%m-%d'),69.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-15','%Y-%m-%d'),59.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-16','%Y-%m-%d'),59.80000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-17','%Y-%m-%d'),60.46667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-18','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-19','%Y-%m-%d'),62.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-20','%Y-%m-%d'),60.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-21','%Y-%m-%d'),59.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-22','%Y-%m-%d'),61.40000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-23','%Y-%m-%d'),60.93333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-24','%Y-%m-%d'),64.13333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-25','%Y-%m-%d'),61.53333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-26','%Y-%m-%d'),59.06667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-27','%Y-%m-%d'),61.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-28','%Y-%m-%d'),60.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-02-29','%Y-%m-%d'),61.00000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-01','%Y-%m-%d'),61.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-02','%Y-%m-%d'),61.66667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-03','%Y-%m-%d'),60.73333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-04','%Y-%m-%d'),61.26667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-05','%Y-%m-%d'),61.60000);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-06','%Y-%m-%d'),61.33333);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-07','%Y-%m-%d'),61.86667);
+INSERT INTO demo_util_chart (TRAFFIC_DATE,UTIL_PERC ) VALUES (str_to_date('2016-03-08','%Y-%m-%d'),62.00000);
+
+commit;
diff --git a/ui/db-scripts/EcompSdkDMLMySql_2_4_OS.sql b/ui/db-scripts/EcompSdkDMLMySql_2_4_OS.sql
new file mode 100644 (file)
index 0000000..781e8bc
--- /dev/null
@@ -0,0 +1,39 @@
+-- ---------------------------------------------------------------------------------------------------------------
+-- This script populates tables in the OPEN-SOURCE version 2.1.0 of the ECOMP SDK application database.
+-- The DML COMMON script must be executed first!
+-- ---------------------------------------------------------------------------------------------------------------
+
+SET FOREIGN_KEY_CHECKS=1;
+USE akraino;
+
+-- fn_menu
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (1, 'Root', NULL, 10, NULL, 'menu_home', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); --  we need even though it's inactive
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (5000, 'Sample Pages', 1, 30, 'sample.htm', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-documents-book');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (2, 'Home', 1, 10, 'welcome', 'menu_home', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-building-home');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (8, 'Reports', 1, 40, 'report.htm', 'menu_reports', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-misc-piechart');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (9, 'Profile', 1, 90, 'userProfile', 'menu_profile', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-people-oneperson');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (10, 'Admin', 1, 110, 'role_list.htm', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-content-star');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (84, 'All Reports', 8, 50, 'report', 'menu_reports', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) values (87, 'Create Reports', 8, 120, 'report#/report_wizard', 'menu_reports', 'Y', NULL, 'r_action=report.create', NULL, NULL, 'APP', 'N', NULL);
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) values (88, 'Sample Dashboard', 8, 130, 'report_dashboard', 'menu_reports', 'N', NULL, NULL, NULL, NULL, 'APP', 'N', NULL);
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (89, 'Import', 8, 140, 'report#/report_import', 'menu_reports', 'N', null, null, null, null, 'APP', 'N', null);
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (94, 'Self', 9, 40,'userProfile#/self_profile', 'menu_profile', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/profile.png');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (101, 'Roles', 10, 20, 'admin#/admin', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/users.png');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (102, 'Role Functions', 10, 30, 'admin#/role_function_list', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL);
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (105, 'Cache Admin', 10, 40, 'admin#/jcs_admin', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/cache.png');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (108, 'Usage', 10, 80, 'admin#/usage_list', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/users.png');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (121, 'Collaboration', 5000, 100, 'samplePage#/collaborate_list', 'menu_sample', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/bubble.png');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (930, 'Search', 9, 15, 'userProfile', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/search_profile.png');
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150022, 'Menus', 10, 60, 'admin#/admin_menu_edit', 'menu_admin', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL);
+INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (150038,'Notebook',5000,135,'samplePage#/notebook','menu_sample','Y',NULL,NULL,NULL,NULL,'APP','N',NULL);
+
+-- fn_user
+Insert into fn_user (USER_ID,ORG_ID,MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (1,null,null,'admin',null,'User',null,null,null,'admin@email.com',null,null,null,'admin',null,'admin','admin_password',str_to_date('24-OCT-16','%d-%M-%Y'),'Y',null,str_to_date('17-OCT-16','%d-%M-%Y'),1,str_to_date('24-OCT-16','%d-%M-%Y'),'N',null,null,null,'NJ',null,'US',null,null,null,null,null,10,null,null,null,null,null,null);
+
+-- fn_app
+Insert into fn_app (APP_ID,APP_NAME,APP_IMAGE_URL,APP_DESCRIPTION,APP_NOTES,APP_URL,APP_ALTERNATE_URL,APP_REST_ENDPOINT,ML_APP_NAME,ML_APP_ADMIN_ID,MOTS_ID,APP_PASSWORD,OPEN,ENABLED,THUMBNAIL,APP_USERNAME,UEB_KEY,UEB_SECRET,UEB_TOPIC_NAME) VALUES (1,'Default',null,'Some Default Description','Some Default Note',null,null,null,'ECPP','?','1','JuCerIRKt/faEcx8QdgncLEEv+IOZjpHe7Pi5DEPqKs=','N','N',null,'Default',null,null,'ECOMP-PORTAL-INBOX');
+
+-- fn_user_role
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,1,null,1);
+
+commit;
diff --git a/ui/db-scripts/akraino-blueprint_validation_db.sql b/ui/db-scripts/akraino-blueprint_validation_db.sql
new file mode 100644 (file)
index 0000000..c2d7320
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+SET FOREIGN_KEY_CHECKS=1;
+
+use akraino;
+
+DROP TABLE IF EXISTS submission;
+DROP TABLE IF EXISTS blueprint_instance_for_validation;
+DROP TABLE IF EXISTS blueprint;
+DROP TABLE IF EXISTS silo;
+DROP TABLE IF EXISTS timeslot;
+DROP TABLE IF EXISTS lab;
+
+create table lab (
+   id bigint not NULL AUTO_INCREMENT,
+   lab text not NULL,
+   CONSTRAINT id_pk PRIMARY KEY (id)
+);
+
+create table timeslot (
+   id bigint not NULL AUTO_INCREMENT,
+   start_date_time text,
+   duration text,
+   lab_id bigint not NULL,
+   CONSTRAINT id_pk PRIMARY KEY (id),
+   CONSTRAINT lab_id_fk FOREIGN KEY (lab_id)
+      REFERENCES lab (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+
+create table silo (
+   id bigint not NULL AUTO_INCREMENT,
+   silo text not NULL,
+   lab_id bigint not NULL,
+   CONSTRAINT id_pk PRIMARY KEY (id),
+   CONSTRAINT lab_id_fk2 FOREIGN KEY (lab_id)
+      REFERENCES lab (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+
+CREATE TABLE blueprint
+(
+   id bigint not NULL AUTO_INCREMENT,
+   blueprint_name varchar(20) not NULL unique,
+   CONSTRAINT id_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE blueprint_instance_for_validation
+(
+   id bigint not NULL AUTO_INCREMENT,
+   blueprint_id bigint not NULL,
+   version text not NULL,
+   layer text not NULL,
+   layer_description text not NULL,
+   CONSTRAINT id_pk PRIMARY KEY (id),
+   CONSTRAINT blueprint_id_fk FOREIGN KEY (blueprint_id)
+      REFERENCES blueprint (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+
+CREATE TABLE submission
+(
+   id bigint not NULL AUTO_INCREMENT,
+   status text not NULL,
+   jenkins_queue_job_item_url text,
+   nexus_result_url text,
+   blueprint_instance_for_validation_id bigint not NULL,
+   timeslot_id bigint not NULL,
+   CONSTRAINT id_pk PRIMARY KEY (id),
+   CONSTRAINT blueprint_instance_for_validation_id_fk FOREIGN KEY (blueprint_instance_for_validation_id)
+      REFERENCES blueprint_instance_for_validation (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION,
+   CONSTRAINT timeslot_id_fk FOREIGN KEY (timeslot_id)
+      REFERENCES timeslot (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (21, 'New Submission', 1, 10, 'newSubmission', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-building-home');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (22, 'Committed Submissions', 1, 10, 'committedSubmissions', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-building-home');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (23, 'Validation Results', 1, 10, 'report.htm', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', 'icon-misc-piechart');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (24, 'Get by submission id', 23, 10, 'getBySubmissionId', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (25, 'Get by blueprint name', 23, 10, '', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (26, 'Get by layer', 23, 10, '', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (27, 'Get by execution dates', 23, 10, '', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (28, 'Get by number of successful runs', 23, 10, '', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (29, 'Get by number of successful last runs', 23, 10, '', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (30, 'Get by number of failed last runs', 23, 10, '', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+insert into fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) VALUES (31, 'Get all', 23, 10, '', 'menu_tab', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', '/static/fusion/images/reports.png');
+
+-- fn_user
+Insert into fn_user (USER_ID,ORG_ID,MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values (2,null,null,'akraino',null,null,null,null,null,null,null,null,null,'akraino',null,'akraino','akraino_password',now(),'Y',null,now(),1,now(),'N',null,null,null,'NJ',null,'US',null,null,null,null,null,10,null,null,null,null,null,null);
+
+-- fn_role
+Insert into fn_role (ROLE_ID,ROLE_NAME,ACTIVE_YN,PRIORITY) values (17,'Blueprint Validation UI user','Y',5);
+
+-- fn_role_function
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (17,'menu_home');
+Insert into fn_role_function (ROLE_ID,FUNCTION_CD) values (17,'menu_tab');
+
+-- fn_user_role
+Insert into fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (2,17,null,1);
+
+commit;
diff --git a/ui/db-scripts/examples/initialize_db_example.sql b/ui/db-scripts/examples/initialize_db_example.sql
new file mode 100644 (file)
index 0000000..7902b94
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+SET FOREIGN_KEY_CHECKS=1;
+
+use akraino;
+
+insert into lab values(1, 0); /* 0 stands for AT&T lab */
+
+insert into timeslot values(1, 'now', null, 1);
+
+insert into silo values(1, 'att-blu-val', 1);
+
+insert into blueprint (id, blueprint_name) values(1, 'dummy');
+insert into blueprint (id, blueprint_name) values(2, 'Unicycle');
+insert into blueprint (id, blueprint_name) values(3, 'REC');
+
+insert into blueprint_instance_for_validation (id, blueprint_id, version, layer, layer_description) values(1, 1, 'latest', 0, 'Dummy Hardware');  /* 0 Stands for hardware layer */
+insert into blueprint_instance_for_validation (id, blueprint_id, version, layer, layer_description) values(2, 3, 'latest', 0, 'AT&T Hardware'); /* 0 Stands for hardware layer */
+insert into blueprint_instance_for_validation (id, blueprint_id, version, layer, layer_description) values(3, 3, 'latest', 1, 'OS of the AT&T platform'); /* 1 Stands for OS layer */
+insert into blueprint_instance_for_validation (id, blueprint_id, version, layer, layer_description) values(4, 3, 'latest', 2, 'K8s of the AT&T platform'); /* 2 Stands for K8s layer */
+insert into blueprint_instance_for_validation (id, blueprint_id, version, layer, layer_description) values(5, 3, 'latest', 7, 'All layers'); /* 7 Stands for all layers */
+insert into blueprint_instance_for_validation (id, blueprint_id, version, layer, layer_description) values(6, 2, 'latest', 0, 'Unicycle Hardware'); /* 0 Stands for hardware layer */
+
+commit;
diff --git a/ui/distribution.xml b/ui/distribution.xml
new file mode 100644 (file)
index 0000000..f3732bc
--- /dev/null
@@ -0,0 +1,33 @@
+<!-- Copyright (c) 2019 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. -->
+<assembly
+    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>distribution</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>${basedir}</directory>
+            <outputDirectory />
+            <excludes>
+                <exclude>.classpath</exclude>
+                <exclude>.project</exclude>
+                <exclude>.settings/</exclude>
+                <exclude>bin/</exclude>
+                <exclude>target/</exclude>
+                <exclude>distribution.xml</exclude>
+                <exclude>**/WEB-INF/conf/system.properties.*</exclude>
+            </excludes>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 85890da..46c647f
-<!--
-Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
+<?xml version="1.0"?>
+<!-- Copyright (c) 2019 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
 
-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
+    <groupId>org.akraino.validation</groupId>
+    <artifactId>ui</artifactId>
+    <version>0.1.0-SNAPSHOT</version>
+    <name>AECBlueprintValidationUI Maven Webapp</name>
+    <packaging>war</packaging>
 
-       http://www.apache.org/licenses/LICENSE-2.0
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <java-version>1.8</java-version>
+        <encoding>UTF-8</encoding>
+        <!-- Skip assembling the zip; assemble via mvn -Dskipassembly=false
+            .. -->
+        <skipassembly>true</skipassembly>
+        <!-- Tests usually require some setup that maven cannot do, so skip. -->
+        <skiptests>false</skiptests>
+        <epsdk.version>2.4.0</epsdk.version>
+        <jacoco.version>0.7.9</jacoco.version>
+        <springframework-version>4.2.3.RELEASE</springframework-version>
+        <maven-surefire-plugin-version>2.19.1</maven-surefire-plugin-version>
+        <maven-war-plugin-version>2.0.2</maven-war-plugin-version>
+        <maven-deploy-plugin-version>2.8</maven-deploy-plugin-version>
+        <eelf-core-version>1.0.0</eelf-core-version>
+        <jackson.version>2.8.10</jackson.version>
+        <c3p0.version>0.9.5.2</c3p0.version>
+        <io.searchbox.jest.version>2.0.0</io.searchbox.jest.version>
+        <javax.servlet-api.version>3.1.0</javax.servlet-api.version>
+        <junit.version>4.12</junit.version>
+        <elasticsearch>2.2.0</elasticsearch>
+        <org.json.version>20180813</org.json.version>
+        <quartz.version>2.2.1</quartz.version>
+        <jcl-over-slf4j.version>1.7.12</jcl-over-slf4j.version>
+        <jersey-version>1.19.4</jersey-version>
+        <google.guava-version>27.1-jre</google.guava-version>
+        <org.jsoup.version>1.12.1</org.jsoup.version>
+        <commons-httpclient.version>3.1</commons-httpclient.version>
+        <docker-maven-plugin.version>0.22.0</docker-maven-plugin.version>
+        <tomcat.download.path>http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.37/bin</tomcat.download.path>
+        <tomcat.download.name>apache-tomcat-8.0.37</tomcat.download.name>
+        <maven-assembly-plugin.version>3.0.0</maven-assembly-plugin.version>
+    </properties>
 
-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.
--->
+    <repositories>
+        <repository>
+            <id>onap-releases</id>
+            <name>onap-releases</name>
+            <url>https://nexus.onap.org/content/repositories/releases/</url>
+        </repository>
+    </repositories>
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.akraino.validation</groupId>
-  <artifactId>ui</artifactId>
-  <packaging>war</packaging>
-  <version>0.0.1-SNAPSHOT</version>
-  <name>AECBlueprintValidationUI Maven Webapp</name>
-  <url>http://maven.apache.org</url>
-  <properties>
-    <java-version>1.8</java-version>
-    <org.springframework-version>4.3.0.RELEASE</org.springframework-version>
-    <org.springframework.security.version>3.2.3.RELEASE</org.springframework.security.version>
-    <jackson.library>2.7.5</jackson.library>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <jersey-version>1.19.4</jersey-version>
-    <google.guava-version>27.1-jre</google.guava-version>
-  </properties>
+    <build>
+        <!-- The war file name carries no version number -->
+        <finalName>AECBlueprintValidationUI</finalName>
 
-  <repositories>
-    <repository>
-      <id>central</id>
-      <name>Central Repository</name>
-      <url>http://repo.maven.apache.org/maven2</url>
-      <layout>default</layout>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-    </repository>
-  </repositories>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${maven-surefire-plugin-version}</version>
+                <configuration>
+                    <skipTests>${skiptests}</skipTests>
+                    <includes>
+                        <include>**/Test*.java</include>
+                        <include>**/*Test.java</include>
+                        <include>**/*TestCase.java</include>
+                    </includes>
+                    <additionalClasspathElements>
+                        <additionalClasspathElement>${basedir}/war</additionalClasspathElement>
+                    </additionalClasspathElements>
+                    <systemPropertyVariables>
+                        <container.classpath>classpath:</container.classpath>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
 
-  <pluginRepositories>
-    <pluginRepository>
-      <id>central</id>
-      <name>Maven Plugin Repository</name>
-      <url>http://repo1.maven.org/maven2</url>
-      <layout>default</layout>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-      <releases>
-        <updatePolicy>never</updatePolicy>
-      </releases>
-    </pluginRepository>
-  </pluginRepositories>
+            <!-- add version number to manifest -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>${maven-war-plugin-version}</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                        </manifest>
+                        <manifestEntries>
+                            <Build-Number>${project.version}</Build-Number>
+                            <Build-Time>${maven.build.timestamp}</Build-Time>
+                        </manifestEntries>
+                    </archive>
+                    <overlays>
+                        <overlay>
+                            <groupId>org.onap.portal.sdk</groupId>
+                            <artifactId>epsdk-app-overlay</artifactId>
+                            <excludes>
+                                <exclude>app/fusion/scripts/DS2-view-models/welcome-content.html</exclude>
+                            </excludes>
+                        </overlay>
+                    </overlays>
+                </configuration>
+            </plugin>
 
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.12</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>1.11</version>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-webmvc</artifactId>
-      <version>${org.springframework-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-context</artifactId>
-      <version>${org.springframework-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-orm</artifactId>
-      <version>${org.springframework-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-tx</artifactId>
-      <version>${org.springframework-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-fileupload</groupId>
-      <artifactId>commons-fileupload</artifactId>
-      <version>1.3.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-core</artifactId>
-      <version>5.2.6.Final</version>
-    </dependency>
-    <dependency>
-      <groupId>org.javassist</groupId>
-      <artifactId>javassist</artifactId>
-      <version>3.18.2-GA</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-c3p0</artifactId>
-      <version>5.2.6.Final</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-dbcp</groupId>
-      <artifactId>commons-dbcp</artifactId>
-      <version>1.4</version>
-    </dependency>
-    <dependency>
-      <groupId>com.mchange</groupId>
-      <artifactId>c3p0</artifactId>
-      <version>0.9.5.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-validator</artifactId>
-      <version>5.4.1.Final</version>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.17</version>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-test</artifactId>
-      <version>${org.springframework-version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>javax.servlet-api</artifactId>
-      <version>3.0.1</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>jstl</artifactId>
-      <version>1.2</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>${jackson.library}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.dataformat</groupId>
-      <artifactId>jackson-dataformat-xml</artifactId>
-      <version>${jackson.library}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.dataformat</groupId>
-      <artifactId>jackson-dataformat-yaml</artifactId>
-      <version>${jackson.library}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-      <version>3.4</version>
-    </dependency>
-    <dependency>
-      <groupId>org.postgresql</groupId>
-      <artifactId>postgresql</artifactId>
-      <version>42.2.2</version>
-    </dependency>
-    <dependency>
-      <groupId>com.sun.jersey</groupId>
-      <artifactId>jersey-json</artifactId>
-      <version>${jersey-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.sun.jersey</groupId>
-      <artifactId>jersey-client</artifactId>
-      <version>${jersey-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>${google.guava-version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.json</groupId>
-      <artifactId>json</artifactId>
-      <version>20180813</version>
-    </dependency>
-    <dependency>
-      <groupId>org.jsoup</groupId>
-      <artifactId>jsoup</artifactId>
-      <version>1.12.1</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-httpclient</groupId>
-      <artifactId>commons-httpclient</artifactId>
-      <version>3.1</version>
-    </dependency>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>${maven-assembly-plugin.version}</version>
+                <configuration>
+                    <skipAssembly>${skipassembly}</skipAssembly>
+                    <descriptors>
+                        <descriptor>${basedir}/distribution.xml</descriptor>
+                    </descriptors>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
 
-  </dependencies>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>${maven-deploy-plugin-version}</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
 
-  <build>
-    <finalName>AECBlueprintValidationUI</finalName>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>2.3.2</version>
-          <configuration>
-            <source>${java-version}</source>
-            <target>${java-version}</target>
-          </configuration>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-war-plugin</artifactId>
-          <version>2.4</version>
-          <configuration>
-            <warSourceDirectory>src/main/webapp</warSourceDirectory>
-            <warName>AECBlueprintValidationUI</warName>
-            <failOnMissingWebXml>false</failOnMissingWebXml>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
+            <plugin>
+                <groupId>io.fabric8</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>${docker-maven-plugin.version}</version>
+                <configuration>
+                    <verbose>true</verbose>
+                    <images>
+                        <image>
+                            <name>akraino/validation:dev-ui-latest</name>
+                            <build>
+                                <from>tomcat:8.5.37</from>
+                                <assembly>
+                                    <descriptorRef>artifact</descriptorRef>
+                                </assembly>
+                                <runCmds>
+                                    <!-- must be all on one line; use CDATA
+                                        to turn off the Eclipse formatter -->
+                                    <run><![CDATA[mv /maven/*.war /usr/local/tomcat/webapps]]></run>
+                                </runCmds>
+                            </build>
+                        </image>
+                        <image>
+                            <name>akraino/validation:dev-mariadb-latest</name>
+                            <build>
+                                <from>mariadb:10.4.6</from>
+                                <assembly>
+                                    <descriptorRef>project</descriptorRef>
+                                </assembly>
+                                <runCmds>
+                                    <!-- must be all on one line; use CDATA
+                                        to turn off the Eclipse formatter -->
+                                    <run><![CDATA[mv /maven/db-scripts/EcompSdkDDLMySql_2_4_Common.sql /docker-entrypoint-initdb.d ; mv /maven/db-scripts/EcompSdkDDLMySql_2_4_OS.sql /docker-entrypoint-initdb.d ; mv /maven/db-scripts/EcompSdkDMLMySql_2_4_Common.sql /docker-entrypoint-initdb.d ; mv /maven/db-scripts/EcompSdkDMLMySql_2_4_OS.sql /docker-entrypoint-initdb.d ; mv /maven/db-scripts/akraino-blueprint_validation_db.sql /docker-entrypoint-initdb.d ; rm -fr /maven]]></run>
+                                </runCmds>
+                            </build>
+                        </image>
+                    </images>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+    <dependencies>
+        <!-- SDK overlay war -->
+        <dependency>
+            <groupId>org.onap.portal.sdk</groupId>
+            <artifactId>epsdk-app-overlay</artifactId>
+            <version>${epsdk.version}</version>
+            <type>war</type>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.portal.sdk</groupId>
+            <artifactId>epsdk-app-common</artifactId>
+            <version>${epsdk.version}</version>
+            <type>jar</type>
+        </dependency>
+        <!-- SDK components -->
+        <dependency>
+            <groupId>org.onap.portal.sdk</groupId>
+            <artifactId>epsdk-core</artifactId>
+            <version>${epsdk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.portal.sdk</groupId>
+            <artifactId>epsdk-analytics</artifactId>
+            <version>${epsdk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.portal.sdk</groupId>
+            <artifactId>epsdk-workflow</artifactId>
+            <version>${epsdk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.portal.sdk</groupId>
+            <artifactId>epsdk-music</artifactId>
+            <version>${epsdk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.att.eelf</groupId>
+            <artifactId>eelf-core</artifactId>
+            <version>${eelf-core-version}</version>
+        </dependency>
+        <!-- Mapper -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.mchange</groupId>
+            <artifactId>c3p0</artifactId>
+            <version>${c3p0.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.searchbox</groupId>
+            <artifactId>jest</artifactId>
+            <version>${io.searchbox.jest.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>${javax.servlet-api.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+        </dependency>
+        <!-- Elastic Search -->
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>${elasticsearch}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.lucene</groupId>
+                    <artifactId>lucene-queryparser</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>${org.json.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>${quartz.version}</version>
+            <exclusions>
+                <!-- exclude 0.9.1.1 to avoid dupe of com.mchange:c3p0:0.9.2.1 -->
+                <exclusion>
+                    <groupId>c3p0</groupId>
+                    <artifactId>c3p0</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- bridge to implement commons-logging using slf4j -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <version>${jcl-over-slf4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>${springframework-version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-tx</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <version>${springframework-version}</version>
+        </dependency>
+        <!-- Jacoco for offline instrumentation -->
+        <dependency>
+            <groupId>org.jacoco</groupId>
+            <artifactId>org.jacoco.agent</artifactId>
+            <version>${jacoco.version}</version>
+            <classifier>runtime</classifier>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-json</artifactId>
+            <version>${jersey-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-client</artifactId>
+            <version>${jersey-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${google.guava-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>${org.jsoup.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>${commons-httpclient.version}</version>
+        </dependency>
+
+    </dependencies>
 </project>
index 313ce89..6c80c24 100644 (file)
@@ -1,21 +1,25 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.client.jenkins;
 
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
 import java.net.MalformedURLException;
+import java.net.Proxy;
 import java.net.URL;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
@@ -39,7 +43,7 @@ import org.akraino.validation.ui.client.jenkins.resources.Parameter;
 import org.akraino.validation.ui.client.jenkins.resources.Parameters;
 import org.akraino.validation.ui.client.jenkins.resources.QueueJobItem;
 import org.apache.commons.httpclient.HttpException;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 
 import com.sun.jersey.api.client.Client;
 import com.sun.jersey.api.client.ClientHandlerException;
@@ -51,10 +55,12 @@ import com.sun.jersey.api.client.config.DefaultClientConfig;
 import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
 import com.sun.jersey.api.json.JSONConfiguration;
 import com.sun.jersey.client.urlconnection.HTTPSProperties;
+import com.sun.jersey.client.urlconnection.HttpURLConnectionFactory;
+import com.sun.jersey.client.urlconnection.URLConnectionClientHandler;
 
 public final class JenkinsExecutorClient {
 
-    private static final Logger LOGGER = Logger.getLogger(JenkinsExecutorClient.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(JenkinsExecutorClient.class);
 
     private static final List<JenkinsExecutorClient> JENKINS_CLIENTS = new ArrayList<>();
     private static final Object LOCK = new Object();
@@ -73,7 +79,23 @@ public final class JenkinsExecutorClient {
         this.baseurl = newBaseurl;
         ClientConfig clientConfig = new DefaultClientConfig();
         clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
-        this.client = Client.create(clientConfig);
+        this.client = new Client(new URLConnectionClientHandler(new HttpURLConnectionFactory() {
+            Proxy proxy = null;
+
+            @Override
+            public HttpURLConnection getHttpURLConnection(URL url) throws IOException {
+                try {
+                    String proxyIp = System.getenv("JENKINS_PROXY").substring(0,
+                            System.getenv("JENKINS_PROXY").lastIndexOf(":"));
+                    String proxyPort = System.getenv("JENKINS_PROXY")
+                            .substring(System.getenv("JENKINS_PROXY").lastIndexOf(":") + 1);
+                    proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, Integer.parseInt(proxyPort)));
+                    return (HttpURLConnection) url.openConnection(proxy);
+                } catch (Exception ex) {
+                    return (HttpURLConnection) url.openConnection();
+                }
+            }
+        }), clientConfig);
         this.client.addFilter(new HTTPBasicAuthFilter(user, password));
         // Create all-trusting host name verifier
         hostnameVerifier = new HostnameVerifier() {
@@ -130,11 +152,11 @@ public final class JenkinsExecutorClient {
     public QueueJobItem getQueueJobItem(URL queueJobItemUrl) throws HttpException, ClientHandlerException,
             UniformInterfaceException, KeyManagementException, NoSuchAlgorithmException {
         synchronized (LOCK) {
-            LOGGER.info("Trying to get a Jenkins resource");
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get a Jenkins resource");
             String crumb = this.getCrumb();
-            LOGGER.debug("Jenkins crumb is: " + crumb);
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "Jenkins crumb is: " + crumb);
             WebResource webResource = this.client.resource(queueJobItemUrl + "/api/json");
-            LOGGER.debug("Request URI of get: " + webResource.getURI().toString());
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
             WebResource.Builder builder = webResource.getRequestBuilder();
             builder.header("Jenkins-Crumb", crumb);
             ClientResponse response =
@@ -143,7 +165,7 @@ public final class JenkinsExecutorClient {
                 throw new HttpException("Get on Jenkins failed. HTTP error code : " + response.getStatus()
                         + " and message: " + response.getEntity(String.class));
             }
-            LOGGER.info("Get of Jenkins resource succeeded");
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "Get of Jenkins resource succeeded");
             return response.getEntity(QueueJobItem.class);
         }
     }
@@ -164,9 +186,9 @@ public final class JenkinsExecutorClient {
             throws HttpException, ClientHandlerException, UniformInterfaceException, MalformedURLException,
             KeyManagementException, NoSuchAlgorithmException {
         synchronized (LOCK) {
-            LOGGER.info("Trying to trigger a job to Jenkins");
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to trigger a job in Jenkins");
             String crumb = this.getCrumb();
-            LOGGER.debug("Jenkins crumb is: " + crumb);
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "Jenkins crumb is: " + crumb);
             String queryParams = "?";
             for (Parameter parameter : parameters.getParameter()) {
                 queryParams = queryParams + parameter.getName() + "=" + parameter.getValue() + "&";
@@ -174,7 +196,7 @@ public final class JenkinsExecutorClient {
             queryParams = queryParams.substring(0, queryParams.length() - 1);
             WebResource webResource =
                     this.client.resource(this.getBaseUrl() + "/job/" + jobName + "/buildWithParameters" + queryParams);
-            LOGGER.debug("Request URI of post: " + webResource.getURI().toString());
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of post: " + webResource.getURI().toString());
             WebResource.Builder builder = webResource.getRequestBuilder();
             builder.header("Jenkins-Crumb", crumb);
             ClientResponse response = builder.type("application/json").post(ClientResponse.class, String.class);
@@ -182,7 +204,7 @@ public final class JenkinsExecutorClient {
                 throw new HttpException("Post of Jenkins job failed. HTTP error code : " + response.getStatus()
                         + " and message: " + response.getEntity(String.class));
             }
-            LOGGER.info("Jenkins job has been successfully triggered");
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "Jenkins job has been successfully triggered");
             URL buildQueueUrl = null;
             MultivaluedMap<String, String> responseValues = response.getHeaders();
             Iterator<String> iter = responseValues.keySet().iterator();
@@ -198,7 +220,7 @@ public final class JenkinsExecutorClient {
 
     private String getCrumb() throws HttpException, ClientHandlerException, UniformInterfaceException,
             KeyManagementException, NoSuchAlgorithmException {
-        LOGGER.info("Get crumb attempt");
+        LOGGER.info(EELFLoggerDelegate.applicationLogger, "Attempting to get the crumb");
         setProperties();
         String crumbUri = baseurl + "/crumbIssuer/api/json";
         WebResource webResource = this.client.resource(crumbUri);
@@ -206,7 +228,7 @@ public final class JenkinsExecutorClient {
                 webResource.accept("application/json").type("application/json").get(ClientResponse.class);
         if (response.getStatus() == 201 || response.getStatus() == 200) {
             CrumbResponse crumbResponse = response.getEntity(CrumbResponse.class);
-            LOGGER.info("Successful crumb retrieval.");
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "Successful crumb retrieval");
             return crumbResponse.getCrumb();
         }
         throw new HttpException("Get crumb attempt towards Jenkins failed. HTTP error code: " + response.getStatus()
index 988685b..a0723c8 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.client.nexus;
 
@@ -35,13 +35,15 @@ import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
 
 import org.akraino.validation.ui.client.nexus.resources.RobotTestResult;
+import org.akraino.validation.ui.client.nexus.resources.WrapperRobotTestResult;
+import org.akraino.validation.ui.data.BlueprintLayer;
 import org.apache.commons.httpclient.HttpException;
-import org.apache.log4j.Logger;
 import org.json.JSONObject;
 import org.json.XML;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
@@ -61,7 +63,7 @@ import com.sun.jersey.client.urlconnection.URLConnectionClientHandler;
 
 public final class NexusExecutorClient {
 
-    private static final Logger LOGGER = Logger.getLogger(NexusExecutorClient.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(NexusExecutorClient.class);
 
     private final Client client;
     private final String baseurl;
@@ -72,17 +74,19 @@ public final class NexusExecutorClient {
         this.baseurl = newBaseurl;
         ClientConfig clientConfig = new DefaultClientConfig();
         clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
-        client = new Client(new URLConnectionClientHandler(new HttpURLConnectionFactory() {
+        this.client = new Client(new URLConnectionClientHandler(new HttpURLConnectionFactory() {
             Proxy proxy = null;
 
             @Override
             public HttpURLConnection getHttpURLConnection(URL url) throws IOException {
                 try {
-                    String proxyIp = System.getenv("proxy_ip");
-                    String proxyPort = System.getenv("proxy_port");
+                    String proxyIp =
+                            System.getenv("NEXUS_PROXY").substring(0, System.getenv("NEXUS_PROXY").lastIndexOf(":"));
+                    String proxyPort =
+                            System.getenv("NEXUS_PROXY").substring(System.getenv("NEXUS_PROXY").lastIndexOf(":") + 1);
                     proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, Integer.parseInt(proxyPort)));
                     return (HttpURLConnection) url.openConnection(proxy);
-                } catch (NumberFormatException ex) {
+                } catch (Exception ex) {
                     return (HttpURLConnection) url.openConnection();
                 }
             }
@@ -117,26 +121,54 @@ public final class NexusExecutorClient {
         return this.baseurl;
     }
 
-    public List<RobotTestResult> getRobotTestResults() throws ClientHandlerException, UniformInterfaceException,
+    public List<WrapperRobotTestResult> getRobotTestResults() throws ClientHandlerException, UniformInterfaceException,
             JsonParseException, JsonMappingException, IOException, KeyManagementException, NoSuchAlgorithmException {
-        List<RobotTestResult> robotTestResults = new ArrayList<RobotTestResult>();
-        LOGGER.info("Trying to get Robot Test Results");
+        List<WrapperRobotTestResult> listOfwrappers = new ArrayList<WrapperRobotTestResult>();
+        LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get the blueprint layers");
         setProperties();
         WebResource webResource = this.client.resource(this.baseurl + "/");
-        LOGGER.debug("Request URI of get: " + webResource.getURI().toString());
+        LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
         ClientResponse response = webResource.get(ClientResponse.class);
         if (response.getStatus() != 200) {
-            throw new HttpException("Could not retrieve robot test results from Nexus. HTTP error code : "
+            throw new HttpException("Could not retrieve blueprint layers from Nexus. HTTP error code : "
                     + response.getStatus() + " and message: " + response.getEntity(String.class));
         }
         Document document = Jsoup.parse(response.getEntity(String.class));
         List<Element> elements =
                 document.getElementsByTag("body").get(0).getElementsByTag("table").get(0).getElementsByTag("tr");
         for (int i = 2; i < elements.size(); i++) {
-            String resultName = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
-            resultName = resultName.substring(0, resultName.length() - 1);
-            webResource = this.client.resource(this.baseurl + "/" + resultName + "/output.xml");
-            LOGGER.debug("Request URI of get: " + webResource.getURI().toString());
+            String layer = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
+            layer = layer.substring(0, layer.length() - 1);
+            List<RobotTestResult> robotTestResults = getResultsOfALayer(this.baseurl + "/" + layer);
+            WrapperRobotTestResult wrapper = new WrapperRobotTestResult();
+            wrapper.setBlueprintLayer(BlueprintLayer.valueOf(layer.substring(0, 1).toUpperCase() + layer.substring(1)));
+            wrapper.setRobotTestResults(robotTestResults);
+            listOfwrappers.add(wrapper);
+        }
+        return listOfwrappers;
+    }
+
+    private List<RobotTestResult> getResultsOfALayer(String resultsUrl)
+            throws ClientHandlerException, UniformInterfaceException, JsonParseException, JsonMappingException,
+            IOException, KeyManagementException, NoSuchAlgorithmException {
+        List<RobotTestResult> robotTestResults = new ArrayList<RobotTestResult>();
+        LOGGER.info(EELFLoggerDelegate.applicationLogger, "Trying to get Robot Test Results");
+        setProperties();
+        WebResource webResource = this.client.resource(resultsUrl + "/");
+        LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
+        ClientResponse response = webResource.get(ClientResponse.class);
+        if (response.getStatus() != 200) {
+            throw new HttpException("Could not retrieve robot test results from Nexus. HTTP error code : "
+                    + response.getStatus() + " and message: " + response.getEntity(String.class));
+        }
+        Document document = Jsoup.parse(response.getEntity(String.class));
+        List<Element> elements = document.getElementsByTag("body").get(0).getElementsByTag("table").get(0)
+                .getElementsByTag("tbody").get(0).getElementsByTag("tr");
+        for (int i = 2; i < elements.size(); i++) {
+            String testSuiteName = elements.get(i).getElementsByTag("td").get(0).getElementsByTag("a").get(0).text();
+            testSuiteName = testSuiteName.substring(0, testSuiteName.length() - 1);
+            webResource = this.client.resource(resultsUrl + "/" + testSuiteName + "/output.xml");
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "Request URI of get: " + webResource.getURI().toString());
             response = webResource.get(ClientResponse.class);
             if (response.getStatus() != 200) {
                 throw new HttpException("Could not retrieve robot test result from Nexus. HTTP error code : "
@@ -147,7 +179,7 @@ public final class NexusExecutorClient {
             ObjectMapper mapper = new ObjectMapper();
             mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
             RobotTestResult robotTestResult = mapper.readValue(xmlJSONObj.toString(), RobotTestResult.class);
-            robotTestResult.setName(resultName);
+            robotTestResult.setName(testSuiteName);
             robotTestResults.add(robotTestResult);
         }
         return robotTestResults;
diff --git a/ui/src/main/java/org/akraino/validation/ui/client/nexus/resources/WrapperRobotTestResult.java b/ui/src/main/java/org/akraino/validation/ui/client/nexus/resources/WrapperRobotTestResult.java
new file mode 100644 (file)
index 0000000..30e6721
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.client.nexus.resources;
+
+import java.util.List;
+
+import org.akraino.validation.ui.data.BlueprintLayer;
+
+public class WrapperRobotTestResult {
+
+    private BlueprintLayer layer;
+
+    private List<RobotTestResult> testResults;
+
+    public WrapperRobotTestResult() {
+
+    }
+
+    public BlueprintLayer getBlueprintLayer() {
+        return this.layer;
+    }
+
+    public void setBlueprintLayer(BlueprintLayer layer) {
+        this.layer = layer;
+    }
+
+    public List<RobotTestResult> getRobotTestResults() {
+        return this.testResults;
+    }
+
+    public void setRobotTestResults(List<RobotTestResult> testResults) {
+        this.testResults = testResults;
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/common/PropertyUtil.java b/ui/src/main/java/org/akraino/validation/ui/common/PropertyUtil.java
deleted file mode 100644 (file)
index d0e46b2..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-package org.akraino.validation.ui.common;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import org.akraino.validation.ui.config.AppConfig;
-import org.apache.log4j.Logger;
-
-public class PropertyUtil {
-    private static final Logger LOGGER = Logger.getLogger(PropertyUtil.class);
-    private static final String PROP_FILENAME = "app.properties";
-    private static PropertyUtil instance;
-
-    private Properties appProps;
-
-    /**
-     * Return the single instance of this object in the app.
-     *
-     * @return the singleton
-     */
-    public static synchronized PropertyUtil getInstance() {
-        if (instance == null) {
-            instance = new PropertyUtil();
-        }
-        return instance;
-    }
-
-    private PropertyUtil() {
-        InputStream input = AppConfig.class.getClassLoader().getResourceAsStream(PROP_FILENAME);
-        appProps = new Properties();
-        try {
-            appProps.load(input);
-        } catch (IOException e) {
-            LOGGER.error("Error loading properties file: " + PROP_FILENAME);
-        } finally {
-            try {
-                input.close();
-            } catch (IOException e) {
-                // ignore
-            }
-        }
-    }
-
-    /**
-     * Get a property from the PropertyUtil object. If the environment variable $IP is set, then any URL's referring to
-     * localhost will be rewritten to use this IP address instead.
-     *
-     * @param key the key to use to find the property
-     * @return the value
-     */
-    public String getProperty(String key) {
-        String property = appProps.getProperty(key);
-        if (property != null && property.indexOf("://localhost:") > 0) {
-            String ipAddr = System.getenv().get("IP");
-            if (ipAddr != null && !"".contentEquals(ipAddr)) {
-                property = property.replaceAll("://localhost:", "://" + ipAddr + ":");
-            }
-        }
-        return property;
-    }
-}
diff --git a/ui/src/main/java/org/akraino/validation/ui/common/SessionManagerFilter.java b/ui/src/main/java/org/akraino/validation/ui/common/SessionManagerFilter.java
deleted file mode 100644 (file)
index e0ddd91..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-package org.akraino.validation.ui.common;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.log4j.Logger;
-import org.springframework.web.servlet.HandlerInterceptor;
-import org.springframework.web.servlet.ModelAndView;
-
-public class SessionManagerFilter implements HandlerInterceptor {
-
-    private static final Logger LOGGER = Logger.getLogger(SessionManagerFilter.class);
-
-    @Override
-    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
-            throws Exception {
-
-        LOGGER.info("user authenticated");
-
-    }
-
-    @Override
-    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
-            throws Exception {
-
-        LOGGER.info("user authenticated");
-
-    }
-
-    @Override
-    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object data) throws Exception {
-
-        try {
-            return true;
-            /*
-             * if (StringUtil.notEmpty(req.getHeader("tokenId"))) {
-             *
-             * String clientToken = req.getHeader("tokenId");
-             *
-             * AccessService service = new AccessService();
-             *
-             * UserSession user = service.getUserSession(LoginUtil.decode(LoginUtil.getUserName(clientToken)));
-             *
-             * if (user.getTokenId()!= null && !sessionExpired(user)) {
-             *
-             * if (user.getTokenId().equals(LoginUtil.getPassword(clientToken))) { // user authorized return true;
-             *
-             * } else { // unauthorized access res.sendError(401); } } else { // session does not exist/expired,
-             * temporary re-direct, ask user to re-login res.sendError(307); }
-             *
-             * } else { // bad request, no authToken sent in the request res.sendError(400); }
-             */
-        } catch (Exception e) {
-            LOGGER.error(e);
-        }
-
-
-        return false;
-    }
-
-
-}
diff --git a/ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppConfig.java b/ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppConfig.java
new file mode 100644 (file)
index 0000000..bb139f6
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.conf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.sql.DataSource;
+
+import org.akraino.validation.ui.login.LoginStrategyImpl;
+import org.akraino.validation.ui.scheduler.RegistryAdapter;
+import org.onap.portalapp.music.conf.MusicSessionConfig;
+import org.onap.portalsdk.core.auth.LoginStrategy;
+import org.onap.portalsdk.core.conf.AppConfig;
+import org.onap.portalsdk.core.conf.Configurable;
+import org.onap.portalsdk.core.logging.format.AlarmSeverityEnum;
+import org.onap.portalsdk.core.logging.format.AppMessagesEnum;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.objectcache.AbstractCacheManager;
+import org.onap.portalsdk.core.onboarding.util.CipherUtil;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.onap.portalsdk.core.util.CacheManager;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Profile;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+
+@Configuration
+@EnableWebMvc
+@ComponentScan(basePackages = {"org.akraino", "org.onap"})
+@PropertySource(value = {"${container.classpath:}/WEB-INF/conf/app/test.properties"}, ignoreResourceNotFound = true)
+@Profile("src")
+@EnableAsync
+@EnableScheduling
+@Import({MusicSessionConfig.class})
+public class ExternalAppConfig extends AppConfig implements Configurable {
+
+    private RegistryAdapter schedulerRegistryAdapter;
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(ExternalAppConfig.class);
+
+    @Configuration
+    @Import(SystemProperties.class)
+    static class InnerConfiguration {
+    }
+
+    /**
+     * @see org.onap.portalsdk.core.conf.AppConfig#viewResolver()
+     */
+    @Override
+    public ViewResolver viewResolver() {
+        return super.viewResolver();
+    }
+
+    /**
+     * @see org.onap.portalsdk.core.conf.AppConfig#addResourceHandlers(ResourceHandlerRegistry)
+     *
+     * @param registry
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        super.addResourceHandlers(registry);
+    }
+
+    /**
+     * @see org.onap.portalsdk.core.conf.AppConfig#dataAccessService()
+     */
+    @Override
+    public DataAccessService dataAccessService() {
+        return super.dataAccessService();
+    }
+
+    /**
+     *
+     * Creates the Application Data Source.
+     *
+     * @return DataSource Object
+     * @throws Exception on failure to create data source object
+     */
+    @Override
+    @Bean
+    public DataSource dataSource() throws Exception {
+
+        systemProperties();
+
+        ComboPooledDataSource dataSource = new ComboPooledDataSource();
+        try {
+            dataSource.setDriverClass(SystemProperties.getProperty(SystemProperties.DB_DRIVER));
+            dataSource.setJdbcUrl("jdbc:mariadb://" + System.getenv("DB_CONNECTION_URL"));
+            dataSource.setUser(SystemProperties.getProperty(SystemProperties.DB_USERNAME));
+            String password = System.getenv("MARIADB_ROOT_PASSWORD");
+            if (SystemProperties.containsProperty(SystemProperties.DB_ENCRYPT_FLAG)) {
+                String encryptFlag = SystemProperties.getProperty(SystemProperties.DB_ENCRYPT_FLAG);
+                if (encryptFlag != null && encryptFlag.equalsIgnoreCase("true")) {
+                    password = CipherUtil.decrypt(password);
+                }
+            }
+            dataSource.setPassword(password);
+            dataSource
+                    .setMinPoolSize(Integer.parseInt(SystemProperties.getProperty(SystemProperties.DB_MIN_POOL_SIZE)));
+            dataSource
+                    .setMaxPoolSize(Integer.parseInt(SystemProperties.getProperty(SystemProperties.DB_MAX_POOL_SIZE)));
+            dataSource.setIdleConnectionTestPeriod(
+                    Integer.parseInt(SystemProperties.getProperty(SystemProperties.IDLE_CONNECTION_TEST_PERIOD)));
+            dataSource.setTestConnectionOnCheckout(getConnectionOnCheckout());
+            dataSource.setPreferredTestQuery(getPreferredTestQuery());
+        } catch (Exception e) {
+            LOGGER.error(EELFLoggerDelegate.errorLogger,
+                    "Error initializing database, verify database settings in properties file: "
+                            + UserUtils.getStackTrace(e),
+                    AlarmSeverityEnum.CRITICAL);
+            LOGGER.error(EELFLoggerDelegate.debugLogger,
+                    "Error initializing database, verify database settings in properties file: "
+                            + UserUtils.getStackTrace(e),
+                    AlarmSeverityEnum.CRITICAL);
+            // Raise an alarm that opening a connection to the database failed.
+            LOGGER.logEcompError(AppMessagesEnum.BeDaoSystemError);
+            throw e;
+        }
+        return dataSource;
+    }
+
+    /**
+     * Creates a new list with a single entry that is the external app
+     * definitions.xml path.
+     *
+     * @return List of String, size 1
+     */
+    @Override
+    public List<String> addTileDefinitions() {
+        List<String> definitions = new ArrayList<>();
+        definitions.add("/WEB-INF/defs/definitions.xml");
+        return definitions;
+    }
+
+    /**
+     * Adds request interceptors to the specified registry by calling
+     * {@link AppConfig#addInterceptors(InterceptorRegistry)}, but excludes
+     * certain paths from the session timeout interceptor.
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        super.setExcludeUrlPathsForSessionTimeout("/login_external", "*/login_external.htm", "login", "/login.htm",
+                "/api*", "/single_signon.htm", "/single_signon");
+        super.addInterceptors(registry);
+    }
+
+    /**
+     * Creates and returns a new instance of a {@link CacheManager} class.
+     *
+     * @return New instance of {@link CacheManager}
+     */
+    @Bean
+    public AbstractCacheManager cacheManager() {
+        return new CacheManager();
+    }
+
+    /**
+     * Creates and returns a new instance of a {@link SchedulerFactoryBean}
+     * and populates it with triggers.
+     *
+     * @return New instance of {@link SchedulerFactoryBean}
+     * @throws Exception
+     */
+    // @Bean // ANNOTATION COMMENTED OUT
+    // APPLICATIONS REQUIRING QUARTZ SHOULD RESTORE ANNOTATION
+    public SchedulerFactoryBean schedulerFactoryBean() throws Exception {
+        SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
+        scheduler.setTriggers(schedulerRegistryAdapter.getTriggers());
+        scheduler.setConfigLocation(appApplicationContext.getResource("WEB-INF/conf/quartz.properties"));
+        scheduler.setDataSource(dataSource());
+        return scheduler;
+    }
+
+    /**
+     * Sets the scheduler registry adapter.
+     *
+     * @param schedulerRegistryAdapter
+     */
+    @Autowired
+    public void setSchedulerRegistryAdapter(final RegistryAdapter schedulerRegistryAdapter) {
+        this.schedulerRegistryAdapter = schedulerRegistryAdapter;
+    }
+
+    @Bean
+    public LoginStrategy loginStrategy() {
+        return new LoginStrategyImpl();
+    }
+
+    /**
+     * Gets the value of the property
+     * {@link SystemProperties#PREFERRED_TEST_QUERY}; defaults to "Select 1"
+     * if the property is not defined.
+     *
+     * @return String value that is a SQL query
+     */
+    private String getPreferredTestQuery() {
+        // Use simple default
+        String preferredTestQueryStr = "SELECT 1";
+        if (SystemProperties.containsProperty(SystemProperties.PREFERRED_TEST_QUERY)) {
+            preferredTestQueryStr = SystemProperties.getProperty(SystemProperties.PREFERRED_TEST_QUERY);
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "getPreferredTestQuery: property key {} value is {}",
+                    SystemProperties.PREFERRED_TEST_QUERY, preferredTestQueryStr);
+        } else {
+            LOGGER.info(EELFLoggerDelegate.errorLogger,
+                    "getPreferredTestQuery: property key {} not found, using default value {}",
+                    SystemProperties.PREFERRED_TEST_QUERY, preferredTestQueryStr);
+        }
+        return preferredTestQueryStr;
+    }
+
+    /**
+     * Gets the value of the property
+     * {@link SystemProperties#TEST_CONNECTION_ON_CHECKOUT}; defaults to true
+     * if the property is not defined.
+     *
+     * @return Boolean value
+     */
+    private Boolean getConnectionOnCheckout() {
+        // Default to true, always test connection
+        boolean testConnectionOnCheckout = true;
+        if (SystemProperties.containsProperty(SystemProperties.TEST_CONNECTION_ON_CHECKOUT)) {
+            testConnectionOnCheckout =
+                    Boolean.valueOf(SystemProperties.getProperty(SystemProperties.TEST_CONNECTION_ON_CHECKOUT));
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "getConnectionOnCheckout: property key {} value is {}",
+                    SystemProperties.TEST_CONNECTION_ON_CHECKOUT, testConnectionOnCheckout);
+        } else {
+            LOGGER.info(EELFLoggerDelegate.errorLogger,
+                    "getConnectionOnCheckout: property key {} not found, using default value {}",
+                    SystemProperties.TEST_CONNECTION_ON_CHECKOUT, testConnectionOnCheckout);
+        }
+        return testConnectionOnCheckout;
+    }
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppInitializer.java b/ui/src/main/java/org/akraino/validation/ui/conf/ExternalAppInitializer.java
new file mode 100644 (file)
index 0000000..c50d1b3
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * ============LICENSE_START==========================================
+ * ONAP Portal SDK
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License"); you may not use
+ * this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is
+ * licensed under the Creative Commons License, Attribution 4.0 Intl. (the
+ * "License"); you may not use this documentation except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * documentation 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 org.akraino.validation.ui.conf;
+
+import org.onap.portalsdk.core.conf.AppInitializer;
+
+public class ExternalAppInitializer extends AppInitializer {
+
+    @Override
+    protected Class<?>[] getRootConfigClasses() {
+        return super.getRootConfigClasses();
+    }
+
+    @Override
+    protected Class<?>[] getServletConfigClasses() {
+        Class<?> appConfigClass = ExternalAppConfig.class;
+        return new Class[] {appConfigClass};
+    }
+
+    /*
+     * URL request will direct to the Spring dispatcher for processing
+     */
+    @Override
+    protected String[] getServletMappings() {
+        return super.getServletMappings();
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/conf/HibernateMappingLocations.java b/ui/src/main/java/org/akraino/validation/ui/conf/HibernateMappingLocations.java
new file mode 100644 (file)
index 0000000..d14646f
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.conf;
+
+
+import org.onap.portalsdk.core.conf.HibernateMappingLocatable;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Component;
+
+@Component
+@Profile("src")
+public class HibernateMappingLocations implements HibernateMappingLocatable {
+
+    @Override
+    public Resource[] getMappingLocations() {
+        return new Resource[] {new ClassPathResource("../fusion/orm/Fusion.hbm.xml"),
+                new ClassPathResource("../fusion/orm/Workflow.hbm.xml"),
+                new ClassPathResource("../fusion/orm/RNoteBookIntegration.hbm.xml"),
+                new ClassPathResource("../fusion/orm/Analytics.hbm.xml")};
+    }
+
+    @Override
+    public String[] getPackagesToScan() {
+        return new String[] {"org.onap", "org.akraino"};
+    }
+
+}
@@ -1,19 +1,19 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
-package org.akraino.validation.ui.config;
+package org.akraino.validation.ui.conf;
 
 import java.lang.reflect.Field;
 import java.util.Comparator;
@@ -22,15 +22,7 @@ import java.util.concurrent.PriorityBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRegistration;
-
-import org.springframework.web.WebApplicationInitializer;
-import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
-import org.springframework.web.servlet.DispatcherServlet;
-
-public class AppInitializer implements WebApplicationInitializer {
+public class UiUtils {
 
     private static final int QUEUE_CAPACITY = 500;
     private static final int EXECUTOR_SIZE = 20; // the number of threads to keep in the pool, even if
@@ -43,29 +35,15 @@ public class AppInitializer implements WebApplicationInitializer {
     // terminating.
     private static final PriorityBlockingQueue<Runnable> BLOCKING_QUEUE =
             new PriorityBlockingQueue<Runnable>(QUEUE_CAPACITY, new CFRunnableComparator());
-    public static ExecutorService executorService = new ThreadPoolExecutor(EXECUTOR_SIZE,
-            EXECUTOR_MAX_SIZE, KEEPALIVE_TIME, TimeUnit.SECONDS, BLOCKING_QUEUE);
-
-    @Override
-    public void onStartup(ServletContext container) throws ServletException {
-
-        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
-        ctx.register(AppConfig.class);
-        ctx.setServletContext(container);
+    public static ExecutorService executorService =
+            new ThreadPoolExecutor(EXECUTOR_SIZE, EXECUTOR_MAX_SIZE, KEEPALIVE_TIME, TimeUnit.SECONDS, BLOCKING_QUEUE);
 
-        ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx));
-
-        servlet.setLoadOnStartup(1);
-        servlet.addMapping("/");
-
-    }
+    public static final String NEXUS_URL = "https://nexus.akraino.org/content/sites/logs";
 
     private static class CFRunnableComparator implements Comparator<Runnable> {
         @Override
         @SuppressWarnings("unchecked")
         public int compare(Runnable runnable1, Runnable runnable2) {
-            // T might be AsyncSupply, UniApply, etc., but we want to
-            // compare our original Runnables.
             return ((Comparable) unwrap(runnable1)).compareTo(unwrap(runnable2));
         }
 
@@ -73,8 +51,6 @@ public class AppInitializer implements WebApplicationInitializer {
             try {
                 Field field = runnable.getClass().getDeclaredField("fn");
                 field.setAccessible(true);
-                // NB: For performance-intensive contexts, you may want to
-                // cache these in a ConcurrentHashMap<Class<?>, Field>.
                 return field.get(runnable);
             } catch (IllegalAccessException | NoSuchFieldException e) {
                 throw new IllegalArgumentException("Couldn't unwrap " + runnable, e);
diff --git a/ui/src/main/java/org/akraino/validation/ui/config/AppConfig.java b/ui/src/main/java/org/akraino/validation/ui/config/AppConfig.java
deleted file mode 100644 (file)
index 6d55d42..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-package org.akraino.validation.ui.config;
-
-import javax.sql.DataSource;
-
-import org.akraino.validation.ui.common.PropertyUtil;
-import org.akraino.validation.ui.common.SessionManagerFilter;
-import org.apache.commons.dbcp.BasicDataSource;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.multipart.commons.CommonsMultipartResolver;
-import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
-import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-
-@Configuration
-@EnableWebMvc
-@ComponentScan(basePackages = "org.akraino.validation.ui")
-public class AppConfig extends WebMvcConfigurerAdapter {
-
-    @Bean
-    SessionManagerFilter getSessionManager() {
-        return new SessionManagerFilter();
-    }
-
-    @Override
-    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
-        configurer.enable();
-    }
-
-    @Override
-    public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(getSessionManager()).addPathPatterns("/**").excludePathPatterns("/login", "/logout");
-
-    }
-
-    @Bean
-    public CommonsMultipartResolver multipartResolver() {
-
-        CommonsMultipartResolver cmr = new CommonsMultipartResolver();
-        cmr.setMaxUploadSize(1000000 * 2);
-        cmr.setMaxUploadSizePerFile(2000000); // bytes
-        return cmr;
-
-    }
-
-    @Bean(name = "dataSource")
-    public DataSource getDataSource() {
-        BasicDataSource dataSource = new BasicDataSource();
-        dataSource.setDriverClassName("org.postgresql.Driver");
-        dataSource.setUrl(PropertyUtil.getInstance().getProperty("postgres.db.url"));
-        dataSource.setUsername(PropertyUtil.getInstance().getProperty("postgres.db.user.name"));
-        dataSource.setPassword(System.getenv("postgres_db_user_pwd"));
-
-        return dataSource;
-    }
-
-}
diff --git a/ui/src/main/java/org/akraino/validation/ui/config/HibernateConfig.java b/ui/src/main/java/org/akraino/validation/ui/config/HibernateConfig.java
deleted file mode 100644 (file)
index 03a91be..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-package org.akraino.validation.ui.config;
-
-import java.util.Properties;
-
-import javax.sql.DataSource;
-
-import org.hibernate.SessionFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.core.env.Environment;
-import org.springframework.orm.hibernate5.HibernateTransactionManager;
-import org.springframework.orm.hibernate5.LocalSessionFactoryBuilder;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-@Configuration
-@EnableTransactionManagement
-@PropertySource(value = {"classpath:hibernate.properties"})
-public class HibernateConfig {
-
-    @Autowired
-    private Environment env;
-
-    @Autowired
-    @Bean(name = "sessionFactory")
-    public SessionFactory getSessionFactory(DataSource dataSource) {
-        LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
-
-        sessionBuilder.scanPackages("org.akraino.validation.ui.entity");
-        sessionBuilder.addProperties(hibernateProperties());
-
-        return sessionBuilder.buildSessionFactory();
-
-    }
-
-    @Autowired
-    @Bean(name = "transactionManager")
-    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
-
-        return new HibernateTransactionManager(sessionFactory);
-
-    }
-
-    private Properties hibernateProperties() {
-
-        Properties properties = new Properties();
-
-        properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
-        properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
-        properties.put("hibernate.c3p0.min_size", env.getProperty("hibernate.c3p0.min_size"));
-        properties.put("hibernate.c3p0.max_size", env.getProperty("hibernate.c3p0.max_size"));
-        properties.put("hibernate.c3p0.max_statements", env.getProperty("hibernate.c3p0.max_statements"));
-        properties.put("hibernate.c3p0.acquire_increment", env.getProperty("hibernate.c3p0.acquire_increment"));
-        properties.put("hibernate.jdbc.use_streams_for_binary",
-                env.getProperty("hibernate.jdbc.use_streams_for_binary"));
-
-        return properties;
-    }
-}
index 22ae510..fdc6449 100644 (file)
  * implied. See the License for the specific language governing
  * permissions and limitations under the License.
  */
+
 package org.akraino.validation.ui.controller;
 
 import java.util.List;
 
 import org.akraino.validation.ui.entity.Blueprint;
 import org.akraino.validation.ui.service.BlueprintService;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RequestMethod;
 
-@RestController
+@Controller
 @RequestMapping("/api/blueprint")
-public class BlueprintController {
+public class BlueprintController extends RestrictedBaseController {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(BlueprintController.class);
 
     @Autowired
     BlueprintService service;
 
-    private static final Logger LOGGER = Logger.getLogger(BlueprintController.class);
+    public BlueprintController() {
+        super();
+    }
 
-    @GetMapping("/")
+    @RequestMapping(value = {"/"}, method = RequestMethod.GET)
     public ResponseEntity<List<Blueprint>> getBlueprints() {
         try {
             return new ResponseEntity<>(service.getBlueprints(), HttpStatus.OK);
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(EELFLoggerDelegate.errorLogger,
+                    "Error when trying to get blueprints. " + UserUtils.getStackTrace(e));
         }
         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
     }
-
 }
diff --git a/ui/src/main/java/org/akraino/validation/ui/controller/BlueprintInstanceController.java b/ui/src/main/java/org/akraino/validation/ui/controller/BlueprintInstanceController.java
deleted file mode 100644 (file)
index 6acdba8..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-package org.akraino.validation.ui.controller;
-
-import java.util.List;
-
-import org.akraino.validation.ui.entity.BlueprintInstance;
-import org.akraino.validation.ui.service.BlueprintInstanceService;
-import org.apache.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("/api/blueprintInstance")
-public class BlueprintInstanceController {
-
-    @Autowired
-    BlueprintInstanceService service;
-
-    private static final Logger LOGGER = Logger.getLogger(BlueprintInstanceController.class);
-
-    @GetMapping("/")
-    public ResponseEntity<List<BlueprintInstance>> getBlueprintInstances() {
-        try {
-            return new ResponseEntity<>(service.getBlueprintInstances(), HttpStatus.OK);
-        } catch (Exception e) {
-            LOGGER.error(e);
-        }
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
-    }
-
-}
diff --git a/ui/src/main/java/org/akraino/validation/ui/controller/BlueprintInstanceForValidationController.java b/ui/src/main/java/org/akraino/validation/ui/controller/BlueprintInstanceForValidationController.java
new file mode 100644 (file)
index 0000000..749fb75
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+package org.akraino.validation.ui.controller;
+
+import java.util.List;
+
+import org.akraino.validation.ui.entity.BlueprintInstanceForValidation;
+import org.akraino.validation.ui.service.BlueprintInstanceForValidationService;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+@RequestMapping("/api/blueprintInstanceForValidation")
+public class BlueprintInstanceForValidationController extends RestrictedBaseController {
+
+    private static final EELFLoggerDelegate LOGGER =
+            EELFLoggerDelegate.getLogger(BlueprintInstanceForValidationController.class);
+
+    @Autowired
+    BlueprintInstanceForValidationService service;
+
+    public BlueprintInstanceForValidationController() {
+        super();
+    }
+
+    @RequestMapping(value = {"/"}, method = RequestMethod.GET)
+    public ResponseEntity<List<BlueprintInstanceForValidation>> getBlueprintInstancesForValidation() {
+        try {
+            return new ResponseEntity<>(service.getBlueprintInstancesForValidation(), HttpStatus.OK);
+        } catch (Exception e) {
+            LOGGER.error(EELFLoggerDelegate.errorLogger,
+                    "Error when trying to get blueprint instances for validation. " + UserUtils.getStackTrace(e));
+        }
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
+    }
+
+}
index 1c0b3bc..79bedb1 100644 (file)
@@ -1,47 +1,55 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.controller;
 
 import org.akraino.validation.ui.data.JnksJobNotify;
 import org.akraino.validation.ui.service.JenkinsJobNotificationService;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RequestMethod;
 
-@RestController
+@Controller
 @RequestMapping("/api/jenkinsJobNotification")
-public class JenkinsJobNotificationController {
+public class JenkinsJobNotificationController extends RestrictedBaseController {
 
     @Autowired
     JenkinsJobNotificationService service;
 
-    private static final Logger LOGGER = Logger.getLogger(JenkinsJobNotificationController.class);
+    private static final EELFLoggerDelegate LOGGER =
+            EELFLoggerDelegate.getLogger(JenkinsJobNotificationController.class);
 
-    @PostMapping("/")
+    public JenkinsJobNotificationController() {
+        super();
+    }
+
+    @RequestMapping(value = {"/"}, method = RequestMethod.POST)
     public ResponseEntity<Void> handle(@RequestBody JnksJobNotify jnksJobNotify) {
         try {
             service.handle(jnksJobNotify);
             return new ResponseEntity<Void>(HttpStatus.OK);
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(EELFLoggerDelegate.errorLogger,
+                    "Error when trying to process Jenkins notification. " + UserUtils.getStackTrace(e));
         }
         return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
     }
diff --git a/ui/src/main/java/org/akraino/validation/ui/controller/ModelsViewsController.java b/ui/src/main/java/org/akraino/validation/ui/controller/ModelsViewsController.java
new file mode 100644 (file)
index 0000000..430f169
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+package org.akraino.validation.ui.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+@Controller
+@RequestMapping("/")
+public class ModelsViewsController extends RestrictedBaseController {
+
+    public ModelsViewsController() {
+        super();
+    }
+
+    @RequestMapping(value = {"/newSubmission"}, method = RequestMethod.GET)
+    public ModelAndView newSubmission(HttpServletRequest request) {
+        final String defaultViewName = null;
+        return new ModelAndView(defaultViewName);
+    }
+
+    @RequestMapping(value = {"/committedSubmissions"}, method = RequestMethod.GET)
+    public ModelAndView committedSubmissions(HttpServletRequest request) {
+        final String defaultViewName = null;
+        return new ModelAndView(defaultViewName);
+    }
+
+    @RequestMapping(value = {"/getBySubmissionId"}, method = RequestMethod.GET)
+    public ModelAndView getBySubmissionId(HttpServletRequest request) {
+        final String defaultViewName = null;
+        return new ModelAndView(defaultViewName);
+    }
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/controller/OnapLoginController.java b/ui/src/main/java/org/akraino/validation/ui/controller/OnapLoginController.java
new file mode 100644 (file)
index 0000000..09ee1a2
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * ============LICENSE_START==========================================
+ * ONAP Portal SDK
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License"); you may not use
+ * this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is
+ * licensed under the Creative Commons License, Attribution 4.0 Intl. (the
+ * "License"); you may not use this documentation except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * documentation 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 org.akraino.validation.ui.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.onap.portalsdk.core.auth.LoginStrategy;
+import org.onap.portalsdk.core.controller.UnRestrictedBaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+@Controller
+@RequestMapping("/")
+public class OnapLoginController extends UnRestrictedBaseController {
+
+    @Autowired
+    private LoginStrategy loginStrategy;
+
+    private String viewName;
+
+    @Override
+    public String getViewName() {
+        return viewName;
+    }
+
+    @Override
+    public void setViewName(String viewName) {
+        this.viewName = viewName;
+    }
+
+    @RequestMapping(value = {"/do_login_external"}, method = RequestMethod.POST)
+    public ModelAndView doexternalLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        return loginStrategy.doLogin(request, response);
+    }
+
+}
index 3013948..a4b460d 100644 (file)
@@ -1,47 +1,55 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.controller;
 
 import java.util.List;
 
-import org.akraino.validation.ui.client.nexus.resources.RobotTestResult;
+import org.akraino.validation.ui.client.nexus.resources.WrapperRobotTestResult;
 import org.akraino.validation.ui.service.ResultService;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RequestMethod;
 
-@RestController
+@Controller
 @RequestMapping("/api/results")
-public class ResultsController {
+public class ResultsController extends RestrictedBaseController {
 
-    private static final Logger LOGGER = Logger.getLogger(ResultsController.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(ResultsController.class);
 
     @Autowired
     ResultService service;
 
-    @RequestMapping(value = "/findBySubmissionId/{id}")
-    public ResponseEntity<List<RobotTestResult>> findByBlueprintId(@PathVariable("id") String submissionId) {
+    public ResultsController() {
+        super();
+    }
+
+    @RequestMapping(value = {"/getBySubmissionId/{id}"}, method = RequestMethod.GET)
+    public ResponseEntity<List<WrapperRobotTestResult>> getByBlueprintId(@PathVariable("id") String submissionId) {
         try {
             return new ResponseEntity<>(service.getRobotTestResults(submissionId), HttpStatus.OK);
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(EELFLoggerDelegate.errorLogger,
+                    "Error when retrieving results. " + UserUtils.getStackTrace(e));
         }
         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
     }
index ca78b0d..bb898a9 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.controller;
 
@@ -19,55 +19,60 @@ import java.util.List;
 
 import org.akraino.validation.ui.entity.Submission;
 import org.akraino.validation.ui.service.SubmissionService;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RequestMethod;
 
-@RestController
+@Controller
 @RequestMapping("/api/submission")
-public class SubmissionController {
+public class SubmissionController extends RestrictedBaseController {
 
     @Autowired
     SubmissionService service;
 
-    private static final Logger LOGGER = Logger.getLogger(SubmissionController.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(SubmissionController.class);
 
-    @GetMapping("/")
+    public SubmissionController() {
+        super();
+    }
+
+    @RequestMapping(value = {"/"}, method = RequestMethod.GET)
     public ResponseEntity<List<Submission>> getSubmissions() {
         try {
             return new ResponseEntity<>(service.getSubmissions(), HttpStatus.OK);
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(EELFLoggerDelegate.errorLogger, "Get of submissions failed. " + UserUtils.getStackTrace(e));
         }
         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
     }
 
-    @PostMapping("/")
+    @RequestMapping(value = {"/"}, method = RequestMethod.POST)
     public ResponseEntity<Submission> postSubmission(@RequestBody Submission newSubmission) {
         try {
-            return new ResponseEntity<>(service.saveSubmission(newSubmission), HttpStatus.CREATED);
+            return new ResponseEntity<>(service.saveSubmission(newSubmission), HttpStatus.OK);
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(EELFLoggerDelegate.errorLogger, "Post of submission failed. " + UserUtils.getStackTrace(e));
         }
         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
     }
 
-    @DeleteMapping("/")
+    @RequestMapping(value = {"/"}, method = RequestMethod.DELETE)
     public ResponseEntity<Boolean> deleteSubmission(@RequestBody Submission submission) {
         try {
             service.deleteSubmission(submission.getSubmissionId());
             return new ResponseEntity<>(true, HttpStatus.OK);
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(EELFLoggerDelegate.errorLogger,
+                    "Deletion of submission failed. " + UserUtils.getStackTrace(e));
         }
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(false);
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
     }
 
 }
@@ -1,49 +1,56 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
+
 package org.akraino.validation.ui.controller;
 
 import java.util.List;
 
 import org.akraino.validation.ui.entity.Timeslot;
 import org.akraino.validation.ui.service.TimeslotService;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RequestMethod;
 
-@RestController
+@Controller
 @RequestMapping("/api/timeslots")
-public class TimeSlotsController {
+public class TimeslotsController extends RestrictedBaseController {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(TimeslotsController.class);
 
     @Autowired
     TimeslotService service;
 
-    private static final Logger LOGGER = Logger.getLogger(TimeSlotsController.class);
+    public TimeslotsController() {
+        super();
+    }
 
-    @GetMapping("/")
+    @RequestMapping(value = {"/"}, method = RequestMethod.GET)
     public ResponseEntity<List<Timeslot>> getTimeSlots() {
         try {
             return new ResponseEntity<>(service.getTimeslots(), HttpStatus.OK);
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(EELFLoggerDelegate.errorLogger,
+                    "Error occured when trying to retrieve timeslots. " + UserUtils.getStackTrace(e));
         }
         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
     }
-
 }
diff --git a/ui/src/main/java/org/akraino/validation/ui/dao/BlueprintInstanceForValidationDAO.java b/ui/src/main/java/org/akraino/validation/ui/dao/BlueprintInstanceForValidationDAO.java
new file mode 100644 (file)
index 0000000..736d121
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.dao;
+
+import java.util.List;
+
+import org.akraino.validation.ui.entity.BlueprintInstanceForValidation;
+
+public interface BlueprintInstanceForValidationDAO {
+
+    void saveOrUpdate(BlueprintInstanceForValidation blueprintInst);
+
+    void merge(BlueprintInstanceForValidation blueprintInst);
+
+    List<BlueprintInstanceForValidation> getBlueprintInstancesForValidation();
+
+    BlueprintInstanceForValidation getBlueprintInstanceForValidation(Integer instId);
+
+    void deleteBlueprintInstanceForValidation(BlueprintInstanceForValidation blueprintInst);
+
+    void deleteAll();
+
+}
@@ -17,19 +17,19 @@ package org.akraino.validation.ui.dao;
 
 import java.util.List;
 
-import org.akraino.validation.ui.entity.BlueprintInstance;
+import org.akraino.validation.ui.entity.LabInfo;
 
-public interface BlueprintInstanceDAO {
+public interface LabDAO {
 
-    void saveOrUpdate(BlueprintInstance blueprintInstance);
+    void saveOrUpdate(LabInfo lab);
 
-    void merge(BlueprintInstance blueprintInstance);
+    void merge(LabInfo lab);
 
-    List<BlueprintInstance> getBlueprintInstances();
+    List<LabInfo> getLabs();
 
-    BlueprintInstance getBlueprintInstance(Integer instId);
+    LabInfo getLab(Integer labId);
 
-    void deleteBlueprintInstance(BlueprintInstance blueprintInstance);
+    void deleteLab(LabInfo lab);
 
     void deleteAll();
 
diff --git a/ui/src/main/java/org/akraino/validation/ui/dao/SiloDAO.java b/ui/src/main/java/org/akraino/validation/ui/dao/SiloDAO.java
new file mode 100644 (file)
index 0000000..883fa82
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.dao;
+
+import java.util.List;
+
+import org.akraino.validation.ui.entity.LabSilo;
+
+public interface SiloDAO {
+
+    void saveOrUpdate(LabSilo silo);
+
+    void merge(LabSilo silo);
+
+    List<LabSilo> getSilos();
+
+    LabSilo getSilo(Integer siloId);
+
+    void deleteSilo(LabSilo silo);
+
+    void deleteAll();
+
+}
index fc5e84f..7e551d7 100644 (file)
@@ -1,14 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.dao;
 
index c4dbbe1..a62d3b1 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.dao;
 
index 5466c13..771c327 100644 (file)
@@ -1,40 +1,36 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.daoimpl;
 
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
 import org.akraino.validation.ui.dao.BlueprintDAO;
 import org.akraino.validation.ui.entity.Blueprint;
-import org.apache.log4j.Logger;
+import org.hibernate.Criteria;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
-import org.hibernate.query.Query;
+import org.hibernate.criterion.Restrictions;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public class BlueprintDAOImpl implements BlueprintDAO {
 
-    private static final Logger LOGGER = Logger.getLogger(BlueprintDAOImpl.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(BlueprintDAOImpl.class);
 
     @Autowired
     private SessionFactory sessionFactory;
@@ -45,54 +41,36 @@ public class BlueprintDAOImpl implements BlueprintDAO {
 
     @Override
     public List<Blueprint> getBlueprints() {
-
-        CriteriaBuilder builder = getSession().getCriteriaBuilder();
-        CriteriaQuery<Blueprint> criteria = builder.createQuery(Blueprint.class);
-
-        Root<Blueprint> root = criteria.from(Blueprint.class);
-        criteria.select(root);
-
-        Query<Blueprint> query = getSession().createQuery(criteria);
-
-        return query.getResultList();
-
+        Criteria criteria = getSession().createCriteria(Blueprint.class);
+        return criteria.list();
     }
 
     @Override
     public Blueprint getBlueprint(Integer blueprintId) {
-
-        EntityManager entityManager = getSession().getEntityManagerFactory().createEntityManager();
-
-        return entityManager.find(Blueprint.class, blueprintId);
+        Criteria criteria = getSession().createCriteria(Blueprint.class);
+        criteria.add(Restrictions.eq("id", String.valueOf(blueprintId)));
+        return criteria.list() == null ? null : (Blueprint) criteria.list().get(0);
     }
 
     @Override
     public void saveOrUpdate(Blueprint blueprint) {
         getSession().saveOrUpdate(blueprint);
-
     }
 
     @Override
     public void merge(Blueprint blueprint) {
         getSession().merge(blueprint);
-
     }
 
     @Override
     public void deleteBlueprint(Blueprint blueprint) {
         getSession().delete(blueprint);
-
     }
 
     @Override
     public void deleteAll() {
-
-        Query<?> query = getSession().createQuery("delete from Blueprint");
-
-        int result = query.executeUpdate();
-
-        if (result > 0) {
-            LOGGER.info("All blueprint entries are cleaned up");
+        if (getSession().createQuery("delete from Blueprint").executeUpdate() > 0) {
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "All blueprint entries are cleaned up");
         }
     }
 
diff --git a/ui/src/main/java/org/akraino/validation/ui/daoimpl/BlueprintInstanceDAOImpl.java b/ui/src/main/java/org/akraino/validation/ui/daoimpl/BlueprintInstanceDAOImpl.java
deleted file mode 100644 (file)
index 4bacb14..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-package org.akraino.validation.ui.daoimpl;
-
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
-import org.akraino.validation.ui.dao.BlueprintInstanceDAO;
-import org.akraino.validation.ui.entity.BlueprintInstance;
-import org.apache.log4j.Logger;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.query.Query;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public class BlueprintInstanceDAOImpl implements BlueprintInstanceDAO {
-
-    private static final Logger LOGGER = Logger.getLogger(BlueprintInstanceDAOImpl.class);
-
-    @Autowired
-    private SessionFactory sessionFactory;
-
-    protected Session getSession() {
-        return sessionFactory.getCurrentSession();
-    }
-
-    @Override
-    public List<BlueprintInstance> getBlueprintInstances() {
-
-        CriteriaBuilder builder = getSession().getCriteriaBuilder();
-        CriteriaQuery<BlueprintInstance> criteria = builder.createQuery(BlueprintInstance.class);
-
-        Root<BlueprintInstance> root = criteria.from(BlueprintInstance.class);
-        criteria.select(root);
-
-        Query<BlueprintInstance> query = getSession().createQuery(criteria);
-
-        return query.getResultList();
-
-    }
-
-    @Override
-    public BlueprintInstance getBlueprintInstance(Integer instId) {
-
-        EntityManager entityManager = getSession().getEntityManagerFactory().createEntityManager();
-
-        return entityManager.find(BlueprintInstance.class, instId);
-    }
-
-    @Override
-    public void saveOrUpdate(BlueprintInstance blueprintInstance) {
-        getSession().saveOrUpdate(blueprintInstance);
-
-    }
-
-    @Override
-    public void merge(BlueprintInstance blueprintInstance) {
-        getSession().merge(blueprintInstance);
-
-    }
-
-    @Override
-    public void deleteBlueprintInstance(BlueprintInstance blueprintInstance) {
-        getSession().delete(blueprintInstance);
-
-    }
-
-    @Override
-    public void deleteAll() {
-
-        Query<?> query = getSession().createQuery("delete from BlueprintInstance");
-
-        int result = query.executeUpdate();
-
-        if (result > 0) {
-            LOGGER.info("All blueprint instance entries are cleaned up");
-        }
-    }
-
-}
diff --git a/ui/src/main/java/org/akraino/validation/ui/daoimpl/BlueprintInstanceForValidationDAOImpl.java b/ui/src/main/java/org/akraino/validation/ui/daoimpl/BlueprintInstanceForValidationDAOImpl.java
new file mode 100644 (file)
index 0000000..7c51b69
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.daoimpl;
+
+import java.util.List;
+
+import org.akraino.validation.ui.dao.BlueprintInstanceForValidationDAO;
+import org.akraino.validation.ui.entity.BlueprintInstanceForValidation;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.Restrictions;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class BlueprintInstanceForValidationDAOImpl implements BlueprintInstanceForValidationDAO {
+
+    private static final EELFLoggerDelegate LOGGER =
+            EELFLoggerDelegate.getLogger(BlueprintInstanceForValidationDAOImpl.class);
+
+    @Autowired
+    private SessionFactory sessionFactory;
+
+    protected Session getSession() {
+        return sessionFactory.getCurrentSession();
+    }
+
+    @Override
+    public List<BlueprintInstanceForValidation> getBlueprintInstancesForValidation() {
+        Criteria criteria = getSession().createCriteria(BlueprintInstanceForValidation.class);
+        return criteria.list();
+    }
+
+    @Override
+    public BlueprintInstanceForValidation getBlueprintInstanceForValidation(Integer instId) {
+        Criteria criteria = getSession().createCriteria(BlueprintInstanceForValidation.class);
+        criteria.add(Restrictions.eq("id", String.valueOf(instId)));
+        return criteria.list() == null ? null : (BlueprintInstanceForValidation) criteria.list().get(0);
+    }
+
+    @Override
+    public void saveOrUpdate(BlueprintInstanceForValidation blueprintInst) {
+        getSession().saveOrUpdate(blueprintInst);
+    }
+
+    @Override
+    public void merge(BlueprintInstanceForValidation blueprintInst) {
+        getSession().merge(blueprintInst);
+    }
+
+    @Override
+    public void deleteBlueprintInstanceForValidation(BlueprintInstanceForValidation blueprintInst) {
+        getSession().delete(blueprintInst);
+    }
+
+    @Override
+    public void deleteAll() {
+        if (getSession().createQuery("delete from BlueprintInstanceForValidation").executeUpdate() > 0) {
+            LOGGER.info(EELFLoggerDelegate.applicationLogger,
+                    "All blueprint instances for validation entries are cleaned up");
+        }
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/daoimpl/LabDAOImpl.java b/ui/src/main/java/org/akraino/validation/ui/daoimpl/LabDAOImpl.java
new file mode 100644 (file)
index 0000000..3a383da
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.daoimpl;
+
+import java.util.List;
+
+import org.akraino.validation.ui.dao.LabDAO;
+import org.akraino.validation.ui.entity.LabInfo;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.Restrictions;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class LabDAOImpl implements LabDAO {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(LabDAOImpl.class);
+
+    @Autowired
+    private SessionFactory sessionFactory;
+
+    protected Session getSession() {
+        return sessionFactory.getCurrentSession();
+    }
+
+    @Override
+    public List<LabInfo> getLabs() {
+        Criteria criteria = getSession().createCriteria(LabInfo.class);
+        return criteria.list();
+    }
+
+    @Override
+    public LabInfo getLab(Integer labId) {
+        Criteria criteria = getSession().createCriteria(LabInfo.class);
+        criteria.add(Restrictions.eq("id", String.valueOf(labId)));
+        return criteria.list() == null ? null : (LabInfo) criteria.list().get(0);
+    }
+
+    @Override
+    public void saveOrUpdate(LabInfo lab) {
+        getSession().saveOrUpdate(lab);
+    }
+
+    @Override
+    public void merge(LabInfo lab) {
+        getSession().merge(lab);
+    }
+
+    @Override
+    public void deleteLab(LabInfo lab) {
+        getSession().delete(lab);
+    }
+
+    @Override
+    public void deleteAll() {
+        if (getSession().createQuery("delete from Lab").executeUpdate() > 0) {
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "All lab entries are cleaned up");
+        }
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/daoimpl/SiloDAOImpl.java b/ui/src/main/java/org/akraino/validation/ui/daoimpl/SiloDAOImpl.java
new file mode 100644 (file)
index 0000000..3a347bd
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.daoimpl;
+
+import java.util.List;
+
+import org.akraino.validation.ui.dao.SiloDAO;
+import org.akraino.validation.ui.entity.LabSilo;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.criterion.Restrictions;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class SiloDAOImpl implements SiloDAO {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(SiloDAOImpl.class);
+
+    @Autowired
+    private SessionFactory sessionFactory;
+
+    protected Session getSession() {
+        return sessionFactory.getCurrentSession();
+    }
+
+    @Override
+    public List<LabSilo> getSilos() {
+        Criteria criteria = getSession().createCriteria(LabSilo.class);
+        return criteria.list();
+    }
+
+    @Override
+    public LabSilo getSilo(Integer siloId) {
+        Criteria criteria = getSession().createCriteria(LabSilo.class);
+        criteria.add(Restrictions.eq("id", String.valueOf(siloId)));
+        return criteria.list() == null ? null : (LabSilo) criteria.list().get(0);
+    }
+
+    @Override
+    public void saveOrUpdate(LabSilo silo) {
+        getSession().saveOrUpdate(silo);
+    }
+
+    @Override
+    public void merge(LabSilo silo) {
+        getSession().merge(silo);
+    }
+
+    @Override
+    public void deleteSilo(LabSilo silo) {
+        getSession().delete(silo);
+    }
+
+    @Override
+    public void deleteAll() {
+        if (getSession().createQuery("delete from Silo").executeUpdate() > 0) {
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "All silo entries are cleaned up");
+        }
+    }
+
+}
index fd4da86..7edab42 100644 (file)
@@ -1,40 +1,36 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.daoimpl;
 
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
 import org.akraino.validation.ui.dao.SubmissionDAO;
 import org.akraino.validation.ui.entity.Submission;
-import org.apache.log4j.Logger;
+import org.hibernate.Criteria;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
-import org.hibernate.query.Query;
+import org.hibernate.criterion.Restrictions;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public class SubmissionDAOImpl implements SubmissionDAO {
 
-    private static final Logger LOGGER = Logger.getLogger(SubmissionDAOImpl.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(SubmissionDAOImpl.class);
 
     @Autowired
     private SessionFactory sessionFactory;
@@ -45,43 +41,30 @@ public class SubmissionDAOImpl implements SubmissionDAO {
 
     @Override
     public List<Submission> getSubmissions() {
-
-        CriteriaBuilder builder = getSession().getCriteriaBuilder();
-        CriteriaQuery<Submission> criteria = builder.createQuery(Submission.class);
-
-        Root<Submission> root = criteria.from(Submission.class);
-        criteria.select(root);
-
-        Query<Submission> query = getSession().createQuery(criteria);
-
-        return query.getResultList();
-
+        Criteria criteria = getSession().createCriteria(Submission.class);
+        return criteria.list();
     }
 
     @Override
     public Submission getSubmission(Integer submissionId) {
-
-        EntityManager entityManager = getSession().getEntityManagerFactory().createEntityManager();
-
-        return entityManager.find(Submission.class, submissionId);
+        Criteria criteria = getSession().createCriteria(Submission.class);
+        criteria.add(Restrictions.eq("id", submissionId));
+        return criteria.list() == null || criteria.list().size() < 1 ? null : (Submission) criteria.list().get(0);
     }
 
     @Override
     public void saveOrUpdate(Submission submission) {
         getSession().saveOrUpdate(submission);
-
     }
 
     @Override
     public void merge(Submission submission) {
         getSession().merge(submission);
-
     }
 
     @Override
     public void deleteSubmission(Submission submission) {
         getSession().delete(submission);
-
     }
 
     @Override
@@ -91,13 +74,8 @@ public class SubmissionDAOImpl implements SubmissionDAO {
 
     @Override
     public void deleteAll() {
-
-        Query<?> query = getSession().createQuery("delete from Submission");
-
-        int result = query.executeUpdate();
-
-        if (result > 0) {
-            LOGGER.info("All submission entries are cleaned up");
+        if (getSession().createQuery("delete from Submission").executeUpdate() > 0) {
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "All submission entries are cleaned up");
         }
     }
 
index e49c37a..a6cd925 100644 (file)
@@ -1,40 +1,36 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.daoimpl;
 
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Root;
-
 import org.akraino.validation.ui.dao.TimeslotDAO;
 import org.akraino.validation.ui.entity.Timeslot;
-import org.apache.log4j.Logger;
+import org.hibernate.Criteria;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
-import org.hibernate.query.Query;
+import org.hibernate.criterion.Restrictions;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public class TimeslotDAOImpl implements TimeslotDAO {
 
-    private static final Logger LOGGER = Logger.getLogger(TimeslotDAOImpl.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(TimeslotDAOImpl.class);
 
     @Autowired
     private SessionFactory sessionFactory;
@@ -45,54 +41,36 @@ public class TimeslotDAOImpl implements TimeslotDAO {
 
     @Override
     public List<Timeslot> getTimeslots() {
-
-        CriteriaBuilder builder = getSession().getCriteriaBuilder();
-        CriteriaQuery<Timeslot> criteria = builder.createQuery(Timeslot.class);
-
-        Root<Timeslot> root = criteria.from(Timeslot.class);
-        criteria.select(root);
-
-        Query<Timeslot> query = getSession().createQuery(criteria);
-
-        return query.getResultList();
-
+        Criteria criteria = getSession().createCriteria(Timeslot.class);
+        return criteria.list();
     }
 
     @Override
     public Timeslot getTimeslot(Integer timeslotId) {
-
-        EntityManager entityManager = getSession().getEntityManagerFactory().createEntityManager();
-
-        return entityManager.find(Timeslot.class, timeslotId);
+        Criteria criteria = getSession().createCriteria(Timeslot.class);
+        criteria.add(Restrictions.eq("id", String.valueOf(timeslotId)));
+        return criteria.list() == null ? null : (Timeslot) criteria.list().get(0);
     }
 
     @Override
     public void saveOrUpdate(Timeslot timeslot) {
         getSession().saveOrUpdate(timeslot);
-
     }
 
     @Override
     public void merge(Timeslot timeslot) {
         getSession().merge(timeslot);
-
     }
 
     @Override
     public void deleteTimeslot(Timeslot timeslot) {
         getSession().delete(timeslot);
-
     }
 
     @Override
     public void deleteAll() {
-
-        Query<?> query = getSession().createQuery("delete from Timeslot");
-
-        int result = query.executeUpdate();
-
-        if (result > 0) {
-            LOGGER.info("All timeslot entries are cleaned up");
+        if (getSession().createQuery("delete from Timeslot").executeUpdate() > 0) {
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "All timeslot entries are cleaned up");
         }
     }
 
index 75278c2..9c57c04 100644 (file)
@@ -16,5 +16,5 @@
 package org.akraino.validation.ui.data;
 
 public enum BlueprintLayer {
-    Hardware, OS, K8s, Kubeless, OpenStack, VNF, Application
+    Hardware, Os, K8s, Kubeless, OpenStack, VNF, Application, All
 }
index 05a27cc..262eecd 100644 (file)
@@ -22,11 +22,10 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
 import javax.persistence.Table;
 
 @Entity
-@Table(name = "akraino.blueprint")
+@Table(name = "blueprint")
 public class Blueprint implements Serializable {
 
     /**
@@ -35,9 +34,8 @@ public class Blueprint implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "blueprint_id_generator")
-    @SequenceGenerator(name = "blueprint_id_generator", sequenceName = "akraino.seq_blueprint", allocationSize = 1)
-    @Column(name = "blueprint_id")
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name = "id")
     private int blueprintId;
 
     @Column(name = "blueprint_name")
@@ -24,15 +24,13 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
-import javax.persistence.SequenceGenerator;
 import javax.persistence.Table;
 
 import org.akraino.validation.ui.data.BlueprintLayer;
 
 @Entity
-@Table(name = "akraino.blueprint_instance")
-public class BlueprintInstance implements Serializable {
+@Table(name = "blueprint_instance_for_validation")
+public class BlueprintInstanceForValidation implements Serializable {
 
     /**
      *
@@ -40,10 +38,8 @@ public class BlueprintInstance implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "blueprint_instance_id_generator")
-    @SequenceGenerator(name = "blueprint_instance_id_generator", sequenceName = "akraino.seq_blueprint_instance",
-            allocationSize = 1)
-    @Column(name = "blueprint_instance_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
     private int blueprintInstId;
 
     @ManyToOne
@@ -59,10 +55,6 @@ public class BlueprintInstance implements Serializable {
     @Column(name = "layer_description")
     private String layerDescription;
 
-    @OneToOne
-    @JoinColumn(name = "timeslot_id")
-    private Timeslot timeslot;
-
     public int getBlueprintInstanceId() {
         return blueprintInstId;
     }
@@ -102,13 +94,4 @@ public class BlueprintInstance implements Serializable {
     public String getLayerDescription() {
         return layerDescription;
     }
-
-    public void setTimeslot(Timeslot timeslot) {
-        this.timeslot = timeslot;
-    }
-
-    public Timeslot getTimeslot() {
-        return this.timeslot;
-    }
-
 }
diff --git a/ui/src/main/java/org/akraino/validation/ui/entity/LabInfo.java b/ui/src/main/java/org/akraino/validation/ui/entity/LabInfo.java
new file mode 100644 (file)
index 0000000..f046ce4
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.entity;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "lab")
+public class LabInfo implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private int labId;
+
+    @Column(name = "lab")
+    private org.akraino.validation.ui.data.Lab lab;
+
+    public int getLabId() {
+        return labId;
+    }
+
+    public void setLabId(int labId) {
+        this.labId = labId;
+    }
+
+    public org.akraino.validation.ui.data.Lab getLab() {
+        return lab;
+    }
+
+    public void setLab(org.akraino.validation.ui.data.Lab lab) {
+        this.lab = lab;
+    }
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/entity/LabSilo.java b/ui/src/main/java/org/akraino/validation/ui/entity/LabSilo.java
new file mode 100644 (file)
index 0000000..cd72fc7
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.entity;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "silo")
+public class LabSilo implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private int siloId;
+
+    @Column(name = "silo")
+    private String silo;
+
+    @ManyToOne
+    @JoinColumn(name = "lab_id")
+    private LabInfo lab;
+
+    public void setSiloId(int siloId) {
+        this.siloId = siloId;
+    }
+
+    public int getSiloId() {
+        return siloId;
+    }
+
+    public void setSilo(String silo) {
+        this.silo = silo;
+    }
+
+    public String getSilo() {
+        return silo;
+    }
+
+    public void setLab(LabInfo lab) {
+        this.lab = lab;
+    }
+
+    public LabInfo getLab() {
+        return lab;
+    }
+}
index 1d5d157..797343f 100644 (file)
@@ -15,6 +15,8 @@
  */
 package org.akraino.validation.ui.entity;
 
+import java.io.Serializable;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -22,14 +24,13 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
-import javax.persistence.SequenceGenerator;
 import javax.persistence.Table;
 
 import org.akraino.validation.ui.data.SubmissionStatus;
 
 @Entity
-@Table(name = "akraino.submission")
-public class Submission {
+@Table(name = "submission")
+public class Submission implements Serializable {
 
     /**
      *
@@ -37,9 +38,8 @@ public class Submission {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "submission_id_generator")
-    @SequenceGenerator(name = "submission_id_generator", sequenceName = "akraino.seq_submission", allocationSize = 1)
-    @Column(name = "submission_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
     private int submissionId;
 
     @Column(name = "status")
@@ -52,8 +52,12 @@ public class Submission {
     private String nexusResultUrl;
 
     @ManyToOne
-    @JoinColumn(name = "blueprint_instance_id")
-    private BlueprintInstance blueprintInstance;
+    @JoinColumn(name = "blueprint_instance_for_validation_id")
+    private BlueprintInstanceForValidation blueprintInst;
+
+    @ManyToOne
+    @JoinColumn(name = "timeslot_id")
+    private Timeslot timeslot;
 
     public void setSubmissionId(int submissionId) {
         this.submissionId = submissionId;
@@ -87,12 +91,22 @@ public class Submission {
         this.nexusResultUrl = nexusResultUrl;
     }
 
-    public void setBlueprintInstance(BlueprintInstance blueprintInstance) {
-        this.blueprintInstance = blueprintInstance;
+    public void setBlueprintInstanceForValidation(BlueprintInstanceForValidation blueprintInst) {
+        this.blueprintInst = blueprintInst;
     }
 
-    public BlueprintInstance getBlueprintInstance() {
-        return this.blueprintInstance;
+    public BlueprintInstanceForValidation getBlueprintInstanceForValidation() {
+        return this.blueprintInst;
     }
 
+
+    public void setTimeslot(Timeslot timeslot) {
+        this.timeslot = timeslot;
+    }
+
+    public Timeslot getTimeslot() {
+        return this.timeslot;
+    }
+
+
 }
index c53fa49..ee23efb 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.entity;
 
@@ -22,13 +22,12 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.SequenceGenerator;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
-import org.akraino.validation.ui.data.Lab;
-
 @Entity
-@Table(name = "akraino.timeslot")
+@Table(name = "timeslot")
 public class Timeslot implements Serializable {
 
     /**
@@ -37,19 +36,19 @@ public class Timeslot implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "timeslot_id_generator")
-    @SequenceGenerator(name = "timeslot_id_generator", sequenceName = "akraino.seq_timeslot", allocationSize = 1)
-    @Column(name = "timeslot_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
     private int timeslotId;
 
     @Column(name = "start_date_time")
     private String startDateTime;
 
     @Column(name = "duration")
-    private int duration;
+    private String duration;
 
-    @Column(name = "lab")
-    private Lab lab;
+    @ManyToOne
+    @JoinColumn(name = "lab_id")
+    private LabInfo lab;
 
     public void setTimeslotId(int timeslotId) {
         this.timeslotId = timeslotId;
@@ -67,19 +66,19 @@ public class Timeslot implements Serializable {
         return startDateTime;
     }
 
-    public void setDuration(int duration) {
+    public void setDuration(String duration) {
         this.duration = duration;
     }
 
-    public int getDuration() {
+    public String getDuration() {
         return duration;
     }
 
-    public void setLab(Lab lab) {
+    public void setLab(LabInfo lab) {
         this.lab = lab;
     }
 
-    public Lab getLab() {
+    public LabInfo getLab() {
         return lab;
     }
 }
diff --git a/ui/src/main/java/org/akraino/validation/ui/filter/SecurityXssFilter.java b/ui/src/main/java/org/akraino/validation/ui/filter/SecurityXssFilter.java
new file mode 100644 (file)
index 0000000..e9afd05
--- /dev/null
@@ -0,0 +1,178 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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 org.akraino.validation.ui.filter;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpStatus;
+import org.onap.portalapp.util.SecurityXssValidator;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+public class SecurityXssFilter extends OncePerRequestFilter {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(SecurityXssFilter.class);
+
+    private static final String APPLICATION_JSON = "application/json";
+
+    private static final String ERROR_BAD_REQUEST = "{\"error\":\"BAD_REQUEST\"}";
+
+    private SecurityXssValidator validator = SecurityXssValidator.getInstance();
+
+    public class RequestWrapper extends HttpServletRequestWrapper {
+
+        private ByteArrayOutputStream cachedBytes;
+
+        private Map parameter = new HashMap();
+
+        @SuppressWarnings("unchecked")
+        public RequestWrapper(HttpServletRequest request) {
+            super(request);
+            Enumeration<String> parameterNames = request.getParameterNames();
+            while (parameterNames.hasMoreElements()) {
+                String paramName = parameterNames.nextElement();
+                String paramValue = request.getParameter(paramName);
+                parameter.put(paramName, paramValue);
+            }
+        }
+
+        @Override
+        public String getParameter(String name) {
+            if (parameter != null) {
+                return (String) parameter.get(name);
+            }
+            return null;
+        }
+
+        @Override
+        public ServletInputStream getInputStream() throws IOException {
+            if (cachedBytes == null)
+                cacheInputStream();
+
+            return new CachedServletInputStream();
+        }
+
+        @Override
+        public BufferedReader getReader() throws IOException {
+            return new BufferedReader(new InputStreamReader(getInputStream()));
+        }
+
+        private void cacheInputStream() throws IOException {
+            cachedBytes = new ByteArrayOutputStream();
+            IOUtils.copy(super.getInputStream(), cachedBytes);
+        }
+
+        public class CachedServletInputStream extends ServletInputStream {
+            private ByteArrayInputStream input;
+
+            public CachedServletInputStream() {
+                input = new ByteArrayInputStream(cachedBytes.toByteArray());
+            }
+
+            @Override
+            public int read() throws IOException {
+                return input.read();
+            }
+
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setReadListener(ReadListener readListener) {
+
+            }
+
+        }
+    }
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+            throws ServletException, IOException {
+        if (validateRequestType(request)) {
+            request = new RequestWrapper(request);
+            String requestData = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8.toString());
+            try {
+                if (StringUtils.isNotBlank(requestData) && validator.denyXSS(requestData)) {
+                    response.setContentType(APPLICATION_JSON);
+                    response.setStatus(HttpStatus.SC_BAD_REQUEST);
+                    response.getWriter().write(ERROR_BAD_REQUEST);
+                    throw new SecurityException(ERROR_BAD_REQUEST);
+                }
+            } catch (Exception e) {
+                LOGGER.error(EELFLoggerDelegate.errorLogger, "doFilterInternal() failed due to BAD_REQUEST", e);
+                response.getWriter().close();
+                return;
+            }
+            filterChain.doFilter(request, response);
+
+        } else {
+            filterChain.doFilter(request, response);
+        }
+
+    }
+
+    private boolean validateRequestType(HttpServletRequest request) {
+        return (request.getMethod().equalsIgnoreCase("POST") || request.getMethod().equalsIgnoreCase("PUT")
+                || request.getMethod().equalsIgnoreCase("DELETE"));
+    }
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/login/LoginStrategyImpl.java b/ui/src/main/java/org/akraino/validation/ui/login/LoginStrategyImpl.java
new file mode 100644 (file)
index 0000000..55960ac
--- /dev/null
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START==========================================
+ * ONAP Portal
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License");
+ * you may not use this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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 org.akraino.validation.ui.login;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.onap.portalsdk.core.auth.LoginStrategy;
+import org.onap.portalsdk.core.command.LoginBean;
+import org.onap.portalsdk.core.domain.RoleFunction;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.menu.MenuProperties;
+import org.onap.portalsdk.core.onboarding.exception.CipherUtilException;
+import org.onap.portalsdk.core.onboarding.exception.PortalAPIException;
+import org.onap.portalsdk.core.onboarding.util.CipherUtil;
+import org.onap.portalsdk.core.service.LoginService;
+import org.onap.portalsdk.core.service.RoleService;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.ModelAndView;
+
+/**
+ * Implements basic single-signon login strategy for open-source
+ * applications when users start at Portal. Extracts an encrypted user ID
+ * sent by Portal.
+ */
+public class LoginStrategyImpl extends LoginStrategy {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(LoginStrategyImpl.class);
+
+    @Autowired
+    private RoleService roleService;
+
+    @Autowired
+    private LoginService loginService;
+
+    /**
+     * login for open source is same as external login in the non-open-source
+     * version.
+     */
+    @Override
+    public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        invalidateExistingSession(request);
+
+        LoginBean commandBean = new LoginBean();
+        String loginId = request.getParameter("loginId");
+        String password = request.getParameter("password");
+        commandBean.setLoginId(loginId);
+        commandBean.setLoginPwd(password);
+        commandBean.setUserid(loginId);
+        commandBean = loginService.findUser(commandBean,
+                (String) request.getAttribute(MenuProperties.MENU_PROPERTIES_FILENAME_KEY), new HashMap());
+        List<RoleFunction> roleFunctionList = roleService.getRoleFunctions(loginId);
+
+        if (commandBean.getUser() == null) {
+            String loginErrorMessage = (commandBean.getLoginErrorMessage() != null) ? commandBean.getLoginErrorMessage()
+                    : "login.error.external.invalid";
+            Map<String, String> model = new HashMap<>();
+            model.put("error", loginErrorMessage);
+            return new ModelAndView("login_external", "model", model);
+        } else {
+            // store the currently logged in user's information in the session
+            UserUtils.setUserSession(request, commandBean.getUser(), commandBean.getMenu(),
+                    commandBean.getBusinessDirectMenu(),
+                    SystemProperties.getProperty(SystemProperties.LOGIN_METHOD_BACKDOOR), roleFunctionList);
+            initateSessionMgtHandler(request);
+            // user has been authenticated, now take them to the welcome page
+            return new ModelAndView("redirect:welcome.htm");
+        }
+    }
+
+    @Override
+    public String getUserId(HttpServletRequest request) throws PortalAPIException {
+        // Check ECOMP Portal cookie
+        Cookie ep = getCookie(request, EP_SERVICE);
+        if (ep == null) {
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "getUserId: no EP_SERVICE cookie, returning null");
+            return null;
+        }
+
+        String userid = null;
+        try {
+            userid = getUserIdFromCookie(request);
+        } catch (Exception e) {
+            LOGGER.error(EELFLoggerDelegate.errorLogger, "getUserId failed", e);
+        }
+        return userid;
+    }
+
+    /**
+     * Searches the request for the user-ID cookie and decrypts the value
+     * using a key configured in properties
+     *
+     * @param request HttpServletRequest
+     * @return User ID
+     * @throws CipherUtilException On any failure to decrypt
+     */
+    private String getUserIdFromCookie(HttpServletRequest request) throws CipherUtilException {
+        String userId = "";
+        Cookie userIdCookie = getCookie(request, USER_ID);
+        if (userIdCookie != null) {
+            final String cookieValue = userIdCookie.getValue();
+            if (!SystemProperties.containsProperty(SystemProperties.Decryption_Key))
+                throw new IllegalStateException("Failed to find property " + SystemProperties.Decryption_Key);
+            final String decryptionKey = SystemProperties.getProperty(SystemProperties.Decryption_Key);
+            userId = CipherUtil.decrypt(cookieValue, decryptionKey);
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "getUserIdFromCookie: decrypted as {}", userId);
+        }
+        return userId;
+    }
+
+    /**
+     * Searches the request for the named cookie.
+     *
+     * @param request HttpServletRequest
+     * @param cookieName Name of desired cookie
+     * @return Cookie if found; otherwise null.
+     */
+    private Cookie getCookie(HttpServletRequest request, String cookieName) {
+        Cookie[] cookies = request.getCookies();
+        if (cookies != null)
+            for (Cookie cookie : cookies)
+                if (cookie.getName().equals(cookieName))
+                    return cookie;
+        return null;
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/scheduler/Register.java b/ui/src/main/java/org/akraino/validation/ui/scheduler/Register.java
new file mode 100644 (file)
index 0000000..633ef9e
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * ============LICENSE_START==========================================
+ * ONAP Portal SDK
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License"); you may not use
+ * this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is
+ * licensed under the Creative Commons License, Attribution 4.0 Intl. (the
+ * "License"); you may not use this documentation except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * documentation 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 org.akraino.validation.ui.scheduler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.portalapp.scheduler.LogRegistry;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.scheduler.Registerable;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.quartz.Trigger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Component;
+
+@Component
+@DependsOn({"logRegistry", "systemProperties"})
+public class Register implements Registerable {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(Register.class);
+
+    private List<Trigger> scheduleTriggers = new ArrayList<>();
+    Trigger[] trigger = new Trigger[1];
+
+    @Autowired
+    private LogRegistry logRegistry;
+
+    @Override
+    public Trigger[] getTriggers() {
+        return getScheduleTriggers().toArray(trigger);
+    }
+
+    @Override
+    public void registerTriggers() {
+        // if the property value is not available; the cron will not be added.
+        if (SystemProperties.containsProperty(SystemProperties.LOG_CRON)) {
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "Adding log registry for cron property {}",
+                    SystemProperties.getProperty(SystemProperties.LOG_CRON));
+            getScheduleTriggers().add(logRegistry.getTrigger());
+        }
+    }
+
+    public List<Trigger> getScheduleTriggers() {
+        return scheduleTriggers;
+    }
+
+    public void setScheduleTriggers(List<Trigger> scheduleTriggers) {
+        this.scheduleTriggers = scheduleTriggers;
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/scheduler/RegistryAdapter.java b/ui/src/main/java/org/akraino/validation/ui/scheduler/RegistryAdapter.java
new file mode 100644 (file)
index 0000000..27e94b4
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * ============LICENSE_START==========================================
+ * ONAP Portal SDK
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License"); you may not use
+ * this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is
+ * licensed under the Creative Commons License, Attribution 4.0 Intl. (the
+ * "License"); you may not use this documentation except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * documentation 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 org.akraino.validation.ui.scheduler;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.onap.portalsdk.core.scheduler.Registerable;
+import org.onap.portalsdk.workflow.services.WorkflowScheduleService;
+import org.quartz.Trigger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RegistryAdapter {
+
+    @Autowired
+    private Registerable registry;
+
+    @Autowired
+    private WorkflowScheduleService workflowScheduleService;
+
+    private SchedulerFactoryBean schedulerBean;
+
+    Trigger[] trigger = new Trigger[1];
+
+    public Trigger[] getTriggers() {
+        registry.registerTriggers();
+        List<Trigger> allTriggers = new ArrayList<>();
+        List<Trigger> coreTriggers = addCoreTriggers();
+        final Trigger[] extTriggerArray = registry.getTriggers();
+        allTriggers.addAll(Arrays.asList(extTriggerArray));
+        allTriggers.addAll(coreTriggers);
+        return allTriggers.toArray(trigger);
+    }
+
+    public List<Trigger> addCoreTriggers() {
+        // On startup of the application after crash recovery, invoke workflow
+        // schedule trigger
+        List<Trigger> triggers = getWorkflowScheduleService().triggerWorkflowScheduling();
+        return triggers;
+    }
+
+    public void setSchedulerBean(final SchedulerFactoryBean schedulerBean) {
+        this.schedulerBean = schedulerBean;
+    }
+
+    public SchedulerFactoryBean getSchedulerBean() {
+        return schedulerBean;
+    }
+
+    public Registerable getRegistry() {
+        return registry;
+    }
+
+    public void setRegistry(Registerable registry) {
+        this.registry = registry;
+    }
+
+    public WorkflowScheduleService getWorkflowScheduleService() {
+        return workflowScheduleService;
+    }
+
+    public void setWorkflowScheduleService(WorkflowScheduleService workflowScheduleService) {
+        this.workflowScheduleService = workflowScheduleService;
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/service/AdminAuthExtension.java b/ui/src/main/java/org/akraino/validation/ui/service/AdminAuthExtension.java
new file mode 100644 (file)
index 0000000..b08bd40
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * ============LICENSE_START==========================================
+ * ONAP Portal SDK
+ * ===================================================================
+ * Copyright Â© 2017 AT&T Intellectual Property. All rights reserved.
+ * ===================================================================
+ *
+ * Unless otherwise specified, all software contained herein is licensed
+ * under the Apache License, Version 2.0 (the "License"); you may not use
+ * this software 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.
+ *
+ * Unless otherwise specified, all documentation contained herein is
+ * licensed under the Creative Commons License, Attribution 4.0 Intl. (the
+ * "License"); you may not use this documentation except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * documentation 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 org.akraino.validation.ui.service;
+
+import java.util.Set;
+
+import org.onap.portalapp.service.IAdminAuthExtension;
+import org.onap.portalsdk.core.domain.Role;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+@Service("adminAuthExtension")
+@Transactional
+/**
+ * Provides empty implementations of the methods in IAdminAuthExtension.
+ */
+public class AdminAuthExtension implements IAdminAuthExtension {
+
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(AdminAuthExtension.class);
+
+    @Override
+    public void saveUserExtension(User user) {
+        LOGGER.debug(EELFLoggerDelegate.debugLogger, "saveUserExtension");
+    }
+
+    @Override
+    public void editUserExtension(User user) {
+        LOGGER.debug(EELFLoggerDelegate.debugLogger, "editUserExtension");
+    }
+
+    @Override
+    public void saveUserRoleExtension(Set<Role> roles, User user) {
+        LOGGER.debug(EELFLoggerDelegate.debugLogger, "saveUserRoleExtension");
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/service/BlueprintInstanceForValidationService.java b/ui/src/main/java/org/akraino/validation/ui/service/BlueprintInstanceForValidationService.java
new file mode 100644 (file)
index 0000000..d786d09
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.service;
+
+import java.util.List;
+
+import org.akraino.validation.ui.dao.BlueprintInstanceForValidationDAO;
+import org.akraino.validation.ui.entity.BlueprintInstanceForValidation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class BlueprintInstanceForValidationService {
+
+    @Autowired
+    private BlueprintInstanceForValidationDAO dao;
+
+    public void saveBlueprintInstance(BlueprintInstanceForValidation blueprintIns) {
+
+        dao.saveOrUpdate(blueprintIns);
+
+    }
+
+    public List<BlueprintInstanceForValidation> getBlueprintInstancesForValidation() {
+
+        return dao.getBlueprintInstancesForValidation();
+
+    }
+
+    public void deleteAll() {
+        dao.deleteAll();
+    }
+
+}
diff --git a/ui/src/main/java/org/akraino/validation/ui/service/BlueprintInstanceService.java b/ui/src/main/java/org/akraino/validation/ui/service/BlueprintInstanceService.java
deleted file mode 100644 (file)
index 33914a4..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-package org.akraino.validation.ui.service;
-
-import java.util.List;
-
-import org.akraino.validation.ui.dao.BlueprintInstanceDAO;
-import org.akraino.validation.ui.entity.BlueprintInstance;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-@Service
-@Transactional
-public class BlueprintInstanceService {
-
-    @Autowired
-    private BlueprintInstanceDAO blueprintInstDAO;
-
-    public void saveBlueprintInstance(BlueprintInstance blueprintInstance) {
-
-        blueprintInstDAO.saveOrUpdate(blueprintInstance);
-
-    }
-
-    public List<BlueprintInstance> getBlueprintInstances() {
-
-        return blueprintInstDAO.getBlueprintInstances();
-
-    }
-
-    public void deleteAll() {
-        blueprintInstDAO.deleteAll();
-    }
-
-}
index 019802c..ddc0219 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.service;
 
index 0a50ad8..c2482b2 100644 (file)
  */
 package org.akraino.validation.ui.service;
 
+import org.akraino.validation.ui.conf.UiUtils;
+import org.akraino.validation.ui.data.BlueprintLayer;
 import org.akraino.validation.ui.data.JnksJobNotify;
 import org.akraino.validation.ui.data.SubmissionStatus;
+import org.akraino.validation.ui.entity.LabSilo;
 import org.akraino.validation.ui.entity.Submission;
 import org.akraino.validation.ui.service.utils.SubmissionHelper;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -28,28 +31,46 @@ import org.springframework.transaction.annotation.Transactional;
 @Transactional
 public class JenkinsJobNotificationService {
 
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(JenkinsJobNotificationService.class);
+
     @Autowired
     private SubmissionHelper submissionHelper;
 
     @Autowired
     private SubmissionService submissionService;
 
-    private static final Logger LOGGER = Logger.getLogger(JenkinsJobNotificationService.class);
+    @Autowired
+    private SiloService siloService;
 
-    public void handle(JnksJobNotify jnksJobNotify) {
-        String jenkinsJobName = System.getenv("jenkins_job_name");
+    public void handle(JnksJobNotify jnksJobNotify) throws Exception {
+        String jenkinsJobName = System.getenv("JENKINS_JOB_NAME");
         if (!jenkinsJobName.equals(jnksJobNotify.getName())) {
             return;
         }
         Submission submission = submissionService.getSubmission(Integer.toString(jnksJobNotify.getSubmissionId()));
         if (submission == null) {
-            LOGGER.debug("No related submission was found.");
+            LOGGER.debug(EELFLoggerDelegate.debugLogger, "No related submission was found");
             return;
         }
-        submission.setNexusResultUrl(System.getenv("nexus_results_url") + "/"
-                + submission.getBlueprintInstance().getTimeslot().getLab().name().toLowerCase() + "-blu-val"
-                + "/job/validation/" + String.valueOf(jnksJobNotify.getbuildNumber()));
-        LOGGER.info("Updating submission with id: " + submission.getSubmissionId());
+        String siloText = null;
+        for (LabSilo silo : siloService.getSilos()) {
+            if (silo.getLab().getLab().equals(submission.getTimeslot().getLab().getLab())) {
+                siloText = silo.getSilo();
+            }
+        }
+        if (siloText == null) {
+            throw new Exception("Could not retrieve silo of the selected lab : "
+                    + submission.getTimeslot().getLab().getLab().toString());
+        }
+
+        String nexusUrl = UiUtils.NEXUS_URL + "/" + siloText + "/job/" + System.getenv("JENKINS_JOB_NAME") + "/"
+                + String.valueOf(jnksJobNotify.getbuildNumber() + "/results");
+        if (!submission.getBlueprintInstanceForValidation().getLayer().equals(BlueprintLayer.All)) {
+            nexusUrl = nexusUrl + "/" + submission.getBlueprintInstanceForValidation().getLayer().name().toLowerCase();
+        }
+        submission.setNexusResultUrl(nexusUrl);
+        LOGGER.info(EELFLoggerDelegate.applicationLogger,
+                "Updating submission with id: " + submission.getSubmissionId());
         submission.setSubmissionStatus(SubmissionStatus.Completed);
         submissionHelper.saveSubmission(submission);
     }
diff --git a/ui/src/main/java/org/akraino/validation/ui/service/LabService.java b/ui/src/main/java/org/akraino/validation/ui/service/LabService.java
new file mode 100644 (file)
index 0000000..8dfc15e
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.service;
+
+import java.util.List;
+
+import org.akraino.validation.ui.dao.LabDAO;
+import org.akraino.validation.ui.entity.LabInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class LabService {
+
+    @Autowired
+    private LabDAO labDAO;
+
+    public void saveLab(LabInfo lab) {
+
+        labDAO.saveOrUpdate(lab);
+
+    }
+
+    public List<LabInfo> getLabs() {
+
+        return labDAO.getLabs();
+
+    }
+
+    public void deleteAll() {
+        labDAO.deleteAll();
+    }
+
+}
index 1deffa0..b189dba 100644 (file)
@@ -16,7 +16,6 @@
 package org.akraino.validation.ui.service;
 
 import java.io.IOException;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
@@ -26,10 +25,12 @@ import org.akraino.validation.ui.client.jenkins.JenkinsExecutorClient;
 import org.akraino.validation.ui.client.jenkins.resources.QueueJobItem;
 import org.akraino.validation.ui.client.jenkins.resources.QueueJobItem.Executable;
 import org.akraino.validation.ui.client.nexus.NexusExecutorClient;
-import org.akraino.validation.ui.client.nexus.resources.RobotTestResult;
+import org.akraino.validation.ui.client.nexus.resources.WrapperRobotTestResult;
+import org.akraino.validation.ui.conf.UiUtils;
+import org.akraino.validation.ui.data.BlueprintLayer;
+import org.akraino.validation.ui.entity.LabSilo;
 import org.akraino.validation.ui.entity.Submission;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -41,19 +42,20 @@ import com.sun.jersey.api.client.UniformInterfaceException;
 @Service
 public class ResultService {
 
-    private static final Logger LOGGER = Logger.getLogger(ResultService.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(ResultService.class);
 
     @Autowired
     private SubmissionService submissionService;
 
+    @Autowired
+    private SiloService siloService;
+
     @Deprecated
-    public URL getNexusResultUrl(Submission submission)
-            throws MalformedURLException, KeyManagementException, HttpException, ClientHandlerException,
-            UniformInterfaceException, NoSuchAlgorithmException, InterruptedException {
+    public URL getNexusResultUrl(Submission submission) throws Exception {
 
-        String url = System.getenv("jenkins_url");
-        String userName = System.getenv("jenkins_user_name");
-        String password = System.getenv("jenkins_user_pwd");
+        String url = System.getenv("JENKINS_URL");
+        String userName = System.getenv("JENKINS_USERNAME");
+        String password = System.getenv("JENKINS_USER_PASSWORD");
 
         Executable executable = null;
         while (executable == null) {
@@ -63,22 +65,48 @@ public class ResultService {
             executable = queueJobItem.getExecutable();
             Thread.sleep(2000);
         }
-        return new URL(System.getenv("nexus_results_url") + "/"
-                + submission.getBlueprintInstance().getTimeslot().getLab().name().toLowerCase() + "-blu-val"
-                + "/job/validation/" + String.valueOf(executable.getNumber()));
+        String siloText = null;
+        for (LabSilo silo : siloService.getSilos()) {
+            if (silo.getLab().getLab().equals(submission.getTimeslot().getLab().getLab())) {
+                siloText = silo.getSilo();
+            }
+        }
+        if (siloText == null) {
+            throw new Exception("Could not retrieve silo of the selected lab : "
+                    + submission.getTimeslot().getLab().getLab().toString());
+        }
+        String nexusUrl = UiUtils.NEXUS_URL + "/" + siloText + "/job/" + System.getenv("JENKINS_JOB_NAME") + "/"
+                + String.valueOf(executable.getNumber() + "/results");
+        if (!submission.getBlueprintInstanceForValidation().getLayer().equals(BlueprintLayer.All)) {
+            nexusUrl = nexusUrl + "/" + submission.getBlueprintInstanceForValidation().getLayer().name().toLowerCase();
+        }
+        return new URL(nexusUrl);
     }
 
-    public List<RobotTestResult> getRobotTestResults(String submissionId)
+    public List<WrapperRobotTestResult> getRobotTestResults(String submissionId)
             throws JsonParseException, JsonMappingException, KeyManagementException, ClientHandlerException,
             UniformInterfaceException, NoSuchAlgorithmException, IOException {
         Submission submission = submissionService.getSubmission(submissionId);
         if (submission == null) {
-            LOGGER.info("Requested submission does not exist");
+            LOGGER.info(EELFLoggerDelegate.applicationLogger, "Requested submission does not exist");
             return null;
         }
         String nexusUrl = submission.getNexusResultUrl();
-        NexusExecutorClient client = new NexusExecutorClient(nexusUrl + "/results");
+        String urlLastpart = nexusUrl.substring(nexusUrl.lastIndexOf('/') + 1);
+        if (blueprintLayerContains(urlLastpart.substring(0, 1).toUpperCase() + urlLastpart.substring(1))) {
+            nexusUrl = nexusUrl.substring(0, nexusUrl.lastIndexOf(urlLastpart) - 1);
+        }
+        NexusExecutorClient client = new NexusExecutorClient(nexusUrl);
         return client.getRobotTestResults();
     }
 
+    private boolean blueprintLayerContains(String layer) {
+        for (BlueprintLayer blueprintLayer : BlueprintLayer.values()) {
+            if (blueprintLayer.name().equals(layer)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
diff --git a/ui/src/main/java/org/akraino/validation/ui/service/SiloService.java b/ui/src/main/java/org/akraino/validation/ui/service/SiloService.java
new file mode 100644 (file)
index 0000000..16ebe30
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+package org.akraino.validation.ui.service;
+
+import java.util.List;
+
+import org.akraino.validation.ui.dao.SiloDAO;
+import org.akraino.validation.ui.entity.LabSilo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class SiloService {
+
+    @Autowired
+    private SiloDAO siloDAO;
+
+    public void saveSilo(LabSilo silo) {
+
+        siloDAO.saveOrUpdate(silo);
+
+    }
+
+    public List<LabSilo> getSilos() {
+
+        return siloDAO.getSilos();
+
+    }
+
+    public void deleteAll() {
+        siloDAO.deleteAll();
+    }
+
+}
index a6b1fca..ccf4087 100644 (file)
@@ -30,14 +30,15 @@ import java.util.concurrent.CompletableFuture;
 import org.akraino.validation.ui.client.jenkins.JenkinsExecutorClient;
 import org.akraino.validation.ui.client.jenkins.resources.Parameter;
 import org.akraino.validation.ui.client.jenkins.resources.Parameters;
-import org.akraino.validation.ui.config.AppInitializer;
+import org.akraino.validation.ui.conf.UiUtils;
 import org.akraino.validation.ui.dao.SubmissionDAO;
 import org.akraino.validation.ui.data.SubmissionStatus;
 import org.akraino.validation.ui.entity.Submission;
 import org.akraino.validation.ui.service.utils.PrioritySupplier;
 import org.akraino.validation.ui.service.utils.SubmissionHelper;
 import org.apache.commons.httpclient.HttpException;
-import org.apache.log4j.Logger;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -49,7 +50,7 @@ import com.sun.jersey.api.client.UniformInterfaceException;
 @Transactional
 public class SubmissionService {
 
-    private static final Logger LOGGER = Logger.getLogger(SubmissionService.class);
+    private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(SubmissionService.class);
 
     @Autowired
     private SubmissionDAO submissionDAO;
@@ -63,7 +64,7 @@ public class SubmissionService {
 
         JenkinsTriggerSubmissionJob task = new JenkinsTriggerSubmissionJob(submission);
         CompletableFuture<Submission> completableFuture =
-                CompletableFuture.supplyAsync(new PrioritySupplier<>(1, task::execute), AppInitializer.executorService);
+                CompletableFuture.supplyAsync(new PrioritySupplier<>(1, task::execute), UiUtils.executorService);
         completableFuture.thenAcceptAsync(result -> this.callbackNotify(result));
 
         return submission;
@@ -102,10 +103,10 @@ public class SubmissionService {
         }
 
         public Submission execute() {
-            String url = System.getenv("jenkins_url");
-            String userName = System.getenv("jenkins_user_name");
-            String userPassword = System.getenv("jenkins_user_pwd");
-            String jobName = System.getenv("jenkins_job_name");
+            String url = System.getenv("JENKINS_URL");
+            String userName = System.getenv("JENKINS_USERNAME");
+            String userPassword = System.getenv("JENKINS_USER_PASSWORD");
+            String jobName = System.getenv("JENKINS_JOB_NAME");
             List<Parameter> listOfParameters = new ArrayList<Parameter>();
             Parameters parameters = new Parameters();
             Parameter parameter = new Parameter();
@@ -114,11 +115,16 @@ public class SubmissionService {
             listOfParameters.add(parameter);
             parameter = new Parameter();
             parameter.setName("BLUEPRINT");
-            parameter.setValue(submission.getBlueprintInstance().getBlueprint().getBlueprintName());
+            parameter.setValue(
+                    submission.getBlueprintInstanceForValidation().getBlueprint().getBlueprintName().toLowerCase());
             listOfParameters.add(parameter);
             parameter = new Parameter();
             parameter.setName("LAYER");
-            parameter.setValue(submission.getBlueprintInstance().getLayer().name());
+            parameter.setValue(submission.getBlueprintInstanceForValidation().getLayer().name().toLowerCase());
+            listOfParameters.add(parameter);
+            parameter = new Parameter();
+            parameter.setName("VERSION");
+            parameter.setValue(submission.getBlueprintInstanceForValidation().getVersion().toLowerCase());
             listOfParameters.add(parameter);
             parameter = new Parameter();
             parameter.setName("UI_IP");
@@ -128,23 +134,20 @@ public class SubmissionService {
                 socket.connect(InetAddress.getByName(random.nextInt(256) + "." + random.nextInt(256) + "."
                         + random.nextInt(256) + "." + random.nextInt(256)), 10002);
                 localIP = socket.getLocalAddress().getHostAddress();
-            } catch (SocketException | UnknownHostException e1) {
-                LOGGER.error(e1);
-                return null;
-            }
-            parameter.setValue(localIP);
-            listOfParameters.add(parameter);
-            parameters.setParameter(listOfParameters);
-            JenkinsExecutorClient client;
-            try {
+                parameter.setValue(localIP);
+                listOfParameters.add(parameter);
+                parameters.setParameter(listOfParameters);
+                JenkinsExecutorClient client;
                 client = JenkinsExecutorClient.getInstance(userName, userPassword, url);
                 submission.setJnksQueueJobItemUrl(client.postJobWithQueryParams(jobName, parameters).toString());
-            } catch (MalformedURLException | KeyManagementException | HttpException | ClientHandlerException
-                    | UniformInterfaceException | NoSuchAlgorithmException e) {
-                LOGGER.error(e);
+                return submission;
+            } catch (SocketException | UnknownHostException | KeyManagementException | HttpException
+                    | ClientHandlerException | UniformInterfaceException | MalformedURLException
+                    | NoSuchAlgorithmException e) {
+                LOGGER.error(EELFLoggerDelegate.errorLogger,
+                        "Error when triggering Jenkins job. " + UserUtils.getStackTrace(e));
                 return null;
             }
-            return submission;
         }
     }
 
index 421c2b6..8df150d 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.service;
 
index 7a36b23..8e45d73 100644 (file)
@@ -1,17 +1,17 @@
 /*
  * Copyright (c) 2019 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
+ * 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
+ * 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.
+ * 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.
  */
 package org.akraino.validation.ui.service.utils;
 
diff --git a/ui/src/main/resources/app.properties b/ui/src/main/resources/app.properties
deleted file mode 100644 (file)
index 76281ca..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2019 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.
-
-#LDAP details for authentication & authorization
-apacheds.ldap.url = ldap://localhost:10389/dc=akraino,dc=org
-
-#DB connection properties
-postgres.db.url = jdbc:postgresql://localhost:6432/admin
-postgres.db.user.name = admin
-
diff --git a/ui/src/main/resources/hibernate.properties b/ui/src/main/resources/hibernate.properties
deleted file mode 100644 (file)
index a66c68f..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2019 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.
-
-hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
-hibernate.show_sql = true
-hibernate.c3p0.min_size = 5
-hibernate.c3p0.max_size = 20
-hibernate.c3p0.acquire_increment = 2
-hibernate.c3p0.max_statements = 150
-hibernate.jdbc.use_streams_for_binary = true
\ No newline at end of file
diff --git a/ui/src/main/resources/key.properties b/ui/src/main/resources/key.properties
new file mode 100644 (file)
index 0000000..fa7598a
--- /dev/null
@@ -0,0 +1,41 @@
+###
+# ============LICENSE_START==========================================
+# ONAP Portal SDK
+# ===================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+#
+# Unless otherwise specified, all software contained herein is licensed
+# under the Apache License, Version 2.0 (the “License”);
+# you may not use this software 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.
+#
+# Unless otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#             https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# 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============================================
+#
+#
+###
+
+# Properties read by the ECOMP Framework library (epsdk-fw)
+
+cipher.enc.key = AGLDdG4D04BKm2IxIWEr8o==
\ No newline at end of file
diff --git a/ui/src/main/resources/log4j.properties b/ui/src/main/resources/log4j.properties
deleted file mode 100644 (file)
index 4484b3f..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (c) 2019 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.
-
-# Direct log messages to a log file
-log4j.rootLogger=INFO, stdout, file
-log4j.logger.org.hibernate.SQL=TRACE, stdout
-
-# Redirect log messages to console
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Threshold=WARN
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
-
-# Redirect log messages to a log file, support file rolling.
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.stdout.Threshold=DEBUG
-#log4j.appender.file.File=C:\\Users\\ld261v\\Downloads\\ak1.log
-log4j.appender.file.File=/usr/local/tomcat/logs/akraino.log
-log4j.appender.file.MaxFileSize=5MB
-log4j.appender.file.MaxBackupIndex=10
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/ui/src/main/resources/logback.xml b/ui/src/main/resources/logback.xml
new file mode 100644 (file)
index 0000000..9c7102e
--- /dev/null
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START==========================================
+  ONAP Portal SDK
+  ===================================================================
+  Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+  ===================================================================
+
+  Unless otherwise specified, all software contained herein is licensed
+  under the Apache License, Version 2.0 (the “License”);
+  you may not use this software 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.
+
+  Unless otherwise specified, all documentation contained herein is licensed
+  under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+  you may not use this documentation except in compliance with the License.
+  You may obtain a copy of the License at
+
+              https://creativecommons.org/licenses/by/4.0/
+
+  Unless required by applicable law or agreed to in writing, documentation
+  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============================================
+
+
+  -->
+
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+  <!--
+  Logback files for the ONAP Portal SDK Application "epsdk-app-os"
+  are created in directory ${catalina.base}/logs/epsdk_app_os;
+  e.g., apache-tomcat-8.0.35/logs/epsdk_app_os/application.log
+  -->
+  <!--<jmxConfigurator /> -->
+
+  <!--  specify the component name -->
+  <property name="componentName" value="AECBlueprintValidationUI"></property>
+
+  <!--  specify the base path of the log directory -->
+  <property name="logDirPrefix" value="${catalina.base}/logs"></property>
+
+  <!-- The directories where logs are written -->
+  <property name="logDirectory" value="${logDirPrefix}/${componentName}" />
+  <!-- Can easily relocate debug logs by modifying this path. -->
+  <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />
+
+  <!--  log file names -->
+  <property name="generalLogName" value="application" />
+  <property name="errorLogName" value="error" />
+  <property name="metricsLogName" value="metrics" />
+  <property name="auditLogName" value="audit" />
+  <property name="debugLogName" value="debug" />
+  <!--
+  These loggers are not used in code (yet).
+  <property name="securityLogName" value="security" />
+  <property name="policyLogName" value="policy" />
+  <property name="performanceLogName" value="performance" />
+  <property name="serverLogName" value="server" />
+   -->
+
+  <!-- 1610 Logging Fields Format Revisions -->
+  <property name="auditLoggerPattern"
+       value="%X{AuditLogBeginTimestamp}|%X{AuditLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+  <property name="metricsLoggerPattern"
+       value="%X{MetricsLogBeginTimestamp}|%X{MetricsLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVisualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+  <property name="errorLoggerPattern"
+       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ClassName}|%X{AlertSeverity}|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />
+
+  <property name="defaultLoggerPattern"
+       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ClassName}| %msg%n" />
+
+  <!-- use %class so library logging calls yield their class name -->
+  <property name="applicationLoggerPattern"
+       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%class{36}| %msg%n" />
+
+  <!-- Example evaluator filter applied against console appender -->
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>${defaultLoggerPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <!-- ============================================================================ -->
+  <!-- EELF Appenders -->
+  <!-- ============================================================================ -->
+
+  <!-- The EELFAppender is used to record events to the general application
+    log -->
+
+
+  <appender name="EELF"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${generalLogName}.log</file>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
+
+    </rollingPolicy>
+    <encoder>
+      <pattern>${applicationLoggerPattern}</pattern>
+    </encoder>
+    <filter class="org.onap.portalapp.util.CustomLoggingFilter" />
+  </appender>
+
+  <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <!-- Class name is part of caller data -->
+    <includeCallerData>true</includeCallerData>
+    <appender-ref ref="EELF" />
+  </appender>
+
+  <!-- EELF Security Appender. This appender is used to record security events
+    to the security log file. Security events are separate from other loggers
+    in EELF so that security log records can be captured and managed in a secure
+    way separate from the other logs. This appender is set to never discard any
+    events. -->
+  <!--
+  <appender name="EELFSecurity"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${securityLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+      <pattern>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <discardingThreshold>0</discardingThreshold>
+    <appender-ref ref="EELFSecurity" />
+  </appender>
+   -->
+
+  <!-- EELF Performance Appender. This appender is used to record performance
+    records. -->
+  <!--
+  <appender name="EELFPerformance"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${performanceLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+      <outputPatternAsHeader>true</outputPatternAsHeader>
+      <pattern>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFPerformance" />
+  </appender>
+  -->
+
+  <!-- EELF Server Appender. This appender is used to record Server related
+    logging events. The Server logger and appender are specializations of the
+    EELF application root logger and appender. This can be used to segregate Server
+    events from other components, or it can be eliminated to record these events
+    as part of the application root log. -->
+  <!--
+  <appender name="EELFServer"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${serverLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+        <pattern>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFServer" />
+  </appender>
+   -->
+
+  <!-- EELF Policy Appender. This appender is used to record Policy engine
+    related logging events. The Policy logger and appender are specializations
+    of the EELF application root logger and appender. This can be used to segregate
+    Policy engine events from other components, or it can be eliminated to record
+    these events as part of the application root log. -->
+  <!--
+  <appender name="EELFPolicy"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${policyLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+        <pattern>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFPolicy" />
+  </appender>
+  -->
+
+  <!-- EELF Audit Appender. This appender is used to record audit engine
+    related logging events. The audit logger and appender are specializations
+    of the EELF application root logger and appender. This can be used to segregate
+    Policy engine events from other components, or it can be eliminated to record
+    these events as part of the application root log. -->
+
+  <appender name="EELFAudit"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${auditLogName}.log</file>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
+
+    </rollingPolicy>
+    <encoder>
+         <pattern>${auditLoggerPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFAudit" />
+  </appender>
+
+  <appender name="EELFMetrics"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${metricsLogName}.log</file>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
+
+    </rollingPolicy>
+    <encoder>
+      <pattern>${metricsLoggerPattern}</pattern>
+    </encoder>
+  </appender>
+
+
+  <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFMetrics"/>
+  </appender>
+
+  <appender name="EELFError"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${errorLogName}.log</file>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
+
+    </rollingPolicy>
+    <encoder>
+      <pattern>${errorLoggerPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFError"/>
+  </appender>
+
+   <appender name="EELFDebug"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${debugLogDirectory}/${debugLogName}.log</file>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- daily rollover -->
+      <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+      <!-- keep 30 days' worth of history capped at 3GB total size -->
+      <maxHistory>30</maxHistory>
+      <totalSizeCap>3GB</totalSizeCap>
+
+    </rollingPolicy>
+    <encoder>
+      <pattern>${defaultLoggerPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFDebug" />
+  </appender>
+
+
+
+
+  <logger name="org.onap.eelf" level="info" additivity="false">
+    <appender-ref ref="asyncEELF" />
+  </logger>
+
+  <logger name="org.onap.eelf.audit" level="info" additivity="false">
+    <appender-ref ref="asyncEELFAudit" />
+  </logger>
+
+  <logger name="org.onap.eelf.debug" level="debug" additivity="false">
+    <appender-ref ref="asyncEELFDebug" />
+  </logger>
+
+  <logger name="org.onap.eelf.error" level="info" additivity="false">
+    <appender-ref ref="asyncEELFError" />
+  </logger>
+
+  <logger name="org.onap.eelf.metrics" level="info" additivity="false">
+    <appender-ref ref="asyncEELFMetrics" />
+  </logger>
+
+  <root level="DEBUG">
+    <appender-ref ref="asyncEELF" />
+  </root>
+
+</configuration>
diff --git a/ui/src/main/resources/music.properties b/ui/src/main/resources/music.properties
new file mode 100644 (file)
index 0000000..fa89354
--- /dev/null
@@ -0,0 +1,31 @@
+music.session.keyspace = test_session
+music.session.attr.tables = spring_session_attributes
+music.session.meta.tables = spring_session
+#music.cache = false
+music.serialize.compress = true
+music.session.max.inactive.interval.seconds = 1800
+music.exclude.api = /portalApi/healthCheck,/portalApi/healthCheckSuspend,/portalApi/healthCheckResume,/auxapi/.*
+#By default it's eventual
+music.atomic.get = false
+music.atomic.put = false
+#how often the session clean up would happen (hour)
+music.cleanup.frequency = 6
+#how old of session need to be cleaned up (hour)
+music.cleanup.threshold = 10
+music.enable = false
+cassandra.host=135.197.226.103
+zookeeper.host=135.197.226.103, 135.197.226.108, 135.197.226.119
+cassandra.user=cassandra
+cassandra.password=cassandra
+
+#Music API
+#music.endpoint = http://vm-ep-dev4.research.att.com/MUSIC/rest/
+#music.version = v2
+#music.keyspace = keyspaces
+#music.x.minor.version = 3
+#music.x.patch.version = 0
+#music.ns = com.att.ecomp.portal.demeter
+#music.user.id = m00468@portal.ecomp.att.com
+#music.password = friedG33nS-
+#music.consistency.info = type
+#music.consistency.info.value = eventual
\ No newline at end of file
diff --git a/ui/src/main/resources/portal.properties b/ui/src/main/resources/portal.properties
new file mode 100644 (file)
index 0000000..5434599
--- /dev/null
@@ -0,0 +1,70 @@
+###
+# ============LICENSE_START==========================================
+# ONAP Portal SDK
+# ===================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+#
+# Unless otherwise specified, all software contained herein is licensed
+# under the Apache License, Version 2.0 (the â??Licenseâ?\9d);
+# you may not use this software 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.
+#
+# Unless otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the â??Licenseâ?\9d);
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#             https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# 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============================================
+#
+#
+###
+# Properties read by ECOMP Framework library, ecompFW.jar
+
+##########################################################################
+# The following properties should NOT be changed by partner applications.
+##########################################################################
+
+portal.api.prefix = /api
+max.idle.time = 5
+user.attribute.name = user_attribute
+
+#Use REST API instead of UEB to fetch the functional menu data
+use_rest_for_functional_menu=true
+
+##########################################################################
+# The following properties MUST be changed by partner applications.
+##########################################################################
+
+# Name of java class that implements the OnBoardingApiService interface.
+portal.api.impl.class = org.onap.portalapp.service.OnBoardingApiServiceImpl
+
+# URL of the Portal where this app is onboarded
+ecomp_redirect_url = https://portal.onap.org/ecompportal/process_csp
+
+# URL of the ECOMP Portal REST API
+ecomp_rest_url = http://portal.onap.org:50580/ecompportal/auxapi
+
+# Applications do not need to run a UEB listener after 1607.
+ueb_listeners_enable = false
+
+# UEB Configuration
+# If key ueb_listeners_enable is set to false,
+# then only the ueb_app_key is required.
+ueb_app_key = REPLACE-ME-UEB-APP-KEY-EPSDK-APP-OS
index d1e9531..8cc24f1 100644 (file)
@@ -4,6 +4,7 @@
     "console": 1,
     "confirm":1,
     "localStorage":1,
-    "window":1
+    "window":1,
+    "appDS2":1
   }
 }
diff --git a/ui/src/main/webapp/WEB-INF/conf/system.properties b/ui/src/main/webapp/WEB-INF/conf/system.properties
new file mode 100644 (file)
index 0000000..6276357
--- /dev/null
@@ -0,0 +1,85 @@
+#
+# Copyright (c) 2019 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.
+#
+
+##########################################################################
+# The following properties should NOT be changed by partner applications.
+##########################################################################
+
+application_user_id           = 30000
+post_default_role_id          = 16
+clustered                     = true
+
+#Enable Fusion Mobile capabilities for the application
+mobile_enable                            = false
+
+# Cache config file is needed on the classpath
+cache_config_file_path        = /WEB-INF/classes/cache.ccf
+cache_switch                  = 199
+cache_load_on_startup         = false
+
+user_name                     = fullName
+decryption_key                = AGLDdG4D04BKm2IxIWEr8o==
+
+##########################################################################
+# The following properties REQUIRE changes by partner applications.
+##########################################################################
+
+#Mysql
+db.driver =  org.mariadb.jdbc.Driver
+db.userName = root
+db.encrypt_flag = false
+db.hib.dialect = org.hibernate.dialect.MySQLDialect
+db.min_pool_size = 5
+db.max_pool_size = 10
+#db.test_connection_on_checkout = false
+#db.preferred_test_query = SELECT 1 from FN_USER
+
+hb.dialect = org.hibernate.dialect.MySQLDialect
+# SQL statements are logged to stdout
+hb.show_sql = true
+hb.idle_connection_test_period = 3600
+
+app_display_name = Akraino Blueprint Validation UI
+# license file area
+files_path = /tmp
+
+#element map files
+element_map_file_path = app/fusionapp/files/
+element_map_icon_path = app/fusionapp/icons/
+
+#Cron Schedules have 6 required fields and 1 optional field:
+# Seconds Minutes Hours Day-of-Month Month Day-of-Week Year
+log_cron                      = 0 0/1 * * * ?;
+#sessiontimeout_feed_cron        = 0 * * * * ? *
+
+# Link shown in Help menu
+contact_us_link = https://wiki.onap.org/display/DW/Portal
+
+# An Unique 128-bit value defined to identify a specific version
+# of an application deployed on a specific virtual machine.
+# This value must be generated and updated by the application
+# which is using the ECOMP SDK at the time of its deployment.
+# Online Unique UUID generator - https://www.uuidgenerator.net/
+instance_uuid=8da691c9-987d-43ed-a358-00ac2f35685d
+
+# Application base URL has the host and app context only; a proper prefix of the on-boarded URL.
+# Only required for applications using FE/BE separation.  For example:
+# app_base_url = https://www.onap.org/app_context/
+
+#authenticate user server
+authenticate_user_server=http://todo_enter_auth_server_hostname:8383/openid-connect-server-webapp/allUsers
+#cookie domain
+cookie_domain = onap.org
\ No newline at end of file
diff --git a/ui/src/main/webapp/WEB-INF/defs/definitions.xml b/ui/src/main/webapp/WEB-INF/defs/definitions.xml
new file mode 100644 (file)
index 0000000..ec0ec0d
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (c) 2019 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. -->
+<!DOCTYPE tiles-definitions PUBLIC
+       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
+       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
+
+<!-- This tiles definitions file is defs/definitions.xml. It maps tokens
+    used by app controllers to JSP file paths. Applications that use JSP pages
+    should modify this file. Configured by ExternalAppConfig#addTileDefinitions(). -->
+
+<tiles-definitions>
+
+    <definition name="newSubmission"
+        template="/app/AECBlueprintValidationUI/NewSubmission/NewSubmission.html" />
+
+    <definition name="committedSubmissions"
+        template="/app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissions.html" />
+
+    <definition name="getBySubmissionId"
+        template="/app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionId.html" />
+
+</tiles-definitions>
diff --git a/ui/src/main/webapp/WEB-INF/fusion/conf/fusion.properties b/ui/src/main/webapp/WEB-INF/fusion/conf/fusion.properties
new file mode 100644 (file)
index 0000000..8ee0a95
--- /dev/null
@@ -0,0 +1,35 @@
+# login settings
+login_method_backdoor       = backdoor
+login_method_attribute_name = login_method
+
+# These properties will be removed after SingleSignOnController is cleaned
+authentication_mechanism = BOTH
+login_method_csp            = csp
+login_method_web_junction   = web_junction
+
+#login message
+login.error.hrid.empty = Login failed, please contact system administrator.
+login.error.hrid.not-found = User not found, please contact system administrator.
+login.error.user.inactive = Account is disabled, please contact system administrator.
+
+# User Session settings
+user_attribute_name           = user
+roles_attribute_name          = roles
+role_function_list = role_function_list
+role_functions_attribute_name = role_functions
+
+# Import-user LDAP settings
+post_initial_context_factory = com.sun.jndi.ldap.LdapCtxFactory
+post_provider_url            = ldap://ldap.mycompany.com:389
+post_security_principal      = ou=people,o=mycompany,c=us
+post_max_result_size         = 499
+
+# menu settings
+menu_query_name                      = menuData
+application_menu_set_name            = APP
+application_menu_attribute_name      = applicationMenuData
+business_direct_menu_set_name        = BD
+business_direct_menu_attribute_name  = businessDirectMenuData
+
+# Role settings
+sys_admin_role_id = 1
diff --git a/ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/footer.jsp b/ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/footer.jsp
new file mode 100644 (file)
index 0000000..1363d15
--- /dev/null
@@ -0,0 +1,17 @@
+<script src="./app/fusion/external/angular-1.5/angular.min.js"></script>
+<script src="app/fusion/external/ds2/js/b2b-angular/b2b-library.min.js"></script>
+<link rel="stylesheet" type="text/css" href="./app/fusion/external/ds2/css/b2b-angular/b2b-angular.css"></style>
+
+<div style="position: relative; bottom: 0; left: 0; width: 100%">
+       <footer class="b2b-footer-wrapper" role="contentinfo"
+               aria-label="footer">
+               <div class="b2b-footer-container" b2b-column-switch-footer>
+                       <!-- footer-link-items='footerItems' -->
+               <!--    <hr> -->
+                       <div style="margin-top: -25px;" class="divider-bottom-footer">
+                               <div class="span12 footerLogo">
+                               </div>
+                       </div>
+               </div>
+       </footer>
+</div>
\ No newline at end of file
diff --git a/ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/header.jsp b/ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/header.jsp
new file mode 100644 (file)
index 0000000..94213a2
--- /dev/null
@@ -0,0 +1 @@
+<div ds2-menu id="menuContainer" class="menu-container" ></div>
\ No newline at end of file
diff --git a/ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp b/ui/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp
new file mode 100644 (file)
index 0000000..66e7da3
--- /dev/null
@@ -0,0 +1,778 @@
+<%--
+  ============LICENSE_START==========================================
+  ONAP Portal SDK
+  ===================================================================
+  Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+  ===================================================================
+
+  Unless otherwise specified, all software contained herein is licensed
+  under the Apache License, Version 2.0 (the “License”);
+  you may not use this software 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.
+
+  Unless otherwise specified, all documentation contained herein is licensed
+  under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+  you may not use this documentation except in compliance with the License.
+  You may obtain a copy of the License at
+
+              https://creativecommons.org/licenses/by/4.0/
+
+  Unless required by applicable law or agreed to in writing, documentation
+  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============================================
+
+
+  --%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+<%@ page isELIgnored="false"%>
+<%@ page import="org.onap.portalsdk.core.util.SystemProperties"%>
+<%@ page import="org.onap.portalsdk.core.onboarding.util.PortalApiProperties"%>
+<%@ page import="org.onap.portalsdk.core.onboarding.util.PortalApiConstants"%>
+<%@ page import="org.onap.portalsdk.core.domain.MenuData"%>
+<link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/ebz_header/header.css">
+<link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/ebz_header/portal_ebz_header.css">
+<link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/sandbox/styles/style.css" >
+
+
+<jsp:include page="/WEB-INF/fusion/jsp/ebz/loginSnippet.html" ></jsp:include>
+
+
+<c:set var="UserName"  value="<%= session.getAttribute(\"fullName\")%>" />
+<c:set var="UserFirstName"     value="<%= session.getAttribute(\"first_name\")%>" />
+
+<%
+       String contactUsLink = SystemProperties.getProperty(SystemProperties.CONTACT_US_LINK);
+       String redirectUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL);
+       String portalUrl = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/process_csp";
+       String getAccessLink = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/get_access";
+%>
+<c:set var="returnPortalUrl" value="<%=portalUrl%>" />
+<c:set var="contactUsLink" value="<%=contactUsLink%>" />
+<c:set var="getAccessLink" value="<%=getAccessLink%>" />
+
+<style>
+</style>
+
+<%@include  file="/WEB-INF/fusion/jsp/ebz/loginSnippet.html" %>
+
+<div style="position: relative; z-index: 999;">
+       <div ng-controller="headerController">
+
+                <div class="headerContainer" id="headerContainer" ng-cloak  ng-show="{{showHeader}}">
+                       <div id="megaMenuContainer" class="megaMenuContainer" style="margin-top: 0; overflow: visible;">
+                               <div>
+                                       <!--for mega Menu-->
+                                       <!-- Mega Menu parent-tab directive with three models menu-items, active-sub-menu, active-menu -->
+                                       <div id="topMenu" class="top-megamenu" ng-mouseleave="activeClickSubMenu.x.active=false; activeClickMenu.x.active=false">
+                                               <div style="float:left;width:100%;"parent-tab menu-items="megaMenuDataObject" active-sub-menu='activeClickSubMenu.x' active-menu='activeClickMenu.x'>
+                                       <div parentmenu-tabs mega-menu="true" menu-items="megaMenuDataObject" style="height:55px;">
+                                                               <div style="float:left">
+                                                                       <li class="megamenu__item" style="line-height:55px;" onclick="returnToPortal()">
+                                                                               <div ng-include src="'app/fusion/scripts/DS2-view-models/header-logo.html'"></div>
+                                                                       </li>
+                                                                       <div menu-tabs mega-menu="true" tab-name="item.text" menu-item="item" active-menu="activeClickMenu.x"
+                                                                       ng-repeat="item in megaMenuDataObject" style="font-size: 18px;" ng-mousedown="loadFavorites()" >
+                                                       <div parentmenu-tabs sub-menu="true" ng-show="activeClickMenu.x.active && item.active" menu-items="activeClickMenu.x.children">
+                                                       <!-- Second level menu -->
+                                                                       <div>
+                                                                               <div menu-tabs sub-menu="true" tab-name="subItem.text"
+                                                                                       tab-url="subItem.url"  menu-item="subItem"
+                                                                                       ng-repeat="subItem in activeClickMenu.x.children | orderBy : 'column'" active-menu="activeClickSubMenu.x"
+                                                                                       sub-item-active="{{subItem.active}}" style="float:left;" aria-label="{{subItem.text}}"
+                                                ng-mouseenter="submenuLevelAction(subItem.text,subItem.column)"
+                                                ng-mouseleave="submenuLevelAction(subItem.text,subItem.column)"
+                                               ng-click="submenuLevelAction(subItem.text,subItem.column)"  >
+                                                <i ng-if="subItem.text=='Favorites'" id="favorite-star"
+                                                   class="icon-star favorites-icon-active">
+                                                </i>
+                                                                               </div>
+
+                                                       <div class="sub__menu" ng-mouseleave="activeClickSubMenu.x.active=false" >
+                                                               <ul ng-show="activeClickSubMenu.x.active"  role="menubar" class="columns">
+                                      <!-- Third level menu -->
+                                                                   <div menu-tabs menu-item="subItem"
+                                                                   class="columns-div"
+                                                                   ng-repeat="subItem in activeClickSubMenu.x.children | orderBy : 'column'"
+                                                                   ng-show="activeClickSubMenu.x.active">
+
+                                                           <i id="favorite-selector-third-level"
+                                                              ng-show="isUrlFavorite(subItem.menuId)==false"
+                                                              class="icon-star favorites-icon-inactive"
+                                                              ng-if="subItem.url.length > 1">
+                                                           </i>
+                                                           <i id="favorite-selector-third-level"
+                                                              ng-show="isUrlFavorite(subItem.menuId)"
+                                                              class="icon-star favorites-icon-active"
+                                                              ng-if="subItem.url.length > 1">
+                                                           </i>
+                                                                                                               <span class="title" aria-label="{{subItem.text}}"
+                                                                                                               ng-click="goToUrl(subItem)">{{subItem.text}}</span>
+                                                       <!-- Fourth level menus -->
+                                                                       <div att-links-list="">
+                                                            <i id="favorite-selector-fourth-level"
+                                                               class="icon-star favorites-icon-inactive"
+                                                               ng-show="isUrlFavorite(tabValue.menuId)==false"
+                                                               ng-if="tabValue.url.length > 1">
+
+                                                            </i>
+                                                            <i id="favorite-selector-fourth-level"
+                                                               class="icon-star favorites-icon-active"
+                                                               ng-show="isUrlFavorite(tabValue.menuId)"
+                                                               ng-if="tabValue.url.length > 1">
+
+                                                            </i>
+                                                                           <span role="menuitem" att-links-list-item=""
+                                                                           ng-repeat="tabValue in subItem.children"
+                                                                           ng-click="goToUrl(tabValue)"
+                                                                           att-accessibility-click="13,32"
+                                                                           ng-class="{'disabled': tabValue.disabled}">{{tabValue.text}}</span>
+                                                                       </div>
+                                                                       <hr ng-show="!$last"/>
+
+                                                                   </div>
+                                                                </ul>
+                                  <!-- Favorites level menu -->
+                                                                                               <div class="favorites-window" ng-show='favoritesWindow' ng-mouseleave="hideFavoritesWindow()">
+                                                                                                       <div id="favorites-menu-items" ng-show="showFavorites">
+                                                                                                               <div ng-repeat="subItem in favoritesMenuItems" att-links-list="" style='display: inline'>
+                                                                                                                               <i id="favorite-selector-favorites-list" class="icon-star favorites-icon-active">
+                                                                                                                               </i>
+                                                                                                                               <a id="favorites-list" aria-label="{{subItem.text}}"
+                                                                                                                                  ng-click="goToUrl(subItem)"
+                                                                                                                                  style="margin-left: 3px; margin-right: 20px; text-decoration: none;  color: #666666;">
+                                                                                                                                  {{subItem.text}}
+                                                                                                                               </a>
+                                                                                                               </div>
+                                                                                                               <div>
+                                                                                                                       <br>
+                                                                                                                       <p style='font-weight: 400; font-family: "Omnes-ECOMP-W02", Arial !important;
+                                                                                                                       font-size: 18px; text-align: center; background-color: lightgray;
+                                                                                                                       width: 400px; margin-left: 25%; margin-right: 25%;'>
+                                                                                                                               Manage favorites on ECOMP Portal.
+                                                                                                                       </p>
+                                                                                                               </div>
+                                                                                                       </div>
+                                                                 <!-- Favorites when empty -->
+                                                                                                               <div id="favorites-empty" ng-show='favoritesWindow' ng-show="emptyFavorites">
+                                                                       <div id="favorites-empty" ng-show="emptyFavorites" class="favorites-window-empty">
+                                                                           <div>
+                                                                               <img src="app/fusion/external/ebz/images/no_favorites_star.png">
+                                                                               <p class='favoritesLargeText'>No Favorites</p>
+                                                                                                                                       <p class='favoritesNormalText'>Manage favorites on ECOMP Portal.</p>
+                                                                           </div>
+                                                                       </div>
+                                                                                                               </div>
+                                                                                                       </div>
+
+                                                               </div>
+                                                           </div>
+                                                       </div>
+                                                   </div >
+                                                   <li class="megamenu__item" style="line-height:55px;" ng-if="loadMenufail">
+                                                                               <strong style="font-weight: 400 !important; font-family: "Omnes-ECOMP-W02", Arial !important; font-size: 18px;" >Unable to load menus</strong>
+                                                                       </li>
+<!--                                                                           <li class="megamenu__item" style="width: 20%;">&nbsp;</li>
+ -->                                                                   </div>
+                                                               <!--  Login Snippet-->
+                                                               <div  style="float:right">
+                                                                       <li id="bcLoginSnippet" class="megamenu__item" style="width: 140px;" >
+                                                                               <div popover="loginSnippet.html"  aria-label="Login Snippet"    referby="loginSnippet" att-accessibility-click="13,32" popover-style="\" popover-placement="below" style="width: 200px;">
+                                                                                       <div class="icon-user-small login-snippet-icon"></div>
+                                                                                       <div class="login-snippet-text" style="display: inline-block; font-size:12px; margin-left:5px;overflow: hidden; max-height: 31px;   max-width:120px; padding-top: 0px; margin-top: 0px; white-space: nowrap;" ng-bind="userProfile.firstName"></div>
+                                                                               </div>
+                                                                       </li>
+                                                                       <li class="megamenu__item" style="width:120px;">&nbsp;</li>
+                                                               </div>
+
+                                                       </div>
+                                               </div>
+                                               <div style="clear: both"></div>
+                                       </div>
+                                       </div>
+                               </div>
+                       </div>
+               <div class="license-notification" id="license-notification">
+                       <a href="javascript:void(0)" style="background-color:#bbb;" class="button button--small" tooltip="Please contact ECOMP Portal team to get the license" tooltip-placement="below" tooltip-style="light"  tooltip-popup-delay="500" >
+                               <span style="">{{app_name_full}}</span>
+                       </a>
+               </div>
+               <div style="position: relative; color: black; top: 70px;">
+                       <div ng-cloak>
+                               <span ng-style="adjustHLeftMenu('burgerIcon')" style="z-index:998; position:fixed; left:0%; font-size:35px; margin-left:10px;text-decoration:none;">
+                                       <a ng-click="toggleDrawer();isOpen = !isOpen" href="javascript:void(0);" class="arrow-icon-left" >
+                                       <span class="icon-hamburger"></span></a>
+                                       <span ng-init="isOpen = true" ng-show="isOpen" style="font-size:16px; position:relative; top:-8px; left:-15px;">&nbsp&nbsp&nbsp {{app_name}}</span>
+                               </span>
+                               <div att-drawer drawer-slide="left" drawer-custom-top="{{drawer_custom_top}}px" drawer-size="200px" drawer-open="drawerOpen" drawer-custom-height="100%" >
+                                   <div ng-style="adjustHLeftMenu('leftMenu')">
+                                           <div class="attDrawer" style="margin-top:{{drawer_margin_top}}px;">
+                                               <div style="margin-left:10px; margin-right:10px;">
+                                                       <accordion close-others="true" css="att-accordion--no-box">
+                                                   <accordion-group ng-repeat="parent in menuItems" heading="{{parent.parentLabel}}" child="{{parent.parentAction}}" parent-link="{{parent.parentAction}}" image-source="{{parent.parentImageSrc}}" child-length="{{parent.childItemList.length}}" is-open="parent.open">
+                                                       <div ng-repeat="subMenu in parent.childItemList" style="font-size:12px; margin-left:10px;">
+                                                               <a href="{{subMenu.action}}" style="font-size:12px; color:#666666;" >{{subMenu.label}}</a>
+                                                       </div>
+                                                   </accordion-group>
+                                               </accordion>
+                                                       </div>
+                                           </div>
+                                   </div>
+                               </div>
+                       </div>
+               </div>
+       </div>
+</div>
+
+<script>
+       function returnToPortal(){
+               window.location.href = "<c:out value='${returnPortalUrl}'/>";
+       }
+       detectScrollEvent = function() {
+               var footerOff = $('#footerContainer').offset().top;
+               var headOff = $('#headerContainer').offset().top;
+               var winHeight = $(window).height();
+               if ((footerOff - headOff) <= winHeight) {
+                       $('.att-drawer').css({
+                               "height" : footerOff - headOff - 55
+                       });
+               } else {
+                       $('.att-drawer').css({
+                               "height" : "94vh"
+                       });
+               }
+       }
+       $(window).scroll(function() {
+               if ($('.att-drawer').is(':visible')) {
+                       detectScrollEvent();
+               }
+       });
+       app.controller("headerController", function($scope, $timeout, $log, $http, UserInfoService, $window, $cookies,LeftMenuService) {
+               // $log.debug('HeaderController started');
+               $scope.jsonMenuData = [];
+               $scope.loadMenufail=false;
+               $scope.app_name = "";
+               $scope.app_name_full = "";
+               $scope.megaMenuDataObject =[];
+               $scope.activeClickSubMenu = {
+                       x: ''
+        };
+       $scope.activeClickMenu = {
+                       x: ''
+       };
+               $scope.favoritesMenuItems = [];
+        $scope.favoriteItemsCount = 0;
+        $scope.showFavorites = false;
+        $scope.emptyFavorites = false;
+        $scope.favoritesWindow = false;
+        $scope.userProfile={
+                       firstName:'',
+                       lastName:'',
+                       fullName:'',
+                       email:''
+       }
+       /*Put user info into fields*/
+       $scope.inputUserInfo = function(userInfo){
+               if (typeof(userInfo) != "undefined" && userInfo!=null && userInfo!=''){
+                       if (typeof(userInfo.USER_FIRST_NAME) != "undefined" && userInfo.USER_FIRST_NAME!=null && userInfo.USER_FIRST_NAME!='')
+                               $scope.userProfile.firstName = userInfo.USER_FIRST_NAME;
+                       if (typeof(userInfo.USER_LAST_NAME) != "undefined" && userInfo.USER_LAST_NAME!=null && userInfo.USER_LAST_NAME!='')
+                               $scope.userProfile.lastName = userInfo.USER_LAST_NAME;
+                       if (typeof(userInfo.USER_EMAIL) != "undefined" && userInfo.USER_EMAIL!=null && userInfo.USER_EMAIL!='')
+                               $scope.userProfile.email = userInfo.USER_EMAIL;
+               }
+       }
+        /*getting user info from session*/
+       $scope.getUserNameFromSession = function(){
+               UserInfoService.getFunctionalMenuStaticDetailSession()
+               .then(function (res) {
+                       $scope.userProfile.firstName = res.firstName;
+                       $scope.userProfile.lastName = res.lastName;
+                       $scope.userProfile.email = res.email;
+                               $scope.userProfile.fullName     = res.userName;
+                               $scope.redirectUrl = res.portalUrl;
+               });
+        }
+       $scope.getTopMenuStaticInfo=function() {
+               var promise = UserInfoService.getFunctionalMenuStaticDetailShareContext();
+               promise.then(
+                               function(res) {
+                                       if(res==null || res==''){
+                                               $log.info('failed getting static User information');
+                                               $scope.getUserNameFromSession();
+                                       }else{
+                                               $log.info('Received static User information');
+                                               var resData = res;
+                                               $scope.inputUserInfo(resData);
+                                               $scope.userProfile.fullName = $scope.userProfile.firstName+ ' '+ $scope.userProfile.lastName;
+                                       }
+                               },
+                               function(err) {
+                                       $log.info('failed getting static User information');
+                               }
+               );
+               }
+
+               var unflatten = function( array, parent, tree ){
+                       tree = typeof tree !== 'undefined' ? tree : [];
+                       parent = typeof parent !== 'undefined' ? parent : { menuId: null };
+                       var children = _.filter( array, function(child){ return child.parentMenuId == parent.menuId; });
+
+                       if( !_.isEmpty( children )  ){
+                               if( parent.menuId === null ){
+                                               tree = children;
+                               }else{
+                                       parent['children'] = children
+                               }
+                               _.each( children, function( child ){ unflatten( array, child ) } );
+                       }
+
+                       return tree;
+               }
+
+               var menuStructureConvert = function(menuItems) {
+                       var megaMenuDataObjectTemp = [
+                                        {
+                                                text: "ECOMP",
+                                                children:menuItems
+                                        },
+                                        {
+                                                text: "Help",
+                                                children: [{
+                                                        text:"Contact Us",
+                                                        url:"<c:out value='${contactUsLink}'/>"
+                                                },
+                                                {
+                                                        text:"Get Access",
+                                                        url:"<c:out value='${getAccessLink}'/>"
+                                                }]
+                                        }
+                                        ];
+                       return megaMenuDataObjectTemp;
+               };
+
+
+               /*Left Menu*/
+               LeftMenuService.getAppName().then(function(response){
+                       var j = response;
+                       try{
+                               if(j && j !== "null" && j!== "undefined"){
+                                       // console.log("app name is " + $scope.app_name);
+                                       $scope.app_name_full = j.data;
+                                       var processed_app_name = j.data;
+                                       if(processed_app_name.indexOf("[")<=-1) {
+                                               if (document.getElementById('license-notification')!=null)
+                                                       document.getElementById('license-notification').style.display = "none";
+                                       }
+                                       var n = processed_app_name.length;
+                                       if (n > 15) {
+                                               n = 15;
+                                       }
+                                       $scope.app_name = processed_app_name.substr(0, n);
+                               }else{
+                                       throw "Get app_name response is not an object/is empty";
+                               }
+                       }catch (e) {
+                               console.log("error happened while trying to get app name "+e);
+                               return;
+               }
+               },function(error){
+                       console.log('getAppName failed', error);
+               });
+
+           $scope.getUserNameFromSession();
+       $scope.getMenu=function() {
+
+                $http({
+                       method: "GET",
+                       url: 'get_functional_menu',
+// TIMEOUT USED FOR LOCAL TESTING ONLY
+//                     timeout: 100
+                }).success(function (response) {
+                       if(response == '101: Timeout') {
+                               $log.error('Timeout attempting to get_functional_menu');
+                       // TIMEOUT USED FOR LOCAL TESTING ONLY
+//                             $scope.createErrorMenu();
+                               $scope.megaMenuDataObject = menuStructureConvert('');
+                       }else {
+                               $log.debug('get_functional_menu success: ' + response);
+                               if(typeof response != 'undefined' && response.length!=0 && typeof response[0] != 'undefined' && typeof response[0].error!="undefined"){
+// createErrorMenu() USED FOR LOCAL TESTING ONLY
+//                                     $scope.createErrorMenu();
+                                       $scope.megaMenuDataObject = menuStructureConvert('');
+                               //      $scope.loadMenufail=true;
+                               }else{
+                                       $scope.jsonMenuData = unflatten( response );
+                                       $scope.megaMenuDataObject = menuStructureConvert($scope.jsonMenuData);
+                               }
+                       }
+               }).error(function (response){
+// createErrorMenu() USED FOR LOCAL TESTING ONLY
+//                             $scope.createErrorMenu();
+
+                               //$scope.loadMenufail=true;
+                               $scope.megaMenuDataObject = menuStructureConvert('');
+                       $log.debug('REST API failed get_functional_menu...'+ response);
+                 });
+               }
+       $scope.adjustHLeftMenu = function (type){
+               $scope.showHeader = ($cookies.show_app_header == undefined ? true : $cookies.show_app_header);
+
+               if($scope.showHeader == true) {
+                       $scope.drawer_margin_top = 60;
+                       $scope.drawer_custom_top = 54;
+                       $scope.toggle_drawer_top = 55;
+               }
+               else  {
+
+                       $scope.drawer_margin_top = 50;
+                       $scope.drawer_custom_top = 0;
+                       $scope.toggle_drawer_top = 10;
+               }
+               if(type=='burgerIcon'){
+                       return { "top": $scope.toggle_drawer_top+"px"};
+               }else if(type=='leftMenu'){
+                       return { "margin-top": $scope.drawer_margin_top+"px"};
+               }else
+                       return;
+       }
+       $scope.adjustHeader=function() {
+               $scope.showHeader = ($cookies.show_app_header == undefined ? true : $cookies.show_app_header);
+
+               if($scope.showHeader == true) {
+                       $scope.drawer_margin_top = 50;
+                       $scope.drawer_custom_top = 54;
+                       $scope.toggle_drawer_top = 55;
+               }
+               else  {
+
+                       $scope.drawer_margin_top = 40;
+                       $scope.drawer_custom_top = 0;
+                       $scope.toggle_drawer_top = 10;
+               }
+
+
+       }
+
+
+               //$scope.getMenu();
+               $scope.adjustHeader();
+
+
+               /* **************************************************************************/
+               /* Logic for the favorite menus is here */
+
+            $scope.loadFavorites = function () {
+                $log.debug('loadFavorites has happened.');
+                if ($scope.favoritesMenuItems == '') {
+                    $scope.generateFavoriteItems();
+                    $log.debug('loadFavorites is calling generateFavoriteItems()');
+                } else {
+                    $log.debug('loadFavorites is NOT calling generateFavoriteItems()');
+                }
+            }
+
+            $scope.goToUrl = function (item) {
+                $log.info("goToUrl called")
+                $log.info(item);
+
+                var url = item.url;
+                var restrictedApp = item.restrictedApp;
+                $log.debug('Restricted app status is: ' + restrictedApp);
+                if (!url) {
+                    $log.info('No url found for this application, doing nothing..');
+                    return;
+                }
+                if (restrictedApp) {
+                    $window.open(url, '_blank');
+                } else {
+                    $window.open(url, '_self');
+                }
+
+            }
+
+            $scope.submenuLevelAction = function(index, column) {
+                if ($scope.favoritesMenuItems == '') {
+                    $scope.generateFavoriteItems();
+                    $log.debug('submenuLevelAction is calling generateFavoriteItems()');
+                }
+                $log.debug('item hovered/clicked: ' + index + '; column = ' + column);
+                if (column == 2) {  // 2 is Design
+                    $scope.favoritesWindow = false;
+                    $scope.showFavorites = false;
+                    $scope.emptyFavorites = false;
+                }
+                if (index=='Favorites' && $scope.favoriteItemsCount != 0) {
+                    $log.debug('Showing Favorites window');
+                    $scope.favoritesWindow = true;
+                    $scope.showFavorites = true;
+                    $scope.emptyFavorites = false;
+                }
+                if (index=='Favorites' && $scope.favoriteItemsCount == 0) {
+                    $log.debug('Hiding Favorites window in favor of No Favorites Window');
+                    $scope.favoritesWindow = true;
+                    $scope.showFavorites = false;
+                    $scope.emptyFavorites = true;
+                }
+                if (column > 2) {
+                    $scope.favoritesWindow = false;
+                    $scope.showFavorites = false;
+                    $scope.emptyFavorites = false;
+                }
+            };
+
+            $scope.hideFavoritesWindow = function() {
+                $log.debug('$scope.hideFavoritesWindow has been called');
+                $scope.showFavorites = false;
+                $scope.emptyFavorites = false;
+            }
+
+            $scope.isUrlFavorite = function (menuId) {
+//                 $log.debug('array objects in menu favorites = ' + $scope.favoriteItemsCount + '; menuId=' + menuId);
+                var jsonMenu =  JSON.stringify($scope.favoritesMenuItems);
+                var isMenuFavorite =  jsonMenu.indexOf('menuId\":' + menuId);
+                if (isMenuFavorite==-1) {
+                    return false;
+                } else {
+                    return true;
+                }
+
+            }
+
+            $scope.generateFavoriteItems  = function() {
+               $http({
+                       method: "GET",
+                       url: 'get_favorites',
+               // TIMEOUT USED FOR LOCAL TESTING ONLY
+//                                             timeout: 100
+                           }).success(function (response) {
+                                               if (response == '101: Timeout') {
+                                               $log.error('Timeout attempting to get_favorites_menu');
+                                       } else {
+                                               if(typeof response != 'undefined' && response.length!=0 && typeof response[0] != 'undefined' && typeof response[0].error!="undefined"){
+                                                   $log.error('REST API failed get_favorites' + response);
+                                                       }else{
+                                                               $log.debug('get_favorites = ' + JSON.stringify(response));
+                                                               $scope.favoritesMenuItems = response;
+                                       $scope.favoriteItemsCount = Object.keys($scope.favoritesMenuItems).length;
+                                       $log.info('number of favorite menus: ' + $scope.favoriteItemsCount);
+                               }
+                                               }
+                                       }).error(function (response){
+                                           $log.error('REST API failed get_favorites' + response);
+               //createFavoriteErrorMenu() USED FOR LOCAL TESTING ONLY
+//                                                     $scope.createFavoriteErrorMenu();
+                                       });
+               }
+
+                               $scope.createFavoriteErrorMenu=function() {
+                               $scope.favoritesMenuItems = [
+//
+                                                               ];
+                               $scope.favoriteItemsCount = Object.keys($scope.favoritesMenuItems).length;
+                               $log.info('number of favorite menus: ' + $scope.favoriteItemsCount);
+                               }
+
+               /* end of Favorite Menu code */
+               /* **************************************************************************/
+
+
+               /* **************************************************************************/
+               // THIS IS USED FOR LOCAL TESTING ONLY
+               /* **************************************************************************/
+
+                       $scope.createErrorMenu=function() {
+               $scope.jsonMenuData = [
+                                   {
+                                           "menuId": 1,
+                                           "column": 2,
+                                           "text": "Design",
+                                           "parentMenuId": null,
+                                           "url": ""
+                                         },
+                                         {
+                                           "menuId": 2,
+                                           "column": 3,
+                                           "text": "Infrastructure Ordering",
+                                           "parentMenuId": null,
+                                           "url": ""
+                                         },
+                                         {
+                                           "menuId": 3,
+                                           "column": 4,
+                                           "text": "Service Creation",
+                                           "parentMenuId": null,
+                                           "url": ""
+                                         },
+                                         {
+                                           "menuId": 4,
+                                           "column": 5,
+                                           "text": "Service Mgmt",
+                                           "parentMenuId": null,
+                                           "url": ""
+                                         },
+                                         {
+                                           "menuId": 90,
+                                           "column": 1,
+                                           "text": "Google",
+                                           "parentMenuId": 1,
+                                           "url": "http://google.com"
+                                         },
+                                         {
+                                           "menuId": 91,
+                                           "column": 1,
+                                           "text": "Mike Little's Coffee Cup",
+                                           "parentMenuId": 2,
+                                           "url": "http://coffee.com"
+                                         },
+                                         {
+                                           "menuId": 92,
+                                           "column": 2,
+                                           "text": "Andy and his Astrophotgraphy",
+                                           "parentMenuId": 3,
+                                           "url": "http://nightskypix.com"
+                                         },
+                                         {
+                                           "menuId": 93,
+                                           "column": 1,
+                                           "text": "JSONLint",
+                                           "parentMenuId": 4,
+                                           "url": "http://http://jsonlint.com"
+                                         },
+                                         {
+                                           "menuId": 94,
+                                           "column": 2,
+                                           "text": "HROneStop",
+                                           "parentMenuId": 4,
+                                           "url": "http://ebiz.sbc.com/hronestop"
+                                         },
+
+                                         {
+                                           "menuId": 96,
+                                           "column": 3,
+                                           "text": "3rd Level App1c R200",
+                                           "parentMenuId": 4,
+                                           "url": "http://app1c.com"
+                                         },
+                                         {
+                                           "menuId": 97,
+                                           "column": 1,
+                                           "text": "3rd Level App4b R16",
+                                           "parentMenuId": 5,
+                                           "url": "http://app4b.com"
+                                         },
+                                         {
+                                           "menuId": 98,
+                                           "column": 2,
+                                           "text": "3rd Level App2b R16",
+                                           "parentMenuId": 5,
+                                           "url": "http://app2b.com"
+                                         },
+                                         {
+                                           "menuId": 99,
+                                           "column": 1,
+                                           "text": "Favorites",
+                                           "parentMenuId": null,
+                                           "url": ""
+                                         }
+                                       ];
+                       $scope.jsonMenuData = unflatten( $scope.jsonMenuData );
+                       $scope.megaMenuDataObject = menuStructureConvert($scope.jsonMenuData);
+//                     $log.debug(JSON.stringify($scope.jsonMenuData));
+       }
+               var childItemList="";
+               var parentList = "";
+               try{
+                       childItemList = ${menu.childItemList};
+                       parentList = ${menu.parentList};
+               }catch(err){
+                       console.log("ebz_header: failed to get child/parent lists", err);
+               }
+
+               var pageUrl = window.location.href.split('/')[window.location.href.split('/').length-1];
+
+               $scope.menuItems = [];
+               for (var i = 0; i < parentList.length; i++) {
+                       $scope.openCurrentMenu = false;
+                if(pageUrl==parentList[i].action)
+                               $scope.openCurrentMenu = true;
+                       $scope.childItemList = childItemList[i];
+                       for(chIndex in  $scope.childItemList){
+                               if($scope.childItemList.length>0)
+                                       if($scope.childItemList[chIndex].action!=null){
+                                               if($scope.childItemList[chIndex].action==pageUrl)
+                                                       $scope.openCurrentMenu = true;
+                                       }
+                       }
+                       $scope.item = {
+                               parentLabel : parentList[i].label,
+                               parentAction : parentList[i].action,
+                               parentImageSrc : parentList[i].imageSrc,
+                               open:$scope.openCurrentMenu,
+                               childItemList : $scope.childItemList
+                       }
+                       $scope.menuItems.push($scope.item);
+               }
+               $scope.arrowShow = true;
+               $scope.drawerOpen = false;
+               $scope.subMenuContent = false;
+               $scope.toggleSubMenu = function() {
+                       $scope.subMenuContent = !$scope.subMenuContent;
+               };
+
+               var drawerOpen = 'open';
+               if (drawerOpen == 'open') {
+                       $scope.drawerOpen = true;
+                       $scope.arrowShow = true;
+               } else {
+                       $scope.arrowShow = false;
+               }
+               $scope.arrowShow = true;
+               $scope.drawerOpen = false;
+               $scope.toggleDrawer = function() {
+                       $scope.drawerOpen = !($scope.drawerOpen);
+                       if ($scope.drawerOpen) {
+                               $scope.arrowShow = true;
+                               if (document.getElementById('mContent')!=null)
+                                       document.getElementById('mContent').style.marginLeft = "0px";
+                       } else {
+                               $scope.arrowShow = false;
+                               if (document.getElementById('mContent')!=null)
+                                       document.getElementById('mContent').style.marginLeft = "-150px";
+                       }
+               };
+               //var drawerOpen = getCookie('drawerOpen');
+               if (drawerOpen == 'open') {
+                       $scope.drawerOpen = true;
+                       $scope.arrowShow = true;
+               } else {
+                       $scope.arrowShow = false;
+               }
+               $timeout(function() {
+                       detectScrollEvent();
+               }, 800);
+
+       });
+
+       app.filter("ellipsis", function(){
+           return function(text, length){
+               if (text) {
+                   var ellipsis = text.length > length ? "..." : "";
+                   return text.slice(0, length) + ellipsis;
+               };
+               return text;
+           }
+       });
+</script>
\ No newline at end of file
diff --git a/ui/src/main/webapp/WEB-INF/fusion/orm/Analytics.hbm.xml b/ui/src/main/webapp/WEB-INF/fusion/orm/Analytics.hbm.xml
new file mode 100644 (file)
index 0000000..95d1468
--- /dev/null
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<!-- ============LICENSE_START==========================================
+    ONAP Portal SDK ===================================================================
+    Copyright © 2017 AT&T Intellectual Property. All rights reserved. ===================================================================
+    Unless otherwise specified, all software contained herein is licensed under
+    the Apache License, Version 2.0 (the “License”); you may not use this software
+    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. Unless otherwise specified, all documentation
+    contained herein is licensed under the Creative Commons License, Attribution
+    4.0 Intl. (the “License”); you may not use this documentation except in compliance
+    with the License. You may obtain a copy of the License at https://creativecommons.org/licenses/by/4.0/
+    Unless required by applicable law or agreed to in writing, documentation
+    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============================================ -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping
+    package="org.onap.portalsdk.analytics.model.base">
+
+    <class name="ReportUserRole" table="cr_report_access">
+        <composite-id>
+            <key-property name="repId" column="rep_id" />
+            <key-property name="orderNo" column="order_no" />
+        </composite-id>
+
+        <property name="roleId" column="role_id" />
+        <property name="userId" column="user_id" />
+        <property name="readOnlyYn" column="read_only_yn" />
+    </class>
+
+    <query name="getReportSecurityUsers">
+        select repId, orderNo, roleId, userId, readOnlyYn from ReportUserRole where
+        repId = :report_id and userId is not null
+    </query>
+
+    <query name="getReportSecurityRoles">
+        select repId, orderNo, roleId, userId, readOnlyYn from ReportUserRole where
+        repId = :report_id and roleId is not null
+    </query>
+
+    <query name="deleteReportSecurityUsers">
+        delete from ReportUserRole where repId = :report_id and userId =:user_id
+    </query>
+
+    <query name="deleteReportSecurityRoles">
+        delete from ReportUserRole where repId = :report_id and roleId =:role_id
+    </query>
+</hibernate-mapping>
diff --git a/ui/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml b/ui/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml
new file mode 100644 (file)
index 0000000..6966eec
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!-- ============LICENSE_START==========================================
+    ONAP Portal SDK ===================================================================
+    Copyright © 2017 AT&T Intellectual Property. All rights reserved. ===================================================================
+    Unless otherwise specified, all software contained herein is licensed under
+    the Apache License, Version 2.0 (the “License”); you may not use this software
+    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. Unless otherwise specified, all documentation
+    contained herein is licensed under the Creative Commons License, Attribution
+    4.0 Intl. (the “License”); you may not use this documentation except in compliance
+    with the License. You may obtain a copy of the License at https://creativecommons.org/licenses/by/4.0/
+    Unless required by applicable law or agreed to in writing, documentation
+    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============================================ -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping
+    package="org.onap.portalsdk.rnotebookintegration.domain">
+
+
+    <!-- RNotebookIntegration mapping details -->
+    <class name="RNoteBookCredentials" table="rcloudinvocation">
+        <id name="token" column="ID">
+
+        </id>
+        <property name="createdDate" column="created" />
+        <property name="userString" column="userInfo" />
+        <property name="notebookID" column="notebookID" />
+        <property name="parametersString" column="parameters" />
+        <property name="tokenReadDate" column="tokenreaddate" />
+
+    </class>
+
+
+
+</hibernate-mapping>
diff --git a/ui/src/main/webapp/WEB-INF/index.jsp b/ui/src/main/webapp/WEB-INF/index.jsp
new file mode 100644 (file)
index 0000000..8f71b2a
--- /dev/null
@@ -0,0 +1,40 @@
+<%--
+============LICENSE_START==========================================
+   3   ONAP Portal SDK
+   4   ===================================================================
+   5   Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+   6   ===================================================================
+   7
+   8   Unless otherwise specified, all software contained herein is licensed
+   9   under the Apache License, Version 2.0 (the ?License?);
+  10   you may not use this software except in compliance with the License.
+  11   You may obtain a copy of the License at
+  12
+  13               http://www.apache.org/licenses/LICENSE-2.0
+  14
+  15   Unless required by applicable law or agreed to in writing, software
+  16   distributed under the License is distributed on an "AS IS" BASIS,
+  17   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  18   See the License for the specific language governing permissions and
+  19   limitations under the License.
+  20
+  21   Unless otherwise specified, all documentation contained herein is licensed
+  22   under the Creative Commons License, Attribution 4.0 Intl. (the ?License?);
+  23   you may not use this documentation except in compliance with the License.
+  24   You may obtain a copy of the License at
+  25
+  26               https://creativecommons.org/licenses/by/4.0/
+  27
+  28   Unless required by applicable law or agreed to in writing, documentation
+  29   distributed under the License is distributed on an "AS IS" BASIS,
+  30   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  31   See the License for the specific language governing permissions and
+  32   limitations under the License.
+  33
+  34   ============LICENSE_END============================================.
+--%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
+<%-- Redirected because we can't set the welcome page to a virtual URL. --%>
+<%-- Forward to the intended start page to reduce frustration for new users. --%>
+<c:redirect url="/login.htm"></c:redirect>
diff --git a/ui/src/main/webapp/WEB-INF/jsp/login.jsp b/ui/src/main/webapp/WEB-INF/jsp/login.jsp
new file mode 100644 (file)
index 0000000..c5b43e0
--- /dev/null
@@ -0,0 +1,114 @@
+<%--
+Copyright (c) 2019 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.
+--%>
+<%@ page import="org.onap.portalsdk.core.util.SystemProperties"%>
+<!DOCTYPE html>
+<%
+       // Name is defined by app; do not throw if missing
+       final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME)
+                       ? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)
+                       : SystemProperties.APP_DISPLAY_NAME;
+%>
+
+<html>
+       <head>
+               <meta charset="utf-8">
+               <meta http-equiv="X-UA-Compatible" content="IE=edge">
+               <meta name="viewport" content="width=device-width, initial-scale=1">
+               <title>Login</title>
+               <style>
+               html {
+                       font-family: Verdana, Arial, Helvetica, sans-serif;
+               }
+               body {
+                       padding-top: 15px;
+               }
+               .logo {
+                       position: fixed;
+                       left: 15px;
+                       top: 15px;
+                       z-index: -1;
+               }
+               .loginError {
+                       font-size: 18px;
+                       color: red;
+                       text-align: center;
+               }
+               .login {
+                       font-size: 16px;
+                       display: block;
+                       margin-left: auto;
+                       margin-right: auto;
+                       text-align: center;
+                       width: 100%;
+               }
+               .login input[type=submit] {
+                       font-size: 16px;
+               }
+               .terms {
+                       font-size: 10px;
+                       text-align: center;
+                       margin-left: auto;
+                       margin-right: auto;
+               }
+               .terms a {
+                       font-size: 10px;
+                       text-align: center;
+                       margin-left: auto;
+                       margin-right: auto;
+               }
+               </style>
+       </head>
+       <body>
+               <div class="login">
+                       <img src="static/fusion/images/logo_akraino_edge_stack.png" alt="Akraino" width="400&quot;" height="114" border="0" />
+                       <h2>
+                               <%=appDisplayName%>
+                       </h2>
+                       <br />
+                       <form action="do_login_external" method="POST">
+                               <label for="loginId">Login ID:</label>
+                               <input id="loginId" name="loginId" type="text" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" maxlength="30">
+                               <br/>
+                               <br/>
+                               <label for="password">Password:</label>
+                               <input id="password" name="password" type="password" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;"
+                                                       maxlength="30" >
+                               <br />
+                               <br />
+                               <input id="loginBtn" type="submit" alt="Login" value="Login">
+                       </form>
+               </div>
+               <br />
+               <br />
+               <div class="loginError">${model.error}</div>
+               <br />
+               <br />
+               <br />
+               <br />
+               <br />
+               <br />
+               <div id="footer">
+                       <div class="terms">
+                       Copyright <script>new Date().getFullYear()>2017&&document.write(new Date().getFullYear());</script>
+                               Akraino Edge Stack and Linux Foundation.
+                       </div>
+                       <p>
+                       <div class="terms">
+
+                       </div>
+               </div>
+       </body>
+</html>
diff --git a/ui/src/main/webapp/WEB-INF/jsp/login_external.jsp b/ui/src/main/webapp/WEB-INF/jsp/login_external.jsp
new file mode 100644 (file)
index 0000000..9d389d0
--- /dev/null
@@ -0,0 +1,114 @@
+<%--
+Copyright (c) 2019 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.
+--%>
+<%@ page import="org.onap.portalsdk.core.util.SystemProperties"%>
+<!DOCTYPE html>
+<%
+       // Name is defined by app; do not throw if missing
+       final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME)
+                       ? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)
+                       : SystemProperties.APP_DISPLAY_NAME;
+%>
+
+<html>
+       <head>
+               <meta charset="utf-8">
+               <meta http-equiv="X-UA-Compatible" content="IE=edge">
+               <meta name="viewport" content="width=device-width, initial-scale=1">
+               <style>
+               html {
+                       font-family: Verdana, Arial, Helvetica, sans-serif;
+               }
+               body {
+                       padding-top: 15px;
+               }
+               .logo {
+                       position: fixed;
+                       left: 15px;
+                       top: 15px;
+                       z-index: -1;
+               }
+               .loginError {
+                       font-size: 18px;
+                       color: red;
+                       text-align: center;
+               }
+               .login {
+                       font-size: 16px;
+                       display: block;
+                       margin-left: auto;
+                       margin-right: auto;
+                       text-align: center;
+                       width: 100%;
+               }
+               .login input[type=submit] {
+                       font-size: 16px;
+               }
+               .terms {
+                       font-size: 10px;
+                       text-align: center;
+                       margin-left: auto;
+                       margin-right: auto;
+               }
+               .terms a {
+                       font-size: 10px;
+                       text-align: center;
+                       margin-left: auto;
+                       margin-right: auto;
+               }
+               </style>
+       </head>
+       <body>
+
+               <div class="login">
+                       <img src="static/fusion/images/logo_akraino_edge_stack.png" alt="Akraino" width="400&quot;" height="114" border="0"/>
+                       <h2>
+                               <%=appDisplayName%>
+                       </h2>
+                       <br />
+                       <form action="login_external" method="POST">
+                               <label for="loginId">Login ID:</label>
+                               <input id="loginId" name="loginId" type="text" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" maxlength="30">
+                               <br/>
+                               <br/>
+                               <label for="password">Password:</label>
+                               <input id="password" name="password" type="password" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;"
+                                                       maxlength="30" >
+                               <br />
+                               <br />
+                               <input id="loginBtn" type="submit" alt="Login" value="Login">
+                       </form>
+               </div>
+               <br />
+               <br />
+               <div class="loginError">${model.error}</div>
+               <br />
+               <br />
+               <br />
+               <br />
+               <br />
+               <br />
+               <div id="footer">
+                       <div class="terms">
+                       Copyright <script>new Date().getFullYear()>2017&&document.write(new Date().getFullYear());</script>
+                               Akraino Edge Stack and Linux Foundation.
+                       </div>
+                       <p>
+                       <div class="terms">
+
+                       </div>
+               </div>
+       </body>
+</html>
old mode 100755 (executable)
new mode 100644 (file)
index 0ef6de8..92a2d59
@@ -1,25 +1,48 @@
-<!--
-Copyright (c) 2019 AT&T Intellectual Property. All rights reserved.
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (c) 2019 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. -->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee"
+    xmlns:web="http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+    version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
 
-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
+    <display-name>AECBlueprintValidationUI</display-name>
 
-       http://www.apache.org/licenses/LICENSE-2.0
+    <!-- The app can function on a HA cluster -->
+    <distributable />
 
-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.
--->
+    <session-config>
+        <session-timeout>30</session-timeout>
+        <tracking-mode>COOKIE</tracking-mode>
+    </session-config>
+    <filter>
+        <filter-name>SecurityXssFilter</filter-name>
+        <filter-class>org.akraino.validation.ui.filter.SecurityXssFilter
+        </filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>SecurityXssFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    <filter>
+        <filter-name>springSessionRepositoryFilter</filter-name>
+        <filter-class>org.onap.portalapp.music.filter.MusicSessionRepositoryFilter
+        </filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>springSessionRepositoryFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+        <dispatcher>REQUEST</dispatcher>
+        <dispatcher>ERROR</dispatcher>
+    </filter-mapping>
+    <error-page>
+        <location>/WEB-INF/jsp/error.jsp</location>
+    </error-page>
 
-<!DOCTYPE web-app PUBLIC
- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd" >
-
-<web-app>
-  <display-name>Archetype Created Web Application</display-name>
-
-
-</web-app>
+</web-app>
\ No newline at end of file
@@ -14,6 +14,6 @@
  * limitations under the License.
  */
 
-var config_module = angular.module('App.config', []);
+var config_module = angular.module('App.Config', []);
 config_module.constant('appContext', '/AECBlueprintValidationUI');
 config_module.constant('refreshPeriod', '5000'); // in msecs
  * limitations under the License.
  */
 
-var AECBlueprintValidationUIApp = angular
-        .module('BlueprintValidationUIManagement');
+var services = angular.module('App.Services', [ 'App.Config' ]);
 
-AECBlueprintValidationUIApp.factory('restAPISvc', [
+services.factory('restAPISvc', [
         '$http',
         'appContext',
         function($http, appContext) {
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissions.js b/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissions.js
new file mode 100644 (file)
index 0000000..9730d6c
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+var appDS2 = angular.module("AECCommittedSubmissions", [ 'ngRoute',
+        'ngMessages', 'modalServices', 'ngCookies', 'b2b.att', 'gridster',
+        'ui.bootstrap', 'ui.bootstrap.modal', 'App.Config', 'App.Services' ]);
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissionsController.js b/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissionsController.js
new file mode 100644 (file)
index 0000000..538793e
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+var app = angular.module('AECCommittedSubmissions');
+
+app.controller('AECCommittedSubmissionsController', function($scope,
+        restAPISvc, $interval, refreshPeriod) {
+
+    $scope.submissionIdList = [];
+
+    restAPISvc.getRestAPI("/api/submission/", function(data) {
+        $scope.submissions = data;
+    });
+
+    $scope.refreshCommittedSubmissions = function() {
+        restAPISvc.getRestAPI("/api/submission/", function(data) {
+            $scope.submissions = data;
+        });
+    }
+
+    $scope.modifySubmissionIdList = function(id) {
+        if ($scope.submissionIdList.indexOf(id) === -1) {
+            $scope.submissionIdList.push(id);
+        } else {
+            $scope.submissionIdList.splice($scope.submissionIdList.indexOf(id),
+                    1);
+        }
+    }
+
+    $scope.deleteSubmissions = function() {
+        var confirmation = confirm("Are you sure?");
+        if (confirmation == true) {
+            angular.forEach($scope.submissionIdList, function(id) {
+                var submission = {
+                    "submissionId" : id
+                };
+                restAPISvc.deleteRestAPI("/api/submission/", submission);
+            });
+        }
+    }
+
+    $interval(function() {
+        $scope.refreshCommittedSubmissions();
+    }, refreshPeriod);
+
+});
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissions.html b/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissions.html
new file mode 100644 (file)
index 0000000..8886182
--- /dev/null
@@ -0,0 +1,178 @@
+<!--
+Copyright (c) 2019 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.
+-->
+
+<!DOCTYPE html>
+<!-- Single-page application for EPSDK-App using DS2 look and feel. -->
+<html>
+<head>
+<meta charset="ISO-8859-1">
+<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
+
+<title>Committed Submissions</title>
+
+<!-- B2b Library -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/b2b/css/b2b-angular/b2b-angular.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/b2b/css/b2b-angular/font_icons.css">
+
+<!-- icons in open source -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ionicons.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css">
+
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/angular-bootstrap/ui-bootstrap-csp.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/angular-gridster/dist/angular-gridster.min.css">
+<link rel="stylesheet" type="text/css"
+ href="static/fusion/sample/css/scribble.css" />
+<link rel="stylesheet" type="text/css"
+ href="static/fusion/sample/css/welcome.css" />
+
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/styles/ecomp.css">
+
+<!-- Common scripts -->
+<script src="app/fusion/external/angular-1.4.8/angular.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-messages.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-touch.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-sanitize.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-route.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-cookies.min.js"></script>
+<script src="app/fusion/external/jquery/dist/jquery.min.js"></script>
+<script
+ src="app/fusion/external/javascript-detect-element-resize/jquery.resize.js"></script>
+<script
+ src="app/fusion/external/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>
+<script
+ src="app/fusion/external/angular-gridster/dist/angular-gridster.min.js"></script>
+
+<!-- EPSDK App scripts and common services -->
+<!-- B2b Library -->
+<script src="app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js"></script>
+<script src="app/fusion/scripts/DS2-services/ds2-modal/modalService.js"></script>
+<script src="app/AECBlueprintValidationUI/App.Config.js"></script>
+<script src="app/AECBlueprintValidationUI/App.Services.js"></script>
+<script
+ src="app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissions.js"></script>
+
+<script src="app/fusion/scripts/DS2-services/userInfoServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/headerServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/leftMenuServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/manifestService.js"></script>
+
+<script src="app/fusion/scripts/DS2-directives/footer.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2Header.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2LeftMenu.js"></script>
+<script src="app/fusion/scripts/DS2-directives/b2b-leftnav-ext.js"></script>
+<script src="app/fusion/scripts/DS2-services/userInfoServiceDS2.js"></script>
+
+<!-- Page specific items -->
+<script
+ src="app/AECBlueprintValidationUI/CommittedSubmissions/AECCommittedSubmissionsController.js"></script>
+<script src="app/AECBlueprintValidationUI/CommittedSubmissions/Route.js"></script>
+
+<style>
+.controls {
+       margin-bottom: 20px;
+}
+
+.page-header {
+       margin-top: 20px;
+}
+
+ul {
+       list-style: none;
+}
+
+.box {
+       height: 100%;
+       border: 1px solid #ccc;
+       background-color: #fff;
+       position: relative;
+       overflow: hidden;
+}
+
+.box-header {
+       background-color: #eee;
+       padding: 0px 0px 0px 0px;
+       margin-bottom: -25px;
+       cursor: move;
+       position: relative;
+}
+
+.box-header h3 {
+       margin-top: 0px;
+       display: inline-block;
+}
+
+.box-content {
+       padding: 10px;
+       display: block;
+       height: 100%;
+       position: relative;
+       overflow-x: auto;
+       overflow-y: auto;
+}
+
+.box-header-btns {
+       top: 15px;
+       right: 10px;
+       cursor: pointer;
+       position: absolute;
+}
+
+.gridster {
+       border: none;
+       position: relative;
+}
+
+.box-content .box-content-frame {
+
+}
+
+.box table {
+       border: none;
+       display: block;
+}
+
+.box table tr {
+       line-height: 20px;
+}
+
+.box table th {
+       border: none;
+       line-height: 20px;
+}
+
+.menu-container {
+       margin-top: 0px
+}
+
+.handle-e {
+       width: 3px;
+}
+</style>
+</head>
+<body class="appBody" ng-app="AECCommittedSubmissions">
+ <div ds2-Header class="header-container"></div>
+ <div ds2-menu id="menuContainer" class="menu-container"></div>
+ <div ng-view id="rightContentProfile" class="content-container"></div>
+ <div ds2-Footer class="footer-container"></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissionsTemplate.html b/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissionsTemplate.html
new file mode 100644 (file)
index 0000000..784810b
--- /dev/null
@@ -0,0 +1,305 @@
+<!--
+Copyright (c) 2019 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.
+-->
+<div id="page-content" class="content" style="padding: 25px;">
+
+ <style>
+.grid {
+    width: 100%;
+    height: 400px;
+}
+
+.grid .ui-grid-header-cell {
+    text-align: center;
+}
+
+.icon-add-widget:before {
+    content: "\e717";
+}
+
+.ui-grid-icon-angle-down {
+    margin-top: 5px;
+}
+
+body {
+    font-size: 13px;
+}
+</style>
+
+ <h1 class="heading-page">Committed Submissions</h1>
+
+ <br>
+
+ <div>
+  <label style="float: left; margin-top: 10px; margin-right: 10px;">Submission
+   Id:</label>
+  <div class="form-field form-field__glued pull-left size-onefifth"
+   style="float: left; width: 220px; margin-right: 20px;">
+   <input ng-model="submissionId" type="text"
+    placeholder="Search for submission id?"
+    style="margin-top: 5px; width: 220px;">
+  </div>
+
+  <label style="float: left; margin-top: 10px; margin-right: 10px;">Blueprint
+   Name:</label>
+  <div class="form-field form-field__glued pull-left size-onefifth"
+   style="float: left; width: 260px; margin-right: 40px;">
+   <input ng-model="blueprintName" type="text"
+    placeholder="Search for a blueprint name?"
+    style="margin-top: 5px; width: 260px;">
+
+  </div>
+
+  <div style="float: right;">
+   <button style="margin-left: 25px; margin-top: 4px;" type="submit"
+    class="btn btn-alt btn-small"
+    ng-click="refreshCommittedSubmissions();">Refresh</button>
+   <button style="margin-left: 25px; margin-top: 4px;" type="submit"
+    class="btn btn-alt btn-small" ng-click="deleteSubmissions()">Delete
+    selected submissions</button>
+   <button style="margin-left: 25px; margin-top: 4px;" type="submit"
+    class="btn btn-alt btn-small" ng-click="deleteSubmissions()">Delete
+    all submissions</button>
+  </div>
+
+
+  <div ui-i18n="en"
+   class="grid ui-grid ng-isolate-scope grid1560525896761" id="grid1"
+   ui-grid="gridOptions" ui-grid-pagination="">
+   <!-- TODO (c0bra): add "scoped" attr here, eventually? -->
+   <style ui-grid-style="" class="ng-binding">
+.grid1560525896761 {
+    /* Styles for the grid */
+
+}
+
+.grid1560525896761 .ui-grid-row, .grid1560525896761 .ui-grid-cell,
+    .grid1560525896761 .ui-grid-cell .ui-grid-vertical-bar {
+    height: 30px;
+}
+
+.grid1560525896761 .ui-grid-row:last-child .ui-grid-cell {
+    border-bottom-width: 0px;
+}
+
+/*
+    .ui-grid[dir=rtl] .ui-grid-viewport {
+      padding-left: px;
+    }
+    */
+.grid1560525896761 .ui-grid-coluiGrid-000W {
+    min-width: 119px;
+    max-width: 119px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-000X {
+    min-width: 119px;
+    max-width: 119px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-000Y {
+    min-width: 119px;
+    max-width: 119px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-000Z {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0010 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0011 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0012 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0013 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0014 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-render-container-body .ui-grid-canvas {
+    width: 1065px;
+    height: 0px;
+}
+
+.grid1560525896761 .ui-grid-render-container-body .ui-grid-header-canvas
+    {
+    width: 1080px;
+}
+
+.grid1560525896761 .ui-grid-render-container-body .ui-grid-header-canvas
+    {
+    height: inherit;
+}
+
+.grid1560525896761 .ui-grid-render-container-body .ui-grid-viewport {
+    width: 1080px;
+    height: 338px;
+}
+
+.grid1560525896761 .ui-grid-render-container-body .ui-grid-header-viewport
+    {
+    width: 1080px;
+}
+
+.grid1560525896761 .ui-grid-render-container-body .ui-grid-footer-canvas
+    {
+    width: 1080px;
+}
+
+.grid1560525896761 .ui-grid-render-container-body .ui-grid-footer-viewport
+    {
+    width: 1080px;
+}
+
+.grid1560525896761 .ui-grid-footer-aggregates-row {
+    height: 30px;
+}
+
+.grid1560525896761 .ui-grid-footer-info {
+    height: 30px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-000W {
+    min-width: 119px;
+    max-width: 119px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-000X {
+    min-width: 119px;
+    max-width: 119px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-000Y {
+    min-width: 119px;
+    max-width: 119px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-000Z {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0010 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0011 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0012 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0013 {
+    min-width: 118px;
+    max-width: 118px;
+}
+
+.grid1560525896761 .ui-grid-coluiGrid-0014 {
+    min-width: 118px;
+    max-width: 118px;
+}
+</style>
+   <div class="ui-grid-contents-wrapper">
+    <table cellspacing="0" cellpadding="10" class="siteStatusTable">
+     <thead>
+      <tr>
+       <th>&nbsp;</th>
+       <th>Id&nbsp;</th>
+       <th>Status&nbsp;</th>
+       <th>Blueprint&nbsp;</th>
+       <th>Version</th>
+       <th>Layer&nbsp;</th>
+       <th>Desired Timeslot&nbsp;</th>
+       <th>Url of result&nbsp;</th>
+      </tr>
+     </thead>
+     <tbody>
+      <tr class="border_bottom" ng-repeat="submission in submissions">
+       <td><label class="checkbox"> <input type="checkbox"
+         name="name1" ng-model="temp"
+         ng-change="modifySubmissionIdList(submission.submissionId)"
+         class="ng-valid ng-dirty ng-valid-parse ng-touched"><i
+         class="skin"></i><span>&nbsp;</span></label></td>
+       <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+        submission.submissionId }}</td>
+       <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+        submission.submissionStatus }}</td>
+       <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+        submission.blueprintInstanceForValidation.blueprint.blueprintName
+        }}</td>
+       <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+        submission.blueprintInstanceForValidation.version }}</td>
+       <td style="padding-left: 10px; font-size: 15px; width: 13%;"><a
+        href="#" data-toggle="tooltip"
+        title="{{submission.blueprintInstanceForValidation.layerDescription}}">{{
+         submission.blueprintInstanceForValidation.layer }}</a></td>
+       <td style="padding-left: 10px; font-size: 15px; width: 13%;">Lab:
+        {{ submission.timeslot.lab.lab }} Start date and time: {{
+        submission.timeslot.startDateTime }} <!-- duration(in sec) :
+        {{submission.timeslot.duration}}-->
+       </td>
+       <td style="padding-left: 10px; font-size: 15px; width: 13%;"><a
+        href="{{submission.nexusResultUrl }}">{{
+         submission.nexusResultUrl }}</a></td>
+      </tr>
+     </tbody>
+    </table>
+
+    <div class="well" style="padding-bottom: 35px;">
+     <div class="row ddh-page short">
+      <div class="b2b-pager ng-isolate-scope" b2b-pagination=""
+       total-pages="totalPages1" current-page="currentPage1"
+       click-handler="customHandler1" role="navigation"
+       aria-label="Customer Data Pages">
+       <div ng-if="notMobile &amp;&amp; totalPages > 1" class="ng-scope">
+
+       </div>
+      </div>
+     </div>
+
+    </div>
+
+   </div>
+  </div>
+ </div>
+
+ <script>
+ $(document).ready(function(){
+  $('[data-toggle="tooltip"]').tooltip();
+ });
+ </script>
+
+</div>
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/Route.js b/ui/src/main/webapp/app/AECBlueprintValidationUI/CommittedSubmissions/Route.js
new file mode 100644 (file)
index 0000000..48a9a5a
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+appDS2
+        .config(function($routeProvider) {
+            $routeProvider
+                    .otherwise({
+                        templateUrl : 'app/AECBlueprintValidationUI/CommittedSubmissions/CommittedSubmissionsTemplate.html',
+                        controller : "AECCommittedSubmissionsController"
+                    });
+        });
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionId.js b/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionId.js
new file mode 100644 (file)
index 0000000..e4d0b89
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+var appDS2 = angular.module("AECGetBySubmissionId", [ 'ngRoute', 'ngMessages',
+        'modalServices', 'ngCookies', 'b2b.att', 'gridster', 'ui.bootstrap',
+        'ui.bootstrap.modal', 'App.Services' ]);
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionIdController.js b/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionIdController.js
new file mode 100644 (file)
index 0000000..d53bcc7
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+var app = angular.module('AECGetBySubmissionId');
+app
+        .controller(
+                'AECGetBySubmissionIdController',
+                function($scope, restAPISvc) {
+
+                    initialize();
+
+                    function initialize() {
+                        $scope.results = [];
+                        $scope.resultsLayers = [];
+                        $scope.resultsLayerTestSuitesNames = [];
+                        $scope.selectedRobotTestResult = [];
+                        restAPISvc
+                                .getRestAPI(
+                                        "/api/submission/",
+                                        function(data) {
+                                            $scope.submissions = data;
+                                            $scope.submissionsForDisplay = [];
+                                            angular
+                                                    .forEach(
+                                                            $scope.submissions,
+                                                            function(
+                                                                    submissionData) {
+                                                                var temp = "id: "
+                                                                        + submissionData.submissionId
+                                                                        + " blueprint: "
+                                                                        + submissionData.blueprintInstanceForValidation.blueprint.blueprintName
+                                                                        + " version: "
+                                                                        + submissionData.blueprintInstanceForValidation.version
+                                                                        + " layer: "
+                                                                        + submissionData.blueprintInstanceForValidation.layer
+                                                                        + " lab: "
+                                                                        + submissionData.timeslot.lab.lab
+                                                                        + " Start date and time: "
+                                                                        + submissionData.timeslot.startDateTime
+                                                                /*
+                                                                 * + " duration: " +
+                                                                 * submissionData.blueprintInstanceForValidation.timeslot.duration
+                                                                 */;
+                                                                $scope.submissionsForDisplay
+                                                                        .push(temp);
+                                                            });
+                                        });
+                    }
+                    $scope.selectedSubmissionChange = function(
+                            selectedSubmission) {
+                        $scope.results = [];
+                        $scope.resultsLayers = [];
+                        $scope.resultsLayerTestSuitesNames = [];
+                        $scope.selectedRobotTestResult = [];
+                        var id = selectedSubmission.substring(
+                                selectedSubmission.indexOf("id:") + 4,
+                                selectedSubmission.indexOf("blueprint") - 1);
+                        restAPISvc
+                                .getRestAPI(
+                                        "/api/results/getBySubmissionId/" + id,
+                                        function(data) {
+                                            if (data !== undefined) {
+                                                $scope.results = data;
+                                                angular
+                                                        .forEach(
+                                                                $scope.results,
+                                                                function(result) {
+                                                                    $scope.resultsLayers
+                                                                            .push(result.blueprintLayer);
+                                                                });
+                                            } else {
+                                                confirm("Error when committing the submission");
+                                            }
+                                        });
+                    }
+
+                    $scope.selectedResultsLayerChange = function(selectedLayer) {
+                        $scope.resultsLayerTestSuitesNames = [];
+                        $scope.robotTestResults = [];
+                        $scope.selectedRobotTestResult = [];
+                        var selectedLayerResult = [];
+                        angular.forEach($scope.results, function(result) {
+                            if (result.blueprintLayer === selectedLayer) {
+                                selectedLayerResult = result;
+                            }
+                        });
+                        $scope.robotTestResults = selectedLayerResult.robotTestResults;
+                        angular.forEach($scope.robotTestResults, function(
+                                robotTestResult) {
+                            $scope.resultsLayerTestSuitesNames
+                                    .push(robotTestResult.name);
+                        });
+                    }
+
+                    $scope.selectedTestSuitesNameChange = function(
+                            selectedTestSuiteName) {
+                        angular
+                                .forEach(
+                                        $scope.robotTestResults,
+                                        function(robotTestResult) {
+                                            if (robotTestResult.name.trim() === selectedTestSuiteName
+                                                    .trim()) {
+                                                $scope.selectedRobotTestResult = robotTestResult;
+                                            }
+                                        });
+                    }
+
+                });
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionId.html b/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionId.html
new file mode 100644 (file)
index 0000000..437c42f
--- /dev/null
@@ -0,0 +1,178 @@
+<!--
+Copyright (c) 2019 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.
+-->
+
+<!DOCTYPE html>
+<!-- Single-page application for EPSDK-App using DS2 look and feel. -->
+<html>
+<head>
+<meta charset="ISO-8859-1">
+<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
+
+<title>Get By Submission Id</title>
+
+<!-- B2b Library -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/b2b/css/b2b-angular/b2b-angular.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/b2b/css/b2b-angular/font_icons.css">
+
+<!-- icons in open source -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ionicons.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css">
+
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/angular-bootstrap/ui-bootstrap-csp.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/angular-gridster/dist/angular-gridster.min.css">
+<link rel="stylesheet" type="text/css"
+ href="static/fusion/sample/css/scribble.css" />
+<link rel="stylesheet" type="text/css"
+ href="static/fusion/sample/css/welcome.css" />
+
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/styles/ecomp.css">
+
+<!-- Common scripts -->
+<script src="app/fusion/external/angular-1.4.8/angular.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-messages.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-touch.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-sanitize.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-route.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-cookies.min.js"></script>
+<script src="app/fusion/external/jquery/dist/jquery.min.js"></script>
+<script
+ src="app/fusion/external/javascript-detect-element-resize/jquery.resize.js"></script>
+<script
+ src="app/fusion/external/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>
+<script
+ src="app/fusion/external/angular-gridster/dist/angular-gridster.min.js"></script>
+
+<!-- EPSDK App scripts and common services -->
+<!-- B2b Library -->
+<script src="app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js"></script>
+<script src="app/fusion/scripts/DS2-services/ds2-modal/modalService.js"></script>
+<script src="app/AECBlueprintValidationUI/App.Config.js"></script>
+<script src="app/AECBlueprintValidationUI/App.Services.js"></script>
+<script
+ src="app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionId.js"></script>
+
+<script src="app/fusion/scripts/DS2-services/userInfoServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/headerServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/leftMenuServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/manifestService.js"></script>
+
+<script src="app/fusion/scripts/DS2-directives/footer.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2Header.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2LeftMenu.js"></script>
+<script src="app/fusion/scripts/DS2-directives/b2b-leftnav-ext.js"></script>
+<script src="app/fusion/scripts/DS2-services/userInfoServiceDS2.js"></script>
+
+<!-- Page specific items -->
+<script
+ src="app/AECBlueprintValidationUI/GetBySubmissionId/AECGetBySubmissionIdController.js"></script>
+<script src="app/AECBlueprintValidationUI/GetBySubmissionId/Route.js"></script>
+
+<style>
+.controls {
+       margin-bottom: 20px;
+}
+
+.page-header {
+       margin-top: 20px;
+}
+
+ul {
+       list-style: none;
+}
+
+.box {
+       height: 100%;
+       border: 1px solid #ccc;
+       background-color: #fff;
+       position: relative;
+       overflow: hidden;
+}
+
+.box-header {
+       background-color: #eee;
+       padding: 0px 0px 0px 0px;
+       margin-bottom: -25px;
+       cursor: move;
+       position: relative;
+}
+
+.box-header h3 {
+       margin-top: 0px;
+       display: inline-block;
+}
+
+.box-content {
+       padding: 10px;
+       display: block;
+       height: 100%;
+       position: relative;
+       overflow-x: auto;
+       overflow-y: auto;
+}
+
+.box-header-btns {
+       top: 15px;
+       right: 10px;
+       cursor: pointer;
+       position: absolute;
+}
+
+.gridster {
+       border: none;
+       position: relative;
+}
+
+.box-content .box-content-frame {
+
+}
+
+.box table {
+       border: none;
+       display: block;
+}
+
+.box table tr {
+       line-height: 20px;
+}
+
+.box table th {
+       border: none;
+       line-height: 20px;
+}
+
+.menu-container {
+       margin-top: 0px
+}
+
+.handle-e {
+       width: 3px;
+}
+</style>
+</head>
+<body class="appBody" ng-app="AECGetBySubmissionId">
+ <div ds2-Header class="header-container"></div>
+ <div ds2-menu id="menuContainer" class="menu-container"></div>
+ <div ng-view id="rightContentProfile" class="content-container"></div>
+ <div ds2-Footer class="footer-container"></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionIdTemplate.html b/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionIdTemplate.html
new file mode 100644 (file)
index 0000000..3e86330
--- /dev/null
@@ -0,0 +1,206 @@
+<!--
+Copyright (c) 2019 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.
+-->
+
+<div id="page-content" class="content" style="padding: 25px;">
+ <style>
+.graph, .empty-graph {
+    border: 1px solid #ccc;
+    width: auto;
+    height: 7px;
+    padding: 0;
+    background: #f33;
+}
+
+.pass-bar {
+    background: #1d4;
+}
+
+.pass-bar, .fail-bar {
+    float: left;
+    height: 100%;
+}
+</style>
+
+ <h1 class="heading-page">Get results by submission</h1>
+
+ <h2 class="heading-small">Select Submission:</h2>
+
+ <div>
+  <select ng-model="selectedSubmission"
+   ng-init="selectedSubmission=submissionsForDisplay[0]"
+   ng-change="selectedSubmissionChange(selectedSubmission)"
+   ng-options="n for n in submissionsForDisplay">
+  </select>
+ </div>
+
+ <h2 class="heading-small">Select a blueprint layer of the selected
+  submission:</h2>
+ <div>
+  <select ng-model="selectedLayer" ng-init="resultsLayers[0]"
+   ng-change="selectedResultsLayerChange(selectedLayer)"
+   ng-options="n for n in resultsLayers">
+  </select>
+ </div>
+
+ <h2 class="heading-small">Select a test suite of the selected
+  (submission, layer) pair in order to be displayed:</h2>
+ <div>
+  <select ng-model="selectedTestSuiteName"
+   ng-init="resultsLayerTestSuitesNames[0]"
+   ng-change="selectedTestSuitesNameChange(selectedTestSuiteName)"
+   ng-options="n for n in resultsLayerTestSuitesNames">
+  </select>
+ </div>
+
+
+ <br> <br> <br>
+
+ <div>
+
+  <h2>
+   <u>Test info</u>
+  </h2>
+
+  <p></p>
+  <p>Name: {{selectedRobotTestResult.name}}</p>
+  <p>Generated: {{selectedRobotTestResult.robot.generated}}</p>
+  <p>Generator: {{selectedRobotTestResult.robot.generator}}</p>
+  <p>Errors: {{selectedRobotTestResult.robot.errors}}</p>
+
+  <h2 class="heading-small"></h2>
+  <h3 class="heading-small">
+   <u>Test Statistics</u>
+  </h3>
+  <p></p>
+  <table class="striped" cellspacing="0" cellpadding="10">
+   <caption>
+    <h3></h3>
+   </caption>
+   <thead>
+    <th><p>&nbsp;Total statistics&nbsp;</p></th>
+    <th><p>Total&nbsp;</p></th>
+    <th><p>Pass&nbsp;</p></th>
+    <th><p>Fail&nbsp;</p></th>
+    <th><p>Pass / Fail&nbsp;</p></th>
+    </tr>
+   </thead>
+   <tbody>
+    <tr
+     ng-repeat="stat in selectedRobotTestResult.robot.statistics.total.stat">
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.content }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      (stat.fail * 1) + (stat.pass*1) }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.pass }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.fail}}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">
+      <div class="graph">
+       <div class="pass-bar"
+        ng-style="{ 'width': {{(100* stat.pass/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
+        title="100%"></div>
+       <div class="fail-bar"
+        ng-style="{ 'width': {{(100* stat.fail/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
+        title="0%"></div>
+      </div>
+     </td>
+    </tr>
+   </tbody>
+  </table>
+
+  <br>
+
+  <h3 class="heading-small"></h3>
+  <table class="striped" cellspacing="0" cellpadding="10">
+   <caption>
+    <h3></h3>
+   </caption>
+   <thead>
+    <th><p>&nbsp;Statistics by Tag&nbsp;</p></th>
+    <th><p>Total&nbsp;</p></th>
+    <th><p>Pass&nbsp;</p></th>
+    <th><p>Fail&nbsp;</p></th>
+    <th><p>Pass / Fail&nbsp;</p></th>
+    </tr>
+   </thead>
+   <tbody>
+    <tr
+     ng-repeat="stat in selectedRobotTestResult.robot.statistics.tag.stat">
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.content }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      (stat.fail * 1) + (stat.pass*1) }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.pass }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.fail}}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">
+      <div class="graph">
+       <div class="pass-bar"
+        ng-style="{ 'width': {{(100* stat.pass/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
+        title="100%"></div>
+       <div class="fail-bar"
+        ng-style="{ 'width': {{(100* stat.fail/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
+        title="0%"></div>
+      </div>
+     </td>
+    </tr>
+   </tbody>
+  </table>
+
+  <br>
+
+  <h3 class="heading-small"></h3>
+  <table class="striped" cellspacing="0" cellpadding="10">
+   <caption>
+    <h3></h3>
+   </caption>
+   <thead>
+    <th><p>&nbsp;Statistics by Suite&nbsp;</p></th>
+    <th><p>Total&nbsp;</p></th>
+    <th><p>Pass&nbsp;</p></th>
+    <th><p>Fail&nbsp;</p></th>
+    <th><p>Pass / Fail&nbsp;</p></th>
+    </tr>
+   </thead>
+   <tbody>
+    <tr
+     ng-repeat="stat in selectedRobotTestResult.robot.statistics.suite.stat">
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.content }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      (stat.fail * 1) + (stat.pass*1) }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.pass }}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
+      stat.fail}}</td>
+     <td style="padding-left: 10px; font-size: 15px; width: 13%;">
+      <div class="graph">
+       <div class="pass-bar"
+        ng-style="{ 'width': {{(100* stat.pass/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
+        title="100%"></div>
+       <div class="fail-bar"
+        ng-style="{ 'width': {{(100* stat.fail/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
+        title="0%"></div>
+      </div>
+     </td>
+    </tr>
+   </tbody>
+  </table>
+
+ </div>
+</div>
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/Route.js b/ui/src/main/webapp/app/AECBlueprintValidationUI/GetBySubmissionId/Route.js
new file mode 100644 (file)
index 0000000..58c09fd
--- /dev/null
@@ -0,0 +1,9 @@
+appDS2
+        .config(function($routeProvider) {
+            $routeProvider
+
+                    .otherwise({
+                        templateUrl : 'app/AECBlueprintValidationUI/GetBySubmissionId/GetBySubmissionIdTemplate.html',
+                        controller : "AECGetBySubmissionIdController"
+                    });
+        });
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/AECNewSubmission.js b/ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/AECNewSubmission.js
new file mode 100644 (file)
index 0000000..6d094b3
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2019 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.
+ */
+
+var appDS2 = angular.module("AECNewSubmission", [ 'ngRoute', 'ngMessages',
+        'modalServices', 'ngCookies', 'b2b.att', 'gridster', 'ui.bootstrap',
+        'ui.bootstrap.modal', 'App.Services' ]);
\ No newline at end of file
  * limitations under the License.
  */
 
-var AECBlueprintValidationUIApp = angular
-        .module('BlueprintValidationUIManagement');
-
-AECBlueprintValidationUIApp
+var app = angular.module('AECNewSubmission');
+app
         .controller(
                 'AECNewSubmissionController',
-                function($scope, appContext, restAPISvc) {
+                function($scope, restAPISvc) {
 
                     initialize();
 
                     function initialize() {
                         restAPISvc
                                 .getRestAPI(
-                                        "/api/blueprintInstance/",
+                                        "/api/blueprintInstanceForValidation/",
                                         function(data) {
-                                            $scope.blueprintInstances = data;
+                                            $scope.blueprintInstancesForValidation = data;
                                             $scope.blueprintNames = [];
                                             angular
                                                     .forEach(
-                                                            $scope.blueprintInstances,
+                                                            $scope.blueprintInstancesForValidation,
                                                             function(
                                                                     blueprintInstance) {
                                                                 if ($scope.blueprintNames
@@ -43,14 +41,30 @@ AECBlueprintValidationUIApp
                                                                 }
                                                             });
                                         });
+                        restAPISvc.getRestAPI("/api/timeslots/",
+                                function(data) {
+                                    $scope.timeslots = data;
+                                    $scope.declerativeTimeslots = [];
+                                    angular.forEach($scope.timeslots, function(
+                                            timeslot) {
+                                        var temp = "id: " + timeslot.timeslotId
+                                                + " Start date and time: "
+                                                + timeslot.startDateTime
+                                                /*
+                                                 * + " duration(in sec) :" +
+                                                 * blueprintInstance["timeslot"].duration
+                                                 */
+                                                + " lab :" + timeslot.lab.lab;
+                                        $scope.declerativeTimeslots.push(temp);
+                                    });
+                                });
                     }
                     $scope.selectedBluePrintNameChange = function() {
                         $scope.blueprintVersions = [];
                         $scope.blueprintLayers = [];
-                        $scope.declerativeTimeslots = [];
                         angular
                                 .forEach(
-                                        $scope.blueprintInstances,
+                                        $scope.blueprintInstancesForValidation,
                                         function(blueprintInstance) {
                                             if ($scope.selectedBlueprintName === blueprintInstance["blueprint"]["blueprintName"]) {
                                                 if ($scope.blueprintVersions
@@ -63,10 +77,9 @@ AECBlueprintValidationUIApp
                     }
                     $scope.selectedBluePrintVersionChange = function() {
                         $scope.blueprintLayers = [];
-                        $scope.declerativeTimeslots = [];
                         angular
                                 .forEach(
-                                        $scope.blueprintInstances,
+                                        $scope.blueprintInstancesForValidation,
                                         function(blueprintInstance) {
                                             if ($scope.selectedBlueprintName === blueprintInstance["blueprint"]["blueprintName"]) {
                                                 if ($scope.selectedBlueprintVersion === blueprintInstance["version"]) {
@@ -79,61 +92,41 @@ AECBlueprintValidationUIApp
                                             }
                                         });
                     }
-                    $scope.selectedBluePrintLayerChange = function() {
-                        $scope.declerativeTimeslots = [];
-                        angular
-                                .forEach(
-                                        $scope.blueprintInstances,
-                                        function(blueprintInstance) {
-                                            if ($scope.selectedBlueprintName === blueprintInstance["blueprint"]["blueprintName"]) {
-                                                if ($scope.selectedBlueprintVersion === blueprintInstance["version"]) {
-                                                    if ($scope.selectedBlueprintLayer === blueprintInstance["layer"]) {
-                                                        var temp = "id: "
-                                                                + blueprintInstance["timeslot"].timeslotId
-                                                                + " Start date and time: "
-                                                                + blueprintInstance["timeslot"].startDateTime
-                                                                + " duration(in sec) :"
-                                                                + blueprintInstance["timeslot"].duration
-                                                                + " lab :"
-                                                                + blueprintInstance["timeslot"].lab;
-                                                        if ($scope.declerativeTimeslots
-                                                                .indexOf(temp) === -1) {
-                                                            $scope.declerativeTimeslots
-                                                                    .push(temp);
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        });
-                    }
+
                     $scope.submit = function() {
                         var finalBlueprint;
+                        var finalTimeslot;
                         angular
                                 .forEach(
-                                        $scope.blueprintInstances,
+                                        $scope.blueprintInstancesForValidation,
                                         function(blueprintInstance) {
                                             if (blueprintInstance["blueprint"]["blueprintName"] === $scope.selectedBlueprintName) {
                                                 if (blueprintInstance["version"] === $scope.selectedBlueprintVersion) {
                                                     if (blueprintInstance["layer"] === $scope.selectedBlueprintLayer) {
-                                                        var selectedDeclerativeTimeslotId = $scope.selectedDeclerativeTimeslot
-                                                                .substring(
-                                                                        $scope.selectedDeclerativeTimeslot
-                                                                                .indexOf("id:") + 4,
-                                                                        $scope.selectedDeclerativeTimeslot
-                                                                                .indexOf("Start date and time:") - 1);
-                                                        if (selectedDeclerativeTimeslotId
-                                                                .toString()
-                                                                .trim() === blueprintInstance["timeslot"]["timeslotId"]
-                                                                .toString()
-                                                                .trim()) {
-                                                            finalBlueprint = blueprintInstance;
-                                                        }
+                                                        finalBlueprint = blueprintInstance;
                                                     }
                                                 }
                                             }
                                         });
+                        var selectedDeclerativeTimeslotId = $scope.selectedDeclerativeTimeslot
+                                .substring(
+                                        $scope.selectedDeclerativeTimeslot
+                                                .indexOf("id:") + 4,
+                                        $scope.selectedDeclerativeTimeslot
+                                                .indexOf("Start date and time:") - 1);
+                        angular
+                                .forEach(
+                                        $scope.timeslots,
+                                        function(timeslot) {
+                                            if (selectedDeclerativeTimeslotId
+                                                    .toString().trim() === timeslot.timeslotId
+                                                    .toString().trim()) {
+                                                finalTimeslot = timeslot;
+                                            }
+                                        });
                         var submission = {
-                            "blueprintInstance" : finalBlueprint
+                            "blueprintInstanceForValidation" : finalBlueprint,
+                            "timeslot" : finalTimeslot
                         };
                         restAPISvc
                                 .postRestAPI(
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/NewSubmission.html b/ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/NewSubmission.html
new file mode 100644 (file)
index 0000000..e551449
--- /dev/null
@@ -0,0 +1,178 @@
+<!--
+Copyright (c) 2019 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.
+-->
+
+<!DOCTYPE html>
+<!-- Single-page application for EPSDK-App using DS2 look and feel. -->
+<html>
+<head>
+<meta charset="ISO-8859-1">
+<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
+
+<title>New Submission</title>
+
+<!-- B2b Library -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/b2b/css/b2b-angular/b2b-angular.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/b2b/css/b2b-angular/font_icons.css">
+
+<!-- icons in open source -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ionicons.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css">
+
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/angular-bootstrap/ui-bootstrap-csp.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/angular-gridster/dist/angular-gridster.min.css">
+<link rel="stylesheet" type="text/css"
+ href="static/fusion/sample/css/scribble.css" />
+<link rel="stylesheet" type="text/css"
+ href="static/fusion/sample/css/welcome.css" />
+
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/styles/ecomp.css">
+
+<!-- Common scripts -->
+<script src="app/fusion/external/angular-1.4.8/angular.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-messages.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-touch.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-sanitize.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-route.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-cookies.min.js"></script>
+<script src="app/fusion/external/jquery/dist/jquery.min.js"></script>
+<script
+ src="app/fusion/external/javascript-detect-element-resize/jquery.resize.js"></script>
+<script
+ src="app/fusion/external/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>
+<script
+ src="app/fusion/external/angular-gridster/dist/angular-gridster.min.js"></script>
+
+<!-- EPSDK App scripts and common services -->
+<!-- B2b Library -->
+<script src="app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js"></script>
+<script src="app/fusion/scripts/DS2-services/ds2-modal/modalService.js"></script>
+<script src="app/AECBlueprintValidationUI/App.Config.js"></script>
+<script src="app/AECBlueprintValidationUI/App.Services.js"></script>
+<script
+ src="app/AECBlueprintValidationUI/NewSubmission/AECNewSubmission.js"></script>
+
+<script src="app/fusion/scripts/DS2-services/userInfoServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/headerServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/leftMenuServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/manifestService.js"></script>
+
+<script src="app/fusion/scripts/DS2-directives/footer.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2Header.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2LeftMenu.js"></script>
+<script src="app/fusion/scripts/DS2-directives/b2b-leftnav-ext.js"></script>
+<script src="app/fusion/scripts/DS2-services/userInfoServiceDS2.js"></script>
+
+<!-- Page specific items -->
+<script
+ src="app/AECBlueprintValidationUI/NewSubmission/AECNewSubmissionController.js"></script>
+<script src="app/AECBlueprintValidationUI/NewSubmission/Route.js"></script>
+
+<style>
+.controls {
+       margin-bottom: 20px;
+}
+
+.page-header {
+       margin-top: 20px;
+}
+
+ul {
+       list-style: none;
+}
+
+.box {
+       height: 100%;
+       border: 1px solid #ccc;
+       background-color: #fff;
+       position: relative;
+       overflow: hidden;
+}
+
+.box-header {
+       background-color: #eee;
+       padding: 0px 0px 0px 0px;
+       margin-bottom: -25px;
+       cursor: move;
+       position: relative;
+}
+
+.box-header h3 {
+       margin-top: 0px;
+       display: inline-block;
+}
+
+.box-content {
+       padding: 10px;
+       display: block;
+       height: 100%;
+       position: relative;
+       overflow-x: auto;
+       overflow-y: auto;
+}
+
+.box-header-btns {
+       top: 15px;
+       right: 10px;
+       cursor: pointer;
+       position: absolute;
+}
+
+.gridster {
+       border: none;
+       position: relative;
+}
+
+.box-content .box-content-frame {
+
+}
+
+.box table {
+       border: none;
+       display: block;
+}
+
+.box table tr {
+       line-height: 20px;
+}
+
+.box table th {
+       border: none;
+       line-height: 20px;
+}
+
+.menu-container {
+       margin-top: 0px
+}
+
+.handle-e {
+       width: 3px;
+}
+</style>
+</head>
+<body class="appBody" ng-app="AECNewSubmission">
+ <div ds2-Header class="header-container"></div>
+ <div ds2-menu id="menuContainer" class="menu-container"></div>
+ <div ng-view id="rightContentProfile" class="content-container"></div>
+ <div ds2-Footer class="footer-container"></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/NewSubmissionTemplate.html b/ui/src/main/webapp/app/AECBlueprintValidationUI/NewSubmission/NewSubmissionTemplate.html
new file mode 100644 (file)
index 0000000..a84fa05
--- /dev/null
@@ -0,0 +1,73 @@
+<!--
+Copyright (c) 2019 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.
+-->
+
+<div id="page-content" class="content" style="padding: 25px;">
+ <div>
+  <h1 class="heading-page">New Submission</h1>
+  <h2 class="heading-small">Submission form</h2>
+
+  <div>
+   <div class="form-row">
+    <label for="textinputID-3a">Select Blueprint: </label> <select
+     ng-model="selectedBlueprintName"
+     ng-init="selectedBlueprintName=blueprintNames[0]"
+     ng-change="selectedBluePrintNameChange()"
+     ng-options="n for n in blueprintNames">
+    </select>
+   </div>
+  </div>
+  <br>
+
+  <div>
+   <div class="form-row">
+    <label for="textinputID-3a">Select Blueprint Version: </label> <select
+     ng-model="selectedBlueprintVersion"
+     ng-change="selectedBluePrintVersionChange()"
+     ng-options="y for y in blueprintVersions">
+    </select>
+   </div>
+  </div>
+  <br>
+
+  <div>
+   <div class="form-row">
+    <label for="textinputID-3a">Select Blueprint Layer: </label> <select
+     ng-model="selectedBlueprintLayer"
+     ng-change="selectedBluePrintLayerChange()"
+     ng-options="l for l in blueprintLayers">
+    </select>
+   </div>
+  </div>
+  <br>
+
+
+  <div>
+   <div class="form-row">
+    <label for="textinputID-3a">Select Timeslot: </label> <select
+     ng-model="selectedDeclerativeTimeslot"
+     ng-options="v for v in declerativeTimeslots">
+    </select>
+   </div>
+  </div>
+  <br>
+
+  <div class="fn-ebz-container" style="position: relative; top: 25px;">
+   <button href="javascript:void(0)" id="addbtn" style="bottom: -17px;"
+    size="small" att-accessibility-click="13,32"
+    class="btn btn-alt btn-small" ng-click="submit();">Submit</button>
+  </div>
+ </div>
+</div>
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.akraino.validation.ui.common;
 
-import org.springframework.context.ApplicationListener;
-import org.springframework.context.event.ContextRefreshedEvent;
-import org.springframework.stereotype.Component;
+appDS2
+        .config(function($routeProvider) {
+            $routeProvider
 
-@Component
-public class ServiceInitializationListener implements ApplicationListener<ContextRefreshedEvent> {
-
-    @Override
-    public void onApplicationEvent(ContextRefreshedEvent event) {
-
-    }
-
-}
+                    .otherwise({
+                        templateUrl : 'app/AECBlueprintValidationUI/NewSubmission/NewSubmissionTemplate.html',
+                        controller : "AECNewSubmissionController"
+                    });
+        });
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/font_icons.css b/ui/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/font_icons.css
new file mode 100644 (file)
index 0000000..0aa5b85
--- /dev/null
@@ -0,0 +1 @@
+/* font_icons.css is in open source - this empty file prevents 404 error in browser */
diff --git a/ui/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css b/ui/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css
new file mode 100644 (file)
index 0000000..f3b546d
--- /dev/null
@@ -0,0 +1,288 @@
+@charset "UTF-8";
+
+@font-face {
+    font-family: "Ionicons";
+    src: url("../fonts/ionicons.eot?v=2.0.0");
+    src: url("../fonts/ionicons.eot?v=2.0.0#iefix")
+        format("embedded-opentype"),
+        url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"),
+        url("../fonts/ionicons.woff?v=2.0.0") format("woff"),
+        url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");
+    font-weight: normal;
+    font-style: normal;
+}
+
+.ionicons, .icon-controls-upPRIMARY, .icon-arrows-download:before,
+    .icon-securityalerts-alertL:before, .icon-controls-add-maximize:before,
+    .icon-controls-add-maximize-circle:before, .icon-misc-time:before,
+    .icoSecurityalerts:before, .icon-apps-marketplace:before,
+    .icon-content-grid:before, .icon-documents-archive:before,
+    .icon-arrows-vertical-arrow-down:before, .icoArrows-download:before,
+    .icoArrows-incoming-call:before, .icon-arrows-outgoing-call:before,
+    .icon-arrows-upload:before, .icon-arrows-straight-arrow:before,
+    .icoArrows-vertical-arrow:before, .icon-people-userbookmark:before,
+    .icon-controls-check:before, .icon-chevron-down:before,
+    .icon-controls-down:before, .icon-controls-left:before,
+    .icon-controls-right:before, .icon-chevron-up:before,
+    .icoDocuments-report:before, .icon-edit:before, .icon-controls-up:before,
+    .icon-overview:before, .icon-settings:before, .icon-building-home:before,
+    .icon-documents-book:before, .icoDocuments-book-outline:before,
+    .icoDocuments-bookmarks:before, .icoDocuments-bookmarks-outline:before,
+    .icon-add-widget:before, .icon-documents-copy:before,
+    .icon-content-flag:before, .icon-primary-accordion-minus:before,
+    .icon-misc-piechart:before, .icon-misc-piechart-outline:before,
+    .icon-primary-accordion-plus:before, .icon-star:before,
+    .icon-building-door:before, .icon-content-gridguide:before,
+    .icon-user:before, .icon-people-oneperson:before,
+    .icon-people-oneperson-add:before, .icon-people-oneperson-stalker:before,
+    .icon-controls-pointer:before, .icon-arrows-replay-restart:before,
+    .icon-content-star:before, .icon-misc-trash:before, .icon-misc-pen:before,
+    .ion-navicon:before, .icon-primary-close:before, .close:before,
+    .reset-field:before, .icon-datanetwork-softwareasaservice:before,
+    .icon-datanetwork-messaging2:before,
+    .icon-controls-settingsconnectedactivity:before, .icon-arrows-upload:before
+    {
+    display: inline-block;
+    font-family: "Ionicons";
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    text-rendering: auto;
+    line-height: 1;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.icoSecurityalerts-alert:before {
+    content: "\f100";
+}
+
+.icon-arrows-download:before {
+    content: "\f41f";
+}
+
+.icon-controls-add-maximize:before {
+    content: "\f2c7";
+}
+
+.icon-controls-add-maximize-circle:before {
+    content: "\f359";
+}
+
+.icon-misc-time:before {
+    content: "\f35a";
+}
+
+.icoSecurityalerts:before {
+    content: "\f35b";
+}
+
+.icon-content-grid:before {
+    content: "\f35c";
+}
+
+.icon-documents-archive:before {
+    content: "\f2c9";
+}
+
+.icon-arrows-vertical-arrow-down:before {
+    content: "\f35d";
+}
+
+.icon-arrows-download:before {
+    content: "\f35e";
+}
+
+.icon-arrows-incoming-call:before {
+    content: "\f360";
+}
+
+.icoArrows-outgoing-call:before {
+    content: "\f362";
+}
+
+.icoArrows-upload:before {
+    content: "\f364";
+}
+
+.icoArrows-straight-arrow:before {
+    content: "\f30f";
+}
+
+.icon-arrows-vertical-arrow:before {
+    content: "\f366";
+}
+
+.icon-people-userbookmark:before {
+    content: "\f39f";
+}
+
+.icon-controls-check:before {
+    content: "\f121";
+}
+
+.icon-chevron-down:before {
+    content: "\f123";
+}
+
+.icon-controls-left:before {
+    content: "\f124";
+}
+
+.icon-controls-right:before {
+    content: "\f125";
+}
+
+.icon-chevron-up:before {
+    content: "\f126";
+}
+
+.icoDocuments-report:before {
+    content: "\f274";
+}
+
+.icon-overview:before {
+    content: "\f133";
+}
+
+.icon-controls-down:before {
+    content: "\f3d0";
+}
+
+.icon-controls-up:before {
+    content: "\f3d8";
+}
+
+.icon-documents-book:before {
+    content: "\f3e8";
+}
+
+.icoDocuments-book-outline:before {
+    content: "\f3e7";
+}
+
+.icoDocuments-bookmarks:before {
+    content: "\f3ea";
+}
+
+.icoDocuments-bookmarks-outline:before {
+    content: "\f3e9";
+}
+
+.icon-documents-copy:before {
+    content: "\f41c";
+}
+
+.icon-content-flag:before {
+    content: "\f42d";
+}
+
+.icon-primary-accordion-minus:before {
+    content: "\f463";
+}
+
+.icon-misc-piechart:before {
+    content: "\f484";
+}
+
+.icon-misc-piechart-outline:before {
+    content: "\f483";
+}
+
+.icon-primary-accordion-plus:before {
+    content: "\f48a";
+}
+
+.icon-building-door:before {
+    content: "\f29f";
+}
+
+.icon-content-gridguide:before {
+    content: "\f20d";
+}
+
+.icon-people-oneperson:before {
+    content: "\f213";
+}
+
+.icon-people-oneperson-add:before {
+    content: "\f211";
+}
+
+.icon-people-oneperson-stalker:before {
+    content: "\f212";
+}
+
+.icon-arrows-replay-restart:before {
+    content: "\f21c";
+}
+
+.icon-misc-trash:before {
+    content: "\f252";
+}
+
+.icon-arrows-upload:before {
+    content: "\f255";
+}
+
+.icon-user:before {
+    content: "\f213";
+}
+
+.icon-star:before {
+    content: "\f4b3";
+}
+
+.icon-edit:before {
+    content: "\f2bf";
+}
+
+.icon-settings:before {
+    content: "\f13d";
+}
+
+.icon-apps-marketplace:before {
+    content: "\f35c";
+}
+
+.icon-add-widget:before {
+    content: "\f3f0";
+}
+
+.icon-controls-upPRIMARY:before {
+    content: "\f3d8";
+}
+
+.icon-misc-pen:before {
+    content: "\f2bf";
+}
+
+.ion-navicon:before {
+    content: "\f20e";
+}
+
+.icon-building-home:before {
+    content: "\f144";
+}
+
+.icon-content-star:before {
+    content: "\f24e";
+}
+
+.icon-primary-close:before, .close:before, .reset-field:before {
+    content: "\f129";
+}
+
+.icon-datanetwork-softwareasaservice:before {
+    content: "\f40c";
+}
+
+.icon-datanetwork-messaging2:before {
+    content: "\f132";
+}
+
+.icon-controls-settingsconnectedactivity:before {
+    content: "\f411";
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ionicons.css b/ui/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ionicons.css
new file mode 100644 (file)
index 0000000..bf2665c
--- /dev/null
@@ -0,0 +1,3297 @@
+@charset "UTF-8";
+/*!
+  Ionicons, v2.0.0
+  Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
+  https://twitter.com/benjsperry  https://twitter.com/ionicframework
+  MIT License: https://github.com/driftyco/ionicons
+
+  Android-style icons originally built by Google’s
+  Material Design Icons: https://github.com/google/material-design-icons
+  used under CC BY http://creativecommons.org/licenses/by/4.0/
+  Modified icons to fit ionicon’s grid from original.
+*/
+@font-face {
+    font-family: "Ionicons";
+    src: url("../fonts/ionicons.eot?v=2.0.0");
+    src: url("../fonts/ionicons.eot?v=2.0.0#iefix")
+        format("embedded-opentype"),
+        url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"),
+        url("../fonts/ionicons.woff?v=2.0.0") format("woff"),
+        url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");
+    font-weight: normal;
+    font-style: normal;
+}
+
+.ion, .ionicons, .ion-alert:before, .ion-alert-circled:before,
+    .ion-android-add:before, .ion-android-add-circle:before,
+    .ion-android-alarm-clock:before, .ion-android-alert:before,
+    .ion-android-apps:before, .ion-android-archive:before,
+    .ion-android-arrow-back:before, .ion-android-arrow-down:before,
+    .ion-android-arrow-dropdown:before,
+    .ion-android-arrow-dropdown-circle:before,
+    .ion-android-arrow-dropleft:before,
+    .ion-android-arrow-dropleft-circle:before,
+    .ion-android-arrow-dropright:before,
+    .ion-android-arrow-dropright-circle:before,
+    .ion-android-arrow-dropup:before, .ion-android-arrow-dropup-circle:before,
+    .ion-android-arrow-forward:before, .ion-android-arrow-up:before,
+    .ion-android-attach:before, .ion-android-bar:before,
+    .ion-android-bicycle:before, .ion-android-boat:before,
+    .ion-android-bookmark:before, .ion-android-bulb:before,
+    .ion-android-bus:before, .ion-android-calendar:before,
+    .ion-android-call:before, .ion-android-camera:before,
+    .ion-android-cancel:before, .ion-android-car:before,
+    .ion-android-cart:before, .ion-android-chat:before,
+    .ion-android-checkbox:before, .ion-android-checkbox-blank:before,
+    .ion-android-checkbox-outline:before,
+    .ion-android-checkbox-outline-blank:before,
+    .ion-android-checkmark-circle:before, .ion-android-clipboard:before,
+    .ion-android-close:before, .ion-android-cloud:before,
+    .ion-android-cloud-circle:before, .ion-android-cloud-done:before,
+    .ion-android-cloud-outline:before, .ion-android-color-palette:before,
+    .ion-android-compass:before, .ion-android-contact:before,
+    .ion-android-contacts:before, .ion-android-contract:before,
+    .ion-android-create:before, .ion-android-delete:before,
+    .ion-android-desktop:before, .ion-android-document:before,
+    .ion-android-done:before, .ion-android-done-all:before,
+    .ion-android-download:before, .ion-android-drafts:before,
+    .ion-android-exit:before, .ion-android-expand:before,
+    .ion-android-favorite:before, .ion-android-favorite-outline:before,
+    .ion-android-film:before, .ion-android-folder:before,
+    .ion-android-folder-open:before, .ion-android-funnel:before,
+    .ion-android-globe:before, .ion-android-hand:before,
+    .ion-android-hangout:before, .ion-android-happy:before,
+    .ion-android-home:before, .ion-android-image:before,
+    .ion-android-laptop:before, .ion-android-list:before,
+    .ion-android-locate:before, .ion-android-lock:before,
+    .ion-android-mail:before, .ion-android-map:before, .ion-android-menu:before,
+    .ion-android-microphone:before, .ion-android-microphone-off:before,
+    .ion-android-more-horizontal:before, .ion-android-more-vertical:before,
+    .ion-android-navigate:before, .ion-android-notifications:before,
+    .ion-android-notifications-none:before,
+    .ion-android-notifications-off:before, .ion-android-open:before,
+    .ion-android-options:before, .ion-android-people:before,
+    .ion-android-person:before, .ion-android-person-add:before,
+    .ion-android-phone-landscape:before, .ion-android-phone-portrait:before,
+    .ion-android-pin:before, .ion-android-plane:before,
+    .ion-android-playstore:before, .ion-android-print:before,
+    .ion-android-radio-button-off:before, .ion-android-radio-button-on:before,
+    .ion-android-refresh:before, .ion-android-remove:before,
+    .ion-android-remove-circle:before, .ion-android-restaurant:before,
+    .ion-android-sad:before, .ion-android-search:before,
+    .ion-android-send:before, .ion-android-settings:before,
+    .ion-android-share:before, .ion-android-share-alt:before,
+    .ion-android-star:before, .ion-android-star-half:before,
+    .ion-android-star-outline:before, .ion-android-stopwatch:before,
+    .ion-android-subway:before, .ion-android-sunny:before,
+    .ion-android-sync:before, .ion-android-textsms:before,
+    .ion-android-time:before, .ion-android-train:before,
+    .ion-android-unlock:before, .ion-android-upload:before,
+    .ion-android-volume-down:before, .ion-android-volume-mute:before,
+    .ion-android-volume-off:before, .ion-android-volume-up:before,
+    .ion-android-walk:before, .ion-android-warning:before,
+    .ion-android-watch:before, .ion-android-wifi:before, .ion-aperture:before,
+    .ion-archive:before, .ion-arrow-down-a:before, .ion-arrow-down-b:before,
+    .ion-arrow-down-c:before, .ion-arrow-expand:before,
+    .ion-arrow-graph-down-left:before, .ion-arrow-graph-down-right:before,
+    .ion-arrow-graph-up-left:before, .ion-arrow-graph-up-right:before,
+    .ion-arrow-left-a:before, .ion-arrow-left-b:before,
+    .ion-arrow-left-c:before, .ion-arrow-move:before, .ion-arrow-resize:before,
+    .ion-arrow-return-left:before, .ion-arrow-return-right:before,
+    .ion-arrow-right-a:before, .ion-arrow-right-b:before,
+    .ion-arrow-right-c:before, .ion-arrow-shrink:before, .ion-arrow-swap:before,
+    .ion-arrow-up-a:before, .ion-arrow-up-b:before, .ion-arrow-up-c:before,
+    .ion-asterisk:before, .ion-at:before, .ion-backspace:before,
+    .ion-backspace-outline:before, .ion-bag:before,
+    .ion-battery-charging:before, .ion-battery-empty:before,
+    .ion-battery-full:before, .ion-battery-half:before, .ion-battery-low:before,
+    .ion-beaker:before, .ion-beer:before, .ion-bluetooth:before,
+    .ion-bonfire:before, .ion-bookmark:before, .ion-bowtie:before,
+    .ion-briefcase:before, .ion-bug:before, .ion-calculator:before,
+    .ion-calendar:before, .ion-camera:before, .ion-card:before,
+    .ion-cash:before, .ion-chatbox:before, .ion-chatbox-working:before,
+    .ion-chatboxes:before, .ion-chatbubble:before,
+    .ion-chatbubble-working:before, .ion-chatbubbles:before,
+    .ion-checkmark:before, .ion-checkmark-circled:before,
+    .ion-checkmark-round:before, .ion-chevron-down:before,
+    .ion-chevron-left:before, .ion-chevron-right:before, .ion-chevron-up:before,
+    .ion-clipboard:before, .ion-clock:before, .ion-close:before,
+    .ion-close-circled:before, .ion-close-round:before,
+    .ion-closed-captioning:before, .ion-cloud:before, .ion-code:before,
+    .ion-code-download:before, .ion-code-working:before, .ion-coffee:before,
+    .ion-compass:before, .ion-compose:before, .ion-connection-bars:before,
+    .ion-contrast:before, .ion-crop:before, .ion-cube:before, .ion-disc:before,
+    .ion-document:before, .ion-document-text:before, .ion-drag:before,
+    .ion-earth:before, .ion-easel:before, .ion-edit:before, .ion-egg:before,
+    .ion-eject:before, .ion-email:before, .ion-email-unread:before,
+    .ion-erlenmeyer-flask:before, .ion-erlenmeyer-flask-bubbles:before,
+    .ion-eye:before, .ion-eye-disabled:before, .ion-female:before,
+    .ion-filing:before, .ion-film-marker:before, .ion-fireball:before,
+    .ion-flag:before, .ion-flame:before, .ion-flash:before,
+    .ion-flash-off:before, .ion-folder:before, .ion-fork:before,
+    .ion-fork-repo:before, .ion-forward:before, .ion-funnel:before,
+    .ion-gear-a:before, .ion-gear-b:before, .ion-grid:before,
+    .ion-hammer:before, .ion-happy:before, .ion-happy-outline:before,
+    .ion-headphone:before, .ion-heart:before, .ion-heart-broken:before,
+    .ion-help:before, .ion-help-buoy:before, .ion-help-circled:before,
+    .ion-home:before, .ion-icecream:before, .ion-image:before,
+    .ion-images:before, .ion-information:before,
+    .ion-information-circled:before, .ion-ionic:before, .ion-ios-alarm:before,
+    .ion-ios-alarm-outline:before, .ion-ios-albums:before,
+    .ion-ios-albums-outline:before, .ion-ios-americanfootball:before,
+    .ion-ios-americanfootball-outline:before, .ion-ios-analytics:before,
+    .ion-ios-analytics-outline:before, .ion-ios-arrow-back:before,
+    .ion-ios-arrow-down:before, .ion-ios-arrow-forward:before,
+    .ion-ios-arrow-left:before, .ion-ios-arrow-right:before,
+    .ion-ios-arrow-thin-down:before, .ion-ios-arrow-thin-left:before,
+    .ion-ios-arrow-thin-right:before, .ion-ios-arrow-thin-up:before,
+    .ion-ios-arrow-up:before, .ion-ios-at:before, .ion-ios-at-outline:before,
+    .ion-ios-barcode:before, .ion-ios-barcode-outline:before,
+    .ion-ios-baseball:before, .ion-ios-baseball-outline:before,
+    .ion-ios-basketball:before, .ion-ios-basketball-outline:before,
+    .ion-ios-bell:before, .ion-ios-bell-outline:before, .ion-ios-body:before,
+    .ion-ios-body-outline:before, .ion-ios-bolt:before,
+    .ion-ios-bolt-outline:before, .ion-ios-book:before,
+    .ion-ios-book-outline:before, .ion-ios-bookmarks:before,
+    .ion-ios-bookmarks-outline:before, .ion-ios-box:before,
+    .ion-ios-box-outline:before, .ion-ios-briefcase:before,
+    .ion-ios-briefcase-outline:before, .ion-ios-browsers:before,
+    .ion-ios-browsers-outline:before, .ion-ios-calculator:before,
+    .ion-ios-calculator-outline:before, .ion-ios-calendar:before,
+    .ion-ios-calendar-outline:before, .ion-ios-camera:before,
+    .ion-ios-camera-outline:before, .ion-ios-cart:before,
+    .ion-ios-cart-outline:before, .ion-ios-chatboxes:before,
+    .ion-ios-chatboxes-outline:before, .ion-ios-chatbubble:before,
+    .ion-ios-chatbubble-outline:before, .ion-ios-checkmark:before,
+    .ion-ios-checkmark-empty:before, .ion-ios-checkmark-outline:before,
+    .ion-ios-circle-filled:before, .ion-ios-circle-outline:before,
+    .ion-ios-clock:before, .ion-ios-clock-outline:before, .ion-ios-close:before,
+    .ion-ios-close-empty:before, .ion-ios-close-outline:before,
+    .ion-ios-cloud:before, .ion-ios-cloud-download:before,
+    .ion-ios-cloud-download-outline:before, .ion-ios-cloud-outline:before,
+    .ion-ios-cloud-upload:before, .ion-ios-cloud-upload-outline:before,
+    .ion-ios-cloudy:before, .ion-ios-cloudy-night:before,
+    .ion-ios-cloudy-night-outline:before, .ion-ios-cloudy-outline:before,
+    .ion-ios-cog:before, .ion-ios-cog-outline:before,
+    .ion-ios-color-filter:before, .ion-ios-color-filter-outline:before,
+    .ion-ios-color-wand:before, .ion-ios-color-wand-outline:before,
+    .ion-ios-compose:before, .ion-ios-compose-outline:before,
+    .ion-ios-contact:before, .ion-ios-contact-outline:before,
+    .ion-ios-copy:before, .ion-ios-copy-outline:before, .ion-ios-crop:before,
+    .ion-ios-crop-strong:before, .ion-ios-download:before,
+    .ion-ios-download-outline:before, .ion-ios-drag:before,
+    .ion-ios-email:before, .ion-ios-email-outline:before, .ion-ios-eye:before,
+    .ion-ios-eye-outline:before, .ion-ios-fastforward:before,
+    .ion-ios-fastforward-outline:before, .ion-ios-filing:before,
+    .ion-ios-filing-outline:before, .ion-ios-film:before,
+    .ion-ios-film-outline:before, .ion-ios-flag:before,
+    .ion-ios-flag-outline:before, .ion-ios-flame:before,
+    .ion-ios-flame-outline:before, .ion-ios-flask:before,
+    .ion-ios-flask-outline:before, .ion-ios-flower:before,
+    .ion-ios-flower-outline:before, .ion-ios-folder:before,
+    .ion-ios-folder-outline:before, .ion-ios-football:before,
+    .ion-ios-football-outline:before, .ion-ios-game-controller-a:before,
+    .ion-ios-game-controller-a-outline:before,
+    .ion-ios-game-controller-b:before,
+    .ion-ios-game-controller-b-outline:before, .ion-ios-gear:before,
+    .ion-ios-gear-outline:before, .ion-ios-glasses:before,
+    .ion-ios-glasses-outline:before, .ion-ios-grid-view:before,
+    .ion-ios-grid-view-outline:before, .ion-ios-heart:before,
+    .ion-ios-heart-outline:before, .ion-ios-help:before,
+    .ion-ios-help-empty:before, .ion-ios-help-outline:before,
+    .ion-ios-home:before, .ion-ios-home-outline:before,
+    .ion-ios-infinite:before, .ion-ios-infinite-outline:before,
+    .ion-ios-information:before, .ion-ios-information-empty:before,
+    .ion-ios-information-outline:before, .ion-ios-ionic-outline:before,
+    .ion-ios-keypad:before, .ion-ios-keypad-outline:before,
+    .ion-ios-lightbulb:before, .ion-ios-lightbulb-outline:before,
+    .ion-ios-list:before, .ion-ios-list-outline:before,
+    .ion-ios-location:before, .ion-ios-location-outline:before,
+    .ion-ios-locked:before, .ion-ios-locked-outline:before,
+    .ion-ios-loop:before, .ion-ios-loop-strong:before, .ion-ios-medical:before,
+    .ion-ios-medical-outline:before, .ion-ios-medkit:before,
+    .ion-ios-medkit-outline:before, .ion-ios-mic:before,
+    .ion-ios-mic-off:before, .ion-ios-mic-outline:before, .ion-ios-minus:before,
+    .ion-ios-minus-empty:before, .ion-ios-minus-outline:before,
+    .ion-ios-monitor:before, .ion-ios-monitor-outline:before,
+    .ion-ios-moon:before, .ion-ios-moon-outline:before, .ion-ios-more:before,
+    .ion-ios-more-outline:before, .ion-ios-musical-note:before,
+    .ion-ios-musical-notes:before, .ion-ios-navigate:before,
+    .ion-ios-navigate-outline:before, .ion-ios-nutrition:before,
+    .ion-ios-nutrition-outline:before, .ion-ios-paper:before,
+    .ion-ios-paper-outline:before, .ion-ios-paperplane:before,
+    .ion-ios-paperplane-outline:before, .ion-ios-partlysunny:before,
+    .ion-ios-partlysunny-outline:before, .ion-ios-pause:before,
+    .ion-ios-pause-outline:before, .ion-ios-paw:before,
+    .ion-ios-paw-outline:before, .ion-ios-people:before,
+    .ion-ios-people-outline:before, .ion-ios-person:before,
+    .ion-ios-person-outline:before, .ion-ios-personadd:before,
+    .ion-ios-personadd-outline:before, .ion-ios-photos:before,
+    .ion-ios-photos-outline:before, .ion-ios-pie:before,
+    .ion-ios-pie-outline:before, .ion-ios-pint:before,
+    .ion-ios-pint-outline:before, .ion-ios-play:before,
+    .ion-ios-play-outline:before, .ion-ios-plus:before,
+    .ion-ios-plus-empty:before, .ion-ios-plus-outline:before,
+    .ion-ios-pricetag:before, .ion-ios-pricetag-outline:before,
+    .ion-ios-pricetags:before, .ion-ios-pricetags-outline:before,
+    .ion-ios-printer:before, .ion-ios-printer-outline:before,
+    .ion-ios-pulse:before, .ion-ios-pulse-strong:before, .ion-ios-rainy:before,
+    .ion-ios-rainy-outline:before, .ion-ios-recording:before,
+    .ion-ios-recording-outline:before, .ion-ios-redo:before,
+    .ion-ios-redo-outline:before, .ion-ios-refresh:before,
+    .ion-ios-refresh-empty:before, .ion-ios-refresh-outline:before,
+    .ion-ios-reload:before, .ion-ios-reverse-camera:before,
+    .ion-ios-reverse-camera-outline:before, .ion-ios-rewind:before,
+    .ion-ios-rewind-outline:before, .ion-ios-rose:before,
+    .ion-ios-rose-outline:before, .ion-ios-search:before,
+    .ion-ios-search-strong:before, .ion-ios-settings:before,
+    .ion-ios-settings-strong:before, .ion-ios-shuffle:before,
+    .ion-ios-shuffle-strong:before, .ion-ios-skipbackward:before,
+    .ion-ios-skipbackward-outline:before, .ion-ios-skipforward:before,
+    .ion-ios-skipforward-outline:before, .ion-ios-snowy:before,
+    .ion-ios-speedometer:before, .ion-ios-speedometer-outline:before,
+    .ion-ios-star:before, .ion-ios-star-half:before,
+    .ion-ios-star-outline:before, .ion-ios-stopwatch:before,
+    .ion-ios-stopwatch-outline:before, .ion-ios-sunny:before,
+    .ion-ios-sunny-outline:before, .ion-ios-telephone:before,
+    .ion-ios-telephone-outline:before, .ion-ios-tennisball:before,
+    .ion-ios-tennisball-outline:before, .ion-ios-thunderstorm:before,
+    .ion-ios-thunderstorm-outline:before, .ion-ios-time:before,
+    .ion-ios-time-outline:before, .ion-ios-timer:before,
+    .ion-ios-timer-outline:before, .ion-ios-toggle:before,
+    .ion-ios-toggle-outline:before, .ion-ios-trash:before,
+    .ion-ios-trash-outline:before, .ion-ios-undo:before,
+    .ion-ios-undo-outline:before, .ion-ios-unlocked:before,
+    .ion-ios-unlocked-outline:before, .ion-ios-upload:before,
+    .ion-ios-upload-outline:before, .ion-ios-videocam:before,
+    .ion-ios-videocam-outline:before, .ion-ios-volume-high:before,
+    .ion-ios-volume-low:before, .ion-ios-wineglass:before,
+    .ion-ios-wineglass-outline:before, .ion-ios-world:before,
+    .ion-ios-world-outline:before, .ion-ipad:before, .ion-iphone:before,
+    .ion-ipod:before, .ion-jet:before, .ion-key:before, .ion-knife:before,
+    .ion-laptop:before, .ion-leaf:before, .ion-levels:before,
+    .ion-lightbulb:before, .ion-link:before, .ion-load-a:before,
+    .ion-load-b:before, .ion-load-c:before, .ion-load-d:before,
+    .ion-location:before, .ion-lock-combination:before, .ion-locked:before,
+    .ion-log-in:before, .ion-log-out:before, .ion-loop:before,
+    .ion-magnet:before, .ion-male:before, .ion-man:before, .ion-map:before,
+    .ion-medkit:before, .ion-merge:before, .ion-mic-a:before, .ion-mic-b:before,
+    .ion-mic-c:before, .ion-minus:before, .ion-minus-circled:before,
+    .ion-minus-round:before, .ion-model-s:before, .ion-monitor:before,
+    .ion-more:before, .ion-mouse:before, .ion-music-note:before,
+    .ion-navicon:before, .ion-navicon-round:before, .ion-navigate:before,
+    .ion-network:before, .ion-no-smoking:before, .ion-nuclear:before,
+    .ion-outlet:before, .ion-paintbrush:before, .ion-paintbucket:before,
+    .ion-paper-airplane:before, .ion-paperclip:before, .ion-pause:before,
+    .ion-person:before, .ion-person-add:before, .ion-person-stalker:before,
+    .ion-pie-graph:before, .ion-pin:before, .ion-pinpoint:before,
+    .ion-pizza:before, .ion-plane:before, .ion-planet:before, .ion-play:before,
+    .ion-playstation:before, .ion-plus:before, .ion-plus-circled:before,
+    .ion-plus-round:before, .ion-podium:before, .ion-pound:before,
+    .ion-power:before, .ion-pricetag:before, .ion-pricetags:before,
+    .ion-printer:before, .ion-pull-request:before, .ion-qr-scanner:before,
+    .ion-quote:before, .ion-radio-waves:before, .ion-record:before,
+    .ion-refresh:before, .ion-reply:before, .ion-reply-all:before,
+    .ion-ribbon-a:before, .ion-ribbon-b:before, .ion-sad:before,
+    .ion-sad-outline:before, .ion-scissors:before, .ion-search:before,
+    .ion-settings:before, .ion-share:before, .ion-shuffle:before,
+    .ion-skip-backward:before, .ion-skip-forward:before,
+    .ion-social-android:before, .ion-social-android-outline:before,
+    .ion-social-angular:before, .ion-social-angular-outline:before,
+    .ion-social-apple:before, .ion-social-apple-outline:before,
+    .ion-social-bitcoin:before, .ion-social-bitcoin-outline:before,
+    .ion-social-buffer:before, .ion-social-buffer-outline:before,
+    .ion-social-chrome:before, .ion-social-chrome-outline:before,
+    .ion-social-codepen:before, .ion-social-codepen-outline:before,
+    .ion-social-css3:before, .ion-social-css3-outline:before,
+    .ion-social-designernews:before, .ion-social-designernews-outline:before,
+    .ion-social-dribbble:before, .ion-social-dribbble-outline:before,
+    .ion-social-dropbox:before, .ion-social-dropbox-outline:before,
+    .ion-social-euro:before, .ion-social-euro-outline:before,
+    .ion-social-facebook:before, .ion-social-facebook-outline:before,
+    .ion-social-foursquare:before, .ion-social-foursquare-outline:before,
+    .ion-social-freebsd-devil:before, .ion-social-github:before,
+    .ion-social-github-outline:before, .ion-social-google:before,
+    .ion-social-google-outline:before, .ion-social-googleplus:before,
+    .ion-social-googleplus-outline:before, .ion-social-hackernews:before,
+    .ion-social-hackernews-outline:before, .ion-social-html5:before,
+    .ion-social-html5-outline:before, .ion-social-instagram:before,
+    .ion-social-instagram-outline:before, .ion-social-javascript:before,
+    .ion-social-javascript-outline:before, .ion-social-linkedin:before,
+    .ion-social-linkedin-outline:before, .ion-social-markdown:before,
+    .ion-social-nodejs:before, .ion-social-octocat:before,
+    .ion-social-pinterest:before, .ion-social-pinterest-outline:before,
+    .ion-social-python:before, .ion-social-reddit:before,
+    .ion-social-reddit-outline:before, .ion-social-rss:before,
+    .ion-social-rss-outline:before, .ion-social-sass:before,
+    .ion-social-skype:before, .ion-social-skype-outline:before,
+    .ion-social-snapchat:before, .ion-social-snapchat-outline:before,
+    .ion-social-tumblr:before, .ion-social-tumblr-outline:before,
+    .ion-social-tux:before, .ion-social-twitch:before,
+    .ion-social-twitch-outline:before, .ion-social-twitter:before,
+    .ion-social-twitter-outline:before, .ion-social-usd:before,
+    .ion-social-usd-outline:before, .ion-social-vimeo:before,
+    .ion-social-vimeo-outline:before, .ion-social-whatsapp:before,
+    .ion-social-whatsapp-outline:before, .ion-social-windows:before,
+    .ion-social-windows-outline:before, .ion-social-wordpress:before,
+    .ion-social-wordpress-outline:before, .ion-social-yahoo:before,
+    .ion-social-yahoo-outline:before, .ion-social-yen:before,
+    .ion-social-yen-outline:before, .ion-social-youtube:before,
+    .ion-social-youtube-outline:before, .ion-soup-can:before,
+    .ion-soup-can-outline:before, .ion-speakerphone:before,
+    .ion-speedometer:before, .ion-spoon:before, .ion-star:before,
+    .ion-stats-bars:before, .ion-steam:before, .ion-stop:before,
+    .ion-thermometer:before, .ion-thumbsdown:before, .ion-thumbsup:before,
+    .ion-toggle:before, .ion-toggle-filled:before, .ion-transgender:before,
+    .ion-trash-a:before, .ion-trash-b:before, .ion-trophy:before,
+    .ion-tshirt:before, .ion-tshirt-outline:before, .ion-umbrella:before,
+    .ion-university:before, .ion-unlocked:before, .ion-upload:before,
+    .ion-usb:before, .ion-videocamera:before, .ion-volume-high:before,
+    .ion-volume-low:before, .ion-volume-medium:before, .ion-volume-mute:before,
+    .ion-wand:before, .ion-waterdrop:before, .ion-wifi:before,
+    .ion-wineglass:before, .ion-woman:before, .ion-wrench:before,
+    .ion-xbox:before {
+    display: inline-block;
+    font-family: "Ionicons";
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    text-rendering: auto;
+    line-height: 1;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.ion-alert:before {
+    content: "\f101";
+}
+
+.ion-alert-circled:before {
+    content: "\f100";
+}
+
+.ion-android-add:before {
+    content: "\f2c7";
+}
+
+.ion-android-add-circle:before {
+    content: "\f359";
+}
+
+.ion-android-alarm-clock:before {
+    content: "\f35a";
+}
+
+.ion-android-alert:before {
+    content: "\f35b";
+}
+
+.ion-android-apps:before {
+    content: "\f35c";
+}
+
+.ion-android-archive:before {
+    content: "\f2c9";
+}
+
+.ion-android-arrow-back:before {
+    content: "\f2ca";
+}
+
+.ion-android-arrow-down:before {
+    content: "\f35d";
+}
+
+.ion-android-arrow-dropdown:before {
+    content: "\f35f";
+}
+
+.ion-android-arrow-dropdown-circle:before {
+    content: "\f35e";
+}
+
+.ion-android-arrow-dropleft:before {
+    content: "\f361";
+}
+
+.ion-android-arrow-dropleft-circle:before {
+    content: "\f360";
+}
+
+.ion-android-arrow-dropright:before {
+    content: "\f363";
+}
+
+.ion-android-arrow-dropright-circle:before {
+    content: "\f362";
+}
+
+.ion-android-arrow-dropup:before {
+    content: "\f365";
+}
+
+.ion-android-arrow-dropup-circle:before {
+    content: "\f364";
+}
+
+.ion-android-arrow-forward:before {
+    content: "\f30f";
+}
+
+.ion-android-arrow-up:before {
+    content: "\f366";
+}
+
+.ion-android-attach:before {
+    content: "\f367";
+}
+
+.ion-android-bar:before {
+    content: "\f368";
+}
+
+.ion-android-bicycle:before {
+    content: "\f369";
+}
+
+.ion-android-boat:before {
+    content: "\f36a";
+}
+
+.ion-android-bookmark:before {
+    content: "\f36b";
+}
+
+.ion-android-bulb:before {
+    content: "\f36c";
+}
+
+.ion-android-bus:before {
+    content: "\f36d";
+}
+
+.ion-android-calendar:before {
+    content: "\f2d1";
+}
+
+.ion-android-call:before {
+    content: "\f2d2";
+}
+
+.ion-android-camera:before {
+    content: "\f2d3";
+}
+
+.ion-android-cancel:before {
+    content: "\f36e";
+}
+
+.ion-android-car:before {
+    content: "\f36f";
+}
+
+.ion-android-cart:before {
+    content: "\f370";
+}
+
+.ion-android-chat:before {
+    content: "\f2d4";
+}
+
+.ion-android-checkbox:before {
+    content: "\f374";
+}
+
+.ion-android-checkbox-blank:before {
+    content: "\f371";
+}
+
+.ion-android-checkbox-outline:before {
+    content: "\f373";
+}
+
+.ion-android-checkbox-outline-blank:before {
+    content: "\f372";
+}
+
+.ion-android-checkmark-circle:before {
+    content: "\f375";
+}
+
+.ion-android-clipboard:before {
+    content: "\f376";
+}
+
+.ion-android-close:before {
+    content: "\f2d7";
+}
+
+.ion-android-cloud:before {
+    content: "\f37a";
+}
+
+.ion-android-cloud-circle:before {
+    content: "\f377";
+}
+
+.ion-android-cloud-done:before {
+    content: "\f378";
+}
+
+.ion-android-cloud-outline:before {
+    content: "\f379";
+}
+
+.ion-android-color-palette:before {
+    content: "\f37b";
+}
+
+.ion-android-compass:before {
+    content: "\f37c";
+}
+
+.ion-android-contact:before {
+    content: "\f2d8";
+}
+
+.ion-android-contacts:before {
+    content: "\f2d9";
+}
+
+.ion-android-contract:before {
+    content: "\f37d";
+}
+
+.ion-android-create:before {
+    content: "\f37e";
+}
+
+.ion-android-delete:before {
+    content: "\f37f";
+}
+
+.ion-android-desktop:before {
+    content: "\f380";
+}
+
+.ion-android-document:before {
+    content: "\f381";
+}
+
+.ion-android-done:before {
+    content: "\f383";
+}
+
+.ion-android-done-all:before {
+    content: "\f382";
+}
+
+.ion-android-download:before {
+    content: "\f2dd";
+}
+
+.ion-android-drafts:before {
+    content: "\f384";
+}
+
+.ion-android-exit:before {
+    content: "\f385";
+}
+
+.ion-android-expand:before {
+    content: "\f386";
+}
+
+.ion-android-favorite:before {
+    content: "\f388";
+}
+
+.ion-android-favorite-outline:before {
+    content: "\f387";
+}
+
+.ion-android-film:before {
+    content: "\f389";
+}
+
+.ion-android-folder:before {
+    content: "\f2e0";
+}
+
+.ion-android-folder-open:before {
+    content: "\f38a";
+}
+
+.ion-android-funnel:before {
+    content: "\f38b";
+}
+
+.ion-android-globe:before {
+    content: "\f38c";
+}
+
+.ion-android-hand:before {
+    content: "\f2e3";
+}
+
+.ion-android-hangout:before {
+    content: "\f38d";
+}
+
+.ion-android-happy:before {
+    content: "\f38e";
+}
+
+.ion-android-home:before {
+    content: "\f38f";
+}
+
+.ion-android-image:before {
+    content: "\f2e4";
+}
+
+.ion-android-laptop:before {
+    content: "\f390";
+}
+
+.ion-android-list:before {
+    content: "\f391";
+}
+
+.ion-android-locate:before {
+    content: "\f2e9";
+}
+
+.ion-android-lock:before {
+    content: "\f392";
+}
+
+.ion-android-mail:before {
+    content: "\f2eb";
+}
+
+.ion-android-map:before {
+    content: "\f393";
+}
+
+.ion-android-menu:before {
+    content: "\f394";
+}
+
+.ion-android-microphone:before {
+    content: "\f2ec";
+}
+
+.ion-android-microphone-off:before {
+    content: "\f395";
+}
+
+.ion-android-more-horizontal:before {
+    content: "\f396";
+}
+
+.ion-android-more-vertical:before {
+    content: "\f397";
+}
+
+.ion-android-navigate:before {
+    content: "\f398";
+}
+
+.ion-android-notifications:before {
+    content: "\f39b";
+}
+
+.ion-android-notifications-none:before {
+    content: "\f399";
+}
+
+.ion-android-notifications-off:before {
+    content: "\f39a";
+}
+
+.ion-android-open:before {
+    content: "\f39c";
+}
+
+.ion-android-options:before {
+    content: "\f39d";
+}
+
+.ion-android-people:before {
+    content: "\f39e";
+}
+
+.ion-android-person:before {
+    content: "\f3a0";
+}
+
+.ion-android-person-add:before {
+    content: "\f39f";
+}
+
+.ion-android-phone-landscape:before {
+    content: "\f3a1";
+}
+
+.ion-android-phone-portrait:before {
+    content: "\f3a2";
+}
+
+.ion-android-pin:before {
+    content: "\f3a3";
+}
+
+.ion-android-plane:before {
+    content: "\f3a4";
+}
+
+.ion-android-playstore:before {
+    content: "\f2f0";
+}
+
+.ion-android-print:before {
+    content: "\f3a5";
+}
+
+.ion-android-radio-button-off:before {
+    content: "\f3a6";
+}
+
+.ion-android-radio-button-on:before {
+    content: "\f3a7";
+}
+
+.ion-android-refresh:before {
+    content: "\f3a8";
+}
+
+.ion-android-remove:before {
+    content: "\f2f4";
+}
+
+.ion-android-remove-circle:before {
+    content: "\f3a9";
+}
+
+.ion-android-restaurant:before {
+    content: "\f3aa";
+}
+
+.ion-android-sad:before {
+    content: "\f3ab";
+}
+
+.ion-android-search:before {
+    content: "\f2f5";
+}
+
+.ion-android-send:before {
+    content: "\f2f6";
+}
+
+.ion-android-settings:before {
+    content: "\f2f7";
+}
+
+.ion-android-share:before {
+    content: "\f2f8";
+}
+
+.ion-android-share-alt:before {
+    content: "\f3ac";
+}
+
+.ion-android-star:before {
+    content: "\f2fc";
+}
+
+.ion-android-star-half:before {
+    content: "\f3ad";
+}
+
+.ion-android-star-outline:before {
+    content: "\f3ae";
+}
+
+.ion-android-stopwatch:before {
+    content: "\f2fd";
+}
+
+.ion-android-subway:before {
+    content: "\f3af";
+}
+
+.ion-android-sunny:before {
+    content: "\f3b0";
+}
+
+.ion-android-sync:before {
+    content: "\f3b1";
+}
+
+.ion-android-textsms:before {
+    content: "\f3b2";
+}
+
+.ion-android-time:before {
+    content: "\f3b3";
+}
+
+.ion-android-train:before {
+    content: "\f3b4";
+}
+
+.ion-android-unlock:before {
+    content: "\f3b5";
+}
+
+.ion-android-upload:before {
+    content: "\f3b6";
+}
+
+.ion-android-volume-down:before {
+    content: "\f3b7";
+}
+
+.ion-android-volume-mute:before {
+    content: "\f3b8";
+}
+
+.ion-android-volume-off:before {
+    content: "\f3b9";
+}
+
+.ion-android-volume-up:before {
+    content: "\f3ba";
+}
+
+.ion-android-walk:before {
+    content: "\f3bb";
+}
+
+.ion-android-warning:before {
+    content: "\f3bc";
+}
+
+.ion-android-watch:before {
+    content: "\f3bd";
+}
+
+.ion-android-wifi:before {
+    content: "\f305";
+}
+
+.ion-aperture:before {
+    content: "\f313";
+}
+
+.ion-archive:before {
+    content: "\f102";
+}
+
+.ion-arrow-down-a:before {
+    content: "\f103";
+}
+
+.ion-arrow-down-b:before {
+    content: "\f104";
+}
+
+.ion-arrow-down-c:before {
+    content: "\f105";
+}
+
+.ion-arrow-expand:before {
+    content: "\f25e";
+}
+
+.ion-arrow-graph-down-left:before {
+    content: "\f25f";
+}
+
+.ion-arrow-graph-down-right:before {
+    content: "\f260";
+}
+
+.ion-arrow-graph-up-left:before {
+    content: "\f261";
+}
+
+.ion-arrow-graph-up-right:before {
+    content: "\f262";
+}
+
+.ion-arrow-left-a:before {
+    content: "\f106";
+}
+
+.ion-arrow-left-b:before {
+    content: "\f107";
+}
+
+.ion-arrow-left-c:before {
+    content: "\f108";
+}
+
+.ion-arrow-move:before {
+    content: "\f263";
+}
+
+.ion-arrow-resize:before {
+    content: "\f264";
+}
+
+.ion-arrow-return-left:before {
+    content: "\f265";
+}
+
+.ion-arrow-return-right:before {
+    content: "\f266";
+}
+
+.ion-arrow-right-a:before {
+    content: "\f109";
+}
+
+.ion-arrow-right-b:before {
+    content: "\f10a";
+}
+
+.ion-arrow-right-c:before {
+    content: "\f10b";
+}
+
+.ion-arrow-shrink:before {
+    content: "\f267";
+}
+
+.ion-arrow-swap:before {
+    content: "\f268";
+}
+
+.ion-arrow-up-a:before {
+    content: "\f10c";
+}
+
+.ion-arrow-up-b:before {
+    content: "\f10d";
+}
+
+.ion-arrow-up-c:before {
+    content: "\f10e";
+}
+
+.ion-asterisk:before {
+    content: "\f314";
+}
+
+.ion-at:before {
+    content: "\f10f";
+}
+
+.ion-backspace:before {
+    content: "\f3bf";
+}
+
+.ion-backspace-outline:before {
+    content: "\f3be";
+}
+
+.ion-bag:before {
+    content: "\f110";
+}
+
+.ion-battery-charging:before {
+    content: "\f111";
+}
+
+.ion-battery-empty:before {
+    content: "\f112";
+}
+
+.ion-battery-full:before {
+    content: "\f113";
+}
+
+.ion-battery-half:before {
+    content: "\f114";
+}
+
+.ion-battery-low:before {
+    content: "\f115";
+}
+
+.ion-beaker:before {
+    content: "\f269";
+}
+
+.ion-beer:before {
+    content: "\f26a";
+}
+
+.ion-bluetooth:before {
+    content: "\f116";
+}
+
+.ion-bonfire:before {
+    content: "\f315";
+}
+
+.ion-bookmark:before {
+    content: "\f26b";
+}
+
+.ion-bowtie:before {
+    content: "\f3c0";
+}
+
+.ion-briefcase:before {
+    content: "\f26c";
+}
+
+.ion-bug:before {
+    content: "\f2be";
+}
+
+.ion-calculator:before {
+    content: "\f26d";
+}
+
+.ion-calendar:before {
+    content: "\f117";
+}
+
+.ion-camera:before {
+    content: "\f118";
+}
+
+.ion-card:before {
+    content: "\f119";
+}
+
+.ion-cash:before {
+    content: "\f316";
+}
+
+.ion-chatbox:before {
+    content: "\f11b";
+}
+
+.ion-chatbox-working:before {
+    content: "\f11a";
+}
+
+.ion-chatboxes:before {
+    content: "\f11c";
+}
+
+.ion-chatbubble:before {
+    content: "\f11e";
+}
+
+.ion-chatbubble-working:before {
+    content: "\f11d";
+}
+
+.ion-chatbubbles:before {
+    content: "\f11f";
+}
+
+.ion-checkmark:before {
+    content: "\f122";
+}
+
+.ion-checkmark-circled:before {
+    content: "\f120";
+}
+
+.ion-checkmark-round:before {
+    content: "\f121";
+}
+
+.ion-chevron-down:before {
+    content: "\f123";
+}
+
+.ion-chevron-left:before {
+    content: "\f124";
+}
+
+.ion-chevron-right:before {
+    content: "\f125";
+}
+
+.ion-chevron-up:before {
+    content: "\f126";
+}
+
+.ion-clipboard:before {
+    content: "\f127";
+}
+
+.ion-clock:before {
+    content: "\f26e";
+}
+
+.ion-close:before {
+    content: "\f12a";
+}
+
+.ion-close-circled:before {
+    content: "\f128";
+}
+
+.ion-close-round:before {
+    content: "\f129";
+}
+
+.ion-closed-captioning:before {
+    content: "\f317";
+}
+
+.ion-cloud:before {
+    content: "\f12b";
+}
+
+.ion-code:before {
+    content: "\f271";
+}
+
+.ion-code-download:before {
+    content: "\f26f";
+}
+
+.ion-code-working:before {
+    content: "\f270";
+}
+
+.ion-coffee:before {
+    content: "\f272";
+}
+
+.ion-compass:before {
+    content: "\f273";
+}
+
+.ion-compose:before {
+    content: "\f12c";
+}
+
+.ion-connection-bars:before {
+    content: "\f274";
+}
+
+.ion-contrast:before {
+    content: "\f275";
+}
+
+.ion-crop:before {
+    content: "\f3c1";
+}
+
+.ion-cube:before {
+    content: "\f318";
+}
+
+.ion-disc:before {
+    content: "\f12d";
+}
+
+.ion-document:before {
+    content: "\f12f";
+}
+
+.ion-document-text:before {
+    content: "\f12e";
+}
+
+.ion-drag:before {
+    content: "\f130";
+}
+
+.ion-earth:before {
+    content: "\f276";
+}
+
+.ion-easel:before {
+    content: "\f3c2";
+}
+
+.ion-edit:before {
+    content: "\f2bf";
+}
+
+.ion-egg:before {
+    content: "\f277";
+}
+
+.ion-eject:before {
+    content: "\f131";
+}
+
+.ion-email:before {
+    content: "\f132";
+}
+
+.ion-email-unread:before {
+    content: "\f3c3";
+}
+
+.ion-erlenmeyer-flask:before {
+    content: "\f3c5";
+}
+
+.ion-erlenmeyer-flask-bubbles:before {
+    content: "\f3c4";
+}
+
+.ion-eye:before {
+    content: "\f133";
+}
+
+.ion-eye-disabled:before {
+    content: "\f306";
+}
+
+.ion-female:before {
+    content: "\f278";
+}
+
+.ion-filing:before {
+    content: "\f134";
+}
+
+.ion-film-marker:before {
+    content: "\f135";
+}
+
+.ion-fireball:before {
+    content: "\f319";
+}
+
+.ion-flag:before {
+    content: "\f279";
+}
+
+.ion-flame:before {
+    content: "\f31a";
+}
+
+.ion-flash:before {
+    content: "\f137";
+}
+
+.ion-flash-off:before {
+    content: "\f136";
+}
+
+.ion-folder:before {
+    content: "\f139";
+}
+
+.ion-fork:before {
+    content: "\f27a";
+}
+
+.ion-fork-repo:before {
+    content: "\f2c0";
+}
+
+.ion-forward:before {
+    content: "\f13a";
+}
+
+.ion-funnel:before {
+    content: "\f31b";
+}
+
+.ion-gear-a:before {
+    content: "\f13d";
+}
+
+.ion-gear-b:before {
+    content: "\f13e";
+}
+
+.ion-grid:before {
+    content: "\f13f";
+}
+
+.ion-hammer:before {
+    content: "\f27b";
+}
+
+.ion-happy:before {
+    content: "\f31c";
+}
+
+.ion-happy-outline:before {
+    content: "\f3c6";
+}
+
+.ion-headphone:before {
+    content: "\f140";
+}
+
+.ion-heart:before {
+    content: "\f141";
+}
+
+.ion-heart-broken:before {
+    content: "\f31d";
+}
+
+.ion-help:before {
+    content: "\f143";
+}
+
+.ion-help-buoy:before {
+    content: "\f27c";
+}
+
+.ion-help-circled:before {
+    content: "\f142";
+}
+
+.ion-home:before {
+    content: "\f144";
+}
+
+.ion-icecream:before {
+    content: "\f27d";
+}
+
+.ion-image:before {
+    content: "\f147";
+}
+
+.ion-images:before {
+    content: "\f148";
+}
+
+.ion-information:before {
+    content: "\f14a";
+}
+
+.ion-information-circled:before {
+    content: "\f149";
+}
+
+.ion-ionic:before {
+    content: "\f14b";
+}
+
+.ion-ios-alarm:before {
+    content: "\f3c8";
+}
+
+.ion-ios-alarm-outline:before {
+    content: "\f3c7";
+}
+
+.ion-ios-albums:before {
+    content: "\f3ca";
+}
+
+.ion-ios-albums-outline:before {
+    content: "\f3c9";
+}
+
+.ion-ios-americanfootball:before {
+    content: "\f3cc";
+}
+
+.ion-ios-americanfootball-outline:before {
+    content: "\f3cb";
+}
+
+.ion-ios-analytics:before {
+    content: "\f3ce";
+}
+
+.ion-ios-analytics-outline:before {
+    content: "\f3cd";
+}
+
+.ion-ios-arrow-back:before {
+    content: "\f3cf";
+}
+
+.ion-ios-arrow-down:before {
+    content: "\f3d0";
+}
+
+.ion-ios-arrow-forward:before {
+    content: "\f3d1";
+}
+
+.ion-ios-arrow-left:before {
+    content: "\f3d2";
+}
+
+.ion-ios-arrow-right:before {
+    content: "\f3d3";
+}
+
+.ion-ios-arrow-thin-down:before {
+    content: "\f3d4";
+}
+
+.ion-ios-arrow-thin-left:before {
+    content: "\f3d5";
+}
+
+.ion-ios-arrow-thin-right:before {
+    content: "\f3d6";
+}
+
+.ion-ios-arrow-thin-up:before {
+    content: "\f3d7";
+}
+
+.ion-ios-arrow-up:before {
+    content: "\f3d8";
+}
+
+.ion-ios-at:before {
+    content: "\f3da";
+}
+
+.ion-ios-at-outline:before {
+    content: "\f3d9";
+}
+
+.ion-ios-barcode:before {
+    content: "\f3dc";
+}
+
+.ion-ios-barcode-outline:before {
+    content: "\f3db";
+}
+
+.ion-ios-baseball:before {
+    content: "\f3de";
+}
+
+.ion-ios-baseball-outline:before {
+    content: "\f3dd";
+}
+
+.ion-ios-basketball:before {
+    content: "\f3e0";
+}
+
+.ion-ios-basketball-outline:before {
+    content: "\f3df";
+}
+
+.ion-ios-bell:before {
+    content: "\f3e2";
+}
+
+.ion-ios-bell-outline:before {
+    content: "\f3e1";
+}
+
+.ion-ios-body:before {
+    content: "\f3e4";
+}
+
+.ion-ios-body-outline:before {
+    content: "\f3e3";
+}
+
+.ion-ios-bolt:before {
+    content: "\f3e6";
+}
+
+.ion-ios-bolt-outline:before {
+    content: "\f3e5";
+}
+
+.ion-ios-book:before {
+    content: "\f3e8";
+}
+
+.ion-ios-book-outline:before {
+    content: "\f3e7";
+}
+
+.ion-ios-bookmarks:before {
+    content: "\f3ea";
+}
+
+.ion-ios-bookmarks-outline:before {
+    content: "\f3e9";
+}
+
+.ion-ios-box:before {
+    content: "\f3ec";
+}
+
+.ion-ios-box-outline:before {
+    content: "\f3eb";
+}
+
+.ion-ios-briefcase:before {
+    content: "\f3ee";
+}
+
+.ion-ios-briefcase-outline:before {
+    content: "\f3ed";
+}
+
+.ion-ios-browsers:before {
+    content: "\f3f0";
+}
+
+.ion-ios-browsers-outline:before {
+    content: "\f3ef";
+}
+
+.ion-ios-calculator:before {
+    content: "\f3f2";
+}
+
+.ion-ios-calculator-outline:before {
+    content: "\f3f1";
+}
+
+.ion-ios-calendar:before {
+    content: "\f3f4";
+}
+
+.ion-ios-calendar-outline:before {
+    content: "\f3f3";
+}
+
+.ion-ios-camera:before {
+    content: "\f3f6";
+}
+
+.ion-ios-camera-outline:before {
+    content: "\f3f5";
+}
+
+.ion-ios-cart:before {
+    content: "\f3f8";
+}
+
+.ion-ios-cart-outline:before {
+    content: "\f3f7";
+}
+
+.ion-ios-chatboxes:before {
+    content: "\f3fa";
+}
+
+.ion-ios-chatboxes-outline:before {
+    content: "\f3f9";
+}
+
+.ion-ios-chatbubble:before {
+    content: "\f3fc";
+}
+
+.ion-ios-chatbubble-outline:before {
+    content: "\f3fb";
+}
+
+.ion-ios-checkmark:before {
+    content: "\f3ff";
+}
+
+.ion-ios-checkmark-empty:before {
+    content: "\f3fd";
+}
+
+.ion-ios-checkmark-outline:before {
+    content: "\f3fe";
+}
+
+.ion-ios-circle-filled:before {
+    content: "\f400";
+}
+
+.ion-ios-circle-outline:before {
+    content: "\f401";
+}
+
+.ion-ios-clock:before {
+    content: "\f403";
+}
+
+.ion-ios-clock-outline:before {
+    content: "\f402";
+}
+
+.ion-ios-close:before {
+    content: "\f406";
+}
+
+.ion-ios-close-empty:before {
+    content: "\f404";
+}
+
+.ion-ios-close-outline:before {
+    content: "\f405";
+}
+
+.ion-ios-cloud:before {
+    content: "\f40c";
+}
+
+.ion-ios-cloud-download:before {
+    content: "\f408";
+}
+
+.ion-ios-cloud-download-outline:before {
+    content: "\f407";
+}
+
+.ion-ios-cloud-outline:before {
+    content: "\f409";
+}
+
+.ion-ios-cloud-upload:before {
+    content: "\f40b";
+}
+
+.ion-ios-cloud-upload-outline:before {
+    content: "\f40a";
+}
+
+.ion-ios-cloudy:before {
+    content: "\f410";
+}
+
+.ion-ios-cloudy-night:before {
+    content: "\f40e";
+}
+
+.ion-ios-cloudy-night-outline:before {
+    content: "\f40d";
+}
+
+.ion-ios-cloudy-outline:before {
+    content: "\f40f";
+}
+
+.ion-ios-cog:before {
+    content: "\f412";
+}
+
+.ion-ios-cog-outline:before {
+    content: "\f411";
+}
+
+.ion-ios-color-filter:before {
+    content: "\f414";
+}
+
+.ion-ios-color-filter-outline:before {
+    content: "\f413";
+}
+
+.ion-ios-color-wand:before {
+    content: "\f416";
+}
+
+.ion-ios-color-wand-outline:before {
+    content: "\f415";
+}
+
+.ion-ios-compose:before {
+    content: "\f418";
+}
+
+.ion-ios-compose-outline:before {
+    content: "\f417";
+}
+
+.ion-ios-contact:before {
+    content: "\f41a";
+}
+
+.ion-ios-contact-outline:before {
+    content: "\f419";
+}
+
+.ion-ios-copy:before {
+    content: "\f41c";
+}
+
+.ion-ios-copy-outline:before {
+    content: "\f41b";
+}
+
+.ion-ios-crop:before {
+    content: "\f41e";
+}
+
+.ion-ios-crop-strong:before {
+    content: "\f41d";
+}
+
+.ion-ios-download:before {
+    content: "\f420";
+}
+
+.ion-ios-download-outline:before {
+    content: "\f41f";
+}
+
+.ion-ios-drag:before {
+    content: "\f421";
+}
+
+.ion-ios-email:before {
+    content: "\f423";
+}
+
+.ion-ios-email-outline:before {
+    content: "\f422";
+}
+
+.ion-ios-eye:before {
+    content: "\f425";
+}
+
+.ion-ios-eye-outline:before {
+    content: "\f424";
+}
+
+.ion-ios-fastforward:before {
+    content: "\f427";
+}
+
+.ion-ios-fastforward-outline:before {
+    content: "\f426";
+}
+
+.ion-ios-filing:before {
+    content: "\f429";
+}
+
+.ion-ios-filing-outline:before {
+    content: "\f428";
+}
+
+.ion-ios-film:before {
+    content: "\f42b";
+}
+
+.ion-ios-film-outline:before {
+    content: "\f42a";
+}
+
+.ion-ios-flag:before {
+    content: "\f42d";
+}
+
+.ion-ios-flag-outline:before {
+    content: "\f42c";
+}
+
+.ion-ios-flame:before {
+    content: "\f42f";
+}
+
+.ion-ios-flame-outline:before {
+    content: "\f42e";
+}
+
+.ion-ios-flask:before {
+    content: "\f431";
+}
+
+.ion-ios-flask-outline:before {
+    content: "\f430";
+}
+
+.ion-ios-flower:before {
+    content: "\f433";
+}
+
+.ion-ios-flower-outline:before {
+    content: "\f432";
+}
+
+.ion-ios-folder:before {
+    content: "\f435";
+}
+
+.ion-ios-folder-outline:before {
+    content: "\f434";
+}
+
+.ion-ios-football:before {
+    content: "\f437";
+}
+
+.ion-ios-football-outline:before {
+    content: "\f436";
+}
+
+.ion-ios-game-controller-a:before {
+    content: "\f439";
+}
+
+.ion-ios-game-controller-a-outline:before {
+    content: "\f438";
+}
+
+.ion-ios-game-controller-b:before {
+    content: "\f43b";
+}
+
+.ion-ios-game-controller-b-outline:before {
+    content: "\f43a";
+}
+
+.ion-ios-gear:before {
+    content: "\f43d";
+}
+
+.ion-ios-gear-outline:before {
+    content: "\f43c";
+}
+
+.ion-ios-glasses:before {
+    content: "\f43f";
+}
+
+.ion-ios-glasses-outline:before {
+    content: "\f43e";
+}
+
+.ion-ios-grid-view:before {
+    content: "\f441";
+}
+
+.ion-ios-grid-view-outline:before {
+    content: "\f440";
+}
+
+.ion-ios-heart:before {
+    content: "\f443";
+}
+
+.ion-ios-heart-outline:before {
+    content: "\f442";
+}
+
+.ion-ios-help:before {
+    content: "\f446";
+}
+
+.ion-ios-help-empty:before {
+    content: "\f444";
+}
+
+.ion-ios-help-outline:before {
+    content: "\f445";
+}
+
+.ion-ios-home:before {
+    content: "\f448";
+}
+
+.ion-ios-home-outline:before {
+    content: "\f447";
+}
+
+.ion-ios-infinite:before {
+    content: "\f44a";
+}
+
+.ion-ios-infinite-outline:before {
+    content: "\f449";
+}
+
+.ion-ios-information:before {
+    content: "\f44d";
+}
+
+.ion-ios-information-empty:before {
+    content: "\f44b";
+}
+
+.ion-ios-information-outline:before {
+    content: "\f44c";
+}
+
+.ion-ios-ionic-outline:before {
+    content: "\f44e";
+}
+
+.ion-ios-keypad:before {
+    content: "\f450";
+}
+
+.ion-ios-keypad-outline:before {
+    content: "\f44f";
+}
+
+.ion-ios-lightbulb:before {
+    content: "\f452";
+}
+
+.ion-ios-lightbulb-outline:before {
+    content: "\f451";
+}
+
+.ion-ios-list:before {
+    content: "\f454";
+}
+
+.ion-ios-list-outline:before {
+    content: "\f453";
+}
+
+.ion-ios-location:before {
+    content: "\f456";
+}
+
+.ion-ios-location-outline:before {
+    content: "\f455";
+}
+
+.ion-ios-locked:before {
+    content: "\f458";
+}
+
+.ion-ios-locked-outline:before {
+    content: "\f457";
+}
+
+.ion-ios-loop:before {
+    content: "\f45a";
+}
+
+.ion-ios-loop-strong:before {
+    content: "\f459";
+}
+
+.ion-ios-medical:before {
+    content: "\f45c";
+}
+
+.ion-ios-medical-outline:before {
+    content: "\f45b";
+}
+
+.ion-ios-medkit:before {
+    content: "\f45e";
+}
+
+.ion-ios-medkit-outline:before {
+    content: "\f45d";
+}
+
+.ion-ios-mic:before {
+    content: "\f461";
+}
+
+.ion-ios-mic-off:before {
+    content: "\f45f";
+}
+
+.ion-ios-mic-outline:before {
+    content: "\f460";
+}
+
+.ion-ios-minus:before {
+    content: "\f464";
+}
+
+.ion-ios-minus-empty:before {
+    content: "\f462";
+}
+
+.ion-ios-minus-outline:before {
+    content: "\f463";
+}
+
+.ion-ios-monitor:before {
+    content: "\f466";
+}
+
+.ion-ios-monitor-outline:before {
+    content: "\f465";
+}
+
+.ion-ios-moon:before {
+    content: "\f468";
+}
+
+.ion-ios-moon-outline:before {
+    content: "\f467";
+}
+
+.ion-ios-more:before {
+    content: "\f46a";
+}
+
+.ion-ios-more-outline:before {
+    content: "\f469";
+}
+
+.ion-ios-musical-note:before {
+    content: "\f46b";
+}
+
+.ion-ios-musical-notes:before {
+    content: "\f46c";
+}
+
+.ion-ios-navigate:before {
+    content: "\f46e";
+}
+
+.ion-ios-navigate-outline:before {
+    content: "\f46d";
+}
+
+.ion-ios-nutrition:before {
+    content: "\f470";
+}
+
+.ion-ios-nutrition-outline:before {
+    content: "\f46f";
+}
+
+.ion-ios-paper:before {
+    content: "\f472";
+}
+
+.ion-ios-paper-outline:before {
+    content: "\f471";
+}
+
+.ion-ios-paperplane:before {
+    content: "\f474";
+}
+
+.ion-ios-paperplane-outline:before {
+    content: "\f473";
+}
+
+.ion-ios-partlysunny:before {
+    content: "\f476";
+}
+
+.ion-ios-partlysunny-outline:before {
+    content: "\f475";
+}
+
+.ion-ios-pause:before {
+    content: "\f478";
+}
+
+.ion-ios-pause-outline:before {
+    content: "\f477";
+}
+
+.ion-ios-paw:before {
+    content: "\f47a";
+}
+
+.ion-ios-paw-outline:before {
+    content: "\f479";
+}
+
+.ion-ios-people:before {
+    content: "\f47c";
+}
+
+.ion-ios-people-outline:before {
+    content: "\f47b";
+}
+
+.ion-ios-person:before {
+    content: "\f47e";
+}
+
+.ion-ios-person-outline:before {
+    content: "\f47d";
+}
+
+.ion-ios-personadd:before {
+    content: "\f480";
+}
+
+.ion-ios-personadd-outline:before {
+    content: "\f47f";
+}
+
+.ion-ios-photos:before {
+    content: "\f482";
+}
+
+.ion-ios-photos-outline:before {
+    content: "\f481";
+}
+
+.ion-ios-pie:before {
+    content: "\f484";
+}
+
+.ion-ios-pie-outline:before {
+    content: "\f483";
+}
+
+.ion-ios-pint:before {
+    content: "\f486";
+}
+
+.ion-ios-pint-outline:before {
+    content: "\f485";
+}
+
+.ion-ios-play:before {
+    content: "\f488";
+}
+
+.ion-ios-play-outline:before {
+    content: "\f487";
+}
+
+.ion-ios-plus:before {
+    content: "\f48b";
+}
+
+.ion-ios-plus-empty:before {
+    content: "\f489";
+}
+
+.ion-ios-plus-outline:before {
+    content: "\f48a";
+}
+
+.ion-ios-pricetag:before {
+    content: "\f48d";
+}
+
+.ion-ios-pricetag-outline:before {
+    content: "\f48c";
+}
+
+.ion-ios-pricetags:before {
+    content: "\f48f";
+}
+
+.ion-ios-pricetags-outline:before {
+    content: "\f48e";
+}
+
+.ion-ios-printer:before {
+    content: "\f491";
+}
+
+.ion-ios-printer-outline:before {
+    content: "\f490";
+}
+
+.ion-ios-pulse:before {
+    content: "\f493";
+}
+
+.ion-ios-pulse-strong:before {
+    content: "\f492";
+}
+
+.ion-ios-rainy:before {
+    content: "\f495";
+}
+
+.ion-ios-rainy-outline:before {
+    content: "\f494";
+}
+
+.ion-ios-recording:before {
+    content: "\f497";
+}
+
+.ion-ios-recording-outline:before {
+    content: "\f496";
+}
+
+.ion-ios-redo:before {
+    content: "\f499";
+}
+
+.ion-ios-redo-outline:before {
+    content: "\f498";
+}
+
+.ion-ios-refresh:before {
+    content: "\f49c";
+}
+
+.ion-ios-refresh-empty:before {
+    content: "\f49a";
+}
+
+.ion-ios-refresh-outline:before {
+    content: "\f49b";
+}
+
+.ion-ios-reload:before {
+    content: "\f49d";
+}
+
+.ion-ios-reverse-camera:before {
+    content: "\f49f";
+}
+
+.ion-ios-reverse-camera-outline:before {
+    content: "\f49e";
+}
+
+.ion-ios-rewind:before {
+    content: "\f4a1";
+}
+
+.ion-ios-rewind-outline:before {
+    content: "\f4a0";
+}
+
+.ion-ios-rose:before {
+    content: "\f4a3";
+}
+
+.ion-ios-rose-outline:before {
+    content: "\f4a2";
+}
+
+.ion-ios-search:before {
+    content: "\f4a5";
+}
+
+.ion-ios-search-strong:before {
+    content: "\f4a4";
+}
+
+.ion-ios-settings:before {
+    content: "\f4a7";
+}
+
+.ion-ios-settings-strong:before {
+    content: "\f4a6";
+}
+
+.ion-ios-shuffle:before {
+    content: "\f4a9";
+}
+
+.ion-ios-shuffle-strong:before {
+    content: "\f4a8";
+}
+
+.ion-ios-skipbackward:before {
+    content: "\f4ab";
+}
+
+.ion-ios-skipbackward-outline:before {
+    content: "\f4aa";
+}
+
+.ion-ios-skipforward:before {
+    content: "\f4ad";
+}
+
+.ion-ios-skipforward-outline:before {
+    content: "\f4ac";
+}
+
+.ion-ios-snowy:before {
+    content: "\f4ae";
+}
+
+.ion-ios-speedometer:before {
+    content: "\f4b0";
+}
+
+.ion-ios-speedometer-outline:before {
+    content: "\f4af";
+}
+
+.ion-ios-star:before {
+    content: "\f4b3";
+}
+
+.ion-ios-star-half:before {
+    content: "\f4b1";
+}
+
+.ion-ios-star-outline:before {
+    content: "\f4b2";
+}
+
+.ion-ios-stopwatch:before {
+    content: "\f4b5";
+}
+
+.ion-ios-stopwatch-outline:before {
+    content: "\f4b4";
+}
+
+.ion-ios-sunny:before {
+    content: "\f4b7";
+}
+
+.ion-ios-sunny-outline:before {
+    content: "\f4b6";
+}
+
+.ion-ios-telephone:before {
+    content: "\f4b9";
+}
+
+.ion-ios-telephone-outline:before {
+    content: "\f4b8";
+}
+
+.ion-ios-tennisball:before {
+    content: "\f4bb";
+}
+
+.ion-ios-tennisball-outline:before {
+    content: "\f4ba";
+}
+
+.ion-ios-thunderstorm:before {
+    content: "\f4bd";
+}
+
+.ion-ios-thunderstorm-outline:before {
+    content: "\f4bc";
+}
+
+.ion-ios-time:before {
+    content: "\f4bf";
+}
+
+.ion-ios-time-outline:before {
+    content: "\f4be";
+}
+
+.ion-ios-timer:before {
+    content: "\f4c1";
+}
+
+.ion-ios-timer-outline:before {
+    content: "\f4c0";
+}
+
+.ion-ios-toggle:before {
+    content: "\f4c3";
+}
+
+.ion-ios-toggle-outline:before {
+    content: "\f4c2";
+}
+
+.ion-ios-trash:before {
+    content: "\f4c5";
+}
+
+.ion-ios-trash-outline:before {
+    content: "\f4c4";
+}
+
+.ion-ios-undo:before {
+    content: "\f4c7";
+}
+
+.ion-ios-undo-outline:before {
+    content: "\f4c6";
+}
+
+.ion-ios-unlocked:before {
+    content: "\f4c9";
+}
+
+.ion-ios-unlocked-outline:before {
+    content: "\f4c8";
+}
+
+.ion-ios-upload:before {
+    content: "\f4cb";
+}
+
+.ion-ios-upload-outline:before {
+    content: "\f4ca";
+}
+
+.ion-ios-videocam:before {
+    content: "\f4cd";
+}
+
+.ion-ios-videocam-outline:before {
+    content: "\f4cc";
+}
+
+.ion-ios-volume-high:before {
+    content: "\f4ce";
+}
+
+.ion-ios-volume-low:before {
+    content: "\f4cf";
+}
+
+.ion-ios-wineglass:before {
+    content: "\f4d1";
+}
+
+.ion-ios-wineglass-outline:before {
+    content: "\f4d0";
+}
+
+.ion-ios-world:before {
+    content: "\f4d3";
+}
+
+.ion-ios-world-outline:before {
+    content: "\f4d2";
+}
+
+.ion-ipad:before {
+    content: "\f1f9";
+}
+
+.ion-iphone:before {
+    content: "\f1fa";
+}
+
+.ion-ipod:before {
+    content: "\f1fb";
+}
+
+.ion-jet:before {
+    content: "\f295";
+}
+
+.ion-key:before {
+    content: "\f296";
+}
+
+.ion-knife:before {
+    content: "\f297";
+}
+
+.ion-laptop:before {
+    content: "\f1fc";
+}
+
+.ion-leaf:before {
+    content: "\f1fd";
+}
+
+.ion-levels:before {
+    content: "\f298";
+}
+
+.ion-lightbulb:before {
+    content: "\f299";
+}
+
+.ion-link:before {
+    content: "\f1fe";
+}
+
+.ion-load-a:before {
+    content: "\f29a";
+}
+
+.ion-load-b:before {
+    content: "\f29b";
+}
+
+.ion-load-c:before {
+    content: "\f29c";
+}
+
+.ion-load-d:before {
+    content: "\f29d";
+}
+
+.ion-location:before {
+    content: "\f1ff";
+}
+
+.ion-lock-combination:before {
+    content: "\f4d4";
+}
+
+.ion-locked:before {
+    content: "\f200";
+}
+
+.ion-log-in:before {
+    content: "\f29e";
+}
+
+.ion-log-out:before {
+    content: "\f29f";
+}
+
+.ion-loop:before {
+    content: "\f201";
+}
+
+.ion-magnet:before {
+    content: "\f2a0";
+}
+
+.ion-male:before {
+    content: "\f2a1";
+}
+
+.ion-man:before {
+    content: "\f202";
+}
+
+.ion-map:before {
+    content: "\f203";
+}
+
+.ion-medkit:before {
+    content: "\f2a2";
+}
+
+.ion-merge:before {
+    content: "\f33f";
+}
+
+.ion-mic-a:before {
+    content: "\f204";
+}
+
+.ion-mic-b:before {
+    content: "\f205";
+}
+
+.ion-mic-c:before {
+    content: "\f206";
+}
+
+.ion-minus:before {
+    content: "\f209";
+}
+
+.ion-minus-circled:before {
+    content: "\f207";
+}
+
+.ion-minus-round:before {
+    content: "\f208";
+}
+
+.ion-model-s:before {
+    content: "\f2c1";
+}
+
+.ion-monitor:before {
+    content: "\f20a";
+}
+
+.ion-more:before {
+    content: "\f20b";
+}
+
+.ion-mouse:before {
+    content: "\f340";
+}
+
+.ion-music-note:before {
+    content: "\f20c";
+}
+
+.ion-navicon:before {
+    content: "\f20e";
+}
+
+.ion-navicon-round:before {
+    content: "\f20d";
+}
+
+.ion-navigate:before {
+    content: "\f2a3";
+}
+
+.ion-network:before {
+    content: "\f341";
+}
+
+.ion-no-smoking:before {
+    content: "\f2c2";
+}
+
+.ion-nuclear:before {
+    content: "\f2a4";
+}
+
+.ion-outlet:before {
+    content: "\f342";
+}
+
+.ion-paintbrush:before {
+    content: "\f4d5";
+}
+
+.ion-paintbucket:before {
+    content: "\f4d6";
+}
+
+.ion-paper-airplane:before {
+    content: "\f2c3";
+}
+
+.ion-paperclip:before {
+    content: "\f20f";
+}
+
+.ion-pause:before {
+    content: "\f210";
+}
+
+.ion-person:before {
+    content: "\f213";
+}
+
+.ion-person-add:before {
+    content: "\f211";
+}
+
+.ion-person-stalker:before {
+    content: "\f212";
+}
+
+.ion-pie-graph:before {
+    content: "\f2a5";
+}
+
+.ion-pin:before {
+    content: "\f2a6";
+}
+
+.ion-pinpoint:before {
+    content: "\f2a7";
+}
+
+.ion-pizza:before {
+    content: "\f2a8";
+}
+
+.ion-plane:before {
+    content: "\f214";
+}
+
+.ion-planet:before {
+    content: "\f343";
+}
+
+.ion-play:before {
+    content: "\f215";
+}
+
+.ion-playstation:before {
+    content: "\f30a";
+}
+
+.ion-plus:before {
+    content: "\f218";
+}
+
+.ion-plus-circled:before {
+    content: "\f216";
+}
+
+.ion-plus-round:before {
+    content: "\f217";
+}
+
+.ion-podium:before {
+    content: "\f344";
+}
+
+.ion-pound:before {
+    content: "\f219";
+}
+
+.ion-power:before {
+    content: "\f2a9";
+}
+
+.ion-pricetag:before {
+    content: "\f2aa";
+}
+
+.ion-pricetags:before {
+    content: "\f2ab";
+}
+
+.ion-printer:before {
+    content: "\f21a";
+}
+
+.ion-pull-request:before {
+    content: "\f345";
+}
+
+.ion-qr-scanner:before {
+    content: "\f346";
+}
+
+.ion-quote:before {
+    content: "\f347";
+}
+
+.ion-radio-waves:before {
+    content: "\f2ac";
+}
+
+.ion-record:before {
+    content: "\f21b";
+}
+
+.ion-refresh:before {
+    content: "\f21c";
+}
+
+.ion-reply:before {
+    content: "\f21e";
+}
+
+.ion-reply-all:before {
+    content: "\f21d";
+}
+
+.ion-ribbon-a:before {
+    content: "\f348";
+}
+
+.ion-ribbon-b:before {
+    content: "\f349";
+}
+
+.ion-sad:before {
+    content: "\f34a";
+}
+
+.ion-sad-outline:before {
+    content: "\f4d7";
+}
+
+.ion-scissors:before {
+    content: "\f34b";
+}
+
+.ion-search:before {
+    content: "\f21f";
+}
+
+.ion-settings:before {
+    content: "\f2ad";
+}
+
+.ion-share:before {
+    content: "\f220";
+}
+
+.ion-shuffle:before {
+    content: "\f221";
+}
+
+.ion-skip-backward:before {
+    content: "\f222";
+}
+
+.ion-skip-forward:before {
+    content: "\f223";
+}
+
+.ion-social-android:before {
+    content: "\f225";
+}
+
+.ion-social-android-outline:before {
+    content: "\f224";
+}
+
+.ion-social-angular:before {
+    content: "\f4d9";
+}
+
+.ion-social-angular-outline:before {
+    content: "\f4d8";
+}
+
+.ion-social-apple:before {
+    content: "\f227";
+}
+
+.ion-social-apple-outline:before {
+    content: "\f226";
+}
+
+.ion-social-bitcoin:before {
+    content: "\f2af";
+}
+
+.ion-social-bitcoin-outline:before {
+    content: "\f2ae";
+}
+
+.ion-social-buffer:before {
+    content: "\f229";
+}
+
+.ion-social-buffer-outline:before {
+    content: "\f228";
+}
+
+.ion-social-chrome:before {
+    content: "\f4db";
+}
+
+.ion-social-chrome-outline:before {
+    content: "\f4da";
+}
+
+.ion-social-codepen:before {
+    content: "\f4dd";
+}
+
+.ion-social-codepen-outline:before {
+    content: "\f4dc";
+}
+
+.ion-social-css3:before {
+    content: "\f4df";
+}
+
+.ion-social-css3-outline:before {
+    content: "\f4de";
+}
+
+.ion-social-designernews:before {
+    content: "\f22b";
+}
+
+.ion-social-designernews-outline:before {
+    content: "\f22a";
+}
+
+.ion-social-dribbble:before {
+    content: "\f22d";
+}
+
+.ion-social-dribbble-outline:before {
+    content: "\f22c";
+}
+
+.ion-social-dropbox:before {
+    content: "\f22f";
+}
+
+.ion-social-dropbox-outline:before {
+    content: "\f22e";
+}
+
+.ion-social-euro:before {
+    content: "\f4e1";
+}
+
+.ion-social-euro-outline:before {
+    content: "\f4e0";
+}
+
+.ion-social-facebook:before {
+    content: "\f231";
+}
+
+.ion-social-facebook-outline:before {
+    content: "\f230";
+}
+
+.ion-social-foursquare:before {
+    content: "\f34d";
+}
+
+.ion-social-foursquare-outline:before {
+    content: "\f34c";
+}
+
+.ion-social-freebsd-devil:before {
+    content: "\f2c4";
+}
+
+.ion-social-github:before {
+    content: "\f233";
+}
+
+.ion-social-github-outline:before {
+    content: "\f232";
+}
+
+.ion-social-google:before {
+    content: "\f34f";
+}
+
+.ion-social-google-outline:before {
+    content: "\f34e";
+}
+
+.ion-social-googleplus:before {
+    content: "\f235";
+}
+
+.ion-social-googleplus-outline:before {
+    content: "\f234";
+}
+
+.ion-social-hackernews:before {
+    content: "\f237";
+}
+
+.ion-social-hackernews-outline:before {
+    content: "\f236";
+}
+
+.ion-social-html5:before {
+    content: "\f4e3";
+}
+
+.ion-social-html5-outline:before {
+    content: "\f4e2";
+}
+
+.ion-social-instagram:before {
+    content: "\f351";
+}
+
+.ion-social-instagram-outline:before {
+    content: "\f350";
+}
+
+.ion-social-javascript:before {
+    content: "\f4e5";
+}
+
+.ion-social-javascript-outline:before {
+    content: "\f4e4";
+}
+
+.ion-social-linkedin:before {
+    content: "\f239";
+}
+
+.ion-social-linkedin-outline:before {
+    content: "\f238";
+}
+
+.ion-social-markdown:before {
+    content: "\f4e6";
+}
+
+.ion-social-nodejs:before {
+    content: "\f4e7";
+}
+
+.ion-social-octocat:before {
+    content: "\f4e8";
+}
+
+.ion-social-pinterest:before {
+    content: "\f2b1";
+}
+
+.ion-social-pinterest-outline:before {
+    content: "\f2b0";
+}
+
+.ion-social-python:before {
+    content: "\f4e9";
+}
+
+.ion-social-reddit:before {
+    content: "\f23b";
+}
+
+.ion-social-reddit-outline:before {
+    content: "\f23a";
+}
+
+.ion-social-rss:before {
+    content: "\f23d";
+}
+
+.ion-social-rss-outline:before {
+    content: "\f23c";
+}
+
+.ion-social-sass:before {
+    content: "\f4ea";
+}
+
+.ion-social-skype:before {
+    content: "\f23f";
+}
+
+.ion-social-skype-outline:before {
+    content: "\f23e";
+}
+
+.ion-social-snapchat:before {
+    content: "\f4ec";
+}
+
+.ion-social-snapchat-outline:before {
+    content: "\f4eb";
+}
+
+.ion-social-tumblr:before {
+    content: "\f241";
+}
+
+.ion-social-tumblr-outline:before {
+    content: "\f240";
+}
+
+.ion-social-tux:before {
+    content: "\f2c5";
+}
+
+.ion-social-twitch:before {
+    content: "\f4ee";
+}
+
+.ion-social-twitch-outline:before {
+    content: "\f4ed";
+}
+
+.ion-social-twitter:before {
+    content: "\f243";
+}
+
+.ion-social-twitter-outline:before {
+    content: "\f242";
+}
+
+.ion-social-usd:before {
+    content: "\f353";
+}
+
+.ion-social-usd-outline:before {
+    content: "\f352";
+}
+
+.ion-social-vimeo:before {
+    content: "\f245";
+}
+
+.ion-social-vimeo-outline:before {
+    content: "\f244";
+}
+
+.ion-social-whatsapp:before {
+    content: "\f4f0";
+}
+
+.ion-social-whatsapp-outline:before {
+    content: "\f4ef";
+}
+
+.ion-social-windows:before {
+    content: "\f247";
+}
+
+.ion-social-windows-outline:before {
+    content: "\f246";
+}
+
+.ion-social-wordpress:before {
+    content: "\f249";
+}
+
+.ion-social-wordpress-outline:before {
+    content: "\f248";
+}
+
+.ion-social-yahoo:before {
+    content: "\f24b";
+}
+
+.ion-social-yahoo-outline:before {
+    content: "\f24a";
+}
+
+.ion-social-yen:before {
+    content: "\f4f2";
+}
+
+.ion-social-yen-outline:before {
+    content: "\f4f1";
+}
+
+.ion-social-youtube:before {
+    content: "\f24d";
+}
+
+.ion-social-youtube-outline:before {
+    content: "\f24c";
+}
+
+.ion-soup-can:before {
+    content: "\f4f4";
+}
+
+.ion-soup-can-outline:before {
+    content: "\f4f3";
+}
+
+.ion-speakerphone:before {
+    content: "\f2b2";
+}
+
+.ion-speedometer:before {
+    content: "\f2b3";
+}
+
+.ion-spoon:before {
+    content: "\f2b4";
+}
+
+.ion-star:before {
+    content: "\f24e";
+}
+
+.ion-stats-bars:before {
+    content: "\f2b5";
+}
+
+.ion-steam:before {
+    content: "\f30b";
+}
+
+.ion-stop:before {
+    content: "\f24f";
+}
+
+.ion-thermometer:before {
+    content: "\f2b6";
+}
+
+.ion-thumbsdown:before {
+    content: "\f250";
+}
+
+.ion-thumbsup:before {
+    content: "\f251";
+}
+
+.ion-toggle:before {
+    content: "\f355";
+}
+
+.ion-toggle-filled:before {
+    content: "\f354";
+}
+
+.ion-transgender:before {
+    content: "\f4f5";
+}
+
+.ion-trash-a:before {
+    content: "\f252";
+}
+
+.ion-trash-b:before {
+    content: "\f253";
+}
+
+.ion-trophy:before {
+    content: "\f356";
+}
+
+.ion-tshirt:before {
+    content: "\f4f7";
+}
+
+.ion-tshirt-outline:before {
+    content: "\f4f6";
+}
+
+.ion-umbrella:before {
+    content: "\f2b7";
+}
+
+.ion-university:before {
+    content: "\f357";
+}
+
+.ion-unlocked:before {
+    content: "\f254";
+}
+
+.ion-upload:before {
+    content: "\f255";
+}
+
+.ion-usb:before {
+    content: "\f2b8";
+}
+
+.ion-videocamera:before {
+    content: "\f256";
+}
+
+.ion-volume-high:before {
+    content: "\f257";
+}
+
+.ion-volume-low:before {
+    content: "\f258";
+}
+
+.ion-volume-medium:before {
+    content: "\f259";
+}
+
+.ion-volume-mute:before {
+    content: "\f25a";
+}
+
+.ion-wand:before {
+    content: "\f358";
+}
+
+.ion-waterdrop:before {
+    content: "\f25b";
+}
+
+.ion-wifi:before {
+    content: "\f25c";
+}
+
+.ion-wineglass:before {
+    content: "\f2b9";
+}
+
+.ion-woman:before {
+    content: "\f25d";
+}
+
+.ion-wrench:before {
+    content: "\f2ba";
+}
+
+.ion-xbox:before {
+    content: "\f30c";
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.eot b/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.eot
new file mode 100644 (file)
index 0000000..92a3f20
Binary files /dev/null and b/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.eot differ
diff --git a/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.svg b/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.svg
new file mode 100644 (file)
index 0000000..49fc8f3
--- /dev/null
@@ -0,0 +1,2230 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2014-12-4: Created.
+-->
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+Created by FontForge 20120731 at Thu Dec  4 09:51:48 2014
+ By Adam Bradley
+Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net)
+</metadata>
+<defs>
+<font id="Ionicons" horiz-adv-x="448" >
+  <font-face 
+    font-family="Ionicons"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="512"
+    panose-1="2 0 6 3 0 0 0 0 0 0"
+    ascent="448"
+    descent="-64"
+    bbox="-0.54049 -64 512.487 448"
+    underline-thickness="25.6"
+    underline-position="-51.2"
+    unicode-range="U+F100-F4F7"
+  />
+    <missing-glyph />
+    <glyph glyph-name="ion-alert-circled" unicode="&#xf100;" 
+d="M445 26c3 -5 5 -13 2 -18s-8 -8 -14 -8h-418c-6 0 -11 3 -14 8s-1 13 2 18l207 349c3 5 8 9 14 9s11 -4 14 -9zM256 48v48h-64v-48h64zM256 128v144h-64v-144h64z" />
+    <glyph glyph-name="ion-alert" unicode="&#xf101;" horiz-adv-x="128" 
+d="M128 -32h-128v96h128v-96zM112 128h-96l-16 288h128z" />
+    <glyph glyph-name="ion-android-add-circle" unicode="&#xf359;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM315 171v42h-86v86h-42v-86h-86v-42h86v-86h42v86h86z" />
+    <glyph glyph-name="ion-android-add" unicode="&#xf2c7;" horiz-adv-x="320" 
+d="M320 171h-139v-139h-42v139h-139v42h139v139h42v-139h139v-42z" />
+    <glyph glyph-name="ion-android-alarm-clock" unicode="&#xf35a;" horiz-adv-x="428" 
+d="M428 323l-28 -33l-98 82l28 33zM125 373l-97 -83l-28 33l97 83zM225 275v0v-111l85 -50l-16 -27l-101 61v127h32zM214 360c106 0 193 -86 193 -191s-87 -191 -193 -191c-107 0 -193 86 -193 191s86 191 193 191zM214 20c82 0 150 66 150 149c0 82 -68 149 -150 149
+s-150 -67 -150 -149s68 -149 150 -149z" />
+    <glyph glyph-name="ion-android-alert" unicode="&#xf35b;" horiz-adv-x="416" 
+d="M208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM232 88v40h-48v-40h48zM232 176v128h-48v-128h48z" />
+    <glyph glyph-name="ion-android-apps" unicode="&#xf35c;" horiz-adv-x="320" 
+d="M0 272v80h80v-80h-80zM120 32v80h80v-80h-80zM0 32v80h80v-80h-80zM0 152v80h80v-80h-80zM120 152v80h80v-80h-80zM240 352h80v-80h-80v80zM120 272v80h80v-80h-80zM240 152v80h80v-80h-80zM240 32v80h80v-80h-80z" />
+    <glyph glyph-name="ion-android-archive" unicode="&#xf2c9;" horiz-adv-x="416" 
+d="M406 348c7 -7 10 -17 10 -29v-289c0 -25 -21 -46 -46 -46h-324c-25 0 -46 21 -46 46v289c0 12 3 22 10 29l33 39c6 8 16 13 26 13h278c10 0 20 -5 26 -13zM208 65l127 127h-81v46h-92v-46h-81zM49 354h317l-22 23h-277z" />
+    <glyph glyph-name="ion-android-arrow-back" unicode="&#xf2ca;" horiz-adv-x="342" 
+d="M342 213v-42h-260l119 -120l-30 -30l-171 171l171 171l31 -30l-120 -120h260z" />
+    <glyph glyph-name="ion-android-arrow-down" unicode="&#xf35d;" horiz-adv-x="342" 
+d="M192 363v-260l120 120l30 -31l-171 -171l-171 171l30 30l120 -119v260h42z" />
+    <glyph glyph-name="ion-android-arrow-dropdown-circle" unicode="&#xf35e;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 128l96 96h-192z" />
+    <glyph glyph-name="ion-android-arrow-dropdown" unicode="&#xf35f;" horiz-adv-x="256" 
+d="M0 256h256l-128 -128z" />
+    <glyph glyph-name="ion-android-arrow-dropleft-circle" unicode="&#xf360;" horiz-adv-x="416" 
+d="M416 192c0 -115 -93 -208 -208 -208s-208 93 -208 208s93 208 208 208s208 -93 208 -208zM144 192l96 -96v192z" />
+    <glyph glyph-name="ion-android-arrow-dropleft" unicode="&#xf361;" horiz-adv-x="128" 
+d="M128 320v-256l-128 128z" />
+    <glyph glyph-name="ion-android-arrow-dropright-circle" unicode="&#xf362;" horiz-adv-x="416" 
+d="M208 -16c-115 0 -208 93 -208 208s93 208 208 208s208 -93 208 -208s-93 -208 -208 -208zM176 96l96 96l-96 96v-192z" />
+    <glyph glyph-name="ion-android-arrow-dropright" unicode="&#xf363;" horiz-adv-x="128" 
+d="M0 320l128 -128l-128 -128v256z" />
+    <glyph glyph-name="ion-android-arrow-dropup-circle" unicode="&#xf364;" horiz-adv-x="416" 
+d="M416 192c0 -115 -93 -208 -208 -208s-208 93 -208 208s93 208 208 208s208 -93 208 -208zM304 160l-96 96l-96 -96h192z" />
+    <glyph glyph-name="ion-android-arrow-dropup" unicode="&#xf365;" horiz-adv-x="256" 
+d="M0 128l128 128l128 -128h-256z" />
+    <glyph glyph-name="ion-android-arrow-forward" unicode="&#xf30f;" horiz-adv-x="342" 
+d="M0 171v42h260l-119 120l30 30l171 -171l-171 -171l-31 30l120 120h-260z" />
+    <glyph glyph-name="ion-android-arrow-up" unicode="&#xf366;" horiz-adv-x="342" 
+d="M192 21h-42v260l-120 -119l-30 30l171 171l171 -171l-30 -31l-120 120v-260z" />
+    <glyph glyph-name="ion-android-attach" unicode="&#xf367;" horiz-adv-x="235" 
+d="M203 320h32v-235c0 -65 -53 -117 -118 -117s-117 52 -117 117v246c0 47 38 85 85 85s86 -38 86 -85v-246c0 -30 -24 -53 -54 -53s-53 23 -53 53v203h32v-203c0 -12 9 -21 21 -21s22 9 22 21v246c0 30 -24 53 -54 53s-53 -23 -53 -53v-246c0 -47 38 -85 85 -85
+s86 38 86 85v235z" />
+    <glyph glyph-name="ion-android-bar" unicode="&#xf368;" horiz-adv-x="384" 
+d="M171 171l-171 170v43h384v-43l-171 -170v-131h107v-40h-256v40h107v131zM96 299h192l43 42h-278z" />
+    <glyph glyph-name="ion-android-bicycle" unicode="&#xf369;" 
+d="M299 317c-19 0 -34 14 -34 33s15 34 34 34s33 -15 33 -34s-14 -33 -33 -33zM355 187c51 0 93 -43 93 -94s-42 -93 -93 -93s-94 42 -94 93s43 94 94 94zM355 28c36 0 65 29 65 65s-29 66 -65 66s-66 -30 -66 -66s30 -65 66 -65zM274 224l-30 45l-43 -45l39 -32v-112h-32
+v86l-61 38c-9 6 -19 15 -19 27c0 8 3 17 9 23l72 69c6 6 14 9 22 9c11 0 22 -7 28 -16l34 -60h59v-32h-78zM93 187c51 0 94 -43 94 -94s-43 -93 -94 -93s-93 42 -93 93s42 94 93 94zM93 28c36 0 66 29 66 65s-30 66 -66 66s-65 -30 -65 -66s29 -65 65 -65z" />
+    <glyph glyph-name="ion-android-boat" unicode="&#xf36a;" 
+d="M52 35l-51 139c-2 6 -1 12 1 17s8 8 13 10l38 13v98c0 23 20 43 43 43h64l16 53h96l16 -53h64c23 0 43 -20 43 -43v-98l38 -13c5 -2 11 -5 13 -10s3 -12 1 -17l-51 -139h-1c-34 0 -65 20 -86 43c-21 -23 -51 -43 -85 -43s-64 19 -85 42c-21 -23 -52 -42 -86 -42h-1z
+M96 312v-84l128 41l128 -41v84h-256zM309 40c0 0 59 -64 107 -64h-21c-30 0 -59 12 -86 26c-53 -28 -117 -28 -170 0c-27 -14 -56 -26 -86 -26h-21c49 0 107 64 107 64c52 -36 118 -36 170 0z" />
+    <glyph glyph-name="ion-android-bookmark" unicode="&#xf36b;" horiz-adv-x="288" 
+d="M248 384c22 0 40 -18 40 -40v-344l-144 64l-144 -64v344c0 22 18 40 40 40h208z" />
+    <glyph glyph-name="ion-android-bulb" unicode="&#xf36c;" 
+d="M224 278c-25 0 -50 -10 -68 -28s-28 -43 -28 -68c0 -34 18 -66 48 -83l16 -10v-18v-71h64v71v18l16 10c15 8 27 20 35 34c9 15 13 31 13 49c0 25 -10 50 -28 68s-43 28 -68 28zM245 416v0v-64h-42v64h42zM374 362v0l30 -30l-38 -38l-30 30zM74 362v0l38 -38l-30 -30
+l-38 38zM224 310v0c70 0 128 -58 128 -128c0 -48 -26 -89 -64 -111v-103h-128v103c-38 22 -64 64 -64 111c0 70 58 128 128 128zM448 203v0v-42h-64v42h64zM64 203v0v-42h-64v42h64z" />
+    <glyph glyph-name="ion-android-bus" unicode="&#xf36d;" horiz-adv-x="352" 
+d="M0 96v204c0 75 82 84 176 84s176 -9 176 -84v-204c0 -18 -14 -24 -27 -36v-39c0 -12 -9 -21 -21 -21h-21c-12 0 -22 9 -22 21v22h-170v-22c0 -12 -10 -21 -22 -21h-21c-12 0 -21 9 -21 21v39c-13 12 -27 17 -27 36zM80 80c18 0 32 14 32 32s-14 32 -32 32
+s-32 -14 -32 -32s14 -32 32 -32zM272 80c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM304 203v106h-256v-106h256z" />
+    <glyph glyph-name="ion-android-calendar" unicode="&#xf2d1;" horiz-adv-x="384" 
+d="M304 176v-96h-96v96h96zM272 384h48v-32h24c22 0 40 -18 40 -40v-272c0 -22 -18 -40 -40 -40h-304c-22 0 -40 18 -40 40v272c0 22 18 40 40 40h24v32h48v-32h160v32zM344 40v212h-304v-212h304z" />
+    <glyph glyph-name="ion-android-call" unicode="&#xf2d2;" horiz-adv-x="384" 
+d="M363 117c12 0 21 -9 21 -21v-75c0 -12 -9 -21 -21 -21c-201 0 -363 162 -363 363c0 12 9 21 21 21h75c12 0 21 -9 21 -21c0 -27 4 -52 13 -77c2 -7 0 -16 -5 -21l-47 -47c31 -61 80 -110 141 -141l47 47c5 6 14 7 21 5c23 -7 49 -12 76 -12z" />
+    <glyph glyph-name="ion-android-camera" unicode="&#xf2d3;" 
+d="M161 168c0 42 21 63 63 63s63 -21 63 -63s-21 -63 -63 -63s-63 21 -63 63zM408 352c11 0 20 -4 28 -12s12 -17 12 -28v-272c0 -11 -4 -20 -12 -28s-17 -12 -28 -12h-368c-11 0 -20 4 -28 12s-12 17 -12 28v272c0 11 4 20 12 28s17 12 28 12h88l32 32h128l32 -32h88z
+M224 56c31 0 57 11 79 33s33 48 33 79s-11 57 -33 79s-48 33 -79 33s-57 -11 -79 -33s-33 -48 -33 -79s11 -57 33 -79s48 -33 79 -33z" />
+    <glyph glyph-name="ion-android-cancel" unicode="&#xf36e;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM312 117l-75 75l75 75l-29 29l-75 -75l-75 75l-29 -29l75 -75l-75 -75l29 -29l75 75l75 -75z" />
+    <glyph glyph-name="ion-android-car" unicode="&#xf36f;" horiz-adv-x="384" 
+d="M339 331l45 -118v-160c0 -12 -9 -21 -21 -21h-22c-12 0 -21 9 -21 21v11h-256v-11c0 -12 -9 -21 -21 -21h-22c-12 0 -21 9 -21 21v160l45 118c4 13 16 21 30 21h234c14 0 26 -8 30 -21zM75 128c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM309 128
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM43 235h298l-32 85h-234z" />
+    <glyph glyph-name="ion-android-cart" unicode="&#xf370;" horiz-adv-x="416" 
+d="M122 70c23 0 41 -18 41 -41s-18 -42 -41 -42s-42 19 -42 42s19 41 42 41zM0 397h68l19 -42h308c11 0 21 -9 21 -20c0 -4 -1 -8 -2 -10l-75 -129c-7 -14 -20 -22 -36 -22h-155l-21 -32s-2 -5 -2 -6c0 -3 2 -5 5 -5h238v-40h-243c-26 0 -45 14 -45 42c0 7 2 15 5 20l31 51
+l-74 151h-42v42zM326 70c23 0 42 -18 42 -41s-19 -42 -42 -42s-41 19 -41 42s18 41 41 41z" />
+    <glyph glyph-name="ion-android-chat" unicode="&#xf2d4;" horiz-adv-x="416" 
+d="M344 384c4 0 7 -4 7 -8v-214c0 -4 -3 -9 -7 -9h-187l-90 -89v89h-57c-4 0 -10 5 -10 9v214c0 4 6 8 10 8h334zM408 321c4 0 8 -5 8 -9v-214c0 -4 -4 -9 -8 -9h-57v-89l-90 89h-130l39 39h181c18 0 25 10 25 26v167h32z" />
+    <glyph glyph-name="ion-android-checkbox-blank" unicode="&#xf371;" horiz-adv-x="384" 
+d="M341 384c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298z" />
+    <glyph glyph-name="ion-android-checkbox-outline-blank" unicode="&#xf372;" horiz-adv-x="384" 
+d="M341 341h-298v-298h298v298zM341 384v0c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298z" />
+    <glyph glyph-name="ion-android-checkbox-outline" unicode="&#xf373;" horiz-adv-x="384" 
+d="M105 233l66 -66l183 183l30 -30l-213 -213l-96 96zM341 43v170h43v-170c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h213v-43h-213v-298h298z" />
+    <glyph glyph-name="ion-android-checkbox" unicode="&#xf374;" horiz-adv-x="384" 
+d="M341 384c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298zM149 85l192 192l-30 30l-162 -162l-76 77l-30 -30z" />
+    <glyph glyph-name="ion-android-checkmark-circle" unicode="&#xf375;" horiz-adv-x="416" 
+d="M123 232l64 -64l179 178l29 -29l-208 -208l-93 93zM374 192h42c0 -114 -94 -208 -208 -208s-208 94 -208 208s94 208 208 208c28 0 54 -6 78 -16l-32 -32c-15 4 -30 6 -46 6c-92 0 -166 -74 -166 -166s74 -166 166 -166s166 74 166 166z" />
+    <glyph glyph-name="ion-android-clipboard" unicode="&#xf376;" horiz-adv-x="384" 
+d="M341 368c23 0 43 -20 43 -43v-314c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v314c0 23 20 43 43 43h87c7 28 32 48 62 48s55 -20 62 -48h87zM192 368c-12 0 -21 -9 -21 -21s9 -22 21 -22s21 10 21 22s-9 21 -21 21zM344 8v320h-40v-72h-224v72h-40v-320h304z" />
+    <glyph glyph-name="ion-android-close" unicode="&#xf2d7;" horiz-adv-x="298" 
+d="M298 311l-119 -119l119 -119l-30 -30l-119 119l-119 -119l-30 30l119 119l-119 119l30 30l119 -119l119 119z" />
+    <glyph glyph-name="ion-android-cloud-circle" unicode="&#xf377;" horiz-adv-x="416" 
+d="M208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM302 109c29 0 52 23 52 52s-23 52 -52 52h-11c0 46 -37 83 -83 83c-38 0 -71 -26 -80 -62h-3c-34 0 -63 -29 -63 -63s29 -62 63 -62h177z" />
+    <glyph glyph-name="ion-android-cloud-done" unicode="&#xf378;" horiz-adv-x="480" 
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM197 85l141 141l-30 30l-111 -111l-44 45l-30 -30z" />
+    <glyph glyph-name="ion-android-cloud-outline" unicode="&#xf379;" horiz-adv-x="480" 
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM380 72c33 0 60 27 60 60s-27 60 -60 60h-30v10c0 61 -49 110 -110 110c-51 0 -93 -34 -106 -80h-14
+c-44 0 -80 -36 -80 -80s36 -80 80 -80h260z" />
+    <glyph glyph-name="ion-android-cloud" unicode="&#xf37a;" horiz-adv-x="480" 
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121z" />
+    <glyph glyph-name="ion-android-color-palette" unicode="&#xf37b;" horiz-adv-x="384" 
+d="M192 384c106 0 192 -77 192 -171c0 -59 -48 -106 -107 -106h-38c-18 0 -32 -14 -32 -32c0 -9 3 -17 8 -22s9 -12 9 -21c0 -18 -14 -32 -32 -32c-106 0 -192 86 -192 192s86 192 192 192zM75 192c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM139 277
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM245 277c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM309 192c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+    <glyph glyph-name="ion-android-compass" unicode="&#xf37c;" 
+d="M224 217c13 0 25 -12 25 -25s-12 -25 -25 -25s-25 12 -25 25s12 25 25 25zM224 416c123 0 224 -101 224 -224s-101 -224 -224 -224s-224 101 -224 224s101 224 224 224zM273 143l85 183l-183 -85l-85 -183z" />
+    <glyph glyph-name="ion-android-contact" unicode="&#xf2d8;" horiz-adv-x="384" 
+d="M267 110c59 -18 104 -58 117 -110h-384c13 52 58 92 117 110c22 -13 48 -20 75 -20s53 7 75 20zM192 384c73 0 132 -59 132 -132s-59 -132 -132 -132s-132 59 -132 132s59 132 132 132zM192 153c42 0 78 26 92 63h-184c14 -37 50 -63 92 -63z" />
+    <glyph glyph-name="ion-android-contacts" unicode="&#xf2d9;" 
+d="M207 104c47 -14 76 -62 87 -104h-294c11 42 40 90 87 104c18 -10 38 -16 60 -16s42 6 60 16zM147 328c58 0 106 -48 106 -106s-48 -106 -106 -106s-106 48 -106 106s48 106 106 106zM147 141c34 0 62 23 74 51h-148c12 -28 40 -51 74 -51zM291 64c-13 20 -34 43 -60 53
+c11 9 21 23 28 35c13 -5 27 -8 42 -8c22 0 42 6 60 16c47 -14 76 -54 87 -96h-157zM275 248c-8 37 -31 69 -63 87c19 29 52 49 89 49c58 0 106 -48 106 -106s-48 -106 -106 -106c-11 0 -22 2 -32 5c3 8 6 16 7 25c8 -3 16 -4 25 -4c34 0 62 22 74 50h-100z" />
+    <glyph glyph-name="ion-android-contract" unicode="&#xf37d;" horiz-adv-x="384" 
+d="M0 77v51h128v-128h-51v77h-77zM77 307v77h51v-128h-128v51h77zM256 0v128h128v-51h-77v-77h-51zM307 307h77v-51h-128v128h51v-77z" />
+    <glyph glyph-name="ion-android-create" unicode="&#xf37e;" horiz-adv-x="384" 
+d="M0 80l236 236l80 -80l-236 -236h-80v80zM378 298l-40 -40l-80 80l40 40c9 9 20 9 29 0l51 -51c9 -9 9 -20 0 -29z" />
+    <glyph glyph-name="ion-android-delete" unicode="&#xf37f;" horiz-adv-x="320" 
+d="M32 43v245h256v-245c0 -23 -20 -43 -43 -43h-170c-23 0 -43 20 -43 43zM320 352v-32h-320v32h80l27 32h106l27 -32h80z" />
+    <glyph glyph-name="ion-android-desktop" unicode="&#xf380;" 
+d="M405 416c23 0 43 -20 43 -43v-282c0 -23 -20 -43 -43 -43h-138l42 -48v-32h-170v32l42 48h-138c-23 0 -43 20 -43 43v282c0 23 20 43 43 43h362zM405 128v245h-362v-245h362z" />
+    <glyph glyph-name="ion-android-document" unicode="&#xf381;" horiz-adv-x="320" 
+d="M192 400l128 -128v-248c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v336c0 22 18 40 40 40h152zM176 256h112l-112 112v-112z" />
+    <glyph glyph-name="ion-android-done-all" unicode="&#xf382;" horiz-adv-x="512" 
+d="M388 308l-140 -139l-31 31l140 139zM481 339l31 -31l-264 -263l-122 123l30 31l92 -91zM0 168l32 31l122 -123l-31 -31z" />
+    <glyph glyph-name="ion-android-done" unicode="&#xf383;" horiz-adv-x="384" 
+d="M122 108l230 230l32 -31l-262 -261l-122 122l32 31z" />
+    <glyph glyph-name="ion-android-download" unicode="&#xf2dd;" horiz-adv-x="480" 
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM208 180h-68l100 -100l100 100h-68v76h-64v-76z" />
+    <glyph glyph-name="ion-android-drafts" unicode="&#xf384;" 
+d="M448 246v-203c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v203c0 15 8 30 20 37l204 101l204 -101c13 -7 20 -22 20 -37zM224 144l171 112l-171 85l-171 -85z" />
+    <glyph glyph-name="ion-android-exit" unicode="&#xf385;" horiz-adv-x="384" 
+d="M151 115l55 56h-206v42h207l-56 56l30 30l107 -107l-107 -107zM341 384c23 0 43 -20 43 -43v-298c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v85h43v-85h298v298h-298v-85h-43v85c0 23 20 43 43 43h298z" />
+    <glyph glyph-name="ion-android-expand" unicode="&#xf386;" horiz-adv-x="384" 
+d="M333 51v77h51v-128h-128v51h77zM333 333h-77v51h128v-128h-51v77zM51 333v-77h-51v128h128v-51h-77zM51 51h77v-51h-128v128h51v-77z" />
+    <glyph glyph-name="ion-android-favorite-outline" unicode="&#xf387;" horiz-adv-x="416" 
+d="M302 384c64 0 114 -50 114 -115c0 -80 -71 -144 -178 -242l-30 -27l-30 27c-107 98 -178 162 -178 242c0 65 50 115 114 115c36 0 71 -17 94 -44c23 27 58 44 94 44zM221 55c50 46 94 86 123 122c28 35 40 63 40 92c0 23 -9 44 -24 59s-35 24 -58 24
+c-26 0 -53 -13 -70 -33l-24 -29l-24 29c-17 20 -44 33 -70 33c-23 0 -43 -9 -58 -24s-24 -36 -24 -59c0 -29 12 -57 40 -92c29 -36 73 -76 123 -122l4 -4l9 -8l9 8z" />
+    <glyph glyph-name="ion-android-favorite" unicode="&#xf388;" horiz-adv-x="416" 
+d="M208 0l-30 27c-107 98 -178 162 -178 242c0 65 50 115 114 115c36 0 71 -17 94 -44c23 27 58 44 94 44c64 0 114 -50 114 -115c0 -80 -71 -144 -178 -242z" />
+    <glyph glyph-name="ion-android-film" unicode="&#xf389;" horiz-adv-x="320" 
+d="M280 384h40v-384h-40v43h-40v-43h-160v43h-40v-43h-40v384h40v-43h40v43h160v-43h40v43zM80 85v43h-40v-43h40zM80 171v42h-40v-42h40zM80 256v43h-40v-43h40zM280 85v43h-40v-43h40zM280 171v42h-40v-42h40zM280 256v43h-40v-43h40z" />
+    <glyph glyph-name="ion-android-folder-open" unicode="&#xf38a;" 
+d="M405 304c23 0 43 -20 43 -43v-186c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v234c0 23 20 43 43 43h138l43 -48h181zM416 75v186c0 6 -5 11 -11 11h-373v-197c0 -6 5 -11 11 -11h362c6 0 11 5 11 11z" />
+    <glyph glyph-name="ion-android-folder" unicode="&#xf2e0;" 
+d="M181 352l43 -48h181c23 0 43 -20 43 -43v-186c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v234c0 23 20 43 43 43h138z" />
+    <glyph glyph-name="ion-android-funnel" unicode="&#xf38b;" 
+d="M176 48v48h96v-48h-96zM0 336h448v-48h-448v48zM80 167v50h288v-50h-288z" />
+    <glyph glyph-name="ion-android-globe" unicode="&#xf38c;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM186 15c6 15 21 29 8 39c-8 7 -16 14 -23 21c-2 2 -11 20 -9 23c5 9 6 14 8 24c3 12 -3 16 -13 22c-15 10 -29 23 -43 34c-7 5 -17 10 -20 19s-5 20 -10 28c-14 20 -12 34 -10 58
+c0 7 -1 16 -2 25c-28 -32 -42 -73 -42 -116c0 -48 18 -92 52 -126c29 -29 65 -46 104 -51zM334 66c23 23 39 51 47 82c-8 -1 -19 2 -19 2s-21 24 -23 45c-2 22 0 39 -3 57c-3 16 -20 31 -27 46c-7 14 -13 28 -20 42c2 -1 5 -2 7 -3c5 1 10 2 14 2c-23 16 -49 25 -76 29v-8
+l4 -9l-14 -13l-9 3l-10 10l-10 12l-14 5c-16 -2 -31 -7 -45 -13v-7c7 3 16 5 23 8c3 1 13 -7 16 -9c-4 -5 -21 -15 -22 -21c0 -2 7 -6 7 -10c0 -6 -1 -11 -1 -17c3 3 20 21 22 21c13 3 35 -19 37 -26s-22 -24 -33 -34c-8 -8 -25 -12 -20 -24c2 -4 10 -20 5 -24
+c-6 -5 -14 9 -17 12c-8 10 -26 7 -38 7c0 -17 -1 -31 15 -43c15 -11 30 -25 47 -33c13 -6 36 7 47 -1c16 -11 29 -21 47 -29c8 -3 33 -20 26 -31c-5 -8 -10 -15 -14 -23s-13 -20 -20 -25c-8 -6 -16 -17 -21 -29c35 7 66 23 92 49z" />
+    <glyph glyph-name="ion-android-hand" unicode="&#xf2e3;" horiz-adv-x="414" 
+d="M401 174c15 -15 18 -36 3 -51c0 0 -96 -103 -126 -121v0c-28 -21 -65 -34 -100 -34c-55 0 -101 36 -117 85v0v1c0 1 -1 2 -1 3l-58 189c-5 15 2 32 17 37s30 -3 35 -18l34 -88c1 -4 2 -2 2 1l-22 161c-3 15 7 30 22 33s30 -8 33 -23l25 -138c0 -2 2 -2 2 0v177
+c0 15 13 28 28 28s28 -13 28 -28l8 -175c0 -5 3 -4 4 -1l23 135c2 15 16 27 31 25s27 -17 25 -32l-21 -172c-1 -12 -3 -30 2 -36c8 -9 20 -9 31 2l42 42c15 15 35 13 50 -2z" />
+    <glyph glyph-name="ion-android-hangout" unicode="&#xf38d;" horiz-adv-x="352" 
+d="M176 400c97 0 176 -77 176 -172c0 -91 -76 -196 -176 -244v71c-97 0 -176 78 -176 173s79 172 176 172zM166 217v61h-62v-61h31l-21 -40h31zM248 217v61h-62v-61h31l-20 -40h31z" />
+    <glyph glyph-name="ion-android-happy" unicode="&#xf38e;" horiz-adv-x="416" 
+d="M208 400c114 0 208 -94 208 -208s-93 -208 -208 -208s-208 94 -208 208s93 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166zM281 213c-18 0 -31 13 -31 31s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31zM135 213
+c-18 0 -31 13 -31 31s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31zM208 78c-49 0 -89 29 -106 72h212c-17 -43 -57 -72 -106 -72z" />
+    <glyph glyph-name="ion-android-home" unicode="&#xf38f;" horiz-adv-x="416" 
+d="M160 0h-98v192h-62l208 192l208 -192h-62v-192h-98v128h-96v-128z" />
+    <glyph glyph-name="ion-android-image" unicode="&#xf2e4;" horiz-adv-x="384" 
+d="M384 43c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h298c23 0 43 -20 43 -43v-298zM117 160l-74 -96h298l-96 128l-74 -96z" />
+    <glyph glyph-name="ion-android-laptop" unicode="&#xf390;" horiz-adv-x="512" 
+d="M437 32h75c0 -23 -64 -32 -96 -32h-320c-32 0 -96 9 -96 32h75c-23 0 -43 20 -43 43v266c0 23 20 43 43 43h362c23 0 43 -20 43 -43v-266c0 -23 -20 -43 -43 -43zM75 341v-272h362v272h-362zM256 13c12 0 21 10 21 22s-9 21 -21 21s-21 -9 -21 -21s9 -22 21 -22z" />
+    <glyph glyph-name="ion-android-list" unicode="&#xf391;" horiz-adv-x="384" 
+d="M344 384c22 0 40 -18 40 -40v-304c0 -22 -18 -40 -40 -40h-304c-22 0 -40 18 -40 40v304c0 22 18 40 40 40h304zM240 80v48h-160v-48h160zM304 168v48h-224v-48h224zM304 256v48h-224v-48h224z" />
+    <glyph glyph-name="ion-android-locate" unicode="&#xf2e9;" 
+d="M224 272c44 0 80 -36 80 -80s-36 -80 -80 -80s-80 36 -80 80s36 80 80 80zM415 213h33v-42h-33c-10 -89 -81 -160 -170 -170v-33h-42v33c-89 10 -160 81 -170 170h-33v42h33c10 89 81 160 170 170v33h42v-33c89 -10 160 -81 170 -170zM224 43c82 0 149 67 149 149
+s-67 149 -149 149s-149 -67 -149 -149s67 -149 149 -149z" />
+    <glyph glyph-name="ion-android-lock" unicode="&#xf392;" horiz-adv-x="320" 
+d="M280 262c22 0 40 -18 40 -40v-200c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v200c0 22 18 40 40 40h20v40c0 55 45 100 100 100s100 -45 100 -100v-40h20zM160 80c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40s18 -40 40 -40zM222 262v40c0 34 -28 62 -62 62
+s-62 -28 -62 -62v-40h124z" />
+    <glyph glyph-name="ion-android-mail" unicode="&#xf2eb;" 
+d="M405 368c23 0 43 -20 43 -43v-266c0 -23 -20 -43 -43 -43h-362c-23 0 -43 20 -43 43v266c0 23 20 43 43 43h362zM400 277v43l-176 -117l-176 117v-43l176 -117z" />
+    <glyph glyph-name="ion-android-map" unicode="&#xf393;" horiz-adv-x="384" 
+d="M373 384c6 0 11 -5 11 -11v-322c0 -5 -3 -9 -7 -10l-121 -41l-128 45s-105 -41 -108 -42s-7 -3 -9 -3c-6 0 -11 5 -11 11v322c0 5 3 9 7 10l121 41l128 -45s103 40 108 42s7 3 9 3zM256 43v254l-128 44v-254z" />
+    <glyph glyph-name="ion-android-menu" unicode="&#xf394;" horiz-adv-x="384" 
+d="M0 64v43h384v-43h-384zM0 171v42h384v-42h-384zM0 320h384v-43h-384v43z" />
+    <glyph glyph-name="ion-android-microphone-off" unicode="&#xf395;" horiz-adv-x="408" 
+d="M316 93l58 -58l-58 58l58 -58l34 -33l-24 -24l-95 95c-19 -11 -40 -20 -62 -23v-82h-46v82c-75 10 -137 76 -137 153h39c0 -68 58 -117 121 -117c20 0 40 5 57 14l-32 33c-8 -3 -16 -5 -25 -5c-38 0 -69 31 -69 69v29l-135 134l24 24l111 -110v0l140 -140l5 -5l9 -9z
+M273 197c0 -4 0 -8 -1 -12l-137 137v25c0 38 31 69 69 69s69 -31 69 -69v-150zM365 203c0 -31 -10 -60 -27 -84l-27 28c9 17 15 36 15 56h39zM408 2v0l-34 33z" />
+    <glyph glyph-name="ion-android-microphone" unicode="&#xf2ec;" horiz-adv-x="320" 
+d="M160 128c-38 0 -69 31 -69 69v150c0 38 31 69 69 69s69 -31 69 -69v-150c0 -38 -31 -69 -69 -69zM281 203h39c0 -78 -62 -142 -137 -153v-82h-46v82c-75 10 -137 75 -137 153h39c0 -69 58 -116 121 -116s121 47 121 116z" />
+    <glyph glyph-name="ion-android-more-horizontal" unicode="&#xf396;" horiz-adv-x="320" 
+d="M40 232c22 0 40 -18 40 -40s-18 -40 -40 -40s-40 18 -40 40s18 40 40 40zM280 232c22 0 40 -18 40 -40s-18 -40 -40 -40s-40 18 -40 40s18 40 40 40zM160 232c22 0 40 -18 40 -40s-18 -40 -40 -40s-40 18 -40 40s18 40 40 40z" />
+    <glyph glyph-name="ion-android-more-vertical" unicode="&#xf397;" horiz-adv-x="80" 
+d="M80 312c0 -22 -18 -40 -40 -40s-40 18 -40 40s18 40 40 40s40 -18 40 -40zM80 72c0 -22 -18 -40 -40 -40s-40 18 -40 40s18 40 40 40s40 -18 40 -40zM80 192c0 -22 -18 -40 -40 -40s-40 18 -40 40s18 40 40 40s40 -18 40 -40z" />
+    <glyph glyph-name="ion-android-navigate" unicode="&#xf398;" horiz-adv-x="320" 
+d="M160 384l160 -369l-15 -15l-145 64l-145 -64l-15 15z" />
+    <glyph glyph-name="ion-android-notifications-none" unicode="&#xf399;" horiz-adv-x="352" 
+d="M177 328h-2c-6 0 -24 -5 -24 -5c-46 -10 -78 -53 -78 -100v-114v-13l-9 -10l-8 -8h240l-8 8l-9 10v13v114c0 47 -32 90 -78 100c0 0 -17 5 -24 5zM176 400v0c18 0 31 -13 31 -31v-15c59 -14 104 -68 104 -131v-114l41 -42v-21h-352v21l41 42v114c0 63 45 117 104 131v15
+c0 18 13 31 31 31zM217 26v0c0 -23 -18 -42 -41 -42s-41 19 -41 42h82z" />
+    <glyph glyph-name="ion-android-notifications-off" unicode="&#xf39a;" horiz-adv-x="364" 
+d="M182 -16c-23 0 -41 19 -41 42h82c0 -23 -18 -42 -41 -42zM57 341l295 -295v0l12 -12l-24 -24l-36 36h-298v21l41 41v115c0 23 6 44 16 63l-63 64l24 24l33 -33v0zM317 223v-94l-208 207c13 8 27 15 42 18v15c0 18 13 31 31 31s31 -13 31 -31v-15c59 -14 104 -67 104 -131
+z" />
+    <glyph glyph-name="ion-android-notifications" unicode="&#xf39b;" horiz-adv-x="352" 
+d="M176 -16c-23 0 -41 19 -41 42h82c0 -23 -18 -42 -41 -42zM311 109l41 -42v-21h-352v21l41 42v114c0 63 45 117 104 131v15c0 18 13 31 31 31s31 -13 31 -31v-15c59 -14 104 -68 104 -131v-114z" />
+    <glyph glyph-name="ion-android-open" unicode="&#xf39c;" horiz-adv-x="384" 
+d="M341 43v133h43v-133c0 -23 -20 -43 -43 -43h-298c-23 0 -43 20 -43 43v298c0 23 20 43 43 43h133v-43h-133v-298h298zM224 384h160v-160h-43v87l-215 -215l-30 30l215 215h-87v43z" />
+    <glyph glyph-name="ion-android-options" unicode="&#xf39d;" 
+d="M0 32v32h272v-32h-272zM368 32v32h80v-32h-80zM352 0c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96zM0 176v32h80v-32h-80zM176 176v32h272v-32h-272zM160 144c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96
+c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96zM0 320v32h272v-32h-272zM368 320v32h80v-32h-80zM352 288c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96z" />
+    <glyph glyph-name="ion-android-people" unicode="&#xf39e;" 
+d="M305 216c-34 0 -61 27 -61 60s27 60 61 60s62 -27 62 -60s-28 -60 -62 -60zM143 216c-34 0 -62 27 -62 60s28 60 62 60s61 -27 61 -60s-27 -60 -61 -60zM143 172c48 0 145 -23 145 -70v-54h-288v54c0 47 95 70 143 70zM305 161c48 0 143 -12 143 -59v-54h-128v54
+c0 30 -9 41 -32 58c7 1 11 1 17 1z" />
+    <glyph glyph-name="ion-android-person-add" unicode="&#xf39f;" horiz-adv-x="480" 
+d="M288 192c-53 0 -96 43 -96 96s43 96 96 96s96 -43 96 -96s-43 -96 -96 -96zM288 144c64 0 192 -32 192 -96v-48h-384v48c0 64 128 96 192 96zM96 224h64v-32h-64v-64h-32v64h-64v32h64v64h32v-64z" />
+    <glyph glyph-name="ion-android-person" unicode="&#xf3a0;" horiz-adv-x="384" 
+d="M192 192c-53 0 -96 43 -96 96s43 96 96 96s96 -43 96 -96s-43 -96 -96 -96zM192 144c64 0 192 -32 192 -96v-48h-384v48c0 64 128 96 192 96z" />
+    <glyph glyph-name="ion-android-phone-landscape" unicode="&#xf3a1;" 
+d="M448 89c0 -23 -19 -41 -41 -41h-366c-22 0 -41 18 -41 41v206c0 23 19 41 41 41h366c22 0 41 -18 41 -41v-206zM80 84h288v216h-288v-216z" />
+    <glyph glyph-name="ion-android-phone-portrait" unicode="&#xf3a2;" horiz-adv-x="288" 
+d="M247 416c23 0 41 -19 41 -41v-366c0 -22 -18 -41 -41 -41h-206c-23 0 -41 19 -41 41v366c0 22 18 41 41 41h206zM252 48v288h-216v-288h216z" />
+    <glyph glyph-name="ion-android-pin" unicode="&#xf3a3;" horiz-adv-x="320" 
+d="M160 416c88 0 160 -71 160 -157c0 -118 -160 -291 -160 -291s-160 173 -160 291c0 86 72 157 160 157zM160 203c32 0 57 25 57 56s-25 56 -57 56s-57 -25 -57 -56s25 -56 57 -56z" />
+    <glyph glyph-name="ion-android-plane" unicode="&#xf3a4;" horiz-adv-x="384" 
+d="M384 112l-160 48v-114l48 -31v-31l-80 16l-80 -16v31l48 31v114l-160 -48v40l160 104v113c0 18 15 31 32 31s32 -13 32 -31v-113l160 -104v-40z" />
+    <glyph glyph-name="ion-android-playstore" unicode="&#xf2f0;" horiz-adv-x="416" 
+d="M416 296c-19 -214 -13 -312 -13 -312h-390s6 96 -13 312h104c0 57 47 104 104 104s104 -47 104 -104h104zM208 374c-43 0 -78 -35 -78 -78h156c0 43 -35 78 -78 78zM156 50l143 85l-143 84v-169z" />
+    <glyph glyph-name="ion-android-print" unicode="&#xf3a5;" horiz-adv-x="416" 
+d="M352 288c35 0 64 -29 64 -64v-139h-80v-85h-256v85h-80v139c0 35 29 64 64 64h288zM304 32v128h-192v-128h192zM336 384v0v-80h-256v80h256z" />
+    <glyph glyph-name="ion-android-radio-button-off" unicode="&#xf3a6;" horiz-adv-x="416" 
+d="M208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166z" />
+    <glyph glyph-name="ion-android-radio-button-on" unicode="&#xf3a7;" horiz-adv-x="416" 
+d="M208 296c57 0 104 -47 104 -104s-47 -104 -104 -104s-104 47 -104 104s47 104 104 104zM208 400c114 0 208 -94 208 -208s-94 -208 -208 -208s-208 94 -208 208s94 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166z" />
+    <glyph glyph-name="ion-android-refresh" unicode="&#xf3a8;" horiz-adv-x="352" 
+d="M176 60c56 0 104 34 123 84h46c-21 -74 -88 -128 -169 -128c-98 0 -176 79 -176 176s79 176 176 176c48 0 92 -20 124 -52l52 52v-154h-154l70 70c-23 24 -56 40 -92 40c-73 0 -132 -59 -132 -132s59 -132 132 -132z" />
+    <glyph glyph-name="ion-android-remove-circle" unicode="&#xf3a9;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM315 171v42h-214v-42h214z" />
+    <glyph glyph-name="ion-android-remove" unicode="&#xf2f4;" horiz-adv-x="320" 
+d="M0 171v42h320v-42h-320z" />
+    <glyph glyph-name="ion-android-restaurant" unicode="&#xf3aa;" horiz-adv-x="415" 
+d="M116 168l-91 89c-34 33 -34 86 0 119l153 -148zM264 206l-33 -31l150 -145l-30 -30l-150 146l-150 -146l-30 30s163 159 211 207c-15 32 -4 77 31 111c41 40 101 49 132 17c33 -31 24 -89 -17 -129c-34 -34 -80 -45 -114 -30z" />
+    <glyph glyph-name="ion-android-sad" unicode="&#xf3ab;" horiz-adv-x="416" 
+d="M208 160c45 0 83 -26 102 -64h-204c19 38 57 64 102 64zM208 400c114 0 208 -94 208 -208s-93 -208 -208 -208s-208 94 -208 208s93 208 208 208zM208 26c92 0 166 74 166 166s-74 166 -166 166s-166 -74 -166 -166s74 -166 166 -166zM281 213c-18 0 -31 13 -31 31
+s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31zM135 213c-18 0 -31 13 -31 31s13 31 31 31s31 -13 31 -31s-13 -31 -31 -31z" />
+    <glyph glyph-name="ion-android-search" unicode="&#xf2f5;" horiz-adv-x="384" 
+d="M274 143l110 -110l-33 -33l-109 110v17l-7 6c-25 -21 -58 -34 -93 -34c-79 0 -142 63 -142 142s63 143 141 143c79 0 142 -64 142 -143c0 -36 -13 -68 -34 -93l7 -5h18zM142 143c55 0 99 43 99 98s-44 99 -99 99s-98 -44 -98 -99s43 -98 98 -98z" />
+    <glyph glyph-name="ion-android-send" unicode="&#xf2f6;" horiz-adv-x="416" 
+d="M0 0v149l298 43l-298 43v149l416 -192z" />
+    <glyph glyph-name="ion-android-settings" unicode="&#xf2f7;" horiz-adv-x="416" 
+d="M366 171l47 -34c3 -3 4 -10 2 -14l-43 -71c-2 -4 -7 -7 -12 -5l-54 21c-12 -8 -23 -16 -36 -21l-8 -55c-1 -4 -6 -8 -11 -8h-85c-5 0 -10 3 -11 8l-8 55c-13 5 -25 13 -36 21l-54 -21c-4 -2 -10 1 -12 5l-43 71c-3 5 -2 11 2 14l45 34c0 7 -1 14 -1 21s1 14 1 21l-46 34
+c-3 3 -4 10 -2 14l43 71c2 4 7 7 12 5l54 -21c12 8 23 16 36 21l8 55c1 4 6 8 11 8h85c5 0 10 -4 11 -8l7 -55c13 -5 25 -13 36 -21l53 21c4 2 11 -1 13 -5l43 -71c3 -5 2 -11 -2 -14l-45 -34c0 -7 1 -14 1 -21s0 -15 -1 -21zM207 119c41 0 75 32 75 73s-34 73 -75 73
+s-74 -32 -74 -73s33 -73 74 -73z" />
+    <glyph glyph-name="ion-android-share-alt" unicode="&#xf3ac;" horiz-adv-x="384" 
+d="M320 104c34 0 62 -28 62 -62s-28 -62 -62 -62s-62 28 -62 62c0 5 1 10 2 14l-152 88c-12 -11 -27 -17 -44 -17c-35 0 -64 29 -64 64s28 64 63 64c17 0 32 -6 44 -17l151 87c-1 5 -2 10 -2 15c0 35 29 64 64 64s64 -29 64 -64s-29 -64 -64 -64c-17 0 -32 6 -44 17
+l-151 -87c1 -5 2 -10 2 -15s-1 -10 -2 -15l153 -88c11 11 26 16 42 16z" />
+    <glyph glyph-name="ion-android-share" unicode="&#xf2f8;" horiz-adv-x="384" 
+d="M384 200l-160 -147v88c-107 0 -171 -34 -224 -109c21 107 75 214 224 235v85z" />
+    <glyph glyph-name="ion-android-star-half" unicode="&#xf3ad;" horiz-adv-x="404" 
+d="M404 238l-110 -96l33 -142l-125 75l-125 -75l33 142l-110 96l145 12l57 134l57 -134zM219 103l60 -36l-16 68l-5 19l15 12l53 46l-70 6l-19 2l-8 18l-27 64v-189z" />
+    <glyph glyph-name="ion-android-star-outline" unicode="&#xf3ae;" horiz-adv-x="404" 
+d="M404 238l-110 -96l33 -142l-125 75l-125 -75l33 142l-110 96l145 12l57 134l57 -134zM219 103l60 -36l-16 68l-5 19l15 12l53 46l-70 6l-19 2l-8 18l-27 64l-27 -64l-8 -18l-19 -2l-70 -6l53 -46l15 -12l-5 -19l-16 -68l60 36l17 10z" />
+    <glyph glyph-name="ion-android-star" unicode="&#xf2fc;" horiz-adv-x="404" 
+d="M202 75l-125 -75l33 142l-110 96l145 12l57 134l57 -134l145 -12l-110 -96l33 -142z" />
+    <glyph glyph-name="ion-android-stopwatch" unicode="&#xf2fd;" horiz-adv-x="384" 
+d="M168 141v131h48v-131h-48zM344 278c25 -33 40 -74 40 -118c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192c44 0 85 -15 118 -40l31 30l33 -33zM298 54c28 28 44 66 44 106s-16 78 -44 106s-66 44 -106 44s-78 -16 -106 -44s-44 -66 -44 -106
+s16 -78 44 -106s66 -44 106 -44s78 16 106 44zM128 368v48h128v-48h-128z" />
+    <glyph glyph-name="ion-android-subway" unicode="&#xf3af;" horiz-adv-x="352" 
+d="M176 400c94 0 176 -10 176 -85v-214c0 -42 -33 -74 -75 -74l27 -27v-16h-256v16l27 27c-42 0 -75 32 -75 74v214c0 75 82 85 176 85zM80 64c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM160 208v96h-112v-96h112zM272 64c18 0 32 14 32 32
+s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM304 208v96h-112v-96h112z" />
+    <glyph glyph-name="ion-android-sunny" unicode="&#xf3b0;" 
+d="M224 288c-25 0 -50 -10 -68 -28s-28 -43 -28 -68s10 -50 28 -68s43 -28 68 -28s50 10 68 28s28 43 28 68s-10 50 -28 68s-43 28 -68 28zM245 416v0v-64h-42v64h42zM374 372v0l30 -30l-38 -38l-30 30zM74 372v0l38 -38l-30 -30l-38 38zM224 320v0c70 0 128 -58 128 -128
+s-58 -128 -128 -128s-128 58 -128 128s58 128 128 128zM448 213v0v-42h-64v42h64zM64 213v0v-42h-64v42h64zM366 80v0l38 -38l-30 -30l-38 38zM82 80v0l30 -30l-38 -38l-30 30zM245 32v0v-64h-42v64h42z" />
+    <glyph glyph-name="ion-android-sync" unicode="&#xf3b1;" horiz-adv-x="320" 
+d="M160 355c88 0 160 -73 160 -163c0 -32 -9 -62 -25 -87l-29 30c9 17 14 37 14 57c0 67 -54 122 -120 122v-61l-80 82l80 81v-61zM160 70v61l80 -82l-80 -81v61c-88 0 -160 73 -160 163c0 32 9 63 25 87l29 -30c-9 -17 -14 -37 -14 -57c0 -67 54 -122 120 -122z" />
+    <glyph glyph-name="ion-android-textsms" unicode="&#xf3b2;" horiz-adv-x="384" 
+d="M344 384c22 0 40 -18 40 -40v-240c0 -22 -18 -40 -40 -40h-280l-64 -64v344c0 22 10 40 32 40h312zM134 206v40h-38v-40h38zM211 206v40h-38v-40h38zM288 206v40h-38v-40h38z" />
+    <glyph glyph-name="ion-android-time" unicode="&#xf3b3;" horiz-adv-x="426" 
+d="M213 405c117 0 213 -96 213 -213s-95 -213 -213 -213s-213 96 -213 213s95 213 213 213zM213 22c94 0 170 76 170 170s-76 170 -170 170s-170 -76 -170 -170s76 -170 170 -170zM224 298v-111l96 -57l-16 -26l-112 67v127h32z" />
+    <glyph glyph-name="ion-android-train" unicode="&#xf3b4;" horiz-adv-x="352" 
+d="M0 101v214c0 75 82 85 176 85s176 -10 176 -85v-214c0 -42 -33 -74 -75 -74l27 -27v-16h-256v16l27 27c-42 0 -75 32 -75 74zM176 72c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40s18 -40 40 -40zM304 224v96h-256v-96h256z" />
+    <glyph glyph-name="ion-android-unlock" unicode="&#xf3b5;" horiz-adv-x="320" 
+d="M280 262c22 0 40 -18 40 -40v-200c0 -22 -18 -40 -40 -40h-240c-22 0 -40 18 -40 40v200c0 22 18 40 40 40h182v40v0c0 34 -28 62 -62 62s-62 -28 -62 -62h-38c0 55 45 100 100 100s100 -45 100 -100v-40h20zM160 80c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40
+s18 -40 40 -40z" />
+    <glyph glyph-name="ion-android-upload" unicode="&#xf3b6;" horiz-adv-x="480" 
+d="M387 231c52 -3 93 -46 93 -99c0 -55 -45 -100 -100 -100h-260c-66 0 -120 54 -120 120c0 62 47 113 107 119c25 48 75 81 133 81c73 0 133 -52 147 -121zM272 172h68l-100 100l-100 -100h68v-76h64v76z" />
+    <glyph glyph-name="ion-android-volume-down" unicode="&#xf3b7;" horiz-adv-x="288" 
+d="M0 256h85l107 112v-352l-107 112h-85v128zM288 192c0 -38 -21 -73 -53 -88v177c32 -16 53 -51 53 -89z" />
+    <glyph glyph-name="ion-android-volume-mute" unicode="&#xf3b8;" horiz-adv-x="192" 
+d="M0 256h85l107 112v-352l-107 112h-85v128z" />
+    <glyph glyph-name="ion-android-volume-off" unicode="&#xf3b9;" horiz-adv-x="384" 
+d="M342 192c0 69 -45 128 -107 147v45c85 -20 149 -99 149 -192c0 -35 -8 -68 -24 -96l-32 32c9 19 14 41 14 64zM192 368v-104l-51 51zM357 51v0l24 -24l-24 -24l-40 40c-23 -21 -51 -36 -82 -43v45c19 6 37 15 52 28l-95 95v-152l-107 112h-85v128h85l9 10l-91 91l24 24z
+M288 192c0 -7 0 -15 -2 -22l-51 51v60c32 -16 53 -51 53 -89z" />
+    <glyph glyph-name="ion-android-volume-up" unicode="&#xf3ba;" horiz-adv-x="384" 
+d="M0 256h85l107 112v-352l-107 112h-85v128zM288 192c0 -38 -21 -73 -53 -88v177c32 -16 53 -51 53 -89zM235 384c85 -20 149 -99 149 -192s-64 -172 -149 -192v45c62 19 106 78 106 147s-44 128 -106 147v45z" />
+    <glyph glyph-name="ion-android-walk" unicode="&#xf3bb;" horiz-adv-x="272" 
+d="M168 336c-22 0 -40 18 -40 40s18 40 40 40s40 -18 40 -40s-18 -40 -40 -40zM168 216l-20 38l-20 -62l57 -96v-128h-38v96l-50 68l-57 -164h-40l81 320l-41 -16v-80h-40v112l111 38c4 1 10 1 13 1c13 0 23 -6 31 -18l45 -69h72v-40h-104z" />
+    <glyph glyph-name="ion-android-warning" unicode="&#xf3bc;" 
+d="M0 -16l224 416l224 -416h-448zM248 48v48h-48v-48h48zM248 128v96h-48v-96h48z" />
+    <glyph glyph-name="ion-android-watch" unicode="&#xf3bd;" horiz-adv-x="320" 
+d="M320 192c0 -51 -24 -96 -61 -125l-19 -115h-160l-19 115c-37 29 -61 74 -61 125s24 96 61 125l19 115h160l19 -115c37 -29 61 -74 61 -125zM40 192c0 -66 54 -120 120 -120s120 54 120 120s-54 120 -120 120s-120 -54 -120 -120z" />
+    <glyph glyph-name="ion-android-wifi" unicode="&#xf305;" horiz-adv-x="416" 
+d="M208 219c23 0 42 -18 42 -41s-19 -41 -42 -41s-42 18 -42 41s19 41 42 41zM333 178c0 -45 -26 -85 -63 -107l-20 36c25 14 41 40 41 71c0 45 -37 82 -83 82s-83 -37 -83 -82c0 -31 16 -57 41 -71l-20 -36c-37 22 -63 62 -63 107c0 68 56 124 125 124s125 -56 125 -124z
+M208 384c114 0 208 -93 208 -206c0 -76 -42 -142 -104 -178l-21 36c50 28 83 81 83 142c0 91 -74 165 -166 165s-166 -74 -166 -165c0 -61 33 -113 83 -142l-21 -36c-62 36 -104 102 -104 178c0 113 94 206 208 206z" />
+    <glyph glyph-name="ion-aperture" unicode="&#xf313;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56s100 20 136 56zM168 342l56 -86h-147
+c17 40 50 71 91 86zM381 160h-102l72 129c21 -27 33 -60 33 -97c0 -11 -1 -22 -3 -32zM328 314l-49 -90l-78 126c8 1 15 2 23 2c40 0 76 -14 104 -38zM67 224h102l-72 -129c-21 27 -33 60 -33 97c0 11 1 22 3 32zM280 42l-56 86h147c-17 -40 -50 -71 -91 -86zM120 70l49 90
+l78 -126c-8 -1 -15 -2 -23 -2c-40 0 -76 14 -104 38z" />
+    <glyph glyph-name="ion-archive" unicode="&#xf102;" 
+d="M224 140l-128 116h80v96h96v-96h80zM433 151c11 -6 17 -19 15 -32l-9 -67c-2 -13 -9 -20 -28 -20h-374c-18 0 -26 7 -28 20l-9 67c-2 13 3 26 14 32l72 55h42l-62 -62h50c2 0 5 -1 6 -3l18 -45h168l18 45c1 2 3 3 5 3h51l-62 62h42z" />
+    <glyph glyph-name="ion-arrow-down-a" unicode="&#xf103;" horiz-adv-x="384" 
+d="M192 -0l-192 192h112v192h160v-192h112z" />
+    <glyph glyph-name="ion-arrow-down-b" unicode="&#xf104;" horiz-adv-x="320" 
+d="M3 263c-2 2 -3 6 -3 9c0 9 8 16 17 16v0h286v0c9 0 17 -7 17 -16c0 -3 -1 -6 -3 -8l-2 -3l-136 -156c-5 -5 -11 -9 -19 -9s-14 4 -19 9l-136 156z" />
+    <glyph glyph-name="ion-arrow-down-c" unicode="&#xf105;" horiz-adv-x="274" 
+d="M265 125l-105 -100c-6 -6 -14 -9 -23 -9s-16 3 -22 9l-106 100c-12 12 -12 31 0 43s34 12 46 0l50 -48v217c0 17 14 31 32 31s32 -14 32 -31v-217l50 48c12 12 34 12 46 0s12 -31 0 -43z" />
+    <glyph glyph-name="ion-arrow-expand" unicode="&#xf25e;" horiz-adv-x="320" 
+d="M178 238l64 64l-50 50h128v-128l-50 50l-64 -64zM178 146l28 28l64 -64l50 50v-128h-128l50 50zM142 146l-64 -64l50 -50h-128v128l50 -50l64 64zM142 238l-28 -28l-64 64l-50 -50v128h128l-50 -50z" />
+    <glyph glyph-name="ion-arrow-graph-down-left" unicode="&#xf25f;" 
+d="M0 64v160l61 -61l131 141l107 -112l149 128l-149 -203l-107 107l-94 -98l62 -62h-160z" />
+    <glyph glyph-name="ion-arrow-graph-down-right" unicode="&#xf260;" 
+d="M288 64l62 62l-94 98l-107 -107l-149 203l149 -128l107 112l131 -141l61 61v-160h-160z" />
+    <glyph glyph-name="ion-arrow-graph-up-left" unicode="&#xf261;" 
+d="M160 320l-62 -62l94 -98l107 107l149 -203l-149 128l-107 -112l-131 141l-61 -61v160h160z" />
+    <glyph glyph-name="ion-arrow-graph-up-right" unicode="&#xf262;" 
+d="M288 320h160v-160l-61 61l-131 -141l-107 112l-149 -128l149 203l107 -107l94 98z" />
+    <glyph glyph-name="ion-arrow-left-a" unicode="&#xf106;" horiz-adv-x="384" 
+d="M0 192l192 192v-112h192v-160h-192v-112z" />
+    <glyph glyph-name="ion-arrow-left-b" unicode="&#xf107;" horiz-adv-x="192" 
+d="M167 349c2 2 6 3 9 3c9 0 16 -8 16 -17v0v-286v0c0 -9 -7 -17 -16 -17c-3 0 -7 1 -9 3l-2 2l-156 136c-5 5 -9 11 -9 19s4 14 9 19l156 136z" />
+    <glyph glyph-name="ion-arrow-left-c" unicode="&#xf108;" horiz-adv-x="352" 
+d="M109 320c12 12 32 12 44 0s12 -34 0 -46l-49 -50h217c17 0 31 -14 31 -32s-14 -32 -31 -32h-217l48 -50c12 -12 12 -34 0 -46s-31 -12 -43 0l-100 106c-6 6 -9 13 -9 22s3 17 9 23z" />
+    <glyph glyph-name="ion-arrow-move" unicode="&#xf263;" 
+d="M448 192l-96 -96v76h-109l1 -108h76l-96 -96l-96 96h76v108h-108v-76l-96 96l96 96v-76h108v108h-76l96 96l96 -96h-76v-108h108v76z" />
+    <glyph glyph-name="ion-arrow-resize" unicode="&#xf264;" horiz-adv-x="320" 
+d="M192 352h128v-128l-50 50l-9 -9l-183 -183l50 -50h-128v128l50 -50l128 128v0l64 64z" />
+    <glyph glyph-name="ion-arrow-return-left" unicode="&#xf265;" horiz-adv-x="384" 
+d="M128 352v-64h248c4 0 8 -4 8 -8v-240c0 -4 -4 -8 -8 -8h-304c-4 0 -8 4 -8 8v48c0 4 4 8 8 8h248v128h-192v-64l-128 96z" />
+    <glyph glyph-name="ion-arrow-return-right" unicode="&#xf266;" horiz-adv-x="384" 
+d="M384 256l-128 -96v64h-192v-128h248c4 0 8 -4 8 -8v-48c0 -4 -4 -8 -8 -8h-304c-4 0 -8 4 -8 8v240c0 4 4 8 8 8h248v64z" />
+    <glyph glyph-name="ion-arrow-right-a" unicode="&#xf109;" horiz-adv-x="384" 
+d="M384 192l-192 -192v112h-192v160h192v112z" />
+    <glyph glyph-name="ion-arrow-right-b" unicode="&#xf10a;" horiz-adv-x="192" 
+d="M25 35c-2 -2 -6 -3 -9 -3c-9 0 -16 8 -16 17v0v286v0c0 9 7 17 16 17c3 0 6 -1 8 -3l3 -2l156 -136c5 -5 9 -11 9 -19s-4 -14 -9 -19l-156 -136z" />
+    <glyph glyph-name="ion-arrow-right-c" unicode="&#xf10b;" horiz-adv-x="352" 
+d="M243 320l100 -105c6 -6 9 -14 9 -23s-3 -16 -9 -22l-100 -106c-12 -12 -31 -12 -43 0s-12 34 0 46l48 50h-217c-17 0 -31 14 -31 32s14 32 31 32h217l-49 50c-12 12 -12 34 0 46s32 12 44 0z" />
+    <glyph glyph-name="ion-arrow-shrink" unicode="&#xf267;" horiz-adv-x="384" 
+d="M384 356l-82 -82l50 -50h-128v128l50 -50l82 82zM384 28l-28 -28l-82 82l-50 -50v128h128l-50 -50zM0 28l82 82l-50 50h128v-128l-50 50l-82 -82zM0 356l28 28l82 -82l50 50v-128h-128l50 50z" />
+    <glyph glyph-name="ion-arrow-swap" unicode="&#xf268;" horiz-adv-x="384" 
+d="M0 120c0 4 4 8 8 8h248v64l128 -96l-128 -96v64h-248c-4 0 -8 4 -8 8v48zM384 264c0 -4 -4 -8 -8 -8h-248v-64l-128 96l128 96v-64h248c4 0 8 -4 8 -8v-48z" />
+    <glyph glyph-name="ion-arrow-up-a" unicode="&#xf10c;" horiz-adv-x="384" 
+d="M192 384l192 -192h-112v-192h-160v192h-112z" />
+    <glyph glyph-name="ion-arrow-up-b" unicode="&#xf10d;" horiz-adv-x="320" 
+d="M317 121c2 -2 3 -6 3 -9c0 -9 -8 -16 -17 -16v0h-286v0c-9 0 -17 7 -17 16c0 3 1 6 3 8l2 3l136 156c5 5 11 9 19 9s14 -4 19 -9l136 -156z" />
+    <glyph glyph-name="ion-arrow-up-c" unicode="&#xf10e;" horiz-adv-x="274" 
+d="M9 259l105 100c6 6 14 9 23 9s16 -3 22 -9l106 -100c12 -12 12 -31 0 -43s-34 -12 -46 0l-50 48v-217c0 -17 -14 -31 -32 -31s-32 14 -32 31v217l-50 -49c-12 -12 -34 -12 -46 0s-12 32 0 44z" />
+    <glyph glyph-name="ion-asterisk" unicode="&#xf314;" 
+d="M448 224v-64l-186 10l104 -170l-56 -32l-86 176l-86 -176l-56 32l104 170l-186 -10v64l187 -7l-109 167l60 32l86 -176l86 176l60 -32l-109 -167z" />
+    <glyph glyph-name="ion-at" unicode="&#xf10f;" 
+d="M422 41c-24 -25 -52 -43 -85 -55s-69 -18 -105 -18c-35 0 -66 6 -95 17s-53 26 -73 46s-36 43 -47 71s-17 58 -17 90s6 62 18 89s29 51 50 71s46 35 74 47c28 11 58 17 90 17c28 0 55 -4 81 -12s49 -20 69 -36s36 -36 48 -60s18 -53 18 -85c0 -24 -3 -46 -10 -64
+s-16 -34 -27 -46s-24 -22 -38 -28s-29 -10 -45 -10s-29 4 -39 12s-15 17 -15 29h-3c-6 -10 -15 -19 -28 -28s-28 -13 -46 -13c-28 0 -49 9 -64 27s-23 42 -23 71c0 17 3 34 9 50s14 31 24 44s23 23 38 31s31 12 49 12c15 0 27 -4 38 -10c10 -6 18 -15 21 -24h1l5 24h54
+l-24 -113c-1 -6 -2 -12 -3 -19s-2 -13 -2 -19c0 -7 1 -13 4 -18s7 -7 15 -7c16 0 29 9 39 26s16 40 16 68c0 24 -4 45 -12 64s-20 34 -34 47s-32 23 -52 29s-41 9 -65 9c-26 0 -49 -4 -70 -13s-39 -22 -54 -38s-27 -34 -35 -56c-8 -21 -13 -44 -13 -69c0 -26 4 -51 13 -72
+s21 -39 37 -54s35 -27 57 -35s46 -12 72 -12c33 0 61 6 85 16s45 25 65 43zM231 260c-10 0 -18 -2 -25 -8s-14 -13 -19 -22s-8 -18 -11 -28s-4 -20 -4 -30c0 -5 0 -10 1 -16c1 -5 3 -10 6 -15s7 -8 12 -11s11 -5 19 -5c11 0 20 3 28 8s14 13 19 21s9 16 11 26s3 19 3 27
+c0 6 0 13 -1 19s-4 12 -7 17s-7 9 -12 12s-12 5 -20 5z" />
+    <glyph glyph-name="ion-backspace-outline" unicode="&#xf3be;" horiz-adv-x="512" 
+d="M413 116c2 -2 3 -4 3 -6s-1 -4 -3 -6l-21 -22c-2 -2 -4 -2 -6 -2s-4 0 -6 2l-76 77l-76 -77c-2 -2 -4 -2 -6 -2s-4 0 -6 2l-21 22c-2 2 -3 4 -3 6s1 4 3 6l76 76l-77 76c-3 3 -3 9 0 12l22 22c2 2 4 2 6 2s4 0 6 -2l76 -76l76 76c2 2 4 2 6 2s4 0 6 -2l22 -22
+c3 -3 3 -9 0 -12l-77 -76zM499 354c9 -9 13 -20 13 -33v-256c0 -27 -20 -49 -46 -49h-298c-13 0 -24 3 -34 9c-9 5 -16 11 -23 20v0l-1 1l-110 146l110 148c14 19 34 28 58 28h298c13 0 24 -5 33 -14zM480 65v256c0 9 -5 15 -14 15h-298c-11 0 -22 -3 -32 -16l-96 -128
+l96 -128c8 -10 17 -16 32 -16h298c9 0 14 8 14 17z" />
+    <glyph glyph-name="ion-backspace" unicode="&#xf3bf;" horiz-adv-x="512" 
+d="M499 354c9 -9 13 -20 13 -33v-256c0 -27 -20 -49 -46 -49h-298c-13 0 -24 3 -34 9c-9 5 -16 11 -23 20v0l-1 1l-110 146l110 148c14 19 34 28 58 28h298c13 0 24 -5 33 -14zM413 116l-76 76l77 76c3 3 3 9 0 12l-22 22c-2 2 -4 2 -6 2s-4 0 -6 -2l-76 -76l-76 76
+c-2 2 -4 2 -6 2s-4 0 -6 -2l-22 -22c-3 -3 -3 -9 0 -12l77 -76l-76 -76c-2 -2 -3 -4 -3 -6s1 -4 3 -6l21 -22c2 -2 4 -2 6 -2s4 0 6 2l76 77l76 -77c2 -2 4 -2 6 -2s4 0 6 2l21 22c2 2 3 4 3 6s-1 4 -3 6z" />
+    <glyph glyph-name="ion-bag" unicode="&#xf110;" 
+d="M416 288l32 -320h-448l32 320h64v4c0 68 56 124 124 124h8c68 0 124 -56 124 -124v-4h64zM128 292v-4h192v4c0 51 -41 92 -92 92v0h-8c-51 0 -92 -41 -92 -92zM36 0h376l-25 256h-35v-36c10 -6 16 -16 16 -28c0 -18 -14 -32 -32 -32s-32 14 -32 32c0 12 6 22 16 28v36
+h-192v-36c10 -6 16 -16 16 -28c0 -18 -14 -32 -32 -32s-32 14 -32 32c0 12 6 22 16 28v36h-35z" />
+    <glyph glyph-name="ion-battery-charging" unicode="&#xf111;" 
+d="M10 64c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381zM225 288l-100 -111h61l-27 -81l100 111h-61z" />
+    <glyph glyph-name="ion-battery-empty" unicode="&#xf112;" 
+d="M438 256c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37zM416 160v64h-15h-32v32v32h-337v-192h337v32v32h32h15z" />
+    <glyph glyph-name="ion-battery-full" unicode="&#xf113;" 
+d="M438 256c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37z" />
+    <glyph glyph-name="ion-battery-half" unicode="&#xf114;" 
+d="M438 256c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37zM416 160v64h-15h-32v32v32h-81l32 -192h49v32v32h32h15z" />
+    <glyph glyph-name="ion-battery-low" unicode="&#xf115;" 
+d="M10 64c-6 0 -10 4 -10 10v236c0 6 4 10 10 10h381c6 0 10 -4 10 -10v-54h37c6 0 10 -4 10 -10v-108c0 -6 -4 -10 -10 -10h-37v-54c0 -6 -4 -10 -10 -10h-381zM369 288h-209l32 -192h177v32v32h32h15v64h-15h-32v32v32z" />
+    <glyph glyph-name="ion-beaker" unicode="&#xf269;" horiz-adv-x="384" 
+d="M80 256h240v-224c0 -9 -7 -16 -16 -16h-208c-9 0 -16 7 -16 16v224zM296 104v48c0 4 -4 8 -8 8s-8 -4 -8 -8v-48c0 -4 4 -8 8 -8s8 4 8 8zM288 176c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM381 416c3 0 3 -2 3 -3s-2 -3 -3 -5s-13 -20 -13 -40v-336
+c0 -35 -29 -64 -64 -64h-208c-35 0 -64 29 -64 64v307c0 32 -2 33 -32 37c0 12 11 40 65 40h316zM336 368c0 5 0 16 1 16h-273c-1 0 -3 0 -4 -1c5 -7 4 -32 4 -44v-307c0 -18 14 -32 32 -32h210c17 0 30 14 30 32v336z" />
+    <glyph glyph-name="ion-beer" unicode="&#xf26a;" 
+d="M384 288c35 0 64 -29 64 -64v-96c0 -35 -29 -64 -64 -64h-32v-80c0 -9 -7 -16 -16 -16h-256c-9 0 -16 7 -16 16v223c-26 0 -48 22 -48 48v54v1c-10 11 -16 26 -16 42c0 35 29 64 64 64c18 0 34 -8 46 -20c10 12 26 20 43 20c14 0 27 -6 37 -14c12 9 26 14 42 14
+c17 0 34 -6 46 -16c11 10 26 16 42 16c35 0 64 -29 64 -64c0 -24 -18 -44 -32 -48v-16h32zM296 144c4 0 8 3 8 8v0v48c0 4 -4 8 -8 8s-8 -4 -8 -8v-48c0 -3 2 -6 4 -7c1 -1 2 -1 4 -1zM303 220c1 2 1 4 1 6s-1 4 -3 5s-4 1 -6 1s-4 -2 -5 -4s-2 -4 -2 -6s2 -4 4 -5
+s4 -1 6 -1s4 2 5 4zM320 288v32h-20c-3 -8 -7 -16 -13 -23c-13 -16 -33 -25 -55 -25c-26 0 -48 13 -61 33c-6 -2 -12 -3 -18 -3c-12 0 -23 4 -32 10c-2 1 -3 3 -5 4c-1 -2 -2 -3 -3 -5c-5 -6 -11 -10 -17 -14v-32v-9h80c0 4 4 8 8 8s8 -4 8 -8h128v32zM351 343c1 3 1 6 1 9
+c0 18 -14 32 -32 32c-9 0 -17 -4 -23 -10c-2 -2 -6 -5 -16 -6h-8c-6 1 -12 3 -14 5c-7 7 -16 11 -27 11c-9 0 -18 -4 -25 -9l-7 -7c0 -1 0 -1 -1 -2c-3 -3 -7 -5 -11 -5c-5 0 -8 3 -11 6c-1 2 -2 3 -3 5s-3 4 -5 6c-4 4 -10 6 -16 6c-10 0 -18 -9 -25 -16
+c-7 -8 -27 -8 -34 0s-18 16 -30 16c-18 0 -32 -14 -32 -32c0 -2 1 -5 1 -7c2 -9 7 -17 15 -21v-34v-35c0 -9 7 -16 16 -16v26v23v32c10 0 18 4 24 11c2 2 3 4 4 6c0 0 6 10 12 11s20 6 30 -5c4 -5 11 -9 19 -9c3 0 5 1 7 2c3 1 7 2 9 4v0c3 2 6 4 10 4c7 0 12 -4 14 -10
+c0 0 1 -1 1 -2c1 -3 1 -5 3 -8c7 -12 20 -20 35 -20c13 0 25 6 32 16c5 7 8 15 8 24s9 8 9 8h7h48c6 0 13 -3 15 -9zM416 128v96c0 18 -14 32 -32 32h-32v-160h32c18 0 32 14 32 32zM128 280c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM288 280c0 5 3 8 8 8s8 -3 8 -8
+s-3 -8 -8 -8s-8 3 -8 8z" />
+    <glyph glyph-name="ion-bluetooth" unicode="&#xf116;" horiz-adv-x="256" 
+d="M12 304c16 16 18 13 19 12l68 -65v0v0c2 -2 10 -10 10 -3v156v0v2c0 6 6 10 12 10c4 0 7 -2 9 -4v0s117 -113 122 -117s5 -10 1 -14l-84 -81s-4 -4 -4 -8s4 -8 4 -8l84 -81c4 -4 4 -10 -1 -14s-122 -117 -122 -117v0c-2 -2 -5 -4 -9 -4c-6 0 -12 4 -12 10v2v0v156
+s-8 -1 -10 -3v0v-1l-68 -64c-1 -1 -3 -4 -19 12s-12 17 -11 18s90 86 90 86s4 3 4 8v0c0 5 -4 8 -4 8s-89 85 -90 86s-5 2 11 18zM152 328v-79c0 -8 8 -1 10 1l30 30s3 5 3 7s-1 5 -3 7l-30 30c-2 2 -10 11 -10 4zM152 135v-79s8 2 10 4l30 30c2 2 3 5 3 7s-1 5 -3 7l-30 30
+c-2 2 -10 9 -10 1z" />
+    <glyph glyph-name="ion-bonfire" unicode="&#xf315;" horiz-adv-x="384" 
+d="M207 97l15 -89c1 -3 1 -5 1 -8c0 -18 -14 -32 -32 -32s-32 14 -32 32c0 2 0 5 1 7l15 92v0c2 7 8 13 16 13s15 -7 16 -15zM242 93v0v0v0zM329 58c9 -8 10 -25 0 -35s-27 -9 -35 0c-1 1 -2 3 -3 4l-49 66c-3 5 -2 11 2 15c5 5 10 5 16 1l64 -47c2 -1 3 -3 5 -4zM309 113v0
+v0v0zM371 126c9 -1 13 -7 13 -19c0 -9 -10 -14 -18 -12l-57 18v0v0c-3 2 -6 5 -5 9s4 7 8 6zM75 113v0v0v0zM75 113v0l-58 -18c-8 -2 -17 3 -17 12c0 12 3 18 12 19l60 2c4 1 7 -2 8 -6s-2 -7 -5 -9v0zM124 109c5 4 11 4 16 -1c4 -4 5 -10 2 -15l-49 -66c-1 -1 -2 -3 -3 -4
+c-10 -10 -25 -10 -35 0s-10 25 0 35c2 2 3 3 5 4zM288 320c0 -32 -9 -58 -50 -86c-37 -26 -94 -46 -110 -106c0 0 -58 24 -48 96s124 106 112 192c24 0 96 -35 96 -96zM288 192c-16 -50 -44 -64 -80 -64c-15 0 -32 9 -43 26c12 15 28 26 47 37c9 5 20 10 29 16
+c21 14 38 31 47 49c5 -15 5 -48 0 -64zM88 288c-6 4 -9 14 -8 27c2 22 34 39 32 69c14 2 31 -3 42 -24c-5 -11 -15 -21 -28 -34s-26 -22 -38 -38z" />
+    <glyph glyph-name="ion-bookmark" unicode="&#xf26b;" horiz-adv-x="192" 
+d="M184 384c4 0 8 -4 8 -8v-56h-192v56c0 4 4 8 8 8h176zM0 0v304h192v-304l-96 96z" />
+    <glyph glyph-name="ion-bowtie" unicode="&#xf3c0;" 
+d="M192 236c0 0 8 5 20 7c21 4 39 5 47 -9c10 -17 19 -53 17 -85c-1 -17 -5 -22 -5 -22s-15 -10 -47 -7c-35 3 -40 15 -40 15s5 12 8 43s0 58 0 58zM152 163c-17 -4 -38 -10 -38 -10s45 4 64 9c-4 -21 -10 -34 -10 -34s-83 -80 -116 -80c-28 0 -52 68 -52 144s26 144 52 144
+c35 0 106 -57 128 -97c0 0 3 -16 2 -32c-10 5 -24 10 -44 14c-28 6 -42 3 -42 3s18 -4 57 -17c15 -5 22 -8 29 -10c0 -3 -1 -7 -1 -10c0 -5 0 -10 -1 -15c-5 -2 -15 -6 -28 -9zM396 336c26 0 52 -68 52 -144s-24 -144 -52 -144c-37 0 -104 68 -112 79c0 0 4 5 5 22v9
+c16 -7 70 -13 70 -13s-21 6 -40 11c-13 4 -25 8 -30 10c-1 11 -2 23 -4 33c17 11 69 34 69 34s-15 -2 -35 -9c-14 -5 -29 -11 -37 -14c-3 10 -7 18 -10 24c0 1 -1 4 -1 4v1c22 40 89 97 125 97z" />
+    <glyph glyph-name="ion-briefcase" unicode="&#xf26c;" 
+d="M240 176v8h208v-176c0 -4 -4 -8 -8 -8h-432c-4 0 -8 4 -8 8v176h208v-8h32zM440 304c4 0 8 -4 8 -8v-96h-208v8h-32v-8h-208v96c0 4 4 8 8 8h120v31c1 28 22 49 51 49h90c30 0 50 -21 51 -49v-31h120zM288 332v1c0 10 -9 19 -19 19h-90c-10 0 -19 -9 -19 -19v-1v-1v-27
+h128v27v1z" />
+    <glyph glyph-name="ion-bug" unicode="&#xf2be;" 
+d="M343 321c-6 -16 -16 -31 -28 -43c-24 -24 -57 -37 -91 -37s-67 13 -91 37c-12 12 -22 27 -28 43c29 39 72 63 119 63s90 -24 119 -63zM95 305c22 -45 68 -77 121 -80v-225c-40 2 -77 22 -104 54c-7 -6 -10 -9 -13 -15c8 -9 7 -22 -1 -31c-9 -10 -24 -11 -34 -2
+s-11 24 -2 34l3 3s2 1 2 1c4 13 13 25 27 36c-15 26 -26 57 -29 90c-7 0 -12 -2 -17 -3c-1 -13 -11 -23 -24 -23s-24 11 -24 24s11 24 24 24h3c4 2 8 5 12 6c7 2 14 4 25 4c1 23 6 45 13 65c-6 4 -11 7 -15 11c-6 5 -11 13 -14 19c-1 0 -3 1 -4 2c-12 6 -15 21 -9 33
+s21 15 33 9c11 -6 15 -20 10 -31c2 -3 3 -7 4 -8c2 -2 5 -3 8 -5c2 3 3 5 5 8zM424 192c13 0 24 -11 24 -24s-11 -24 -24 -24s-23 10 -24 23c-5 1 -10 3 -17 3c-3 -33 -14 -64 -29 -90c14 -11 23 -23 27 -36c0 0 1 0 2 -1l3 -3c9 -10 8 -25 -2 -34s-25 -8 -34 2
+c-8 9 -9 22 -1 31c-3 6 -6 9 -13 15c-27 -32 -64 -52 -104 -54v225c53 3 99 35 121 80c2 -3 3 -5 5 -8c3 2 6 3 8 5c1 1 2 5 4 8c-5 11 -1 25 10 31c12 6 27 3 33 -9s3 -27 -9 -33c-1 -1 -3 -2 -4 -2c-3 -6 -8 -14 -14 -19c-4 -4 -9 -7 -15 -11c7 -20 12 -42 13 -65
+c11 0 18 -2 25 -4c4 -1 8 -4 12 -6h3z" />
+    <glyph glyph-name="ion-calculator" unicode="&#xf26d;" horiz-adv-x="320" 
+d="M304 416c9 0 16 -7 16 -16v-416c0 -9 -7 -16 -16 -16h-288c-9 0 -16 7 -16 16v416c0 9 7 16 16 16h288zM48 240v-32h32v32h-32zM48 176v-32h32v32h-32zM48 112v-32h32v32h-32zM144 16v32h-96v-32h96zM144 80v32h-32v-32h32zM144 144v32h-32v-32h32zM144 208v32h-32v-32
+h32zM208 16v32h-32v-32h32zM208 80v32h-32v-32h32zM208 144v32h-32v-32h32zM208 208v32h-32v-32h32zM272 16v96h-32v-96h32zM272 144v32h-32v-32h32zM272 208v32h-32v-32h32zM272 288v80h-224v-80h224z" />
+    <glyph glyph-name="ion-calendar" unicode="&#xf117;" 
+d="M112 320c-18 0 -32 14 -32 32v32c0 18 14 32 32 32s32 -14 32 -32v-32c0 -18 -14 -32 -32 -32zM336 320c-18 0 -32 14 -32 32v32c0 18 14 32 32 32s32 -14 32 -32v-32c0 -18 -14 -32 -32 -32zM440 384c4 0 8 -4 8 -8v-400c0 -4 -4 -8 -8 -8h-432c-4 0 -8 4 -8 8v400
+c0 4 4 8 8 8h56v-41c0 -22 24 -39 48 -39s48 17 48 39v41h128v-41c0 -22 25 -39 49 -39s47 17 47 39v41h56zM400 16v256h-352v-256h352z" />
+    <glyph glyph-name="ion-camera" unicode="&#xf118;" horiz-adv-x="416" 
+d="M382 301c18 0 34 -14 34 -33v-202c0 -19 -16 -34 -34 -34h-348c-19 0 -34 15 -34 34v202c0 19 15 33 34 33h69l39 40v0c6 7 15 11 25 11h84c9 0 17 -4 23 -10v0v0v0l41 -41h67zM208 82c51 0 92 42 92 93s-41 93 -92 93s-92 -42 -92 -93s41 -93 92 -93zM376 248
+c8 0 14 6 14 14s-6 14 -14 14s-14 -6 -14 -14s6 -14 14 -14zM208 245c38 0 70 -31 70 -70s-32 -70 -70 -70c-39 0 -70 31 -70 70s31 70 70 70z" />
+    <glyph glyph-name="ion-card" unicode="&#xf119;" 
+d="M420 352c16 0 28 -12 28 -28v0v-264v0c0 -16 -12 -28 -28 -28h-392c-16 0 -28 12 -28 28v0v0v264v0v0c0 16 12 28 28 28h392zM45 320c-7 0 -12 -5 -13 -12v-20h384v20c-1 7 -6 12 -13 12h-358zM403 64c7 0 12 5 13 12v116h-384v-116c1 -7 6 -12 13 -12h358zM64 128v16
+h192v-16h-192zM64 96v16h96v-16h-96zM320 96v48h64v-48h-64z" />
+    <glyph glyph-name="ion-cash" unicode="&#xf316;" horiz-adv-x="512" 
+d="M0 352h512v-256h-512v256zM193 128c-20 23 -33 58 -33 96s13 73 33 96h-97c0 -35 -29 -64 -64 -64v-80c27 0 48 -21 48 -48h113zM298 187c3 4 4 9 4 15c0 3 0 5 -1 8s-2 6 -4 8s-4 4 -7 6s-6 4 -10 5c-1 0 -4 1 -7 2s-5 0 -8 1v31c2 -1 5 -2 7 -3c4 -3 6 -7 7 -13h20
+c0 5 -2 9 -4 13s-5 8 -9 11s-9 5 -14 6c-2 1 -5 2 -7 2v9h-18v-9c-2 0 -4 -1 -6 -2c-5 -1 -10 -2 -14 -5s-7 -6 -9 -10s-4 -9 -4 -14c0 -3 0 -5 1 -8s2 -5 4 -7s5 -5 8 -7s7 -4 12 -5c3 -1 6 0 8 -1v-35c-3 1 -6 2 -9 4s-5 4 -6 7s-2 6 -2 9h-20c0 -5 2 -11 4 -16
+c3 -5 6 -8 10 -11s9 -6 15 -7c3 -1 5 -2 8 -2v-9h18v9c3 0 6 1 9 2c5 1 10 2 14 5s7 7 10 11zM480 176v80c-35 0 -64 29 -64 64h-97c20 -23 33 -58 33 -96s-13 -73 -33 -96h113c0 27 22 48 48 48zM64 224c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z
+M384 224c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32zM273 213c2 -1 4 -2 6 -4s3 -5 3 -9c0 -2 0 -4 -1 -6s-2 -4 -4 -5s-5 -3 -8 -4c-1 0 -2 -1 -4 -1v31c3 -1 6 -1 8 -2zM236 257c1 2 3 3 5 4s4 2 6 2v-26c-4 1 -7 3 -9 5s-4 4 -4 8c0 3 1 5 2 7zM0 32
+v32h512v-32h-512z" />
+    <glyph glyph-name="ion-chatbox-working" unicode="&#xf11a;" horiz-adv-x="416" 
+d="M76 48c-42 0 -76 31 -76 71v209c0 40 34 72 76 72h264c42 0 76 -32 76 -72v-209c0 -40 -34 -71 -76 -71h-4v-64s-79 54 -86 59s-7 5 -21 5h-153zM304 256c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM208 256c-18 0 -32 -14 -32 -32s14 -32 32 -32
+s32 14 32 32s-14 32 -32 32zM112 256c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32z" />
+    <glyph glyph-name="ion-chatbox" unicode="&#xf11b;" horiz-adv-x="416" 
+d="M76 48c-42 0 -76 31 -76 71v209c0 40 34 72 76 72h264c42 0 76 -32 76 -72v-209c0 -40 -34 -71 -76 -71h-4v-64s-79 54 -86 59s-7 5 -21 5h-153z" />
+    <glyph glyph-name="ion-chatboxes" unicode="&#xf11c;" horiz-adv-x="416" 
+d="M246 82l26 -18c-4 -21 -29 -32 -52 -32h-90c-8 0 -11 -2 -13 -3l-53 -45v48h-16c-26 0 -48 16 -48 41v129c0 25 20 45 46 45h2v-101c0 -33 29 -59 64 -59h117c10 0 14 -3 17 -5zM353 400c35 0 63 -27 63 -60v-168c0 -33 -28 -60 -63 -60h-17v-64l-75 60c-2 2 -7 4 -17 4
+h-101c-35 0 -63 27 -63 60v98v70c0 33 21 60 56 60h217z" />
+    <glyph glyph-name="ion-chatbubble-working" unicode="&#xf11d;" horiz-adv-x="416" 
+d="M208 -1c-115 0 -208 89 -208 200s93 201 208 201s208 -90 208 -201c0 -40 -12 -77 -33 -108c-1 -1 -2 -3 -3 -4v0c-2 -4 -4 -10 -4 -15l22 -88l-84 31c-4 2 -8 2 -12 2s-7 -1 -11 -2v0c-1 0 -1 -1 -2 -1c-25 -10 -52 -15 -81 -15zM304 224c-18 0 -32 -14 -32 -32
+s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM208 224c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM112 224c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32z" />
+    <glyph glyph-name="ion-chatbubble" unicode="&#xf11e;" horiz-adv-x="416" 
+d="M208 -1c-115 0 -208 89 -208 200s93 201 208 201s208 -90 208 -201c0 -40 -12 -77 -33 -108c-1 -1 -2 -3 -3 -4v0c-2 -4 -4 -10 -4 -15l22 -88l-84 31c-4 2 -8 2 -12 2s-7 -1 -11 -2v0c-1 0 -1 -1 -2 -1c-25 -10 -52 -15 -81 -15z" />
+    <glyph glyph-name="ion-chatbubbles" unicode="&#xf11f;" horiz-adv-x="416" 
+d="M25 57c-1 1 0 2 -1 3c-15 22 -24 49 -24 77c0 42 19 80 49 106c-2 -11 -4 -22 -4 -34c0 -92 78 -168 174 -168c15 0 30 2 44 6c-27 -32 -69 -53 -115 -53c-20 0 -40 5 -58 12h-1v0c-2 1 -5 2 -8 2s-6 -1 -9 -2l-56 -22l12 63c0 4 -1 7 -3 10v0zM242 400
+c96 0 174 -76 174 -168c0 -33 -11 -64 -28 -90c-1 -1 -1 -2 -2 -3v0c-2 -4 -3 -8 -3 -12l17 -74l-69 26c-3 1 -6 2 -10 2c-3 0 -6 -1 -9 -2v0l-2 -1c-8 -3 -16 -5 -24 -7c-14 -4 -29 -6 -44 -6c-96 0 -173 75 -173 167c0 12 1 24 3 35c16 76 86 133 170 133z" />
+    <glyph glyph-name="ion-checkmark-circled" unicode="&#xf120;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM339 267c1 1 1 2 1 3s0 3 -1 4l-31 24c-1 1 -3 1 -4 1s-2 0 -3 -1l-111 -143s-44 42 -45 43s-4 3 -6 3s-3 -2 -4 -3l-25 -25l-1 -1c-1 -1 -1 -3 -1 -4s0 -2 1 -3l2 -1
+s78 -75 79 -76s3 -3 5 -3s4 2 5 3z" />
+    <glyph glyph-name="ion-checkmark-round" unicode="&#xf121;" horiz-adv-x="416" 
+d="M400 376c17 -13 22 -39 9 -57l-207 -302c-13 -18 -37 -22 -54 -9s-137 147 -137 147c-15 16 -15 42 1 58s40 15 55 -2l99 -107l180 263c13 18 37 22 54 9z" />
+    <glyph glyph-name="ion-checkmark" unicode="&#xf122;" horiz-adv-x="416" 
+d="M414 338c1 -2 2 -4 2 -6s-1 -4 -2 -6l-249 -320c-2 -2 -5 -6 -9 -6s-8 3 -10 5s-141 136 -141 136l-3 3c-1 2 -2 4 -2 6s1 3 2 5l2 2c14 15 42 44 44 46s4 6 8 6s8 -4 10 -6s80 -78 80 -78l200 257c2 2 4 2 6 2s5 -1 7 -2z" />
+    <glyph glyph-name="ion-chevron-down" unicode="&#xf123;" 
+d="M224 150v0v0l174 167c4 4 12 4 16 0l31 -30c4 -4 4 -12 0 -16l-213 -204c-2 -2 -5 -3 -8 -3s-6 1 -8 3l-213 204c-4 4 -4 12 0 16l31 30c4 4 12 4 16 0z" />
+    <glyph glyph-name="ion-chevron-left" unicode="&#xf124;" horiz-adv-x="256" 
+d="M86 192l167 -174c4 -4 4 -12 0 -16l-30 -31c-4 -4 -12 -4 -16 0l-204 213c-2 2 -3 5 -3 8s1 6 3 8l204 213c4 4 12 3 16 -1l30 -30c4 -4 4 -12 0 -16l-167 -174v0v0z" />
+    <glyph glyph-name="ion-chevron-right" unicode="&#xf125;" horiz-adv-x="256" 
+d="M170 192v0v0l-167 174c-4 4 -4 12 0 16l30 30c4 4 12 5 16 1l204 -213c2 -2 3 -5 3 -8s-1 -6 -3 -8l-204 -213c-4 -4 -12 -4 -16 0l-30 31c-4 4 -4 12 0 16z" />
+    <glyph glyph-name="ion-chevron-up" unicode="&#xf126;" 
+d="M224 234l-174 -167c-4 -4 -12 -4 -16 0l-31 30c-4 4 -4 12 0 16l213 204c2 2 5 3 8 3s6 -1 8 -3l213 -204c4 -4 4 -12 0 -16l-31 -30c-4 -4 -12 -4 -16 0l-174 167v0v0z" />
+    <glyph glyph-name="ion-clipboard" unicode="&#xf127;" horiz-adv-x="352" 
+d="M80 288c2 20 10 35 28 40l1 1c12 3 21 7 21 20v21c0 26 21 46 46 46s46 -20 46 -46v-21c0 -13 9 -18 21 -21h2c18 -5 25 -20 27 -40h-192zM176 384c-8 0 -13 -6 -13 -14s5 -14 13 -14s14 6 14 14s-6 14 -14 14zM325 384c15 0 27 -12 27 -28v-360c0 -16 -12 -28 -27 -28
+h-149h-148c-15 0 -28 12 -28 28v360c0 16 13 28 28 28h73v-13c0 -11 -9 -19 -19 -19h-37c-7 0 -12 -6 -12 -13v-327c0 -6 5 -12 11 -12h265c6 0 11 6 11 12v327c0 7 -5 13 -12 13h-37c-10 0 -20 8 -20 19v13h74zM64 224v32h112v-32h-112zM64 32v32h160v-32h-160zM64 96v32
+h129v-32h-129zM64 160v32h208v-32h-208z" />
+    <glyph glyph-name="ion-clock" unicode="&#xf26e;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c10 10 19 21 26 33l-27 16l8 14l27 -16c13 25 21 52 22 81h-32v16h32c-1 29 -9 56 -22 81l-27 -16l-8 14l27 16c-7 12 -16 23 -26 33s-21 19 -33 26l-16 -27l-14 8
+l16 27c-25 13 -52 21 -81 22v-32h-16v32c-29 -1 -56 -9 -81 -22l16 -27l-14 -8l-16 27c-12 -7 -23 -16 -33 -26s-19 -21 -26 -33l27 -16l-8 -14l-27 16c-13 -25 -21 -52 -22 -81h32v-16h-32c1 -29 9 -56 22 -81l27 16l8 -14l-27 -16c7 -12 16 -23 26 -33s21 -19 33 -26
+l16 27l14 -8l-16 -27c25 -13 52 -21 81 -22v32h16v-32c29 1 56 9 81 22l-16 27l14 8l16 -27c12 7 23 16 33 26zM368 207v-32h-117c-6 -9 -16 -15 -27 -15c-18 0 -32 14 -32 32c0 12 6 22 16 28v68h32v-68c5 -3 9 -8 12 -13h116z" />
+    <glyph glyph-name="ion-close-circled" unicode="&#xf128;" 
+d="M224 415c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM332 116l-75 75l76 75c3 3 3 9 0 12l-22 21c-2 2 -4 3 -6 3s-3 -1 -5 -3l-76 -74l-76 74c-2 2 -3 3 -5 3s-4 -1 -6 -3l-21 -21c-3 -3 -3 -9 0 -12l76 -75l-76 -76
+c-2 -1 -2 -3 -2 -5s0 -4 2 -6l21 -22c2 -2 4 -2 6 -2s4 0 6 2l75 76l76 -75c2 -2 3 -3 5 -3s4 1 6 3l21 21c2 1 3 4 3 6s-1 4 -3 6z" />
+    <glyph glyph-name="ion-close-round" unicode="&#xf129;" horiz-adv-x="384" 
+d="M374 61c14 -14 14 -37 0 -51s-37 -14 -51 0l-131 131l-131 -131c-14 -14 -36 -14 -50 0s-14 37 0 51l130 131l-130 131c-14 14 -14 37 0 51s36 14 50 0l131 -131l131 131c14 14 37 14 51 0s14 -37 0 -51l-131 -131z" />
+    <glyph glyph-name="ion-close" unicode="&#xf12a;" horiz-adv-x="384" 
+d="M380 61c3 -3 4 -6 4 -10s-1 -7 -4 -10l-38 -37c-3 -3 -5 -4 -9 -4s-7 1 -10 4l-131 131l-131 -131c-3 -3 -5 -4 -9 -4s-7 1 -10 4l-38 37c-3 3 -4 6 -4 10s1 7 4 10l132 131l-132 130c-5 5 -5 15 0 20l37 38c3 2 6 4 10 4s7 -1 10 -4l131 -130l131 130c3 2 6 4 10 4
+s7 -1 10 -4l37 -38c5 -5 5 -14 0 -19l-132 -130z" />
+    <glyph glyph-name="ion-closed-captioning" unicode="&#xf317;" horiz-adv-x="512" 
+d="M0 384h512v-384h-512v384zM464 192c0 27 0 44 -4 80s-23 56 -59 60s-91 4 -138 4h-7h-7c-47 0 -102 0 -138 -4s-55 -24 -59 -60s-4 -53 -4 -80s2 -47 4 -80s19 -56 59 -60s96 -4 145 -4s105 0 145 4s57 27 59 60s4 53 4 80zM372 164v4h53c0 -27 -7 -48 -19 -62
+s-32 -21 -61 -21c-14 0 -26 2 -36 5s-18 9 -25 17s-12 19 -15 33s-5 30 -5 51s3 39 7 53s9 25 17 33s17 14 27 17s22 5 34 5c25 0 44 -7 57 -21s19 -37 19 -62h-52v1c0 20 -12 33 -27 33s-25 -11 -28 -30c0 0 -2 -11 -2 -29s2 -28 2 -28c1 -17 12 -29 27 -29s27 10 27 29v1z
+M195 164v4h53c0 -27 -7 -48 -19 -62s-32 -21 -61 -21c-14 0 -26 2 -36 5s-18 9 -25 17s-12 19 -15 33s-5 30 -5 51s3 39 7 53s9 25 17 33s17 14 27 17s22 5 34 5c25 0 44 -7 57 -21s19 -37 19 -62h-52v1c0 20 -12 33 -27 33s-25 -11 -28 -30c0 0 -2 -11 -2 -29s2 -28 2 -28
+c1 -17 12 -29 27 -29s27 10 27 29v1z" />
+    <glyph glyph-name="ion-cloud" unicode="&#xf12b;" 
+d="M366 215c45 0 82 -38 82 -84s-37 -83 -82 -83v0h-276c-49 0 -90 41 -90 91c0 40 26 74 61 86c5 29 29 51 59 51c10 0 18 -3 26 -7c19 40 59 67 105 67c64 0 115 -53 115 -118v-3z" />
+    <glyph glyph-name="ion-code-download" unicode="&#xf26f;" 
+d="M299 164l-63 -63v0l-1 -1v0l-2 -1v0l-1 -1v0l-2 -1v0h-1v0h-1c-1 0 -3 -1 -4 -1s-3 1 -4 1h-1v0h-1v0l-2 1v0l-1 1v0c-1 1 -2 1 -3 2v0l-63 63c-6 6 -6 17 0 23s18 6 24 0l35 -34v118c0 9 7 17 16 17s16 -8 16 -17v-118l35 34c6 6 18 6 24 0s6 -17 0 -23zM136 56
+c-6 0 -12 2 -17 7l-112 112c-9 9 -9 25 0 34l112 112c9 9 25 9 34 0s9 -25 0 -34l-95 -95l95 -95c9 -9 9 -25 0 -34c-5 -5 -11 -7 -17 -7zM312 56c-6 0 -12 2 -17 7c-9 9 -9 25 0 34l95 95l-95 95c-9 9 -9 25 0 34s25 9 34 0l112 -112c9 -9 9 -25 0 -34l-112 -112
+c-5 -5 -11 -7 -17 -7z" />
+    <glyph glyph-name="ion-code-working" unicode="&#xf270;" 
+d="M128 192c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM200 192c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM272 192c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM136 56c-7 0 -12 2 -17 7l-112 112c-5 5 -7 10 -7 17
+s2 12 7 17l112 112c5 5 10 7 17 7s12 -2 17 -7s7 -10 7 -17s-2 -12 -7 -17l-95 -95l95 -95c5 -5 7 -10 7 -17s-2 -12 -7 -17s-10 -7 -17 -7zM312 56c-7 0 -12 2 -17 7s-7 10 -7 17s2 12 7 17l95 95l-95 95c-5 5 -7 10 -7 17s2 12 7 17s10 7 17 7s12 -2 17 -7l112 -112
+c5 -5 7 -10 7 -17s-2 -12 -7 -17l-112 -112c-5 -5 -10 -7 -17 -7z" />
+    <glyph glyph-name="ion-code" unicode="&#xf271;" 
+d="M136 56c-6 0 -12 2 -17 7l-112 112c-9 9 -9 25 0 34l112 112c9 9 25 9 34 0s9 -25 0 -34l-95 -95l95 -95c9 -9 9 -25 0 -34c-5 -5 -11 -7 -17 -7zM312 56c-6 0 -12 2 -17 7c-9 9 -9 25 0 34l95 95l-95 95c-9 9 -9 25 0 34s25 9 34 0l112 -112c9 -9 9 -25 0 -34l-112 -112
+c-5 -5 -11 -7 -17 -7z" />
+    <glyph glyph-name="ion-coffee" unicode="&#xf272;" horiz-adv-x="384" 
+d="M319 191c37 -7 65 -40 65 -79c0 -20 -8 -39 -21 -54c-15 -17 -37 -26 -61 -26c-8 0 -17 1 -25 3c-6 1 -10 3 -15 5c-11 -15 -23 -25 -32 -33v0c-5 -5 -12 -7 -19 -7h-102c-7 0 -14 2 -19 7v0c-17 15 -41 36 -62 86s-28 91 -28 111s3 20 16 20h101c-5 17 -37 19 -37 46
+c0 17 15 32 28 37c-2 -8 -3 -14 -3 -21c0 -19 39 -30 39 -53c0 -3 0 -6 -1 -9h56c1 5 2 10 2 14c0 36 -56 36 -56 84c0 28 21 55 47 62c-4 -14 -9 -23 -9 -35c0 -32 57 -50 57 -88c0 -13 -5 -25 -12 -37h76c13 0 16 0 16 -20c0 -4 0 -8 -1 -13zM302 64c33 0 50 25 50 48
+s-17 43 -39 47c-4 -19 -11 -42 -21 -66c-4 -9 -8 -17 -12 -25c6 -3 13 -4 22 -4z" />
+    <glyph glyph-name="ion-compass" unicode="&#xf273;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224c0 39 10 76 27 108c-16 12 -27 30 -27 52c0 35 29 64 64 64c22 0 40 -11 52 -27c32 17 69 27 108 27zM32 352c0 -10 5 -20 13 -26c13 17 28 32 45 45c-6 8 -16 13 -26 13c-18 0 -32 -14 -32 -32z
+M360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56s100 20 136 56zM320 320c0 0 -54 -130 -72 -152s-120 -104 -120 -104s54 132 72 152s120 104 120 104z" />
+    <glyph glyph-name="ion-compose" unicode="&#xf12c;" horiz-adv-x="384" 
+d="M379 348c7 -7 7 -18 0 -25l-32 -31l-55 55l31 32c7 7 18 7 25 0zM282 338l55 -55l-177 -173l-64 -14l14 64zM320 192l32 32v-201c0 -13 -10 -23 -23 -23h-306c-13 0 -23 10 -23 23v306c0 13 10 23 23 23h201l-32 -32h-149c-6 0 -11 -5 -11 -10v-268s4 -10 10 -10h269
+s9 5 9 10v150z" />
+    <glyph glyph-name="ion-connection-bars" unicode="&#xf274;" horiz-adv-x="352" 
+d="M0 32v64h64v-64h-64zM96 32v128h64v-128h-64zM192 32v224h64v-224h-64zM288 32v320h64v-320h-64z" />
+    <glyph glyph-name="ion-contrast" unicode="&#xf275;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56v-384c51 0 100 20 136 56z" />
+    <glyph glyph-name="ion-crop" unicode="&#xf3c1;" 
+d="M320 -32v48h64v-48h-64zM384 96h64v-64h-384v256h-64v64h64v64h64v-320h192v192h-176v64h240v-256z" />
+    <glyph glyph-name="ion-cube" unicode="&#xf318;" 
+d="M435 280c7 0 13 -6 13 -12v-183c0 -9 -6 -17 -14 -22v-1l-175 -92v-1c-2 -1 -4 -1 -6 -1c-7 0 -13 6 -13 12v185c0 9 5 17 13 22v0l3 2l172 89l2 1c2 1 3 1 5 1zM422 329c0 0 8 -3 8 -9c0 -7 -8 -11 -8 -11l-183 -97l-2 -1c-4 -2 -8 -3 -13 -3s-9 1 -13 3l-2 1l-183 96
+s-8 5 -8 12c0 6 8 9 8 9l181 82s11 5 17 5s17 -5 17 -5zM195 187c8 -5 13 -13 13 -22v-185c0 -6 -6 -12 -13 -12c-2 0 -4 1 -6 2v0l-175 92v1c-8 5 -14 13 -14 22v183c0 6 6 12 13 12c2 0 4 0 5 -1l2 -1l171 -89z" />
+    <glyph glyph-name="ion-disc" unicode="&#xf12d;" 
+d="M224 289c54 0 97 -43 97 -97s-43 -97 -97 -97s-97 43 -97 97s43 97 97 97zM224 148c24 0 44 20 44 44s-20 44 -44 44s-44 -20 -44 -44s20 -44 44 -44zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM224 69
+c68 0 123 55 123 123s-55 123 -123 123s-123 -55 -123 -123s55 -123 123 -123z" />
+    <glyph glyph-name="ion-document-text" unicode="&#xf12e;" horiz-adv-x="288" 
+d="M286 279c1 -3 2 -6 2 -10v-245c0 -13 -10 -24 -22 -24h-243c-12 0 -23 11 -23 24v336c0 13 11 24 23 24h160c3 0 6 0 9 -2c2 -1 5 -3 7 -5l84 -92c2 -2 2 -4 3 -6zM48 269v-10c0 -1 1 -3 3 -3h71c2 0 3 2 3 3v10c0 2 -1 3 -3 3h-71c-2 0 -3 -1 -3 -3zM48 141v-10
+c0 -1 1 -3 3 -3h123c2 0 2 2 2 3v10c0 2 0 3 -2 3h-123c-2 0 -3 -1 -3 -3zM208 67v10c0 2 0 3 -2 3h-155c-2 0 -3 -1 -3 -3v-10c0 -1 1 -3 3 -3h155c2 0 2 2 2 3zM240 195v10c0 2 0 3 -2 3h-187c-2 0 -3 -1 -3 -3v-10c0 -1 1 -3 3 -3h187c2 0 2 2 2 3zM193 270h60l-71 78
+v-66c0 -6 5 -12 11 -12z" />
+    <glyph glyph-name="ion-document" unicode="&#xf12f;" horiz-adv-x="288" 
+d="M287 279c1 -3 1 -5 1 -9v-244c0 -13 -9 -26 -21 -26h-243c-12 0 -24 13 -24 26v335c0 13 12 23 24 23h160c3 0 6 0 9 -2c2 -1 5 -2 7 -4l83 -92c2 -2 3 -4 4 -7zM193 337v-63h58zM32 32h224v210h-67c-15 0 -28 13 -28 28v82h-129v-320z" />
+    <glyph glyph-name="ion-drag" unicode="&#xf130;" horiz-adv-x="512" 
+d="M0 272v32h512v-32h-512zM0 176v32h512v-32h-512zM0 80v32h512v-32h-512z" />
+    <glyph glyph-name="ion-earth" unicode="&#xf276;" 
+d="M325 322c2 -4 7 -12 3 -15c-3 -2 -10 -2 -13 5s0 11 -5 9s-7 3 -6 4c1 2 3 3 5 4c0 2 -4 8 2 7c4 -1 12 -10 14 -14zM344 277v0v0zM403 251c0 0 -2 0 0 0v0zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM141 19l8 -4
+c3 -1 6 -2 10 -3c14 -5 28 -8 43 -10c28 -3 56 -1 83 8c15 5 30 11 43 20c6 4 6 16 10 24c8 16 -2 33 12 47c12 14 4 19 4 34c0 10 8 18 4 29c-1 4 -7 -3 -9 1c-5 7 -21 1 -28 2c-13 2 -24 14 -33 23c-5 5 0 20 1 26c4 15 0 33 19 38c5 1 5 9 10 11c5 1 10 3 15 4
+c9 1 17 -2 26 -2c10 0 14 -5 22 -11c7 -6 13 -3 22 -5c7 0 0 5 -2 8c-3 2 -6 2 -8 2c-16 4 -23 22 -36 30c-6 3 -9 2 -11 0c-1 -1 1 -12 1 -12c-1 -3 -10 -4 -13 -5c-9 -2 -29 17 -15 22c4 1 27 5 24 15c-3 6 2 13 -5 14c-8 1 -7 7 -15 8c-5 1 -5 11 -5 14c0 9 2 6 9 7
+c-17 11 -37 19 -57 24c-1 -3 -5 -12 -8 -12c-5 -1 -6 0 -9 -3c-9 -10 -16 -28 -25 -7c-4 11 5 19 2 28h-6h-3c6 -12 -5 -18 -8 -19c-8 0 -10 5 -17 4c-4 -1 -7 4 -11 2s-13 -8 -14 -12c-3 -12 6 -13 14 -6c6 6 17 12 25 6c6 -5 5 -9 5 -14s-1 -18 -9 -16c-4 1 -7 6 -11 3
+c-8 -7 -18 -6 -29 -9c-10 -2 -16 -6 -25 -9c-8 -3 -11 -4 -12 -12c0 -2 0 -14 -3 -15c-5 -2 -8 22 -22 20c-12 -1 -30 -13 -25 -28c2 -5 28 -3 10 -14c-2 -1 2 -17 2 -20c1 -8 13 -18 21 -10c6 6 6 5 14 2c15 -8 33 -15 45 -27c6 -6 9 -24 17 -28c9 -5 19 -5 26 -14
+c6 -7 -2 -19 -8 -23c-4 -2 -12 -24 -16 -29c-2 -4 -12 -6 -16 -7c-3 0 -7 -9 -9 -11c-7 -7 -8 -13 -17 -19c-18 -12 -22 -23 -18 -44c2 -8 5 -13 11 -16zM100 46l2 -2c7 -6 15 -11 23 -16c-21 21 -23 49 -21 78l3 24c1 3 -4 7 -4 11c0 10 0 5 -8 13c-4 4 -10 11 -12 17
+c-7 16 1 30 10 43c9 14 -7 20 -10 32c-1 6 -7 6 -6 12c1 7 -4 5 -9 9c-12 8 -1 20 -7 26c-43 -70 -36 -162 16 -224c1 -1 0 -1 1 -2h1c3 -4 6 -8 9 -11s7 -6 10 -9z" />
+    <glyph glyph-name="ion-easel" unicode="&#xf3c2;" 
+d="M48 112v192h352v-192h-352zM432 352c9 0 16 -7 16 -16v-256c0 -9 -7 -16 -16 -16h-416c-9 0 -16 7 -16 16v256c0 9 7 16 16 16h416zM416 96v224h-384v-224h384zM48 -32l29 80h31l-28 -80h-32zM239 416l17 -48h-64l17 48h30zM340 48h31l29 -80h-32zM208 0v48h32v-48h-32z
+" />
+    <glyph glyph-name="ion-edit" unicode="&#xf2bf;" 
+d="M381 259l-250 -251l-91 91l251 250zM440 360c12 -12 11 -32 -2 -45l-45 -45l-91 91l45 45c13 13 33 14 45 2zM32 85l85 -85l-117 -32z" />
+    <glyph glyph-name="ion-egg" unicode="&#xf277;" horiz-adv-x="320" 
+d="M160 416c64 0 160 -133 160 -257s-64 -191 -160 -191s-160 67 -160 191s96 257 160 257z" />
+    <glyph glyph-name="ion-eject" unicode="&#xf131;" horiz-adv-x="320" 
+d="M303 128h-286v0c-10 0 -17 7 -17 16c0 3 1 5 3 8l138 191c5 5 11 9 19 9s14 -4 19 -9l138 -190c2 -3 3 -6 3 -9c0 -9 -7 -16 -17 -16v0zM308 96c7 0 12 -5 12 -12v-40c0 -7 -5 -12 -12 -12h-296c-7 0 -12 5 -12 12v40c0 7 5 12 12 12h296z" />
+    <glyph glyph-name="ion-email-unread" unicode="&#xf3c3;" horiz-adv-x="480" 
+d="M352 288c0 43 21 64 64 64s64 -21 64 -64s-21 -64 -64 -64s-64 21 -64 64zM209 288h127c0 -17 5 -33 15 -47c-6 -3 -14 -8 -22 -12s-16 -8 -23 -12s-14 -8 -22 -12s-15 -8 -21 -11s-11 -6 -16 -9s-9 -5 -12 -7s-4 -3 -5 -3c-6 -3 -13 -4 -21 -4s-15 1 -21 4
+c-1 1 -15 8 -42 23s-54 29 -81 44s-43 23 -46 25c-7 4 -12 8 -13 11c-1 4 -1 6 1 8s6 2 11 2h191zM277 175c18 11 45 30 83 56c16 -15 34 -23 56 -23v-155c0 -2 -1 -4 -2 -7s-3 -5 -5 -7s-4 -4 -7 -5s-6 -2 -8 -2h-185h-185c-5 0 -11 2 -16 7s-8 9 -8 14v205c0 6 3 8 9 5
+c2 -1 11 -7 26 -17s32 -22 53 -36s39 -26 53 -35l-83 -93c-2 -2 -2 -4 -1 -5c2 -1 4 -1 6 1l98 83c16 -10 25 -16 27 -17c6 -3 13 -4 21 -4s15 1 21 4c2 1 11 7 27 17l98 -83c2 -2 5 -2 6 -1s0 3 -2 5z" />
+    <glyph glyph-name="ion-email" unicode="&#xf132;" horiz-adv-x="416" 
+d="M19 299c-4 2 -11 7 -13 11c-3 8 1 10 12 10h191h191c11 0 15 -2 12 -10c-2 -4 -9 -9 -13 -11c-11 -6 -163 -89 -169 -92s-12 -4 -21 -4s-15 1 -21 4s-158 86 -169 92zM408 295c9 4 8 -1 8 -5v-205c0 -9 -12 -21 -22 -21h-185h-185c-10 0 -24 12 -24 21v205s0 9 9 5
+c8 -4 83 -56 132 -88l-83 -93c-2 -2 -2 -4 -1 -5s4 -1 6 1l98 83c15 -10 25 -16 27 -17c8 -4 14 -4 21 -4s13 0 21 4c2 1 12 7 27 17l98 -83c2 -2 5 -2 6 -1s0 3 -2 5l-82 93c49 32 123 84 131 88z" />
+    <glyph glyph-name="ion-erlenmeyer-flask-bubbles" unicode="&#xf3c4;" horiz-adv-x="384" 
+d="M382 21c2 -4 3 -10 0 -14s-8 -7 -13 -7h-177h-178c-5 0 -9 3 -12 7s-2 10 0 14l118 199v150c0 8 6 14 14 14s15 -6 15 -14v-80c4 3 10 5 16 5c15 0 27 -12 27 -27s-12 -26 -27 -26c-6 0 -12 2 -16 5v-31c0 -2 -1 -4 -2 -6l-35 -59h72c-15 6 -26 20 -26 37
+c0 23 19 42 43 42c15 0 27 -8 35 -19c-1 2 -1 3 -1 5v154c0 8 6 14 14 14s15 -6 15 -14v-150zM218 151h53l-31 54c2 -5 3 -11 3 -17c0 -17 -10 -31 -25 -37zM201 319c-12 0 -22 9 -22 21s10 21 22 21s22 -9 22 -21s-10 -21 -22 -21z" />
+    <glyph glyph-name="ion-erlenmeyer-flask" unicode="&#xf3c5;" horiz-adv-x="384" 
+d="M375 52c6 -9 9 -20 9 -32c0 -28 -16 -52 -63 -52h-258c-47 0 -63 24 -63 52c0 12 3 23 9 32l49 73l49 77c13 20 21 44 21 70v92s-14 34 -16 43c-2 8 1 9 17 9h126c16 0 18 -1 16 -9c-2 -9 -15 -22 -15 -42v-93c0 -26 6 -50 19 -70zM345 7c3 3 7 8 7 14c0 5 -2 10 -4 14
+l-101 150c-16 26 -23 56 -23 87v112h-64v-112c0 -32 -9 -62 -25 -87l-99 -150c-2 -4 -4 -9 -4 -14c0 -6 3 -11 6 -14c4 -4 12 -7 25 -7h258c13 0 20 3 24 7zM325 37c1 -2 3 -6 3 -8c0 -7 -6 -15 -14 -15h-244c-7 0 -14 6 -14 14c0 3 1 6 3 8l81 124h103l82 -124v1zM238 106
+c2 -1 4 -2 6 -2s3 0 5 2c1 2 3 4 3 6s-1 4 -3 6c-1 2 -3 2 -5 2s-4 0 -6 -2c-1 -2 -2 -4 -2 -6s0 -4 2 -6zM285 47c4 2 4 7 2 11l-23 36c-1 2 -4 4 -7 4c-2 0 -3 0 -4 -1c-4 -2 -4 -7 -2 -11l23 -36c1 -2 5 -4 7 -4c1 0 3 0 4 1z" />
+    <glyph glyph-name="ion-eye-disabled" unicode="&#xf306;" 
+d="M344 290c41 -27 76 -66 104 -100c-51 -54 -124 -135 -224 -135c-36 0 -65 8 -92 22l-77 -77l-23 23l71 71c-36 25 -68 61 -103 98c78 85 142 137 224 137c34 0 64 -9 92 -23l77 78l23 -23zM134 192c0 -19 6 -36 16 -51l27 27c-4 7 -5 15 -5 24c0 29 23 53 52 53h8
+c-5 -6 -8 -13 -8 -21c0 -3 0 -5 1 -8l51 50c-15 11 -33 17 -52 17c-49 0 -90 -41 -90 -91zM224 101c49 0 90 41 90 91c0 19 -6 37 -16 52l-50 -51c3 -1 5 -1 8 -1c8 0 14 3 20 7v-7c0 -29 -23 -53 -52 -53c-9 0 -17 2 -24 6l-28 -27c15 -11 33 -17 52 -17z" />
+    <glyph glyph-name="ion-eye" unicode="&#xf133;" 
+d="M224 320c99 0 172 -70 224 -129c-51 -50 -124 -127 -224 -127s-157 60 -224 128c78 79 142 128 224 128zM224 101c49 0 90 41 90 91s-41 91 -90 91s-90 -41 -90 -91s41 -91 90 -91zM224 224c0 -18 14 -32 32 -32c8 0 14 3 20 7v-7c0 -29 -23 -53 -52 -53s-52 24 -52 53
+s23 53 52 53h8c-5 -6 -8 -13 -8 -21z" />
+    <glyph glyph-name="ion-female" unicode="&#xf278;" horiz-adv-x="256" 
+d="M160 164v-68h64v-64h-64v-64h-64v64h-64v64h64v68c-55 14 -96 64 -96 124c0 71 57 128 128 128s128 -57 128 -128c0 -60 -41 -110 -96 -124zM128 208c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+    <glyph glyph-name="ion-filing" unicode="&#xf134;" horiz-adv-x="384" 
+d="M317 319c12 0 19 0 19 -20v-28h-288v28c0 20 8 20 20 20h249zM269 352c13 0 19 -1 19 -19h-192c0 18 7 19 20 19h153zM368 278c13 -8 17 -17 15 -41l-17 -184c-4 -21 -16 -21 -24 -21h-300c-8 0 -20 0 -24 21l-17 185c-3 26 1 31 15 40l15 10v-32h321v32z" />
+    <glyph glyph-name="ion-film-marker" unicode="&#xf135;" horiz-adv-x="416" 
+d="M400 240c9 0 16 -7 16 -15v-210c0 -8 -7 -15 -16 -15h-384c-9 0 -16 7 -16 15v210c0 8 6 14 13 15c-2 2 -3 4 -4 7l-9 45c-2 8 5 16 13 18l370 74c8 2 16 -4 18 -12l9 -46c2 -8 -4 -16 -12 -18l-342 -68h344zM257 46l-20 58l51 36h-62l-20 58l-19 -58h-63l51 -36l-19 -58
+l50 36z" />
+    <glyph glyph-name="ion-fireball" unicode="&#xf319;" horiz-adv-x="320" 
+d="M297 210c14 -24 23 -52 23 -82c0 -33 -10 -63 -26 -88v0v0c-29 -43 -78 -72 -134 -72c-17 0 -32 1 -46 7s-25 13 -33 25c-11 16 -17 28 -21 52c-6 -25 2 -48 9 -60c-43 26 -69 71 -69 125v4c5 78 65 109 90 151c8 14 13 30 10 48c11 -9 15 -25 15 -39
+c0 -16 -3 -29 -3 -29c4 8 7 18 9 31c6 35 2 85 -37 132l-1 1s7 0 18 -3c95 -16 169 -91 184 -186c2 -12 3 -23 3 -35c0 -16 -2 -32 -5 -47c10 23 13 43 14 55v10z" />
+    <glyph glyph-name="ion-flag" unicode="&#xf279;" horiz-adv-x="384" 
+d="M362 266c0 0 12 2 22 6c0 -16 -7 -32 -9 -36c-28 -50 -99 -123 -181 -84c-65 31 -92 30 -117 24c-1 0 -2 -1 -3 -1c-3 -1 -15 -5 -26 -1v197c0 16 14 31 33 35c39 7 106 5 148 -74c39 -74 97 -72 133 -66zM24 416c4 0 8 -4 8 -8v-432c0 -4 -4 -8 -8 -8h-16
+c-4 0 -8 4 -8 8v432c0 4 4 8 8 8h16z" />
+    <glyph glyph-name="ion-flame" unicode="&#xf31a;" horiz-adv-x="256" 
+d="M1 128c-11 109 72 224 159 288c-26 -145 97 -142 96 -288c-1 -120 -105 -160 -128 -160s-114 26 -127 160zM88 80c0 -44 40 -80 40 -80s41 36 41 80s-41 80 -41 80s-40 -36 -40 -80z" />
+    <glyph glyph-name="ion-flash-off" unicode="&#xf136;" 
+d="M115 -4c-69 38 -115 112 -115 196c0 124 100 224 224 224c24 0 47 -4 68 -11c2 -1 3 -1 5 -2c12 -4 24 -9 35 -15v0c69 -38 116 -112 116 -196c0 -124 -100 -224 -224 -224c-24 0 -47 4 -68 11c-2 1 -3 1 -5 2c-12 4 -24 8 -35 14zM86 291c-20 -28 -32 -62 -32 -99
+c0 -65 36 -121 90 -150c6 -3 13 -7 19 -9c2 -1 3 -1 5 -2c9 -3 19 -5 29 -7c9 -2 18 -2 27 -2c37 0 71 12 99 32l-52 53l36 40l55 -54c20 28 32 62 32 99c0 66 -37 123 -91 151c-6 3 -12 6 -18 8c-2 1 -3 1 -5 2c-9 3 -19 5 -29 7c-9 2 -18 2 -27 2c-37 0 -72 -12 -100 -32
+l53 -52l-36 -41zM178 58l38 113h-85l139 155l-38 -113h85z" />
+    <glyph glyph-name="ion-flash" unicode="&#xf137;" horiz-adv-x="320" 
+d="M0 160l224 256l-51 -192h147l-224 -256l51 192h-147z" />
+    <glyph glyph-name="ion-folder" unicode="&#xf139;" horiz-adv-x="384" 
+d="M366 256c18 0 19 -7 18 -18l-12 -186c-1 -11 -3 -20 -21 -20h-317c-18 0 -20 9 -21 20l-13 184c-1 11 0 20 18 20h348zM362 305l2 -33h-344c0 6 4 46 6 63c2 18 8 17 25 17h75c28 0 23 0 37 -15c16 -18 19 -17 41 -17h143c11 0 15 -3 15 -15z" />
+    <glyph glyph-name="ion-fork-repo" unicode="&#xf2c0;" horiz-adv-x="320" 
+d="M320 368v-64h-48v-48h-64v48h-48v64h48v48h64v-48h48zM208 208h64v-5v0c0 -43 -7 -70 -38 -95c-23 -19 -51 -20 -75 -22c-9 -1 -18 -2 -26 -3c-6 -1 -13 -5 -20 -10c9 -11 15 -25 15 -41c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v210c-19 11 -32 31 -32 55
+c0 35 29 64 64 64s64 -29 64 -64c0 -24 -13 -44 -32 -55v-160c8 4 18 7 27 9c11 2 21 2 31 3c17 1 33 3 40 9c10 8 14 11 14 50zM64 384c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM64 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32
+s14 -32 32 -32z" />
+    <glyph glyph-name="ion-fork" unicode="&#xf27a;" horiz-adv-x="128" 
+d="M78 299v0v0v0zM128 282c0 -26 -15 -48 -37 -58c-12 -6 -11 -11 -11 -11s16 -200 16 -213s-3 -18 -9 -24s-15 -8 -23 -8v0v0c-8 0 -16 2 -22 8s-10 13 -10 24s16 213 16 213s0 6 -11 11c-22 10 -37 32 -37 58c0 43 15 93 24 134h8v-117c0 -6 3 -11 9 -11s9 4 10 10v1
+l9 117h8l10 -117v-1c1 -6 3 -10 9 -10s9 5 9 11v117h8v0c9 -40 24 -91 24 -134z" />
+    <glyph glyph-name="ion-forward" unicode="&#xf13a;" horiz-adv-x="384" 
+d="M224 150c-102 0 -171 -9 -224 -102c0 0 37 208 224 208v80l160 -144l-160 -134v92z" />
+    <glyph glyph-name="ion-funnel" unicode="&#xf31b;" 
+d="M224 416c124 0 224 -36 224 -80c0 -8 -3 -15 -9 -22v0c-35 -43 -151 -179 -151 -218v-4v-83v0c0 -23 -29 -41 -64 -41s-64 18 -64 41v0v87c0 39 -117 177 -149 216v0c-7 8 -11 16 -11 24c0 44 100 80 224 80zM224 288c92 0 176 22 176 48s-83 48 -176 48
+s-176 -22 -176 -48s84 -48 176 -48z" />
+    <glyph glyph-name="ion-gear-a" unicode="&#xf13d;" horiz-adv-x="384" 
+d="M347 192c0 -24 15 -43 37 -56c-4 -13 -10 -26 -16 -38c-25 6 -45 -3 -62 -20s-22 -37 -16 -62c-12 -6 -25 -12 -38 -16c-13 22 -36 37 -60 37s-47 -15 -60 -37c-13 4 -27 10 -39 16c6 25 2 45 -15 62s-37 21 -62 15c-6 12 -12 26 -16 39c22 13 37 36 37 60s-15 43 -37 56
+c4 13 9 26 16 38c25 -6 45 3 62 20s21 37 15 62c12 6 26 12 39 16c13 -22 36 -37 60 -37s47 15 60 37c13 -4 27 -10 39 -16c-6 -25 -2 -45 15 -62s37 -26 62 -20c6 -12 12 -25 16 -38c-22 -13 -37 -32 -37 -56zM192 94c54 0 98 44 98 98s-44 98 -98 98s-98 -44 -98 -98
+s44 -98 98 -98z" />
+    <glyph glyph-name="ion-gear-b" unicode="&#xf13e;" horiz-adv-x="384" 
+d="M384 154h-44c-4 -14 -10 -27 -17 -39l32 -32l-54 -54l-33 32c-12 -7 -24 -11 -38 -15v-46h-76v46c-13 4 -26 8 -38 15l-33 -32l-54 54l32 32c-7 12 -13 25 -17 39h-44v76h43c4 14 9 29 16 41l-30 30l54 54l29 -29c13 8 27 13 42 17v41h76v-41c15 -4 29 -9 42 -17l29 29
+l54 -54l-30 -30c7 -12 13 -27 16 -41h43v-76zM192 138c30 0 54 24 54 54s-24 54 -54 54s-54 -24 -54 -54s24 -54 54 -54z" />
+    <glyph glyph-name="ion-grid" unicode="&#xf13f;" horiz-adv-x="320" 
+d="M64 295c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM192 295c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM320 295c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM64 167
+c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM192 167c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM320 167c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM64 39
+c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM192 39c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50zM320 39c0 -4 -3 -7 -7 -7h-50c-4 0 -7 3 -7 7v50c0 4 3 7 7 7h50c4 0 7 -3 7 -7v-50z" />
+    <glyph glyph-name="ion-hammer" unicode="&#xf27b;" horiz-adv-x="320" 
+d="M314 416c3 0 6 -3 6 -6v-84c0 -3 -3 -6 -6 -6h-52c-3 0 -6 3 -6 6v14c-6 5 -16 9 -22 7c-7 -2 -23 -13 -30 -25s-6 -28 -6 -66l8 -2c5 -1 7 -6 7 -9v-70c0 -95 11 -201 11 -201c0 -3 -3 -6 -6 -6h-84c-3 0 -6 3 -6 6c0 0 11 106 11 201v70c0 3 3 8 7 9l7 2
+c0 43 -5 58 -22 74c-18 16 -41 19 -63 17s-51 -35 -58 -45s-10 2 -10 11c1 16 22 60 72 81s91 22 102 22s27 -1 38 -3s16 -18 26 -18c7 0 14 5 18 9v6c0 3 3 6 6 6h52z" />
+    <glyph glyph-name="ion-happy-outline" unicode="&#xf3c6;" 
+d="M355 158c8 -4 11 -13 7 -21c-24 -46 -78 -73 -138 -73c-62 0 -118 29 -139 74c-4 8 0 17 8 21c2 1 5 1 7 1c6 0 11 -3 14 -9c16 -34 60 -55 110 -55c49 0 92 21 110 56c3 5 8 8 14 8c3 0 5 -1 7 -2zM381 217c5 -7 4 -17 -4 -22c-3 -2 -6 -3 -10 -3c-5 0 -11 2 -14 6
+s-7 10 -17 10s-14 -6 -17 -10s-9 -6 -14 -6c-4 0 -7 1 -10 3c-8 6 -9 15 -3 22c11 14 23 23 44 23s35 -9 45 -23zM157 217c5 -7 4 -17 -4 -22c-3 -2 -6 -3 -10 -3c-5 0 -11 2 -14 6s-7 10 -17 10s-14 -6 -17 -10s-9 -6 -14 -6c-4 0 -7 1 -10 3c-8 6 -9 15 -3 22
+c11 14 23 23 44 23s35 -9 45 -23zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56
+s100 20 136 56z" />
+    <glyph glyph-name="ion-happy" unicode="&#xf31c;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM71 195c3 -2 6 -3 10 -3c5 0 11 2 14 6s7 10 17 10s14 -6 17 -10s9 -6 14 -6c4 0 7 1 10 3c8 5 9 15 4 22c-10 14 -24 23 -45 23s-33 -9 -44 -23c-6 -7 -5 -16 3 -22zM362 137
+c4 8 1 17 -7 21c-2 1 -4 2 -7 2c-6 0 -11 -3 -14 -8c-18 -35 -61 -56 -110 -56c-50 0 -94 21 -110 55c-3 6 -8 9 -14 9c-2 0 -5 0 -7 -1c-8 -4 -12 -13 -8 -21c21 -45 77 -74 139 -74c60 0 114 27 138 73zM377 195c8 5 9 15 4 22c-10 14 -24 23 -45 23s-33 -9 -44 -23
+c-6 -7 -5 -16 3 -22c3 -2 6 -3 10 -3c5 0 11 2 14 6s7 10 17 10s14 -6 17 -10s9 -6 14 -6c4 0 7 1 10 3z" />
+    <glyph glyph-name="ion-headphone" unicode="&#xf140;" horiz-adv-x="384" 
+d="M383 210c3 -51 -3 -130 -13 -162c-20 -67 -40 -80 -72 -80s-58 27 -58 59v106c0 33 23 59 53 59c18 0 34 -9 44 -24c0 0 11 7 13 22s4 34 -5 64s-21 19 -36 38c-2 3 -5 7 -8 10l-10 10c-2 2 -3 3 -5 4c-11 9 -21 17 -34 23c-19 9 -39 13 -60 13s-42 -4 -61 -13
+c-13 -6 -22 -14 -33 -23c-2 -1 -3 -2 -5 -4l-10 -10s-6 -7 -8 -10c-15 -19 -27 -8 -36 -38c-9 -31 -7 -49 -5 -64s13 -22 13 -22c10 15 26 24 44 24c30 0 53 -27 53 -59v-106c0 -32 -26 -59 -58 -59s-52 13 -72 80c-10 32 -16 111 -13 162c3 60 22 108 56 145v0
+c8 8 15 16 24 23s19 13 29 18c25 13 53 20 82 20s57 -7 82 -20c10 -5 19 -11 28 -18s17 -15 25 -23v0c34 -37 53 -85 56 -145z" />
+    <glyph glyph-name="ion-heart-broken" unicode="&#xf31d;" horiz-adv-x="416" 
+d="M181 160c0 -36 -2 -71 4 -107c2 -10 2 -20 2 -31l-153 159c-45 47 -45 124 0 171c40 41 103 43 144 3c-2 -15 -3 -31 -3 -46c-18 -14 -40 -21 -56 -39l11 7c17 11 15 8 35 14c3 1 8 3 11 5c0 -1 -1 -5 -1 -6c1 -20 11 -39 15 -60c0 -5 1 -10 -1 -15c-8 -17 -7 -37 -8 -55
+zM274 147c8 -18 23 -29 38 -39l-104 -108l-17 18c0 13 -4 26 -4 38c-2 48 10 94 21 142v0c1 -1 2 -1 3 -1c30 -6 52 -24 63 -50zM382 352c46 -47 46 -124 0 -171l-68 -70c-28 24 -42 54 -65 81c-12 13 -26 23 -41 32c-3 13 -8 26 -11 39c-3 12 14 21 16 31c3 12 3 26 3 39
+l19 19c40 42 107 42 147 0z" />
+    <glyph glyph-name="ion-heart" unicode="&#xf141;" horiz-adv-x="416" 
+d="M382 352c46 -47 46 -124 0 -171l-174 -181l-174 181c-46 47 -46 124 0 171c40 42 107 42 147 0l27 -28l28 28c40 42 106 42 146 0z" />
+    <glyph glyph-name="ion-help-buoy" unicode="&#xf27c;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM402 264c-10 24 -23 45 -42 64s-41 32 -65 42l-19 -61c14 -6 27 -15 38 -26s21 -24 27 -38zM224 96c53 0 96 43 96 96s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96zM88 328
+c-19 -19 -32 -41 -42 -65l61 -19c6 14 15 27 26 38s24 21 38 27l-19 61c-24 -10 -45 -23 -64 -42zM46 120c10 -24 23 -45 42 -64s41 -32 65 -42l19 61c-14 6 -27 15 -38 26s-21 24 -27 38zM360 56c19 19 32 41 42 65l-61 19c-6 -14 -15 -27 -26 -38s-24 -21 -38 -27l19 -61
+c24 10 45 23 64 42z" />
+    <glyph glyph-name="ion-help-circled" unicode="&#xf142;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM244 89c1 18 -12 31 -29 31c-16 0 -30 -11 -30 -29s12 -30 28 -30c17 0 31 10 31 28zM293 217c7 10 12 22 12 36c0 23 -9 40 -25 52c-17 13 -37 18 -62 18
+c-19 0 -34 -4 -47 -13c-19 -13 -28 -34 -28 -68h49c0 9 -1 19 4 27s13 15 26 15s19 -3 25 -11c5 -7 8 -15 8 -23c0 -7 -4 -14 -8 -20c-2 -4 -6 -7 -10 -10c0 0 -26 -15 -35 -30c-7 -11 -9 -24 -10 -41c0 -1 0 -4 4 -4h39s5 3 5 4c0 6 1 15 2 19c2 7 6 12 12 17l14 9
+c12 9 21 17 25 23z" />
+    <glyph glyph-name="ion-help" unicode="&#xf143;" horiz-adv-x="256" 
+d="M217 371c25 -19 39 -46 39 -83c0 -22 -8 -42 -19 -57c-7 -9 -21 -21 -40 -36l-21 -14c-10 -8 -17 -18 -20 -28c-2 -6 -3 -19 -3 -29c0 -2 -1 -6 -7 -6h-62c-7 0 -7 3 -7 5c1 26 4 49 15 66c15 23 57 48 57 48c6 5 11 9 15 15c7 10 12 21 12 32c0 13 -3 26 -11 36
+c-10 12 -21 18 -41 18s-32 -11 -40 -24s-7 -29 -7 -43h-77c0 54 14 88 44 108c20 14 45 20 75 20c39 0 70 -7 98 -28zM114 78c27 -1 47 -20 46 -48s-22 -46 -49 -45c-26 1 -46 19 -45 47s22 47 48 46z" />
+    <glyph glyph-name="ion-home" unicode="&#xf144;" horiz-adv-x="384" 
+d="M384 160h-48v-160h-96v128h-96v-128h-96v160h-48l192 224z" />
+    <glyph glyph-name="ion-icecream" unicode="&#xf27d;" horiz-adv-x="320" 
+d="M32 192h256l-128 -224zM307 275c8 -5 13 -13 13 -23c0 -16 -14 -28 -30 -28h-4h-252h-4c-16 0 -30 13 -30 28c0 10 6 18 14 23c1 0 1 2 2 2c4 3 7 7 8 12v1c-2 6 -2 12 -2 18c0 42 34 76 76 76c8 0 16 -2 23 -4c-3 -12 -4 -31 -4 -31c2 15 11 29 11 29c18 23 46 38 77 38
+c53 0 96 -43 96 -96c0 -11 -2 -21 -5 -30v-1c0 -4 4 -9 8 -12c1 0 2 -2 3 -2z" />
+    <glyph glyph-name="ion-image" unicode="&#xf147;" 
+d="M336 224c-26 0 -48 22 -48 48s22 48 48 48s48 -22 48 -48s-22 -48 -48 -48zM420 384c16 0 28 -12 28 -28v-328c0 -16 -12 -28 -28 -28h-392c-16 0 -28 12 -28 28v328c0 16 12 28 28 28h392zM317 186l99 -106v260c0 7 -6 12 -13 12h-358c-7 0 -12 -5 -13 -12v-260l126 152
+c4 4 10 8 17 8s13 -2 17 -7l54 -59l4 -4c3 -2 7 -4 11 -4s8 2 12 5l18 16c4 3 8 5 13 5s10 -2 13 -6z" />
+    <glyph glyph-name="ion-images" unicode="&#xf148;" 
+d="M426 308c13 -1 23 -12 22 -24l-14 -263c-1 -13 -12 -22 -25 -21l-330 16c-13 1 -23 10 -22 23l2 46l-15 -1c-12 -1 -22 7 -23 18l-21 236c-1 11 7 21 19 22l296 24c12 1 22 -7 23 -18l5 -54zM71 302c1 12 11 22 24 22l219 -11l-2 31h-1v1c-1 5 -5 8 -10 8l-261 -22
+c-5 0 -10 -4 -10 -9v0v-1l16 -178l18 25zM405 66l10 198v1v0c0 6 -5 10 -11 10l-58 3l-29 2l-204 9c-6 0 -11 -4 -12 -9v0v-1l-3 -63l-7 -128v-7l6 7l102 109c4 4 8 6 14 6s11 -3 14 -7l43 -49l3 -3c2 -2 6 -4 10 -4s5 1 9 3l17 12c4 3 7 4 11 4s9 -2 11 -5l27 -33zM341 186
+c-20 0 -35 15 -35 35s16 35 35 35c20 0 35 -16 35 -35s-16 -35 -35 -35z" />
+    <glyph glyph-name="ion-information-circled" unicode="&#xf149;" 
+d="M448 195c2 -124 -97 -225 -221 -227s-225 97 -227 221s97 225 221 227s225 -97 227 -221zM224 336c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM268 53v11h-22v172h-66v-12h22v-160h-22v-11h88z" />
+    <glyph glyph-name="ion-information" unicode="&#xf14a;" horiz-adv-x="128" 
+d="M96 0h32v-16h-128v16h32v240h-32v16h96v-256zM64 304c-27 0 -48 21 -48 48s21 48 48 48s48 -21 48 -48s-21 -48 -48 -48z" />
+    <glyph glyph-name="ion-ionic" unicode="&#xf14b;" horiz-adv-x="416" 
+d="M376 315c25 -34 40 -77 40 -123c0 -115 -93 -208 -208 -208s-208 93 -208 208s93 208 208 208c46 0 89 -15 123 -40c5 3 11 5 18 5c18 0 32 -14 32 -32c0 -7 -2 -13 -5 -18zM344 56c18 18 31 38 41 61c10 24 15 49 15 75s-5 51 -15 75c-6 13 -13 26 -21 38
+c-4 -2 -10 -4 -15 -4c-18 0 -32 14 -32 32c0 5 2 11 4 15c-12 8 -25 15 -38 21c-24 10 -49 15 -75 15s-51 -5 -75 -15c-23 -10 -43 -23 -61 -41s-31 -38 -41 -61c-10 -24 -15 -49 -15 -75s5 -51 15 -75c10 -23 23 -43 41 -61s38 -31 61 -41c24 -10 49 -15 75 -15s51 5 75 15
+c23 10 43 23 61 41zM112 192c0 64 32 96 96 96s96 -32 96 -96s-32 -96 -96 -96s-96 32 -96 96z" />
+    <glyph glyph-name="ion-ios-alarm-outline" unicode="&#xf3c7;" horiz-adv-x="404" 
+d="M384 256l-54 52l-9 -9c35 -32 57 -79 57 -130c0 -44 -16 -83 -43 -114l36 -45l-12 -10l-35 43c-32 -30 -75 -49 -122 -49v0v0c-47 0 -90 19 -122 49l-35 -43l-12 10l36 45c-27 31 -43 71 -43 115c0 51 22 97 57 129l-9 9l-54 -52c-12 14 -20 32 -20 52c0 44 35 80 80 82
+h5c20 0 39 -7 54 -18l-54 -52l11 -11c26 19 56 32 90 35v0c0 8 8 16 16 16s15 -8 15 -16v0c34 -3 65 -16 91 -35l11 11l-54 52c15 11 34 18 54 18h5c45 -2 80 -38 80 -82c0 -20 -8 -38 -20 -52zM22 280l91 89c-9 5 -19 7 -32 6c-37 -2 -65 -32 -65 -67c0 -10 2 -19 6 -28z
+M362 172c0 88 -72 158 -160 158s-160 -70 -160 -158s72 -158 160 -158s160 70 160 158zM291 369l91 -89c4 9 6 18 6 28c0 35 -28 65 -65 67c-13 1 -23 -1 -32 -6zM202 288h16v-144h-112v16h96v128z" />
+    <glyph glyph-name="ion-ios-alarm" unicode="&#xf3c8;" horiz-adv-x="404" 
+d="M385 256l-55 52l-9 -9c35 -32 57 -79 57 -130c0 -44 -16 -83 -43 -114l37 -45l-13 -10l-35 43c-32 -30 -75 -49 -122 -49v0v0c-47 0 -90 19 -122 49l-35 -43l-12 10l36 45c-27 31 -43 70 -43 114c0 51 22 98 57 130l-9 9l-54 -52c-12 14 -20 32 -20 52c0 44 35 80 80 82
+h5c20 0 39 -7 54 -18l-54 -53l11 -10c26 19 56 32 90 35v0c0 8 8 16 16 16s15 -8 15 -16v0c34 -3 65 -16 91 -35l11 11l-54 52c15 11 34 18 54 18h5c45 -2 80 -38 80 -82c0 -20 -7 -38 -19 -52zM218 144v144h-16v-128h-96v-16h112z" />
+    <glyph glyph-name="ion-ios-albums-outline" unicode="&#xf3c9;" 
+d="M432 304h-416v-288h416v288zM448 320v0v-320h-448v320h448zM40 336v16h368v-16h-368zM72 368v16h304v-16h-304z" />
+    <glyph glyph-name="ion-ios-albums" unicode="&#xf3ca;" 
+d="M448 320v0v-320h-448v320h448zM40 336v16h368v-16h-368zM72 368v16h304v-16h-304z" />
+    <glyph glyph-name="ion-ios-americanfootball-outline" unicode="&#xf3cb;" horiz-adv-x="416" 
+d="M331 315c112 -112 81 -327 81 -327s-26 -4 -65 -4c-73 0 -189 12 -262 85c-112 112 -81 327 -81 327s26 4 65 4c73 0 189 -12 262 -85zM17 383c-2 -19 -5 -60 0 -107c1 -8 2 -16 3 -23l127 127c-25 3 -51 5 -78 5v0v0c-22 0 -41 -1 -52 -2zM96 80c30 -30 72 -53 124 -66
+c10 -3 20 -5 31 -7l142 142c-4 22 -10 44 -17 63c-14 37 -32 68 -56 92c-30 30 -72 53 -124 66c-10 3 -20 5 -31 7l-142 -142c4 -22 10 -44 17 -63c14 -37 32 -68 56 -92zM399 1c2 19 5 60 0 107c-1 8 -2 16 -3 23l-127 -127c25 -3 51 -5 78 -5c22 0 41 1 52 2zM259 130
+l-28 -29l-12 12l29 28l-23 23l-28 -29l-12 12l29 28l-23 23l-28 -29l-12 12l29 28l-23 23l-28 -29l-12 12l29 28l-22 23l-29 -29l-11 12l67 67l12 -11l-29 -29l23 -22l28 29l12 -12l-29 -28l23 -23l28 29l12 -12l-29 -28l23 -23l28 29l12 -12l-29 -28l22 -23l29 29l12 -12
+l-29 -28l22 -23l29 29l11 -12l-67 -67l-12 11l29 29z" />
+    <glyph glyph-name="ion-ios-americanfootball" unicode="&#xf3cc;" horiz-adv-x="416" 
+d="M331 315c112 -112 81 -327 81 -327s-26 -4 -65 -4c-73 0 -189 12 -262 85c-112 112 -81 327 -81 327s26 4 65 4c73 0 189 -12 262 -85zM20 253l3 -18l142 142l-18 3zM219 113l12 -12l28 29l23 -22l-29 -29l12 -11l67 67l-11 12l-29 -29l-22 23l29 28l-12 12l-28 -29
+l-23 23l29 28l-12 12l-28 -29l-23 23l29 28l-12 12l-28 -29l-23 23l29 28l-12 12l-28 -29l-23 22l29 29l-12 11l-67 -67l11 -12l29 29l22 -23l-29 -28l12 -12l28 29l23 -23l-29 -28l12 -12l28 29l23 -23l-29 -28l12 -12l28 29l23 -23zM269 4l127 127l-3 18l-142 -142z" />
+    <glyph glyph-name="ion-ios-analytics-outline" unicode="&#xf3cd;" 
+d="M224 400c-28 0 -55 -5 -81 -16c-25 -10 -47 -26 -66 -45s-35 -41 -45 -66c-11 -26 -16 -53 -16 -81s5 -55 16 -81c10 -25 26 -47 45 -66s41 -35 66 -45c26 -11 53 -16 81 -16s55 5 81 16c25 10 47 26 66 45s35 41 45 66c11 26 16 53 16 81s-5 55 -16 81
+c-10 25 -26 47 -45 66s-41 35 -66 45c-26 11 -53 16 -81 16zM224 416v0c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM76 128c-25 0 -41 18 -42 19c-3 3 -2 9 1 12s8 2 11 -1c1 -1 15 -17 36 -14c12 2 27 26 38 42c4 6 9 12 12 16
+c17 21 34 23 45 21c24 -3 45 -28 54 -50c7 -18 18 -28 32 -29c15 -1 31 11 43 30c1 2 3 4 4 7c9 17 24 43 52 43c31 0 52 -35 53 -36c2 -4 1 -9 -3 -11s-9 -1 -11 3c0 0 -5 8 -12 15c-6 6 -16 13 -27 13c-18 0 -29 -19 -38 -35c-1 -3 -3 -5 -4 -7c-15 -25 -36 -40 -58 -38
+c-20 1 -36 15 -46 39s-28 39 -41 41c-11 1 -21 -4 -31 -16c-3 -4 -6 -9 -10 -15c-14 -20 -31 -45 -50 -48c-3 0 -5 -1 -8 -1z" />
+    <glyph glyph-name="ion-ios-analytics" unicode="&#xf3ce;" 
+d="M224 416c124 0 224 -100 224 -224c0 -13 -1 -25 -3 -37c-1 -6 -2 -12 -3 -17c-24 -98 -113 -170 -218 -170c-122 0 -221 98 -224 219v5c0 9 1 17 2 26c13 111 107 198 222 198zM431 168c1 8 1 16 1 24c0 28 -5 55 -16 81c-10 25 -26 47 -45 66s-41 35 -66 45
+c-26 11 -53 16 -81 16s-55 -5 -81 -16c-25 -10 -47 -26 -66 -45s-35 -41 -45 -66c-11 -26 -16 -53 -16 -81v0c14 -21 29 -34 29 -34h1v-1c1 -1 15 -16 36 -13c12 2 27 26 38 42c4 6 9 12 12 16c17 21 34 23 45 21c24 -3 45 -27 54 -50c7 -18 18 -28 32 -29c15 -1 31 9 43 29
+c1 2 3 4 4 7c9 17 24 44 52 44c31 0 52 -35 53 -36c3 -4 9 -12 16 -20z" />
+    <glyph glyph-name="ion-ios-arrow-back" unicode="&#xf3cf;" horiz-adv-x="192" 
+d="M192 320l-127 -128l127 -128l-32 -32l-160 160v0v0l160 160z" />
+    <glyph glyph-name="ion-ios-arrow-down" unicode="&#xf3d0;" horiz-adv-x="320" 
+d="M301 288l19 -21l-160 -171l-160 171l19 21l141 -150z" />
+    <glyph glyph-name="ion-ios-arrow-forward" unicode="&#xf3d1;" horiz-adv-x="192" 
+d="M0 320l32 32l160 -160v0v0l-160 -160l-32 32l127 128z" />
+    <glyph glyph-name="ion-ios-arrow-left" unicode="&#xf3d2;" horiz-adv-x="192" 
+d="M192 333l-150 -141l150 -141l-21 -19l-171 160l171 160z" />
+    <glyph glyph-name="ion-ios-arrow-right" unicode="&#xf3d3;" horiz-adv-x="192" 
+d="M0 333l21 19l171 -160l-171 -160l-21 19l150 141z" />
+    <glyph glyph-name="ion-ios-arrow-thin-down" unicode="&#xf3d4;" horiz-adv-x="192" 
+d="M190 126c2 -2 2 -4 2 -6s0 -4 -2 -6c0 0 -87 -79 -88 -80s-3 -2 -6 -2s-5 1 -6 2s-88 80 -88 80c-3 3 -3 9 0 12s9 3 12 0l74 -67v285c0 4 4 8 8 8s8 -4 8 -8v-285l74 67c3 3 9 3 12 0z" />
+    <glyph glyph-name="ion-ios-arrow-thin-left" unicode="&#xf3d5;" horiz-adv-x="320" 
+d="M94 98c-2 -2 -4 -2 -6 -2s-4 0 -6 2c0 0 -79 87 -80 88s-2 3 -2 6s1 5 2 6s80 88 80 88c3 3 9 3 12 0s3 -9 0 -12l-67 -74h285c4 0 8 -4 8 -8s-4 -8 -8 -8h-285l67 -74c3 -3 3 -9 0 -12z" />
+    <glyph glyph-name="ion-ios-arrow-thin-right" unicode="&#xf3d6;" horiz-adv-x="320" 
+d="M226 98c-3 3 -3 9 0 12l67 74h-285c-4 0 -8 4 -8 8s4 8 8 8h285l-67 74c-3 3 -3 9 0 12s9 3 12 0c0 0 79 -87 80 -88s2 -3 2 -6s-1 -5 -2 -6s-80 -88 -80 -88c-2 -2 -4 -2 -6 -2s-4 0 -6 2z" />
+    <glyph glyph-name="ion-ios-arrow-thin-up" unicode="&#xf3d7;" horiz-adv-x="192" 
+d="M190 258c-3 -3 -9 -3 -12 0l-74 67v-285c0 -4 -4 -8 -8 -8s-8 4 -8 8v285l-74 -67c-3 -3 -9 -3 -12 0s-3 9 0 12c0 0 87 79 88 80s3 2 6 2s5 -1 6 -2s88 -80 88 -80c2 -2 2 -4 2 -6s0 -4 -2 -6z" />
+    <glyph glyph-name="ion-ios-arrow-up" unicode="&#xf3d8;" horiz-adv-x="320" 
+d="M301 96l-141 150l-141 -150l-19 21l160 171l160 -171z" />
+    <glyph glyph-name="ion-ios-at-outline" unicode="&#xf3d9;" horiz-adv-x="255" 
+d="M236 127v1h19l-3 -6c-3 -6 -13 -19 -22 -27s-18 -14 -28 -20s-21 -10 -32 -13s-23 -5 -34 -5c-16 0 -33 3 -49 8s-30 13 -43 24c-12 11 -26 29 -34 46c-7 16 -10 33 -10 58c0 18 4 38 11 55c7 16 17 30 29 42s27 21 43 28c15 6 33 9 53 9c16 0 32 -3 46 -8
+c15 -5 28 -12 39 -22s17 -21 24 -35c6 -13 8 -26 8 -44c0 -14 -2 -28 -7 -40s-9 -20 -17 -30c-8 -9 -13 -15 -23 -21c-11 -6 -20 -9 -29 -9c-8 0 -15 2 -20 7c-3 2 -5 6 -6 9c-6 -6 -11 -10 -17 -12c-10 -3 -18 -4 -26 -4s-15 1 -21 4s-12 7 -17 12s-8 11 -11 18
+s-5 14 -5 22c0 12 3 24 7 36v2c4 11 5 16 13 26c8 11 17 19 28 26s24 11 38 11c12 0 21 -3 31 -9c7 -4 12 -10 16 -16l6 17h18l-38 -102c-2 -5 -4 -10 -5 -14s-1 -7 -1 -10c0 -2 1 -4 3 -5s4 -2 8 -2c6 0 11 2 20 7c8 4 12 9 19 17c6 8 10 14 14 25s6 23 6 35
+c0 15 -2 25 -7 36c-6 13 -10 22 -19 30s-20 15 -33 20s-27 7 -42 7c-19 0 -35 -3 -48 -9c-15 -6 -27 -14 -37 -24c-11 -10 -19 -23 -25 -37c-6 -15 -10 -32 -10 -48c0 -22 2 -36 8 -49c6 -15 17 -31 28 -41s24 -18 38 -23s30 -7 46 -7c10 0 20 1 30 4s18 6 27 11
+s17 11 24 18s14 13 19 21zM147 154c4 5 8 12 11 20l21 57c-2 5 -4 10 -7 13c-3 4 -6 6 -10 8c-1 0 -1 1 -2 1c-3 2 -5 3 -9 4c-5 1 -9 2 -13 2c-10 0 -19 -3 -28 -9s-17 -13 -23 -22c-5 -8 -7 -11 -10 -20c0 -1 -1 -3 -1 -4c-4 -11 -5 -20 -5 -30c0 -6 1 -11 3 -16
+s5 -9 8 -13s7 -6 12 -8s9 -3 15 -3c4 0 9 1 14 2c4 1 8 2 12 5s8 7 12 13z" />
+    <glyph glyph-name="ion-ios-at" unicode="&#xf3da;" horiz-adv-x="256" 
+d="M228 128v0h28c-1 -1 -2 -4 -3 -6c-4 -6 -14 -19 -23 -27s-18 -14 -28 -20s-20 -10 -32 -13c-11 -3 -23 -5 -34 -5c-16 0 -33 3 -49 8s-30 13 -43 24c-12 10 -26 28 -34 46c-7 16 -10 33 -10 58c0 19 4 39 11 55s17 30 29 42s28 21 44 28c15 6 32 9 52 9c16 0 31 -3 46 -8
+s28 -12 39 -22s18 -22 25 -36c6 -14 8 -26 8 -44c0 -14 -2 -28 -7 -40c-4 -11 -9 -20 -17 -30c-7 -9 -14 -16 -24 -22c-12 -6 -21 -9 -30 -9s-16 2 -22 8c-2 1 -3 3 -4 5c-4 -4 -9 -6 -14 -8c-10 -3 -18 -5 -27 -5c-8 0 -16 2 -23 5s-12 7 -17 12s-9 12 -12 19s-4 14 -4 22
+c0 12 2 25 6 37l1 1c4 10 5 17 13 27c8 11 17 20 28 27c12 7 24 10 38 10c12 0 22 -3 33 -9c5 -3 8 -6 12 -10l5 12h25l-39 -104c-2 -5 -3 -9 -4 -13c-1 -3 -1 -7 -1 -9s0 -3 1 -3c0 0 1 -1 5 -1c5 0 11 2 19 7c7 4 10 8 16 16s9 13 13 23s6 20 6 32c0 14 -1 24 -6 34
+c-5 12 -10 21 -18 28c-9 8 -19 14 -31 18s-26 7 -40 7c-18 0 -32 -3 -44 -8c-14 -6 -25 -13 -35 -23s-18 -22 -24 -35c-6 -14 -9 -30 -9 -45c0 -21 3 -34 8 -46c6 -14 16 -30 26 -39s22 -16 35 -21c14 -5 28 -7 43 -7c10 0 20 2 29 4s18 6 26 11s28 20 38 33zM144 157
+c4 5 7 12 10 19l20 55c-1 4 -3 7 -5 9c-3 3 -6 6 -9 8h-1h-1v1c-3 2 -5 2 -8 3c-4 1 -8 1 -12 1c-9 0 -17 -2 -25 -7c-10 -6 -17 -14 -21 -21c-5 -8 -6 -11 -9 -19c0 -1 -1 -2 -1 -3c-3 -10 -6 -19 -6 -28c0 -5 1 -10 3 -14s4 -8 7 -11s7 -6 11 -8s8 -2 13 -2c4 0 8 0 12 1
+v0c4 1 7 2 11 5c3 2 7 5 11 11z" />
+    <glyph glyph-name="ion-ios-barcode-outline" unicode="&#xf3db;" horiz-adv-x="416" 
+d="M0 64v256h80v-16h-64v-224h64v-16h-80zM336 320h80v-256h-80v16h64v224h-64v16zM64 128v128h16v-128h-16zM336 128v128h16v-128h-16zM272 96v192h16v-192h-16zM128 96v192h16v-192h-16zM199 112v160h16v-160h-16z" />
+    <glyph glyph-name="ion-ios-barcode" unicode="&#xf3dc;" horiz-adv-x="416" 
+d="M0 320h416v-256h-416v256zM80 128v128h-16v-128h16zM144 96v192h-16v-192h16zM215 112v160h-16v-160h16zM288 96v192h-16v-192h16zM352 128v128h-16v-128h16z" />
+    <glyph glyph-name="ion-ios-baseball-outline" unicode="&#xf3dd;" horiz-adv-x="416" 
+d="M415 169v-1v0c-11 -97 -90 -174 -187 -183v0h-2c-2 0 -3 -1 -5 -1h-1h-3h-1h-8c-115 0 -208 93 -208 208v8v1v3v1c0 2 1 3 1 5v2v0c9 97 86 176 183 187v0v0c8 1 16 1 24 1c115 0 208 -93 208 -208c0 -7 0 -14 -1 -20v0v-3zM399 192c0 105 -86 191 -191 191
+c-3 0 -5 -1 -8 -1c0 -11 2 -21 4 -31l20 6l5 -15l-21 -7c2 -7 4 -14 7 -21c2 -5 5 -11 8 -16l17 12l9 -13l-19 -13c7 -12 16 -23 26 -33l14 15l12 -12l-15 -15c11 -10 22 -18 34 -25l12 18l14 -9l-12 -17c5 -2 10 -5 15 -7c7 -3 14 -5 22 -7l7 20l15 -5l-6 -19
+c10 -2 20 -4 30 -4c0 3 1 5 1 8zM17 192c0 -105 86 -191 191 -191h4c-1 9 -1 17 -3 26l-22 -7l-5 16l23 7c-2 8 -5 16 -8 24c-2 5 -4 9 -6 14l-20 -13l-9 13l21 14c-7 12 -16 24 -26 35l-17 -17l-11 11l17 17c-10 10 -22 18 -34 25l-14 -21l-14 9l14 20c-5 2 -10 5 -15 7
+c-7 3 -15 6 -23 8l-8 -24l-15 5l7 23c-9 2 -18 2 -27 3v-4zM228 2c88 9 158 78 169 166c-11 1 -23 3 -34 5l-9 -27l-15 5l8 25c-14 4 -28 10 -41 17l-15 -23l-13 9l14 21c-13 8 -26 17 -37 28l-19 -19l-11 11l19 19c-10 11 -19 23 -27 36l-21 -14l-9 13l22 15
+c-7 13 -12 27 -16 41l-25 -8l-5 16l26 8c-2 12 -4 23 -5 35c-88 -11 -157 -81 -166 -169c10 -1 21 -2 31 -4l8 23l15 -5l-7 -22c14 -4 28 -9 42 -16l13 19l14 -9l-13 -18c13 -8 25 -17 36 -28l17 17l11 -11l-17 -17c11 -12 20 -24 28 -37l19 13l9 -14l-20 -13
+c7 -14 12 -28 16 -42l23 7l5 -15l-24 -8c2 -10 3 -20 4 -30z" />
+    <glyph glyph-name="ion-ios-baseball" unicode="&#xf3de;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208c0 -8 0 -16 -1 -24v0v0c-12 -104 -100 -184 -207 -184c-115 0 -208 93 -208 208c0 107 80 195 184 207v0v0c8 1 16 1 24 1zM212 1c5 0 11 0 16 1c-1 10 -2 20 -4 30l24 8l-5 15l-23 -7c-4 14 -9 28 -16 42l20 13l-9 14l-19 -13
+c-8 13 -17 25 -28 37l17 17l-11 11l-17 -17c-11 11 -23 20 -36 28l13 18l-14 9l-13 -19c-14 7 -28 12 -42 16l7 22l-15 5l-8 -23c-10 2 -21 3 -31 4c-1 -5 -1 -11 -1 -16c9 -1 18 -1 27 -3l-7 -23l15 -5l8 24c8 -2 16 -5 23 -8c5 -2 10 -5 15 -7l-14 -20l14 -9l14 21
+c12 -7 24 -15 34 -25l-17 -17l11 -11l17 17c10 -11 19 -23 26 -35l-21 -14l9 -13l20 13c2 -5 4 -9 6 -14c3 -8 6 -16 8 -24l-23 -7l5 -16l22 7c2 -8 2 -17 3 -26zM363 173c11 -2 23 -4 34 -5c1 5 1 11 1 16c-10 1 -20 2 -30 4l6 19l-15 5l-7 -20c-8 2 -15 4 -22 7
+c-5 2 -10 5 -15 7l12 17l-14 9l-12 -18c-12 7 -23 15 -34 25l15 15l-12 12l-15 -15c-10 10 -18 21 -25 33l19 13l-9 13l-17 -12c-3 5 -6 11 -8 16c-3 7 -5 14 -7 21l21 7l-5 15l-20 -6c-2 10 -3 20 -4 31c-5 0 -11 0 -16 -1c1 -12 3 -23 5 -35l-26 -8l5 -16l25 8
+c4 -14 9 -28 16 -41l-22 -15l9 -13l21 14c8 -13 17 -25 27 -36l-19 -19l11 -11l19 19c11 -11 24 -20 37 -28l-14 -21l13 -9l15 23c13 -7 27 -13 41 -17l-8 -25l15 -5z" />
+    <glyph glyph-name="ion-ios-basketball-outline" unicode="&#xf3df;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM399 192c0 55 -24 105 -62 140c-14 -34 -31 -65 -52 -95c15 -12 31 -21 49 -29c21 -9 43 -14 65 -16v0zM325 343c-32 25 -73 40 -117 40v0c2 -22 6 -44 15 -65
+c10 -25 26 -47 45 -66c2 -1 2 -3 4 -4c20 29 38 60 52 93c0 1 1 1 1 2zM192 382c-51 -4 -96 -29 -128 -65c64 -28 121 -69 169 -119c11 12 21 24 30 37c-40 37 -67 89 -71 147zM233 174c-15 -16 -31 -30 -48 -44c28 -35 45 -79 47 -127c33 4 63 17 88 35
+c-22 50 -51 95 -87 136zM214 178l8 8l-10 10c-46 46 -99 82 -158 108c-18 -25 -31 -55 -35 -88c62 -3 116 -31 155 -74c14 11 27 23 40 36zM18 200c0 -3 -1 -5 -1 -8c0 -45 16 -87 43 -120c36 16 71 36 102 60l-7 7c-19 19 -41 35 -66 45c-22 9 -46 15 -71 16zM71 59
+c35 -36 83 -58 137 -58c3 0 5 1 8 1c-1 25 -6 48 -16 71c-7 17 -17 33 -28 47c-31 -24 -65 -45 -101 -61zM333 48c37 32 61 77 65 128c-46 3 -89 21 -123 48c-10 -13 -20 -26 -31 -38c36 -41 67 -87 89 -138z" />
+    <glyph glyph-name="ion-ios-basketball" unicode="&#xf3e0;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM333 48c-22 51 -53 97 -89 138c11 12 21 25 31 38c34 -27 77 -45 123 -48c0 5 1 11 1 16c-22 2 -44 7 -65 16c-18 8 -34 17 -49 29c21 30 38 61 52 95c-4 4 -8 8 -12 11
+c0 -1 -1 -1 -1 -2c-14 -33 -32 -64 -52 -93c-2 1 -2 2 -4 4c-19 19 -35 41 -45 66c-9 21 -13 43 -15 65c-5 0 -11 -1 -16 -1c4 -58 31 -110 71 -147c-9 -13 -19 -25 -30 -37c-48 50 -105 91 -169 119c-4 -4 -7 -9 -10 -13c59 -26 112 -62 158 -108l10 -10l-8 -8
+c-13 -13 -26 -25 -40 -36c-39 43 -93 71 -155 74c-1 -5 -1 -11 -1 -16c25 -1 49 -7 71 -16c25 -10 47 -26 66 -45l7 -7c-31 -24 -66 -44 -102 -60c4 -4 7 -9 11 -13c36 16 70 37 101 61c11 -14 21 -30 28 -47c10 -23 15 -46 16 -71c5 0 11 0 16 1c-2 48 -19 92 -47 127
+c17 14 33 28 48 44c36 -41 65 -86 87 -136c4 3 9 6 13 10z" />
+    <glyph glyph-name="ion-ios-bell-outline" unicode="&#xf3e1;" horiz-adv-x="384" 
+d="M318 222c0 -114 28 -126 66 -158h-384c38 32 66 44 66 158c0 98 53 130 102 138v2c0 12 11 22 24 22s24 -10 24 -22v-2c49 -7 102 -40 102 -138zM43 80h298c-25 25 -40 58 -40 142c0 46 -13 80 -37 101c-23 19 -52 23 -72 23s-49 -4 -72 -23c-25 -21 -37 -55 -37 -101
+c0 -51 -5 -85 -17 -110c-6 -13 -14 -23 -23 -32zM192 0c-27 0 -49 20 -52 43h104c-3 -23 -25 -43 -52 -43z" />
+    <glyph glyph-name="ion-ios-bell" unicode="&#xf3e2;" horiz-adv-x="384" 
+d="M318 222c0 -114 28 -126 66 -158h-384c38 32 66 44 66 158c0 98 53 130 102 138v2c0 12 11 22 24 22s24 -10 24 -22v-2c49 -7 102 -40 102 -138zM192 0c-27 0 -49 20 -52 43h104c-3 -23 -25 -43 -52 -43z" />
+    <glyph glyph-name="ion-ios-body-outline" unicode="&#xf3e3;" horiz-adv-x="384" 
+d="M192 400c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM192 416v0c27 0 48 -21 48 -48s-21 -48 -48 -48s-48 21 -48 48s21 48 48 48zM360 304c13 0 24 -11 24 -24s-11 -24 -24 -24h-100c-5 0 -14 -5 -18 -15c-5 -12 -2 -33 1 -51l4 -21v-1v0l32 -172
+c2 -13 -6 -26 -19 -28h-5c-11 0 -22 8 -24 20l-21 120v0s-5 31 -17 31h-2c-12 0 -19 -31 -19 -31v0l-21 -120c-2 -12 -11 -20 -22 -20h-5c-13 2 -21 15 -19 28l32 172v1l4 21c3 18 6 39 1 51c-4 10 -12 15 -18 15h-100c-13 0 -24 11 -24 24s11 24 24 24h336zM24 272
+c-4 0 -8 4 -8 8s4 8 8 8h336c4 0 8 -4 8 -8s-4 -8 -8 -8h-102c-16 0 -26 -15 -30 -24c-5 -13 -6 -32 -1 -61v0v0l3 -19l1 -3l32 -172c0 -3 0 -5 -1 -6s-2 -2 -5 -3h-2c-4 0 -7 2 -8 6l-21 120v0c0 2 -2 10 -5 19c-2 6 -5 11 -8 15c-7 9 -14 11 -20 11h-2
+c-5 0 -13 -2 -20 -11c-3 -4 -6 -9 -8 -15c-4 -9 -6 -17 -6 -18v-1l-21 -120c-1 -4 -3 -6 -7 -6h-2c-3 0 -4 2 -5 3s-2 3 -1 6l32 172v0v1l4 21v0v0c5 29 5 48 0 61c-4 9 -14 24 -32 24z" />
+    <glyph glyph-name="ion-ios-body" unicode="&#xf3e4;" horiz-adv-x="384" 
+d="M144 368c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM360 304c7 0 12 -2 17 -7s7 -10 7 -17s-2 -12 -7 -17s-10 -7 -17 -7h-98c-8 -2 -15 -6 -18 -14c-4 -9 -3 -27 1 -52l4 -21v-1v0l30 -172c1 -7 0 -13 -4 -18s-8 -9 -15 -10s-13 0 -18 4
+s-9 9 -10 16l-21 120v-1l-2 9c-1 5 -3 11 -6 16s-6 8 -10 8h-2c-8 0 -14 -11 -18 -33v1l-21 -120c-1 -7 -5 -12 -10 -16s-11 -5 -18 -4s-11 5 -15 10s-5 11 -4 18l30 172v0v1l4 21c4 25 5 43 1 52c-3 8 -10 12 -18 14h-98c-7 0 -12 2 -17 7s-7 10 -7 17s2 12 7 17s10 7 17 7
+h336z" />
+    <glyph glyph-name="ion-ios-bolt-outline" unicode="&#xf3e5;" horiz-adv-x="226" 
+d="M131 316l-100 -140h65h19l-3 -19l-17 -89l100 140h-65h-19l3 19zM160 384v0l-30 -160h96l-160 -224l30 160h-96z" />
+    <glyph glyph-name="ion-ios-bolt" unicode="&#xf3e6;" horiz-adv-x="226" 
+d="M160 384v0l-30 -160h96l-160 -224l30 160h-96z" />
+    <glyph glyph-name="ion-ios-book-outline" unicode="&#xf3e7;" horiz-adv-x="384" 
+d="M284 384c55 0 100 -26 100 -79v-1v-4v-261v-17h-6h-11h-5c-17 30 -44 42 -78 42c-40 0 -74 -28 -82 -64h-20c-8 36 -42 64 -82 64c-34 0 -65 -16 -78 -42h-5h-11h-6v9v264v9v1c0 53 45 79 100 79c41 0 78 -14 92 -44c12 30 51 44 92 44zM184 37v254v13v2
+c-1 43 -39 62 -84 62c-44 0 -81 -19 -84 -61v-1v0v-262h1c19 26 48 36 83 36s66 -17 84 -43zM368 300v14v1c-3 42 -40 53 -84 53c-46 0 -84 -20 -84 -64v-1v-266c18 26 49 43 84 43s66 -10 84 -36v256z" />
+    <glyph glyph-name="ion-ios-book" unicode="&#xf3e8;" horiz-adv-x="384" 
+d="M100 384c35 0 67 -10 84 -31v-353h-2c-8 36 -42 64 -82 64c-34 0 -65 -16 -78 -42h-5h-11h-6v9v264v9v1c0 53 45 79 100 79zM284 384c55 0 100 -26 100 -79v-1v-4v-261v-17h-6h-11h-5c-17 30 -44 42 -78 42c-40 0 -74 -28 -82 -64h-2v353c17 21 50 31 84 31z" />
+    <glyph glyph-name="ion-ios-bookmarks-outline" unicode="&#xf3e9;" horiz-adv-x="418" 
+d="M385 384c19 0 33 -13 33 -32v-286c0 -19 -14 -34 -33 -34h-143s-25 -4 -25 -19v-13h-8h-8v13c0 15 -11 19 -25 19h-143c-19 0 -33 15 -33 34v286c0 19 14 32 33 32h150c10 0 20 -5 26 -12v0v0c6 7 16 12 26 12h150zM201 37v309c0 9 -12 22 -25 22h-143
+c-9 0 -16 -7 -16 -16v-286c0 -9 7 -18 16 -18h144c10 0 19 -3 24 -11zM273 368v-100l23 14l9 6l9 -6l23 -14v100h-64zM401 66v286c0 9 -7 16 -16 16h-32v-131l-48 32l-48 -32v131h-15c-13 0 -25 -13 -25 -22v-309c5 9 14 11 24 11h144c9 0 16 9 16 18z" />
+    <glyph glyph-name="ion-ios-bookmarks" unicode="&#xf3ea;" horiz-adv-x="418" 
+d="M296 283l-23 -15v116h64v-116l-23 15l-9 6zM385 384c19 0 33 -13 33 -32v-286c0 -19 -14 -34 -33 -34h-143s-25 -4 -25 -19v-13h-8h-8v13c0 15 -11 19 -25 19h-143c-19 0 -33 15 -33 34v286c0 19 14 32 33 32h150s18 -8 18 -15v-329l8 -6l8 6v329s10 15 18 15h22v-146
+l48 32l48 -32v146h32z" />
+    <glyph glyph-name="ion-ios-box-outline" unicode="&#xf3eb;" horiz-adv-x="320" 
+d="M192 208h-1h-63c-9 0 -16 -7 -16 -16s7 -16 16 -16h64c9 0 16 7 16 16s-7 16 -16 16zM192 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32h-64c-18 0 -32 14 -32 32s14 32 32 32h64zM320 336v-80h-16v-208h-288v208h-16v80h320zM288 64v192h-256v-192h256zM304 272v48h-288
+v-48h288z" />
+    <glyph glyph-name="ion-ios-box" unicode="&#xf3ec;" horiz-adv-x="320" 
+d="M16 48v192h288v-192h-288zM128 208c-9 0 -16 -7 -16 -16s7 -16 16 -16h64c9 0 16 7 16 16s-7 16 -16 16h-64zM0 336h320v-80h-16h-288h-16v80z" />
+    <glyph glyph-name="ion-ios-briefcase-outline" unicode="&#xf3ed;" horiz-adv-x="416" 
+d="M368 320h48v-320h-416v320h48v16h32v-16h48v30v2c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-2v-30h48v16h32v-16zM144 320v0h128v0v30c0 10 -7 18 -17 18h-97c-11 0 -14 -8 -14 -18v-30zM400 16v224h-384v-224h384zM400 256v48h-32v-16h-32v16h-256v-16h-32v16h-32v-48
+h384z" />
+    <glyph glyph-name="ion-ios-briefcase" unicode="&#xf3ee;" horiz-adv-x="416" 
+d="M48 320v16h32v-16h-32zM0 0v240h416v-240h-416zM336 320v16h32v-16h-32zM368 320h48v-64h-416v64h48v-32h32v32h48v30v2c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-2v-30h48v-32h32v32zM272 320v30c0 10 -7 18 -17 18h-97c-11 0 -14 -8 -14 -18v-30v0h128v0z" />
+    <glyph glyph-name="ion-ios-browsers-outline" unicode="&#xf3ef;" horiz-adv-x="384" 
+d="M0 304h304v-304h-304v304zM288 16v272h-272v-272h272zM384 384v-304h-64v16h48v272h-272v-48h-16v64h304z" />
+    <glyph glyph-name="ion-ios-browsers" unicode="&#xf3f0;" horiz-adv-x="384" 
+d="M0 304h304v-304h-304v304zM80 384h304v-304h-64v240h-240v64z" />
+    <glyph glyph-name="ion-ios-calculator-outline" unicode="&#xf3f1;" horiz-adv-x="288" 
+d="M32 288v64h224v-64h-224zM48 336v-32h192v32h-192zM256 384c18 0 32 -14 32 -32v-320c0 -18 -14 -32 -32 -32h-224c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h224zM272 32v320c0 9 -7 16 -16 16h-224c-9 0 -16 -7 -16 -16v-320c0 -9 7 -16 16 -16h224c9 0 16 7 16 16z
+M48 208h32h16v-16h-64v64h16v-16v-32zM48 128h32h16v-16h-64v64h16v-16v-32zM48 48h32h16v-16h-64v64h16v-16v-32zM128 208h32h16v-16h-64v64h16v-16v-32zM208 208h32h16v-16h-64v64h16v-16v-32zM128 128h32h16v-16h-64v64h16v-16v-32zM128 48h32h16v-16h-64v64h16v-16v-32z
+M208 48h32h16v-16h-64v144h16v-96v-32z" />
+    <glyph glyph-name="ion-ios-calculator" unicode="&#xf3f2;" horiz-adv-x="288" 
+d="M256 384c18 0 32 -14 32 -32v-320c0 -18 -14 -32 -32 -32h-224c-18 0 -32 14 -32 32v320c0 18 14 32 32 32h224zM248 168h-48v-128h48v128zM248 248h-48v-48h48v48zM168 88h-48v-48h48v48zM168 168h-48v-48h48v48zM168 248h-48v-48h48v48zM88 88h-48v-48h48v48zM88 168
+h-48v-48h48v48zM88 248h-48v-48h48v48zM40 296h208v48h-208v-48z" />
+    <glyph glyph-name="ion-ios-calendar-outline" unicode="&#xf3f3;" horiz-adv-x="384" 
+d="M16 336v-64h352v64zM288 352h96v-352h-384v352h96v32h16v-32h160v32h16v-32zM368 16v240h-352v-240h352zM368 272v64h-80v-32h-16v32h-160v-32h-16v32h-80v-64h352z" />
+    <glyph glyph-name="ion-ios-calendar" unicode="&#xf3f4;" horiz-adv-x="384" 
+d="M0 0v256h384v-256h-384zM384 352v-80h-384v80h96v-48h16v48h160v-48h16v48h96zM96 352v32h16v-32h-16zM272 352v32h16v-32h-16z" />
+    <glyph glyph-name="ion-ios-camera-outline" unicode="&#xf3f5;" horiz-adv-x="384" 
+d="M354 288c18 0 30 -13 30 -31v-176c0 -18 -12 -33 -30 -33h-320c-18 0 -34 15 -34 33v176c0 18 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM368 81v176c0 9 -5 15 -14 15h-62h-7l-5 3c-3 4 -7 8 -10 11c-12 13 -20 24 -26 30
+c-5 5 -7 4 -7 4h-88s-2 0 -7 -4c-6 -5 -14 -14 -25 -27c-3 -4 -7 -10 -11 -14l-5 -3h-7h-60c-9 0 -18 -7 -18 -15v-176c0 -9 9 -17 18 -17h320c8 0 14 8 14 17zM192 258c47 0 86 -38 86 -85s-39 -85 -86 -85s-86 38 -86 85s39 85 86 85zM192 104c38 0 70 31 70 69
+s-32 69 -70 69s-70 -31 -70 -69s32 -69 70 -69zM288 239v17h17v-17h-17zM160 173c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z" />
+    <glyph glyph-name="ion-ios-camera" unicode="&#xf3f6;" horiz-adv-x="384" 
+d="M354 288c18 0 30 -13 30 -31v-176c0 -18 -12 -33 -30 -33h-320c-18 0 -34 15 -34 33v176c0 18 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM192 88c47 0 86 38 86 85s-39 85 -86 85s-86 -38 -86 -85s39 -85 86 -85zM305 239v17h-17v-17h17
+zM192 242c38 0 70 -31 70 -69s-32 -69 -70 -69s-70 31 -70 69s32 69 70 69zM192 141c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+    <glyph glyph-name="ion-ios-cart-outline" unicode="&#xf3f7;" horiz-adv-x="384" 
+d="M96 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM96 16c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM320 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM320 16c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM384 320
+l-16 -128l-271 -48l5 -30c7 -34 21 -34 26 -34h240v-16h-240c-11 0 -21 5 -28 14c-6 8 -11 19 -13 33l-43 234v0c-2 8 -3 12 -7 16c-6 5 -18 7 -37 7v16c23 0 38 -4 47 -11c7 -6 10 -14 12 -21zM355 206l11 99l-304 31l32 -176z" />
+    <glyph glyph-name="ion-ios-cart" unicode="&#xf3f8;" horiz-adv-x="384" 
+d="M96 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM320 48c13 0 24 -11 24 -24s-11 -24 -24 -24s-24 11 -24 24s11 24 24 24zM384 320l-16 -128l-271 -48l5 -30c7 -34 21 -34 26 -34h240v-16h-240c-11 0 -21 5 -28 14c-6 8 -11 19 -13 33l-43 234v0
+c-2 8 -3 12 -7 16c-6 5 -18 7 -37 7v16c23 0 38 -4 47 -11c7 -6 10 -14 12 -21z" />
+    <glyph glyph-name="ion-ios-chatboxes-outline" unicode="&#xf3f9;" horiz-adv-x="416" 
+d="M16 384v-192h96v-16h-112v224h288v-112h-16v96h-256zM128 272h288v-224h-48v-64h-13l-64 64h-163v224zM400 64v192h-256v-192h153l55 -55v55h48z" />
+    <glyph glyph-name="ion-ios-chatboxes" unicode="&#xf3fa;" horiz-adv-x="416" 
+d="M288 400v-112h-176v-112h-112v224h288zM128 272h288v-224h-48v-64h-13l-64 64h-163v224z" />
+    <glyph glyph-name="ion-ios-chatbubble-outline" unicode="&#xf3fb;" horiz-adv-x="384" 
+d="M192 336c-97 0 -176 -62 -176 -138c0 -26 10 -51 27 -73c0 -1 0 -2 1 -3s2 -1 2 -2c4 -6 6 -13 6 -20c0 -3 1 -3 -13 -47l39 17v0c2 1 10 4 11 4h1v0c5 2 10 3 16 3c5 0 9 -1 14 -2l1 -1h2c19 -6 41 -10 70 -10c48 0 92 15 125 40c32 25 50 58 50 94
+c0 76 -79 138 -176 138zM192 352v0c106 0 192 -69 192 -154s-85 -150 -191 -150c-27 0 -52 3 -75 11h-2v0c-3 1 -6 2 -10 2s-9 -1 -12 -2h1h-1c-1 0 -9 -4 -10 -4l-50 -22l-2 -1h-3h-3c-6 1 -8 6 -7 10v0s17 57 17 58c0 4 -1 8 -3 11v0v0v0l1 -1l-4 4c-19 24 -30 53 -30 84
+c0 85 86 154 192 154z" />
+    <glyph glyph-name="ion-ios-chatbubble" unicode="&#xf3fc;" horiz-adv-x="384" 
+d="M192 352v0c106 0 192 -69 192 -154s-85 -150 -191 -150c-27 0 -52 3 -75 11h-2v0c-3 1 -6 2 -10 2s-9 -1 -12 -2h1h-1c-1 0 -9 -4 -10 -4l-50 -22l-2 -1h-3h-3c-6 1 -8 6 -7 10v0s17 57 17 58c0 4 -1 8 -3 11v0v0v0l1 -1l-4 4c-19 24 -30 53 -30 84c0 85 86 154 192 154z
+" />
+    <glyph glyph-name="ion-ios-checkmark-empty" unicode="&#xf3fd;" horiz-adv-x="207" 
+d="M74 118c-2 -2 -6 -4 -9 -4s-7 2 -9 4l-56 56l18 18l47 -47l125 126l17 -18z" />
+    <glyph glyph-name="ion-ios-checkmark-outline" unicode="&#xf3fe;" horiz-adv-x="416" 
+d="M292 271l18 -18l-134 -135c-2 -2 -6 -4 -9 -4s-7 2 -9 4l-56 56l18 18l47 -47zM208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191z" />
+    <glyph glyph-name="ion-ios-checkmark" unicode="&#xf3ff;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM176 118l134 135l-18 18l-125 -126l-47 47l-18 -18l56 -56c2 -2 6 -4 9 -4s7 2 9 4z" />
+    <glyph glyph-name="ion-ios-circle-filled" unicode="&#xf400;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM208 352c88 0 160 -72 160 -160s-72 -160 -160 -160s-160 72 -160 160s72 160 160 160z" />
+    <glyph glyph-name="ion-ios-circle-outline" unicode="&#xf401;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191z" />
+    <glyph glyph-name="ion-ios-clock-outline" unicode="&#xf402;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM208 192v128h17v-145h-113v17h96z" />
+    <glyph glyph-name="ion-ios-clock" unicode="&#xf403;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM225 175v145h-17v-128h-96v-17h113z" />
+    <glyph glyph-name="ion-ios-close-empty" unicode="&#xf404;" horiz-adv-x="192" 
+d="M180 288l12 -12l-84 -84l84 -84l-12 -12l-84 84l-84 -84l-12 12l84 84l-84 84l12 12l84 -84z" />
+    <glyph glyph-name="ion-ios-close-outline" unicode="&#xf405;" horiz-adv-x="416" 
+d="M355 339c81 -81 81 -213 0 -294s-213 -81 -294 0s-81 213 0 294s213 81 294 0zM343 57c74 74 74 196 0 270s-196 74 -270 0s-74 -196 0 -270s196 -74 270 0zM292 288l12 -12l-84 -84l84 -84l-12 -12l-84 84l-84 -84l-12 12l84 84l-84 84l12 12l84 -84z" />
+    <glyph glyph-name="ion-ios-close" unicode="&#xf406;" horiz-adv-x="416" 
+d="M355 339c81 -81 81 -213 0 -294s-213 -81 -294 0s-81 213 0 294s213 81 294 0zM304 108l-84 84l84 84l-12 12l-84 -84l-84 84l-12 -12l84 -84l-84 -84l12 -12l84 84l84 -84z" />
+    <glyph glyph-name="ion-ios-cloud-download-outline" unicode="&#xf407;" 
+d="M161 67l55 -54v242h16v-242l55 54l12 -12l-75 -73l-74 73zM367 284c45 0 81 -37 81 -82s-37 -82 -82 -82v0h-101v16h97h4c37 0 66 30 66 66s-29 67 -66 67h-15v20c0 55 -46 97 -101 97c-38 0 -73 -22 -90 -56l-6 -14l-14 7c-6 3 -13 5 -20 5c-22 0 -40 -18 -44 -39l-1 -9
+l-9 -3c-30 -10 -50 -36 -50 -67c0 -40 33 -74 74 -74h91v-16h-91c-50 0 -90 40 -90 89c0 39 26 71 61 83c5 28 29 51 59 51c10 0 18 -2 26 -6c19 39 59 65 105 65c64 0 117 -51 117 -115c0 -1 -1 -2 -1 -3z" />
+    <glyph glyph-name="ion-ios-cloud-download" unicode="&#xf408;" 
+d="M216 13v107h16v-107l55 54l12 -12l-75 -73l-74 73l11 12zM367 284c45 0 81 -37 81 -82s-37 -82 -82 -82h-134v135h-16v-135h-35h-21h-70c-50 0 -90 40 -90 89c0 39 26 71 61 83c5 28 29 51 59 51c10 0 18 -2 26 -6c19 39 59 65 105 65c64 0 117 -51 117 -115
+c0 -1 -1 -2 -1 -3z" />
+    <glyph glyph-name="ion-ios-cloud-outline" unicode="&#xf409;" 
+d="M367 215c45 0 81 -37 81 -83c0 -45 -37 -84 -82 -84h-276c-50 0 -90 42 -90 92c0 40 26 71 61 83c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 67 105 67c64 0 117 -53 117 -117c0 -1 -1 -3 -1 -4zM366 64c37 0 66 32 66 69s-29 67 -66 67h-15v21c0 56 -46 99 -101 99
+c-38 0 -73 -23 -90 -58l-6 -14l-14 7c-6 3 -13 5 -20 5c-22 0 -40 -17 -44 -39l-1 -9l-9 -3c-30 -10 -50 -37 -50 -69c0 -41 33 -76 74 -76h272h4z" />
+    <glyph glyph-name="ion-ios-cloud-upload-outline" unicode="&#xf40a;" 
+d="M161 188l-11 11l74 75l75 -75l-12 -11l-55 54v-242h-16v242zM367 264c45 0 81 -39 81 -85s-37 -83 -82 -83v0h-101v16h97h4c37 0 66 30 66 67s-29 70 -66 70l-15 1v20c0 56 -46 99 -101 99c-38 0 -73 -23 -90 -58l-6 -13l-14 6c-6 3 -13 5 -20 5c-22 0 -40 -17 -44 -39
+l-1 -9l-9 -3c-30 -10 -50 -39 -50 -71c0 -41 33 -75 74 -75h91v-16h-91c-50 0 -90 40 -90 90c0 40 26 74 61 86c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 66 105 66c64 0 117 -52 117 -116c0 -1 -1 -3 -1 -4z" />
+    <glyph glyph-name="ion-ios-cloud-upload" unicode="&#xf40b;" 
+d="M216 0v96h16v-96h-16zM367 264c45 0 81 -39 81 -85s-37 -83 -82 -83h-134v146l55 -54l12 11l-75 75l-74 -75l11 -11l55 54v-146h-35h-31h-60c-50 0 -90 40 -90 90c0 40 26 74 61 86c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 66 105 66c64 0 117 -52 117 -116
+c0 -1 -1 -3 -1 -4z" />
+    <glyph glyph-name="ion-ios-cloud" unicode="&#xf40c;" 
+d="M367 215c45 0 81 -37 81 -83c0 -45 -37 -84 -82 -84h-276c-50 0 -90 42 -90 92c0 40 26 71 61 83c5 28 29 52 59 52c10 0 18 -2 26 -6c19 39 59 67 105 67c64 0 117 -53 117 -117c0 -1 -1 -3 -1 -4z" />
+    <glyph glyph-name="ion-ios-cloudy-night-outline" unicode="&#xf40d;" horiz-adv-x="384" 
+d="M125 224c-34 0 -63 -28 -63 -62v-12s1 -10 1 -10c-5 0 -12 -1 -14 -1c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h157c27 0 49 22 49 49s-22 50 -49 50c-2 0 -4 -1 -6 -1l-14 -2l-3 14c-3 14 -11 26 -22 35s-25 14 -39 14zM125 240v0c37 0 68 -26 76 -61
+h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78zM361 142c8 0 15 2 23 4c-4 -7 -9 -14 -14 -20c-21 -24 -50 -41 -84 -45c4 6 6 12 8 19c19 4 36 13 50 25c-18 1 -35 6 -50 13c-23 11 -42 29 -56 51
+c-14 21 -22 48 -22 75c0 15 2 30 7 44c-24 -12 -43 -33 -53 -59c-5 2 -12 4 -18 5c14 36 45 65 82 77c8 2 16 4 24 5c-5 -6 -9 -13 -12 -20c-8 -16 -12 -34 -12 -52c0 -32 12 -63 35 -86s54 -36 86 -36h6z" />
+    <glyph glyph-name="ion-ios-cloudy-night" unicode="&#xf40e;" horiz-adv-x="384" 
+d="M361 142c8 0 15 2 23 4c-4 -7 -9 -15 -14 -21c-21 -24 -50 -40 -84 -44h-3c4 10 7 21 7 32c0 22 -9 43 -24 58c-14 15 -33 23 -53 24c-6 16 -16 29 -29 40c-10 8 -20 13 -32 17v2c14 36 45 65 82 77c8 2 16 4 24 5c-5 -6 -9 -13 -12 -20c-8 -16 -12 -34 -12 -52
+c0 -32 12 -63 35 -86s54 -36 86 -36h6zM125 239v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v7c0 43 35 79 78 79z" />
+    <glyph glyph-name="ion-ios-cloudy-outline" unicode="&#xf40f;" horiz-adv-x="274" 
+d="M125 272c-34 0 -63 -28 -63 -62v-12s1 -10 1 -10c-6 0 -12 -1 -14 -1c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h157c27 0 49 22 49 49s-22 50 -49 50c-2 0 -4 -1 -6 -1l-14 -2l-3 14c-3 14 -11 26 -22 35s-25 14 -39 14zM125 288v0c37 0 68 -26 76 -61
+h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78z" />
+    <glyph glyph-name="ion-ios-cloudy" unicode="&#xf410;" horiz-adv-x="274" 
+d="M125 288v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78z" />
+    <glyph glyph-name="ion-ios-cog-outline" unicode="&#xf411;" horiz-adv-x="384" 
+d="M384 175l-33 -8l-3 -14l27 -20l-12 -30l-34 5l-8 -11l17 -29l-23 -23l-29 17l-10 -7l5 -34l-29 -12l-21 27l-14 -3l-8 -33h-32l-9 33l-13 3l-21 -28l-29 12l4 34l-11 8l-30 -19l-23 23l18 31l-7 11l-35 -5l-12 29l28 22l-2 12l-35 9v32l35 9l2 12l-29 22l12 30l36 -5
+l7 10l-19 32l22 22l32 -19l11 8l-4 35l29 13l22 -29l12 2l9 35h32l9 -35l12 -2l22 28l29 -12l-5 -35l11 -8l30 18l22 -23l-17 -30l7 -10l35 5l12 -30l-28 -21l3 -13l33 -9v-32zM356 127l-26 20l6 33l32 8v7l-32 8l-6 33l26 19l-3 7l-32 -5l-19 27l17 28l-5 6l-28 -17l-28 18
+l5 34l-6 2l-20 -26l-32 6l-8 33h-7l-9 -33l-32 -6l-20 27l-7 -3l5 -34l-28 -18l-9 6l-21 12l-5 -5l18 -30l-18 -27l-33 5l-3 -7l27 -20l-6 -32l-33 -8v-7l33 -9l6 -32l-27 -20l3 -6l33 4l18 -27l-17 -29l5 -6l29 18l28 -18l-5 -33l7 -3l19 27l33 -7l8 -31h8l7 31l33 7
+l20 -26l7 3l-5 32l26 18l28 -16l5 5l-16 27l19 28l32 -4zM192 320c71 0 128 -57 128 -128s-57 -128 -128 -128s-128 57 -128 128s57 128 128 128zM80 192c0 -7 1 -15 2 -22l104 28l28 104c-7 1 -15 2 -22 2c-30 0 -58 -12 -79 -33s-33 -49 -33 -79zM192 80c27 0 53 10 73 27
+l-75 75l-104 -28c6 -15 15 -29 27 -41c21 -21 49 -33 79 -33zM276 118c18 20 28 47 28 74c0 30 -12 58 -33 79c-12 12 -26 22 -42 27l-28 -105z" />
+    <glyph glyph-name="ion-ios-cog" unicode="&#xf412;" horiz-adv-x="384" 
+d="M229 298c16 -5 30 -15 42 -27c21 -21 33 -49 33 -79c0 -27 -10 -54 -28 -74l-75 75zM214 302l-28 -104l-104 -28c-1 7 -2 15 -2 22c0 30 12 58 33 79s49 33 79 33c7 0 15 -1 22 -2zM86 154l104 28l75 -75c-20 -17 -46 -27 -73 -27c-30 0 -58 12 -79 33
+c-12 12 -21 26 -27 41zM384 175l-33 -8l-3 -14l27 -20l-12 -30l-34 5l-8 -11l17 -29l-23 -23l-29 17l-10 -7l5 -34l-29 -12l-21 27l-14 -3l-8 -33h-32l-9 33l-13 3l-21 -28l-29 12l4 34l-11 8l-30 -19l-23 23l18 31l-7 11l-35 -5l-12 29l28 22l-2 12l-35 9v32l35 9l2 12
+l-29 22l12 30l36 -5l7 10l-19 32l22 22l32 -19l11 8l-4 35l29 13l22 -29l12 2l9 35h32l9 -35l12 -2l22 28l29 -12l-5 -35l11 -8l30 18l22 -23l-17 -30l7 -10l35 5l12 -30l-28 -21l3 -13l33 -9v-32zM192 64c71 0 128 57 128 128s-57 128 -128 128s-128 -57 -128 -128
+s57 -128 128 -128z" />
+    <glyph glyph-name="ion-ios-color-filter-outline" unicode="&#xf413;" horiz-adv-x="384" 
+d="M302 236c47 -13 82 -57 82 -108c0 -62 -50 -112 -112 -112c-31 0 -60 13 -80 34c-20 -21 -49 -34 -80 -34c-62 0 -112 50 -112 112c0 51 35 95 82 108c-1 7 -2 13 -2 20c0 62 50 112 112 112s112 -50 112 -112c0 -7 -1 -13 -2 -20zM96 256c0 -6 0 -12 1 -17
+c5 1 10 1 15 1c31 0 60 -13 80 -34c20 21 49 34 80 34c5 0 10 0 15 -1c1 5 1 11 1 17c0 53 -43 96 -96 96s-96 -43 -96 -96zM208 128c0 6 0 12 -1 17c-5 -1 -10 -1 -15 -1s-10 0 -15 1c-1 -5 -1 -11 -1 -17c0 -20 6 -38 16 -53c10 15 16 33 16 53zM192 160c3 0 7 1 10 1
+c-3 7 -6 14 -10 20c-4 -6 -7 -13 -10 -20c3 0 7 -1 10 -1zM166 164c4 11 9 21 16 30c-18 18 -43 30 -70 30c-3 0 -7 -1 -10 -1c10 -29 34 -51 64 -59zM202 194c7 -9 12 -19 16 -30c30 8 54 30 64 59c-3 0 -7 1 -10 1c-27 0 -52 -12 -70 -30zM112 32c27 0 52 12 70 30
+c-14 19 -22 41 -22 66c0 7 1 13 2 20c-36 10 -64 37 -76 72c-40 -11 -70 -48 -70 -92c0 -53 43 -96 96 -96zM272 32c53 0 96 43 96 96c0 44 -30 81 -70 92c-12 -35 -40 -62 -76 -72c1 -7 2 -13 2 -20c0 -25 -8 -47 -22 -66c18 -18 43 -30 70 -30z" />
+    <glyph glyph-name="ion-ios-color-filter" unicode="&#xf414;" horiz-adv-x="384" 
+d="M302 236c47 -13 82 -57 82 -108c0 -62 -50 -112 -112 -112c-31 0 -60 13 -80 34c-20 -21 -49 -34 -80 -34c-62 0 -112 50 -112 112c0 51 35 95 82 108c-1 7 -2 13 -2 20c0 62 50 112 112 112s112 -50 112 -112c0 -7 -1 -13 -2 -20zM192 53l1 -2c3 3 6 7 9 11
+c14 19 22 41 22 66c0 7 -1 13 -2 20c36 10 64 37 76 72c2 5 3 10 4 15c-1 0 -2 1 -3 1v1c-4 1 -8 1 -12 2c-5 1 -10 1 -15 1c-31 0 -60 -13 -80 -34c-20 21 -49 34 -80 34c-5 0 -10 0 -15 -1c-4 -1 -8 -1 -12 -2v-1c-1 0 -2 -1 -3 -1c1 -5 2 -10 4 -15c12 -35 40 -62 76 -72
+c-1 -7 -2 -13 -2 -20c0 -25 8 -47 22 -66c3 -4 6 -8 9 -11zM207 145c1 -5 1 -11 1 -17c0 -20 -6 -38 -16 -53c-10 15 -16 33 -16 53c0 6 0 12 1 17c5 -1 10 -1 15 -1s10 0 15 1zM282 223c-10 -29 -34 -51 -64 -59c-4 11 -9 21 -16 30c18 18 43 30 70 30c3 0 7 -1 10 -1z
+M202 161c-3 0 -7 -1 -10 -1s-7 1 -10 1c3 7 6 14 10 20c4 -6 7 -13 10 -20zM112 224c27 0 52 -12 70 -30c-7 -9 -12 -19 -16 -30c-30 8 -54 30 -64 59c3 0 7 1 10 1z" />
+    <glyph glyph-name="ion-ios-color-wand-outline" unicode="&#xf415;" horiz-adv-x="384" 
+d="M128 298l256 -256l-34 -34l-256 256zM149 232l201 -201l11 11l-201 202zM120 344v40h16v-40h-16zM120 140v40h16v-40h-16zM216 256v16h40v-16h-40zM0 256v16h40v-16h-40zM47 354l29 -29l-12 -11l-28 28zM76 198l-29 -28l-11 11l28 28zM220 342l-28 -28l-12 11l29 29z" />
+    <glyph glyph-name="ion-ios-color-wand" unicode="&#xf416;" horiz-adv-x="396" 
+d="M140 289l256 -257l-34 -34l-256 257zM124 322v64h32v-64h-32zM124 118v64h32v-64h-32zM216 238v32h64v-32h-64zM246 336l-45 -45l-23 22l45 46zM34 336l23 23l45 -46l-23 -22zM34 169l45 45l23 -22l-45 -46zM0 238v32h64v-32h-64z" />
+    <glyph glyph-name="ion-ios-compose-outline" unicode="&#xf417;" horiz-adv-x="384" 
+d="M304 32v208l16 16v-240h-320v304h256l-16 -16h-224v-272h288zM174 164l171 171l11 -11l-180 -180h-32v32l180 180l11 -11l-171 -171zM380 368c2 -3 4 -6 4 -10s-2 -7 -4 -10l-12 -12l-21 21l-11 11v0l12 12c3 2 6 4 10 4s7 -2 10 -4z" />
+    <glyph glyph-name="ion-ios-compose" unicode="&#xf418;" horiz-adv-x="384" 
+d="M192 128l128 128v-240h-320v304h256l-128 -128v-64h64zM324 356l32 -32l-180 -180h-32v32zM380 368c2 -3 4 -6 4 -10s-2 -7 -4 -10l-12 -12l-21 21l-11 11v0l12 12c3 2 6 4 10 4s7 -2 10 -4z" />
+    <glyph glyph-name="ion-ios-contact-outline" unicode="&#xf419;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 383c-105 0 -191 -86 -191 -191c0 -47 17 -89 45 -122c18 8 62 24 90 32c2 1 3 0 3 10c0 11 -1 18 -4 24c-4 8 -7 20 -9 31c-4 5 -10 15 -14 33c-3 16 -1 22 1 28v2
+c1 4 0 23 -3 38c-2 10 1 34 15 52c9 12 27 26 58 28h18c32 -2 49 -16 58 -28c14 -18 17 -42 15 -52c-3 -15 -4 -34 -3 -38c0 0 1 -1 1 -2c2 -6 3 -12 0 -28c-4 -18 -10 -27 -14 -32c-2 -11 -5 -24 -9 -32c-3 -7 -6 -15 -6 -23c0 -10 0 -10 2 -11c27 -8 73 -24 93 -32
+c28 33 45 76 45 122c0 105 -86 191 -191 191z" />
+    <glyph glyph-name="ion-ios-contact" unicode="&#xf41a;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c59 0 111 27 146 69c-20 8 -66 24 -93 32c-2 1 -3 1 -3 11c0 8 4 16 7 23c4 8 7 21 9 32c4 5 10 14 14 32c3 16 2 22 0 28c0 0 -1 1 -1 2c-1 4 0 23 3 38c2 10 -1 34 -15 52
+c-9 12 -26 26 -58 28h-18c-31 -2 -49 -16 -58 -28c-14 -18 -17 -42 -15 -52c3 -15 4 -34 3 -38v-2c-2 -6 -4 -12 -1 -28c4 -18 10 -28 14 -33c2 -11 5 -23 9 -31c3 -6 4 -13 4 -24c0 -10 -1 -9 -3 -10c-28 -8 -72 -24 -90 -32c35 -42 87 -69 146 -69z" />
+    <glyph glyph-name="ion-ios-copy-outline" unicode="&#xf41b;" horiz-adv-x="288" 
+d="M192 352v-64h64v-16h-80v80h16zM213 384l75 -75v-261h-48v-48h-240v336h48v48h165zM224 16v32h-176v272h-32v-304h208zM272 64v238l-65 66h-143v-304h208z" />
+    <glyph glyph-name="ion-ios-copy" unicode="&#xf41c;" horiz-adv-x="288" 
+d="M32 32h16h192v-32h-240v336h32v-288v-16zM213 384l75 -75v-261h-48h-192v288v48h165zM256 272v16h-64v64h-16v-80h80z" />
+    <glyph glyph-name="ion-ios-crop-strong" unicode="&#xf41d;" horiz-adv-x="384" 
+d="M64 336v48h32v-48h-32zM96 96h176v-32h-208v208h32v-176zM336 64v32h48v-32h-48zM0 320h320v-320h-32v288h-288v32z" />
+    <glyph glyph-name="ion-ios-crop" unicode="&#xf41e;" horiz-adv-x="384" 
+d="M64 336v48h16v-48h-16zM80 80h208v-16h-224v224h16v-208zM336 64v16h48v-16h-48zM0 320h320v-320h-16v304h-304v16z" />
+    <glyph glyph-name="ion-ios-download-outline" unicode="&#xf41f;" horiz-adv-x="320" 
+d="M192 304h128v-304h-320v304h128v-16h-112v-272h288v272h-112v16zM97 196l55 -55v243h16v-243l55 55l11 -12l-74 -74l-74 74z" />
+    <glyph glyph-name="ion-ios-download" unicode="&#xf420;" horiz-adv-x="320" 
+d="M168 304h152v-304h-320v304h152v-163l-55 55l-11 -12l74 -74l74 74l-11 12l-55 -55v163zM152 304v80h16v-80h-16z" />
+    <glyph glyph-name="ion-ios-drag" unicode="&#xf421;" horiz-adv-x="352" 
+d="M0 128v16h352v-16h-352zM0 184v16h352v-16h-352zM0 240v16h352v-16h-352z" />
+    <glyph glyph-name="ion-ios-email-outline" unicode="&#xf422;" horiz-adv-x="384" 
+d="M0 320h384v-256h-384v256zM192 180l163 124h-326zM16 80h352v214l-115 -88l68 -77l-2 -2l-79 70l-48 -37l-48 37l-79 -70l-2 2l68 77l-115 88v-214z" />
+    <glyph glyph-name="ion-ios-email" unicode="&#xf423;" horiz-adv-x="384" 
+d="M384 64h-384v242l131 -100l-68 -77l2 -2l79 70l48 -37l48 37l79 -70l2 2l-68 77l131 100v-242zM376 320l-184 -140l-184 140h368z" />
+    <glyph glyph-name="ion-ios-eye-outline" unicode="&#xf424;" horiz-adv-x="384" 
+d="M383 192l1 -1l-6 -6c-21 -21 -47 -48 -78 -69c-36 -24 -72 -36 -108 -36c-83 0 -130 49 -185 105l-7 7l1 1c39 40 67 64 94 81c32 20 63 30 97 30c83 0 146 -60 191 -112zM192 288c-62 0 -111 -36 -170 -96c24 -24 48 -50 76 -68c30 -20 60 -28 94 -28
+c75 0 133 56 171 95c-26 29 -50 50 -74 66c-32 21 -64 31 -97 31zM192 112c-44 0 -80 36 -80 80s36 80 80 80s80 -36 80 -80s-36 -80 -80 -80zM192 256c-35 0 -64 -29 -64 -64s29 -64 64 -64s64 29 64 64s-29 64 -64 64zM224 192h16v0c0 -26 -22 -48 -48 -48s-48 21 -48 48
+s22 48 48 48v-16c-16 0 -32 -13 -32 -31s15 -33 32 -33s32 14 32 32v0z" />
+    <glyph glyph-name="ion-ios-eye" unicode="&#xf425;" horiz-adv-x="384" 
+d="M383 192l1 -1l-6 -6c-21 -21 -47 -48 -78 -69c-36 -24 -72 -36 -108 -36c-83 0 -130 49 -185 105l-7 7l1 1c39 40 67 64 94 81c32 20 63 30 97 30c83 0 146 -60 191 -112zM192 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM186 221
+c0 -19 16 -35 35 -35c7 0 14 2 19 6v0c0 -27 -22 -48 -48 -48s-48 21 -48 48s22 48 48 48c-4 -5 -6 -12 -6 -19z" />
+    <glyph glyph-name="ion-ios-fastforward-outline" unicode="&#xf426;" 
+d="M16 293v-202l184 101zM240 292v0v-78v-27v-95l176 100zM224 320v0l224 -128l-224 -128v123l-224 -123v256l224 -123v123z" />
+    <glyph glyph-name="ion-ios-fastforward" unicode="&#xf427;" 
+d="M224 320v0l224 -128l-224 -128v123l-224 -123v256l224 -123v123z" />
+    <glyph glyph-name="ion-ios-filing-outline" unicode="&#xf428;" horiz-adv-x="352" 
+d="M288 320l64 -96v-160h-176h-176v160l64 96h224zM333 224l-45 68v-68h45zM80 304v-80h48c0 -26 22 -48 48 -48s48 22 48 48h48v80h-192zM64 292l-45 -68h45v68zM336 80v128h-98c-7 -28 -32 -48 -62 -48s-55 20 -62 48h-98v-128h160h160z" />
+    <glyph glyph-name="ion-ios-filing" unicode="&#xf429;" horiz-adv-x="352" 
+d="M176 160c30 0 55 20 62 48h114v-144h-176h-176v144h114c7 -28 32 -48 62 -48zM64 224h-7h-57l64 96v0v-80h16v80h192v-80h16v80v0l64 -96h-56h-8h-16h-8h-40c0 -26 -22 -48 -48 -48s-48 22 -48 48h-39h-9h-16z" />
+    <glyph glyph-name="ion-ios-film-outline" unicode="&#xf42a;" horiz-adv-x="400" 
+d="M0 360h400v-336h-400v336zM72 40v48h-56v-48h56zM72 104v48h-56v-48h56zM72 168v48h-56v-48h56zM72 232v48h-56v-48h56zM72 296v48h-56v-48h56zM312 40v144h-224v-144h224zM312 200v144h-224v-144h224zM384 40v48h-56v-48h56zM384 104v48h-56v-48h56zM384 168v48h-56v-48
+h56zM384 232v48h-56v-48h56zM384 296v48h-56v-48h56z" />
+    <glyph glyph-name="ion-ios-film" unicode="&#xf42b;" horiz-adv-x="400" 
+d="M0 360h400v-336h-400v336zM72 40v48h-56v-48h56zM72 104v48h-56v-48h56zM72 168v48h-56v-48h56zM72 232v48h-56v-48h56zM72 296v48h-56v-48h56zM312 184v16h-224v-16h224zM384 40v48h-56v-48h56zM384 104v48h-56v-48h56zM384 168v48h-56v-48h56zM384 232v48h-56v-48h56z
+M384 296v48h-56v-48h56z" />
+    <glyph glyph-name="ion-ios-flag-outline" unicode="&#xf42c;" horiz-adv-x="256" 
+d="M240 336c6 1 11 1 16 2v-16v-157c-5 -1 -10 -1 -16 -2c-11 -1 -24 -3 -39 -3c-25 0 -47 4 -69 9s-42 13 -64 13c-30 0 -46 -5 -52 -7v-143h-16v142v162v2l3 3c2 1 18 11 65 11c24 0 45 -4 67 -9c21 -4 42 -11 65 -11c15 0 29 3 40 4zM240 179v0v141c-11 -1 -25 -4 -40 -4
+c-25 0 -46 6 -68 11s-42 9 -64 9c-30 0 -46 -5 -52 -7v-137c10 3 26 6 52 6c24 0 45 -8 67 -13c21 -4 43 -9 66 -9c15 0 28 2 39 3z" />
+    <glyph glyph-name="ion-ios-flag" unicode="&#xf42d;" horiz-adv-x="256" 
+d="M240 336c6 1 11 1 16 2v-16v-157c-5 -1 -10 -1 -16 -2c-11 -1 -24 -3 -39 -3c-25 0 -47 4 -69 9s-42 13 -64 13c-30 0 -46 -5 -52 -7v-143h-16v142v162v2l3 3c2 1 18 11 65 11c24 0 45 -4 67 -9c21 -4 42 -11 65 -11c15 0 29 3 40 4z" />
+    <glyph glyph-name="ion-ios-flame-outline" unicode="&#xf42e;" horiz-adv-x="256" 
+d="M96 416c87 -64 170 -179 159 -288c-13 -134 -104 -160 -127 -160s-127 40 -128 160c-1 146 122 143 96 288zM128 -24c0 0 40 36 40 80s-40 80 -40 80s-41 -36 -41 -80s41 -80 41 -80zM239 130c5 47 -10 99 -41 151c-22 36 -50 70 -83 99c0 -57 -24 -91 -49 -123
+c-26 -34 -50 -65 -50 -129c0 -25 5 -48 15 -68c8 -17 20 -32 35 -45c8 -7 16 -12 23 -16c-9 16 -18 35 -18 57c0 51 44 90 46 92l11 9l11 -9c2 -2 45 -41 45 -92c0 -23 -9 -44 -19 -60c7 4 13 8 20 14c14 12 25 27 34 44c11 21 17 47 20 76z" />
+    <glyph glyph-name="ion-ios-flame" unicode="&#xf42f;" horiz-adv-x="256" 
+d="M96 416c87 -64 170 -179 159 -288c-13 -134 -104 -160 -127 -160s-127 40 -128 160c-1 146 122 143 96 288zM128 -24c0 0 40 36 40 80s-40 80 -40 80s-41 -36 -41 -80s41 -80 41 -80z" />
+    <glyph glyph-name="ion-ios-flask-outline" unicode="&#xf430;" horiz-adv-x="384" 
+d="M373 78c8 -16 11 -32 11 -46c-1 -36 -27 -64 -63 -64h-256c-36 0 -64 27 -65 64c0 14 4 30 12 46l116 195v127h-16v16h16h16v-16v-16h48v-16h-48v-32h32v-16h-32v-32h48v-16h-48v-3l-2 -4l-15 -25h49v-16h-58l-92 -154c-13 -25 -14 -43 -2 -63c9 -14 23 -23 41 -23h256
+c17 0 33 8 41 22c5 8 6 17 6 26c0 12 -2 25 -9 38l-116 195l-3 4v131v16h16h16v-16h-16v-127zM44 73l72 119h153l72 -119c7 -11 10 -24 10 -33c-1 -24 -16 -40 -46 -40h-226c-30 0 -46 12 -46 40c0 9 4 22 11 33zM260 176h-135l-67 -111v0v0c-5 -8 -9 -19 -9 -25
+c0 -13 5 -17 6 -18c4 -4 13 -6 24 -6h226c10 0 18 3 23 7c4 4 7 10 7 18c0 6 -3 16 -8 24v0v0z" />
+    <glyph glyph-name="ion-ios-flask" unicode="&#xf431;" horiz-adv-x="384" 
+d="M327 65v0c5 -8 8 -18 8 -24c0 -8 -3 -14 -7 -18c-5 -4 -13 -7 -23 -7h-226c-11 0 -20 2 -24 6c-1 1 -6 5 -6 18c0 6 4 17 9 25v0v0l67 111h135l67 -111v0zM373 78c8 -16 11 -32 11 -46c-1 -36 -27 -64 -63 -64h-256c-36 0 -64 27 -65 64c0 14 4 30 12 46l116 195v127h-16
+v16h160v-16h-16v-127zM144 384v-16h48v16h-48zM144 336v-16h32v16h-32zM144 288v-16h48v16h-48zM127 240l-9 -16h58v16h-49zM351 40c0 9 -3 22 -10 33l-72 119h-154l-71 -119c-7 -11 -11 -24 -11 -33c0 -28 16 -40 46 -40h226c30 0 45 16 46 40z" />
+    <glyph glyph-name="ion-ios-flower-outline" unicode="&#xf432;" 
+d="M363 164c-29 0 -65 7 -93 14c-1 -3 -2 -6 -4 -9c25 -15 56 -36 76 -56c40 -40 53 -68 41 -80c-3 -3 -7 -4 -12 -4c-15 0 -38 15 -68 45c-20 20 -41 51 -56 76c-3 -2 -7 -3 -10 -4c7 -28 15 -64 15 -93c0 -56 -12 -85 -28 -85s-28 29 -28 85c0 29 8 65 15 93
+c-3 1 -7 2 -10 4c-15 -25 -36 -56 -56 -76c-30 -30 -53 -45 -68 -45c-5 0 -9 1 -12 4c-12 12 1 40 41 80c20 20 51 41 76 56c-2 3 -3 6 -4 9c-28 -7 -64 -14 -93 -14c-56 0 -85 12 -85 28s29 28 85 28c29 0 65 -8 93 -15c1 3 2 7 4 10c-25 15 -56 35 -76 55
+c-40 40 -53 68 -41 80c3 3 7 4 12 4c15 0 38 -14 68 -44c20 -20 41 -51 56 -76c3 2 7 3 10 4c-7 28 -15 64 -15 93c0 56 12 85 28 85s28 -29 28 -85c0 -29 -8 -65 -15 -93c3 -1 7 -2 10 -4c15 25 36 56 56 76c30 30 53 44 68 44c5 0 9 -1 12 -4c12 -12 -1 -40 -41 -80
+c-20 -20 -51 -40 -76 -55c2 -3 3 -7 4 -10c28 7 64 15 93 15c56 0 85 -12 85 -28s-29 -28 -85 -28zM288 193v-3c30 -7 56 -10 75 -10c21 0 39 2 52 5c10 3 14 6 16 7c-2 1 -6 4 -16 7c-13 3 -31 5 -52 5c-19 0 -45 -4 -75 -11zM314 299c-14 -14 -30 -35 -46 -61l2 -2
+c26 16 47 32 61 46c15 15 26 28 33 40c5 9 7 14 7 16c-4 0 -22 -4 -57 -39zM178 236l2 2c-16 26 -32 47 -46 61c-35 35 -53 39 -57 39c0 -2 2 -7 7 -16c7 -12 18 -25 33 -40c14 -14 35 -30 61 -46zM85 180c19 0 45 3 75 10v3c-30 7 -56 11 -75 11c-21 0 -39 -2 -52 -5
+c-10 -3 -14 -6 -16 -7c2 -1 5 -4 15 -7c13 -3 32 -5 53 -5zM134 85c14 14 30 35 46 61l-2 2c-26 -16 -47 -32 -61 -46c-15 -15 -26 -29 -33 -41c-5 -9 -7 -14 -7 -16c4 0 22 5 57 40zM270 148l-2 -2c16 -26 32 -47 46 -61c35 -35 53 -40 57 -40c0 2 -2 7 -7 16
+c-7 12 -18 26 -33 41c-14 14 -35 30 -61 46zM217 383c-3 -13 -5 -31 -5 -52c0 -19 4 -45 11 -75h2c7 30 11 56 11 75c0 21 -2 39 -5 52c-3 10 -6 14 -7 16c-1 -2 -4 -6 -7 -16zM231 0c3 13 5 32 5 53c0 19 -4 45 -11 75h-2c-7 -30 -11 -56 -11 -75c0 -21 2 -40 5 -53
+c3 -10 6 -13 7 -15c1 2 4 5 7 15zM224 160c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM313 42c10 -34 7 -53 -5 -58c-2 -1 -3 -1 -5 -1c-11 0 -25 13 -37 35c5 35 -2 76 -2 76s24 -34 49 -52zM302 -1c1 4 2 14 -3 34c-5 4 -10 9 -15 14
+c0 -9 0 -17 -1 -25c10 -16 16 -22 19 -23zM182 365c-6 -35 1 -75 1 -75s-27 35 -48 51c-10 35 -7 54 5 59c2 1 3 1 5 1c11 0 24 -12 37 -36zM164 337c0 9 0 17 1 25c-10 16 -16 21 -19 22c-1 -4 -2 -14 3 -34c5 -4 10 -8 15 -13zM50 149c35 -4 76 2 76 2s-34 -24 -51 -48
+c-12 -4 -26 -6 -35 -6c-13 0 -21 4 -24 11c-5 11 7 25 34 41zM66 117c4 5 8 10 13 15c-9 0 -17 0 -25 1c-16 -10 -21 -16 -22 -19c1 0 4 -1 8 -1c7 0 16 1 26 4zM432 276c5 -11 -7 -26 -34 -42c-35 5 -76 -2 -76 -2s33 25 51 49c13 4 26 5 35 5c13 0 21 -3 24 -10zM394 250
+c16 10 21 16 22 19c-1 0 -4 1 -8 1c-7 0 -16 -1 -26 -4c-4 -5 -8 -9 -13 -14c9 0 17 -1 25 -2zM131 39c31 24 53 55 53 55s-7 -39 -3 -71c-15 -26 -28 -39 -39 -39c-2 0 -4 0 -6 1c-11 5 -13 24 -5 54zM143 1c4 2 12 8 22 26c0 6 -1 13 -1 20c-6 -6 -13 -12 -19 -17
+c-4 -18 -3 -26 -2 -29zM312 398c11 -5 13 -22 5 -54c-29 -21 -53 -55 -53 -55s8 48 3 71c13 25 28 39 39 39c2 0 4 0 6 -1zM303 353c5 18 3 27 2 30c-4 -2 -12 -8 -22 -26c0 -6 1 -14 1 -21c6 6 13 12 19 17zM71 285c18 -24 55 -53 55 -53s-40 7 -70 3c-28 15 -43 32 -38 44
+c3 7 10 11 22 11c8 0 21 -1 31 -5zM33 273c2 -4 8 -12 26 -22c6 0 13 1 20 1c-6 6 -12 12 -17 18c-8 2 -16 4 -22 4c-4 0 -6 -1 -7 -1zM392 149c30 -17 43 -33 38 -45c-3 -7 -10 -10 -22 -10c-8 0 -19 1 -31 5c-20 27 -55 52 -55 52s45 -8 70 -2zM408 110c4 0 6 1 7 1
+c-2 4 -8 12 -26 22c-6 0 -13 -1 -20 -1c6 -6 12 -13 17 -19c8 -2 16 -3 22 -3z" />
+    <glyph glyph-name="ion-ios-flower" unicode="&#xf433;" 
+d="M363 220c56 0 85 -12 85 -28s-29 -28 -85 -28c-29 0 -65 7 -93 14c-1 -3 -2 -6 -4 -9c25 -15 56 -36 76 -56c40 -40 53 -68 41 -80s-40 1 -80 41c-20 20 -41 51 -56 76c-3 -2 -7 -3 -10 -4c7 -28 15 -64 15 -93c0 -56 -12 -85 -28 -85s-28 29 -28 85c0 29 8 65 15 93
+c-3 1 -7 2 -10 4c-15 -25 -36 -56 -56 -76c-40 -40 -68 -53 -80 -41s1 40 41 80c20 20 51 41 76 56c-2 3 -3 6 -4 9c-28 -7 -64 -14 -93 -14c-56 0 -85 12 -85 28s29 28 85 28c29 0 65 -8 93 -15c1 3 2 7 4 10c-25 15 -56 35 -76 55c-40 40 -53 68 -41 80s40 0 80 -40
+c20 -20 41 -51 56 -76c3 2 6 3 9 4c-7 28 -14 64 -14 93c0 56 12 85 28 85s28 -29 28 -85c0 -29 -7 -65 -14 -93c3 -1 6 -2 9 -4c15 25 36 56 56 76c40 40 68 52 80 40s-1 -40 -41 -80c-20 -20 -51 -40 -76 -55c2 -3 3 -7 4 -10c28 7 64 15 93 15zM264 94c0 0 24 -34 49 -52
+c10 -34 7 -53 -5 -58c-2 -1 -3 -1 -5 -1c-11 0 -25 13 -37 35c5 35 -2 76 -2 76zM183 290c0 0 -27 35 -48 51c-10 35 -7 54 5 59c2 1 3 1 5 1c11 0 24 -12 37 -36c-6 -35 1 -75 1 -75zM126 151c0 0 -34 -24 -51 -48c-12 -4 -26 -6 -35 -6c-13 0 -21 4 -24 11
+c-5 11 7 25 34 41c35 -4 76 2 76 2zM322 232c0 0 33 25 51 49c13 4 26 5 35 5c13 0 21 -3 24 -10c5 -11 -7 -26 -34 -42c-35 5 -76 -2 -76 -2zM131 39c31 24 53 55 53 55s-7 -39 -3 -71c-15 -26 -28 -39 -39 -39c-2 0 -4 0 -6 1c-11 5 -13 24 -5 54zM317 344
+c-29 -21 -53 -55 -53 -55s8 48 3 71c13 25 28 39 39 39c2 0 4 0 6 -1c11 -5 13 -22 5 -54zM56 235c-28 15 -43 32 -38 44c3 7 10 11 22 11c8 0 21 -1 31 -5c18 -24 55 -53 55 -53s-40 7 -70 3zM392 149c30 -17 43 -33 38 -45c-3 -7 -10 -10 -22 -10c-8 0 -19 1 -31 5
+c-20 27 -55 52 -55 52s45 -8 70 -2z" />
+    <glyph glyph-name="ion-ios-folder-outline" unicode="&#xf434;" 
+d="M425 352c13 0 23 -10 23 -23v-304c0 -14 -10 -25 -23 -25h-400c-13 0 -25 12 -25 25v336c0 13 11 23 25 23h112c8 0 12 -2 17 -7v0l23 -23c2 -2 3 -2 6 -2h242zM25 368c-4 0 -9 -3 -9 -7v-74c3 1 5 1 8 1h400c3 0 5 0 8 -1v42c0 4 -3 7 -7 7h-242c-7 0 -12 2 -17 7
+l-23 23c-2 2 -3 2 -6 2h-112zM432 25v239c0 4 -4 8 -8 8h-400c-4 0 -8 -4 -8 -8v-239c0 -4 5 -9 9 -9h400c4 0 7 5 7 9z" />
+    <glyph glyph-name="ion-ios-folder" unicode="&#xf435;" 
+d="M440 272c4 0 8 -4 8 -8v-239c0 -14 -10 -25 -23 -25h-400c-13 0 -25 12 -25 25v239c0 4 4 8 8 8h432zM425 352c13 0 23 -10 23 -23v-42c-3 1 -5 1 -8 1h-432c-3 0 -5 0 -8 -1v74c0 13 11 23 25 23h112c8 0 12 -2 17 -7v0l23 -23c2 -2 3 -2 6 -2h242z" />
+    <glyph glyph-name="ion-ios-football-outline" unicode="&#xf436;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM249 6c3 1 5 1 8 2l24 64l-20 39v1h-106l-20 -39l25 -65c2 -1 5 -1 7 -2c12 -3 25 -5 38 -5c14 0 30 2 44 5zM41 284c-15 -27 -23 -57 -24 -89l43 37v0zM142 371
+c-36 -14 -68 -38 -90 -69l22 -64l5 -2l49 -23l71 60v58zM277 201l-70 58l-69 -58v-1l18 -72h104l18 72zM399 195c-1 32 -9 63 -24 90l-19 -53v0zM364 302c-22 31 -54 56 -90 69l-58 -40v-58l71 -60l54 24zM18 175c3 -34 15 -66 33 -92l70 -1l21 39l-20 77l-1 1l-49 22z
+M295 82l70 1c18 26 30 58 33 92l-54 46l-50 -23l-20 -77zM207 345l47 32c-15 4 -30 6 -46 6s-32 -2 -47 -6zM118 66l-54 1c20 -23 46 -42 75 -53l-20 50zM277 14c29 11 55 30 75 53l-56 -1l-2 -3z" />
+    <glyph glyph-name="ion-ios-football" unicode="&#xf437;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM249 6c3 1 5 1 8 2l24 64l-20 39v1h-106l-20 -39l25 -65c2 -1 5 -1 7 -2c12 -3 25 -5 38 -5c14 0 30 2 44 5zM142 371c-36 -14 -68 -38 -90 -69l22 -64l5 -2l49 -23l71 60v58z
+M364 302c-22 31 -54 56 -90 69l-58 -40v-58l71 -60l54 24zM18 175c3 -34 15 -66 33 -92l70 -1l21 39l-20 77l-1 1l-49 22zM295 82l70 1c18 26 30 58 33 92l-54 46l-50 -23l-20 -77z" />
+    <glyph glyph-name="ion-ios-game-controller-a-outline" unicode="&#xf438;" 
+d="M163 208c3 0 5 -2 5 -5v-22c0 -3 -2 -5 -5 -5h-35v-35c0 -3 -3 -5 -6 -5h-21c-3 0 -5 2 -5 5v35h-35c-3 0 -5 3 -5 6v21c0 3 2 5 5 5h35v35c0 3 2 5 5 5h22c3 0 5 -2 5 -5v-35h35zM330 169c11 0 20 -8 20 -19s-9 -19 -20 -19s-19 8 -19 19s8 19 19 19zM288 211
+c11 0 19 -8 19 -19s-8 -19 -19 -19s-20 8 -20 19s9 19 20 19zM373 211c11 0 19 -8 19 -19s-8 -19 -19 -19s-20 8 -20 19s9 19 20 19zM330 253c11 0 20 -8 20 -19s-9 -20 -20 -20s-19 9 -19 20s8 19 19 19zM337 286h-226c-26 0 -49 -9 -67 -26s-28 -41 -28 -67s10 -51 28 -68
+s41 -27 67 -27h226c26 0 49 10 67 27s28 42 28 68s-10 50 -28 67s-41 26 -67 26zM337 302v0c61 0 111 -45 111 -109s-50 -111 -111 -111h-226c-61 0 -111 47 -111 111s50 109 111 109h226z" />
+    <glyph glyph-name="ion-ios-game-controller-a" unicode="&#xf439;" 
+d="M337 302c61 0 111 -45 111 -109s-50 -111 -111 -111h-226c-61 0 -111 47 -111 111s50 109 111 109h226zM168 181v0v22c0 3 -2 5 -5 5h-35v35c0 3 -2 5 -5 5h-22c-3 0 -5 -2 -5 -5v-35h-35c-3 0 -5 -2 -5 -5v-21c0 -3 2 -6 5 -6h35v-35c0 -3 2 -5 5 -5h21c3 0 6 2 6 5v35
+h35c3 0 5 2 5 5zM288 173c11 0 19 8 19 19s-8 19 -19 19s-20 -8 -20 -19s9 -19 20 -19zM330 131c11 0 20 8 20 19s-9 19 -20 19s-19 -8 -19 -19s8 -19 19 -19zM330 214c11 0 20 9 20 20s-9 19 -20 19s-19 -8 -19 -19s8 -20 19 -20zM373 173c11 0 19 8 19 19s-8 19 -19 19
+s-20 -8 -20 -19s9 -19 20 -19z" />
+    <glyph glyph-name="ion-ios-game-controller-b-outline" unicode="&#xf43a;" 
+d="M276 244c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM320 200c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM103 264c22 0 39 -18 39 -40s-17 -40 -39 -40s-39 18 -39 40s17 40 39 40zM103 205c11 0 19 8 19 19s-8 19 -19 19
+s-19 -8 -19 -19s8 -19 19 -19zM320 288c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM364 244c11 0 20 -9 20 -20s-9 -20 -20 -20s-20 9 -20 20s9 20 20 20zM434 199c21 -88 18 -152 -7 -164c-4 -2 -9 -3 -13 -3c-22 0 -45 24 -68 52c-26 32 -32 33 -110 33
+h-24c-78 0 -84 -1 -110 -33c-23 -28 -46 -52 -68 -52c-4 0 -9 1 -13 3c-25 12 -28 76 -7 164s43 136 88 149c10 3 18 4 26 4c28 0 47 -15 96 -15s68 15 96 15c8 0 16 -1 26 -4c45 -13 67 -61 88 -149zM420 49c10 5 23 48 -1 146c-21 90 -43 128 -78 138c-8 2 -14 3 -21 3
+c-10 0 -19 -2 -30 -5c-16 -4 -36 -10 -66 -10s-50 6 -66 10c-11 3 -20 5 -30 5c-7 0 -13 -1 -21 -3c-35 -10 -57 -48 -78 -138c-24 -98 -11 -141 -1 -146c2 -1 4 -1 6 -1c6 0 14 4 23 12s19 18 32 34s24 28 44 34c17 5 38 5 79 5h24c41 0 62 0 79 -5c20 -6 31 -18 44 -34
+s23 -26 32 -34s17 -12 23 -12c2 0 4 0 6 1z" />
+    <glyph glyph-name="ion-ios-game-controller-b" unicode="&#xf43b;" 
+d="M103 243c11 0 19 -8 19 -19s-8 -19 -19 -19s-19 8 -19 19s8 19 19 19zM434 199c21 -88 18 -152 -7 -164c-4 -2 -9 -3 -13 -3c-22 0 -45 24 -68 52c-26 32 -32 33 -110 33h-24c-78 0 -84 -1 -110 -33c-23 -28 -46 -52 -68 -52c-4 0 -9 1 -13 3c-25 12 -28 76 -7 164
+s43 136 88 149c10 3 18 4 26 4c28 0 47 -15 96 -15s68 15 96 15c8 0 16 -1 26 -4c45 -13 67 -61 88 -149zM103 184c22 0 39 18 39 40s-17 40 -39 40s-39 -18 -39 -40s17 -40 39 -40zM276 204c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM320 160
+c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM320 248c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20zM364 204c11 0 20 9 20 20s-9 20 -20 20s-20 -9 -20 -20s9 -20 20 -20z" />
+    <glyph glyph-name="ion-ios-gear-outline" unicode="&#xf43c;" horiz-adv-x="384" 
+d="M193 288c26 0 50 -10 68 -28s28 -42 28 -68s-10 -50 -28 -68s-42 -28 -68 -28s-50 10 -68 28s-28 42 -28 68s10 50 28 68s42 28 68 28zM193 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80zM138 365c-10 -3 -20 -7 -30 -12c2 -8 1 -16 0 -24
+c-2 -13 -8 -25 -18 -35c-12 -12 -29 -19 -46 -19c-4 0 -9 0 -13 1c-5 -10 -9 -20 -12 -30c7 -4 12 -10 17 -17c8 -11 12 -24 12 -37s-4 -26 -12 -37c-5 -7 -10 -13 -17 -17c3 -10 7 -20 12 -30c4 1 9 1 13 1c17 0 34 -7 46 -19c10 -10 16 -22 18 -35c1 -8 2 -16 0 -24
+c10 -5 20 -9 30 -12c4 7 10 12 17 17c11 8 24 12 37 12s26 -4 37 -12c7 -5 13 -10 17 -17c10 3 20 7 30 12c-2 8 -1 16 0 24c2 13 8 25 18 35c12 12 29 19 46 19c4 0 9 0 13 -1c5 10 9 20 12 30c-7 4 -12 10 -17 17c-8 11 -12 24 -12 37s4 26 12 37c5 7 10 13 17 17
+c-3 10 -7 20 -12 30c-4 -1 -9 -1 -13 -1c-17 0 -34 7 -46 19c-10 10 -16 22 -18 35c-1 8 -2 16 0 24c-10 5 -20 9 -30 12c-4 -7 -10 -12 -17 -17c-11 -8 -24 -12 -37 -12s-26 4 -37 12c-7 5 -13 10 -17 17zM238 384v0c20 -5 40 -13 57 -24c-8 -18 -5 -40 10 -55
+c10 -10 22 -14 35 -14c7 0 14 1 20 4c11 -17 19 -37 24 -57c-19 -7 -32 -25 -32 -46s14 -39 32 -46c-5 -20 -13 -40 -24 -57c-6 3 -13 4 -20 4c-13 0 -25 -4 -35 -14c-15 -15 -18 -37 -10 -55c-17 -11 -37 -19 -57 -24c-7 18 -25 32 -46 32s-39 -14 -46 -32
+c-20 5 -40 13 -57 24c8 18 5 40 -10 55c-10 10 -22 14 -35 14c-7 0 -14 -1 -20 -4c-11 17 -19 37 -24 57c18 7 32 25 32 46s-13 39 -32 46c5 20 13 40 24 57c6 -3 13 -4 20 -4c13 0 25 4 35 14c15 15 18 37 10 55c17 11 37 19 57 24c7 -19 25 -32 46 -32s39 13 46 32z" />
+    <glyph glyph-name="ion-ios-gear" unicode="&#xf43d;" horiz-adv-x="384" 
+d="M352 192c0 -21 14 -39 32 -46c-5 -20 -13 -40 -24 -57c-6 3 -13 4 -20 4c-13 0 -25 -4 -35 -14c-15 -15 -18 -37 -10 -55c-17 -11 -37 -19 -57 -24c-7 18 -25 32 -46 32s-39 -14 -46 -32c-20 5 -40 13 -57 24c8 18 5 40 -10 55c-10 10 -22 14 -35 14c-7 0 -14 -1 -20 -4
+c-11 17 -19 37 -24 57c18 7 32 25 32 46s-13 39 -32 46c5 20 13 40 24 57c6 -3 13 -4 20 -4c13 0 25 4 35 14c15 15 18 37 10 55c17 11 37 19 57 24c7 -19 25 -32 46 -32s39 13 46 32c20 -5 40 -13 57 -24c-8 -18 -5 -40 10 -55c10 -10 22 -14 35 -14c7 0 14 1 20 4
+c11 -17 19 -37 24 -57c-19 -7 -32 -25 -32 -46zM193 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+    <glyph glyph-name="ion-ios-glasses-outline" unicode="&#xf43e;" 
+d="M433 201v0h15v-18h-15c-2 -22 -13 -43 -29 -58c-17 -16 -39 -25 -62 -25c-51 0 -92 41 -92 92v0v0c0 10 -12 22 -26 22s-26 -12 -26 -22v0v0c0 -51 -41 -92 -92 -92c-23 0 -45 9 -62 25c-16 15 -27 36 -29 58h-15v18h15c2 22 13 43 29 59c17 16 39 24 62 24
+c42 0 78 -27 89 -67c7 7 18 12 29 12s22 -5 29 -12c11 40 47 67 89 67c23 0 45 -9 62 -25c16 -15 27 -36 29 -58zM342 115c42 0 77 35 77 77s-35 77 -77 77s-77 -35 -77 -77s35 -77 77 -77zM106 115c42 0 77 35 77 77s-35 77 -77 77s-77 -35 -77 -77s35 -77 77 -77z" />
+    <glyph glyph-name="ion-ios-glasses" unicode="&#xf43f;" 
+d="M433 201v0h15v-18h-15c-2 -22 -13 -43 -29 -58c-17 -16 -39 -25 -62 -25c-51 0 -92 41 -92 92v0v0c0 10 -12 22 -26 22s-26 -12 -26 -22v0v0c0 -51 -41 -92 -92 -92c-23 0 -45 9 -62 25c-16 15 -27 36 -29 58h-15v18h15c2 22 13 43 29 59c17 16 39 24 62 24
+c42 0 78 -27 89 -67c7 7 18 12 29 12s22 -5 29 -12c11 40 47 67 89 67c23 0 45 -9 62 -25c16 -15 27 -36 29 -58z" />
+    <glyph glyph-name="ion-ios-grid-view-outline" unicode="&#xf440;" horiz-adv-x="384" 
+d="M384 256h-112v-128h112v-16h-112v-112h-16v112h-128v-112h-16v112h-112v16h112v128h-112v16h112v112h16v-112h128v112h16v-112h112v-16zM256 128v128h-128v-128h128z" />
+    <glyph glyph-name="ion-ios-grid-view" unicode="&#xf441;" horiz-adv-x="384" 
+d="M128 128v128h128v-128h-128zM0 384h384v-384h-384v384zM352 256v16h-80v80h-16v-80h-128v80h-16v-80h-80v-16h80v-128h-80v-16h80v-80h16v80h128v-80h16v80h80v16h-80v128h80z" />
+    <glyph glyph-name="ion-ios-heart-outline" unicode="&#xf442;" 
+d="M327 368c69 0 121 -43 121 -116c0 -31 -13 -71 -41 -105s-45 -52 -100 -88s-83 -43 -83 -43s-28 7 -83 43s-72 54 -100 88s-41 74 -41 105c0 73 52 116 121 116c39 0 82 -18 103 -53c21 35 64 53 103 53zM395 157c12 14 22 31 28 49c6 16 9 31 9 46c0 30 -10 56 -29 74
+c-9 8 -20 15 -33 19c-13 5 -28 7 -43 7c-38 0 -73 -18 -89 -45l-14 -23l-14 23c-16 27 -51 45 -89 45c-15 0 -30 -2 -43 -7c-13 -4 -24 -11 -33 -19c-19 -18 -29 -44 -29 -74c0 -15 3 -30 9 -46c6 -18 16 -35 28 -49c27 -32 42 -49 97 -85c40 -27 65 -36 74 -39
+c9 3 34 12 74 39c55 36 70 53 97 85z" />
+    <glyph glyph-name="ion-ios-heart" unicode="&#xf443;" 
+d="M327 368c69 0 121 -43 121 -116c0 -31 -13 -71 -41 -105s-45 -52 -100 -88s-83 -43 -83 -43s-28 7 -83 43s-72 54 -100 88s-41 74 -41 105c0 73 52 116 121 116c39 0 82 -18 103 -53c21 35 64 53 103 53z" />
+    <glyph glyph-name="ion-ios-help-empty" unicode="&#xf444;" horiz-adv-x="128" 
+d="M68 82c-9 0 -17 8 -17 17s8 17 17 17s17 -8 17 -17s-8 -17 -17 -17zM102 197c-23 -22 -22 -27 -23 -53h-19c1 28 7 43 30 64c11 10 19 24 19 39c0 24 -19 39 -42 39c-32 0 -49 -16 -48 -46h-19c0 42 25 62 68 62c33 0 60 -20 60 -54c0 -22 -11 -37 -26 -51z" />
+    <glyph glyph-name="ion-ios-help-outline" unicode="&#xf445;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM212 302c33 0 60 -21 60 -55c0 -22 -11 -36 -26 -50c-23 -23 -22 -27 -23 -53h-19
+c1 28 7 43 30 64c11 10 19 23 19 38c0 24 -19 40 -42 40c-32 0 -49 -16 -48 -46h-19c0 42 25 62 68 62zM212 116c9 0 17 -8 17 -17s-8 -17 -17 -17s-17 8 -17 17s8 17 17 17z" />
+    <glyph glyph-name="ion-ios-help" unicode="&#xf446;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM212 82c9 0 17 8 17 17s-8 17 -17 17s-17 -8 -17 -17s8 -17 17 -17zM246 197c15 14 26 29 26 51c0 34 -27 54 -60 54c-43 0 -68 -20 -68 -62h19c-1 30 16 46 48 46
+c23 0 42 -15 42 -39c0 -15 -8 -29 -19 -39c-23 -21 -29 -36 -30 -64h19c1 26 0 31 23 53z" />
+    <glyph glyph-name="ion-ios-home-outline" unicode="&#xf447;" horiz-adv-x="384" 
+d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM336 16v184l-144 116l-144 -116v-184h80v128h128v-128h80zM192 384l192 -153l-12 -12l-180 145l-180 -145l-12 12l32 25v96h64v-45zM80 294v42h-32v-67z" />
+    <glyph glyph-name="ion-ios-home" unicode="&#xf448;" horiz-adv-x="384" 
+d="M192 336l160 -128v-208h-112v128h-96v-128h-112v208zM192 384l192 -153l-12 -12l-180 145l-180 -145l-12 12l32 25v96h64v-45z" />
+    <glyph glyph-name="ion-ios-infinite-outline" unicode="&#xf449;" 
+d="M419 260c19 -19 29 -43 29 -68s-10 -49 -29 -68c-19 -18 -44 -28 -70 -28s-50 10 -69 28l-126 123c-15 15 -35 22 -56 22s-40 -7 -55 -22c-31 -30 -31 -80 0 -110c15 -15 34 -22 55 -22s41 7 56 22l43 42l13 -14l-42 -41c-19 -18 -44 -28 -70 -28s-50 10 -69 28
+c-19 19 -29 43 -29 68s10 49 29 68c19 18 43 28 69 28s51 -10 70 -28l126 -123c15 -15 34 -22 55 -22s41 7 56 22c31 30 31 80 0 110c-15 15 -35 22 -56 22s-40 -7 -55 -22l-43 -42l-13 14l42 41c19 18 44 28 70 28s50 -10 69 -28z" />
+    <glyph glyph-name="ion-ios-infinite" unicode="&#xf44a;" horiz-adv-x="464" 
+d="M433 266c20 -20 31 -46 31 -74s-11 -54 -31 -74s-48 -30 -76 -30s-55 10 -75 30l-125 123c-13 13 -32 20 -51 20s-37 -7 -50 -20s-21 -31 -21 -49c0 -19 8 -36 21 -49s31 -20 50 -20s38 7 51 20l39 38l25 -25l-39 -38c-20 -20 -48 -30 -76 -30s-55 10 -75 30
+s-31 46 -31 74s11 54 31 74s47 30 75 30s56 -10 76 -30l125 -123c13 -13 31 -20 50 -20s38 7 51 20s20 31 20 49c0 19 -7 36 -20 49s-32 20 -51 20s-37 -7 -50 -20l-39 -38l-25 25l39 38c20 20 48 30 76 30s55 -10 75 -30z" />
+    <glyph glyph-name="ion-ios-information-empty" unicode="&#xf44b;" horiz-adv-x="64" 
+d="M8 276c0 13 7 20 20 20s20 -7 20 -20s-7 -20 -20 -20s-20 7 -20 20zM48 104h16v-8h-64v8h16v120h-16v8h48v-128z" />
+    <glyph glyph-name="ion-ios-information-outline" unicode="&#xf44c;" horiz-adv-x="416" 
+d="M184 276c0 13 7 20 20 20s20 -7 20 -20s-7 -20 -20 -20s-20 7 -20 20zM224 104h16v-8h-64v8h16v120h-16v8h48v-128zM208 400c57 0 106 -20 147 -61s61 -90 61 -147s-20 -106 -61 -147s-90 -61 -147 -61s-106 20 -147 61s-61 90 -61 147s20 106 61 147s90 61 147 61z
+M208 1c53 0 98 19 135 56s56 82 56 135s-19 98 -56 135s-82 56 -135 56s-98 -19 -135 -56s-56 -82 -56 -135s19 -98 56 -135s82 -56 135 -56z" />
+    <glyph glyph-name="ion-ios-information" unicode="&#xf44d;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM204 296c-11 0 -20 -9 -20 -20s9 -20 20 -20s20 9 20 20s-9 20 -20 20zM240 96v8h-16v128h-48v-8h16v-120h-16v-8h64z" />
+    <glyph glyph-name="ion-ios-ionic-outline" unicode="&#xf44e;" horiz-adv-x="416" 
+d="M378 313c24 -34 38 -76 38 -121c0 -115 -92 -208 -207 -208s-209 93 -209 208s94 208 209 208c45 0 86 -14 120 -38c6 5 13 8 21 8c19 0 35 -16 35 -35c0 -8 -2 -16 -7 -22zM350 357c-12 0 -22 -10 -22 -22s10 -22 22 -22s22 10 22 22s-10 22 -22 22zM344 56
+c18 18 31 39 41 62c10 24 15 48 15 74s-5 51 -15 75c-5 13 -12 25 -20 36c-5 -2 -10 -3 -15 -3c-19 0 -35 16 -35 35c0 5 2 11 4 15c-11 8 -23 15 -36 20c-24 10 -49 14 -75 14s-51 -4 -75 -14c-23 -10 -43 -24 -61 -42s-31 -38 -41 -61c-10 -24 -15 -49 -15 -75
+s5 -50 15 -74c10 -23 23 -44 41 -62s38 -31 61 -41c24 -10 49 -15 75 -15s51 5 75 15c23 10 43 23 61 41zM208 288c53 0 96 -43 96 -96s-43 -96 -96 -96s-96 43 -96 96s43 96 96 96zM208 112c44 0 80 36 80 80s-36 80 -80 80s-79 -36 -79 -80s35 -80 79 -80z" />
+    <glyph glyph-name="ion-ios-keypad-outline" unicode="&#xf44f;" horiz-adv-x="384" 
+d="M331 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-54 23 -54 53s24 54 54 54zM331 16c21 0 37 16 37 37s-16 38 -37 38s-38 -17 -38 -38s17 -37 38 -37zM192 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-53 23 -53 53s23 54 53 54zM192 16c21 0 37 16 37 37s-16 38 -37 38
+s-37 -17 -37 -38s16 -37 37 -37zM53 107c30 0 54 -24 54 -54s-24 -53 -54 -53s-53 23 -53 53s23 54 53 54zM53 16c21 0 38 16 38 37s-17 38 -38 38s-37 -17 -37 -38s16 -37 37 -37zM331 245c30 0 53 -23 53 -53s-23 -53 -53 -53s-54 23 -54 53s24 53 54 53zM331 155
+c21 0 37 16 37 37s-16 37 -37 37s-38 -16 -38 -37s17 -37 38 -37zM192 245c30 0 53 -23 53 -53s-23 -53 -53 -53s-53 23 -53 53s23 53 53 53zM192 155c21 0 37 16 37 37s-16 37 -37 37s-37 -16 -37 -37s16 -37 37 -37zM53 245c30 0 54 -23 54 -53s-24 -53 -54 -53
+s-53 23 -53 53s23 53 53 53zM53 155c21 0 38 16 38 37s-17 37 -38 37s-37 -16 -37 -37s16 -37 37 -37zM331 277c-30 0 -54 24 -54 54s24 53 54 53s53 -23 53 -53s-23 -54 -53 -54zM331 368c-21 0 -38 -16 -38 -37s17 -38 38 -38s37 17 37 38s-16 37 -37 37zM192 384
+c30 0 53 -23 53 -53s-23 -54 -53 -54s-53 24 -53 54s23 53 53 53zM192 293c21 0 37 17 37 38s-16 37 -37 37s-37 -16 -37 -37s16 -38 37 -38zM53 384c30 0 54 -23 54 -53s-24 -54 -54 -54s-53 24 -53 54s23 53 53 53zM53 293c21 0 38 17 38 38s-17 37 -38 37
+s-37 -16 -37 -37s16 -38 37 -38z" />
+    <glyph glyph-name="ion-ios-keypad" unicode="&#xf450;" horiz-adv-x="384" 
+d="M331 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-54 23 -54 53s24 54 54 54zM192 107c30 0 53 -24 53 -54s-23 -53 -53 -53s-53 23 -53 53s23 54 53 54zM53 107c30 0 54 -24 54 -54s-24 -53 -54 -53s-53 23 -53 53s23 54 53 54zM331 245c30 0 53 -23 53 -53
+s-23 -53 -53 -53s-54 23 -54 53s24 53 54 53zM192 245c30 0 53 -23 53 -53s-23 -53 -53 -53s-53 23 -53 53s23 53 53 53zM53 245c30 0 54 -23 54 -53s-24 -53 -54 -53s-53 23 -53 53s23 53 53 53zM331 277c-30 0 -54 24 -54 54s24 53 54 53s53 -23 53 -53s-23 -54 -53 -54z
+M192 384c30 0 53 -23 53 -53s-23 -54 -53 -54s-53 24 -53 54s23 53 53 53zM53 384c30 0 54 -23 54 -53s-24 -54 -54 -54s-53 24 -53 54s23 53 53 53z" />
+    <glyph glyph-name="ion-ios-lightbulb-outline" unicode="&#xf451;" horiz-adv-x="288" 
+d="M288 275c0 -31 -13 -59 -30 -83v0c-11 -15 -22 -28 -32 -45c-22 -38 -18 -73 -18 -82v-1h-128v1c0 7 3 44 -19 82c-10 17 -20 30 -31 45v0c-17 24 -30 52 -30 83c0 78 66 141 144 141s144 -63 144 -141zM239 194l6 8c16 22 27 47 27 73c0 33 -16 65 -40 89s-55 36 -88 36
+s-64 -12 -88 -36s-40 -56 -40 -89c0 -26 11 -51 27 -73l19 -26v0c5 -6 9 -13 13 -21c17 -29 21 -58 21 -75h16v112l-32 64h17l31 -64v-112h32v112l31 64h17l-32 -64v-112h16c0 17 4 45 21 75c8 14 16 25 24 36c1 1 1 2 2 3zM112 -32v16h64v-16h-64zM96 0v16h96v-16h-96z
+M96 32v16h96v-16h-96z" />
+    <glyph glyph-name="ion-ios-lightbulb" unicode="&#xf452;" horiz-adv-x="288" 
+d="M288 275c0 -31 -13 -59 -30 -83v0c-11 -15 -22 -28 -32 -45c-22 -38 -18 -73 -18 -82v-1h-32v128l32 64h-16l-32 -64v-128h-32v128l-31 64h-17l32 -64v-128h-32v1c0 7 3 44 -19 82c-10 17 -20 30 -31 45v0c-17 24 -30 52 -30 83c0 78 66 141 144 141s144 -63 144 -141z
+M112 -32v16h64v-16h-64zM96 0v16h96v-16h-96zM96 32v16h96v-16h-96z" />
+    <glyph glyph-name="ion-ios-list-outline" unicode="&#xf453;" horiz-adv-x="384" 
+d="M368 368h-352v-352h352v352zM384 384v0v-384h-384v384h384zM128 280v16h192v-16h-192zM128 184v16h192v-16h-192zM128 88v16h192v-16h-192zM64 288c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16zM64 192c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16
+s-16 5 -16 16zM64 96c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16z" />
+    <glyph glyph-name="ion-ios-list" unicode="&#xf454;" horiz-adv-x="384" 
+d="M0 384h384v-384h-384v384zM80 80c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM80 176c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM80 272c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM320 88v16h-192v-16h192zM320 184v16
+h-192v-16h192zM320 280v16h-192v-16h192z" />
+    <glyph glyph-name="ion-ios-location-outline" unicode="&#xf455;" horiz-adv-x="288" 
+d="M144 400c-34 0 -67 -13 -91 -37s-37 -57 -37 -91c0 -43 24 -107 70 -186c22 -38 44 -72 58 -91c14 19 36 53 58 91c46 79 70 143 70 186c0 34 -13 67 -37 91s-57 37 -91 37zM144 416v0c80 0 144 -64 144 -144c0 -112 -144 -304 -144 -304s-144 192 -144 304
+c0 80 64 144 144 144zM144 336c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM144 225c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
+    <glyph glyph-name="ion-ios-location" unicode="&#xf456;" horiz-adv-x="288" 
+d="M144 416c80 0 144 -64 144 -144c0 -112 -144 -304 -144 -304s-144 192 -144 304c0 80 64 144 144 144zM144 225c26 0 47 21 47 47s-21 47 -47 47s-47 -21 -47 -47s21 -47 47 -47z" />
+    <glyph glyph-name="ion-ios-locked-outline" unicode="&#xf457;" horiz-adv-x="320" 
+d="M264 224h56v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-72zM72 296v-72h176v72c0 49 -39 88 -88 88s-88 -39 -88 -88zM304 0v208h-288v-208h288zM160 160c18 0 32 -14 32 -32c0 -15 -10 -27 -24 -31v-33h-16v33c-14 4 -24 16 -24 31c0 18 14 32 32 32z
+M160 112c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16z" />
+    <glyph glyph-name="ion-ios-locked" unicode="&#xf458;" horiz-adv-x="320" 
+d="M264 224h56v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-72zM168 97c14 4 24 16 24 31c0 18 -14 32 -32 32s-32 -14 -32 -32c0 -15 10 -27 24 -31v-33h16v33zM248 224v72c0 49 -39 88 -88 88s-88 -39 -88 -88v-72h176zM160 144c9 0 16 -7 16 -16
+s-7 -16 -16 -16s-16 7 -16 16s7 16 16 16z" />
+    <glyph glyph-name="ion-ios-loop-strong" unicode="&#xf459;" horiz-adv-x="512" 
+d="M256 400c115 0 208 -93 208 -208c0 -14 -1 -28 -4 -42l-1 -4l-24 5l1 4c2 12 4 24 4 37c0 101 -83 184 -184 184c-66 0 -127 -36 -160 -94l-2 -3l-21 11l2 4c37 65 106 106 181 106zM416 102l2 3l21 -11l-2 -4c-37 -65 -106 -106 -181 -106c-115 0 -208 93 -208 208
+c0 14 1 28 4 42l1 4l24 -5l-1 -4c-2 -12 -4 -24 -4 -37c0 -101 83 -184 184 -184c66 0 127 36 160 94zM384 192h128l-64 -64zM0 192l64 64l64 -64h-128z" />
+    <glyph glyph-name="ion-ios-loop" unicode="&#xf45a;" horiz-adv-x="489" 
+d="M478 192l11 -11l-52 -53l-53 53l10 11l43 -41zM449 192v0v0c0 -7 0 -14 -1 -21l-16 1c1 7 1 14 1 21c-1 103 -85 187 -188 187c-68 0 -131 -37 -164 -96l-14 8c36 64 104 104 178 104c112 0 203 -91 204 -202v0v-2zM409 100l14 -8c-36 -64 -104 -104 -178 -104
+c-111 0 -202 90 -204 200v0v3v1v0c0 7 0 14 1 21l16 -1c-1 -7 -1 -14 -1 -21c0 -103 85 -187 188 -187c68 0 131 37 164 96zM53 256l52 -53l-11 -11l-41 41l-42 -41l-11 11z" />
+    <glyph glyph-name="ion-ios-medical-outline" unicode="&#xf45b;" horiz-adv-x="364" 
+d="M364 260l-118 -68l118 -68l-32 -56l-118 69v-137h-64v137l-118 -69l-32 56l118 68l-118 68l32 56l118 -69v137h64v-137l118 69zM342 118l-128 74l128 74l-16 28l-128 -74v148h-32v-148l-128 74l-16 -28l128 -74l-128 -74l16 -28l128 74v-148h32v148l128 -74z" />
+    <glyph glyph-name="ion-ios-medical" unicode="&#xf45c;" horiz-adv-x="364" 
+d="M364 260l-118 -68l118 -68l-32 -56l-118 69v-137h-64v137l-118 -69l-32 56l118 68l-118 68l32 56l118 -69v137h64v-137l118 69z" />
+    <glyph glyph-name="ion-ios-medkit-outline" unicode="&#xf45d;" horiz-adv-x="416" 
+d="M224 240h-32v-48v-16h-16h-48v-32h48h16v-16v-48h32v48v16h16h48v32h-48h-16v16v48zM240 256v0v-64h64v-64h-64v-64h-64v64h-64v64h64v64h64zM288 320h128v-320h-416v320h128v32c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-32zM144 350v-30h128v30c0 10 -7 18 -17 18h-97
+c-11 0 -14 -8 -14 -18zM400 16v288h-384v-288h384z" />
+    <glyph glyph-name="ion-ios-medkit" unicode="&#xf45e;" horiz-adv-x="416" 
+d="M224 176h16h48v-32h-48h-16v-16v-48h-32v48v16h-16h-48v32h48h16v16v48h32v-48v-16zM288 320h128v-320h-416v320h128v32c0 18 10 32 29 32h99c19 0 32 -14 32 -32v-32zM144 350v-30h128v30c0 10 -7 18 -17 18h-97c-11 0 -14 -8 -14 -18zM304 128v64h-64v64h-64v-64h-64
+v-64h64v-64h64v64h64z" />
+    <glyph glyph-name="ion-ios-mic-off" unicode="&#xf45f;" horiz-adv-x="280" 
+d="M266 -32l-258 440l14 8l258 -440zM128 95c-44 0 -79 37 -79 83v118l113 -193c-10 -5 -22 -8 -34 -8zM207 178c0 -10 -2 -19 -5 -28l-136 234c14 20 37 32 62 32c44 0 79 -38 79 -84v-154zM256 176c0 -28 -9 -54 -24 -75l-10 17c11 17 17 36 17 58v80h17v-80zM139 49v0
+v-63h69v-18h-161v18h73v63c-67 5 -120 60 -120 127v80h19v-80c0 -60 50 -109 110 -109c17 0 34 4 48 11l9 -16c-14 -7 -30 -12 -47 -13z" />
+    <glyph glyph-name="ion-ios-mic-outline" unicode="&#xf460;" horiz-adv-x="256" 
+d="M128 416c44 0 79 -38 79 -84v-154c0 -46 -35 -84 -79 -84s-79 38 -79 84v154c0 46 35 84 79 84zM191 178v154c0 37 -28 68 -63 68s-63 -31 -63 -68v-154c0 -37 28 -68 63 -68s63 31 63 68zM239 256h17v-80c0 -67 -51 -122 -117 -127v-63h69v-18h-161v18h73v63
+c-67 5 -120 60 -120 127v80h19v-80c0 -60 50 -109 110 -109s110 49 110 109v80z" />
+    <glyph glyph-name="ion-ios-mic" unicode="&#xf461;" horiz-adv-x="256" 
+d="M128 94c-44 0 -79 38 -79 84v154c0 46 35 84 79 84s79 -38 79 -84v-154c0 -46 -35 -84 -79 -84zM239 256h17v-80c0 -67 -51 -122 -117 -127v-63h69v-18h-161v18h73v63c-67 5 -120 60 -120 127v80h19v-80c0 -60 50 -109 110 -109s110 49 110 109v80z" />
+    <glyph glyph-name="ion-ios-minus-empty" unicode="&#xf462;" horiz-adv-x="256" 
+d="M256 183h-256v17h256v-17z" />
+    <glyph glyph-name="ion-ios-minus-outline" unicode="&#xf463;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM80 183v17h256v-17h-256z" />
+    <glyph glyph-name="ion-ios-minus" unicode="&#xf464;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM336 183v17h-256v-17h256z" />
+    <glyph glyph-name="ion-ios-monitor-outline" unicode="&#xf465;" horiz-adv-x="480" 
+d="M480 64h-176v-16h64v-16h-257v16h64v16h-175v288h480v-288zM16 336v-256h448v256h-448z" />
+    <glyph glyph-name="ion-ios-monitor" unicode="&#xf466;" horiz-adv-x="480" 
+d="M480 64h-176v-16h64v-16h-257v16h64v16h-175v288h480v-288zM16 336v-256h448v256h-448zM32 96v224h416v-224h-416z" />
+    <glyph glyph-name="ion-ios-moon-outline" unicode="&#xf467;" horiz-adv-x="216" 
+d="M195 133c7 0 14 1 21 3c-4 -7 -7 -12 -12 -18c-21 -25 -53 -41 -88 -41c-64 0 -116 51 -116 115c0 52 34 96 81 111c7 2 14 3 22 4c-4 -6 -8 -12 -11 -18c-7 -14 -11 -30 -11 -47c0 -29 11 -56 32 -77s48 -32 77 -32h5zM116 93c25 0 48 9 65 24c-65 5 -116 59 -116 125
+c0 14 2 28 6 40c-33 -16 -55 -51 -55 -90c0 -55 45 -99 100 -99z" />
+    <glyph glyph-name="ion-ios-moon" unicode="&#xf468;" horiz-adv-x="216" 
+d="M195 133c7 0 14 1 21 3c-4 -7 -7 -12 -12 -18c-21 -25 -53 -41 -88 -41c-64 0 -116 51 -116 115c0 52 34 96 81 111c7 2 14 3 22 4c-4 -6 -8 -12 -11 -18c-7 -14 -11 -30 -11 -47c0 -29 11 -56 32 -77s48 -32 77 -32h5z" />
+    <glyph glyph-name="ion-ios-more-outline" unicode="&#xf469;" horiz-adv-x="320" 
+d="M160 210c-10 0 -18 -8 -18 -18s8 -18 18 -18s18 8 18 18s-8 18 -18 18zM160 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM32 210c-10 0 -18 -8 -18 -18s8 -18 18 -18s18 8 18 18s-8 18 -18 18zM32 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32
+s-32 14 -32 32s14 32 32 32zM288 210c-10 0 -18 -8 -18 -18s8 -18 18 -18s18 8 18 18s-8 18 -18 18zM288 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32z" />
+    <glyph glyph-name="ion-ios-more" unicode="&#xf46a;" horiz-adv-x="320" 
+d="M160 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM32 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM288 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32z" />
+    <glyph glyph-name="ion-ios-musical-note" unicode="&#xf46b;" horiz-adv-x="192" 
+d="M192 346v-1v-65c0 -3 -3 -6 -6 -5v0l-73 13v-192c0 -33 1 -80 -51 -82c-48 -2 -62 16 -62 41c0 19 9 39 51 41c22 1 37 1 45 1v273l90 -19l2 -1c2 0 3 -1 4 -3v0v-1v0z" />
+    <glyph glyph-name="ion-ios-musical-notes" unicode="&#xf46c;" horiz-adv-x="320" 
+d="M320 128c0 -34 4 -80 -49 -82c-49 -2 -62 16 -62 41c0 20 9 39 52 41c23 1 34 2 43 2v160l-191 -32v-161c0 -34 3 -81 -50 -83c-49 -2 -63 17 -63 42c0 20 9 39 52 41c23 1 35 1 44 1v237l224 35v-242z" />
+    <glyph glyph-name="ion-ios-navigate-outline" unicode="&#xf46d;" horiz-adv-x="416" 
+d="M208 384c-51 0 -99 -21 -135 -57s-57 -84 -57 -135s21 -99 57 -135s84 -57 135 -57s99 21 135 57s57 84 57 135s-21 99 -57 135s-84 57 -135 57zM208 400v0c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM304 288l-96 -224v128h-128z" />
+    <glyph glyph-name="ion-ios-navigate" unicode="&#xf46e;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 64l96 224l-224 -96h128v-128z" />
+    <glyph glyph-name="ion-ios-nutrition-outline" unicode="&#xf46f;" horiz-adv-x="384" 
+d="M294 214v0c6 -6 10 -14 10 -23c0 -11 -5 -20 -13 -26v0s-51 -37 -106 -77l-38 31c-2 2 -4 3 -6 3c-1 0 -2 0 -3 -1v0c-2 -2 -2 -6 1 -10l29 -35l-115 -84c-6 -4 -13 -8 -21 -8c-18 0 -32 14 -32 32c0 7 1 13 4 18v0c2 2 17 25 37 57l21 -17c2 -2 4 -2 6 -2c1 0 3 0 4 1v0
+c2 2 1 6 -2 10l-19 23c27 43 60 96 84 134l36 -30c2 -2 4 -3 6 -3c1 0 2 1 3 2v0c2 2 2 5 -1 9l-33 40c11 18 19 29 19 29v0c6 10 15 16 27 16c9 0 18 -4 24 -10v0l78 -79v0v0zM282 178c4 3 6 8 6 13c0 4 -2 9 -5 12l-5 4v1l-69 69v0l-5 5c-3 3 -8 5 -12 5
+c-6 0 -10 -3 -13 -8l-5 -8c-2 -3 -5 -7 -8 -12l25 -30v0l1 -1c8 -10 8 -22 0 -30l-1 -1l-1 -1c-4 -3 -8 -5 -13 -5s-11 2 -16 6v1h-1l-21 18l-24 -39l-44 -70l12 -14v0v0c8 -10 8 -23 0 -31v0c-4 -4 -9 -6 -15 -6c-5 0 -11 2 -16 6v0v0l-7 5c-3 -5 -5 -9 -8 -13
+c-12 -19 -16 -26 -18 -29c-1 -3 -2 -6 -2 -9c0 -9 7 -16 16 -16c3 0 6 2 11 5l101 74l-18 22h-1v0c-8 10 -8 23 0 31v0v0v0c4 4 10 6 15 6s11 -2 16 -6v0h1l28 -24c49 36 93 68 96 70zM376 333l8 -14l-5 -3l-103 -60l-17 17l71 123l2 4l14 -8l-3 -4l-63 -111l91 53z" />
+    <glyph glyph-name="ion-ios-nutrition" unicode="&#xf470;" horiz-adv-x="384" 
+d="M295 214v0c6 -6 9 -13 9 -22c0 -11 -5 -20 -13 -26v0s-51 -38 -106 -78l-38 32c-4 3 -8 3 -10 1v0c-2 -2 -2 -6 1 -10l29 -35l-114 -84c-6 -4 -13 -8 -21 -8c-18 0 -32 14 -32 32c0 7 2 13 5 18v0c1 2 16 25 36 57l20 -17c4 -3 8 -3 10 -1v0c2 2 2 6 -1 10l-20 23
+c27 43 60 96 84 134l36 -30c4 -3 8 -3 10 -1v0c2 2 2 6 -1 10l-33 40c11 18 18 29 18 29v0c6 10 16 16 28 16c9 0 18 -4 24 -10v0l78 -79l1 -1v0zM384 309l-103 -59l-28 29l70 121l28 -16l-50 -85l67 38z" />
+    <glyph glyph-name="ion-ios-paper-outline" unicode="&#xf471;" horiz-adv-x="384" 
+d="M48 384h336v-353c0 -17 -14 -31 -31 -31h-322c-17 0 -31 14 -31 31v305h32v-16h-16v-289c0 -8 7 -15 15 -15h322c8 0 15 7 15 15v337h-304v-320h-16v320v16zM96 320v16h128v-16h-128zM96 240v16h240v-16h-240zM96 160v16h192v-16h-192zM96 80v16h240v-16h-240z" />
+    <glyph glyph-name="ion-ios-paper" unicode="&#xf472;" horiz-adv-x="384" 
+d="M48 384h336v-353c0 -17 -14 -31 -31 -31h-322c-17 0 -31 14 -31 31v305h32v-288h16v288v32v16zM96 336v-16h128v16h-128zM96 176v-16h192v16h-192zM336 80v16h-240v-16h240zM336 240v16h-240v-16h240z" />
+    <glyph glyph-name="ion-ios-paperplane-outline" unicode="&#xf473;" horiz-adv-x="320" 
+d="M0 198l320 154l-146 -320l-57 115zM132 152l41 -83l115 249zM286 320l-248 -121l83 -36z" />
+    <glyph glyph-name="ion-ios-paperplane" unicode="&#xf474;" horiz-adv-x="320" 
+d="M0 198l320 154l-214 -200zM320 352l-146 -320l-52 104z" />
+    <glyph glyph-name="ion-ios-partlysunny-outline" unicode="&#xf475;" horiz-adv-x="384" 
+d="M144 298v54h16v-54h-16zM0 192v16h55v-16h-55zM44 299l10 11l32 -32l-11 -11zM223 268l-11 11l32 32l11 -11zM56 96l-10 11l31 31l11 -11zM129 153c-4 -3 -8 -7 -12 -12c-23 12 -39 36 -39 63c0 39 32 71 71 71c21 0 40 -10 53 -25c-4 -2 -9 -4 -14 -8
+c-10 11 -23 17 -39 17c-30 0 -55 -25 -55 -55c0 -23 15 -43 35 -51zM235 208c-34 0 -63 -28 -63 -62v-12s1 -10 1 -10c-5 0 -12 -1 -14 -1c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h157c27 0 49 22 49 49s-22 50 -49 50c-2 0 -4 -1 -6 -1l-14 -2l-3 14
+c-3 14 -11 26 -22 35s-25 14 -39 14zM235 224v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78z" />
+    <glyph glyph-name="ion-ios-partlysunny" unicode="&#xf476;" horiz-adv-x="384" 
+d="M144 298v54h16v-54h-16zM0 192v16h55v-16h-55zM44 299l10 11l32 -32l-11 -11zM223 268l-11 11l32 32l11 -11zM56 96l-10 11l31 31l11 -11zM235 224v0c37 0 68 -26 76 -61h8c36 0 65 -29 65 -65s-29 -66 -65 -66h-157c-28 0 -52 24 -52 53c0 27 21 51 47 53v8
+c0 43 35 78 78 78zM201 252l1 -2v0c-31 -5 -62 -43 -62 -75c0 -2 1 -5 1 -7l-1 -1h-1c-11 -6 -18 -14 -22 -26v1v-1c-23 12 -39 36 -39 63c0 39 32 71 71 71c21 0 39 -9 52 -23z" />
+    <glyph glyph-name="ion-ios-pause-outline" unicode="&#xf477;" horiz-adv-x="256" 
+d="M63 336h-47v-288h47v288zM79 352v0v-320h-79v320h79zM240 336h-47v-288h47v288zM256 352v0v-320h-79v320h79z" />
+    <glyph glyph-name="ion-ios-pause" unicode="&#xf478;" horiz-adv-x="256" 
+d="M0 32v320h79v-320h-79zM177 32v320h79v-320h-79z" />
+    <glyph glyph-name="ion-ios-paw-outline" unicode="&#xf479;" horiz-adv-x="384" 
+d="M380 252c6 -17 5 -38 -3 -57c-10 -25 -31 -43 -51 -43c-5 0 -10 1 -15 3c-22 10 -30 45 -17 79c10 28 31 46 51 46c5 0 10 -1 14 -3c10 -4 17 -13 21 -25zM362 202c6 15 7 31 2 44c-2 5 -5 12 -12 15c-2 1 -4 2 -7 2c-13 0 -28 -15 -36 -36c-9 -25 -6 -50 8 -56
+c2 -1 5 -1 8 -1c14 0 29 13 37 32zM90 234c13 -34 5 -69 -17 -79c-5 -2 -10 -3 -15 -3c-20 0 -41 18 -51 43c-8 19 -9 40 -3 57c4 12 11 21 21 25c4 2 9 3 14 3c20 0 41 -18 51 -46zM67 171c14 6 17 31 8 56c-8 21 -23 36 -36 36c-3 0 -5 -1 -7 -2c-7 -3 -10 -10 -12 -15
+c-5 -13 -4 -29 2 -44c8 -19 23 -32 37 -32c3 0 6 0 8 1zM134 237c-28 1 -52 32 -56 69c-2 23 4 45 16 60c8 10 19 17 31 18h6c27 -1 46 -29 50 -67c3 -24 -1 -48 -13 -63c-8 -9 -17 -15 -28 -16c-2 0 -4 -1 -6 -1zM107 356c-10 -12 -14 -29 -12 -48c3 -29 21 -53 40 -54h3
+c6 1 12 4 17 10c10 12 12 31 10 51c-3 29 -17 52 -35 53h-3c-9 -1 -16 -7 -20 -12zM192 208c64 0 128 -76 128 -149c0 -22 -11 -40 -22 -47c-13 -9 -23 -12 -42 -12c-23 0 -29 8 -40 15c-8 5 -14 10 -24 10s-16 -5 -24 -10c-11 -7 -17 -15 -40 -15c-19 0 -29 3 -42 12
+c-11 7 -22 25 -22 47c0 73 64 149 128 149zM290 27c6 4 14 16 14 32c0 30 -14 64 -36 91c-11 13 -23 24 -36 31c-13 8 -27 11 -40 11s-27 -3 -40 -11c-13 -7 -25 -18 -36 -31c-22 -27 -36 -61 -36 -91c0 -16 8 -28 14 -32c11 -7 18 -10 34 -10c14 0 19 4 26 9c2 1 4 3 6 4
+c9 6 18 12 32 12s23 -6 32 -12c2 -1 4 -3 6 -4c7 -5 12 -9 26 -9c16 0 23 3 34 10zM244 238c-11 1 -20 7 -28 16c-12 15 -16 39 -13 63c4 38 23 66 50 67h7c12 -1 22 -8 30 -18c12 -15 18 -37 16 -60c-4 -37 -28 -67 -56 -68h-6zM219 315c-2 -20 0 -39 10 -51
+c5 -6 11 -9 17 -10h3c19 1 38 25 41 54c2 19 -3 36 -13 48c-4 5 -10 11 -19 12h-4c-18 -1 -32 -24 -35 -53z" />
+    <glyph glyph-name="ion-ios-paw" unicode="&#xf47a;" horiz-adv-x="384" 
+d="M380 252c6 -17 5 -38 -3 -57c-10 -25 -31 -43 -51 -43c-5 0 -10 1 -15 3c-22 10 -30 45 -17 79c10 28 31 46 51 46c5 0 10 -1 14 -3c10 -4 17 -13 21 -25zM90 234c13 -34 5 -69 -17 -79c-5 -2 -10 -3 -15 -3c-20 0 -41 18 -51 43c-8 19 -9 40 -3 57c4 12 11 21 21 25
+c4 2 9 3 14 3c20 0 41 -18 51 -46zM134 237c-28 1 -52 32 -56 69c-2 23 4 45 16 60c8 10 19 17 31 18h6c27 -1 46 -29 50 -67c3 -24 -1 -48 -13 -63c-8 -9 -17 -15 -28 -16c-2 0 -4 -1 -6 -1zM192 208c64 0 128 -76 128 -149c0 -22 -11 -40 -22 -47c-13 -9 -23 -12 -42 -12
+c-23 0 -29 8 -40 15c-8 5 -14 10 -24 10s-16 -5 -24 -10c-11 -7 -17 -15 -40 -15c-19 0 -29 3 -42 12c-11 7 -22 25 -22 47c0 73 64 149 128 149zM244 238c-11 1 -20 7 -28 16c-12 15 -16 39 -13 63c4 38 23 66 50 67h7c12 -1 22 -8 30 -18c12 -15 18 -37 16 -60
+c-4 -37 -28 -67 -56 -68h-6z" />
+    <glyph glyph-name="ion-ios-people-outline" unicode="&#xf47b;" 
+d="M224 336v0v0zM317 113c11 -4 -11 4 0 0c28 -10 46 -35 46 -65h-28h-250c0 22 9 42 27 55c15 11 31 12 49 16c7 1 24 5 26 13s1 15 1 23c0 3 0 3 -2 5c-4 4 -6 9 -8 14c-2 8 -3 16 -4 24c-9 -2 -10 16 -12 21c-1 4 -7 24 3 21c-3 5 -4 13 -5 19c-2 13 -2 26 3 39
+c10 26 37 39 64 38c26 -1 51 -16 59 -42c4 -12 3 -26 1 -39c-1 -5 -2 -11 -4 -15c10 3 4 -20 3 -23c-2 -5 -3 -21 -12 -19c-1 -10 -2 -22 -7 -31c-1 -2 -7 -8 -7 -10v-11c0 -5 0 -10 2 -15s10 -7 14 -8c14 -5 27 -5 41 -10zM115 84c-6 -6 9 10 0 0c-6 -6 -10 -12 -12 -20h4
+h238c-4 15 -17 27 -30 33s-28 4 -41 9s-25 9 -28 25c-2 11 -2 22 -2 33c0 2 7 7 8 9c3 5 4 11 5 17c1 5 0 12 4 15c5 4 7 7 9 13c2 8 3 12 -1 19c-3 5 0 8 1 13c3 11 4 24 2 36c-8 37 -62 45 -86 19c-12 -13 -12 -31 -9 -47c1 -6 6 -14 3 -19c-1 -3 -5 -6 -4 -10
+c2 -5 2 -11 4 -16c2 -4 4 -6 7 -8s3 -6 3 -9c1 -7 2 -17 6 -23c3 -4 8 -6 8 -11v-21c-1 -8 -2 -18 -8 -24c-7 -6 -18 -10 -27 -12c-11 -3 -23 -3 -33 -7c-8 -3 -15 -8 -21 -14zM112 126c-15 -7 9 4 0 0c-9 -5 -18 -11 -25 -19c-1 -2 -6 -11 -7 -11h-25h-55c0 20 13 34 31 40
+c6 2 27 4 30 11c2 5 0 11 0 16c-10 -1 -24 1 -32 7c-2 2 3 9 4 12l3 12c1 9 1 19 1 28c0 16 -1 34 8 48c8 13 23 18 38 18c24 0 43 -13 47 -37c3 -16 1 -32 2 -48c0 -8 2 -16 5 -24c1 -2 5 -7 3 -9l-6 -3c-5 -2 -11 -3 -17 -4c-1 0 -8 0 -9 -1s0 -9 0 -11c0 -4 1 -6 5 -7
+c6 -2 19 -3 23 -8c2 -3 1 -5 -2 -5c-8 -1 -15 -1 -22 -5zM71 112c6 10 16 18 26 24c-9 9 -5 26 -4 37c0 2 0 5 2 5h8c6 0 11 1 17 2c-7 23 0 47 -5 70c-3 16 -15 23 -31 23c-17 0 -27 -9 -30 -25c-4 -22 3 -46 -4 -68c9 -1 17 -2 26 -2c1 0 1 -28 1 -29
+c-1 -12 -8 -18 -19 -22c-12 -4 -29 -3 -36 -15h49zM368 96c-2 8 -10 14 -16 19c-8 6 -18 13 -28 15c-3 1 -16 -1 -13 5c2 4 9 5 13 6s15 2 16 7c0 1 1 14 0 14c-6 0 -12 1 -18 2c-4 1 -7 2 -11 4c-6 3 -2 6 0 11c14 32 -10 88 32 105c15 6 34 5 48 -3c15 -9 20 -27 20 -44
+c0 -20 -4 -44 7 -62c2 -3 4 -4 0 -6c-2 -1 -4 -1 -6 -2l-12 -3s-9 -1 -13 -1c0 -4 -2 -13 1 -17c6 -7 21 -7 29 -10c18 -6 31 -20 31 -40h-80zM367 123c4 -4 -5 5 0 0s8 -11 15 -11h16h28c-7 12 -26 11 -38 16c-11 4 -16 12 -17 24c0 2 -1 27 1 27c9 0 18 0 26 1
+c-7 23 1 47 -4 70c-3 15 -15 23 -30 23c-17 0 -28 -8 -31 -25c-4 -23 2 -46 -5 -68c6 -2 12 -2 18 -2s8 1 9 -5c1 -11 5 -28 -4 -37c6 -4 11 -8 16 -13z" />
+    <glyph glyph-name="ion-ios-people" unicode="&#xf47c;" 
+d="M317 113c11 -4 -11 4 0 0v0zM317 113c28 -10 46 -35 46 -65h-28h-250c0 22 9 42 27 55c15 11 31 12 49 16c7 1 24 5 26 13s1 15 1 23c0 3 0 3 -2 5c-4 4 -6 9 -8 14c-2 8 -3 16 -4 24c-9 -2 -10 16 -12 21c-1 4 -7 24 3 21c-3 5 -4 13 -5 19c-2 13 -2 26 3 39
+c10 26 37 39 64 38c26 -1 51 -16 59 -42c4 -12 3 -26 1 -39c-1 -5 -2 -11 -4 -15c10 3 4 -20 3 -23c-2 -5 -3 -21 -12 -19c-1 -10 -2 -22 -7 -31c-1 -2 -7 -8 -7 -10v-11c0 -5 0 -10 2 -15s10 -7 14 -8c14 -5 27 -5 41 -10zM111 126h2h-1h-1zM111 126c-9 -5 -17 -11 -24 -19
+c-1 -2 -6 -11 -7 -11h-25h-55c0 20 12 34 30 40c6 2 27 4 30 11c2 5 1 11 1 16c-10 -1 -24 1 -32 7c-2 2 3 9 4 12c1 4 2 7 3 11c1 9 1 19 1 28c0 16 -1 35 8 49c8 13 23 18 38 18c24 0 43 -13 47 -37c3 -16 1 -32 2 -48c0 -8 2 -16 5 -24c1 -2 5 -7 3 -9l-6 -3
+c-5 -2 -11 -3 -17 -4c-1 0 -8 0 -9 -1s0 -9 0 -11c0 -4 1 -6 5 -7c6 -2 19 -3 23 -8c2 -3 1 -5 -2 -5c-7 -1 -14 -2 -21 -5c2 1 2 2 -1 0c-8 -4 -4 -2 -1 0zM417 136c18 -6 31 -20 31 -40h-80c-2 8 -10 14 -16 19c-8 6 -18 13 -28 15c-3 1 -16 -1 -13 5c2 4 9 5 13 6
+s15 2 16 7c0 1 1 14 0 14c-6 0 -12 1 -18 2c-4 1 -7 2 -11 4c-6 3 -2 6 0 11c14 32 -10 88 32 105c15 6 34 5 48 -3c15 -9 20 -27 20 -44c0 -20 -4 -44 7 -62c2 -3 4 -4 0 -6c-2 -1 -4 -1 -6 -2l-12 -3s-9 -1 -13 -1c0 -4 -2 -13 1 -17c6 -7 21 -7 29 -10z" />
+    <glyph glyph-name="ion-ios-person-outline" unicode="&#xf47d;" horiz-adv-x="320" 
+d="M106 246v0v0zM267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10
+c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9zM160 48v0h137c-2 3 -4 6 -8 8c-7 5 -16 9 -27 13c-7 2 -17 4 -26 5c-6 1 -10 2 -15 3c-3 1 -21 5 -29 15c-4 5 -6 12 -6 32c0 10 1 20 1 20v4l2 4
+c1 2 6 9 8 15c2 5 5 19 6 28c0 0 0 -1 1 4s8 4 9 8s3 7 5 18s-5 12 -5 17c0 4 1 5 1 5v0c0 1 4 14 4 38c0 13 -5 26 -14 35c-11 11 -25 16 -44 16c-18 0 -34 -5 -45 -16c-9 -9 -13 -22 -13 -35c1 -24 4 -37 4 -38v0s1 -3 0 -6c-1 -5 -6 -5 -4 -16s4 -14 5 -18s8 -3 9 -8
+s1 -4 1 -4c1 -9 4 -23 6 -28c2 -6 6 -13 8 -15l2 -4v-4s1 -10 1 -20c0 -20 -2 -27 -6 -32c-8 -10 -26 -14 -29 -15c-5 -1 -10 -2 -16 -3c-9 -1 -18 -3 -25 -5c-11 -4 -20 -8 -27 -13c-4 -2 -6 -5 -8 -8h137z" />
+    <glyph glyph-name="ion-ios-person" unicode="&#xf47e;" horiz-adv-x="320" 
+d="M267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10
+c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9z" />
+    <glyph glyph-name="ion-ios-personadd-outline" unicode="&#xf47f;" horiz-adv-x="320" 
+d="M320 295v-14h-25v-25h-14v25h-25v14h25v25h14v-25h25zM106 246v0v0zM267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68
+s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9zM160 48v0h137c-2 3 -4 6 -8 8c-7 5 -16 9 -27 13c-7 2 -17 4 -26 5c-6 1 -10 2 -15 3
+c-3 1 -21 5 -29 15c-4 5 -6 12 -6 32c0 10 1 20 1 20v4l2 4c1 2 6 9 8 15c2 5 5 19 6 28c0 0 0 -1 1 4s8 4 9 8s3 7 5 18s-5 12 -5 17c0 4 1 5 1 5v0c0 1 4 14 4 38c0 13 -5 26 -14 35c-11 11 -25 16 -44 16c-18 0 -34 -5 -45 -16c-9 -9 -13 -22 -13 -35c1 -24 4 -37 4 -38
+v0s1 -3 0 -6c-1 -5 -6 -5 -4 -16s4 -14 5 -18s8 -3 9 -8s1 -4 1 -4c1 -9 4 -23 6 -28c2 -6 6 -13 8 -15l2 -4v-4s1 -10 1 -20c0 -20 -2 -27 -6 -32c-8 -10 -26 -14 -29 -15c-5 -1 -10 -2 -16 -3c-9 -1 -18 -3 -25 -5c-11 -4 -20 -8 -27 -13c-4 -2 -6 -5 -8 -8h137z" />
+    <glyph glyph-name="ion-ios-personadd" unicode="&#xf480;" horiz-adv-x="320" 
+d="M320 295v-14h-25v-25h-14v25h-25v14h25v25h14v-25h25zM267 84c13 -5 53 -20 53 -52h-160h-160c0 32 40 47 53 52s31 6 43 9c7 2 17 5 20 9s1 41 1 41s-6 10 -9 18s-7 32 -7 32s-7 0 -9 12c-2 13 -6 17 -6 27c0 9 5 10 5 10v0s-4 13 -5 42c-1 34 25 68 74 68
+s75 -34 74 -68c-1 -29 -5 -42 -5 -42v0s5 -1 5 -10c0 -10 -3 -15 -6 -28c-2 -12 -9 -12 -9 -12s-4 -23 -7 -31s-9 -18 -9 -18s-2 -37 1 -41s13 -7 20 -9c12 -3 30 -4 43 -9z" />
+    <glyph glyph-name="ion-ios-photos-outline" unicode="&#xf481;" 
+d="M64 320h384v-320h-384v320zM432 16v288h-352v-288h352zM0 384h384v-48h-16v32h-352v-288h32v-16h-48v320z" />
+    <glyph glyph-name="ion-ios-photos" unicode="&#xf482;" 
+d="M64 320h384v-320h-384v320zM384 384v-48h-336v-272h-48v320h384z" />
+    <glyph glyph-name="ion-ios-pie-outline" unicode="&#xf483;" 
+d="M256 367v0v-207v-12l-12 -4l-180 -45c6 -13 13 -25 21 -36c12 -16 25 -30 41 -42c33 -24 73 -37 114 -37c26 0 51 5 75 15c23 10 43 23 61 41s31 38 41 61c10 24 15 49 15 75c0 51 -20 100 -56 136c-32 32 -75 51 -120 55zM240 384v0c115 0 208 -93 208 -208
+s-93 -208 -208 -208c-92 0 -171 60 -198 143l198 49v224zM208 400c-31 -1 -60 -7 -85 -18c-24 -11 -44 -26 -61 -46c-29 -34 -46 -80 -46 -127v0v0c0 -13 3 -46 12 -70l180 46v215zM224 416v0v-244l-205 -52c-19 32 -19 89 -19 89c0 91 58 207 218 207h6z" />
+    <glyph glyph-name="ion-ios-pie" unicode="&#xf484;" 
+d="M240 384v0c115 0 208 -93 208 -208s-93 -208 -208 -208c-92 0 -171 60 -198 143l198 49v224zM224 416v0v-244l-205 -52c-19 32 -19 89 -19 89c0 91 58 207 218 207h6z" />
+    <glyph glyph-name="ion-ios-pint-outline" unicode="&#xf485;" horiz-adv-x="224" 
+d="M224 278c0 -98 -32 -101 -32 -181c0 -40 16 -71 16 -99c0 -27 -9 -30 -32 -30h-128c-23 0 -32 2 -32 29c0 28 16 60 16 100c0 80 -32 83 -32 181c0 21 1 89 19 125c4 9 13 13 32 13h122c19 0 28 -4 32 -13c18 -36 19 -104 19 -125zM34 396c-8 -16 -14 -43 -17 -76h190
+c-3 33 -9 60 -17 76c-1 2 -1 1 -2 2c-2 1 -6 2 -15 2h-122c-9 0 -13 -1 -15 -2c-1 -1 -1 0 -2 -2zM191 -15c0 1 1 5 1 13c0 11 -4 23 -7 37c-4 18 -9 39 -9 62c0 41 8 64 16 86c8 23 16 46 16 95c0 9 -1 18 -1 26h-190c0 -8 -1 -17 -1 -26c0 -49 8 -72 16 -95
+c8 -22 16 -45 16 -86c0 -23 -5 -44 -9 -62c-3 -14 -7 -26 -7 -37c0 -8 1 -12 1 -13c2 -1 7 -1 15 -1h128c8 0 13 0 15 1z" />
+    <glyph glyph-name="ion-ios-pint" unicode="&#xf486;" horiz-adv-x="224" 
+d="M224 278c0 -98 -32 -101 -32 -181c0 -40 16 -71 16 -99c0 -27 -9 -30 -32 -30h-128c-23 0 -32 2 -32 29c0 28 16 60 16 100c0 80 -32 83 -32 181c0 21 1 89 19 125c4 9 13 13 32 13h122c19 0 28 -4 32 -13c18 -36 19 -104 19 -125zM34 396c-8 -16 -14 -43 -17 -76h190
+c-3 33 -9 60 -17 76c-1 2 -1 1 -2 2c-2 1 -6 2 -15 2h-122c-9 0 -13 -1 -15 -2c-1 -1 -1 0 -2 -2z" />
+    <glyph glyph-name="ion-ios-play-outline" unicode="&#xf487;" horiz-adv-x="256" 
+d="M16 323v-262l210 131zM0 352v0l256 -160l-256 -160v320z" />
+    <glyph glyph-name="ion-ios-play" unicode="&#xf488;" horiz-adv-x="256" 
+d="M0 352v0l256 -160l-256 -160v320z" />
+    <glyph glyph-name="ion-ios-plus-empty" unicode="&#xf489;" horiz-adv-x="256" 
+d="M256 183h-120v-119h-17v119h-119v17h119v120h17v-120h120v-17z" />
+    <glyph glyph-name="ion-ios-plus-outline" unicode="&#xf48a;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191zM216 320v-120h120v-17h-120v-119h-17v119h-119v17h119v120h17z" />
+    <glyph glyph-name="ion-ios-plus" unicode="&#xf48b;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM336 183v17h-120v120h-17v-120h-119v-17h119v-119h17v119h120z" />
+    <glyph glyph-name="ion-ios-pricetag-outline" unicode="&#xf48c;" horiz-adv-x="416" 
+d="M416 416v-160l-256 -288l-160 160l256 288h160zM400 264v136h-136l-240 -272l136 -136zM320 288c-18 0 -32 14 -32 32s14 32 32 32s32 -14 32 -32s-14 -32 -32 -32zM320 336c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16z" />
+    <glyph glyph-name="ion-ios-pricetag" unicode="&#xf48d;" horiz-adv-x="416" 
+d="M304 320c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16zM256 416h160v-160l-256 -288l-160 160zM320 288c9 0 16 4 22 10s10 13 10 22s-4 16 -10 22s-13 10 -22 10s-16 -4 -22 -10s-10 -13 -10 -22s4 -16 10 -22s13 -10 22 -10z" />
+    <glyph glyph-name="ion-ios-pricetags-outline" unicode="&#xf48e;" 
+d="M416 384h32v-144l-240 -272l-25 24l-23 -24l-160 160l256 288h160v-32zM160 -9l12 12l11 12l217 248v105v16v16h-137l-241 -272zM432 247v121h-16v-112l-221 -253l13 -12zM320 288c-18 0 -32 14 -32 32s14 32 32 32s32 -14 32 -32s-14 -32 -32 -32zM320 336
+c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16z" />
+    <glyph glyph-name="ion-ios-pricetags" unicode="&#xf48f;" 
+d="M432 384h16v-144l-240 -272l-13 13l237 266v137zM256 416h160v-32v-16v-112l-221 -253l-12 -11l-23 -24l-160 160zM320 288c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM304 320c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16z" />
+    <glyph glyph-name="ion-ios-printer-outline" unicode="&#xf490;" horiz-adv-x="416" 
+d="M384 336c18 0 32 -13 32 -31v-159c0 -18 -14 -32 -32 -32h-48v-114h-256v114h-48c-18 0 -32 14 -32 32v159c0 18 14 31 32 31h32v48h288v-48h32zM80 368v-32h256v32h-256zM320 16v192h-224v-192h224zM400 146v159c0 9 -7 15 -16 15v0h-352c-9 0 -16 -6 -16 -15v-159
+c0 -9 7 -16 16 -16h48v94h256v-94h48c9 0 16 7 16 16z" />
+    <glyph glyph-name="ion-ios-printer" unicode="&#xf491;" horiz-adv-x="416" 
+d="M80 0v224h256v-224h-256zM80 -0v224h256v-224h-256zM64 352v32h288v-32h-288zM385 336c18 0 31 -14 31 -31v-158c0 -17 -13 -34 -31 -34h-33v126h-288v-126h-31c-18 0 -33 17 -33 34v158c0 17 15 31 33 31h352z" />
+    <glyph glyph-name="ion-ios-pulse-strong" unicode="&#xf492;" horiz-adv-x="480" 
+d="M432 175c27 0 48 -20 48 -47s-21 -49 -48 -49c-21 0 -38 13 -45 31h-51c-7 0 -13 4 -15 11l-16 47l-50 -173c-2 -7 -8 -11 -15 -11h-1c-7 0 -14 5 -15 12l-51 308l-45 -182c-2 -7 -9 -12 -16 -12h-112v32h99l61 245c2 7 8 13 16 13s15 -7 16 -14l52 -314l45 155
+c2 7 8 11 15 11v0c7 0 13 -4 15 -11l29 -85h38c6 19 25 33 46 33z" />
+    <glyph glyph-name="ion-ios-pulse" unicode="&#xf493;" 
+d="M416 160c18 0 32 -14 32 -32s-14 -32 -32 -32c-15 0 -27 10 -31 23h-65c-3 0 -7 2 -8 5l-23 72l-57 -198c-1 -3 -4 -6 -8 -6v0c-4 0 -7 3 -8 7l-58 346l-54 -220c-1 -4 -4 -6 -8 -6h-96v16h90l62 251c1 4 4 6 8 6s7 -3 8 -7l58 -349l54 190c1 3 4 5 8 5s7 -2 8 -5l30 -91
+h59c3 14 16 25 31 25z" />
+    <glyph glyph-name="ion-ios-rainy-outline" unicode="&#xf494;" horiz-adv-x="288" 
+d="M220 269c38 0 68 -33 68 -71c0 -29 -19 -56 -45 -66l-55 -80c-2 -2 -5 -4 -8 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l46 66v0h-35l-31 -44c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 1 3 2 5l25 35h-37l-53 -76c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 2 4 3 6l46 66h-36l-32 -44
+c-2 -2 -4 -4 -7 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l25 34c-29 2 -52 27 -52 56c0 28 22 58 50 60c0 3 -1 5 -1 8c0 46 31 84 82 84c45 0 73 -31 81 -68c3 0 5 1 8 1zM220 146c28 0 52 24 52 52s-24 54 -52 54h-6l-15 -2l-3 15c-3 14 -11 31 -23 40c-12 10 -26 14 -41 14
+c-36 0 -66 -31 -66 -67v-12v-10c-6 0 -12 -2 -14 -2c-20 -3 -35 -23 -35 -43c0 -10 4 -20 11 -27s16 -12 26 -12h124v0v0h42z" />
+    <glyph glyph-name="ion-ios-rainy" unicode="&#xf495;" horiz-adv-x="288" 
+d="M220 269c38 0 68 -33 68 -71c0 -29 -19 -56 -45 -66l-55 -80c-2 -2 -5 -4 -8 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l46 66v0h-35l-31 -44c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 1 3 2 5l25 35h-37l-53 -76c-2 -2 -4 -4 -7 -4c-5 0 -9 3 -9 8c0 2 2 4 3 6l46 66h-36l-32 -44
+c-2 -2 -4 -4 -7 -4c-5 0 -8 3 -8 8c0 2 1 4 2 6l25 34c-29 2 -52 27 -52 56c0 28 22 58 50 60c0 3 -1 5 -1 8c0 46 31 84 82 84c45 0 73 -31 81 -68c3 0 5 1 8 1z" />
+    <glyph glyph-name="ion-ios-recording-outline" unicode="&#xf496;" horiz-adv-x="480" 
+d="M370 304c61 0 110 -50 110 -112s-49 -112 -110 -112h-260c-61 0 -110 50 -110 112s49 112 110 112s110 -50 110 -112c0 -40 -21 -75 -53 -95h146c-32 20 -53 55 -53 95c0 62 49 112 110 112zM16 192c0 -53 42 -95 94 -95s93 42 93 95s-41 95 -93 95s-94 -42 -94 -95z
+M370 97c52 0 94 42 94 95s-42 95 -94 95s-93 -42 -93 -95s41 -95 93 -95zM368 240c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM368 256v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM112 240c-26 0 -48 -22 -48 -48
+s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM112 256v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64z" />
+    <glyph glyph-name="ion-ios-recording" unicode="&#xf497;" horiz-adv-x="480" 
+d="M370 304c61 0 110 -50 110 -112s-49 -112 -110 -112h-260c-61 0 -110 50 -110 112s49 112 110 112s110 -50 110 -112c0 -40 -21 -76 -53 -95h146c-32 19 -53 55 -53 95c0 62 49 112 110 112zM112 128c35 0 64 29 64 64s-29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64z
+M368 128c35 0 64 29 64 64s-29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64zM368 240c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48zM112 240c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48z" />
+    <glyph glyph-name="ion-ios-redo-outline" unicode="&#xf498;" horiz-adv-x="384" 
+d="M0 48v32c0 17 -3 83 49 136c35 36 80 53 143 56v80l192 -128l-192 -128v80c-40 -1 -63 -9 -87 -20c-31 -14 -55 -44 -75 -77l-20 -31h-10zM208 256c-201 0 -192 -169 -192 -169c48 81 101 105 192 105v-65l148 97l-148 97v-65z" />
+    <glyph glyph-name="ion-ios-redo" unicode="&#xf499;" horiz-adv-x="384" 
+d="M0 48v32c0 17 -3 83 49 136c35 36 80 53 143 56v80l192 -128l-192 -128v80c-40 -1 -63 -9 -87 -20c-31 -14 -55 -44 -75 -77l-20 -31h-10z" />
+    <glyph glyph-name="ion-ios-refresh-empty" unicode="&#xf49a;" horiz-adv-x="256" 
+d="M128 64c-71 0 -128 57 -128 128s57 128 128 128v44l96 -64l-96 -56v56c-60 0 -108 -48 -108 -108s48 -108 108 -108s108 48 108 108h20c0 -71 -57 -128 -128 -128z" />
+    <glyph glyph-name="ion-ios-refresh-outline" unicode="&#xf49b;" horiz-adv-x="416" 
+d="M316 192v0h20c0 -71 -57 -128 -128 -128s-128 57 -128 128s57 128 128 128v44l96 -64l-96 -56v56c-60 0 -108 -48 -108 -108s48 -108 108 -108s108 48 108 108zM208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 1
+c105 0 191 86 191 191s-86 191 -191 191s-191 -86 -191 -191s86 -191 191 -191z" />
+    <glyph glyph-name="ion-ios-refresh" unicode="&#xf49c;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM208 64c71 0 128 57 128 128h-20c0 -60 -48 -108 -108 -108s-108 48 -108 108s48 108 108 108v-56l96 56l-96 64v-44c-71 0 -128 -57 -128 -128s57 -128 128 -128z" />
+    <glyph glyph-name="ion-ios-reload" unicode="&#xf49d;" 
+d="M192 384c106 0 192 -86 192 -192l55 53l9 -9l-70 -68l-67 68l9 9l51 -52c0 98 -80 178 -179 178s-179 -80 -179 -179s80 -179 179 -179c79 0 146 50 170 121l12 -3c-26 -76 -97 -131 -182 -131c-106 0 -192 86 -192 192s86 192 192 192z" />
+    <glyph glyph-name="ion-ios-reverse-camera-outline" unicode="&#xf49e;" horiz-adv-x="384" 
+d="M238 129l2 2l11 -12l-2 -2c-16 -14 -36 -21 -57 -21c-45 0 -82 36 -87 78h-30l38 50l39 -50h-31c5 -33 35 -62 71 -62c17 0 33 6 46 17zM252 249c16 -14 25 -37 27 -57h30l-38 -51l-39 51h31c-5 35 -35 64 -71 64c-17 0 -33 -6 -46 -17l-2 -2l-11 12l2 2
+c16 14 36 21 57 21c22 0 44 -8 60 -23zM354 288c18 0 30 -14 30 -31v-176c0 -17 -12 -33 -30 -33h-320c-18 0 -34 16 -34 33v176c0 17 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM368 81v176c0 9 -5 15 -14 15h-62h-6s-4 1 -6 3s-6 8 -9 11
+c-12 13 -21 24 -27 30c-5 5 -7 4 -7 4h-88s-1 0 -6 -4c-6 -5 -15 -14 -26 -27c-3 -4 -8 -11 -11 -14s-4 -3 -6 -3h-6h-60c-9 0 -18 -7 -18 -15v-176c0 -9 9 -17 18 -17h320c8 0 14 8 14 17z" />
+    <glyph glyph-name="ion-ios-reverse-camera" unicode="&#xf49f;" horiz-adv-x="384" 
+d="M354 288c18 0 30 -14 30 -31v-176c0 -17 -12 -33 -30 -33h-320c-18 0 -34 16 -34 33v176c0 17 16 31 34 31h13v16h34v-16h13c32 36 43 48 55 48h88c12 0 23 -12 55 -48h62zM249 117l2 2l-11 12l-2 -2c-13 -11 -29 -17 -46 -17c-36 0 -66 29 -71 62h31l-39 50l-38 -50h30
+c5 -42 42 -78 87 -78c21 0 41 7 57 21zM271 141l38 51h-30c-2 20 -11 43 -27 57c-16 15 -38 23 -60 23c-21 0 -41 -7 -57 -21l-2 -2l11 -12l2 2c13 11 29 17 46 17c36 0 66 -29 71 -64h-31z" />
+    <glyph glyph-name="ion-ios-rewind-outline" unicode="&#xf4a0;" 
+d="M432 293l-184 -101l184 -101v202zM208 292v0l-176 -100l176 -100v95v27v78zM224 320v0v-123l224 123v-256l-224 123v-123l-224 128z" />
+    <glyph glyph-name="ion-ios-rewind" unicode="&#xf4a1;" 
+d="M224 320v0v-123l224 123v-256l-224 123v-123l-224 128z" />
+    <glyph glyph-name="ion-ios-rose-outline" unicode="&#xf4a2;" horiz-adv-x="320" 
+d="M284 295c-4 -1 -9 -3 -13 -4c-37 -11 -71 -24 -103 -39c-17 -8 -24 -12 -44 -24l-7 -4c-31 -18 -50 -33 -63 -51c-15 -21 -22 -45 -22 -77c0 -16 3 -30 9 -44c6 -13 14 -26 25 -36c23 -21 55 -32 94 -32s71 11 94 32c11 10 19 23 25 36c6 14 9 28 9 44c0 20 -5 40 -11 60
+c-11 40 -23 83 7 139zM320 320v0c-77 -96 -16 -151 -16 -224s-56 -128 -144 -128s-144 55 -144 128s35 109 93 142c25 14 33 19 52 28c30 14 65 28 105 40c17 5 35 10 54 14zM38 325c14 -28 18 -57 19 -83c9 7 20 13 30 20c7 4 14 9 21 13c5 3 10 6 16 9c-5 4 -11 7 -17 11
+c-22 13 -48 23 -69 30zM0 352v0s66 -15 115 -43c15 -8 28 -18 37 -29c-12 -6 -24 -12 -36 -19c-7 -4 -14 -8 -20 -12c-25 -16 -44 -31 -57 -42c5 41 2 98 -39 145zM249 367c-8 -1 -20 -2 -35 -7c-25 -8 -47 -20 -64 -36c8 -6 15 -12 21 -18c29 12 65 26 95 34
+c-5 10 -12 20 -17 27zM256 384v0s26 -32 32 -55c-33 -8 -84 -25 -121 -42l-3 3c-9 11 -22 22 -39 32c52 60 131 62 131 62zM85 394c-6 -10 -10 -20 -14 -28c12 -4 22 -10 36 -17c4 5 9 10 14 14c-13 15 -27 25 -36 31zM80 416v0s35 -16 64 -56c-12 -9 -23 -20 -33 -31
+c-26 13 -40 21 -61 27c5 15 15 38 30 60z" />
+    <glyph glyph-name="ion-ios-rose" unicode="&#xf4a3;" horiz-adv-x="320" 
+d="M320 320v0c-77 -96 -16 -151 -16 -224s-56 -128 -144 -128s-144 55 -144 128s35 109 93 142c25 14 33 19 52 28c30 14 65 28 105 40c17 5 35 10 54 14zM0 352v0s66 -15 115 -43c15 -8 28 -18 37 -29c-12 -6 -24 -12 -36 -19c-7 -4 -14 -8 -20 -12
+c-25 -16 -44 -31 -57 -42c5 41 2 98 -39 145zM256 384v0s26 -32 32 -55c-33 -8 -84 -25 -121 -42l-3 3c-9 11 -22 22 -39 32c52 60 131 62 131 62zM80 416v0s35 -16 64 -56c-12 -9 -23 -20 -33 -31c-26 13 -40 21 -61 27c5 15 15 38 30 60z" />
+    <glyph glyph-name="ion-ios-search-strong" unicode="&#xf4a4;" horiz-adv-x="384" 
+d="M280 150l-4 -7l108 -109l-34 -34l-108 109l-7 -5c-24 -15 -53 -25 -83 -25c-84 0 -152 69 -152 153s68 152 152 152s152 -68 152 -152c0 -30 -9 -58 -24 -82zM237 317c-23 23 -53 35 -85 35s-62 -12 -85 -35s-35 -53 -35 -85s12 -62 35 -85s53 -35 85 -35s62 12 85 35
+s36 53 36 85s-13 62 -36 85z" />
+    <glyph glyph-name="ion-ios-search" unicode="&#xf4a5;" horiz-adv-x="384" 
+d="M384 23l-23 -23l-113 113c-26 -21 -60 -33 -96 -33c-84 0 -152 68 -152 152s68 152 152 152s152 -68 152 -152c0 -36 -12 -69 -33 -95zM56 135c26 -26 60 -39 96 -39s70 14 96 40s40 60 40 96s-14 70 -40 96s-60 40 -96 40s-70 -14 -96 -40s-40 -60 -40 -96
+s14 -71 40 -97z" />
+    <glyph glyph-name="ion-ios-settings-strong" unicode="&#xf4a6;" 
+d="M0 72h283c6 14 21 24 37 24s31 -10 37 -24h91v-32h-91c-6 -14 -21 -24 -37 -24s-31 10 -37 24h-283zM0 208h91c6 14 21 24 37 24s31 -10 37 -24h283v-32h-283c-6 -14 -21 -24 -37 -24s-31 10 -37 24h-91zM0 344h283c6 14 21 24 37 24s31 -10 37 -24h91v-32h-91
+c-6 -14 -21 -24 -37 -24s-31 10 -37 24h-283z" />
+    <glyph glyph-name="ion-ios-settings" unicode="&#xf4a7;" 
+d="M320 344c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16zM320 360v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM320 72c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16zM320 88v0c18 0 32 -14 32 -32s-14 -32 -32 -32
+s-32 14 -32 32s14 32 32 32zM128 208c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16zM128 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM175 200h273v-16h-273c0 3 1 5 1 8s-1 5 -1 8zM80 192c0 -3 1 -5 1 -8h-81v16h81
+c0 -3 -1 -5 -1 -8zM367 64h81v-16h-81c0 3 1 5 1 8s-1 5 -1 8zM272 56c0 -3 1 -5 1 -8h-273v16h273c0 -3 -1 -5 -1 -8zM367 336h81v-16h-81c0 3 1 5 1 8s-1 5 -1 8zM273 336c0 -3 -1 -5 -1 -8s1 -5 1 -8h-273v16h273z" />
+    <glyph glyph-name="ion-ios-shuffle-strong" unicode="&#xf4a8;" horiz-adv-x="384" 
+d="M301 296c-85 0 -119 -64 -152 -126c-1 -3 -3 -5 -4 -8l-1 -1c-2 -3 -2 -5 -4 -8c-21 -38 -43 -68 -68 -83c-15 -9 -34 -18 -72 -18v32c45 0 76 18 112 84c2 3 2 6 4 9h1c1 2 3 4 4 7c34 64 76 144 180 144h15l-52 43l21 25l99 -84l-99 -82l-21 24l51 42h-14zM285 154
+l99 -82l-99 -84l-21 25l52 43h-15c-78 0 -122 45 -153 95l18 33c29 -51 64 -96 135 -96h14l-51 42zM112 216c-36 66 -67 84 -112 84v32c38 0 57 -9 72 -18c25 -15 47 -44 67 -81c-7 -11 -13 -22 -19 -33c-1 2 -2 5 -3 7h-1c-2 3 -2 6 -4 9z" />
+    <glyph glyph-name="ion-ios-shuffle" unicode="&#xf4a9;" horiz-adv-x="384" 
+d="M298 241l-10 12l62 51h-46c-93 0 -129 -75 -164 -139c-2 -3 -3 -6 -5 -9c-20 -37 -41 -61 -65 -75c-14 -8 -33 -17 -70 -17v16c48 0 83 14 121 84c2 3 3 6 5 9c35 65 75 147 178 147h46l-62 52l10 12l86 -72zM135 228c0 -1 1 -2 1 -3c-3 -5 -6 -11 -9 -16c0 1 -1 1 -1 2
+c-2 3 -3 6 -5 9c-38 70 -73 84 -121 84v16c37 0 56 -9 70 -17c24 -14 45 -38 65 -75zM298 143l86 -71l-86 -72l-10 12l62 52h-46c-76 0 -118 45 -149 95c1 2 2 5 3 7c2 3 4 7 6 10c30 -50 67 -96 140 -96h46l-62 51z" />
+    <glyph glyph-name="ion-ios-skipbackward-outline" unicode="&#xf4aa;" horiz-adv-x="320" 
+d="M0 352h79v-142l241 142v-320l-241 142v-142h-79v320zM80 192l7 -4l217 -128v264v0l-217 -128zM16 336v-288h47v126v8v28v126h-47z" />
+    <glyph glyph-name="ion-ios-skipbackward" unicode="&#xf4ab;" horiz-adv-x="320" 
+d="M0 352h79v-142l241 142v-320l-241 142v-142h-79v320z" />
+    <glyph glyph-name="ion-ios-skipforward-outline" unicode="&#xf4ac;" horiz-adv-x="320" 
+d="M241 352h79v-320h-79v142l-241 -142v320l241 -142v142zM233 188l7 4l-7 4l-217 128v0v-264zM304 48v288h-47v-126v-28v-8v-126h47z" />
+    <glyph glyph-name="ion-ios-skipforward" unicode="&#xf4ad;" horiz-adv-x="320" 
+d="M241 352h79v-320h-79v142l-241 -142v320l241 -142v142z" />
+    <glyph glyph-name="ion-ios-snowy" unicode="&#xf4ae;" horiz-adv-x="256" 
+d="M252 131c4 -2 5 -7 3 -11s-7 -5 -11 -3l-29 17c-2 -8 -2 -16 0 -24c1 -4 -3 -9 -7 -10s-8 2 -9 6c-2 12 -3 24 1 36l-64 36v-73c11 -3 22 -8 31 -16c3 -3 4 -8 1 -11s-8 -4 -11 -1c-6 5 -13 10 -21 12v-33c0 -4 -4 -8 -8 -8s-8 4 -8 8v33c-8 -2 -15 -7 -21 -12
+c-3 -3 -8 -2 -11 1s-3 8 0 11c9 8 20 13 32 16v73l-65 -36c4 -12 4 -23 2 -35c-1 -4 -5 -8 -9 -7s-8 6 -7 10c2 8 2 16 0 24l-29 -17c-4 -2 -9 -1 -11 3s-1 9 3 11l29 16c-6 6 -13 10 -21 13c-4 1 -6 6 -5 10c2 4 6 6 10 5c12 -4 22 -11 30 -19l65 36l-65 37
+c-8 -9 -18 -15 -30 -19c-4 -1 -9 0 -10 4s1 10 5 11c8 3 15 6 21 12l-29 16c-4 2 -5 7 -3 11s7 5 11 3l29 -16c2 8 2 15 0 23c-1 4 3 9 7 10s8 -2 9 -6c2 -12 1 -25 -2 -36l65 -36v73c-12 3 -23 8 -32 16c-3 3 -3 8 0 11s8 4 11 1c6 -5 13 -10 21 -12v33c0 4 4 8 8 8
+s8 -4 8 -8v-33c8 2 15 7 21 12c3 3 8 2 11 -1s2 -8 -1 -11c-9 -8 -20 -13 -31 -16v-73l64 36c-3 11 -4 24 -2 36c1 4 6 7 10 6s7 -6 6 -10c-2 -8 -1 -15 1 -23l29 16c4 2 9 1 11 -3s1 -9 -3 -11l-29 -16c6 -6 13 -10 21 -13c4 -1 6 -6 5 -10s-6 -6 -10 -5
+c-12 4 -23 10 -31 19l-64 -36l64 -36c8 8 19 15 31 19c4 1 9 -1 10 -5s-1 -9 -5 -10c-8 -3 -15 -7 -21 -13z" />
+    <glyph glyph-name="ion-ios-speedometer-outline" unicode="&#xf4af;" 
+d="M224 384c124 0 224 -100 224 -224c0 -57 -21 -108 -56 -148c-4 -4 -7 -8 -11 -12l-10 10l-1 2c-19 18 -41 33 -65 43c-26 11 -53 16 -81 16s-55 -5 -81 -16c-24 -10 -46 -25 -65 -43l-1 -2l-10 -10c-4 4 -7 8 -11 12c-35 40 -56 91 -56 148c0 124 100 224 224 224z
+M416 79c10 23 15 48 16 73h-32v16h32c-1 25 -6 50 -16 73c-9 22 -23 42 -39 60l-27 -27l-6 6l-5 5v0h-1l27 27c-18 17 -38 31 -60 40c-23 10 -48 15 -74 16v-38h-16v38c-25 -1 -49 -6 -72 -16c-22 -10 -43 -23 -61 -40l27 -27v0v0l-6 -6l-5 -5l-27 27
+c-16 -18 -30 -38 -39 -60c-10 -23 -15 -49 -16 -74h32v-16h-32c1 -25 6 -49 16 -72c9 -20 20 -39 35 -56c40 40 96 64 157 64s117 -24 157 -64c15 17 26 36 35 56zM336 273l2 -1l-75 -84c6 -8 9 -18 9 -28c0 -26 -22 -48 -48 -48c-10 0 -19 4 -27 9l-13 -12l-11 11l12 12
+c-6 8 -9 18 -9 28c0 26 22 48 48 48c10 0 19 -3 27 -8zM224 128c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+    <glyph glyph-name="ion-ios-speedometer" unicode="&#xf4b0;" 
+d="M385 169v-15h30c-1 -22 -6 -44 -15 -65c-8 -18 -19 -35 -32 -50c-39 37 -90 58 -144 58s-105 -21 -144 -58c-13 15 -24 32 -32 50c-9 21 -14 43 -15 65h28h1v16h-29c1 23 6 45 15 66c9 20 20 38 35 54l25 -24l10 10l1 1v0v0l-25 25c16 15 36 26 56 35c21 9 43 14 66 15
+v-34h14h1v34c23 -1 46 -6 67 -15s39 -20 55 -35l-24 -25l11 -11l25 25c15 -16 26 -35 35 -55c9 -21 14 -43 15 -66h-30v-1zM272 160c0 10 -3 20 -9 28l63 76l-2 1l-73 -65c-8 5 -17 8 -27 8c-26 0 -48 -22 -48 -48c0 -10 3 -20 9 -28l-12 -12l11 -11l13 12c8 -5 17 -9 27 -9
+c26 0 48 22 48 48zM224 384c124 0 224 -100 224 -224c0 -57 -21 -108 -56 -148c-4 -4 -7 -8 -11 -12h-23c-32 39 -80 64 -134 64s-102 -25 -134 -64h-23c-4 4 -7 8 -11 12c-35 40 -56 91 -56 148c0 124 100 224 224 224zM379 27c34 37 52 86 52 136c0 55 -22 106 -61 145
+s-91 60 -146 60s-107 -21 -146 -60s-61 -90 -61 -145c0 -50 18 -99 52 -136l10 -10l1 -1v1l9 9l1 1v0c17 17 38 30 60 39c24 10 48 15 74 15s50 -5 74 -15c22 -9 43 -22 60 -39v0l1 -1l9 -9v-1l1 1zM192 160c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32s-32 11 -32 32z
+" />
+    <glyph glyph-name="ion-ios-star-half" unicode="&#xf4b1;" 
+d="M140 143l-140 98h171l53 159l53 -159h171l-140 -98l54 -159l-138 99l-138 -99zM224 347v-244l107 -76l-43 122l108 75h-131z" />
+    <glyph glyph-name="ion-ios-star-outline" unicode="&#xf4b2;" 
+d="M448 241l-140 -98l54 -159l-138 99l-138 -99l54 159l-140 98h171l53 159l53 -159h171zM331 27l-43 122l108 75h-131l-41 123l-41 -123h-131l108 -75l-43 -122l107 76z" />
+    <glyph glyph-name="ion-ios-star" unicode="&#xf4b3;" 
+d="M448 241l-140 -98l54 -159l-138 99l-138 -99l54 159l-140 98h171l53 159l53 -159h171z" />
+    <glyph glyph-name="ion-ios-stopwatch-outline" unicode="&#xf4b4;" horiz-adv-x="384" 
+d="M334 301c32 -35 50 -80 50 -128c0 -104 -86 -189 -192 -189s-192 85 -192 189c0 48 18 94 51 129l1 1h-18l-8 -8l-23 23l41 40l23 -22l-9 -9v-18c31 30 72 50 116 53h2v38h32v-38c43 -4 82 -21 113 -49l5 -5v19l-9 9l23 22l41 -40l-22 -23l-9 8h-18zM192 2
+c96 0 173 77 173 171s-77 171 -173 171c-95 0 -173 -77 -173 -171s77 -171 173 -171zM200 191c14 -4 24 -17 24 -31c0 -15 -10 -26 -24 -30l-8 -18v0l-8 18c-14 4 -24 15 -24 30c0 14 12 27 24 31v129h16v-129z" />
+    <glyph glyph-name="ion-ios-stopwatch" unicode="&#xf4b5;" horiz-adv-x="384" 
+d="M334 301c32 -35 50 -80 50 -128c0 -104 -86 -189 -192 -189s-192 85 -192 189c0 48 18 94 51 129l1 1h-18l-8 -8l-23 23l41 40l23 -22l-9 -9v-18c31 30 72 50 116 53h2v38h32v-38c43 -4 82 -21 113 -49l5 -5v19l-9 9l23 22l41 -40l-22 -23l-9 8h-18zM200 130
+c14 4 24 15 24 30c0 14 -10 27 -24 31v129h-16v-129c-12 -4 -24 -17 -24 -31c0 -15 10 -26 24 -30l8 -18z" />
+    <glyph glyph-name="ion-ios-sunny-outline" unicode="&#xf4b6;" horiz-adv-x="320" 
+d="M151 296v56h18v-56h-18zM151 32v60h18v-60h-18zM264 183v18h56v-18h-56zM0 183v18h60v-18h-60zM240 130l34 -34l-12 -12l-33 34zM64 306l34 -33l-12 -12l-34 34zM229 272l33 34l12 -12l-34 -33zM52 96l34 34l11 -12l-33 -34zM160 116c-42 0 -76 34 -76 76s34 76 76 76
+s76 -34 76 -76s-34 -76 -76 -76zM160 251c-32 0 -59 -27 -59 -59s27 -59 59 -59s59 27 59 59s-27 59 -59 59z" />
+    <glyph glyph-name="ion-ios-sunny" unicode="&#xf4b7;" horiz-adv-x="320" 
+d="M151 296v56h18v-56h-18zM151 32v60h18v-60h-18zM264 183v18h56v-18h-56zM0 183v18h60v-18h-60zM240 130l34 -34l-12 -12l-33 34zM64 306l34 -33l-12 -12l-34 34zM229 272l33 34l12 -12l-34 -33zM52 96l34 34l11 -12l-33 -34zM160 116c-42 0 -76 34 -76 76s34 76 76 76
+s76 -34 76 -76s-34 -76 -76 -76z" />
+    <glyph glyph-name="ion-ios-telephone-outline" unicode="&#xf4b8;" horiz-adv-x="352" 
+d="M336 112c16 -16 26 -35 0 -66c-25 -30 -42 -30 -64 -30c-24 0 -58 14 -93 40c-32 23 -46 34 -78 67c-34 35 -55 64 -79 107c-27 50 -24 74 -18 92c4 12 14 24 28 33l1 1c6 4 18 12 32 12c13 0 24 -6 34 -18l1 -1c11 -14 24 -31 32 -47c10 -21 10 -38 -1 -53
+c-9 -12 -12 -19 -12 -23s5 -9 13 -18l1 -1c16 -18 20 -23 26 -29c1 -1 3 -2 4 -3l2 -2c7 -7 11 -12 29 -28l1 -1c7 -6 9 -8 12 -8c5 0 16 7 29 15c4 3 11 5 17 5c27 0 68 -29 83 -44zM324 57c19 22 13 31 1 43c-13 14 -50 39 -72 39c-3 0 -6 -1 -8 -2
+c-19 -12 -28 -18 -37 -18s-15 6 -23 13h-1c-19 16 -23 21 -30 29l-2 2c-1 1 -3 2 -4 3c-6 6 -11 12 -27 30v1c-10 11 -17 18 -18 28s5 20 16 34c15 20 -5 48 -31 79l-1 1c-7 8 -14 12 -22 12c-10 0 -18 -6 -23 -9c-1 0 -2 -1 -2 -1c-11 -7 -18 -16 -21 -24
+c-5 -16 -7 -35 17 -79c23 -42 43 -70 76 -104c31 -32 45 -42 76 -64c32 -23 64 -38 84 -38c21 0 32 1 52 25z" />
+    <glyph glyph-name="ion-ios-telephone" unicode="&#xf4b9;" horiz-adv-x="352" 
+d="M336 112c16 -16 26 -35 0 -66c-25 -30 -42 -30 -64 -30c-24 0 -58 14 -93 40c-32 23 -46 34 -78 67c-34 35 -55 64 -79 107c-27 50 -24 74 -18 92c4 12 14 24 28 33l1 1c6 4 18 12 32 12c13 0 24 -6 34 -18l1 -1c11 -14 24 -31 32 -47c10 -21 10 -38 -1 -53
+c-9 -12 -12 -19 -12 -23s5 -9 13 -18l1 -1c16 -18 20 -23 26 -29c1 -1 3 -2 4 -3l2 -2c7 -7 11 -12 29 -28l1 -1c7 -6 9 -8 12 -8c5 0 16 7 29 15c4 3 11 5 17 5c27 0 68 -29 83 -44z" />
+    <glyph glyph-name="ion-ios-tennisball-outline" unicode="&#xf4ba;" horiz-adv-x="416" 
+d="M416 192v-8v0c0 -5 0 -11 -1 -16v0c-11 -97 -90 -174 -187 -183v0h-4h-2s-1 -1 -2 -1h-3h-1h-8c-115 0 -208 93 -208 208s93 208 208 208s208 -93 208 -208zM399 192c0 105 -86 191 -191 191c-3 0 -5 -1 -8 -1c1 -24 6 -46 15 -68c10 -26 26 -49 46 -69s43 -36 69 -46
+c22 -9 44 -14 68 -15c0 3 1 5 1 8zM17 192c0 -105 86 -191 191 -191h4c-1 22 -7 45 -15 66c-10 26 -26 48 -46 68s-42 36 -68 46c-21 8 -44 14 -66 15v-4zM228 2c88 9 158 78 169 166c-54 3 -106 25 -147 66s-63 93 -66 147c-88 -11 -157 -81 -166 -169
+c53 -3 105 -25 145 -65s62 -92 65 -145z" />
+    <glyph glyph-name="ion-ios-tennisball" unicode="&#xf4bb;" horiz-adv-x="416" 
+d="M0 196v0v0v0zM212 -16h1h-1v0zM208 400c115 0 208 -93 208 -208c0 -8 0 -16 -1 -24v0v0c-11 -97 -90 -174 -187 -183v0v0c-6 -1 -13 -1 -20 -1c-115 0 -208 93 -208 208v4v0v0c0 6 0 11 1 16v0v0c9 97 86 176 183 187v0v0c6 1 11 1 16 1v0v0h8zM83 181
+c26 -10 48 -26 68 -46s36 -42 46 -68c8 -21 14 -44 15 -66c5 0 11 0 16 1c-3 53 -25 105 -65 145s-92 62 -145 65c-1 -5 -1 -11 -1 -16c22 -1 45 -7 66 -15zM250 234c41 -41 93 -63 147 -66c1 5 1 11 1 16c-24 1 -46 6 -68 15c-26 10 -49 26 -69 46s-36 43 -46 69
+c-9 22 -14 44 -15 68c-5 0 -11 0 -16 -1c3 -54 25 -106 66 -147z" />
+    <glyph glyph-name="ion-ios-thunderstorm-outline" unicode="&#xf4bc;" horiz-adv-x="274" 
+d="M193 176l-88 -128l29 96h-52l15 80h72l-16 -48h40zM209 275c36 0 65 -29 65 -65s-29 -66 -65 -66h-8v17h8c27 0 49 22 49 49s-22 50 -49 50h-6l-14 -2l-3 14c-3 14 -11 26 -22 35s-25 13 -39 13c-34 0 -63 -27 -63 -62v-12s1 -9 1 -9c-5 0 -12 -2 -14 -2
+c-19 -3 -33 -18 -33 -37c0 -10 3 -19 10 -26s16 -11 26 -11h11v-17h-11c-28 0 -52 24 -52 53c0 27 21 51 47 53v8c0 43 35 78 78 78c37 0 68 -26 76 -61h8z" />
+    <glyph glyph-name="ion-ios-thunderstorm" unicode="&#xf4bd;" horiz-adv-x="274" 
+d="M153 176h40l-22 -32l-66 -96l29 96h-52l15 80h72zM84 240h107l-16 -48h18h30l-33 -48h19c36 0 65 30 65 66s-29 65 -65 65h-8c-8 35 -39 61 -76 61c-43 0 -78 -35 -78 -78v-8c-26 -2 -47 -26 -47 -53c0 -29 24 -53 52 -53h14z" />
+    <glyph glyph-name="ion-ios-time-outline" unicode="&#xf4be;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM371 45c19 19 35 41 45 66c11 26 16 53 16 81s-5 55 -16 81c-10 25 -26 47 -45 66s-41 35 -66 45c-26 11 -53 16 -81 16s-55 -5 -81 -16c-25 -10 -47 -26 -66 -45
+s-35 -41 -45 -66c-11 -26 -16 -53 -16 -81s5 -55 16 -81c10 -25 26 -47 45 -66s41 -35 66 -45c26 -11 53 -16 81 -16s55 5 81 16c25 10 47 26 66 45zM216 368c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM216 16c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM392 192
+c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM40 192c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM128 344c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM304 40c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM368 280c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8
+zM64 104c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM64 280c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM368 104c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM304 344c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM128 40c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8
+s-8 3 -8 8zM238 200c4 -8 2 -18 -6 -22v-122c0 -4 -4 -8 -8 -8s-8 4 -8 8v122c-2 1 -4 4 -6 6c-3 5 -3 11 0 16l-37 63c-2 4 -1 9 3 11s8 1 10 -3l38 -63c5 0 11 -3 14 -8z" />
+    <glyph glyph-name="ion-ios-time" unicode="&#xf4bf;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM224 376c-4 0 -8 -4 -8 -8s4 -8 8 -8s8 4 8 8s-4 8 -8 8zM48 184c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM76 97c4 2 4 7 2 11s-6 5 -10 3s-5 -7 -3 -11s7 -5 11 -3z
+M78 276c2 4 2 9 -2 11s-9 1 -11 -3s-1 -9 3 -11s8 -1 10 3zM132 351c-4 -2 -5 -7 -3 -11s7 -4 11 -2s5 6 3 10s-7 5 -11 3zM143 36c2 4 1 8 -3 10s-9 2 -11 -2s-1 -9 3 -11s9 -1 11 3zM224 8c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8zM232 178c8 4 10 14 6 22
+c-3 5 -9 8 -14 8l-38 64c-2 4 -7 4 -11 2s-4 -7 -2 -11l37 -63c-3 -5 -3 -11 0 -16c2 -2 4 -5 6 -6v-122c0 -4 4 -8 8 -8s8 4 8 8v122zM316 33c4 2 5 7 3 11s-7 4 -11 2s-5 -6 -3 -10s7 -5 11 -3zM319 340c2 4 1 9 -3 11s-9 1 -11 -3s-1 -8 3 -10s9 -2 11 2zM383 100
+c2 4 1 9 -3 11s-8 1 -10 -3s-2 -9 2 -11s9 -1 11 3zM380 273c4 2 5 7 3 11s-7 5 -11 3s-4 -7 -2 -11s6 -5 10 -3zM400 184c4 0 8 4 8 8s-4 8 -8 8s-8 -4 -8 -8s4 -8 8 -8z" />
+    <glyph glyph-name="ion-ios-timer-outline" unicode="&#xf4c0;" horiz-adv-x="416" 
+d="M189 176l-1 2s-89 118 -86 120s121 -85 121 -85c1 -1 1 -2 2 -3c5 -5 8 -11 8 -18c0 -14 -11 -25 -25 -25c-8 0 -14 3 -19 9zM208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208c0 57 23 109 61 147l12 -12c-35 -35 -56 -82 -56 -135
+c0 -106 85 -191 191 -191s191 85 191 191c0 100 -77 183 -175 191v-95h-16v112v0v0z" />
+    <glyph glyph-name="ion-ios-timer" unicode="&#xf4c1;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208s-208 93 -208 208s93 208 208 208zM102 298c-2 -2 86 -120 86 -120l1 -1c5 -6 11 -10 19 -10c14 0 25 11 25 25c0 7 -3 13 -8 18l-3 3c0 0 -117 87 -120 85zM208 1c106 0 192 85 192 191s-86 192 -192 192v-96h16v78
+c88 -9 158 -84 158 -174c0 -96 -78 -174 -174 -174s-175 78 -175 174c0 48 19 92 51 124l-11 12c-35 -35 -56 -83 -56 -136c0 -106 85 -191 191 -191z" />
+    <glyph glyph-name="ion-ios-toggle-outline" unicode="&#xf4c2;" 
+d="M96 128c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM96 144v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM351 160v0h-255c-44 0 -80 -36 -80 -80s36 -80 80 -80h256c44 0 80 36 80 80s-37 80 -81 80zM352 176v0
+c53 0 96 -43 96 -96s-43 -96 -96 -96h-256c-53 0 -96 43 -96 96s43 96 96 96h256zM352 352c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48s-22 48 -48 48zM352 368v0c35 0 64 -29 64 -64s-29 -64 -64 -64s-64 29 -64 64s29 64 64 64zM97 384v0c-44 0 -81 -36 -81 -80
+s36 -80 80 -80h256c44 0 80 36 80 80s-36 80 -80 80h-255zM96 400v0h256c53 0 96 -43 96 -96s-43 -96 -96 -96h-256c-53 0 -96 43 -96 96s43 96 96 96z" />
+    <glyph glyph-name="ion-ios-toggle" unicode="&#xf4c3;" 
+d="M96 128c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48zM352 176c53 0 96 -43 96 -96s-43 -96 -96 -96h-256c-53 0 -96 43 -96 96s43 96 96 96h256zM96 16c35 0 64 29 64 64s-29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64zM352 256c-26 0 -48 22 -48 48
+s22 48 48 48s48 -22 48 -48s-22 -48 -48 -48zM96 208c-53 0 -96 43 -96 96s43 96 96 96h256c53 0 96 -43 96 -96s-43 -96 -96 -96h-256zM352 368c-35 0 -64 -29 -64 -64s29 -64 64 -64s64 29 64 64s-29 64 -64 64z" />
+    <glyph glyph-name="ion-ios-trash-outline" unicode="&#xf4c4;" horiz-adv-x="288" 
+d="M288 335v-15h-20l-24 -291c0 -16 -13 -29 -29 -29h-141c-16 0 -29 13 -29 29l-24 291h-21v15h80v20c0 16 13 29 29 29h70c16 0 29 -13 29 -29v-20h80zM95 355v-20h98v20c0 8 -6 14 -14 14h-70c-8 0 -14 -6 -14 -14zM230 30l23 290h-217l23 -290v0v-1c0 -8 7 -14 15 -14
+h141c8 0 15 6 15 14v1v0zM137 47v241h14v-241h-14zM208 288l-11 -241h-14l10 241h15zM94 288l11 -241h-14l-11 241h14z" />
+    <glyph glyph-name="ion-ios-trash" unicode="&#xf4c5;" horiz-adv-x="288" 
+d="M208 335h80v-15h-20l-24 -291c0 -16 -13 -29 -29 -29h-141c-16 0 -29 13 -29 29l-24 291h-21v15h80v20c0 16 13 29 29 29h70c16 0 29 -13 29 -29v-20zM95 355v0v-20h98v20c0 8 -6 14 -14 14h-70c-8 0 -14 -6 -14 -14zM91 47h14l-11 241h-14zM151 47v241h-14v-241h14z
+M197 47l11 241h-14l-11 -241h14z" />
+    <glyph glyph-name="ion-ios-undo-outline" unicode="&#xf4c6;" horiz-adv-x="384" 
+d="M384 80v-32h-10l-20 31c-20 33 -44 63 -75 77c-24 11 -47 19 -87 20v-80l-192 128l192 128v-80c63 -3 108 -21 143 -56c52 -53 49 -119 49 -136zM368 87c0 0 9 169 -192 169v65l-148 -97l148 -97v65c91 0 144 -24 192 -105z" />
+    <glyph glyph-name="ion-ios-undo" unicode="&#xf4c7;" horiz-adv-x="384" 
+d="M384 80v-32h-10l-20 31c-20 33 -44 63 -75 77c-24 11 -47 19 -87 20v-80l-192 128l192 128v-80c63 -3 108 -21 143 -56c52 -53 49 -119 49 -136z" />
+    <glyph glyph-name="ion-ios-unlocked-outline" unicode="&#xf4c8;" horiz-adv-x="320" 
+d="M160 160c18 0 32 -14 32 -32c0 -15 -10 -27 -24 -31v-33h-16v33c-14 4 -24 16 -24 31c0 18 14 32 32 32zM160 112c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM72 224h248v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-8h-16v8
+c0 49 -39 88 -88 88s-88 -39 -88 -88v-72zM304 0v208h-288v-208h288z" />
+    <glyph glyph-name="ion-ios-unlocked" unicode="&#xf4c9;" horiz-adv-x="320" 
+d="M160 144c9 0 16 -7 16 -16s-7 -16 -16 -16s-16 7 -16 16s7 16 16 16zM72 224h248v-240h-320v240h56v72c0 57 47 104 104 104s104 -47 104 -104v-8h-16v8c0 49 -39 88 -88 88s-88 -39 -88 -88v-72zM168 97c14 4 24 16 24 31c0 18 -14 32 -32 32s-32 -14 -32 -32
+c0 -15 10 -27 24 -31v-33h16v33z" />
+    <glyph glyph-name="ion-ios-upload-outline" unicode="&#xf4ca;" horiz-adv-x="320" 
+d="M192 304h128v-304h-320v304h128v-16h-112v-272h288v272h-112v16zM97 330l-11 12l74 74l74 -74l-11 -12l-55 55v-243h-16v243z" />
+    <glyph glyph-name="ion-ios-upload" unicode="&#xf4cb;" horiz-adv-x="320" 
+d="M168 304h152v-304h-320v304h152v-162h16v162zM168 385v-81h-16v81l-55 -55l-11 12l74 74l74 -74l-11 -12z" />
+    <glyph glyph-name="ion-ios-videocam-outline" unicode="&#xf4cc;" horiz-adv-x="418" 
+d="M257 320c19 0 33 -14 33 -33v-188c0 -19 -14 -35 -33 -35h-221c-19 0 -36 16 -36 35v188c0 19 17 33 36 33h221zM273 99v188c0 9 -8 16 -17 16h-221c-9 0 -18 -7 -18 -16v-188c0 -9 10 -18 19 -18h221c9 0 16 9 16 18zM320 235l98 53v-192l-98 53v86zM401 258v0l-64 -33
+v-66l64 -33v132z" />
+    <glyph glyph-name="ion-ios-videocam" unicode="&#xf4cd;" horiz-adv-x="418" 
+d="M257 320c19 0 33 -14 33 -33v-188c0 -19 -14 -35 -33 -35h-221c-19 0 -36 16 -36 35v188c0 19 17 33 36 33h221zM320 235l98 53v-192l-98 53v86z" />
+    <glyph glyph-name="ion-ios-volume-high" unicode="&#xf4ce;" horiz-adv-x="320" 
+d="M278 320c26 -36 42 -80 42 -128s-16 -92 -42 -128l-14 10c24 33 39 74 39 118s-15 85 -39 118zM224 96l-14 10c18 24 29 54 29 86s-11 62 -29 86l14 10c20 -27 32 -60 32 -96s-12 -69 -32 -96zM177 128l-13 10c12 15 18 34 18 54s-6 39 -18 54l13 10
+c14 -18 22 -40 22 -64s-8 -46 -22 -64zM58 232l70 56v-192l-70 56h-58v80h58z" />
+    <glyph glyph-name="ion-ios-volume-low" unicode="&#xf4cf;" horiz-adv-x="128" 
+d="M58 232l70 56v-192l-70 56h-58v80h58z" />
+    <glyph glyph-name="ion-ios-wineglass-outline" unicode="&#xf4d0;" horiz-adv-x="192" 
+d="M104 139v-155h72v-16h-80h-80v16h72v155c0 22 -20 39 -40 55c-8 6 -16 13 -22 19c-27 28 -26 52 -26 71v4c0 44 31 125 32 128h64h64c1 -3 32 -84 32 -128v-4c0 -19 1 -43 -26 -71c-6 -6 -14 -13 -22 -19c-20 -16 -40 -33 -40 -55zM43 400c-5 -16 -20 -63 -25 -96h156
+c-5 33 -20 80 -25 96h-53h-53zM96 175c3 0 5 0 7 2v0c9 11 20 20 31 29c8 6 15 12 20 18c22 23 22 41 22 60v4h-160v-4c0 -19 0 -37 22 -60c5 -6 12 -12 20 -18c11 -9 22 -18 31 -29v0c2 -2 4 -2 7 -2z" />
+    <glyph glyph-name="ion-ios-wineglass" unicode="&#xf4d1;" horiz-adv-x="192" 
+d="M104 139v-155h72v-16h-80h-80v16h72v155c0 22 -20 39 -40 55c-8 6 -16 13 -22 19c-27 28 -26 52 -26 71v4c0 44 31 125 32 128h64h64c1 -3 32 -84 32 -128v-4c0 -19 1 -43 -26 -71c-6 -6 -14 -13 -22 -19c-20 -16 -40 -33 -40 -55zM43 400c-5 -16 -20 -63 -25 -96h156
+c-5 33 -20 80 -25 96h-53h-53z" />
+    <glyph glyph-name="ion-ios-world-outline" unicode="&#xf4d2;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208v0v0v0c-115 0 -208 93 -208 208s93 208 208 208v0v0v0zM216 276v-76h75c-1 31 -5 60 -11 84c-21 -5 -42 -7 -64 -8zM216 292c20 1 41 3 60 8c-14 46 -38 76 -60 82v-90zM200 382c-23 -6 -45 -36 -60 -82
+c19 -5 39 -7 60 -8v90zM200 276c-22 1 -44 3 -65 8c-6 -24 -10 -53 -11 -84h76v76zM108 200c1 32 4 62 11 88c-21 6 -41 15 -59 25c-26 -31 -41 -70 -43 -113h91zM108 184h-91c2 -43 17 -82 43 -113c19 10 38 19 59 25c-7 26 -10 56 -11 88zM124 184c1 -31 5 -60 11 -84
+c21 5 43 8 65 9v75h-76zM200 92c-21 -1 -41 -3 -60 -8c15 -46 37 -76 60 -82v90zM216 2c22 6 46 36 60 82c-19 5 -40 7 -60 8v-90zM216 109c22 -1 43 -4 64 -9c6 24 10 53 11 84h-75v-75zM308 184c-1 -32 -5 -62 -12 -88c21 -6 41 -15 60 -25c26 31 41 70 43 113h-91z
+M308 200v0h91c-2 43 -17 82 -43 113c-19 -10 -38 -19 -59 -25c7 -26 10 -56 11 -88zM344 326c-25 25 -56 44 -91 52c16 -17 29 -43 39 -74c18 6 35 13 52 22zM163 378c-35 -8 -67 -27 -91 -52c16 -9 34 -15 52 -21c10 31 23 56 39 73zM72 58c25 -25 56 -44 91 -52
+c-16 17 -30 43 -40 74c-18 -6 -35 -13 -51 -22zM253 6c35 8 66 27 91 52c-17 9 -34 16 -52 22c-10 -31 -23 -57 -39 -74z" />
+    <glyph glyph-name="ion-ios-world" unicode="&#xf4d3;" horiz-adv-x="416" 
+d="M208 400c115 0 208 -93 208 -208s-93 -208 -208 -208v0v0v0c-115 0 -208 93 -208 208s93 208 208 208v0v0v0zM208 1c106 0 191 85 191 191s-85 191 -191 191v0v0v0c-106 0 -191 -85 -191 -191s86 -191 191 -191v0v0v0zM274 276c6 -22 9 -48 10 -76h-68v68c20 1 39 4 58 8
+zM216 366c20 -6 41 -34 54 -75c-17 -4 -36 -6 -54 -7v82zM145 291c13 42 35 69 55 75v-82c-19 1 -37 3 -55 7zM333 315c-15 -8 -31 -15 -48 -20c-9 29 -21 52 -36 67c32 -8 61 -24 84 -47zM299 200c-1 29 -4 56 -10 80c19 6 37 14 54 23c23 -28 38 -64 40 -103h-84zM132 200
+c1 28 3 54 9 76c19 -5 39 -7 59 -8v-68h-68zM284 184c-1 -28 -4 -54 -10 -76c-19 5 -38 7 -58 8v68h68zM141 108c-6 22 -8 48 -9 76h68v-68c-20 -1 -40 -3 -59 -8zM200 18c-20 6 -42 33 -55 75c18 4 36 6 55 7v-82zM249 22c15 15 27 38 36 67c17 -5 33 -11 48 -19
+c-23 -23 -52 -40 -84 -48zM167 362c-15 -15 -27 -39 -36 -67c-16 5 -33 11 -48 19c22 23 52 40 84 48zM289 104c6 24 9 51 10 80h84c-2 -39 -17 -75 -40 -103c-17 9 -35 17 -54 23zM216 100c18 -1 37 -3 54 -7c-13 -42 -34 -69 -54 -75v82zM127 280c-6 -24 -11 -51 -11 -80
+h-83c2 39 17 75 40 103c17 -9 35 -17 54 -23zM116 184c1 -29 4 -56 10 -80c-19 -6 -36 -14 -53 -23c-23 28 -38 64 -40 103h83zM83 70c15 8 32 14 48 19c9 -28 21 -52 36 -67c-32 8 -62 25 -84 48z" />
+    <glyph glyph-name="ion-ipad" unicode="&#xf1f9;" horiz-adv-x="288" 
+d="M0 375c0 5 4 9 9 9h270c5 0 9 -4 9 -9v-366c0 -5 -4 -9 -9 -9h-270c-5 0 -9 4 -9 9v366zM144 10c8 0 14 6 14 14s-7 14 -14 14c-8 0 -14 -6 -14 -14s6 -14 14 -14zM32 329v-275c0 -4 3 -6 6 -6h211c3 0 7 2 7 6v275c0 4 -4 7 -7 7h-211c-3 0 -6 -3 -6 -7z" />
+    <glyph glyph-name="ion-iphone" unicode="&#xf1fa;" horiz-adv-x="192" 
+d="M168 384c13 0 24 -11 24 -24v-336c0 -13 -11 -24 -24 -24h-144c-13 0 -24 11 -24 24v336c0 13 11 24 24 24h144zM80 348v0c0 -2 2 -4 4 -4h24c2 0 4 2 4 4v0c0 2 -2 4 -4 4h-24c-2 0 -4 -2 -4 -4zM68 352c-2 0 -4 -2 -4 -4s2 -4 4 -4s4 2 4 4s-2 4 -4 4zM96 16
+c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM176 64v256h-160v-256h160z" />
+    <glyph glyph-name="ion-ipod" unicode="&#xf1fb;" horiz-adv-x="224" 
+d="M112 137c18 0 32 -14 32 -32s-14 -32 -32 -32s-32 14 -32 32s14 32 32 32zM196 384c15 0 28 -12 28 -28v-328c0 -16 -13 -28 -28 -28h-168c-15 0 -28 12 -28 28v328c0 16 13 28 28 28h168zM112 32c40 0 72 32 72 72s-32 72 -72 72s-72 -32 -72 -72s32 -72 72 -72z
+M192 221v118c-1 7 -6 12 -12 13h-136c-7 -1 -12 -7 -12 -15v-114c0 -8 6 -15 14 -15h131c8 0 14 5 15 13z" />
+    <glyph glyph-name="ion-jet" unicode="&#xf295;" horiz-adv-x="326" 
+d="M222 80l-2 -13l53 -58l-18 -27l-74 9l-18 -55l-19 55l-73 -9l-18 27l53 58l-2 13l-104 -35l3 53l114 103s26 173 28 192c5 40 18 55 18 55s13 -15 18 -55c2 -19 28 -192 28 -192l114 -103l3 -53z" />
+    <glyph glyph-name="ion-key" unicode="&#xf296;" horiz-adv-x="192" 
+d="M144 147c28 -17 48 -48 48 -83c0 -53 -43 -96 -96 -96s-96 43 -96 96c0 36 19 67 48 84c0 0 7 16 12 41c0 4 11 6 11 12v20c0 5 -7 9 -7 11v8v8c0 2 0 4 1 6c0 1 1 1 1 2l2 1l4 4v1c2 2 3 4 3 6c0 1 1 8 1 9c0 3 -2 6 -4 8l-1 1l-4 4v0l-1 1v0c-2 2 -3 5 -3 8v7
+c0 3 2 7 4 9v0l5 5v0c2 2 4 3 4 6v24c0 3 -2 6 -4 8v1l-4 4l-1 1c-2 2 -3 5 -3 8v18c0 11 0 19 9 23c3 1 14 3 23 3c20 0 30 -8 32 -36c0 0 7 -81 9 -143s7 -90 7 -90zM96 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+    <glyph glyph-name="ion-knife" unicode="&#xf297;" horiz-adv-x="64" 
+d="M62 416c2 0 2 -1 2 -6v-412c0 -15 -10 -30 -24 -30v0v0c-14 0 -24 15 -24 30c1 19 14 83 16 130v0c1 30 -32 31 -32 70c0 134 35 191 54 214c2 2 5 4 8 4z" />
+    <glyph glyph-name="ion-laptop" unicode="&#xf1fc;" horiz-adv-x="512" 
+d="M480 342v-262h-448v262c0 6 4 10 10 10h428c6 0 10 -4 10 -10zM448 112v208h-384v-208h384zM0 59v5h512v-5c-70 -20 -116 -27 -256 -27s-186 7 -256 27z" />
+    <glyph glyph-name="ion-leaf" unicode="&#xf1fd;" horiz-adv-x="422" 
+d="M412 69c18 -3 10 -41 -5 -39c0 0 -21 -1 -63 12c0 0 -16 -19 -39 -30c-26 -12 -118 -33 -197 38c-108 97 -120 354 -100 333c86 -90 197 -47 270 -106c55 -44 88 -127 77 -192c0 0 5 -8 57 -16zM316 65c5 5 10 16 10 24c-161 52 -252 160 -252 160s104 -143 242 -184z
+" />
+    <glyph glyph-name="ion-levels" unicode="&#xf298;" horiz-adv-x="350" 
+d="M46 349c11 -5 18 -16 18 -29s-7 -24 -18 -29v-275c0 -9 -7 -16 -16 -16s-16 7 -16 16v278c-8 6 -14 15 -14 26s6 20 14 26v22c0 9 7 16 16 16s16 -7 16 -16v-19zM142 155c9 -6 15 -16 15 -27s-6 -21 -15 -27v-85c0 -9 -7 -16 -16 -16s-16 7 -16 16v84
+c-10 5 -17 16 -17 28s7 23 17 28v212c0 9 7 16 16 16s16 -7 16 -16v-213zM238 285c10 -6 16 -16 16 -28s-6 -22 -16 -28v-213c0 -9 -7 -16 -16 -16s-16 7 -16 16v213c-10 6 -16 16 -16 28s6 22 16 28v83c0 9 7 16 16 16s16 -7 16 -16v-83zM350 65c0 -12 -6 -22 -16 -28v-21
+c0 -9 -7 -16 -16 -16s-16 7 -16 16v21c-10 6 -16 16 -16 28s6 22 16 28v275c0 9 7 16 16 16s16 -7 16 -16v-275c10 -6 16 -16 16 -28z" />
+    <glyph glyph-name="ion-lightbulb" unicode="&#xf299;" horiz-adv-x="256" 
+d="M128 416c71 0 128 -56 128 -124c0 -5 0 -9 -1 -14s-2 -11 -3 -16v-2c-17 -63 -45 -71 -59 -167v-1c-2 -9 -10 -12 -20 -12h-90c-10 0 -18 3 -20 12v1c-14 96 -42 104 -59 167v2c-1 5 -2 11 -3 16s-1 9 -1 14c0 68 57 124 128 124zM190 52v-1c-2 -3 -3 -4 -3 -7s1 -5 3 -8
+v-1c1 -2 2 -3 2 -5s-1 -4 -2 -6v-1c-2 -3 -3 -4 -3 -7s1 -5 3 -8v-1c1 -2 2 -4 2 -6c0 -5 -4 -9 -10 -11h-1c-6 -1 -13 -2 -19 -3h-2c-6 -1 -11 -5 -14 -9v0c-4 -5 -10 -10 -18 -10s-15 6 -19 11v0c-3 4 -7 7 -13 8h-2c-6 1 -13 2 -19 3h-1c-6 2 -10 6 -10 11c0 2 1 4 2 6v1
+c2 2 3 4 3 7s-1 5 -3 8v1c-1 2 -2 4 -2 6s1 3 2 5v1c2 3 3 5 3 8s-1 4 -3 7v1v0c-1 2 -2 4 -2 6c0 4 -1 6 7 6h114c8 0 7 -2 7 -6c0 -2 -1 -4 -2 -6v0z" />
+    <glyph glyph-name="ion-link" unicode="&#xf1fe;" horiz-adv-x="384" 
+d="M192 240v0v0v0zM304 288c44 0 80 -36 80 -80v-32c0 -44 -36 -80 -80 -80h-112c-33 0 -60 20 -73 48c-4 10 -7 20 -7 32v32h48v-32c0 -18 14 -32 32 -32h112c18 0 32 14 32 32v32c0 18 -14 32 -32 32v0h-16c-6 31 -32 48 -32 48h48zM266 240c4 -10 6 -21 6 -32v-32v0h-48
+v0v32c0 18 -14 32 -32 32v0h-112c-18 0 -32 -14 -32 -32v-32c0 -18 14 -32 32 -32h16c6 -31 32 -48 32 -48h-48c-44 0 -80 36 -80 80v32c0 44 36 80 80 80h112c33 0 62 -20 74 -48z" />
+    <glyph glyph-name="ion-load-a" unicode="&#xf29a;" horiz-adv-x="384" 
+d="M144 352c0 43 21 64 64 64s64 -21 64 -64s-21 -64 -64 -64s-64 21 -64 64zM0 192c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM312 304c0 5 3 8 8 8s8 -3 8 -8s-3 -8 -8 -8s-8 3 -8 8zM132 340c10 -10 15 -22 15 -36s-5 -26 -15 -36s-22 -15 -36 -15
+s-26 5 -36 15s-15 22 -15 36s5 26 15 36s22 15 36 15s26 -5 36 -15zM352 192c0 11 5 16 16 16s16 -5 16 -16s-5 -16 -16 -16s-16 5 -16 16zM297 79c0 16 8 24 24 24s24 -8 24 -24s-8 -24 -24 -24s-24 8 -24 24zM176 32c0 21 11 32 32 32s32 -11 32 -32s-11 -32 -32 -32
+s-32 11 -32 32zM56 80c0 27 13 40 40 40s40 -13 40 -40s-13 -40 -40 -40s-40 13 -40 40z" />
+    <glyph glyph-name="ion-load-b" unicode="&#xf29b;" 
+d="M256 288c0 -18 -14 -32 -32 -32v0c-18 0 -32 14 -32 32v96c0 18 14 32 32 32v0c18 0 32 -14 32 -32v-96zM224 128v0c18 0 32 -14 32 -32v-96c0 -18 -14 -32 -32 -32s-32 14 -32 32v96c0 18 14 32 32 32zM416 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32h-96
+c-18 0 -32 14 -32 32s14 32 32 32h96zM128 224v0c18 0 32 -14 32 -32s-14 -32 -32 -32h-96c-18 0 -32 14 -32 32s14 32 32 32h96zM314 237c-12 -12 -33 -12 -45 0v0c-12 12 -12 34 0 46l68 67c12 12 33 12 45 0v0c12 -12 12 -33 0 -45zM179 147v0c12 -12 12 -33 0 -46
+l-68 -67c-12 -12 -33 -12 -45 0s-12 33 0 45l67 68c12 12 34 12 46 0zM382 79v0c12 -12 12 -33 0 -45s-33 -12 -45 0l-68 68c-12 12 -12 33 0 45s33 12 45 0zM179 282v0c12 -12 12 -33 0 -45s-34 -12 -46 0l-67 68c-12 12 -12 33 0 45s33 12 45 0z" />
+    <glyph glyph-name="ion-load-c" unicode="&#xf29c;" 
+d="M448 222c0 -3 0 -6 -1 -9c-4 -8 -15 -12 -23 -7c-4 2 -6 7 -7 11c-1 5 -1 9 -2 14c-4 20 -12 40 -22 58c-12 21 -28 41 -47 56c-18 15 -40 26 -62 33c-21 6 -42 9 -64 9h-4c-3 0 -6 -1 -9 -1c-6 0 -14 -1 -20 -2c-13 -2 -25 -6 -37 -11c-21 -8 -40 -20 -57 -35
+s-31 -33 -42 -52c-12 -22 -20 -45 -24 -70c-2 -11 -2 -23 -2 -34c0 -6 0 -11 1 -16c1 -6 2 -13 3 -19c5 -24 14 -47 28 -67c13 -20 29 -38 48 -52c20 -15 42 -26 65 -33c25 -7 50 -9 76 -7c25 2 50 9 73 20c11 5 22 12 32 19s19 15 27 24c4 4 8 9 12 14s7 10 10 15
+c6 10 12 20 17 31c4 8 8 16 11 25c2 4 3 9 4 13s1 7 2 11c1 -9 1 -18 -1 -26c-1 -5 -2 -11 -4 -16c-1 -5 -3 -10 -5 -15c-4 -10 -8 -19 -13 -28c-6 -11 -12 -21 -20 -30s-16 -18 -25 -26c-18 -15 -40 -27 -62 -36c-23 -9 -48 -14 -73 -15s-51 3 -75 11c-23 7 -45 19 -65 33
+c-19 14 -36 31 -50 50c-7 10 -13 20 -18 31s-9 21 -13 33c-6 18 -9 37 -10 56c-1 20 1 39 5 58c5 24 15 47 28 68c12 19 26 35 42 50s35 27 55 36c23 11 48 19 74 21c10 1 19 1 29 1c13 0 26 -2 38 -4c24 -5 47 -14 68 -26s41 -29 57 -48c15 -18 27 -37 36 -58
+c4 -10 7 -21 10 -32c2 -8 5 -17 6 -26z" />
+    <glyph glyph-name="ion-load-d" unicode="&#xf29d;" horiz-adv-x="384" 
+d="M368 208c9 0 16 -7 16 -16s-7 -16 -16 -16h-80c-9 0 -16 7 -16 16s7 16 16 16h80zM112 192c0 -9 -7 -16 -16 -16h-80c-9 0 -16 7 -16 16s7 16 16 16h80c9 0 16 -7 16 -16zM192 112c9 0 16 -7 16 -16v-80c0 -9 -7 -16 -16 -16s-16 7 -16 16v80c0 9 7 16 16 16zM192 384
+c9 0 16 -7 16 -16v-80c0 -9 -7 -16 -16 -16s-16 7 -16 16v80c0 9 7 16 16 16zM261 232c-4 8 -2 18 6 22l69 40c8 4 18 2 22 -6s2 -18 -6 -22l-69 -40c-8 -4 -18 -2 -22 6zM123 152c4 -8 2 -18 -6 -22l-69 -40c-8 -4 -18 -2 -22 6s-2 18 6 22l69 40c8 4 18 2 22 -6zM254 117
+l40 -69c4 -8 2 -18 -6 -22s-18 -2 -22 6l-40 69c-4 8 -2 18 6 22s18 2 22 -6zM118 352l40 -69c4 -8 2 -18 -6 -22s-18 -2 -22 6l-40 69c-4 8 -2 18 6 22s18 2 22 -6zM232 261c-8 4 -10 14 -6 22l40 69c4 8 14 10 22 6s10 -14 6 -22l-40 -69c-4 -8 -14 -10 -22 -6zM152 123
+c8 -4 10 -14 6 -22l-40 -69c-4 -8 -14 -10 -22 -6s-10 14 -6 22l40 69c4 8 14 10 22 6zM352 118c8 -4 10 -14 6 -22s-14 -10 -22 -6l-69 40c-8 4 -10 14 -6 22s14 10 22 6zM32 266c-8 4 -10 14 -6 22s14 10 22 6l69 -40c8 -4 10 -14 6 -22s-14 -10 -22 -6z" />
+    <glyph glyph-name="ion-location" unicode="&#xf1ff;" horiz-adv-x="239" 
+d="M119 384c66 0 120 -54 120 -120c0 -115 -120 -264 -120 -264s-119 149 -119 264c0 66 53 120 119 120zM119 206c31 0 57 25 57 56s-26 57 -57 57s-56 -26 -56 -57s25 -56 56 -56z" />
+    <glyph glyph-name="ion-lock-combination" unicode="&#xf4d4;" horiz-adv-x="384" 
+d="M320 271c39 -35 64 -86 64 -143c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 57 25 108 64 143v49c0 71 57 128 128 128s128 -57 128 -128v-49zM96 320v-26c28 16 61 26 96 26s68 -10 96 -26v26c0 53 -43 96 -96 96s-96 -43 -96 -96zM192 -32c88 0 160 72 160 160
+s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM192 272c80 0 144 -64 144 -144s-64 -144 -144 -144s-144 64 -144 144s64 144 144 144zM315 95c2 9 4 18 4 29h-7v7h8c0 11 -2 20 -5 30l-25 -7l-4 12l25 8c-4 10 -8 18 -14 26l-11 -8l-4 6l11 8c-6 8 -13 16 -21 22
+l-15 -21l-11 8l15 20c-8 6 -17 11 -27 14l-4 -13l-6 2l5 13c-9 3 -20 5 -29 5v-13v-6h-16v6v13c-11 -1 -19 -2 -29 -5l4 -12l-6 -2l-4 12c-10 -3 -19 -8 -27 -14l15 -20l-10 -8l-15 21c-8 -6 -16 -14 -22 -22l11 -8l-4 -5l-10 8c-6 -8 -10 -17 -14 -27l24 -8l-5 -12l-25 7
+c-3 -10 -3 -19 -3 -30h6v-7h-5c0 -11 2 -20 4 -29l24 7l4 -12l-24 -8c4 -10 8 -19 14 -27l9 7l4 -5l-9 -7c6 -8 13 -16 21 -22l15 21l10 -8l-15 -20c8 -5 17 -11 27 -14l3 11l7 -2l-4 -11c10 -3 18 -4 29 -5v13v6h16v-6v-13c9 1 19 2 29 5l-5 12l6 2l4 -12c10 3 19 8 27 14
+l-15 20l11 8l15 -21c8 6 15 14 21 22l-11 7l4 6l10 -8c6 8 11 17 15 27l-25 8l4 12zM111 128c0 54 27 81 81 81s81 -27 81 -81s-27 -81 -81 -81s-81 27 -81 81z" />
+    <glyph glyph-name="ion-locked" unicode="&#xf200;" horiz-adv-x="384" 
+d="M22 -32c-12 0 -22 10 -22 22v212c0 12 10 22 22 22h3h19v31c0 42 17 87 43 115s64 46 105 46v0v0c41 0 79 -18 105 -46s43 -73 43 -115v-31h22c12 0 22 -10 22 -22v-212c0 -12 -10 -22 -22 -22h-340zM97 255v-31h17h155h18v31c0 27 -10 61 -28 80v0v1
+c-18 19 -42 29 -67 29v0v0c-25 0 -49 -10 -67 -29v-1v0c-18 -19 -28 -53 -28 -80z" />
+    <glyph glyph-name="ion-log-in" unicode="&#xf29e;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224c-96 0 -177 60 -209 144h34c9 -20 23 -40 39 -56c36 -36 85 -56 136 -56s100 20 136 56s56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56c-16 -16 -30 -36 -39 -56h-34c32 84 113 144 209 144z
+M175 124l52 52h-227v32h227l-52 52l22 23l91 -91l-91 -91z" />
+    <glyph glyph-name="ion-log-out" unicode="&#xf29f;" 
+d="M335 124l52 52h-227v32h227l-52 52l22 23l91 -91l-91 -91zM359 56c3 3 6 5 8 8h41c-40 -58 -108 -96 -184 -96c-124 0 -224 100 -224 224s100 224 224 224c76 0 144 -38 184 -96h-41c-2 3 -5 5 -8 8c-36 36 -84 56 -135 56s-100 -20 -136 -56s-56 -85 -56 -136
+s20 -100 56 -136s85 -56 136 -56s99 20 135 56z" />
+    <glyph glyph-name="ion-loop" unicode="&#xf201;" horiz-adv-x="334" 
+d="M184 148v-58c49 8 86 50 86 102c0 16 -4 30 -10 44c-3 6 -5 12 -9 17l47 43c1 -1 2 -3 3 -4c21 -28 33 -62 33 -100v-4c-2 -72 -47 -131 -111 -154c-12 -4 -26 -8 -39 -9v-57l-76 67l-26 23l44 39zM0 196c2 72 48 133 113 155c12 4 24 7 37 8v57l76 -67l26 -23l-44 -39
+l-59 -51l1 58c-49 -8 -86 -51 -86 -102c0 -16 4 -31 10 -45c3 -6 5 -11 9 -16l-47 -44c-1 2 -2 3 -3 5c-20 28 -33 63 -33 100v4z" />
+    <glyph glyph-name="ion-magnet" unicode="&#xf2a0;" horiz-adv-x="384" 
+d="M192 416c115 0 192 -78 192 -200c0 -49 -3 -77 -15 -128c-16 -66 -39 -113 -39 -113v-1c-2 -3 -6 -6 -10 -6c-1 0 -3 1 -4 1l-2 1l-50 20l-2 1c-3 2 -5 5 -5 9c0 1 0 3 1 4v1c7 16 27 59 37 101s13 63 13 108c0 71 -52 122 -116 122s-116 -51 -116 -122
+c0 -45 3 -66 13 -108s30 -85 37 -101v-1c1 -1 1 -3 1 -4c0 -4 -2 -7 -5 -9l-2 -1l-50 -20l-2 -1c-1 0 -3 -1 -4 -1c-4 0 -8 3 -10 6v1s-24 47 -40 113c-12 51 -14 79 -14 128c0 122 77 200 192 200zM109 4c-9 19 -27 59 -36 98l-42 -12c13 -53 30 -92 35 -104l43 17v1z
+M317 -14c5 12 23 51 36 104l-43 12c-9 -39 -26 -79 -35 -98v-1z" />
+    <glyph glyph-name="ion-male" unicode="&#xf2a1;" 
+d="M448 256l-63 63l-69 -69c22 -30 36 -66 36 -106c0 -97 -79 -176 -176 -176s-176 79 -176 176s79 176 176 176c40 0 76 -14 106 -36l69 69l-63 63h160v-160zM266 54c24 24 38 56 38 90s-14 66 -38 90s-56 38 -90 38s-66 -14 -90 -38s-38 -56 -38 -90s14 -66 38 -90
+s56 -38 90 -38s66 14 90 38z" />
+    <glyph glyph-name="ion-man" unicode="&#xf202;" horiz-adv-x="168" 
+d="M84 341c-21 0 -37 17 -37 38s16 37 37 37s37 -16 37 -37s-16 -38 -37 -38zM121 333c28 0 47 -24 47 -48v-114c0 -22 -32 -22 -32 0v105h-5v-286c0 -28 -41 -31 -43 0v165h-1h-7v-165c-1 -29 -43 -30 -43 0v286h-6v-105c0 -22 -31 -22 -31 0v114c0 24 19 48 47 48h37h37z
+" />
+    <glyph glyph-name="ion-map" unicode="&#xf203;" 
+d="M441 311c4 -3 7 -8 7 -14v-281c0 -6 -2 -11 -7 -14c-2 -1 -5 -2 -7 -2c-3 0 -6 0 -8 2l-97 66l-97 -66c-5 -3 -10 -3 -15 0l-97 66l-97 -66c-5 -3 -10 -3 -15 0s-8 8 -8 14v281c0 6 3 11 7 14l105 71c5 3 10 3 15 0l97 -66l98 66c5 3 10 3 15 0zM103 95v242l-71 -50v-242
+zM135 95l73 -49v129l-4 -11c-7 2 -13 6 -20 10l8 13c5 -3 11 -6 16 -8v109l-73 49v-101c4 -2 9 -4 13 -7l-10 -13c-1 1 -2 1 -3 2v-123zM240 46l73 49v109c0 -1 -1 -1 -1 -2l-6 -6l-12 11l6 6c3 3 5 7 8 10l5 -5v119l-73 -49v-112h7l3 -15c-3 0 -6 -1 -9 -1h-1v-114zM416 46
+v242l-71 49v-88c3 1 5 1 8 2l4 -16c-4 -1 -8 -1 -12 -3v-137zM97 227c-3 -1 -11 -5 -14 -7l-11 12c4 3 8 6 12 8c3 2 6 3 9 4l5 -15c-2 -1 1 -1 -1 -2zM265 182c5 3 10 5 15 10l11 -12c-6 -6 -12 -10 -19 -13zM67 192v-1l-15 5v1c2 7 4 13 9 20l13 -9c-4 -5 -5 -10 -7 -16z
+M166 210c3 -4 7 -8 11 -11l-11 -12c-4 4 -8 9 -12 13l-3 3l12 11c1 -1 2 -3 3 -4zM376 218l-11 12l10 10l-10 10l11 12l10 -11l11 11l11 -12l-10 -10l10 -10l-11 -12l-11 11z" />
+    <glyph glyph-name="ion-medkit" unicode="&#xf2a2;" 
+d="M440 304c4 0 8 -4 8 -8v-288c0 -4 -4 -8 -8 -8h-432c-4 0 -8 4 -8 8v288c0 4 4 8 8 8h120v31c1 28 22 49 51 49h45h45c30 0 50 -21 51 -49v-31h120zM160 331v-27h128v27v1v1c0 10 -9 19 -19 19h-45h-45c-10 0 -19 -9 -19 -19v-1v-1zM320 128v64h-64v64h-64v-64h-64v-64
+h64v-64h64v64h64z" />
+    <glyph glyph-name="ion-merge" unicode="&#xf33f;" horiz-adv-x="384" 
+d="M320 224c35 0 64 -29 64 -64s-29 -64 -64 -64c-24 0 -44 13 -55 32h-10c-61 0 -115 25 -159 74v-115c19 -11 32 -31 32 -55c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v210c-19 11 -32 31 -32 55c0 35 29 64 64 64s64 -29 64 -64c0 -19 -8 -37 -22 -49
+c4 -9 17 -35 37 -58c32 -35 70 -53 112 -53h10c11 19 31 32 55 32zM64 384c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM64 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM320 128c18 0 32 14 32 32s-14 32 -32 32
+s-32 -14 -32 -32s14 -32 32 -32z" />
+    <glyph glyph-name="ion-mic-a" unicode="&#xf204;" horiz-adv-x="288" 
+d="M0 210c0 10 9 19 20 19s19 -9 19 -19v-14c0 -28 12 -53 31 -72s45 -31 74 -31s55 12 74 31s31 44 31 72v14c0 10 8 19 19 19s20 -9 20 -19v-14c0 -66 -46 -120 -108 -136c-1 0 -3 -1 -4 -1c-6 -2 -10 -7 -12 -13v-58c0 -11 -9 -20 -20 -20v0c-11 0 -20 9 -20 20v58
+c-2 6 -6 11 -12 13c-1 0 -3 1 -4 1c-62 16 -108 70 -108 136v14zM67 340c0 42 34 76 77 76s78 -34 78 -76v-144c0 -42 -35 -75 -78 -75s-77 33 -77 75v144z" />
+    <glyph glyph-name="ion-mic-b" unicode="&#xf205;" horiz-adv-x="160" 
+d="M80 416c35 0 65 -23 76 -59c6 -18 4 -45 2 -55s-8 -20 -14 -28c-3 -4 -7 -7 -11 -9c-1 0 -1 -1 -2 -1c-3 -1 -6 -2 -10 -3c-12 -3 -25 -5 -39 -5v0h-1h-1v0c-14 0 -29 2 -41 5c-4 1 -7 2 -10 3c-1 0 -1 1 -2 1c-4 2 -8 5 -11 9c-6 8 -12 18 -14 28s-4 37 2 55
+c11 36 41 59 76 59zM119 247c6 0 12 -5 12 -12v-2c-5 -67 -18 -241 -19 -252c0 0 -3 -13 -32 -13v0c-29 0 -32 13 -32 13c-1 11 -13 185 -18 252v2c0 7 5 12 11 12h1c1 0 1 -1 2 -1c2 0 4 -1 6 -1c9 -2 21 -2 31 -2s20 0 29 2c2 0 4 1 6 1c1 0 1 1 2 1h1zM90 166v33
+c0 6 -4 11 -10 11s-10 -5 -10 -11v-33c0 -6 4 -11 10 -11s10 5 10 11z" />
+    <glyph glyph-name="ion-mic-c" unicode="&#xf206;" horiz-adv-x="256" 
+d="M201 416c30 0 55 -23 55 -52v-28h-59v-37h59v-43h-59v-37h59v-43h-59v-37h59v-42c0 -29 -25 -52 -55 -52h-30v-77h-86v77h-30c-30 0 -55 23 -55 52v42h152v37h-152v43h152v37h-152v43h152v37h-152v28c0 29 25 52 55 52h146z" />
+    <glyph glyph-name="ion-minus-circled" unicode="&#xf207;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM352 176v32h-256v-32h256z" />
+    <glyph glyph-name="ion-minus-round" unicode="&#xf208;" horiz-adv-x="384" 
+d="M353 224c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32h322z" />
+    <glyph glyph-name="ion-minus" unicode="&#xf209;" horiz-adv-x="384" 
+d="M0 160v64h384v-64h-384z" />
+    <glyph glyph-name="ion-model-s" unicode="&#xf2c1;" horiz-adv-x="512" 
+d="M509 57v-8v0v-1v-3v0c0 -3 -1 -5 -1 -7c-1 -12 -2 -18 -6 -20c-3 -2 -6 -2 -10 -2h-43s-10 1 -11 16v8c20 1 39 1 52 0c10 0 13 0 16 6c2 3 2 7 3 11zM3 57c1 -4 1 -8 3 -11c3 -6 6 -6 16 -6c13 1 32 1 52 0v-8c-1 -15 -8 -16 -11 -16h-43s-7 0 -10 2c-4 2 -6 8 -7 20v7
+v0v3v1v0v8zM512 151c0 -31 -2 -58 -2 -68c0 -4 0 -11 -1 -18c-1 -4 -1 -8 -3 -11c-3 -6 -6 -6 -16 -6c-13 1 -32 1 -52 0c-13 0 -27 -2 -39 -2c-30 -1 -21 4 -34 4s-63 -2 -109 -2s-97 2 -110 2s-4 -5 -34 -4c-12 0 -25 2 -38 2c-20 1 -39 1 -52 0c-10 0 -13 0 -16 6
+c-2 3 -2 7 -3 11c-1 7 -1 14 -1 18c0 10 -2 37 -2 68s4 61 6 64c1 2 8 9 26 21s17 10 20 18c-3 1 -5 3 -7 3c-4 0 -4 -3 -12 -3s-24 1 -28 5c-4 3 -5 5 -5 8s2 9 5 13s19 6 27 7s10 0 12 -1c4 -2 3 -22 3 -22l9 -1c5 13 12 41 24 62c13 23 26 30 32 32s10 2 48 6s69 5 96 5
+s58 -1 96 -5s42 -4 48 -6s19 -9 32 -32c12 -21 19 -49 24 -62l9 1s-1 20 3 22c2 1 4 2 12 1s24 -3 27 -7s5 -10 5 -13s-1 -4 -5 -8s-20 -5 -28 -5s-8 3 -12 3c-2 0 -4 -2 -7 -3c3 -8 2 -6 20 -18s25 -19 26 -21c2 -3 6 -33 6 -64zM86 303c-5 -11 -11 -33 -10 -36
+s-1 -5 15 -4s117 3 165 3s149 -2 165 -3s14 1 15 4s-5 25 -10 36s-17 31 -26 37c-2 1 -17 7 -54 9c-34 2 -72 3 -90 3s-56 -1 -90 -3c-37 -2 -52 -8 -54 -9c-7 -4 -21 -26 -26 -37zM123 178c7 2 11 2 11 2s-17 16 -48 25s-49 11 -66 10c0 0 -3 -16 0 -27s8 -10 16 -12
+s13 -5 16 -4s7 4 12 4s29 -4 38 -4s14 4 21 6zM358 99c15 2 34 19 21 33c-18 19 -15 19 -55 24c-35 4 -61 4 -68 4s-33 0 -68 -4c-40 -5 -37 -5 -55 -24c-13 -14 6 -31 21 -33c14 -2 74 -3 102 -3s88 1 102 3zM492 188c3 11 0 27 0 27c-17 1 -35 -1 -66 -10s-48 -26 -48 -26
+s4 1 11 -1s12 -6 21 -6s33 4 38 4s9 -3 12 -4s8 2 16 4s13 1 16 12z" />
+    <glyph glyph-name="ion-monitor" unicode="&#xf20a;" 
+d="M437 384c6 0 11 -5 11 -11v-266c0 -6 -5 -11 -11 -11h-426c-6 0 -11 5 -11 11v266c0 6 5 11 11 11h426zM416 128v224h-384v-224h384zM270 0h-92c-28 0 -42 3 -30 12s30 16 30 23c0 4 1 45 1 45h45h45s1 -41 1 -45c0 -7 18 -14 30 -23s-2 -12 -30 -12z" />
+    <glyph glyph-name="ion-more" unicode="&#xf20b;" horiz-adv-x="384" 
+d="M50 144c-28 0 -50 21 -50 48c0 26 22 48 50 48s50 -22 50 -48c0 -27 -22 -48 -50 -48zM192 144c-28 0 -50 21 -50 48c0 26 22 48 50 48s50 -22 50 -48c0 -27 -22 -48 -50 -48zM334 144c-28 0 -50 21 -50 48c0 26 22 48 50 48s50 -22 50 -48c0 -27 -22 -48 -50 -48z" />
+    <glyph glyph-name="ion-mouse" unicode="&#xf340;" horiz-adv-x="256" 
+d="M128 416h-1h5h-4zM251 255c2 1 2 1 4 1h1v-176c0 -37 -21 -71 -53 -91c-5 -3 -9 -5 -14 -7v-1v0c-18 -9 -39 -13 -61 -13c-71 0 -128 50 -128 112v176h1c2 0 3 0 5 -1v0c34 -13 76 -23 122 -23s88 10 122 23h1zM189 -18c5 2 10 4 14 7c-5 -3 -9 -5 -14 -7v0v-1v1v0z
+M203 -11c-4 -3 -9 -5 -14 -7c5 2 9 4 14 7zM132 416c69 -2 124 -51 124 -112v-23c-2 -2 -4 -4 -6 -5c-1 -1 -3 0 -4 -1c-23 -10 -50 -16 -82 -19h-1h-2c-11 0 -17 0 -17 10v86c0 9 -7 16 -16 16s-16 -7 -16 -16v-85c0 -11 -6 -11 -17 -11h-2c-32 3 -61 9 -84 19v0
+c-1 0 -1 1 -2 1c-3 1 -5 3 -7 5v23c0 61 57 111 127 112h5z" />
+    <glyph glyph-name="ion-music-note" unicode="&#xf20c;" horiz-adv-x="384" 
+d="M362 416c12 0 22 -9 22 -21v-303s-3 -43 -12 -55v0c-9 -15 -25 -21 -43 -21h-37c-28 0 -52 20 -52 48s24 48 52 48h60v192l-208 -38v-232c0 -8 -3 -27 -13 -41c-1 -2 -2 -3 -3 -5c0 -1 -1 -1 -2 -2v0c-9 -11 -23 -18 -38 -18h-37c-28 0 -51 20 -51 48s23 48 51 48v0h61
+v286c1 14 13 28 27 32l218 33s3 1 5 1z" />
+    <glyph glyph-name="ion-navicon-round" unicode="&#xf20d;" horiz-adv-x="384" 
+d="M353 224c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32h322zM353 352c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32h322zM353 96c17 0 31 -14 31 -32s-14 -32 -31 -32h-322c-17 0 -31 14 -31 32s14 32 31 32
+h322z" />
+    <glyph glyph-name="ion-navicon" unicode="&#xf20e;" horiz-adv-x="320" 
+d="M0 175v32h320v-32h-320zM0 271v32h320v-32h-320zM0 79v32h320v-32h-320z" />
+    <glyph glyph-name="ion-navigate" unicode="&#xf2a3;" 
+d="M448 416l-192 -448v256h-256z" />
+    <glyph glyph-name="ion-network" unicode="&#xf341;" horiz-adv-x="384" 
+d="M384 352c0 -24 -13 -44 -32 -55v-93l-128 -64v-53c19 -11 32 -31 32 -55c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v53l-128 64v93c-19 11 -32 31 -32 55c0 35 29 64 64 64s64 -29 64 -64c0 -24 -13 -44 -32 -55v-53l96 -48l96 48v53c-19 11 -32 31 -32 55
+c0 35 29 64 64 64s64 -29 64 -64zM64 384c-18 0 -32 -14 -32 -32s14 -32 32 -32s32 14 32 32s-14 32 -32 32zM192 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM320 320c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+    <glyph glyph-name="ion-no-smoking" unicode="&#xf2c2;" 
+d="M328 144v48h16v-48h-16zM80 144v48h90l48 -48h-138zM332 388c69 -38 116 -112 116 -196c0 -124 -100 -224 -224 -224c-24 0 -47 4 -68 11c-2 1 -3 1 -5 2c-12 4 -24 9 -35 15h-1c-69 38 -115 112 -115 196c0 124 100 224 224 224c24 0 47 -4 68 -11c2 -1 3 -1 5 -2
+c12 -4 24 -9 35 -15v0zM224 22c37 0 72 12 100 32l-238 238c-20 -28 -32 -63 -32 -100c0 -65 36 -121 90 -150c6 -3 13 -7 19 -9c2 -1 3 -1 5 -2c9 -3 19 -5 29 -7c9 -2 18 -2 27 -2zM362 93c20 28 32 62 32 99c0 66 -37 123 -91 151c-6 3 -12 6 -18 8c-2 1 -3 1 -5 2
+c-9 3 -19 5 -29 7c-9 2 -18 2 -27 2c-37 0 -71 -12 -99 -32zM320 150l-42 42h42v-42zM352 144v48h16v-48h-16zM328 235c16 -7 16 -27 16 -34v-1h-16v1c0 8 -1 17 -7 20c-4 2 -13 4 -39 4h-3c-13 0 -24 0 -33 13c-5 8 -5 19 -2 29c-4 1 -8 1 -12 3c-17 7 -26 20 -26 38
+c0 33 27 44 39 44v-16c-1 0 -23 -2 -23 -28c0 -11 5 -19 16 -23c9 -4 18 -3 18 -3c3 0 6 -2 7 -5s2 -6 0 -8c-5 -7 -7 -18 -4 -22c4 -6 7 -6 20 -6h3c24 0 37 -2 46 -6zM368 200v0h-16c0 28 -4 41 -7 46c-6 10 -14 14 -25 14h-30c-3 0 -5 2 -6 4s-1 6 0 8c0 0 8 18 6 32
+c-1 8 -6 17 -27 17v16c24 0 40 -11 43 -30c2 -11 0 -23 -3 -31h17c16 0 30 -8 39 -22c6 -10 9 -28 9 -54z" />
+    <glyph glyph-name="ion-nuclear" unicode="&#xf2a4;" 
+d="M176 176c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM176 176c0 32 16 48 48 48s48 -16 48 -48s-16 -48 -48 -48s-48 16 -48 48zM448 176c0 -27 -5 -53 -15 -78s-23 -47 -40 -66s-36 -35 -59 -48l-79 136c22 12 33 31 33 56h160zM224 240
+c-12 0 -23 -3 -33 -9l-80 138c35 20 73 31 113 31s78 -10 113 -30l-81 -139c-10 6 -21 9 -32 9zM160 176c0 -25 11 -44 33 -56l-79 -136c-35 20 -62 46 -83 80s-31 71 -31 112h160z" />
+    <glyph glyph-name="ion-outlet" unicode="&#xf342;" 
+d="M338 416c61 0 110 -51 110 -113v-222c0 -62 -49 -113 -110 -113h-228c-61 0 -110 51 -110 113v222c0 62 49 113 110 113h228zM143 197v102c0 11 -9 21 -20 21h-23c-11 0 -19 -9 -20 -20v-2v-101v-1c0 -11 9 -20 20 -20h23c11 0 20 9 20 20v1zM265 52v29
+c0 23 -18 42 -41 42s-41 -19 -41 -42v-29v0c0 -11 9 -20 20 -20h21h21c11 0 20 7 20 18v2zM368 197v102c0 11 -9 21 -20 21h-24c-11 0 -19 -9 -20 -20v-2v-101v-1c0 -11 9 -20 20 -20h24c11 0 20 9 20 20v1z" />
+    <glyph glyph-name="ion-paintbrush" unicode="&#xf4d5;" 
+d="M118 165c52 0 102 -41 90 -102c-11 -52 -54 -71 -90 -77c-30 -5 -100 0 -118 35c24 9 34 26 34 49c0 49 32 95 84 95zM436 388c13 -13 17 -30 5 -45l-154 -175c2 -9 1 -17 -3 -23l-50 -58v0v0c-2 -2 -4 -2 -6 0c-1 1 -1 2 -1 3v1c2 53 -41 87 -89 90v0h-2s-2 0 -2 1
+c-2 2 -2 4 0 6l59 49c6 4 14 4 23 2l175 154c15 12 32 8 45 -5zM134 188v0v0v0z" />
+    <glyph glyph-name="ion-paintbucket" unicode="&#xf4d6;" horiz-adv-x="480" 
+d="M112 384l32 32l275 -276l-58 -12l-163 -160l-198 192l152 152zM309 160l-110 110l-110 -110h220zM419 140c0 0 61 -66 61 -99s-27 -60 -61 -60s-60 27 -60 60s60 99 60 99z" />
+    <glyph glyph-name="ion-paper-airplane" unicode="&#xf2c3;" 
+d="M0 176l448 240l-112 -448l-112 112l-80 -112l-16 160zM319 31l80 323l-322 -173l83 -31l192 154l-128 -176z" />
+    <glyph glyph-name="ion-paperclip" unicode="&#xf20f;" horiz-adv-x="160" 
+d="M149 293c6 0 11 -5 11 -12v-195c0 -28 -10 -49 -24 -63c-15 -15 -36 -23 -56 -23c-40 0 -80 31 -80 88v234c0 24 11 44 29 54s39 11 57 0s29 -30 29 -54l-1 -225c0 -13 -3 -24 -9 -32s-16 -12 -25 -12c-17 0 -34 15 -34 44v173c0 6 6 12 12 12s11 -6 11 -12v-173
+c0 -14 5 -21 11 -21c2 0 5 2 7 4c3 4 5 10 5 17v225c0 15 -6 28 -17 34s-24 6 -35 0s-17 -19 -17 -34v-234c0 -44 29 -64 57 -64s57 19 57 63v195c0 6 6 11 12 11z" />
+    <glyph glyph-name="ion-pause" unicode="&#xf210;" horiz-adv-x="256" 
+d="M96 12c0 -7 -5 -12 -12 -12h-72c-7 0 -12 5 -12 12v360c0 7 5 12 12 12h72c7 0 12 -5 12 -12v-360zM244 384c7 0 12 -5 12 -12v-360c0 -7 -5 -12 -12 -12h-72c-7 0 -12 5 -12 12v360c0 7 5 12 12 12h72z" />
+    <glyph glyph-name="ion-person-add" unicode="&#xf211;" 
+d="M397 120h-42v51h-51v42h51v51h42v-51h51v-42h-51v-51zM384 0h-192h-192s0 26 2 40c2 11 17 25 81 49c63 23 60 12 60 55c0 28 -14 11 -23 64c-4 21 -6 7 -14 40c-4 17 3 19 2 27s-2 16 -4 33c-2 21 18 76 88 76s90 -55 88 -76c-2 -17 -3 -25 -4 -33s6 -10 2 -27
+c-8 -33 -10 -19 -14 -40c-9 -53 -23 -36 -23 -64c0 -43 -3 -32 60 -55c64 -24 79 -38 81 -49c2 -14 2 -40 2 -40z" />
+    <glyph glyph-name="ion-person-stalker" unicode="&#xf212;" 
+d="M393 123c42 -16 52 -26 53 -33c2 -9 2 -90 2 -90h-98c0 18 0 71 -1 77c-1 10 -1 29 -55 50c-8 3 -14 5 -19 7c18 8 15 15 15 28c0 19 -9 11 -15 47c-2 14 -4 5 -9 28c-3 12 1 12 1 18s-1 10 -2 22c-1 14 11 52 57 52s59 -38 58 -52c-1 -12 -2 -16 -2 -22
+c-1 -6 4 -6 1 -18c-5 -23 -7 -14 -9 -28c-6 -36 -16 -28 -16 -47c0 -29 -2 -23 39 -39zM325 0h-163h-162s0 65 2 77c2 10 15 22 69 43c54 20 50 17 50 55c0 24 -12 8 -20 54c-3 18 -5 7 -11 36c-3 15 2 16 1 23s-2 14 -3 29c-2 19 15 67 74 67s77 -49 75 -67
+c-1 -15 -2 -22 -3 -29s5 -8 2 -23c-6 -29 -9 -18 -12 -36c-8 -46 -20 -30 -20 -54c0 -32 -2 -36 31 -48c6 -2 11 -4 19 -7c54 -21 67 -33 69 -43c1 -6 2 -28 2 -47v-30z" />
+    <glyph glyph-name="ion-person" unicode="&#xf213;" horiz-adv-x="384" 
+d="M384 0h-192h-192s0 26 2 40c2 11 17 25 81 49c63 23 60 12 60 55c0 28 -14 11 -23 64c-4 21 -6 7 -14 40c-4 17 3 19 2 27s-2 16 -4 33c-2 21 18 76 88 76s90 -55 88 -76c-2 -17 -3 -25 -4 -33s6 -10 2 -27c-8 -33 -10 -19 -14 -40c-9 -53 -23 -36 -23 -64
+c0 -43 -3 -32 60 -55c64 -24 79 -38 81 -49c2 -14 2 -40 2 -40z" />
+    <glyph glyph-name="ion-pie-graph" unicode="&#xf2a5;" 
+d="M1 192c0 5 -1 11 -1 16c0 115 93 208 208 208c5 0 11 -1 16 -1v-32v-191h-191h-32zM78 46c-26 32 -42 71 -45 114h223v223c43 -3 82 -19 114 -45c47 -38 78 -96 78 -162c0 -115 -93 -208 -208 -208c-66 0 -124 31 -162 78z" />
+    <glyph glyph-name="ion-pin" unicode="&#xf2a6;" horiz-adv-x="224" 
+d="M188 220c20 -10 36 -31 36 -55c0 -17 -3 -21 -15 -21h-81l-12 -176h-8l-12 176h-81c-12 0 -15 5 -15 21c0 24 16 45 36 55v0c1 0 3 1 4 2c7 4 12 11 14 19l18 118v5c0 7 -4 10 -10 13v0c-1 0 -1 1 -2 1c-7 3 -12 9 -12 17c0 20 6 21 18 21h92c12 0 18 -1 18 -21
+c0 -8 -5 -14 -12 -17c-1 0 -1 -1 -2 -1v0c-6 -3 -10 -6 -10 -13v-5l18 -118c2 -8 7 -15 14 -19c1 -1 3 -2 4 -2v0z" />
+    <glyph glyph-name="ion-pinpoint" unicode="&#xf2a7;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c32 32 51 75 55 120l-63 8v16l63 8c-4 45 -23 88 -55 120s-75 51 -120 55l-8 -63h-16l-8 63c-45 -4 -88 -23 -120 -55s-51 -75 -55 -120l63 -8v-16l-63 -8
+c4 -45 23 -88 55 -120s75 -51 120 -55l8 63h16l8 -63c45 4 88 23 120 55z" />
+    <glyph glyph-name="ion-pizza" unicode="&#xf2a8;" horiz-adv-x="352" 
+d="M315 318c10 -4 12 -13 9 -20l-148 -330s-143 320 -148 331s2 16 9 19c39 18 90 28 139 28s96 -9 139 -28zM112 256c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM176 109c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM240 224
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM342 382c6 -3 10 -6 10 -13c0 -1 0 -3 -1 -5l-8 -19c-3 -5 -8 -9 -14 -9c-1 0 -3 1 -6 2c-41 18 -95 30 -147 30s-102 -11 -147 -30c-3 -1 -4 -2 -6 -2c-6 0 -11 4 -14 9l-8 19s-1 2 -1 5c0 8 6 12 10 14
+c49 21 107 33 166 33s118 -13 166 -34z" />
+    <glyph glyph-name="ion-plane" unicode="&#xf214;" 
+d="M250 136c0 -7 1 -69 -6 -102c-1 -4 3 -4 5 -7l51 -33c2 -2 3 -8 3 -8l1 -18l-68 16l-12 -32l-12 32l-68 -16l1 18s0 6 2 8l52 33c2 3 6 3 5 7c-7 33 -6 95 -6 102s-8 5 -8 5l-62 -13l-128 -49c0 23 2 26 9 31l183 131s5 63 5 113c0 24 12 78 27 78s27 -54 27 -78
+c0 -53 5 -113 5 -113l183 -131c6 -4 9 -7 9 -31l-128 49l-62 13s-8 2 -8 -5z" />
+    <glyph glyph-name="ion-planet" unicode="&#xf343;" horiz-adv-x="512" 
+d="M96 182c39 -24 85 -48 134 -69c44 -19 87 -35 126 -46c-27 -22 -62 -35 -100 -35c-85 0 -155 66 -160 150zM107 251c1 4 3 8 5 11c10 21 26 40 44 55c27 22 62 35 100 35c85 0 155 -66 160 -150v-10c0 -21 -4 -41 -11 -59c-1 -4 -3 -8 -5 -11c-6 1 -13 3 -19 5
+c-39 11 -82 26 -126 45c-56 24 -108 52 -148 79zM430 163c57 -35 87 -62 81 -82c-4 -12 -19 -17 -44 -17c-50 0 -136 23 -231 64c-141 61 -246 140 -235 175c4 12 20 20 44 17c22 -3 47 -9 73 -18c-8 -9 -8 -12 -14 -22c-23 5 -44 8 -59 8h-6c2 -2 5 -6 8 -9
+c11 -11 27 -24 46 -37c41 -29 97 -59 156 -85c44 -19 89 -35 128 -46c36 -10 68 -15 90 -15h6c-2 2 -5 6 -8 9c-10 10 -24 22 -41 34c4 11 5 12 6 24z" />
+    <glyph glyph-name="ion-play" unicode="&#xf215;" horiz-adv-x="320" 
+d="M309 215c7 -6 11 -14 11 -23s-4 -17 -11 -23l-278 -166c-4 -2 -7 -3 -11 -3c-11 0 -20 9 -20 20v0v344v0c0 11 9 20 20 20c4 0 8 -1 11 -3z" />
+    <glyph glyph-name="ion-playstation" unicode="&#xf30a;" horiz-adv-x="512" 
+d="M400 245c0 -11 0 -22 -2 -33c-2 -10 -5 -20 -10 -28c-4 -7 -10 -13 -18 -17c-7 -4 -16 -6 -24 -6c-13 0 -31 4 -42 9v131v2c0 9 -7 17 -15 17h-1c-9 0 -16 -8 -16 -17v-3v-300l-80 26v358s28 -4 75 -18s67 -21 84 -31c8 -5 15 -11 21 -17c7 -7 13 -14 17 -23
+c8 -16 10 -33 11 -50zM87 90c-4 -2 -8 -3 -11 -6c-1 -1 -3 -3 -2 -5s4 -4 6 -5c6 -2 13 -3 19 -3c7 0 15 0 22 2c5 1 9 3 14 5c30 10 41 12 41 12v-42c-14 -2 -36 -4 -50 -4c-30 -1 -60 4 -88 13c-9 3 -19 6 -27 12c-4 3 -8 8 -10 13c-2 4 -1 9 1 13s5 8 9 11
+c9 6 18 10 28 14c8 4 17 7 26 10c35 12 111 37 111 37v-47s-62 -20 -89 -30zM512 102c0 -5 -2 -9 -5 -13c-6 -7 -14 -11 -22 -15s-17 -8 -26 -11c-54 -19 -171 -59 -171 -59v48s92 30 133 44c6 2 11 4 16 8c2 2 4 3 3 6c-1 2 -4 4 -6 5c-6 2 -13 3 -19 3
+c-10 0 -20 -2 -30 -5c-29 -10 -97 -32 -97 -32v49s45 14 67 16c8 1 23 1 31 1c26 0 54 -3 79 -11c5 -2 8 -3 14 -5c9 -3 18 -8 25 -14c4 -4 8 -9 8 -15z" />
+    <glyph glyph-name="ion-plus-circled" unicode="&#xf216;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM352 176v32h-112v112h-32v-112h-112v-32h112v-112h32v112h112z" />
+    <glyph glyph-name="ion-plus-round" unicode="&#xf217;" horiz-adv-x="384" 
+d="M353 224c17 0 31 -14 31 -32s-14 -32 -31 -32h-129v-129c0 -17 -14 -31 -32 -31s-32 14 -32 31v129h-129c-17 0 -31 14 -31 32s14 32 31 32h129v129c0 17 14 31 32 31s32 -14 32 -31v-129h129z" />
+    <glyph glyph-name="ion-plus" unicode="&#xf218;" horiz-adv-x="384" 
+d="M384 224v-64h-160v-160h-64v160h-160v64h160v160h64v-160h160z" />
+    <glyph glyph-name="ion-podium" unicode="&#xf344;" 
+d="M0 0v192h128v-192h-128zM160 0v288h128v-288h-128zM320 0v128h128v-128h-128z" />
+    <glyph glyph-name="ion-pound" unicode="&#xf219;" 
+d="M93 96h-93v54h101l13 84h-99v54h107l22 128h64l-22 -128h106l22 128h63l-22 -128h93v-54h-102l-12 -84h99v-54h-107l-22 -128h-63l22 128h-107l-22 -128h-63zM177 234l-12 -84h106l12 84h-106v0z" />
+    <glyph glyph-name="ion-power" unicode="&#xf2a9;" 
+d="M224 192c-18 0 -32 14 -32 32v160c0 18 14 32 32 32s32 -14 32 -32v-160c0 -18 -14 -32 -32 -32zM347 379c61 -40 101 -109 101 -187c0 -124 -100 -224 -224 -224s-224 100 -224 224c0 78 40 147 101 187v0c5 3 11 5 17 5c18 0 32 -14 32 -32c0 -6 -2 -12 -5 -17
+c-2 -3 -4 -6 -7 -8c-1 -1 -3 -2 -4 -3c-8 -6 -16 -12 -23 -19c-30 -30 -47 -70 -47 -113s17 -83 47 -113s70 -47 113 -47s83 17 113 47s47 70 47 113s-17 83 -47 113c-7 7 -15 13 -23 19c-1 1 -3 2 -4 3c-3 2 -5 5 -7 8c-3 5 -5 11 -5 17c0 18 14 32 32 32c6 0 12 -2 17 -5
+v0z" />
+    <glyph glyph-name="ion-pricetag" unicode="&#xf2aa;" 
+d="M439 187c12 -12 12 -31 0 -43l-165 -167c-11 -11 -30 -11 -42 -1l-3 3l-206 209l-6 5c-6 7 -9 15 -10 24v0v2v0l-7 98v4v0c0 12 4 24 13 33l49 49c8 9 20 13 31 13h4l100 -4v0c12 0 22 -4 30 -12v0l2 -2v0l210 -211v0v0zM112 256c26 0 48 22 48 48s-22 48 -48 48
+s-48 -22 -48 -48s22 -48 48 -48z" />
+    <glyph glyph-name="ion-pricetags" unicode="&#xf2ab;" 
+d="M440 209c10 -11 11 -28 0 -39l-29 -29c11 11 10 28 0 39v0v0l-190 191v0l-1 1h-1c-8 7 -16 12 -27 12v0l-90 3h-4c-9 0 -19 -3 -26 -10l28 27c8 8 17 12 27 12h4l90 -4v0c11 0 19 -4 27 -11h1l1 -1v0l190 -191v0v0zM396 166v0c11 -11 11 -29 0 -40l-108 -109v1l-26 -27
+l-2 -2l-13 -13c-10 -10 -26 -10 -37 -1l-3 3l-186 188l-5 5c-5 6 -9 14 -10 22v0v2v0l-6 88v3v1c0 11 4 21 12 29l44 45l1 1l1 1c7 6 17 9 26 9h4l90 -3v0c11 0 19 -4 27 -11v0l2 -1v0l189 -191v0zM79 308c-12 -8 -21 -21 -21 -37c0 -24 19 -43 43 -43c16 0 29 9 37 21
+c4 7 7 14 7 22c0 24 -20 44 -44 44c-8 0 -15 -3 -22 -7z" />
+    <glyph glyph-name="ion-printer" unicode="&#xf21a;" 
+d="M392 320c28 0 56 -19 56 -55v-131c0 -31 -28 -54 -56 -54h-40v-112h-8h-8h-224h-11h-5v112h-40c-28 0 -56 24 -56 62v123c0 38 28 55 56 55h40v64h256v-64h40zM336 -16v176h-224v-176h224zM336 320v48h-224v-48h224zM384 256v16h-17v-16h17zM128 112v16h192v-16h-192z
+M128 64v16h192v-16h-192zM128 16v16h192v-16h-192z" />
+    <glyph glyph-name="ion-pull-request" unicode="&#xf345;" horiz-adv-x="384" 
+d="M64 384c35 0 64 -29 64 -64c0 -24 -13 -44 -32 -55v-178c19 -11 32 -31 32 -55c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 24 13 44 32 55v178c-19 11 -32 31 -32 55c0 35 29 64 64 64zM64 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM64 288
+c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32zM351 88c20 -11 33 -32 33 -56c0 -35 -29 -64 -64 -64s-64 29 -64 64c0 23 12 44 31 55v156c0 16 -4 26 -11 33c-10 9 -26 12 -52 12v-64l-96 96l96 96v-64c42 1 74 -8 96 -29c21 -19 31 -46 31 -80v-155z
+M320 0c18 0 32 14 32 32s-14 32 -32 32s-32 -14 -32 -32s14 -32 32 -32z" />
+    <glyph glyph-name="ion-qr-scanner" unicode="&#xf346;" horiz-adv-x="416" 
+d="M48 324v-68h-48v68c0 33 28 60 61 60h67v-48h-68c-7 0 -12 -5 -12 -12zM356 384c33 0 60 -27 60 -60v-68h-48v68c0 7 -6 12 -13 12h-67v48h68zM368 61v67h48v-67c0 -33 -27 -61 -60 -61h-68v49h68c7 0 12 5 12 12zM60 49h68v-49h-67c-33 0 -61 28 -61 61v67h48v-67
+c0 -7 5 -12 12 -12z" />
+    <glyph glyph-name="ion-quote" unicode="&#xf347;" horiz-adv-x="384" 
+d="M128 384c-41 0 -73 -11 -95 -33s-33 -54 -33 -95v-256h160v256h-96c0 23 5 39 15 49s26 15 49 15zM352 384c-41 0 -73 -11 -95 -33s-33 -54 -33 -95v-256h160v256h-96c0 23 5 39 15 49s26 15 49 15z" />
+    <glyph glyph-name="ion-radio-waves" unicode="&#xf2ac;" 
+d="M160 192c0 43 21 64 64 64s64 -21 64 -64s-21 -64 -64 -64s-64 21 -64 64zM112 192c0 -18 5 -35 13 -50s19 -28 33 -37l-23 -25c-6 5 -13 10 -18 16c-25 26 -37 59 -37 96s12 70 37 96c5 6 12 11 18 16l23 -25c-14 -9 -25 -22 -33 -37s-13 -32 -13 -50zM336 192
+c0 18 -5 35 -13 50s-19 28 -33 37l23 25c6 -5 13 -10 18 -16c25 -26 37 -59 37 -96s-12 -70 -37 -96c-5 -6 -12 -11 -18 -16l-23 25c14 9 25 22 33 37s13 32 13 50zM32 192c0 -27 6 -53 17 -77s27 -43 47 -59l-23 -24c-6 5 -12 10 -17 16c-18 19 -31 41 -41 65
+c-10 25 -15 51 -15 79s5 54 15 79c10 24 23 46 41 65c5 6 11 11 17 16l23 -24c-10 -8 -18 -17 -26 -27s-14 -21 -20 -32s-10 -24 -13 -37s-5 -26 -5 -40zM416 192c0 27 -6 53 -17 77s-27 43 -47 59l23 24c6 -5 12 -10 17 -16c18 -19 31 -41 41 -65c10 -25 15 -51 15 -79
+s-5 -54 -15 -79c-10 -24 -23 -46 -41 -65c-4 -5 -10 -10 -17 -16l-23 24c20 16 36 35 47 59s17 50 17 77z" />
+    <glyph glyph-name="ion-record" unicode="&#xf21b;" horiz-adv-x="416" 
+d="M208 -16c-115 0 -208 93 -208 208s93 208 208 208s208 -93 208 -208s-93 -208 -208 -208z" />
+    <glyph glyph-name="ion-refresh" unicode="&#xf21c;" 
+d="M352 96l-104 112h74c-7 65 -64 112 -130 112c-71 0 -128 -57 -128 -128s57 -128 128 -128c28 0 53 8 75 24l6 5l43 -46l-7 -6c-34 -26 -74 -41 -117 -41c-91 0 -167 64 -187 149v0c0 1 -1 2 -1 3v1v2s-1 2 -1 3v1c0 1 -1 3 -1 4v0c-1 6 -2 13 -2 19v1v4v5v5v4v1
+c0 6 1 13 2 19v0c0 1 1 3 1 4v1c0 1 1 1 1 2v3v1c0 1 1 2 1 3v0c20 85 96 149 187 149v0v0c11 0 21 -1 31 -3h2h2c57 -10 106 -47 133 -96c13 -23 21 -49 23 -77h65z" />
+    <glyph glyph-name="ion-reply-all" unicode="&#xf21d;" horiz-adv-x="416" 
+d="M257 256c153 0 159 -208 159 -208c-51 93 -91 102 -159 102v-92l-152 134l152 144v-80zM0 192l144 136v-57l-82 -79l82 -68v-58z" />
+    <glyph glyph-name="ion-reply" unicode="&#xf21e;" horiz-adv-x="384" 
+d="M384 48c-53 93 -122 102 -224 102v-92l-160 134l160 144v-80c187 0 224 -208 224 -208z" />
+    <glyph glyph-name="ion-ribbon-a" unicode="&#xf348;" horiz-adv-x="352" 
+d="M272 416l80 -96l-64 -134c-24 30 -59 49 -99 53zM80 416l83 -177c-40 -4 -75 -23 -99 -53l-64 134zM189 416h67l-53 -112h-27h-27l-53 112h80h13zM176 224c71 0 128 -57 128 -128s-57 -128 -128 -128s-128 57 -128 128s57 128 128 128zM176 0c53 0 96 43 96 96
+s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96zM176 184c49 0 88 -39 88 -88s-39 -88 -88 -88s-88 39 -88 88s39 88 88 88z" />
+    <glyph glyph-name="ion-ribbon-b" unicode="&#xf349;" horiz-adv-x="384" 
+d="M192 376c49 0 88 -39 88 -88s-39 -88 -88 -88s-88 39 -88 88s39 88 88 88zM192 416c71 0 128 -57 128 -128s-57 -128 -128 -128s-128 57 -128 128s57 128 128 128zM192 192c53 0 96 43 96 96s-43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96zM83 194c26 -30 65 -50 109 -50
+c12 0 23 1 34 4l-34 -74l-48 -106l-48 80h-96zM301 194l83 -146h-96l-48 -80l-40 88l45 98c22 9 41 23 56 40z" />
+    <glyph glyph-name="ion-sad-outline" unicode="&#xf4d7;" 
+d="M367 164c3 -9 -2 -17 -11 -19c-3 -1 -7 0 -10 1c-5 2 -9 5 -11 10s-4 12 -13 15s-14 0 -19 -3c-4 -3 -10 -3 -15 -1c-3 1 -7 3 -9 6c-6 8 -3 17 5 22c15 9 29 13 49 6s29 -21 34 -37zM165 195c8 -5 10 -14 4 -22c-2 -3 -6 -5 -9 -6c-5 -2 -11 -2 -15 1c-5 3 -10 6 -19 3
+s-11 -10 -13 -15s-6 -8 -11 -10c-3 -1 -7 -2 -10 -1c-9 2 -14 10 -11 19c5 16 14 30 34 37s35 3 50 -6zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56
+s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136s85 -56 136 -56s100 20 136 56zM317 89c5 -7 3 -17 -4 -22c-3 -2 -6 -3 -9 -3c-5 0 -10 3 -13 7c0 0 -19 25 -67 25s-67 -25 -67 -25c-3 -4 -8 -7 -13 -7c-3 0 -6 1 -9 3c-7 5 -9 15 -4 22c1 2 28 39 93 39
+s92 -37 93 -39z" />
+    <glyph glyph-name="ion-sad" unicode="&#xf34a;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM113 156c2 5 4 12 13 15s14 0 19 -3c4 -3 10 -3 15 -1c3 1 7 3 9 6c6 8 4 17 -4 22c-15 9 -30 13 -50 6s-29 -21 -34 -37c-3 -9 2 -17 11 -19c3 -1 7 0 10 1c5 2 9 5 11 10z
+M313 67c7 5 9 15 4 22c-1 2 -28 39 -93 39s-92 -37 -93 -39c-5 -7 -3 -17 4 -22c3 -2 6 -3 9 -3c5 0 10 3 13 7c0 0 19 25 67 25s67 -25 67 -25c3 -4 8 -7 13 -7c3 0 6 1 9 3zM356 145c9 2 14 10 11 19c-5 16 -14 30 -34 37s-34 3 -49 -6c-8 -5 -11 -14 -5 -22
+c2 -3 6 -5 9 -6c5 -2 11 -2 15 1c5 3 10 6 19 3s11 -10 13 -15s6 -8 11 -10c3 -1 7 -2 10 -1z" />
+    <glyph glyph-name="ion-scissors" unicode="&#xf34b;" horiz-adv-x="384" 
+d="M341 332c-13 -33 -117 -172 -117 -172l-32 -32s-31 -13 -50 -43s-33 -71 -33 -71v0c-7 -26 -28 -46 -53 -46c-31 0 -56 29 -56 64s25 64 56 64c13 0 25 -5 34 -13c2 -1 3 -3 4 -4v0l2 -2c4 -4 7 -2 14 11c8 15 17 35 27 54s38 59 38 59l17 23l144 192
+c23 -20 18 -51 5 -84zM56 0c15 0 28 14 28 32s-13 32 -28 32s-28 -14 -28 -32s13 -32 28 -32zM192 160c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM143 183c-30 41 -90 125 -100 149c-13 33 -18 64 5 84l134 -178l-3 -4v0v0l-17 -23v-1v0
+c-1 -1 -10 -13 -19 -27zM328 96c31 0 56 -29 56 -64s-25 -64 -56 -64c-25 0 -47 20 -54 46v0s-13 41 -32 71c-11 17 -26 28 -36 35l29 29l1 1h1c1 1 1 2 2 4c3 -4 5 -9 7 -12c10 -19 20 -39 28 -54c7 -13 10 -15 14 -11c1 1 0 1 1 2h1c1 1 2 3 4 4c9 8 21 13 34 13zM328 0
+c15 0 28 14 28 32s-13 32 -28 32s-28 -14 -28 -32s13 -32 28 -32z" />
+    <glyph glyph-name="ion-search" unicode="&#xf21f;" horiz-adv-x="384" 
+d="M381 61c4 -4 4 -10 0 -14l-43 -44c-2 -2 -5 -3 -8 -3s-5 1 -7 3l-84 86c-25 -15 -52 -23 -80 -23c-87 0 -159 71 -159 159s72 159 159 159s158 -71 158 -159c0 -27 -7 -54 -21 -78zM159 322c-53 0 -97 -43 -97 -97s44 -97 97 -97s96 43 96 97s-43 97 -96 97z" />
+    <glyph glyph-name="ion-settings" unicode="&#xf2ad;" horiz-adv-x="416" 
+d="M402 310c10 -6 15 -25 14 -36c-1 -17 -7 -36 -25 -54c-1 -1 -2 -1 -3 -2c-26 -25 -62 -30 -94 -20c-1 1 -2 2 -4 2c-5 1 -10 0 -13 -4l-36 -39c52 -50 107 -96 107 -96c2 -2 2 -5 0 -7l-50 -51c-2 -2 -5 -2 -7 0c0 0 -44 55 -93 107l-92 -98c-14 -16 -40 -15 -55 0
+c-15 16 -15 42 1 56l97 93l-12 12c-2 2 -3 7 -1 10l2 5c-25 26 -36 33 -56 32s-36 -13 -48 -28s-10 -52 -8 -62s-7 -6 -12 0c-9 10 -23 50 -6 93s42 69 48 75s16 15 24 21s21 -1 27 5c4 4 5 11 5 16l-4 4c-2 2 -2 5 0 7l31 31c2 2 5 2 7 0l50 -50c2 -2 2 -6 0 -8l-31 -31
+c-2 -2 -5 -2 -7 0l-8 9c-7 0 -15 -5 -17 -10c-3 -6 -6 -21 -3 -33c3 -11 13 -20 36 -43l5 3c4 2 8 1 10 -1c0 0 1 -2 13 -14l38 37c4 3 5 7 4 13c0 2 0 4 -1 5c-10 33 -6 69 19 96l2 2c18 18 36 25 53 26c10 1 30 -5 35 -15l-48 -48l-2 -3l-1 -1c-1 -1 -1 -2 -1 -4
+s0 -3 1 -5l2 -2l2 -2l41 -42l3 -3l1 -1c1 -1 2 -1 4 -1s3 0 4 1l2 1l2 3z" />
+    <glyph glyph-name="ion-share" unicode="&#xf220;" horiz-adv-x="384" 
+d="M288 70v59l38 31v-109c0 -11 -8 -19 -19 -19h-288c-11 0 -19 9 -19 19v218c0 11 8 19 19 19h120c-29 -18 -43 -38 -43 -38h-58v-180h250zM256 224c-84 0 -116 -24 -160 -96c0 0 5 164 160 164v60l128 -96l-128 -96v64z" />
+    <glyph glyph-name="ion-shuffle" unicode="&#xf221;" 
+d="M338 267c-52 0 -83 -43 -120 -92c-41 -55 -88 -120 -171 -120h-47v63h47c52 0 84 47 121 96c41 55 87 116 170 116h29v54l81 -81l-81 -84v48h-29zM121 230c-21 21 -42 35 -74 36c-34 1 -47 0 -47 0v63h47c48 0 83 -20 113 -48c-10 -12 -19 -24 -28 -36
+c-4 -5 -7 -10 -11 -15zM367 118v47l81 -84l-81 -81v54h-29c-50 0 -87 23 -117 53c12 14 22 28 32 41c2 3 5 6 7 9c22 -24 46 -39 78 -39h29z" />
+    <glyph glyph-name="ion-skip-backward" unicode="&#xf222;" horiz-adv-x="384" 
+d="M12 352h8c7 0 12 -5 12 -12v-113l187 122c2 2 5 3 8 3c8 0 16 -7 16 -17v-63l118 78c2 2 5 2 8 2c8 0 15 -7 15 -17v-286c0 -10 -7 -17 -15 -17c-3 0 -5 1 -8 3l-118 78v-64c0 -10 -8 -17 -16 -17c-3 0 -5 1 -8 3l-187 122v-113c0 -7 -5 -12 -12 -12h-8
+c-7 0 -12 5 -12 12v296c0 7 5 12 12 12z" />
+    <glyph glyph-name="ion-skip-forward" unicode="&#xf223;" horiz-adv-x="384" 
+d="M372 352c7 0 12 -5 12 -12v-296c0 -7 -5 -12 -12 -12h-8c-7 0 -12 5 -12 12v113l-187 -122c-3 -2 -5 -3 -8 -3c-8 0 -15 7 -15 17v64l-119 -78c-3 -2 -5 -3 -8 -3c-8 0 -15 7 -15 17v286c0 10 7 17 15 17c3 0 6 0 8 -2l119 -78v63c0 10 7 17 15 17c3 0 6 -1 8 -3
+l187 -122v113c0 7 5 12 12 12h8z" />
+    <glyph glyph-name="ion-social-android-outline" unicode="&#xf224;" horiz-adv-x="352" 
+d="M272 240h-192v-60v-89h24h16v-15v-52c0 -4 4 -8 8 -8s8 4 8 8v52v15h17h49h15v-15v-52c0 -2 1 -4 3 -6h1v0c1 -1 2 -2 4 -2h1v0v0c4 0 7 4 7 8v52v15h17h22v89v60zM288 256v0v-76v-90c0 -7 -3 -15 -10 -15h-29v-51c0 -13 -10 -24 -23 -24v0h-1c-6 0 -11 2 -15 5
+c-5 4 -9 11 -9 19v51h-49v-51c0 -13 -11 -24 -24 -24s-24 11 -24 24v51h-28c-7 0 -12 8 -12 15v90v76h224zM328 256c-4 0 -8 -4 -8 -8v-96c0 -4 4 -8 8 -8s8 4 8 8v96c0 4 -4 8 -8 8zM328 272v0c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24s-24 11 -24 24v96
+c0 13 11 24 24 24zM24 256c-4 0 -8 -4 -8 -8v-96c0 -4 4 -8 8 -8s8 4 8 8v96c0 4 -4 8 -8 8zM24 272v0c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24s-24 11 -24 24v96c0 13 11 24 24 24zM175 354c-14 0 -27 -3 -38 -6l-10 -4c-28 -12 -40 -37 -44 -56h186
+c-4 18 -15 43 -44 56l-10 4c-12 4 -25 6 -39 6v0v0h-1zM105 384v0h1l19 -23c13 5 30 9 50 9h1c20 0 36 -4 50 -9l20 23v0s1 -1 2 -1c1 -1 2 -3 2 -3l-19 -22c48 -21 56 -71 57 -86h-224c1 15 9 66 57 87l-19 22c0 1 1 1 2 2zM127 309c-7 0 -14 6 -14 13s6 14 14 14
+c7 0 13 -7 13 -14s-5 -13 -13 -13zM225 309c-7 0 -13 6 -13 13s5 14 13 14c7 0 13 -7 13 -14s-6 -13 -13 -13z" />
+    <glyph glyph-name="ion-social-android" unicode="&#xf225;" horiz-adv-x="352" 
+d="M64 180v76h224v-76v-90c0 -7 -4 -14 -11 -14h-28v-52c0 -13 -11 -24 -24 -24v0h-1c-6 0 -10 2 -14 5c-5 4 -9 11 -9 19v52h-49v-52c0 -13 -11 -24 -24 -24s-24 11 -24 24v52h-29c-7 0 -11 7 -11 14v90zM328 272c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24
+s-24 11 -24 24v96c0 13 11 24 24 24zM24 272c13 0 24 -11 24 -24v-96c0 -13 -11 -24 -24 -24s-24 11 -24 24v96c0 13 11 24 24 24zM231 359c48 -21 56 -72 57 -87h-224c1 15 8 66 56 87l-18 22c0 1 0 1 1 2s3 1 3 1l19 -23c14 5 31 9 51 9s36 -4 50 -9l20 23c0 1 1 0 2 -1
+l2 -2zM127 309c8 0 13 6 13 13s-6 14 -13 14c-8 0 -14 -7 -14 -14s7 -13 14 -13zM225 309c7 0 14 6 14 13s-7 14 -14 14c-8 0 -13 -7 -13 -14s6 -13 13 -13z" />
+    <glyph glyph-name="ion-social-angular-outline" unicode="&#xf4d8;" 
+d="M224 384l-188 -69l39 -230l149 -80l149 80l39 230zM224 416v0l224 -80l-46 -272l-178 -96l-178 96l-46 272zM312 96l-27 56h-122l-27 -56h-40l128 280l128 -280h-40zM182 192h84l-42 89z" />
+    <glyph glyph-name="ion-social-angular" unicode="&#xf4d9;" 
+d="M182 192l42 89l42 -89h-84zM224 416l224 -80l-46 -272l-178 -96l-178 96l-46 272zM312 96h40l-128 280l-128 -280h40l27 56h122z" />
+    <glyph glyph-name="ion-social-apple-outline" unicode="&#xf226;" horiz-adv-x="320" 
+d="M238 278c-15 0 -26 -4 -37 -8c-10 -4 -21 -8 -35 -8s-25 4 -37 8c-11 4 -22 8 -34 8c-11 0 -23 -3 -34 -10c-12 -7 -23 -18 -31 -31c-12 -18 -16 -47 -13 -77c3 -34 16 -69 35 -99c13 -21 30 -45 50 -45h1c8 0 13 3 20 6c10 5 23 10 44 10v0c21 0 34 -5 44 -10
+c7 -3 12 -6 19 -6v0c22 0 44 35 52 48c8 12 12 20 17 31c-12 7 -22 16 -30 28c-10 15 -17 33 -18 52c-1 18 2 37 10 53c6 12 14 22 24 30c-14 13 -31 20 -47 20zM238 294v0c25 0 52 -14 71 -39c-63 -36 -53 -128 11 -153c-9 -20 -13 -28 -24 -46c-16 -25 -37 -56 -65 -56h-1
+c-24 0 -31 16 -63 16v0c-33 0 -40 -16 -64 -16h-1c-28 0 -48 28 -64 53c-44 69 -48 150 -21 193c19 30 50 48 78 48c29 0 47 -16 71 -16c23 0 38 16 72 16zM214 364c-11 -5 -21 -13 -28 -22c-4 -5 -9 -13 -13 -23c-1 -3 -2 -6 -2 -9c11 4 21 11 28 21c4 5 12 18 15 33z
+M230 384v0c3 -23 -6 -46 -18 -62c-13 -17 -35 -30 -56 -30h-1c-4 22 6 44 18 60c14 17 37 31 57 32z" />
+    <glyph glyph-name="ion-social-apple" unicode="&#xf227;" horiz-adv-x="320" 
+d="M238 294v0c25 0 52 -14 71 -39c-63 -36 -53 -128 11 -153c-9 -20 -13 -28 -24 -46c-16 -25 -37 -56 -65 -56h-1c-24 0 -31 16 -63 16v0c-33 0 -40 -16 -64 -16h-1c-28 0 -48 28 -64 53c-44 69 -48 150 -21 193c19 30 50 48 78 48c29 0 47 -16 71 -16c23 0 38 16 72 16z
+M230 384v0c3 -23 -6 -46 -18 -62c-13 -17 -35 -30 -56 -30h-1c-4 22 6 44 18 60c14 17 37 31 57 32z" />
+    <glyph glyph-name="ion-social-bitcoin-outline" unicode="&#xf2ae;" horiz-adv-x="320" 
+d="M184 400h-8v-48v-16h-16h-32h-16v16v48h-9v-48v-16h-16h-72v-16h13c11 0 19 0 25 -3s10 -7 13 -13s3 -8 3 -20v-178c0 -11 0 -18 -3 -24v-1c-1 -3 -4 -10 -12 -14h-1c-5 -3 -8 -3 -17 -3h-13l-3 -16h67h16v-16v-48h9v48v16h16h32h16v-16v-48h8v49v16h15c23 1 41 5 55 10
+c16 6 28 15 37 26c8 11 12 29 13 42c1 14 -1 29 -4 36s-8 16 -21 23c-7 4 -14 6 -21 8l-46 11l43 19c4 2 7 4 12 9c6 5 9 12 11 16c2 5 4 13 3 22c-1 17 -4 29 -10 37c-7 9 -17 16 -31 21c-12 5 -24 7 -41 8l-15 1v15v47zM200 416v0v-63c20 -1 32 -4 45 -9
+c16 -6 29 -15 38 -27s12 -28 13 -45c1 -10 0 -20 -3 -28s-8 -16 -16 -23c-6 -6 -11 -9 -16 -11c9 -2 17 -6 25 -10c15 -8 24 -18 29 -30c4 -10 6 -30 5 -44c-1 -16 -6 -37 -16 -51c-11 -14 -26 -24 -45 -31c-15 -6 -33 -10 -59 -11v-65h-40v64h-32v-64h-41v64h-87l8 48h28
+c9 0 8 1 11 2s4 3 5 6s1 9 1 18v178c0 9 0 10 -1 12s-3 4 -6 6s-9 2 -18 2h-28v48h87v64h41v-64h32v64h40zM160 298v-74h-32v74h32zM160 176v0v-90h-32v90h32zM200 294v0c6 -2 10 -7 14 -12c4 -6 6 -13 6 -21s-2 -15 -7 -21c-4 -5 -7 -9 -13 -12v66zM200 174v0
+c5 -1 8 -1 12 -3c8 -3 14 -7 19 -13s8 -15 8 -24c0 -11 -2 -19 -10 -26s-13 -11 -23 -15c-2 -1 -4 0 -6 -1v82z" />
+    <glyph glyph-name="ion-social-bitcoin" unicode="&#xf2af;" horiz-adv-x="320" 
+d="M314 169c4 -10 7 -30 6 -44c-1 -16 -5 -37 -16 -51s-26 -24 -45 -31c-15 -6 -33 -10 -59 -11v-64h-40v64h-32v-64h-41v64h-87l9 48h26c9 0 9 0 12 1s4 4 5 7s2 8 2 17v173c0 9 -1 16 -2 18s-3 4 -6 6s-9 2 -18 2h-28v48h87v64h41v-64h32v64h40v-64c20 -1 33 -4 46 -9
+c16 -6 28 -15 37 -27s12 -28 13 -45c1 -10 0 -20 -3 -28c-2 -8 -8 -16 -16 -23c-6 -6 -11 -9 -16 -11c9 -2 17 -6 25 -10c15 -8 23 -18 28 -30zM128 298v-74h32v74h-32zM128 86h32v90h-32v-90zM200 294v-66c6 3 9 7 13 12c5 6 7 12 7 20s-2 15 -6 21c-4 5 -8 11 -14 13z
+M229 107c8 7 10 15 10 26c0 9 -3 19 -8 25s-12 10 -20 13c-4 2 -6 2 -11 3v-82c2 0 5 1 7 2c10 4 14 6 22 13z" />
+    <glyph glyph-name="ion-social-buffer-outline" unicode="&#xf228;" horiz-adv-x="384" 
+d="M7 284c-9 4 -9 11 0 15l169 82c4 2 10 3 16 3s12 -1 16 -3l169 -82c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3zM183 366l-156 -75l156 -75c2 -1 5 -1 9 -1s7 0 9 1l156 75l-156 75c-2 1 -5 2 -9 2s-7 -1 -9 -2zM377 200c9 -4 9 -12 0 -16l-169 -81
+c-4 -2 -10 -4 -16 -4s-12 2 -16 4l-169 81c-9 4 -9 12 0 16c0 0 27 13 33 16c5 3 7 3 13 0s123 -60 123 -60c4 -2 10 -3 16 -3s12 1 16 3c0 0 121 59 125 61s5 2 9 0s35 -17 35 -17zM201 117l156 75l-19 9l-123 -59c-6 -3 -15 -5 -23 -5s-17 2 -23 5l-123 59l-19 -9l156 -75
+c2 -1 5 -2 9 -2s7 1 9 2zM377 100c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3l-169 82c-9 4 -9 11 0 15c0 0 27 14 33 17c5 3 7 2 13 -1s123 -59 123 -59c4 -2 10 -3 16 -3s12 1 16 3c0 0 121 58 125 60s5 2 9 0s35 -17 35 -17zM201 18l156 75l-19 9
+l-123 -60c-6 -3 -15 -4 -23 -4s-17 1 -23 4l-123 60l-19 -9l156 -75c2 -1 5 -2 9 -2s7 1 9 2z" />
+    <glyph glyph-name="ion-social-buffer" unicode="&#xf229;" horiz-adv-x="384" 
+d="M7 284c-9 4 -9 11 0 15l169 82c4 2 10 3 16 3s12 -1 16 -3l169 -82c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3zM377 200c9 -4 9 -12 0 -16l-169 -81c-4 -2 -10 -4 -16 -4s-12 2 -16 4l-169 81c-9 4 -9 12 0 16c0 0 27 13 33 16c5 3 7 3 13 0
+s123 -60 123 -60c4 -2 10 -3 16 -3s12 1 16 3c0 0 121 59 125 61s5 2 9 0s35 -17 35 -17zM377 100c9 -4 9 -11 0 -15l-169 -82c-4 -2 -10 -3 -16 -3s-12 1 -16 3l-169 82c-9 4 -9 11 0 15c0 0 27 14 33 17c5 3 7 2 13 -1s123 -59 123 -59c4 -2 10 -3 16 -3s12 1 16 3
+c0 0 121 58 125 60s5 2 9 0s35 -17 35 -17z" />
+    <glyph glyph-name="ion-social-chrome-outline" unicode="&#xf4da;" 
+d="M224 416c123 0 224 -101 224 -224s-101 -224 -224 -224s-224 101 -224 224s101 224 224 224zM224 371c-57 0 -109 -27 -141 -68l54 -93c8 40 43 72 87 72h155c-30 54 -89 89 -155 89zM291 192c0 37 -30 67 -67 67s-67 -30 -67 -67s30 -67 67 -67s67 30 67 67zM45 192
+c0 -91 67 -166 154 -177l54 93c-9 -3 -19 -6 -29 -6c-34 0 -61 18 -77 45v0l-78 135c-16 -27 -24 -58 -24 -90zM224 13c99 0 179 80 179 179c0 24 -4 46 -13 67h-108c19 -17 32 -40 32 -67c0 -17 -5 -32 -13 -45v0z" />
+    <glyph glyph-name="ion-social-chrome" unicode="&#xf4db;" 
+d="M157 192c0 37 30 67 67 67s67 -30 67 -67s-30 -67 -67 -67s-67 30 -67 67zM445 230c2 -12 3 -25 3 -38c0 -106 -74 -195 -174 -218c-10 -2 -20 -4 -30 -5c-7 -1 -13 -1 -20 -1c-8 0 -17 0 -25 1v0v0v0v1l102 177c8 13 13 28 13 45c0 27 -13 50 -32 67h156
+c3 -9 5 -19 7 -29v0c-2 10 -4 20 -7 29v0c3 -9 5 -19 7 -29v0zM224 103c10 0 20 2 29 5l-78 -135v0c-42 9 -79 30 -108 59c-42 41 -67 97 -67 160c0 31 6 61 18 88c7 16 16 31 26 45v0l103 -178c16 -27 43 -44 77 -44zM59 343v0v1c24 26 55 47 90 59c23 8 49 13 75 13
+c73 0 138 -36 179 -90h1c10 -14 18 -29 25 -44v0c-7 15 -15 30 -25 44h-1c10 -14 19 -29 26 -44h-205c-44 0 -79 -32 -87 -72z" />
+    <glyph glyph-name="ion-social-codepen-outline" unicode="&#xf4dc;" 
+d="M356 244c5 -3 7 -6 7 -12v-81c0 -6 -3 -10 -8 -13c-41 -27 -82 -55 -123 -82c-6 -4 -11 -4 -17 0c-41 27 -81 55 -122 82c-5 3 -8 7 -8 13v80c0 6 3 11 8 14c41 27 81 54 122 81c6 4 11 4 17 0c41 -27 83 -55 124 -82zM236 296v-54c0 -1 1 -2 2 -3c16 -11 31 -21 47 -32
+c1 -1 3 -1 4 0l40 26zM212 295c0 0 -62 -41 -93 -62c14 -9 27 -17 40 -26c1 -1 3 -1 4 0c15 10 31 21 46 31c1 1 3 4 3 6v51zM109 211v-40l30 20zM212 87v53c0 1 -2 3 -3 4c-15 10 -31 21 -46 31c-2 1 -3 1 -5 0l-39 -26c31 -21 93 -62 93 -62zM227 165l39 26s-34 23 -40 27
+c-1 1 -4 0 -5 -1c-5 -3 -9 -6 -14 -9c-8 -6 -25 -17 -25 -17l39 -26c2 -1 4 -1 6 0zM236 87l93 62l-38 26c-2 2 -5 2 -7 0c-15 -10 -30 -21 -45 -31c-2 -2 -3 -3 -3 -6v-51zM338 171v40l-30 -20zM224 384c-51 0 -100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136
+s85 -56 136 -56s100 20 136 56s56 85 56 136s-20 100 -56 136s-85 56 -136 56zM224 416v0c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224z" />
+    <glyph glyph-name="ion-social-codepen" unicode="&#xf4dd;" 
+d="M209 144c1 -1 3 -3 3 -4v-53s-62 41 -93 62l39 26c2 1 3 1 5 0c15 -10 31 -21 46 -31zM163 207c-1 -1 -3 -1 -4 0c-13 9 -26 17 -40 26c31 21 93 62 93 62v-51c0 -2 -2 -5 -3 -6c-15 -10 -31 -21 -46 -31zM238 239c-1 1 -2 2 -2 3v54l93 -63l-40 -26c-1 -1 -3 -1 -4 0
+c-16 11 -31 21 -47 32zM226 218c6 -4 40 -27 40 -27l-39 -26c-2 -1 -4 -1 -6 0l-39 26s17 11 25 17c5 3 9 6 14 9c1 1 4 2 5 1zM109 211l30 -20l-30 -20v40zM224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM363 151v81
+c0 6 -2 9 -7 12c-41 27 -83 55 -124 82c-6 4 -11 4 -17 0c-41 -27 -81 -54 -122 -81c-5 -3 -8 -8 -8 -14v-80c0 -6 3 -10 8 -13c41 -27 81 -55 122 -82c6 -4 11 -4 17 0c41 27 82 55 123 82c5 3 8 7 8 13zM284 175c2 2 5 2 7 0l38 -26l-93 -62v51c0 3 1 4 3 6
+c15 10 30 21 45 31zM338 171l-30 20l30 20v-40z" />
+    <glyph glyph-name="ion-social-css3-outline" unicode="&#xf4de;" horiz-adv-x="384" 
+d="M291 81l-99 -28l-98 28l-7 78h48l4 -40l53 -15v0v0l54 15l5 64h-112l-4 50h121l4 51h-184l-4 49h241zM0 416h384l-35 -403l-157 -45l-157 45zM319 37l30 347h-314l30 -347l127 -36z" />
+    <glyph glyph-name="ion-social-css3" unicode="&#xf4df;" horiz-adv-x="384" 
+d="M192 109v0zM0 416h384l-35 -403l-157 -45l-157 45zM291 81l22 252h-241l4 -49h184l-4 -51h-121l4 -50h112l-5 -64l-54 -15v0v0l-53 15l-4 40h-48l7 -78l98 -28z" />
+    <glyph glyph-name="ion-social-designernews-outline" unicode="&#xf22a;" 
+d="M259 302v-53l-65 103zM0 188zM297 352l151 -119v-201h-248l-200 156h63c46 0 77 33 77 82c0 20 -5 37 -15 51l-3 3l37 -29v-107h41l-2 98l63 -98h36v84v80zM432 48v178l-119 92v1v-47v-83v-17h-15h-37h-9l-4 8l-33 50l1 -42v-16h-16h-41h-16v16v29c-3 -6 -7 -12 -12 -17
+c-8 -9 -18 -16 -30 -21s-24 -7 -38 -7h-16l159 -124h226zM59 298h-1h-3v-57h4c8 0 13 2 17 6c5 6 6 15 6 22c0 26 -12 29 -23 29zM59 314v0c25 0 39 -16 39 -45c0 -28 -14 -44 -40 -44h-19v89h20z" />
+    <glyph glyph-name="ion-social-designernews" unicode="&#xf22b;" 
+d="M258 303l1 -53l-64 102zM297 352l151 -118v-202h-248l-200 157v0h63c46 0 77 33 77 82c0 20 -5 37 -15 51l-3 3l37 -29v-107h40l-2 99l64 -99h36v83v80zM98 270c0 -28 -14 -44 -40 -44h-19v89h19c26 0 40 -16 40 -45z" />
+    <glyph glyph-name="ion-social-dribbble-outline" unicode="&#xf22c;" horiz-adv-x="384" 
+d="M192 384c106 0 192 -86 192 -192s-86 -192 -192 -192s-192 86 -192 192s86 192 192 192zM314 296c-17 -25 -47 -47 -85 -64c5 -10 9 -20 13 -31c33 3 75 4 110 2c-2 35 -16 68 -38 93zM192 352c-14 0 -26 -2 -39 -5c23 -23 43 -53 62 -87c34 14 62 33 79 55
+c-28 23 -63 37 -102 37zM120 334c-41 -21 -71 -58 -83 -103h25c44 0 85 6 121 17c-19 34 -40 63 -63 86zM32 200v-8c0 -40 15 -78 40 -106c24 45 67 83 122 106c4 2 8 3 14 4c-3 8 -6 16 -10 24c-40 -13 -88 -20 -138 -21c-9 0 -19 1 -28 1zM192 32c20 0 39 3 57 10
+c-3 25 -8 53 -15 79c-4 17 -10 33 -16 49c-7 -2 -13 -4 -17 -6c-48 -22 -86 -56 -107 -98c27 -21 61 -34 98 -34zM278 58c40 26 68 67 73 116c-30 2 -68 3 -99 0c4 -12 9 -25 12 -38c7 -27 11 -52 14 -78z" />
+    <glyph glyph-name="ion-social-dribbble" unicode="&#xf22d;" horiz-adv-x="384" 
+d="M192 384c106 0 192 -86 192 -192s-86 -192 -192 -192s-192 86 -192 192s86 192 192 192zM192 32c88 0 160 72 160 160s-72 160 -160 160s-160 -72 -160 -160s72 -160 160 -160zM242 201c-4 11 -8 21 -13 31c25 11 47 24 63 39c15 -19 26 -42 28 -67c-26 0 -55 -1 -78 -3z
+M271 292c-15 -12 -34 -23 -56 -32c-12 22 -24 41 -38 59c5 1 10 1 15 1c30 0 57 -11 79 -28zM142 310c15 -18 28 -39 41 -62c-34 -10 -72 -16 -113 -17c11 36 38 65 72 79zM319 176c-4 -33 -21 -63 -46 -83c-3 14 -5 28 -9 43c-3 13 -8 26 -12 38c21 2 45 3 67 2zM194 192
+c-43 -18 -79 -46 -104 -78c-16 22 -26 49 -26 78v7c49 1 95 8 134 21c4 -8 7 -16 10 -24c-6 -1 -10 -2 -14 -4zM219 170c6 -16 11 -32 15 -49c4 -15 7 -31 10 -46c-16 -7 -34 -11 -52 -11c-31 0 -59 11 -81 29c22 30 53 54 90 71c4 2 11 4 18 6z" />
+    <glyph glyph-name="ion-social-dropbox-outline" unicode="&#xf22e;" horiz-adv-x="384" 
+d="M113 371l79 -66l-114 -71l-78 63zM27 295l52 -42l86 53l-53 46zM306 235l78 -63l-78 -51v-39l-114 -69l-114 68v39l-78 52l78 63l114 -71l-79 -66l-19 12v-20l98 -59l98 59v20l-19 -12l-79 66zM79 217l-52 -44l85 -55l53 44zM219 162l53 -44l85 56l-52 43zM384 297
+l-78 -63l-114 71l79 66zM219 305l86 -52l52 42l-85 56z" />
+    <glyph glyph-name="ion-social-dropbox" unicode="&#xf22f;" horiz-adv-x="384" 
+d="M113 371l79 -66l-114 -71l-78 63zM0 172l78 62l114 -70l-79 -66zM192 164l114 70l78 -62l-113 -74zM384 297l-78 -63l-114 71l79 66zM192 150l80 -66l34 22v-25l-114 -68l-114 68v25l34 -22z" />
+    <glyph glyph-name="ion-social-euro-outline" unicode="&#xf4e0;" horiz-adv-x="320" 
+d="M214 384c-53 0 -91 -9 -115 -27c-22 -16 -33 -40 -33 -74v-11v-17h-16h-34v-16h34h16v-15v-48v-17h-16h-34v-16h34h16v-15v-27c0 -34 11 -58 33 -74c24 -18 62 -27 115 -27c31 0 59 2 88 8l-5 35c-30 -4 -55 -7 -80 -7c-36 0 -59 6 -74 19c-19 16 -21 40 -21 60v13v15h16
+h103l3 16h-106h-16v17v48v15h16h118l2 16h-120h-16v17v2c0 16 2 39 21 55c16 13 39 19 74 19c24 0 51 -3 80 -7l5 35c-29 6 -57 8 -88 8zM214 400v0c35 0 68 -3 106 -12l-9 -65c-37 6 -68 9 -94 9c-64 0 -79 -22 -79 -58v-3h139l-8 -48h-131v-48h124l-7 -48h-117v-12
+c0 -44 15 -63 79 -63c26 0 57 3 94 9l9 -65c-38 -9 -71 -12 -106 -12c-115 0 -164 41 -164 117v26h-50v48h50v48h-50v48h50v12c0 76 49 117 164 117z" />
+    <glyph glyph-name="ion-social-euro" unicode="&#xf4e1;" horiz-adv-x="320" 
+d="M138 176h124l-7 -48h-117v-13c0 -44 15 -63 79 -63c26 0 56 3 93 9l10 -65c-38 -9 -71 -12 -106 -12c-115 0 -164 41 -164 117v27h-50v48h50v48h-50v48h50v11c0 76 49 117 164 117c35 0 68 -3 106 -12l-10 -65c-37 6 -67 9 -93 9c-64 0 -79 -22 -79 -58v-2h138l-7 -48
+h-131v-48z" />
+    <glyph glyph-name="ion-social-facebook-outline" unicode="&#xf230;" horiz-adv-x="192" 
+d="M128 256h64l-8 -64h-56v-192h-83v192h-45v64h45v43c0 54 23 85 91 85h56v-64h-34c-27 0 -30 -9 -30 -26v-38zM170 208l4 32h-45h-17v17v37c0 10 1 21 9 30c10 11 25 12 37 12h18v32h-40c-28 0 -49 -6 -60 -18c-10 -11 -15 -27 -15 -51v-43v-16h-15h-30v-32h30h15v-16
+v-176h51v176v16h17h41z" />
+    <glyph glyph-name="ion-social-facebook" unicode="&#xf231;" horiz-adv-x="192" 
+d="M128 256h64l-8 -64h-56v-192h-83v192h-45v64h45v43c0 54 23 85 91 85h56v-64h-34c-27 0 -30 -9 -30 -26v-38z" />
+    <glyph glyph-name="ion-social-foursquare-outline" unicode="&#xf34c;" horiz-adv-x="320" 
+d="M302 284c-12 -60 -25 -131 -27 -138zM281 416c35 0 45 -20 37 -57c-3 -16 -10 -44 -16 -75l-27 -137c-3 -13 -8 -35 -39 -35h-72c-3 0 -3 0 -6 -3c-2 -2 -115 -133 -115 -133c-9 -10 -23 -8 -28 -6s-15 8 -15 26v380s10 40 43 40h238zM280 352c6 31 6 32 -24 32h-195
+c-29 0 -29 -3 -29 -28v-297c0 -38 1 -38 3 -38s10 8 29 31c0 0 78 89 79 90c2 2 3 2 6 2h62c26 0 28 6 33 31c4 21 36 177 36 177zM302 284c6 31 13 59 16 75zM233 352c5 0 9 -5 8 -11l-8 -44c-1 -4 -6 -9 -11 -9h-75c-8 0 -8 -5 -8 -13v-6c0 -8 0 -13 8 -13h64
+s11 -6 10 -12s-11 -51 -12 -54s-4 -9 -11 -9h-62c-9 0 -11 -1 -17 -8l-54 -63c-1 -1 -1 -1 -1 0v231c0 5 5 11 11 11h158z" />
+    <glyph glyph-name="ion-social-foursquare" unicode="&#xf34d;" horiz-adv-x="320" 
+d="M281 416c35 0 45 -20 37 -57c-10 -49 -40 -202 -43 -213c-3 -13 -8 -34 -39 -34h-72c-3 0 -3 0 -6 -3c-2 -2 -115 -133 -115 -133c-9 -10 -23 -8 -28 -6s-15 8 -15 26v380s10 40 43 40h238zM275 146c3 11 33 164 43 213zM267 351c2 9 -5 16 -12 16h-191
+c-9 0 -15 -8 -15 -15v-296c0 -1 1 -1 2 0c0 0 70 84 78 94s11 11 23 11h64c9 0 14 8 15 12s8 43 10 51s-6 16 -13 16h-82c-10 0 -18 8 -18 18v13c0 10 8 17 18 17h96s14 6 15 12z" />
+    <glyph glyph-name="ion-social-freebsd-devil" unicode="&#xf2c4;" horiz-adv-x="512" 
+d="M503 333c19 -37 8 -81 -20 -108s-60 -33 -60 -33c2 -32 16 -59 -41 -102c-43 -32 2 -90 2 -90c10 -14 23 -19 32 -32h-272s15 14 -7 32c0 0 -20 17 -18 29s6 13 9 15s0 7 0 7l-19 19s-13 -13 -44 -13c-38 0 -65 39 -65 39h46s-6 -8 -7 -13c-1 -4 1 -5 1 -5s11 -6 22 -6
+c17 0 33 12 33 12l-24 22l-15 -4l-16 37l39 -10l-1 -15l28 -18s9 9 7 27s-9 26 -9 26s-4 0 -9 -4s-6 -6 -6 -6l-10 44s43 -19 50 -63c3 -20 -6 -35 -6 -35l17 -10s6 5 17 7s23 2 29 -8s5 -12 4 -19s0 -9 6 -11s6 -6 11 -8s15 -6 21 -2s8 11 8 18v16s-9 8 -32 20
+s-54 22 -66 40s-12 44 0 57c9 10 23 25 26 35c4 14 4 42 4 42s-10 16 -8 40c2 30 22 84 96 114c0 0 -40 -55 -20 -80c0 0 37 11 77 9c31 -2 56 -12 73 -28s25 -23 47 -17s28 17 28 33c0 19 -16 51 -16 51s36 -7 58 -51zM195 245c14 4 21 -11 21 -11c14 25 30 60 22 64
+s-64 -25 -66 -88c0 0 6 31 23 35zM232 230c5 7 34 8 37 -17c4 -35 -24 -57 -24 -57s7 -2 23 2c17 4 43 29 43 70s-21 66 -41 62s-38 -60 -38 -60z" />
+    <glyph glyph-name="ion-social-github-outline" unicode="&#xf232;" 
+d="M224 416c124 0 224 -103 224 -230c0 -101 -64 -188 -153 -218h-4c-8 0 -12 7 -12 12c0 8 1 31 1 62c0 21 -8 36 -16 43c50 6 103 25 103 113c0 25 -9 46 -23 62c2 6 10 29 -2 61h-5c-8 0 -27 -3 -57 -24c-18 5 -37 8 -56 8s-38 -3 -56 -8c-30 21 -49 24 -57 24h-5
+c-12 -32 -4 -55 -2 -61c-14 -16 -23 -37 -23 -62c0 -88 52 -107 102 -113c-6 -6 -12 -16 -14 -31c-6 -3 -16 -6 -26 -6c-13 0 -28 5 -39 25c0 0 -13 22 -35 24v0c-2 0 -21 0 -1 -14c0 0 15 -8 25 -34c0 0 10 -33 53 -33c7 0 14 0 22 2v-39c0 -5 -3 -11 -11 -11h-4
+c-89 30 -153 116 -153 218c0 127 100 230 224 230zM146 -0c-15 0 -28 4 -38 9c14 -10 28 -17 44 -23v6v8h-6zM157 73c-16 4 -35 10 -52 24c6 -6 11 -11 13 -16c7 -12 14 -17 25 -17c4 0 9 1 12 2c1 2 1 5 2 7zM347 14c17 13 32 28 45 46c26 37 40 80 40 126
+c0 29 -5 58 -16 84c-10 25 -26 48 -45 68s-41 34 -66 45c-26 11 -53 17 -81 17s-55 -6 -81 -17c-25 -11 -47 -25 -66 -45s-35 -42 -45 -68c-11 -26 -16 -55 -16 -84c0 -46 14 -89 40 -126c10 -14 22 -27 35 -38c-7 8 -11 16 -13 22c-7 18 -15 24 -17 25h-2v1
+c-5 3 -20 13 -15 28c3 9 12 15 25 15h1v0v0c13 -1 24 -6 32 -13c-21 19 -37 48 -37 98c0 24 7 47 21 66c-3 13 -6 34 5 62l3 8l7 2c2 0 5 1 10 1c12 0 31 -3 60 -22c17 4 35 6 53 6v0v0c18 0 36 -2 53 -6c29 19 48 22 60 22c5 0 8 -1 10 -1l7 -2l3 -7c11 -27 8 -50 5 -63
+c14 -19 21 -41 21 -66c0 -92 -55 -117 -92 -125c3 -8 5 -18 5 -30v-51v-6c18 7 35 16 51 28z" />
+    <glyph glyph-name="ion-social-github" unicode="&#xf233;" 
+d="M224 416c124 0 224 -103 224 -230c0 -101 -64 -188 -153 -218h-4c-8 0 -12 7 -12 12c0 8 1 31 1 62c0 21 -8 36 -16 43c50 6 103 25 103 113c0 25 -9 46 -23 62c2 6 10 29 -2 61h-5c-8 0 -27 -3 -57 -24c-18 5 -37 8 -56 8s-38 -3 -56 -8c-30 21 -49 24 -57 24h-5
+c-12 -32 -4 -55 -2 -61c-14 -16 -23 -37 -23 -62c0 -88 52 -107 102 -113c-6 -6 -12 -16 -14 -31c-6 -3 -16 -6 -26 -6c-13 0 -28 5 -39 25c0 0 -13 22 -35 24v0c-2 0 -21 0 -1 -14c0 0 15 -8 25 -34c0 0 10 -33 53 -33c7 0 14 0 22 2v-39c0 -5 -3 -11 -11 -11h-4
+c-89 30 -153 116 -153 218c0 127 100 230 224 230z" />
+    <glyph glyph-name="ion-social-google-outline" unicode="&#xf34e;" horiz-adv-x="256" 
+d="M191 366c12 -10 37 -30 37 -68c0 -37 -21 -55 -43 -72c-7 -7 -15 -13 -15 -24s8 -17 14 -22l18 -14c23 -19 43 -36 43 -71c0 -47 -47 -95 -135 -95c-74 0 -110 35 -110 72c0 18 10 44 40 62c32 19 75 21 98 23c-7 9 -16 18 -16 34c0 9 2 14 5 20c-6 0 -11 -1 -16 -1
+c-54 0 -85 40 -85 79c0 23 11 48 33 67c29 24 63 28 91 28h106l-33 -18h-32zM155 142c-4 1 -7 1 -12 1s-32 -1 -54 -8c-11 -4 -44 -16 -44 -52s36 -62 91 -62c49 0 75 24 75 55c0 26 -17 39 -56 66zM170 238c12 12 13 28 13 37c0 36 -22 92 -65 92c-13 0 -28 -6 -36 -16
+c-9 -11 -11 -25 -11 -38c0 -34 20 -89 64 -89c13 0 27 6 35 14z" />
+    <glyph glyph-name="ion-social-google" unicode="&#xf34f;" horiz-adv-x="288" 
+d="M210 172c22 -18 45 -36 45 -73c0 -49 -48 -99 -140 -99c-80 0 -115 39 -115 77c0 10 3 42 42 65c27 16 61 20 85 22c-4 7 -8 16 -8 27c0 4 0 7 1 10h-4c-19 0 -46 4 -67 26c-15 15 -24 36 -24 57c0 26 13 53 35 71v0c32 25 70 29 95 29h133l-60 -33h-13
+c11 -13 23 -31 23 -58c0 -40 -25 -59 -45 -74v-1c-6 -6 -11 -10 -11 -17c0 -6 4 -10 10 -15v0zM85 308c0 -13 4 -33 14 -51c7 -12 20 -27 41 -27c10 0 21 4 28 11c10 10 10 25 10 30c0 18 -6 38 -15 54c-7 13 -20 27 -40 27c-11 0 -22 -5 -29 -13c-6 -7 -9 -18 -9 -31z
+M206 80c0 20 -13 31 -50 56c-3 0 -4 1 -8 1c-6 0 -32 -2 -51 -8c-16 -6 -37 -16 -37 -42c0 -31 32 -51 80 -51c41 0 66 17 66 44z" />
+    <glyph glyph-name="ion-social-googleplus-outline" unicode="&#xf234;" 
+d="M192 366c12 -10 36 -30 36 -68c0 -37 -21 -55 -43 -72c-7 -7 -15 -13 -15 -24s8 -18 14 -22l18 -14c23 -19 43 -36 43 -71c0 -47 -47 -95 -135 -95c-74 0 -110 35 -110 72c0 18 10 44 40 62c32 19 75 21 98 23c-7 9 -16 18 -16 34c0 9 3 14 5 20c-6 0 -11 -1 -16 -1
+c-54 0 -85 40 -85 79c0 23 10 48 32 67c29 24 64 28 92 28h106l-33 -18h-31zM155 142c-4 0 -7 1 -12 1s-32 -1 -54 -8c-11 -4 -44 -16 -44 -52s36 -62 91 -62c49 0 75 24 75 55c0 26 -17 39 -56 66zM170 238c12 12 13 28 13 37c0 36 -22 92 -65 92c-13 0 -28 -6 -36 -16
+c-9 -11 -11 -24 -11 -37c0 -34 20 -90 64 -90c13 0 27 6 35 14zM448 306v-18h-78v-81h-18v81h-80v18h80v78h18v-78h78z" />
+    <glyph glyph-name="ion-social-googleplus" unicode="&#xf235;" 
+d="M210 172c22 -18 45 -36 45 -73c0 -49 -47 -99 -139 -99c-80 0 -116 39 -116 77c0 10 3 42 42 65c27 16 61 21 85 23c-4 7 -8 15 -8 26c0 4 0 7 1 10h-4c-19 0 -46 4 -67 26c-15 15 -24 36 -24 57c0 26 13 53 35 71v0c32 25 69 29 94 29h134l-60 -33h-13
+c11 -13 23 -31 23 -58c0 -40 -25 -59 -45 -74v-1c-6 -6 -11 -10 -11 -17c0 -6 4 -10 10 -15v0zM85 308c0 -13 4 -33 14 -51c7 -12 21 -27 41 -27c10 0 21 4 28 11c10 10 10 25 10 30c0 18 -6 37 -15 53c-8 13 -20 28 -40 28c-11 0 -23 -5 -29 -13c-6 -7 -9 -18 -9 -31z
+M206 80c0 20 -13 31 -50 56c-3 0 -4 1 -8 1c-6 0 -31 -2 -50 -8c-16 -6 -38 -16 -38 -42c0 -31 32 -51 80 -51c41 0 66 17 66 44zM370 306h78v-34h-78v-81h-34v81h-80v34h80v78h34v-78z" />
+    <glyph glyph-name="ion-social-hackernews-outline" unicode="&#xf236;" horiz-adv-x="384" 
+d="M352 352h-320v-320h320v320zM384 384v0v-384h-384v384h384zM233 289h45l-64 -120v-72h-40v72l-66 120h47l40 -84z" />
+    <glyph glyph-name="ion-social-hackernews" unicode="&#xf237;" horiz-adv-x="384" 
+d="M0 384h384v-384h-384v384zM214 169l64 120h-45l-38 -84l-40 84h-47l66 -120v-72h40v72z" />
+    <glyph glyph-name="ion-social-html5-outline" unicode="&#xf4e2;" horiz-adv-x="384" 
+d="M0 416h384l-35 -403l-157 -45l-157 45zM319 37l30 347h-314l30 -347l127 -36zM84 184l-13 150h241l-4 -50h-184l4 -51h176l-14 -151l-98 -28l-99 28l-6 77h48l3 -39l54 -15l53 15l6 64h-167z" />
+    <glyph glyph-name="ion-social-html5" unicode="&#xf4e3;" horiz-adv-x="384" 
+d="M0 416h384l-35 -403l-157 -45l-157 45zM308 284l4 50h-241l13 -150h167l-6 -64l-53 -15l-54 15l-3 39h-48l6 -78l99 -27l98 28l14 151h-176l-4 51h184z" />
+    <glyph glyph-name="ion-social-instagram-outline" unicode="&#xf350;" horiz-adv-x="384" 
+d="M384 336v-289c0 -26 -22 -47 -48 -47h-288c-26 0 -48 21 -48 47v289c0 26 22 48 48 48h288c26 0 48 -22 48 -48zM192 272c-44 0 -80 -36 -80 -80s36 -80 80 -80s80 36 80 80s-36 80 -80 80zM352 288v48c0 9 -7 16 -16 16h-48c-9 0 -16 -7 -16 -16v-48c0 -9 7 -16 16 -16
+h48c9 0 16 7 16 16zM337 32c9 0 15 7 15 16v176h-52c3 -10 4 -21 4 -32c0 -30 -11 -58 -32 -79s-50 -33 -80 -33s-58 12 -79 33s-33 49 -33 79c0 11 2 22 5 32h-53v-176c0 -9 8 -16 17 -16h288z" />
+    <glyph glyph-name="ion-social-instagram" unicode="&#xf351;" horiz-adv-x="384" 
+d="M112 192c0 53 27 80 80 80s80 -27 80 -80s-27 -80 -80 -80s-80 27 -80 80zM113 271c-14 -14 -23 -29 -28 -47h-85v112c0 13 4 25 14 34s22 14 35 14h288c13 0 24 -5 33 -14s14 -21 14 -34v-112h-84c-5 18 -14 33 -28 47c-22 22 -49 33 -80 33s-57 -11 -79 -33zM352 300
+v39c0 4 -2 7 -4 9s-5 4 -9 4h-38c-4 0 -7 -2 -9 -4s-4 -5 -4 -9v-39c0 -4 2 -7 4 -9s5 -3 9 -3h38c4 0 7 1 9 3s4 5 4 9zM272 113c22 22 32 48 32 79h80v-144c0 -13 -5 -24 -14 -34s-20 -14 -33 -14h-288c-13 0 -24 4 -34 14s-15 21 -15 34v144h81c0 -31 10 -57 32 -79
+s48 -33 79 -33s58 11 80 33z" />
+    <glyph glyph-name="ion-social-javascript-outline" unicode="&#xf4e4;" 
+d="M160 344h-48v-196c0 -30 -6 -50 -17 -64c-11 -13 -26 -20 -48 -20c-9 0 -18 1 -25 2l-4 -30c11 -2 25 -4 37 -4c34 0 59 8 76 25c19 18 29 48 29 90v197zM176 360v0v-213c0 -97 -49 -131 -121 -131c-18 0 -40 3 -55 8l8 62c10 -4 24 -6 39 -6c31 0 49 15 49 68v212h80z
+M350 352c-34 0 -62 -9 -82 -26c-19 -15 -28 -36 -28 -60c0 -20 7 -36 21 -51c14 -14 34 -26 61 -36c23 -8 38 -15 48 -24c12 -11 18 -23 18 -38c0 -16 -7 -31 -20 -40c-12 -9 -28 -14 -48 -14c-28 0 -52 8 -70 15l-7 -32c18 -8 44 -14 72 -14c38 0 70 9 90 27
+c18 16 27 38 27 63c0 21 -5 36 -17 50s-31 27 -58 37v0v0c-38 15 -72 28 -72 63c0 14 7 27 19 36c11 9 26 13 45 13c24 0 43 -5 57 -11l10 32c-19 6 -42 10 -66 10zM350 368v0c38 0 65 -7 85 -16l-19 -64c-13 7 -35 17 -67 17s-48 -16 -48 -33c0 -22 19 -31 62 -48
+c58 -22 85 -53 85 -102c0 -57 -42 -106 -133 -106c-38 0 -72 10 -91 21l15 63v0c20 -11 49 -21 81 -21c34 0 52 15 52 38c0 21 -15 33 -55 47c-55 20 -93 52 -93 102c0 58 49 102 126 102z" />
+    <glyph glyph-name="ion-social-javascript" unicode="&#xf4e5;" 
+d="M176 360v0v-213c0 -97 -49 -131 -121 -131c-18 0 -40 3 -55 8l8 62c10 -4 24 -6 39 -6c31 0 49 15 49 68v212h80zM350 368v0c38 0 65 -7 85 -16l-19 -64c-13 7 -35 17 -67 17s-48 -16 -48 -33c0 -22 19 -31 62 -48c58 -22 85 -53 85 -102c0 -57 -42 -106 -133 -106
+c-38 0 -72 10 -91 21l15 63v0c20 -11 49 -21 81 -21c34 0 52 15 52 38c0 21 -15 33 -55 47c-55 20 -93 52 -93 102c0 58 49 102 126 102z" />
+    <glyph glyph-name="ion-social-linkedin-outline" unicode="&#xf238;" horiz-adv-x="384" 
+d="M119 64v0h-55v171h55v-171zM93 261v0v0c-18 0 -29 13 -29 29c0 17 12 30 30 30s29 -13 29 -30c0 -16 -12 -29 -30 -29zM257 239c36 0 63 -24 63 -75v-100h-55v94c0 22 -8 37 -28 37c-15 0 -24 -10 -28 -20c-2 -4 -2 -9 -2 -14v-97h-55v171h55v-24c8 11 21 28 50 28z
+M353 384c18 0 31 -13 31 -30v-321c0 -17 -13 -33 -31 -33h-320c-18 0 -33 16 -33 33v321c0 17 15 30 33 30h320zM350 32c1 0 2 1 2 2v316c0 1 -1 2 -2 2h-316s-2 -1 -2 -2v-315s1 -3 3 -3h315z" />
+    <glyph glyph-name="ion-social-linkedin" unicode="&#xf239;" horiz-adv-x="384" 
+d="M353 384c18 0 31 -13 31 -30v-321c0 -17 -13 -33 -31 -33h-320c-18 0 -33 16 -33 33v321c0 17 15 30 33 30h320zM119 64v171h-55v-171h55zM93 261c18 0 30 13 30 29c0 17 -11 30 -29 30s-30 -13 -30 -30c0 -16 11 -29 29 -29v0zM320 64v100c0 51 -27 75 -63 75
+c-29 0 -42 -17 -50 -28v24h-55v-171h55v97c0 5 0 10 2 14c4 10 13 20 28 20c20 0 28 -15 28 -37v-94h55z" />
+    <glyph glyph-name="ion-social-markdown" unicode="&#xf4e6;" 
+d="M416 352c18 0 32 -14 32 -32v-256c0 -18 -14 -32 -32 -32h-384c-18 0 -32 14 -32 32v256c0 18 14 32 32 32h384zM252 96v0v192h-56l-42 -68l-42 68h-56v-192h56v96l42 -54l42 54v-96h56zM336 96v0l70 96h-42v96h-56v-96h-42z" />
+    <glyph glyph-name="ion-social-nodejs" unicode="&#xf4e7;" horiz-adv-x="384" 
+d="M192 -32c-6 0 -12 2 -17 5l-53 32c-8 5 -4 6 -1 7c11 4 14 5 25 12c1 1 3 1 4 0l39 -23c1 -1 4 -1 5 0l156 92c1 1 2 2 2 4v187c0 2 0 4 -2 5l-156 94c-1 1 -3 1 -4 0l-155 -94c-2 -1 -3 -3 -3 -5v-187c0 -2 0 -3 2 -4l40 -24c24 -12 38 1 38 15v183c0 3 2 5 5 5h22
+c3 0 5 -2 5 -5v-183c0 -33 -19 -52 -49 -52c-9 0 -17 1 -37 11l-41 24c-10 6 -17 18 -17 30v190c0 12 7 24 17 30l158 95c10 6 24 6 34 0l158 -95c10 -6 17 -18 17 -30v-190c0 -12 -7 -24 -17 -30l-158 -94c-5 -3 -11 -5 -17 -5v0zM241 96c-65 0 -84 31 -84 59c0 3 1 5 4 5
+h21c2 0 5 -2 5 -4c3 -22 16 -31 54 -31c33 0 47 11 47 29c0 11 -3 18 -55 23c-43 4 -71 15 -71 51c0 33 28 52 73 52c46 0 76 -14 79 -51c0 -1 -1 -2 -2 -3s-2 -2 -3 -2h-20c-2 0 -5 2 -5 4c-4 17 -16 23 -49 23c-36 0 -41 -12 -41 -22c0 -12 5 -16 54 -23s72 -16 72 -51
+c0 -36 -29 -59 -79 -59v0v0z" />
+    <glyph glyph-name="ion-social-octocat" unicode="&#xf4e8;" 
+d="M146 161c9 0 16 -4 22 -13s10 -20 10 -32s-4 -22 -10 -31s-14 -13 -22 -13c-9 0 -17 4 -23 13s-9 19 -9 31s3 24 9 32c6 9 14 13 23 13zM303 161c9 0 16 -4 22 -13s9 -20 9 -32s-3 -22 -9 -31s-13 -13 -22 -13s-18 4 -24 13s-9 19 -9 31s3 24 9 32c6 9 15 13 24 13z
+M414 276c24 -27 34 -66 34 -96c0 -24 -1 -46 -6 -65c-6 -19 -13 -35 -21 -47c-9 -12 -19 -23 -32 -32s-24 -17 -34 -21s-22 -8 -36 -10c-13 -2 -24 -4 -31 -4c0 0 -28 -1 -64 -1s-64 1 -64 1c-7 0 -18 2 -31 4c-14 2 -26 6 -36 10s-22 12 -34 21c-13 9 -23 20 -32 32
+c-8 12 -15 28 -21 47c-5 19 -6 41 -6 65c0 31 10 70 34 96c0 0 -2 14 0 39s7 48 16 69c30 -3 67 -20 112 -51c15 4 36 6 62 6c28 0 48 -2 62 -6c20 14 39 24 58 33c19 8 33 13 41 15s13 3 13 3c9 -21 14 -44 16 -69s0 -39 0 -39v0zM348 42c28 13 42 40 42 81
+c0 24 -8 43 -26 59c-9 9 -20 13 -32 15s-31 1 -56 -1s-40 -4 -52 -4s-25 2 -42 3s-30 3 -39 3c-10 0 -20 1 -31 -2s-21 -7 -28 -14c-17 -15 -25 -35 -25 -59c0 -41 13 -68 41 -81c27 -13 69 -18 123 -18h2c54 0 95 5 123 18z" />
+    <glyph glyph-name="ion-social-pinterest-outline" unicode="&#xf2b0;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224s-224 100 -224 224s100 224 224 224zM360 56c36 36 56 85 56 136s-20 100 -56 136s-85 56 -136 56s-100 -20 -136 -56s-56 -85 -56 -136s20 -100 56 -136c14 -14 31 -25 48 -34c1 6 2 10 3 16c4 18 29 122 29 122
+s-8 15 -8 36c0 33 20 58 44 58c20 0 30 -16 30 -34c0 -20 -13 -51 -20 -79c-6 -24 12 -43 35 -43c42 0 71 54 71 119c0 49 -33 85 -93 85c-68 0 -110 -50 -110 -107c0 -20 6 -33 15 -44c4 -5 5 -6 3 -12c-1 -4 -4 -14 -5 -18c-2 -6 -6 -8 -11 -6c-31 13 -46 48 -46 86
+c0 64 54 140 160 140c86 0 142 -63 142 -129c0 -88 -49 -153 -121 -153c-24 0 -47 13 -55 28c0 0 -12 -52 -15 -62c-2 -6 -4 -13 -7 -19c15 -4 31 -6 47 -6c51 0 100 20 136 56z" />
+    <glyph glyph-name="ion-social-pinterest" unicode="&#xf2b1;" 
+d="M224 416c124 0 224 -100 224 -224s-100 -224 -224 -224c-22 0 -44 3 -64 9c8 14 18 31 23 48c3 10 16 62 16 62c8 -15 30 -28 54 -28c72 0 121 65 121 153c0 66 -56 129 -142 129c-106 0 -160 -76 -160 -140c0 -39 15 -73 46 -86c5 -2 10 0 12 6c1 4 3 14 4 18
+c2 6 1 7 -3 12c-9 11 -15 24 -15 44c0 57 42 107 110 107c60 0 94 -36 94 -85c0 -65 -29 -119 -71 -119c-24 0 -42 19 -36 43c7 28 20 59 20 79c0 18 -10 34 -30 34c-24 0 -43 -25 -43 -58c0 -21 7 -36 7 -36s-25 -104 -29 -122c-4 -17 -5 -35 -4 -51
+c-79 35 -134 113 -134 205c0 124 100 224 224 224z" />
+    <glyph glyph-name="ion-social-python" unicode="&#xf4e9;" horiz-adv-x="384" 
+d="M129 199c-29 -5 -49 -30 -49 -57v-43v-3h-15c-29 0 -54 29 -62 69c-2 9 -3 17 -3 27v1c0 53 29 95 65 95h127v16h-96v29c0 26 7 40 46 47c13 2 29 4 45 4s39 -1 55 -4c25 -4 46 -22 46 -47v-57v-31c0 -21 -14 -38 -33 -43c-4 -1 -8 -2 -13 -2h-104h3c-4 0 -8 0 -12 -1z
+M140 321c10 0 17 7 17 17s-7 18 -17 18s-18 -8 -18 -18s8 -17 18 -17zM380 225c3 -10 4 -21 4 -33c0 -16 -3 -30 -7 -43c-11 -31 -33 -53 -58 -53h-127v-16h96v-26c0 -26 -23 -40 -46 -47c-35 -10 -68 -9 -97 0c-25 7 -49 22 -49 47v54v33c0 21 14 36 33 41c4 1 8 2 13 2
+h104c3 0 6 1 9 1c27 4 49 28 49 62v38v3h15c28 0 52 -26 61 -63zM244 65c-10 0 -18 -7 -18 -17s8 -18 18 -18s17 8 17 18s-7 17 -17 17z" />
+    <glyph glyph-name="ion-social-reddit-outline" unicode="&#xf23a;" horiz-adv-x="449" 
+d="M259 160c0 21 11 31 32 31s32 -10 32 -31s-11 -32 -32 -32s-32 11 -32 32zM127 160c0 21 11 31 32 31s32 -10 32 -31s-11 -32 -32 -32s-32 11 -32 32zM449 197c0 -20 -9 -36 -27 -45c1 -5 1 -9 1 -14c0 -38 -19 -71 -58 -98s-85 -40 -140 -40s-102 13 -141 40
+s-58 59 -58 97c0 5 0 10 1 15c-18 9 -27 24 -27 45c0 14 5 25 15 35s21 15 35 15c13 0 24 -4 33 -13c36 25 79 39 129 41h7l29 98l86 -17c8 19 21 28 41 28c12 0 22 -4 31 -13s13 -20 13 -32s-4 -23 -13 -32s-19 -13 -31 -13s-23 4 -32 13s-13 19 -13 31l-69 14l-24 -77
+c50 -2 94 -16 129 -41c10 9 21 13 34 13c9 0 16 -3 24 -7s14 -10 18 -18s7 -16 7 -25zM375 366c-4 0 -8 -1 -11 -2s-6 -4 -8 -6s-5 -6 -6 -9s-2 -6 -2 -10c0 -8 3 -14 8 -19s12 -8 19 -8c5 0 9 1 13 3s8 6 10 10s4 9 4 14c0 8 -3 14 -8 19s-12 8 -19 8zM18 197
+c0 -11 5 -20 14 -27c7 19 19 37 37 53c-6 4 -12 6 -19 6c-3 0 -7 0 -10 -1s-6 -3 -9 -5s-5 -4 -7 -7s-4 -6 -5 -9s-1 -6 -1 -10zM355 55c34 23 50 51 50 83v9c-1 6 -3 12 -5 18c-6 16 -15 30 -30 43c-5 4 -10 9 -15 12v0c-36 25 -79 37 -130 37s-95 -12 -131 -37v0
+c-5 -3 -10 -8 -15 -12c-15 -13 -24 -27 -30 -43c-2 -6 -4 -12 -5 -18v-9c0 -32 16 -60 50 -83c36 -25 80 -37 131 -37s94 12 130 37zM417 170c9 6 14 16 14 27c0 9 -3 17 -9 23s-13 9 -22 9c-7 0 -14 -2 -20 -6c18 -16 30 -34 37 -53zM289 90l13 -12
+c-20 -20 -45 -30 -77 -30s-58 10 -78 30l13 12c16 -16 38 -24 65 -24s48 8 64 24z" />
+    <glyph glyph-name="ion-social-reddit" unicode="&#xf23b;" horiz-adv-x="449" 
+d="M449 197c0 -20 -11 -37 -27 -45c1 -5 1 -9 1 -14c0 -76 -89 -138 -199 -138s-198 61 -198 137c0 5 0 10 1 15c-16 8 -27 25 -27 45c0 28 23 50 50 50c13 0 24 -5 33 -13c33 23 79 39 129 41h2l31 103l90 -18c8 14 22 24 39 24v0h1c25 0 44 -20 44 -45s-19 -45 -44 -45h-1
+v0c-23 0 -42 17 -44 40l-67 14l-22 -74c49 -3 93 -17 125 -40c9 8 21 13 34 13c27 0 49 -22 49 -50zM34 177c5 15 15 29 29 41c-4 3 -9 5 -15 5c-14 0 -25 -11 -25 -25c0 -9 4 -17 11 -21zM358 339c0 -9 7 -17 16 -17s17 8 17 17s-8 17 -17 17s-16 -8 -16 -17zM127 160
+c0 -18 14 -32 32 -32s32 14 32 32s-14 31 -32 31s-32 -13 -32 -31zM224 48c48 0 77 29 78 30l-13 12s-25 -24 -65 -24c-41 0 -64 24 -64 24l-13 -12c1 -1 29 -30 77 -30zM291 128c18 0 32 14 32 32s-14 31 -32 31s-32 -13 -32 -31s14 -32 32 -32zM415 176c7 5 11 13 11 22
+c0 14 -11 25 -25 25c-6 0 -11 -2 -15 -5c14 -12 24 -27 29 -42z" />
+    <glyph glyph-name="ion-social-rss-outline" unicode="&#xf23c;" horiz-adv-x="384" 
+d="M56 112c31 0 56 -25 56 -56s-25 -56 -56 -56s-56 25 -56 56s25 56 56 56zM56 16c22 0 40 18 40 40s-18 40 -40 40s-40 -18 -40 -40s18 -40 40 -40zM0 256c140 0 256 -116 256 -256h-80c0 48 -14 94 -48 128s-80 48 -128 48v80zM240 16c-2 26 -8 52 -19 77
+c-12 28 -30 54 -52 76s-48 40 -76 52c-25 10 -51 16 -77 18v-47c50 -3 92 -22 123 -53s50 -73 53 -123h48zM0 384c212 0 384 -172 384 -384h-80c0 171 -133 304 -304 304v80zM227 228c56 -56 89 -131 93 -212h48c-8 190 -162 344 -352 352v-48c81 -4 155 -36 211 -92z" />
+    <glyph glyph-name="ion-social-rss" unicode="&#xf23d;" horiz-adv-x="384" 
+d="M56 112c31 0 56 -25 56 -56s-25 -56 -56 -56s-56 25 -56 56s25 56 56 56zM0 256c140 0 256 -116 256 -256h-80c0 48 -14 94 -48 128s-80 48 -128 48v80zM0 384c212 0 384 -172 384 -384h-80c0 171 -133 304 -304 304v80z" />
+    <glyph glyph-name="ion-social-sass" unicode="&#xf4ea;" horiz-adv-x="512" 
+d="M512 119v-8c-1 -9 -7 -17 -15 -22s-12 -4 -13 -3s1 3 4 5c13 8 17 20 10 33c-5 10 -15 16 -26 20c-24 8 -48 7 -72 0c4 -12 7 -23 -2 -34c-10 -12 -23 -19 -39 -22c-7 -2 -14 2 -15 9c-3 19 17 36 30 47c-7 11 -11 24 -14 37c-15 -17 -31 -40 -26 -61
+c3 -14 -1 -27 -14 -36s-30 -14 -46 -11c-4 1 -6 5 -5 8c2 14 25 32 35 43c2 2 3 4 1 7c-6 12 -10 23 -14 36c-13 -29 -30 -80 -57 -98c-9 -6 -17 -4 -21 5c-3 8 -2 20 -1 29c-6 -13 -11 -27 -20 -38c-7 -8 -24 -7 -30 1c-16 21 -13 50 -5 73l-29 -15c7 -16 8 -32 4 -49
+c-5 -19 -17 -35 -35 -46c-19 -12 -64 -24 -77 4c-7 16 -4 30 6 44c17 24 48 37 74 50c-32 23 -80 42 -96 80c-15 35 17 68 43 89c59 48 166 95 244 59c15 -7 36 -24 31 -52c-4 -24 -13 -39 -28 -54c-32 -32 -152 -77 -176 -15c-1 1 -1 4 1 4c2 -1 20 -15 43 -16
+c17 -1 36 3 52 8c33 11 71 33 80 67c4 13 -2 28 -15 34c-49 24 -116 -4 -159 -26c-33 -17 -84 -45 -82 -87c1 -37 56 -60 81 -82c15 7 42 15 52 27c11 13 26 25 44 26c8 0 14 -3 16 -10c2 -6 1 -11 0 -19c5 4 11 4 15 -1c12 -14 -22 -50 -10 -66c14 14 21 42 30 59
+c4 8 17 51 26 53c7 2 18 4 25 0c2 -1 3 -3 2 -5c-7 -19 -7 -33 3 -52c14 20 29 43 34 67c1 2 3 3 5 4c7 2 18 3 25 0c3 -1 3 -2 2 -5c-7 -22 -6 -38 6 -58c31 11 69 15 97 -5c-3 2 -7 5 0 0c5 -4 3 -2 0 0c12 -8 19 -18 21 -32zM113 94v0c1 7 -1 13 -3 20
+c-24 -8 -66 -35 -64 -62c1 -10 8 -13 17 -12s19 7 27 13c14 11 22 24 23 41zM216 166c1 3 -2 5 -5 4c-29 -8 -43 -57 -33 -81c1 -3 4 -3 6 -1c17 16 28 56 32 78zM286 84c8 -3 27 17 26 27c-8 -9 -18 -18 -26 -27zM367 102c11 6 16 19 12 30c-8 -6 -21 -19 -20 -31
+c0 -2 6 0 8 1z" />
+    <glyph glyph-name="ion-social-skype-outline" unicode="&#xf23e;" horiz-adv-x="384" 
+d="M106 352c-41 0 -74 -33 -74 -73c0 -13 4 -25 10 -36l6 -11l-2 -12c-2 -10 -3 -20 -3 -30c0 -40 16 -77 44 -105s67 -44 107 -44c9 0 19 1 28 3l11 2l9 -5c11 -6 24 -9 36 -9c41 0 74 33 74 73c0 11 -3 22 -8 32l-5 10l3 11c2 10 3 21 3 32c0 40 -16 77 -44 105
+s-67 43 -107 43c-9 0 -18 0 -26 -2l-12 -2l-10 7c-12 7 -26 11 -40 11zM106 384v0c21 0 40 -6 56 -16c10 2 21 2 32 2c101 0 183 -80 183 -180c0 -13 -1 -27 -4 -39c7 -14 11 -29 11 -46c0 -58 -47 -105 -106 -105c-18 0 -35 4 -50 12c-11 -2 -22 -3 -34 -3
+c-101 0 -183 81 -183 181c0 12 2 24 4 36c-9 16 -15 34 -15 53c0 58 47 105 106 105zM288 104c-8 -12 -21 -21 -37 -28s-36 -10 -58 -10c-26 0 -48 5 -65 14c-12 7 -22 15 -30 26s-12 22 -12 33c0 7 3 12 8 17s11 7 19 7c6 0 12 -2 16 -6s7 -8 10 -15s7 -13 11 -18
+s8 -9 15 -12s16 -5 27 -5c15 0 28 4 37 10s13 13 13 22c0 7 -2 13 -7 17c-5 5 -11 9 -19 11c-8 3 -20 5 -34 8c-19 4 -35 9 -48 14c-13 6 -24 13 -32 23s-11 22 -11 36s4 25 12 36c8 10 20 19 36 25c15 6 34 8 54 8c16 0 30 -1 42 -5s23 -9 31 -15s14 -13 18 -20
+s5 -14 5 -21c0 -6 -2 -12 -7 -17s-11 -8 -19 -8c-7 0 -12 2 -16 5c-3 3 -7 7 -11 14c-5 8 -10 15 -16 20s-17 8 -31 8c-13 0 -23 -3 -31 -8s-12 -11 -12 -18c0 -4 2 -7 4 -10c3 -3 6 -6 11 -8s10 -5 15 -6s13 -3 25 -6c15 -3 28 -6 40 -10s23 -8 32 -14s15 -13 20 -22
+s8 -20 8 -32c0 -15 -5 -28 -13 -40z" />
+    <glyph glyph-name="ion-social-skype" unicode="&#xf23f;" horiz-adv-x="384" 
+d="M373 151c7 -14 11 -29 11 -46c0 -58 -47 -105 -106 -105c-18 0 -35 4 -50 12c-11 -2 -22 -3 -34 -3c-101 0 -183 81 -183 181c0 12 2 24 4 36c-9 16 -15 34 -15 53c0 58 47 105 106 105c21 0 41 -6 57 -16c10 2 20 2 31 2c101 0 183 -80 183 -180c0 -13 -1 -27 -4 -39z
+M288 104c9 12 12 25 12 40c0 12 -2 23 -7 32s-12 16 -21 22s-19 10 -31 14s-26 7 -41 10c-12 3 -20 5 -25 6s-10 4 -15 6s-7 5 -10 8c-2 3 -4 6 -4 10c0 7 3 13 11 18s19 7 32 7c14 0 25 -2 31 -7s11 -12 16 -20c4 -7 8 -11 11 -14c4 -3 9 -5 16 -5c8 0 13 3 18 8s8 11 8 17
+c0 7 -2 14 -6 21s-10 14 -18 20s-18 11 -30 15s-27 5 -43 5c-20 0 -38 -2 -53 -8c-16 -6 -28 -15 -36 -25c-8 -11 -12 -22 -12 -36s3 -26 11 -36s19 -17 32 -23c13 -5 29 -10 48 -14c14 -3 26 -5 34 -8c8 -2 14 -6 19 -11c5 -4 7 -10 7 -17c0 -9 -4 -17 -13 -23
+s-22 -9 -37 -9c-11 0 -20 2 -27 5s-11 6 -15 11s-8 12 -11 19s-6 11 -10 15s-10 6 -16 6c-8 0 -14 -2 -19 -7s-8 -10 -8 -17c0 -11 4 -22 12 -33s18 -19 30 -26c17 -9 39 -14 65 -14c22 0 42 3 58 10s29 16 37 28z" />
+    <glyph glyph-name="ion-social-snapchat-outline" unicode="&#xf4eb;" horiz-adv-x="480" 
+d="M240 400v0v0c-71 0 -128 -54 -118 -128c2 -15 3 -32 4 -45c0 0 -2 -5 -12 -5c-6 0 -15 2 -28 7c-2 1 -4 1 -6 1c-8 0 -13 -6 -14 -12c0 -5 4 -11 8 -13c14 -7 47 -10 47 -33s-23 -47 -41 -64s-64 -21 -64 -21s0 -21 32 -29s32 -5 33 -13c2 -15 1 -22 11 -22c2 0 4 1 6 1
+c8 1 20 3 32 3c11 0 23 -2 34 -9c23 -15 41 -34 76 -34s53 19 76 34c11 7 24 9 35 9c12 0 23 -2 31 -3c2 0 4 -1 6 -1c10 0 9 7 11 22c1 8 1 5 33 13s32 29 32 29s-46 4 -64 21s-41 41 -41 64s33 26 47 33c4 2 9 8 9 13c-1 6 -6 12 -14 12c-2 0 -5 0 -7 -1
+c-13 -5 -21 -6 -27 -6c-10 0 -13 4 -13 4c1 13 2 30 4 45c10 74 -47 128 -118 128zM240 416v0c41 0 80 -16 105 -45c24 -28 34 -63 29 -101c-1 -11 -2 -22 -3 -31c4 1 10 2 18 5c4 1 8 2 12 2c16 0 29 -12 30 -27c1 -13 -9 -25 -18 -29c-4 -2 -9 -3 -14 -5
+c-7 -2 -14 -5 -19 -8c-4 -3 -5 -4 -5 -5c0 -16 20 -37 36 -52c11 -10 39 -16 54 -17l15 -1v-14c0 -2 0 -11 -6 -21c-5 -8 -16 -19 -38 -24c-6 -1 -11 -3 -15 -4c-2 -1 -5 -1 -7 -1v-1c-1 -7 -1 -13 -4 -18c-2 -5 -9 -12 -22 -12c-2 0 -6 0 -9 1c-2 0 -3 1 -5 1
+c-7 1 -15 2 -23 2c-10 0 -19 -2 -26 -6c-4 -3 -9 -7 -14 -10c-18 -13 -38 -27 -71 -27s-53 14 -71 27c-5 3 -9 7 -14 10c-7 4 -15 6 -25 6c-8 0 -17 -1 -24 -2c-2 0 -3 -1 -5 -1c-3 -1 -7 -1 -9 -1c-13 0 -20 7 -22 12c-3 5 -3 11 -4 18v1c-2 0 -4 0 -6 1c-4 1 -10 3 -16 4
+c-22 5 -33 16 -38 24c-6 10 -6 18 -6 20v15l15 1c16 1 44 7 54 17c29 27 36 43 36 52c0 1 0 2 -4 5c-5 3 -13 6 -20 8c-5 2 -10 3 -14 5c-9 4 -18 16 -17 29c1 15 14 27 30 27c4 0 8 0 12 -2c8 -3 13 -4 17 -5c-1 9 -2 19 -3 30c-5 38 5 74 29 102c25 29 64 45 105 45v0z
+M240 219c-21 0 -41 8 -56 23c-3 3 -3 9 0 12s9 3 12 0c12 -12 27 -19 44 -19c16 0 32 7 44 19c3 3 9 3 12 0s3 -9 0 -12c-15 -15 -35 -23 -56 -23zM176 296c0 16 5 24 16 24s16 -8 16 -24s-5 -24 -16 -24s-16 8 -16 24zM272 296c0 16 5 24 16 24s16 -8 16 -24
+s-5 -24 -16 -24s-16 8 -16 24z" />
+    <glyph glyph-name="ion-social-snapchat" unicode="&#xf4ec;" horiz-adv-x="480" 
+d="M480 88c0 -2 0 -11 -6 -21c-5 -8 -16 -19 -38 -24c-6 -1 -11 -3 -15 -4c-2 -1 -5 -1 -7 -1v-1c-1 -7 -1 -13 -4 -18c-2 -5 -9 -12 -22 -12c-2 0 -6 0 -9 1c-2 0 -3 1 -5 1c-7 1 -15 2 -23 2c-10 0 -19 -2 -26 -6c-4 -3 -9 -7 -14 -10c-18 -13 -38 -27 -71 -27
+s-53 14 -71 27c-5 3 -9 7 -14 10c-7 4 -15 6 -25 6c-8 0 -17 -1 -24 -2c-2 0 -3 -1 -5 -1c-3 -1 -7 -1 -9 -1c-13 0 -20 7 -22 12c-3 5 -3 11 -4 18v1c-2 0 -4 0 -6 1c-4 1 -10 3 -16 4c-22 5 -33 16 -38 24c-6 10 -6 18 -6 20v15l15 1c16 1 44 7 54 17c29 27 36 43 36 52
+c0 1 0 2 -4 5c-5 3 -13 6 -20 8c-5 2 -10 3 -14 5c-9 4 -18 16 -17 29c1 15 14 27 30 27c4 0 8 0 12 -2c8 -3 13 -4 17 -5c-1 9 -2 19 -3 30c-5 38 5 74 29 102c25 29 64 45 105 45v0c41 0 80 -16 105 -45c24 -28 34 -63 29 -101c-1 -11 -2 -22 -3 -31c4 1 10 2 18 5
+c4 1 8 2 12 2c16 0 29 -12 30 -27c1 -13 -9 -25 -18 -29c-4 -2 -9 -3 -14 -5c-7 -2 -14 -5 -19 -8c-4 -3 -5 -4 -5 -5c0 -16 20 -37 36 -52c11 -10 39 -16 54 -17l15 -1v-14zM192 320c-9 0 -16 -11 -16 -24s7 -24 16 -24s16 11 16 24s-7 24 -16 24zM296 242c3 3 3 9 0 12
+s-9 3 -12 0c-12 -12 -28 -19 -44 -19c-17 0 -32 7 -44 19c-3 3 -9 3 -12 0s-3 -9 0 -12c15 -15 35 -23 56 -23s41 8 56 23zM288 272c9 0 16 11 16 24s-7 24 -16 24s-16 -11 -16 -24s7 -24 16 -24z" />
+    <glyph glyph-name="ion-social-tumblr-outline" unicode="&#xf240;" horiz-adv-x="256" 
+d="M193 52c21 0 42 6 63 20v-65c-18 -8 -34 -15 -48 -18s-28 -5 -45 -5c-19 0 -35 2 -50 7c-14 5 -28 12 -38 21s-17 18 -21 28s-6 25 -6 44v140h-48v58c16 5 30 14 42 24s19 21 26 35s11 37 14 59h62v-112h96v-64h-96v-101c0 -24 1 -40 4 -47c2 -7 7 -12 14 -16
+c9 -6 19 -8 31 -8zM240 17v29c-15 -6 -31 -10 -47 -10c-15 0 -28 3 -40 10c-10 6 -17 15 -21 25c-2 6 -4 17 -4 52v117h96v32h-96v112h-32c-2 -16 -7 -36 -14 -50c-8 -16 -17 -29 -30 -40c-11 -9 -23 -17 -36 -23v-31h48v-156c0 -21 2 -32 4 -38c3 -8 10 -15 18 -22
+c9 -8 19 -14 31 -18c13 -4 29 -6 46 -6c16 0 28 2 41 5c11 2 23 6 36 12z" />
+    <glyph glyph-name="ion-social-tumblr" unicode="&#xf241;" horiz-adv-x="256" 
+d="M193 52c21 0 42 6 63 20v-65c-18 -8 -34 -15 -48 -18s-28 -5 -45 -5c-19 0 -35 2 -50 7c-14 5 -28 12 -38 21s-17 18 -21 28s-6 25 -6 44v140h-48v58c16 5 30 14 42 24s19 21 26 35s11 37 14 59h62v-112h96v-64h-96v-101c0 -24 1 -40 4 -47c2 -7 7 -12 14 -16
+c9 -6 19 -8 31 -8z" />
+    <glyph glyph-name="ion-social-tux" unicode="&#xf2c5;" horiz-adv-x="383" 
+d="M189 347c2 2 -1 -1 0 0c2 2 4 4 6 5c-3 -2 -5 -4 -7 -8c0 1 0 2 1 3zM361 52c7 -4 23 -11 21 -22c-2 -10 -17 -15 -24 -19c-15 -8 -28 -14 -41 -25c-9 -8 -17 -15 -29 -17c-11 -2 -25 -1 -33 8c-5 5 -7 11 -15 12c-25 5 -54 4 -79 0c-13 -2 -21 -11 -32 -17
+c-10 -5 -20 -5 -30 -1c-13 5 -27 10 -41 13s-29 5 -43 9c-31 8 -5 30 -11 50c-3 12 -10 29 8 30c9 1 27 -1 31 11c2 7 -2 15 2 22s-1 17 1 25c4 18 19 32 25 49c5 14 8 25 18 37c9 11 22 22 29 34c10 18 9 35 8 55c-1 17 -1 33 -2 50c0 33 20 60 58 60h14
+c38 0 63 -32 64 -69c0 -19 -5 -38 5 -67c15 -27 36 -48 52 -73c10 -16 16 -31 20 -49c3 -14 9 -31 7 -45c-1 -6 -2 -9 -4 -11c3 -1 7 -2 9 -5c3 -4 2 -11 0 -26c-1 -8 5 -15 12 -19zM137 -3c2 20 -15 39 -25 56c-10 16 -21 43 -39 52c-8 4 -19 5 -23 -5c-2 -7 0 -19 -2 -22
+c-4 -9 -14 -10 -23 -11c-6 0 -17 0 -17 -8c1 -10 10 -20 7 -30c-2 -7 -8 -12 -8 -19c0 -14 38 -15 47 -17c19 -4 37 -14 57 -16c12 -1 25 7 26 20zM253 62c-2 10 2 -10 0 0s-5 28 1 35c4 5 10 6 17 5c0 4 1 9 3 12c8 13 29 8 39 0l-1 2c-3 4 -8 9 -13 10c0 0 4 12 2 34
+c-4 40 -33 62 -33 62c27 -30 27 -58 27 -72c0 -6 -1 -18 -4 -24c-4 -1 -7 -2 -11 -4c-10 -5 -8 2 -8 10c0 18 -2 36 -7 54c-3 9 -7 17 -13 24c-4 5 -4 9 -5 15c-3 12 -9 22 -16 32c-7 9 -7 17 -5 28c1 7 2 14 -6 17c-6 2 -26 5 -27 14c-1 6 -1 16 5 20c16 14 30 -11 17 -24
+c-3 -3 7 -4 8 -4c4 1 4 7 5 10c1 4 1 9 1 13c0 17 -18 32 -34 21c-6 -4 -9 -11 -10 -17c0 -2 -1 -20 0 -20c-4 0 -7 5 -11 5c-3 0 -7 0 -10 -1c0 0 2 14 -2 22c-4 9 -18 16 -24 4s-3 -25 0 -31s4 -6 4 -6c2 1 5 4 5 4s-6 3 -7 11c-1 9 3 14 7 15s10 -2 12 -8s0 -13 0 -13
+c-7 -6 -30 -18 -22 -28c14 -18 33 -15 52 -9c8 3 18 5 24 12c3 3 11 2 8 -4c-2 -5 -18 -7 -22 -9c-9 -4 -18 -8 -28 -10c-6 -1 -13 -5 -28 9c7 -6 8 -16 17 -20c13 -6 33 9 44 15c1 1 16 5 14 0c-1 -4 -11 -7 -15 -9c-11 -6 -23 -21 -36 -22c-8 -1 -21 16 -25 22
+c-1 1 -5 9 -6 4c-1 -8 2 -14 -3 -21c-6 -9 -11 -18 -13 -29c-1 -6 0 -11 -3 -16c-11 -15 -17 -33 -19 -51c0 -4 3 -43 -5 -41c-18 5 -17 33 -14 47c-3 -12 -8 -30 2 -44c12 -15 99 -55 53 -80c7 -14 14 -25 12 -41c8 7 2 20 -1 28c0 0 17 -12 38 -10c17 2 32 7 46 16
+c6 4 11 9 16 14c1 2 4 6 6 7l1 -11c2 -17 -12 -27 -10 -34c4 8 11 14 13 24c3 12 0 24 -2 36zM155 323v0v-3c2 0 2 5 1 8c-1 4 -3 6 -4 6h-2c3 -2 5 -6 5 -11zM210 335c3 -2 0 0 0 0c3 -2 5 -5 5 -10v-3c2 0 3 4 2 7s-3 6 -5 6h-2zM347 15c24 11 -24 -10 0 0
+c24 11 35 17 20 26c-17 10 -26 13 -26 29c0 5 4 16 2 22c-1 4 -6 5 -9 5c-10 -10 -17 -25 -34 -25c-14 0 -25 11 -28 24c-4 2 -10 1 -13 -4c-6 -12 1 -29 3 -41c2 -18 -4 -35 -2 -53c2 -21 26 -22 40 -13c16 10 29 22 47 30z" />
+    <glyph glyph-name="ion-social-twitch-outline" unicode="&#xf4ed;" horiz-adv-x="416" 
+d="M32 416h384v-272l-112 -112h-80l-64 -64h-64v64h-96v304zM368 160v208h-304v-272h80v-64l64 64h96zM272 176v129h48v-129h-48zM160 176v129h48v-129h-48z" />
+    <glyph glyph-name="ion-social-twitch" unicode="&#xf4ee;" horiz-adv-x="416" 
+d="M32 416h384v-272l-112 -112h-80l-64 -64h-64v64h-96v304zM208 176v129h-48v-129h48zM320 176v129h-48v-129h48z" />
+    <glyph glyph-name="ion-social-twitter-outline" unicode="&#xf242;" horiz-adv-x="472" 
+d="M472 338c-13 -20 -29 -36 -48 -50v-12c0 -128 -98 -276 -276 -276c-55 0 -105 16 -148 44c8 -1 15 -2 23 -2c45 0 87 16 120 42c-42 1 -78 29 -90 67c6 -1 12 -2 18 -2c9 0 18 2 26 4c-44 9 -78 48 -78 95v1c13 -7 28 -12 44 -12c-26 17 -43 47 -43 81c0 18 5 34 13 48
+c48 -59 119 -97 199 -101c-2 7 -2 14 -2 22c0 54 43 97 97 97c28 0 52 -12 70 -31c22 4 43 13 62 24c-7 -23 -23 -42 -43 -54c20 2 39 7 56 15zM414 301c3 2 8 6 11 8c-2 0 -11 -2 -19 -1s-21 5 -21 5s14 13 18 17l11 11c-4 -1 -10 -2 -14 -3l-8 -2l-6 6
+c-15 16 -37 26 -59 26c-45 0 -81 -37 -81 -81c0 -6 1 -12 2 -18l5 -21l-22 1c-42 2 -81 13 -118 32c-28 14 -53 34 -75 56c-1 -6 -2 -13 -2 -19c0 -27 14 -53 36 -68c0 0 33 -23 46 -29c-24 -2 -56 0 -56 0c-8 0 -16 1 -24 3c8 -28 32 -50 62 -56l61 -10l-61 -21
+c-7 -2 -14 -3 -21 -3c15 -20 38 -34 64 -34l45 -1l-35 -28c-18 -14 -38 -25 -60 -33c-10 -3 -19 -6 -29 -8c27 -9 55 -14 84 -14c40 0 78 8 112 24c31 14 58 34 81 60c22 24 38 53 50 84c11 30 17 62 17 92v12l-1 8z" />
+    <glyph glyph-name="ion-social-twitter" unicode="&#xf243;" horiz-adv-x="472" 
+d="M472 338c-13 -20 -29 -36 -48 -50v-12c0 -128 -98 -276 -276 -276c-55 0 -105 16 -148 44c8 -1 15 -2 23 -2c45 0 87 16 120 42c-42 1 -78 29 -90 67c6 -1 12 -2 18 -2c9 0 18 2 26 4c-44 9 -78 48 -78 95v1c13 -7 28 -12 44 -12c-26 17 -43 47 -43 81c0 18 5 34 13 48
+c48 -59 119 -97 199 -101c-2 7 -2 14 -2 22c0 54 43 97 97 97c28 0 52 -12 70 -31c22 4 43 13 62 24c-7 -23 -23 -42 -43 -54c20 2 39 7 56 15z" />
+    <glyph glyph-name="ion-social-usd-outline" unicode="&#xf352;" horiz-adv-x="320" 
+d="M125 345c11 2 19 3 19 3v-131l-22 6c-15 5 -27 11 -36 19c-12 10 -19 25 -19 43c0 13 4 24 11 33c6 8 13 14 22 19c7 4 17 6 25 8zM128 238v92c-7 -2 -15 -4 -21 -7c-7 -4 -12 -9 -17 -15s-7 -14 -7 -23c0 -13 4 -24 13 -31c8 -7 20 -12 32 -16zM252 151
+c10 -10 15 -24 15 -42c0 -9 -1 -18 -5 -27s-11 -17 -20 -24c-8 -6 -18 -11 -31 -15c-6 -2 -11 -3 -17 -4s-18 -1 -18 -1v145l20 -5c10 -3 19 -6 28 -9c10 -4 20 -10 28 -18zM247 89c3 7 4 13 4 20c0 14 -3 24 -10 31s-15 11 -23 14s-16 5 -26 8v-107c6 1 10 2 14 3
+c11 3 20 8 27 13s11 11 14 18zM315 145c3 -10 5 -19 5 -29c0 -21 -5 -38 -14 -53s-20 -26 -35 -35s-31 -17 -50 -21c-10 -2 -19 -3 -29 -4v-35h-64v35c-9 1 -19 4 -28 6c-20 5 -36 12 -51 23s-26 24 -35 41c-8 16 -13 34 -14 55h69c0 -12 2 -24 7 -33c5 -10 12 -17 21 -23
+s20 -11 31 -14v120c-8 2 -18 4 -27 6c-17 4 -30 9 -41 16s-20 15 -27 23s-11 17 -14 26s-4 18 -4 28c0 18 4 34 12 48s19 25 33 34s29 16 46 20c7 2 15 3 22 4v33h64v-33c9 -1 16 -4 24 -6c18 -5 34 -12 48 -22s25 -22 33 -37c7 -13 11 -28 12 -46h-69c-3 21 -12 37 -26 46
+c-7 4 -13 8 -22 10v-106c9 -2 16 -4 25 -6c12 -3 22 -6 27 -7c13 -4 23 -9 33 -15c10 -7 18 -14 24 -22s11 -17 14 -27zM293 72c7 12 11 27 11 44c0 8 -1 16 -4 24s-7 15 -12 22s-12 13 -20 19c-8 5 -18 10 -29 13c-5 1 -13 3 -24 6h-1l-4 1c-7 2 -13 4 -21 6l-13 3v137
+s9 -1 19 -4s19 -6 28 -12c15 -9 25 -24 30 -43h38c-2 8 -4 15 -8 22c-7 13 -16 24 -28 32c-12 9 -27 16 -43 20c-8 2 -16 4 -23 5l-13 2v31h-32v-31l-14 -2c-7 -1 -14 -2 -20 -4c-15 -4 -29 -10 -41 -18s-21 -16 -28 -28c-7 -11 -10 -24 -10 -40c0 -8 1 -15 3 -23
+c2 -7 6 -14 11 -21s14 -13 23 -19c10 -6 22 -10 37 -14v0v0c4 -1 8 -2 11 -3c5 -1 11 -3 16 -4l12 -3v-151s-8 1 -20 4s-26 8 -36 15c-11 8 -20 18 -26 30c-4 7 -6 16 -8 24h-36c2 -11 5 -23 10 -32c8 -14 17 -26 30 -35c13 -10 28 -16 46 -21c8 -2 17 -4 26 -5l14 -2v-33
+h32v33l15 1c9 1 17 3 26 5c17 4 32 10 45 18s23 19 31 31z" />
+    <glyph glyph-name="ion-social-usd" unicode="&#xf353;" horiz-adv-x="320" 
+d="M315 145c3 -10 5 -19 5 -29c0 -21 -5 -38 -14 -53s-20 -26 -35 -35s-31 -17 -50 -21c-10 -2 -19 -3 -29 -4v-35h-64v35c-9 1 -19 4 -28 6c-20 5 -36 12 -51 23s-26 24 -35 41c-8 16 -13 34 -14 55h69c0 -12 2 -24 7 -33c5 -10 12 -17 21 -23s20 -11 31 -14v120
+c-8 2 -18 4 -27 6c-17 4 -30 9 -41 16s-20 15 -27 23s-11 17 -14 26s-4 18 -4 28c0 18 4 34 12 48s19 25 33 34s29 16 46 20c7 2 15 3 22 4v33h64v-33c9 -1 16 -4 24 -6c18 -5 34 -12 48 -22s25 -22 33 -37c7 -13 11 -28 12 -46h-69c-3 21 -12 37 -26 46c-7 4 -13 8 -22 10
+v-106c9 -2 16 -4 25 -6c12 -3 22 -6 27 -7c13 -4 23 -9 33 -15c10 -7 18 -14 24 -22s11 -17 14 -27zM128 238v92c-7 -2 -15 -4 -21 -7c-7 -4 -12 -9 -17 -15s-7 -14 -7 -23c0 -13 4 -24 13 -31c8 -7 20 -12 32 -16zM247 89c3 7 4 13 4 20c0 14 -3 24 -10 31s-15 11 -23 14
+s-16 5 -26 8v-107c6 1 10 2 14 3c11 3 20 8 27 13s11 11 14 18z" />
+    <glyph glyph-name="ion-social-vimeo-outline" unicode="&#xf244;" 
+d="M445 334c7 -33 1 -66 -13 -97s-31 -59 -51 -87c-26 -36 -52 -71 -85 -101c-19 -18 -41 -35 -66 -44c-10 -4 -19 -5 -27 -5c-17 0 -31 9 -44 27c-14 19 -22 40 -28 63c-12 45 -25 90 -38 134c-4 12 -9 22 -15 33c-3 5 -8 10 -12 14c-2 2 -5 3 -8 3s-6 -1 -9 -3
+c-10 -6 -28 -18 -28 -18l-21 27c26 24 82 71 82 71c11 9 33 25 48 27h8c18 0 32 -7 42 -22c11 -17 15 -37 18 -57c7 -41 12 -82 24 -122c3 -10 7 -20 12 -29c4 -7 9 -10 14 -10c4 0 7 2 11 5s7 6 10 10c20 24 37 52 48 81c3 9 3 17 3 27c0 13 -10 25 -25 26h-7
+c-11 0 -20 -2 -32 -7c6 24 24 62 54 84c20 14 45 20 67 20c10 0 20 -2 27 -4c23 -8 36 -23 41 -46zM418 244c13 30 17 59 11 87c-4 19 -13 28 -30 34c-6 2 -14 3 -22 3c-21 0 -42 -6 -57 -17c-16 -12 -29 -30 -38 -48h6h8c23 -1 39 -19 40 -41c0 -10 0 -22 -4 -34
+c-11 -29 -29 -58 -51 -85c-4 -4 -7 -9 -12 -13c-7 -6 -15 -8 -22 -8c-8 0 -18 3 -27 18c-7 11 -11 22 -14 32c-10 31 -14 64 -19 95c-2 10 -3 19 -5 29c-3 17 -6 36 -16 51c-7 10 -16 15 -28 15h-6c-8 -1 -25 -11 -40 -23c-2 -2 -43 -37 -70 -61l2 -3c5 4 12 7 16 10
+c6 3 12 5 18 5c7 0 13 -3 18 -7c8 -7 13 -12 16 -18c6 -11 12 -24 16 -37c13 -44 26 -88 38 -133c5 -19 13 -41 26 -59s23 -20 31 -20c6 0 13 1 21 4c23 8 43 25 61 41c32 29 57 63 83 99v0c21 28 37 55 50 84z" />
+    <glyph glyph-name="ion-social-vimeo" unicode="&#xf245;" 
+d="M445 334c7 -33 1 -66 -13 -97s-31 -59 -51 -87c-26 -36 -52 -71 -85 -101c-19 -18 -41 -35 -66 -44c-31 -11 -52 -5 -71 22c-14 19 -22 40 -28 63c-12 45 -25 90 -38 134c-4 12 -9 22 -15 33c-3 5 -8 10 -12 14c-5 4 -11 3 -17 0c-10 -6 -28 -18 -28 -18l-21 27
+c26 24 82 71 82 71c11 9 33 25 48 27c21 3 38 -4 50 -22c11 -17 15 -37 18 -57c7 -41 11 -82 23 -122c3 -10 8 -20 13 -29c7 -11 15 -13 25 -5c4 3 7 6 10 10c20 24 37 52 48 81c3 9 3 17 3 27c0 13 -10 25 -25 26s-24 -1 -39 -7c6 24 24 62 54 84c29 21 71 24 94 16
+s36 -23 41 -46z" />
+    <glyph glyph-name="ion-social-whatsapp-outline" unicode="&#xf4ef;" 
+d="M178 294c4 -11 15 -39 16 -42s2 -6 0 -10s-3 -6 -6 -9s-6 -7 -9 -9c-3 -3 -6 -6 -3 -12s14 -24 30 -39c21 -20 38 -27 44 -30s9 -3 12 1s15 16 19 21s8 5 13 3s31 -17 37 -20s10 -5 11 -7s0 -13 -5 -26s-28 -24 -38 -25s-11 -8 -67 16s-90 84 -93 88s-22 31 -21 58
+s17 41 22 46s11 7 15 7h10s9 0 13 -11zM228 384c-50 0 -97 -20 -133 -55c-35 -35 -55 -81 -55 -131c0 -34 9 -67 27 -96l8 -13l-5 -14l-19 -57l61 19l13 4l12 -6c28 -15 59 -23 91 -23c50 0 97 19 133 54c35 35 55 82 55 132s-20 96 -55 131c-36 35 -83 55 -133 55zM228 416
+v0c121 0 220 -97 220 -218s-99 -218 -220 -218c-39 0 -74 10 -106 27l-122 -39l40 117c-20 33 -32 72 -32 113c0 121 99 218 220 218z" />
+    <glyph glyph-name="ion-social-whatsapp" unicode="&#xf4f0;" 
+d="M228 416c121 0 220 -97 220 -218s-99 -218 -220 -218c-39 0 -74 10 -106 27l-122 -39l40 117c-20 33 -32 72 -32 113c0 121 99 218 220 218zM337 115c5 13 6 24 5 26s-5 4 -11 7s-32 18 -37 20s-9 2 -13 -3s-16 -17 -19 -21s-6 -4 -12 -1s-23 10 -44 30
+c-16 15 -27 33 -30 39s0 9 3 12c3 2 6 6 9 9s4 5 6 9s1 7 0 10s-12 31 -16 42s-10 11 -13 11h-10s-10 -2 -15 -7s-21 -19 -22 -46s18 -54 21 -58s37 -64 93 -88s57 -17 67 -16s33 12 38 25z" />
+    <glyph glyph-name="ion-social-windows-outline" unicode="&#xf246;" 
+d="M432 167h-216v-149l216 -32v181zM448 183v0v-215l-248 36v179h248zM168 167h-152v-120l152 -22v142zM184 183v0v-177l-184 27v150h184zM432 398v0l-216 -31v-152h216v183zM448 416v0v-217h-248v182zM168 360v0l-152 -22v-123h152v145zM184 378v0v-179h-184v153z" />
+    <glyph glyph-name="ion-social-windows" unicode="&#xf247;" 
+d="M448 183v0v-215l-248 36v179h248zM184 183v0v-177l-184 27v150h184zM448 416v0v-217h-248v182zM184 378v0v-179h-184v153z" />
+    <glyph glyph-name="ion-social-wordpress-outline" unicode="&#xf248;" horiz-adv-x="384" 
+d="M192 384c106 0 192 -86 192 -192c0 -9 -1 -18 -2 -26c-12 -85 -79 -153 -165 -164c-8 -1 -17 -2 -25 -2c-106 0 -192 86 -192 192s86 192 192 192zM19 192c0 -68 40 -127 98 -155l-83 225c-10 -21 -15 -45 -15 -70zM214 21c12 2 24 4 35 8c0 1 -1 2 -1 3l-53 145l-33 -96
+v0l-19 -55c15 -5 32 -7 49 -7c8 0 15 1 22 2zM216 273l62 -186l17 58c9 22 13 41 13 56c0 21 -7 35 -14 47c-9 14 -17 27 -17 41c0 16 12 30 29 30h2c-31 28 -71 45 -116 45c-60 0 -113 -30 -144 -77c4 0 8 -1 11 -1c18 0 46 3 46 3c9 1 10 -14 1 -15c0 0 -10 -1 -20 -1
+l63 -187l38 113l-27 74c-9 0 -18 1 -18 1c-9 0 -8 16 1 15c0 0 28 -3 45 -3c18 0 46 3 46 3c9 1 11 -14 2 -15c0 0 -10 -1 -20 -1zM279 43c45 26 77 71 84 125c1 8 2 16 2 24c0 30 -8 58 -22 83c1 -6 1 -12 1 -18c0 -18 -3 -37 -13 -62l-39 -113z" />
+    <glyph glyph-name="ion-social-wordpress" unicode="&#xf249;" horiz-adv-x="384" 
+d="M195 177l53 -146c0 -1 6 -13 9 -19c-3 -1 -5 -2 -8 -3v0c-10 -3 -21 -6 -32 -7c-8 -1 -17 -2 -25 -2c-17 0 -34 2 -50 6v0c-2 0 -3 2 -5 2l25 73v0zM17 268c6 0 7 -1 15 -1l93 -255c-3 1 -5 2 -8 3c-63 27 -109 87 -116 158c-1 6 -1 13 -1 19c0 25 7 53 17 76zM366 273
+c11 -24 18 -52 18 -81c0 -9 -1 -18 -2 -26c-9 -65 -50 -120 -107 -147c-2 -1 -3 -1 -5 -2l22 65l39 113c10 25 13 45 13 62v19v0c-1 18 -10 44 -36 43h-2c-17 0 -29 -14 -29 -30c0 -14 8 -27 17 -41c7 -12 14 -26 14 -47c0 -15 -4 -34 -13 -56l-17 -58l-62 186
+c10 0 20 1 20 1c9 1 7 16 -2 15c0 0 -28 -3 -46 -3c-17 0 -45 3 -45 3c-9 1 -10 -15 -1 -15c0 0 9 -1 18 -1l27 -74l-38 -113l-63 187c10 0 20 2 20 2c9 1 8 15 -1 14c0 0 -28 -2 -46 -2h-34c5 9 11 17 17 25c35 44 90 72 150 72c24 0 48 -5 69 -13c34 -13 63 -36 85 -65
+c2 -2 3 -5 5 -7c6 -8 11 -17 15 -26z" />
+    <glyph glyph-name="ion-social-yahoo-outline" unicode="&#xf24a;" horiz-adv-x="320" 
+d="M289 380c11 0 21 1 31 4l-128 -213v-171c-10 4 -21 4 -32 4s-22 0 -32 -4v171l-128 213c10 -4 21 -4 32 -4s22 0 32 4l96 -160l96 160c10 -4 22 -4 33 -4zM178 180l111 184h-1c-7 0 -15 0 -24 2l-90 -150l-14 -23l-14 23l-89 150c-9 -2 -17 -2 -25 -2h-1l111 -184l2 -4
+v-5v-151c6 1 11 0 16 0s11 1 16 0v151v5z" />
+    <glyph glyph-name="ion-social-yahoo" unicode="&#xf24b;" horiz-adv-x="320" 
+d="M289 380c11 0 21 1 31 4l-128 -213v-171c-10 4 -21 4 -32 4s-22 0 -32 -4v171l-128 213c10 -4 21 -4 32 -4s22 0 32 4l96 -160l96 160c10 -4 22 -4 33 -4z" />
+    <glyph glyph-name="ion-social-yen-outline" unicode="&#xf4f1;" horiz-adv-x="384" 
+d="M384 416l-112 -208h48v-48h-73l-15 -31v-17h88v-48h-88v-96h-80v96h-88v48h88v17l-14 31h-74v48h48l-112 208h80l112 -221l112 221h80zM304 192h-59l13 24l99 184v0h-43l-122 -240l-122 240h-43l99 -184l13 -24h-59v-16h68l20 -44v-36h-88v-16h88v-96h48v96h88v16h-88v37
+l21 43h67v16z" />
+    <glyph glyph-name="ion-social-yen" unicode="&#xf4f2;" horiz-adv-x="384" 
+d="M384 416l-112 -208h48v-48h-73l-15 -31v-17h88v-48h-88v-96h-80v96h-88v48h88v17l-14 31h-74v48h48l-112 208h80l112 -221l112 221h80z" />
+    <glyph glyph-name="ion-social-youtube-outline" unicode="&#xf24c;" horiz-adv-x="512" 
+d="M265 352v0h-9h-9c-65 0 -118 -2 -168 -4h-1h-1c-23 0 -42 -22 -42 -49v-1v-1c-2 -34 -3 -70 -3 -105v0v0c0 -35 1 -70 3 -104v-2v-1c0 -14 5 -26 14 -36c8 -9 17 -13 28 -13h1h1c52 -2 108 -4 166 -4h11v0v0h11c58 0 113 2 166 4h1h1c11 0 20 4 28 13c9 10 14 22 14 36v1
+v2c2 34 3 68 3 104v0v0c0 36 -1 71 -3 105v1v2c0 27 -19 49 -42 49h-1h-1c-49 2 -103 3 -168 3zM265 384v0c58 0 115 0 170 -3c41 0 74 -36 74 -81c2 -36 3 -72 3 -108s-1 -71 -3 -107c0 -45 -33 -81 -74 -81c-55 -3 -111 -4 -168 -4h-11h-11c-57 0 -113 1 -168 4
+c-41 0 -74 36 -74 81c-2 36 -3 71 -3 107s2 71 4 107c0 45 32 82 73 82c55 2 112 3 170 3h9h9zM207 94v197l145 -99z" />
+    <glyph glyph-name="ion-social-youtube" unicode="&#xf24d;" horiz-adv-x="512" 
+d="M509 299c2 -36 3 -71 3 -107s-1 -71 -3 -107c0 -45 -33 -81 -74 -81c-58 -3 -118 -4 -179 -4s-121 1 -179 4c-41 0 -74 36 -74 81c-2 36 -3 71 -3 107s2 71 4 107c0 45 32 81 73 81c55 3 112 4 170 4h9h9c58 0 115 -1 170 -4c41 0 74 -36 74 -81zM207 94l145 98l-145 99
+v-197z" />
+    <glyph glyph-name="ion-soup-can-outline" unicode="&#xf4f3;" horiz-adv-x="320" 
+d="M160 304c-88 0 -160 29 -160 64s72 64 160 64s160 -29 160 -64s-72 -64 -160 -64zM160 415c-70 0 -126 -19 -126 -43s56 -43 126 -43s126 19 126 43s-56 43 -126 43zM161 288c88 0 158 29 159 64c0 -5 0 -33 -8 -40v-240c0 -35 -64 -64 -152 -64s-152 29 -152 64v240
+c-8 6 -8 40 -8 40c0 -35 73 -64 161 -64zM280 72v80c-18 -10 -43 -17 -72 -21h-2c-6 -20 -24 -35 -46 -35s-40 15 -46 35h-2c-29 4 -54 11 -72 21v-80c1 -2 9 -10 30 -18c24 -9 55 -14 90 -14s67 5 91 14c21 8 29 16 29 18zM280 184v91c-33 -12 -75 -19 -119 -19
+c-45 0 -87 7 -121 19v-91c18 -10 43 -17 73 -21h3c7 17 24 29 44 29s37 -12 44 -29h3c30 4 55 11 73 21zM178 -16zM160 -16h1h-1v0zM312 32l8 -16c0 -7 -3 -14 -8 -20c-21 -26 -81 -44 -152 -44s-131 18 -152 44c-5 6 -8 13 -8 20l8 16v16c0 -35 63 -64 152 -64
+s152 28 152 64v-16z" />
+    <glyph glyph-name="ion-soup-can" unicode="&#xf4f4;" horiz-adv-x="320" 
+d="M0 368c0 43 53 64 160 64s160 -21 160 -64s-53 -64 -160 -64s-160 21 -160 64zM160 8c-44 0 -80 6 -109 18s-43 28 -43 46v128c0 -9 4 -19 13 -27s21 -15 37 -21s33 -10 54 -13c1 -12 7 -23 16 -31s20 -12 32 -12s23 4 32 12s15 19 16 31c31 4 56 12 75 23s29 24 29 38
+v-128c0 -18 -14 -34 -43 -46s-65 -18 -109 -18zM160 288c44 0 82 6 113 18s47 28 47 46v-8c0 -5 -1 -11 -2 -18s-3 -11 -6 -14v-96c0 -14 -10 -27 -29 -38s-44 -19 -76 -23c-2 11 -8 19 -17 26s-19 11 -30 11s-21 -4 -30 -11s-15 -15 -17 -26c-32 4 -57 12 -76 23
+s-29 24 -29 38v96c-5 5 -8 18 -8 40c0 -18 16 -34 47 -46s69 -18 113 -18zM312 56v-24l8 -16c0 -7 -3 -14 -8 -20c-11 -13 -30 -24 -58 -32s-59 -12 -94 -12s-66 4 -94 12s-47 19 -58 32c-5 6 -8 13 -8 20l8 16v24c0 -18 14 -34 43 -46s65 -18 109 -18s80 6 109 18
+s43 28 43 46z" />
+    <glyph glyph-name="ion-speakerphone" unicode="&#xf2b2;" 
+d="M39 266c0 -37 20 -69 50 -86c-1 0 -2 1 -3 1s-4 1 -5 1v0c-35 3 -62 33 -69 69c-6 0 -12 7 -12 16c0 8 5 15 11 16c6 42 40 75 81 75h8c-36 -15 -61 -51 -61 -92zM433 357c10 -25 15 -56 15 -88s-5 -63 -15 -88l-3 -9c-6 -14 -15 -26 -24 -34c-10 -10 -22 -19 -34 -20h-3
+c-7 0 -15 2 -22 5c-3 2 -10 5 -10 5c-22 10 -84 28 -115 29c-4 -8 -10 -20 -12 -30c-2 -9 -6 -27 -7 -61c-1 -32 1 -59 3 -82c0 -2 1 -5 1 -7c0 -6 -2 -9 -9 -9h-77c-6 0 -9 3 -9 6v7c2 72 25 140 26 145c2 9 5 17 7 30c2 12 -27 13 -40 24c-29 17 -47 49 -47 86
+c0 41 25 77 59 92h42h19c58 3 114 21 163 50c1 1 3 1 4 2v0c8 4 16 6 24 6c13 0 26 -6 37 -16c9 -9 18 -21 24 -35c1 -3 2 -5 3 -8zM410 180c9 22 15 54 15 89s-6 66 -15 88c-8 18 -19 29 -30 29s-21 -11 -29 -29c-9 -22 -15 -53 -15 -88s6 -67 15 -89c8 -19 18 -33 29 -33
+s22 15 30 33z" />
+    <glyph glyph-name="ion-speedometer" unicode="&#xf2b3;" 
+d="M312 192l8 -8l-64 -84v-4c0 -18 -14 -32 -32 -32s-32 14 -32 32s14 32 32 32h4zM224 352c124 0 224 -100 224 -224c0 -34 -8 -67 -22 -96h-36c15 27 25 57 26 88h-32v16h32c-1 29 -9 56 -22 81l-27 -15l-8 13l27 16c-8 12 -16 23 -26 33s-21 18 -33 26l-16 -27l-14 8
+l16 27c-25 13 -52 21 -81 22v-32h-16v32c-29 -1 -56 -9 -81 -22l16 -27l-14 -8l-16 27c-12 -8 -23 -16 -33 -26s-19 -21 -26 -33l28 -16l-8 -13l-28 15c-13 -25 -21 -52 -22 -81h32v-16h-32c1 -31 11 -61 26 -88h-36c-14 29 -22 62 -22 96c0 124 100 224 224 224z" />
+    <glyph glyph-name="ion-spoon" unicode="&#xf2b4;" horiz-adv-x="128" 
+d="M128 288c0 64 -26 128 -64 128s-64 -64 -64 -128v0c1 -25 16 -54 37 -64l1 -1v0c3 -2 10 -6 10 -10c0 0 -16 -199 -16 -210s4 -20 10 -26s14 -9 22 -9v0v0c8 0 16 3 22 9s10 13 10 26s-16 210 -16 210c0 4 7 8 10 10l1 1c22 10 37 38 37 64z" />
+    <glyph glyph-name="ion-star" unicode="&#xf24e;" 
+d="M448 248l-139 -104l55 -176l-140 112l-140 -112l55 176l-139 104h172l52 168l53 -168h171z" />
+    <glyph glyph-name="ion-stats-bars" unicode="&#xf2b5;" horiz-adv-x="352" 
+d="M96 32v320h64v-320h-64zM0 32v96h64v-96h-64zM192 32v160h64v-160h-64zM288 32v224h64v-224h-64z" />
+    <glyph glyph-name="ion-steam" unicode="&#xf30b;" horiz-adv-x="512" 
+d="M480 240c0 -20 -16 -37 -37 -37c-20 0 -37 16 -37 37c0 20 16 37 37 37c20 0 37 -17 37 -37zM443 309c38 0 69 -31 69 -69s-31 -70 -69 -70l-67 -48c-2 -26 -24 -47 -51 -47c-25 0 -46 18 -51 41l-196 78c-8 -5 -16 -7 -26 -7c-28 0 -52 24 -52 52s24 52 52 52
+c25 0 45 -18 50 -41l196 -79c8 5 17 8 27 8c2 0 3 -1 5 -1l43 62c0 38 32 69 70 69zM443 286c-26 0 -47 -20 -47 -46s21 -47 47 -47s46 21 46 47s-20 46 -46 46zM52 277c-21 0 -38 -17 -38 -38s17 -38 38 -38c3 0 5 0 8 1l-16 6v0c-15 7 -22 24 -16 39s24 23 39 17v0l19 -7
+c-6 12 -19 20 -34 20zM325 165c-3 0 -6 -1 -9 -1l16 -6c16 -6 23 -24 17 -40s-23 -23 -39 -17c-6 3 -13 6 -19 8c6 -12 19 -20 34 -20c21 0 38 17 38 38s-17 38 -38 38z" />
+    <glyph glyph-name="ion-stop" unicode="&#xf24f;" horiz-adv-x="384" 
+d="M373 384c6 0 11 -5 11 -11v-362c0 -6 -5 -11 -11 -11h-362c-6 0 -11 5 -11 11v362c0 6 5 11 11 11h362z" />
+    <glyph glyph-name="ion-thermometer" unicode="&#xf2b6;" horiz-adv-x="160" 
+d="M127 112c20 -14 33 -38 33 -64c0 -44 -36 -80 -80 -80s-80 36 -80 80c0 27 13 51 33 65v257c0 26 21 46 47 46s47 -20 47 -46v-258zM65 370v-50h30v50c0 8 -7 14 -15 14s-15 -6 -15 -14zM96 160v16h-16v-16h16zM96 192v64h-16v-64h16z" />
+    <glyph glyph-name="ion-thumbsdown" unicode="&#xf250;" horiz-adv-x="384" 
+d="M24 195c-10 5 -18 17 -18 29c0 14 8 25 20 30c-4 5 -6 12 -6 19c0 14 8 25 20 30c-3 5 -5 11 -5 17c0 18 11 24 35 30s74 12 126 9c23 -1 55 -7 76 -7v32h112v-240h-112v16c-15 -1 -31 -4 -40 -14c-22 -23 -40 -65 -40 -108c0 -19 1 -29 -4 -34c-13 -13 -44 9 -52 37
+c-9 34 -1 62 1 87h-103c-19 0 -34 15 -34 34c0 15 10 29 24 33zM336 352c-9 0 -16 -7 -16 -16s7 -16 16 -16s16 7 16 16s-7 16 -16 16z" />
+    <glyph glyph-name="ion-thumbsup" unicode="&#xf251;" horiz-adv-x="384" 
+d="M360 189c10 -5 18 -17 18 -29c0 -14 -8 -25 -20 -30c4 -5 6 -12 6 -19c0 -14 -8 -25 -20 -30c3 -5 5 -11 5 -17c0 -18 -11 -24 -35 -30s-74 -12 -126 -9c-23 1 -55 7 -76 7v-32h-112v240h112v-16c15 1 31 4 40 14c22 23 40 65 40 108c0 19 -1 29 4 34c13 13 44 -9 52 -37
+c9 -34 1 -62 -1 -87h103c19 0 34 -15 34 -34c0 -15 -10 -29 -24 -33zM48 32c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16z" />
+    <glyph glyph-name="ion-toggle-filled" unicode="&#xf354;" 
+d="M320 240c26 0 48 -22 48 -48s-22 -48 -48 -48s-48 22 -48 48s22 48 48 48zM320 320c71 0 128 -57 128 -128s-57 -128 -128 -128h-192c-71 0 -128 57 -128 128s57 128 128 128h192zM320 112c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+    <glyph glyph-name="ion-toggle" unicode="&#xf355;" 
+d="M320 288h-192c-53 0 -96 -43 -96 -96s43 -96 96 -96h192c53 0 96 43 96 96s-43 96 -96 96zM320 320v0c71 0 128 -57 128 -128s-57 -128 -128 -128h-192c-71 0 -128 57 -128 128s57 128 128 128h192zM128 240c-26 0 -48 -22 -48 -48s22 -48 48 -48s48 22 48 48
+s-22 48 -48 48zM128 272v0c44 0 80 -36 80 -80s-36 -80 -80 -80s-80 36 -80 80s36 80 80 80z" />
+    <glyph glyph-name="ion-transgender" unicode="&#xf4f5;" horiz-adv-x="512" 
+d="M368 448h144v-144h-40v76l-101 -100c8 -17 13 -36 13 -56c0 -63 -46 -115 -104 -126v-52h72v-46h-72v-64h-48v64h-72v46h72v52c-59 11 -104 63 -104 126c0 20 5 39 13 56l-22 22l-36 -36l-33 33l36 36l-46 45v-76h-40v144h144v-40h-70l43 -42l36 36l33 -33l-36 -36
+l17 -17c23 22 54 36 89 36c27 0 53 -8 74 -23c0 0 6 -5 15 -13l93 92h-70v40zM256 144c44 0 80 36 80 80s-36 80 -80 80s-80 -36 -80 -80s36 -80 80 -80z" />
+    <glyph glyph-name="ion-trash-a" unicode="&#xf252;" horiz-adv-x="352" 
+d="M261 320v0h91v-32h-9s-5 -1 -8 -4s-4 -9 -4 -9l-19 -241c-2 -29 -2 -34 -36 -34h-200c-34 0 -34 5 -36 34l-19 242s-1 6 -4 9s-8 3 -8 3h-9v32h91v29c0 19 14 35 34 35h101c20 0 35 -16 35 -35v-29zM112 349v-29h128v29c0 10 -9 15 -19 15h-91c-10 0 -18 -5 -18 -15z
+M104 64h20l-10 192h-21zM187 64v192h-22v-192h22zM249 64l10 192h-20l-11 -192h21z" />
+    <glyph glyph-name="ion-trash-b" unicode="&#xf253;" horiz-adv-x="320" 
+d="M318 315c3 -12 4 -11 -7 -11h-302c-11 0 -10 -1 -7 11c2 9 4 13 4 13c3 9 9 9 19 11l53 7c7 1 7 1 10 7c9 20 10 31 20 31h103c10 0 12 -11 21 -31c3 -6 3 -6 10 -7l53 -6c10 -2 16 -2 19 -11c0 0 2 -5 4 -14zM283 272c17 0 18 -2 17 -15l-19 -242c-2 -12 -2 -15 -17 -15
+h-208c-15 0 -15 3 -17 15l-19 242c-1 12 0 15 17 15h246z" />
+    <glyph glyph-name="ion-trophy" unicode="&#xf356;" 
+d="M448 345c0 -25 2 -73 -22 -122c-15 -30 -36 -55 -63 -75c-23 -16 -49 -28 -77 -35c-16 -17 -32 -27 -46 -31v-33s0 -49 99 -49h13v-32h-256v32h13c85 0 97 35 99 46v36c-14 4 -30 14 -46 31c-28 7 -55 19 -77 35c-27 20 -48 45 -63 75c-17 36 -21 71 -22 97v0v11v0v21v0
+h80c-2 35 0 64 0 64h143h1h1h142s2 -29 0 -64h81v-7zM51 237c17 -34 43 -61 77 -78c-22 40 -33 84 -42 135c-1 8 -2 17 -3 26h-51c1 -23 5 -53 19 -83zM397 237c14 30 18 60 19 83h-51c-1 -9 -3 -18 -4 -26c-9 -51 -20 -95 -42 -135c34 17 61 43 78 78z" />
+    <glyph glyph-name="ion-tshirt-outline" unicode="&#xf4f6;" 
+d="M146 362l-104 -31l11 -32l39 4l38 5l-2 -38l-14 -255h220l-14 255l-2 38l38 -5l39 -4l11 32l-104 31c-6 -8 -13 -14 -21 -19c-15 -10 -34 -15 -57 -15v0v0c-34 1 -59 11 -78 34zM288 400v0l160 -48l-32 -88l-64 8l16 -289h-288l16 289l-64 -8l-32 88l160 48
+c14 -27 31 -39 64 -40c33 0 50 13 64 40z" />
+    <glyph glyph-name="ion-tshirt" unicode="&#xf4f7;" 
+d="M448 352l-32 -88l-64 8l16 -288h-288l16 288l-64 -8l-32 88l160 48c14 -27 31 -39 64 -40c33 0 50 13 64 40z" />
+    <glyph glyph-name="ion-umbrella" unicode="&#xf2b7;" 
+d="M344 160v0v0v0zM104 160v0v0v0zM240 399c116 -8 208 -109 208 -227v-12c-4 25 -26 52 -52 52c-29 0 -52 -23 -52 -52v0c0 29 -23 52 -52 52s-49 -12 -52 -45v-135c0 -17 -6 -33 -18 -45s-29 -19 -46 -19c-35 0 -63 29 -63 64c0 9 7 16 16 16s16 -7 16 -16
+c0 -18 14 -32 31 -32c18 0 32 14 32 32v134c-1 24 -26 46 -52 46c-29 0 -52 -23 -52 -52v0c0 29 -23 52 -52 52c-27 0 -49 -26 -52 -52v18c0 118 92 213 208 221v1c0 9 7 16 16 16s16 -7 16 -16v-1z" />
+    <glyph glyph-name="ion-university" unicode="&#xf357;" 
+d="M224 384l224 -111l-92 -60l-132 -85l-160 102v-198l-32 16v203l-32 21zM358 192l10 -82c-16 -12 -112 -78 -144 -110c-32 32 -128 98 -144 110l9 82l135 -88z" />
+    <glyph glyph-name="ion-unlocked" unicode="&#xf254;" horiz-adv-x="384" 
+d="M22 -32c-12 0 -22 10 -22 22v212c0 12 10 22 22 22h3h19v31c0 42 17 87 43 115s64 46 105 46v0v0c41 0 79 -18 105 -46c20 -21 33 -51 39 -82h-53c-5 18 -13 35 -24 47v0v1c-18 19 -42 29 -67 29v0v0c-25 0 -49 -10 -67 -29v-1v0c-18 -19 -28 -53 -28 -80v-31h265
+c12 0 22 -10 22 -22v-212c0 -12 -10 -22 -22 -22h-340z" />
+    <glyph glyph-name="ion-upload" unicode="&#xf255;" 
+d="M366 215c45 0 82 -37 82 -83s-37 -84 -82 -84h-110v80h48l-80 84l-80 -84h48v-80h-102c-49 0 -90 41 -90 91c0 40 26 74 61 86c5 29 29 51 59 51c10 0 18 -3 26 -7c19 40 59 67 105 67c64 0 115 -53 115 -118v-3z" />
+    <glyph glyph-name="ion-usb" unicode="&#xf2b8;" horiz-adv-x="256" 
+d="M16 228v0v0zM256 320c0 -11 -6 -21 -14 -27v0c-2 -1 -3 -5 -3 -7c-1 -20 -3 -36 -9 -50c-7 -19 -20 -33 -39 -46c-17 -12 -29 -21 -36 -34c-7 -12 -11 -28 -11 -53v-24c0 -7 2 -13 10 -18c4 -2 7 -6 10 -9c8 -9 14 -21 14 -34c0 -28 -22 -50 -50 -50s-50 22 -50 50v1v0
+c0 18 10 33 24 42c5 4 9 5 9 18v0c0 14 -3 17 -10 27s-18 17 -32 26c-19 13 -33 27 -40 46c-6 15 -8 31 -9 39s-2 9 -4 11c-10 6 -16 16 -16 28c0 18 14 32 32 32s32 -14 32 -32c0 -10 -4 -20 -12 -26c-3 -2 -4 -11 -4 -14v0v0c0 -9 3 -18 7 -28c10 -21 45 -44 52 -44
+s8 5 8 12v196s-1 2 -3 4h-1v1v0c-9 6 -15 16 -15 27c0 18 14 32 32 32s32 -14 32 -32c0 -11 -5 -21 -14 -27v0c-2 -2 -2 -3 -2 -5v-140c0 -10 2 -12 8 -11c13 3 48 30 52 43c3 10 6 23 7 41v1c0 2 -2 4 -3 6c-10 6 -16 16 -16 28c0 18 14 32 32 32s32 -14 32 -32zM32 240
+c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM128 368c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16zM224 304c9 0 16 7 16 16s-7 16 -16 16s-16 -7 -16 -16s7 -16 16 -16z" />
+    <glyph glyph-name="ion-videocamera" unicode="&#xf256;" 
+d="M335 263v-66l113 35v-89v-88l-113 35v-65c0 -5 -4 -9 -9 -9h-317c-5 0 -9 4 -9 9v12v55v171c0 5 4 9 9 9h208v38c0 4 -6 10 -10 10h-176v48h178c36 0 65 -29 65 -64v-32h52c5 0 9 -4 9 -9zM226 107c20 0 36 16 36 36s-16 35 -36 35s-36 -15 -36 -35c0 -10 4 -19 11 -26
+h-68c7 7 11 16 11 26c0 20 -16 36 -36 36s-36 -16 -36 -36s16 -36 36 -36h12h95h11z" />
+    <glyph glyph-name="ion-volume-high" unicode="&#xf257;" 
+d="M199 40l-95 88h-104v128h104l95 88v-304zM255 92l-20 16c17 24 27 52 27 84s-10 60 -27 84l20 16c20 -28 33 -63 33 -100s-13 -72 -33 -100zM322 46l-21 16c27 36 43 81 43 130s-16 94 -43 130l21 16c30 -41 48 -91 48 -146s-18 -105 -48 -146zM365 369l20 15
+c39 -54 63 -120 63 -192s-24 -138 -63 -192l-20 15c36 49 58 111 58 177s-22 128 -58 177z" />
+    <glyph glyph-name="ion-volume-low" unicode="&#xf258;" horiz-adv-x="288" 
+d="M199 40l-95 88h-104v128h104l95 88v-304zM255 92l-20 16c17 24 28 52 28 84s-11 60 -28 84l20 16c20 -28 33 -63 33 -100s-13 -72 -33 -100z" />
+    <glyph glyph-name="ion-volume-medium" unicode="&#xf259;" horiz-adv-x="370" 
+d="M199 40l-95 88h-104v128h104l95 88v-304zM255 92l-20 16c17 24 28 52 28 84s-11 60 -28 84l20 16c20 -28 33 -63 33 -100s-13 -72 -33 -100zM322 46l-21 16c27 36 43 81 43 130s-16 94 -43 130l21 16c30 -41 48 -91 48 -146s-18 -105 -48 -146z" />
+    <glyph glyph-name="ion-volume-mute" unicode="&#xf25a;" 
+d="M224 231l47 51v-180l-47 51h-65v78h65zM332 388c69 -38 116 -112 116 -196c0 -124 -100 -224 -224 -224c-39 0 -76 10 -108 27l-1 1c-69 38 -115 112 -115 196c0 124 100 224 224 224c39 0 75 -10 107 -28h1zM362 93c20 28 33 62 33 99c0 66 -38 123 -92 151
+c-6 3 -11 6 -17 8c-19 7 -40 11 -62 11c-37 0 -71 -12 -99 -32l73 -74h-76l-36 35c-20 -28 -32 -62 -32 -99c0 -65 36 -121 90 -150c6 -3 13 -7 19 -9c19 -7 39 -11 61 -11c37 0 72 12 100 32l-20 20v77z" />
+    <glyph glyph-name="ion-wand" unicode="&#xf358;" 
+d="M192 208l48 48l48 -48l-48 -48zM0 16l176 176l48 -48l-176 -176zM224 352v64h32v-64h-32zM398 344l-45 -45l-23 22l46 45zM127 299l-45 45l22 22l45 -45zM376 50l-46 45l23 23l45 -46zM384 192v32h64v-32h-64z" />
+    <glyph glyph-name="ion-waterdrop" unicode="&#xf25b;" horiz-adv-x="320" 
+d="M175 409c40 -41 145 -160 145 -288c0 -85 -72 -153 -160 -153c-56 0 -106 27 -134 69c-6 9 -11 19 -15 29c-7 17 -11 35 -11 55v4c1 67 31 131 64 183c20 31 42 57 59 77c9 10 16 18 22 24l1 1v0c4 3 8 6 14 6c5 0 10 -3 14 -6v0zM160 24c55 0 100 45 100 100
+c0 14 -3 28 -8 40c-17 -65 -70 -116 -136 -130c13 -6 28 -10 44 -10z" />
+    <glyph glyph-name="ion-wifi" unicode="&#xf25c;" 
+d="M224 352c80 0 156 -30 214 -84l10 -10l-10 -9l-32 -32l-10 -10l-9 9c-44 41 -103 64 -163 64s-119 -23 -163 -64l-9 -9l-10 10l-32 32l-10 9l10 10c58 54 134 84 214 84v0zM365 192l11 -10l-10 -10l-33 -32l-9 -9l-10 8c-25 22 -57 35 -90 35s-65 -13 -90 -35l-10 -8
+l-9 9l-33 32l-10 10l11 10c37 33 83 52 132 54v0h9v0v0c52 0 102 -19 141 -54zM224 32l-10 10l-52 52l-11 10l12 10c17 11 32 20 61 20s47 -9 62 -20l11 -10l-10 -10l-53 -52z" />
+    <glyph glyph-name="ion-wineglass" unicode="&#xf2b9;" horiz-adv-x="256" 
+d="M167 153c-11 -4 -24 -8 -24 -32v-94c0 -11 4 -19 12 -25c3 -2 7 -4 15 -6c32 -9 48 -16 50 -18c2 -1 4 -3 4 -7c0 0 -14 -3 -96 -3s-96 3 -96 3c0 4 2 6 4 7c2 2 18 9 50 18c8 2 11 4 14 6c8 6 11 14 11 25v94c0 24 -11 28 -22 32s-18 6 -26 11c-12 7 -23 16 -32 26
+c-20 23 -31 52 -31 87c0 50 4 100 8 114s14 25 31 25h178c17 0 27 -11 31 -25s8 -65 8 -115c0 -35 -11 -63 -31 -86c-9 -10 -20 -19 -32 -26c-8 -5 -15 -7 -26 -11zM128 178c26 0 50 11 67 28l6 6c16 18 22 35 23 65s-2 83 -8 107h-177c-7 -35 -8 -80 -7 -108s7 -46 23 -64
+c2 -3 4 -6 7 -8c17 -16 41 -26 66 -26zM208 277c0 -10 -1 -20 -4 -29s-8 -18 -15 -25l-5 -5c-14 -14 -34 -23 -56 -23c-21 0 -41 8 -55 22l-6 6c-7 7 -12 16 -15 25s-3 15 -4 29c-1 9 0 34 1 53c1 10 2 19 3 22h153c1 -6 2 -14 2 -22c1 -21 1 -45 1 -53zM192 269v0v26
+c0 4 -4 8 -8 8s-8 -4 -8 -8v-26c0 -3 1 -6 3 -7c1 -1 3 -1 5 -1c4 0 8 3 8 8zM191 316c1 2 1 4 1 6s-2 4 -4 5s-4 1 -6 1s-4 -1 -5 -3s-1 -4 -1 -6s2 -4 4 -5s4 -1 6 -1s4 1 5 3z" />
+    <glyph glyph-name="ion-woman" unicode="&#xf25d;" horiz-adv-x="192" 
+d="M30 299c3 12 17 33 42 34h48c24 -1 38 -22 42 -34l29 -104c6 -23 -21 -32 -27 -10l-26 96h-9l46 -169h-43v-127c0 -23 -31 -23 -31 0v127h-10v-127c0 -23 -32 -23 -32 0v127h-42l45 169h-7l-27 -96c-7 -21 -33 -13 -27 10zM133 379c0 -21 -17 -37 -37 -37s-37 16 -37 37
+s17 37 37 37s37 -16 37 -37z" />
+    <glyph glyph-name="ion-wrench" unicode="&#xf2ba;" 
+d="M430 333c14 -14 19 -31 18 -44s-6 -39 -32 -65s-77 -42 -113 -24c-5 3 -13 5 -21 -3c-10 -9 -202 -215 -202 -215c-17 -19 -48 -18 -66 0s-19 49 0 66c0 0 207 194 215 202s5 16 3 22c-20 47 2 89 24 112c22 24 51 31 65 32c13 1 31 -5 44 -18l-57 -56l10 -56l55 -10z
+M59 5c6 6 6 17 0 23s-16 6 -22 0s-6 -17 0 -23s16 -6 22 0z" />
+    <glyph glyph-name="ion-xbox" unicode="&#xf30c;" 
+d="M95 200c-49 -72 -50 -139 -50 -143c-28 38 -45 84 -45 135c0 67 30 128 77 169l3 -1c51 -18 93 -68 93 -68s-38 -33 -78 -92zM448 192c0 -51 -17 -97 -45 -135c0 4 -1 71 -50 143c-40 59 -78 92 -78 92s42 50 93 68l3 1c47 -41 77 -102 77 -169zM169 367
+c-37 17 -65 12 -72 10c36 25 80 39 127 39s91 -14 127 -39c-7 2 -35 6 -72 -10c-29 -13 -55 -35 -55 -35s-26 22 -55 35zM327 155c40 -49 54 -85 62 -108l2 -5c-41 -46 -101 -74 -167 -74s-126 28 -167 74l1 5c8 23 23 59 63 108c46 57 103 94 103 94s57 -37 103 -94z" />
+  </font>
+</defs></svg>
diff --git a/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.ttf b/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.ttf
new file mode 100644 (file)
index 0000000..c4e4632
Binary files /dev/null and b/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.ttf differ
diff --git a/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.woff b/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.woff
new file mode 100644 (file)
index 0000000..5f3a14e
Binary files /dev/null and b/ui/src/main/webapp/app/fusion/external/ds2/css/fonts/ionicons.woff differ
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-controllers/ds-profile/post-controller.js b/ui/src/main/webapp/app/fusion/scripts/DS2-controllers/ds-profile/post-controller.js
new file mode 100644 (file)
index 0000000..73934f7
--- /dev/null
@@ -0,0 +1,4 @@
+appDS2.controller('postController', function($scope, $http, $modal,
+        $routeParams, $rootScope, PostService) {
+
+});
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-controllers/samplePage-route.js b/ui/src/main/webapp/app/fusion/scripts/DS2-controllers/samplePage-route.js
new file mode 100644 (file)
index 0000000..d8faae6
--- /dev/null
@@ -0,0 +1,27 @@
+appDS2
+        .config(function($routeProvider) {
+            $routeProvider
+                    .when(
+                            '/collaborate_list',
+                            {
+                                templateUrl : 'app/fusion/scripts/DS2-view-models/ds2-admin/collaborate-list.html',
+                                controller : 'collaborateListControllerDS2'
+                            })
+                    .when(
+                            '/drools/:filename',
+                            {
+                                templateUrl : 'app/fusion/scripts/DS2-view-models/ds2-samplePages/drools.html',
+                                controller : 'droolsController'
+                            })
+                    .when(
+                            '/droolsList',
+                            {
+                                templateUrl : 'app/fusion/scripts/DS2-view-models/ds2-samplePages/drools-list.html',
+                                controller : 'droolsListController'
+                            })
+                    .otherwise(
+                            {
+                                templateUrl : 'app/fusion/scripts/DS2-view-models/ds2-samplePages/net_map.html',
+                                controller : 'netMapController'
+                            });
+        });
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-services/postSearch.js b/ui/src/main/webapp/app/fusion/scripts/DS2-services/postSearch.js
new file mode 100644 (file)
index 0000000..d3dac85
--- /dev/null
@@ -0,0 +1,5 @@
+appDS2.factory('PostService', function($http, $q) {
+    return {
+
+    };
+});
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/post.html b/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/post.html
new file mode 100644 (file)
index 0000000..ce4bacf
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="page-content">
+ <h1 class="heading-page" id="profileSearch">User Search</h1>
+</div>
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/profile_searchDS2.html b/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/profile_searchDS2.html
new file mode 100644 (file)
index 0000000..6b50b74
--- /dev/null
@@ -0,0 +1,60 @@
+<div id="page-content">
+ <div>
+  <h1 class="heading-page" id="profileSearch">Profile Search</h1>
+  <div ng-show="showLoader" class="span loader-container">
+   <i class="icon-primary-spinner" role="img"
+    aria-label="Please wait while we load your content"></i>
+  </div>
+
+  <div ng-hide="showLoader">
+   <table class="striped" table-data="tableData">
+    <thead>
+     <tr>
+      <th>User ID</th>
+      <th>Last Name</th>
+      <th>First Name</th>
+      <th>Email</th>
+      <th>User ID</th>
+      <th>Manager User ID</th>
+      <th>Edit</th>
+      <th ng-show="(isAppCentralized=='false')">Active?</th>
+     </tr>
+    </thead>
+    <tbody type="body" ng-repeat="rowData in tableData">
+     <tr>
+      <td>{{rowData.id}}</td>
+      <td>{{rowData.lastName}}</td>
+      <td>{{rowData.firstName}}</td>
+      <td>{{rowData.email}}</td>
+      <td>{{rowData.orgUserId}}</td>
+      <td>{{rowData.orgManagerUserId}}</td>
+      <!--  Include an edit image with respective redirection -->
+      <td><a href="#/profile/{{rowData.id}}" class="icon-misc-pen"
+       style="color: #888; font-size: 20px;"></a></td>
+      <td ng-show="(isAppCentralized=='false')">
+       <div class="form-row">
+        <label class="btn-switch-label" tabindex="0" role="option">
+         <input type="checkbox" b2b-switches ng-model="rowData.active"
+         ng-click="toggleProfileActive(rowData)"
+         ng-disabled="allDisabled" aria-disabled="{{allDisabled}}" />
+         <div class="sr-text hidden-spoken" ng-if="!allDisabled">Double
+          tap to turn</div>
+        </label>
+       </div>
+      </td>
+
+     </tr>
+    </tbody>
+   </table>
+
+   <div class="well" style="padding-bottom: 35px;">
+    <div class="row -page short">
+     <div b2b-pagination="" total-pages="totalPages1"
+      current-page="currentPage1" click-handler="customHandler"
+      role="navigation" aria-label="Customer Data Pages"></div>
+    </div>
+   </div>
+
+  </div>
+ </div>
+</div>
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/self_profile.html b/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/self_profile.html
new file mode 100644 (file)
index 0000000..da9ca15
--- /dev/null
@@ -0,0 +1,227 @@
+<div id="page-content">
+ <div>
+  <h1 class="heading-page" id="profileSearch">{{pageTitle}}</h1>
+  <div ng-show="showLoader" class="span loader-container">
+   <i class="icon-primary-spinner" role="img"
+    aria-label="Please wait while we load your content"></i>
+  </div>
+  <div ng-hide="showLoader">
+   <h3 class="heading-small" ng-show="isAppCentralized=='true'"
+    style="color: red;">Please use Portal for access management</h3>
+   <h3 class="heading-small" ng-show="isAppCentralized=='false'">Please
+    edit the profile details below:</h3>
+   <div class="row-nowrap">
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-2a">*First Name</label>
+      <div class="field-group">
+       <input id="textinputID-2a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.firstName"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">*Last Name</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.lastName"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Organization User ID</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.orgUserId" disabled="true">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Organization Manager ID</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.orgManagerUserId"
+        disabled="true">
+      </div>
+     </div>
+    </div>
+   </div>
+
+   <div class="row-nowrap">
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-2a">Login Id</label>
+      <div class="field-group">
+       <input id="textinputID-2a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.loginId" disabled="true">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Password</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.loginPwd" disabled="true">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">*Phone</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.phone"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Fax</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.fax"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+   </div>
+
+   <div class="row-nowrap">
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-2a">Cellular</label>
+      <div class="field-group">
+       <input id="textinputID-2a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.cellular"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">*Email</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.email"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Address 1</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.address1"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Address 2</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.address2"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+   </div>
+
+   <div class="row-nowrap">
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-2a">City</label>
+      <div class="field-group">
+       <input id="textinputID-2a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.city"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">State</label> <select name="dropdown1"
+       b2b-dropdown ng-model="stateList.selected.value"
+       ng-disabled="(isAppCentralized == 'true')">
+       <option b2b-dropdown-list option-repeat="d in stateList.options"
+        value="{{d.value}}" init-value="{{stateList.selected.title}}">{{d.title}}</option>
+      </select>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Zip Code</label>
+      <div class="field-group">
+       <input id="textinputID-3a" b2b-reset="" class="span12"
+        type="text" data-ng-model="profile.zipCode"
+        ng-disabled="(isAppCentralized == 'true')">
+      </div>
+     </div>
+    </div>
+    <div class="span12">
+     <div class="form-row">
+      <label for="textinputID-3a">Country</label> <select
+       name="dropdown1" b2b-dropdown ng-model="selectedCountry.value"
+       ng-disabled="(isAppCentralized == 'true')">
+       <option b2b-dropdown-list option-repeat="d in countries"
+        value="{{d.value}}" init-value="{{selectedCountry.title}}">{{d.title}}</option>
+      </select>
+     </div>
+    </div>
+   </div>
+   <div class="span3">
+    <div class="form-row">
+     <label for="textinputID-3a">Time Zone</label> <select
+      name="dropdown1" b2b-dropdown ng-model="selectedTimeZone.value"
+      ng-disabled="(isAppCentralized == 'true')">
+      <option b2b-dropdown-list option-repeat="d in timeZones"
+       value="{{d.value}}" init-value="{{selectedTimeZone.title}}">{{d.title}}</option>
+     </select>
+    </div>
+   </div>
+
+   <div class="form-row">
+    <button class="btn btn-alt btn-small" type="button"
+     ng-click="saveProfile()" ng-show="(isAppCentralized=='false')">Save</button>
+   </div>
+   <br>
+   <div ng-show="(isAppCentralized=='false')">
+    Role <a
+     ng-click="addNewRoleFunctionModalPopup(role.roleFunctions,role.name, role);"
+     class="icon-primary-accordion-plus" size="small"></a>
+   </div>
+
+   <div id="rolesTable" title="Role Functions">
+    <table class="striped" table-data="profile.roles">
+     <thead>
+      <tr>
+       <th>Name</th>
+       <th ng-show="(isAppCentralized=='false')">Delete</th>
+      </tr>
+     </thead>
+     <tbody type="body" ng-repeat="rowData in profile.roles">
+      <tr>
+       <td ng-bind="rowData['name']"></td>
+
+       <td ng-show="(isAppCentralized=='false')">
+        <div style="font-size: 20px;">
+         <a href="javascript:void(0)" ng-click="removeRole(rowData);"
+          class="icon-misc-trash"></a>
+        </div>
+       </td>
+      </tr>
+     </tbody>
+    </table>
+   </div>
+  </div>
+ </div>
+</div>
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-samplePages/samplePage.html b/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-samplePages/samplePage.html
new file mode 100644 (file)
index 0000000..b6a4107
--- /dev/null
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<!-- Single-page application for EPSDK-App demonstration pages using DS2 look and feel -->
+<html>
+<head>
+<meta charset="ISO-8859-1">
+<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
+<title>Sample Page</title>
+
+<!-- B2b Library -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/b2b/css/b2b-angular/b2b-angular.css">
+
+<!-- icons in open source -->
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ionicons.css">
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css">
+
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/styles/ecomp.css">
+
+<!-- Common scripts -->
+
+<script src="app/fusion/external/angular-1.4.8/angular.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-messages.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-touch.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-sanitize.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-route.min.js"></script>
+<script src="app/fusion/external/angular-1.4.8/angular-cookies.min.js"></script>
+<script src="app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js"></script>
+<script src="app/fusion/external/jquery/dist/jquery.min.js"></script>
+<script
+ src="app/fusion/external/javascript-detect-element-resize/jquery.resize.js"></script>
+<script
+ src="app/fusion/external/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>
+<script
+ src="app/fusion/external/angular-gridster/dist/angular-gridster.min.js"></script>
+<script src="app/fusion/scripts/DS2-services/ds2-modal/modalService.js"></script>
+<script src="app/fusion/external/ds2/js/appDS2.js"></script>
+
+<script src="app/fusion/scripts/DS2-services/userInfoServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/headerServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/leftMenuServiceDS2.js"></script>
+<script src="app/fusion/scripts/DS2-services/manifestService.js"></script>
+<script src="app/fusion/scripts/DS2-directives/footer.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2Header.js"></script>
+<script src="app/fusion/scripts/DS2-directives/ds2LeftMenu.js"></script>
+<script src="app/fusion/scripts/DS2-directives/b2b-leftnav-ext.js"></script>
+<script src="app/fusion/external/utils/js/browserCheck.js"></script>
+
+<!-- Page-specific items -->
+<script src="app/fusion/scripts/DS2-services/adminService.js"></script>
+<script src="app/fusion/scripts/DS2-services/adminMenuService.js"></script>
+
+<script src="app/fusion/scripts/DS2-controllers/samplePage-route.js"></script>
+<script
+ src="app/fusion/scripts/DS2-controllers/collaborateList-route.js"></script>
+<script
+ src="app/fusion/scripts/DS2-controllers/collaborate-list-controller.js"></script>
+<script
+ src="app/fusion/scripts/DS2-services/ds2-sample-page/droolsService.js"></script>
+<script
+ src="app/fusion/scripts/DS2-controllers/ds2-sample/drools-controller.js"></script>
+<script
+ src="app/fusion/scripts/DS2-controllers/ds2-sample/notebook-controller.js"></script>
+<script
+ src="app/fusion/scripts/DS2-controllers/ds2-sample/notebookFrameController.js"></script>
+<script
+ src="app/fusion/scripts/DS2-controllers/ds2-sample/nbook-framecontroller.js"></script>
+
+</head>
+<body class="appBody" ng-app="abs">
+ <div ds2-Header class="header-container"></div>
+ <div ds2-menu id="menuContainer" class="menu-container"></div>
+ <div ng-view id="rightContentProfile" class="content-container"></div>
+ <div ds2-Footer class="footer-container"></div>
+</body>
+</html>
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/footer.html b/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/footer.html
new file mode 100644 (file)
index 0000000..69d63cb
--- /dev/null
@@ -0,0 +1,29 @@
+<!--
+Copyright (c) 2019 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.
+-->
+
+<div style="width: 100%">
+ <footer class="b2b-footer-wrapper" role="contentinfo"
+  aria-label="footer">
+  <div class="b2b-footer-container">
+   <div class="divider-bottom-footer">
+    <div class="span12 footerLogo">
+     <p class="copyright-text">Copyright 2019 Akraino Edge Stack and
+      Linux Foundation.</p>
+    </div>
+   </div>
+  </div>
+ </footer>
+</div>
diff --git a/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html b/ui/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html
new file mode 100644 (file)
index 0000000..630767f
--- /dev/null
@@ -0,0 +1,19 @@
+<!--
+Copyright (c) 2019 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.
+-->
+
+<img src="static/fusion/images/logo_akraino_edge_stack2.png"
+ class="header-image">
+<span class="globe-text">Blueprint Validation UI</span>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
similarity index 64%
rename from ui/src/main/webapp/WEB-INF/views/welcome.jsp
rename to ui/src/main/webapp/app/fusion/scripts/DS2-view-models/welcome-content.html
index 0f3d695..0d85329
@@ -13,16 +13,16 @@ 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.
 -->
-<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<!DOCTYPE html>
-<html>
+
+<!DOCTYPE HTML>
+<html lang="en-US">
 <head>
-       <title>Spring 4 MVC Hello World Example with Maven Eclipse</title>
-       <link rel='stylesheet' href='<c:url value="/resources/css/style.css" />' type='text/css' media='all' /> 
+<meta charset="UTF-8">
+<meta http-equiv="refresh"
+ content="0; url=/AECBlueprintValidationUI/committedSubmissions">
+<script type="text/javascript">
+            window.location.href = location.host + "/AECBlueprintValidationUI/committedSubmissions"
+        </script>
+<title>Page Redirection</title>
 </head>
-<body>
-       <h2>Hello World, Spring MVC</h2>
-
-       <p>Welcome, ${name}</p>
-</body>
 </html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/app/fusion/scripts/view-models/footer.html b/ui/src/main/webapp/app/fusion/scripts/view-models/footer.html
new file mode 100644 (file)
index 0000000..b0bd26e
--- /dev/null
@@ -0,0 +1,17 @@
+<!-- This is a placeholder for the open-source SDK-App footer -->
+<script src="app/fusion/external/ebz/js/footer.js"></script>
+<link rel="stylesheet" type="text/css"
+ href="app/fusion/external/ebz/ebz_header/footer.css">
+<div class="footerContainer" id="footerContainer">
+ <div class="footerWrapper" id="footerWrapper">
+  <div class="attFooterInfo" style="text-align: center;">
+   <div class="footerLastSection">
+    <div class="footerText">
+     <p class="copyright-text">Copyright Open ECOMP and Linux
+      Foundation 2017.</p>
+    </div>
+   </div>
+  </div>
+ </div>
+</div>
+</div>
\ No newline at end of file
diff --git a/ui/src/main/webapp/index.html b/ui/src/main/webapp/index.html
deleted file mode 100755 (executable)
index cb23409..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<!--
-<!--
-Copyright (c) 2019 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.
--->
-
-<!DOCTYPE html>
-<html ng-app="BlueprintValidationUIManagement">
-
-<head>
-<title>AKRAINO Blueprint Validation UI</title>
-<meta charset="utf-8">
-<meta http-equiv="Pragma" content="no-cache">
-<meta http-equiv="Cache-Control"
- content="no-store, no-cache, must-revalidate">
-<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-<meta name="viewport"
- content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
-<meta name="apple-mobile-web-app-capable" content="yes">
-<meta name="apple-mobile-web-app-status-bar-style" content="black">
-<link rel="stylesheet" href="./resources/css/style.css">
-
-<script
- src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.min.js"></script>
-<link rel="stylesheet" href="./resources/css/style.css">
-<link rel="stylesheet"
- href="http://maxcdn.bootstrapcdn.com/bootswatch/3.2.0/sandstone/bootstrap.min.css">
-<link rel="stylesheet"
- href="http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css">
-<link rel="stylesheet" href="./resources/css/ngDialog-theme-default.css">
-<link rel="stylesheet"
- href="https://cdnjs.cloudflare.com/ajax/libs/ng-dialog/1.4.0/css/ngDialog.css">
-<link rel="stylesheet"
- href="https://cdnjs.cloudflare.com/ajax/libs/ng-dialog/1.4.0/css/ngDialog-theme-plain.css">
-<script
- src="https://cdnjs.cloudflare.com/ajax/libs/ng-dialog/1.4.0/js/ngDialog.min.js"></script>
-<script
- src="https://cdnjs.cloudflare.com/ajax/libs/angular-base64/2.0.5/angular-base64.js"></script>
-<script
- src="https://cdnjs.cloudflare.com/ajax/libs/angular-base64/2.0.5/angular-base64.min.js"></script>
-
-<!-- Insert custom controllers here -->
-<script type="text/javascript" src="./resources/js/App.Config.js"></script>
-<script type="text/javascript" src="./resources/js/App.js"></script>
-<script type="text/javascript" src="./resources/js/App.Services.js"></script>
-<script type="text/javascript" src="./resources/js/CommonController.js"></script>
-<script type="text/javascript"
- src="./resources/js/AECNewSubmissionController.js"></script>
-<script type="text/javascript"
- src="./resources/js/AECCommittedSubmissionsController.js"></script>
-<script type="text/javascript"
- src="./resources/js/AECFindBySubmissionIdController.js"></script>
-
-<script
- src="https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/4.4.0/bootbox.min.js"></script>
-
-<script
- src="https://cdnjs.cloudflare.com/ajax/libs/danialfarid-angular-file-upload/11.2.3/ng-file-upload-shim.min.js"></script>
-<script
- src="https://cdnjs.cloudflare.com/ajax/libs/danialfarid-angular-file-upload/11.2.3/ng-file-upload.min.js"></script>
-
-<script
- src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
-
-
-<script
- src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
-
-<script type="text/javascript"></script>
-
-<script
- src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/1.0.18/angular-ui-router.min.js"></script>
-<script src="https://cdn.jsdelivr.net/ngstorage/0.3.10/ngStorage.min.js"></script>
-<script src="http://code.angularjs.org/1.4.8/angular-resource.js"></script>
-<!--  <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.11.0.js"></script> -->
-<script data-require="ui-bootstrap@*" data-semver="0.13.3"
- src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.3/ui-bootstrap.min.js"></script>
-<script
- src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.13.4.js"></script>
-
-<script
- src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-animate.min.js"></script>
-<script
- src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-aria.min.js"></script>
-<script
- src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-messages.min.js"></script>
-<script
- src="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.js"></script>
-<link rel="stylesheet"
- href="https://fonts.googleapis.com/icon?family=Material+Icons">
-<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
-<script type="text/javascript"
- src="https://cdn.plot.ly/plotly-latest.min.js"></script>
-<script src="reusable_chart.js"></script>
-
-</head>
-
-
-<body ng-controller="Login">
-
- <div ui-view=""></div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/resources/css/ngDialog-theme-default.css b/ui/src/main/webapp/resources/css/ngDialog-theme-default.css
deleted file mode 100644 (file)
index 5845704..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/* 
- * Copyright (c) 2019 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.
- */
-@-webkit-keyframes ngdialog-flyin {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-40px);
-    transform: translateY(-40px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@keyframes ngdialog-flyin {
-  0% {
-    opacity: 0;
-    -webkit-transform: translateY(-40px);
-    -ms-transform: translateY(-40px);
-    transform: translateY(-40px);
-  }
-
-  100% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-}
-
-@-webkit-keyframes ngdialog-flyout {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-40px);
-    transform: translateY(-40px);
-  }
-}
-
-@keyframes ngdialog-flyout {
-  0% {
-    opacity: 1;
-    -webkit-transform: translateY(0);
-    -ms-transform: translateY(0);
-    transform: translateY(0);
-  }
-
-  100% {
-    opacity: 0;
-    -webkit-transform: translateY(-40px);
-    -ms-transform: translateY(-40px);
-    transform: translateY(-40px);
-  }
-}
-
-.ngdialog.ngdialog-theme-default {
-  padding-bottom: 160px;
-  padding-top: 160px;
-}
-
-.ngdialog.ngdialog-theme-default.ngdialog-closing .ngdialog-content {
-  -webkit-animation: ngdialog-flyout .5s;
-  animation: ngdialog-flyout .5s;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-content {
-  -webkit-animation: ngdialog-flyin .5s;
-  animation: ngdialog-flyin .5s;
-  background: #F9F4E5;
-  border-radius: 5px;
-  color: #444;
-  font-family: 'Helvetica',sans-serif;
-  font-size: 1.1em;
-  line-height: 1.5em;
-  margin: 0 auto;
-  max-width: 100%;
-  padding: 1em;
-  position: relative;
-  width: 450px;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-close {
-  border-radius: 5px;
-  cursor: pointer;
-  position: absolute;
-  right: 0;
-  top: 0;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-close:before {
-  background: transparent;
-  border-radius: 3px;
-  color: #bbb;
-  content: '\00D7';
-  font-size: 26px;
-  font-weight: 400;
-  height: 30px;
-  line-height: 26px;
-  position: absolute;
-  right: 3px;
-  text-align: center;
-  top: 3px;
-  width: 30px;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-close:hover:before,
-.ngdialog.ngdialog-theme-default .ngdialog-close:active:before {
-  color: #777;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-message {
-  margin-bottom: .5em;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-input {
-  margin-bottom: 1em;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-input textarea,
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="text"],
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="password"],
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="email"],
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="url"] {
-  background: #fff;
-  border: 0;
-  border-radius: 3px;
-  font-family: inherit;
-  font-size: inherit;
-  font-weight: inherit;
-  margin: 0 0 .25em;
-  min-height: 2.5em;
-  padding: .25em .67em;
-  width: 100%;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-input textarea:focus,
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="text"]:focus,
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="password"]:focus,
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="email"]:focus,
-.ngdialog.ngdialog-theme-default .ngdialog-input input[type="url"]:focus {
-  -webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
-  box-shadow: inset 0 0 0 2px #8dbdf1;
-  outline: none;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-buttons {
-  *zoom: 1;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-buttons:after {
-  content: '';
-  display: table;
-  clear: both;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-button {
-  border: 0;
-  border-radius: 3px;
-  cursor: pointer;
-  float: right;
-  font-family: inherit;
-  font-size: .8em;
-  letter-spacing: .1em;
-  line-height: 1em;
-  margin: 0 0 0 .5em;
-  padding: .75em 2em;
-  text-transform: uppercase;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-button:focus {
-  -webkit-animation: ngdialog-pulse 1.1s infinite;
-  animation: ngdialog-pulse 1.1s infinite;
-  outline: none;
-}
-
-@media (max-width: 568px) {
-  .ngdialog.ngdialog-theme-default .ngdialog-button:focus {
-    -webkit-animation: none;
-    animation: none;
-  }
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-primary {
-  background: #3288e6;
-  color: #fff;
-}
-
-.ngdialog.ngdialog-theme-default .ngdialog-button.ngdialog-button-secondary {
-  background: #e0e0e0;
-  color: #777;
-}
\ No newline at end of file
diff --git a/ui/src/main/webapp/resources/css/style.css b/ui/src/main/webapp/resources/css/style.css
deleted file mode 100755 (executable)
index 7680da0..0000000
+++ /dev/null
@@ -1,611 +0,0 @@
-/* 
- * Copyright (c) 2019 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.
- */
-
-.img-arredondadaSide {
-     border-radius: 100%;
-    w overflow: hidden;
-     height: 100px;
-     width:100px;
-     background:#6495ED;
-     margin-top:10px;
-     margin-left: 5px;
-}
- .img-arredondadaChat {
-     border-radius: 100%;
-     overflow: hidden;
-     height: 50px;
-     width:50px;
-     background: black;
-}
- .tema{
-     color:red;
-}
- .chat-container {
-     width: 400px;
-     height: 100%;
-     margin: 0 auto;
-}
- .corStatusFinalizado{
-     color:green;
-}
- .corNormal{
-     color:#3366FF;
-}
- .corStatusNaoFinalizado{
-     color:red;
-}
- .alinharCentro{
-     text-align: center;
-}
- .user-panel {
-     padding: 10px;
-}
- .user-panel:before, .user-panel:after {
-     display: table;
-     content: " ";
-}
- .user-panel:after {
-     clear: both;
-}
- .user-panel > .image > img {
-     width: 45px;
-     height: 45px;
-}
- .user-panel > .info {
-     font-weight: 600;
-     padding: 5px 5px 5px 15px;
-     font-size: 14px;
-     line-height: 1;
-}
- .user-panel > .info > p {
-     margin-bottom: 9px;
-}
- .user-panel > .info > a {
-     text-decoration: none;
-     padding-right: 5px;
-     margin-top: 3px;
-     font-size: 11px;
-     font-weight: normal;
-}
- .user-panel > .info > a > .fa, .user-panel > .info > a > .ion, .user-panel > .info > a > .glyphicon {
-     margin-right: 3px;
-}
- #wrapper {
-     padding-left: 0;
-     -webkit-transition: all 0.5s ease;
-     -moz-transition: all 0.5s ease;
-     -o-transition: all 0.5s ease;
-     transition: all 0.5s ease;
-     margin-top: -20px;
-}
- #wrapper.toggled {
-     padding-left: 250px;
-}
- #sidebar-wrapper {
-     z-index: 1000;
-     position: absolute;
-     left: 250px;
-     width: 0;
-      height:100vh;
-     margin-left: -250px;
-     overflow-y: auto;
-     background: #cccccc;
-     -webkit-transition: all 0.5s ease;
-     -moz-transition: all 0.5s ease;
-     -o-transition: all 0.5s ease;
-     transition: all 0.5s ease;
-}
- #wrapper.toggled #sidebar-wrapper {
-     width: 250px;
-}
- #page-content-wrapper {
-     width: 100%;
-}
- #wrapper.toggled #page-content-wrapper {
-     position: absolute;
-     margin-right: -250px;
-}
-/* Sidebar Styles */
- .sidebar-nav {
-     position: absolute;
-     top: 0;
-     width: 250px;
-     margin: 0;
-     padding: 0;
-     list-style: none;
-}
- .sidebar-nav li {
-     text-indent: 20px;
-     line-height: 40px;
-     margin-left: -25px;
-      color:   #000000;
-}
- .logo{
-     color: rgb(105, 183, 105);
-     font-size: 36px;
-     font-weight: 700;
-     line-height: 39.6px;
-     margin-left:20px;
-     margin-top:10px 
-}
- .fa {
-     display: inline-block;
-     font-family: FontAwesome;
-     font-style: normal;
-     font-weight: normal;
-     line-height: 1;
-     font-size-adjust: none;
-     font-stretch: normal;
-     font-feature-settings: normal;
-     font-language-override: normal;
-     font-kerning: auto;
-     font-synthesis: weight style;
-     font-variant: normal;
-     font-size: inherit;
-     text-rendering: auto;
-     padding-right: 10px;
-}
- .containerLogin{
-     padding-right: 15px;
-     padding-left: 15px;
-     margin-right: auto;
-     margin-top: 100px;
-     margin-left: auto;
-     width: 30%;
-}
- .sidebar-nav li a {
-     display: block;
-     text-decoration: none;
-     color:    #000000;
-}
-
- .sidebar-nav li a:hover {
-     text-decoration: none;
-     color: #fff;
-     background: rgba(255,255,255,0.2);
-}
-
- .sidebar-nav li a.example{
-     text-decoration: none;
-     color: #fff;
-     background: #999999;
-}
-sidebar-nav > .sidebar-brand {
-     height: 65px;
-     font-size: 18px;
-     line-height: 60px;
-}
- .sidebar-nav > .sidebar-brand a {
-     color: #999999;
-}
- .sidebar-nav > .sidebar-brand a:hover {
-     color: #fff;
-     background: none;
-}
- .sidebar-nav > .sidebar-brand a:active {
-     color: #fff;
-     background: none;
-}
- @media only screen and (max-height: 650px) and (min-width:768px){
-     #sidebar-wrapper {
-         width: 250px;
-         position: absolute;
-         height:200%;
-    }
-}
- @media only screen and (max-height: 450px) and (min-width:768px){
-     #sidebar-wrapper {
-         width: 250px;
-         position: absolute;
-         height:160%;
-    }
-}
- @media only screen and (max-height: 1200px) and (min-width:1366px){
-     #sidebar-wrapper {
-         width: 250px;
-         position: absolute;
-         height:100%;
-    }
-}
- @media(min-width:768px) {
-     #wrapper {
-         padding-left: 120px;
-    }
-     #wrapper.toggled {
-         padding-left: 0;
-    }
-     #sidebar-wrapper {
-         width: 250px;
-    }
-     #wrapper.toggled #sidebar-wrapper {
-         width: 0;
-    }
-     #page-content-wrapper {
-         position: relative;
-    }
-     #wrapper.toggled #page-content-wrapper {
-         position: relative;
-         margin-right: 0;
-    }
-}
-
- * {
-    box-sizing: border-box;
-}
- body {
-     margin: 0;
-     padding:0;
-     
-     font-family: Arial;
-    height:calc(100% - 70px);
-    height:-moz-calc(100% - 70px);
-    height:-webkit-calc(100% - 70px);
-    
-}
-html{margin:0;padding:0;}
-
- .header {
-     overflow: hidden;
-     background-color: #000000;
-     padding: 8px 10px;
-}
- .header a {
-     float: left;
-     color: white;
-     text-align: center;
-     padding: 12px;
-     text-decoration: none;
-     font-size: 18px;
-     line-height: 25px;
-     border-radius: 4px;
-}
- .header a.logo {
-     font-size: 25px;
-     font-weight: bold;
-}
- .header-right {
-     float: right;
-}
- .akrbutton {
-     background-color: #4d4d4d;
-     border: none;
-     color: white;
-     padding: 8px 15px;
-     text-align: center;
-     text-decoration: none;
-     display: inline-block;
-     font-size: 12px;
-     margin: 3% 2%;
-     cursor: pointer;
-     border-radius: 5px;
-}
- .refreshbutton {
-     background-color: #4d4d4d;
-     border: none;
-     color: white;
-     padding: 7px 14px;
-     text-align: center;
-     text-decoration: none;
-     display: inline-block;
-     cursor: pointer;
-     border-radius: 5px;
-      
-}
- .akrtheader {
-     padding-top: 12px;
-     padding-bottom: 12px;
-     text-align: left;
-     background-color: #4CAF50 
-}
- table, td {
-     border: 1px solid #ddd;
-}
- table {
-     border-collapse: collapse;
-     width: 100%;}
-
- .siteStatusTable th {
-     padding: 5px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .siteStatusTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
-.nodeTable th {
-     padding: 10px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 0px solid #ddd;
-}
- .nodeTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
- .siteaddOnsTable th {
-     padding: 10px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .siteaddOnsTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
-
-
- .sitetempestsTable th {
-     padding: 10px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .sitetempestsTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
-
-
-.shardwareTable th {
-     padding: 5px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .shardwareTable td {
-     padding-top: 3px;
-     padding-bottom:3px;
-}
-.rackTable th {
-     padding: 10px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .rackTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
-
-.sitebuildTable th {
-     padding: 10px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .sitebuildTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
-
- .softwareTable th {
-     padding: 10px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .softwareTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
-.popUpTable th {
-     padding: 10px;
-     text-align: left;
-     background-color: #cccccc;
-     border: 1px solid #ddd;
-}
- .popUpTable td {
-     padding-top: 5px;
-     padding-bottom:5px;
-}
-/*.pagination {
-     display: inline-block;
-     float:right;
-}
- .pagination li {
-     list-style-type:none;
-     color: white;
-     float: left;
-     padding: 8px 16px;
-     text-decoration: none;
-     transition: background-color .3s;
-     border: 1px solid #ddd;
-}
- .pagination li.active {
-     background-color: #DCDCDC;
-     color: white;
-     border: 1px solid #ddd;
-}*/
- button:disabled {
-     background: #dddddd;
-}
- .select-style {
-     border: 1px solid #ccc;
-     width: 240px;
-     height: 40px;
-     border-radius: 3px;
-     overflow: hidden;
-     background-position: right;
-}
- .select-style select {
-     
-     width: 100%;
-     border: 0px;
-     box-shadow: none;
-     background:none;
-     background-image: none;
-     -webkit-appearance: none;
-     outline: 0px;
-     
-}
-.selectStyle select option{
-       height:30px;
-       padding-top:5px;
-}
-@-moz-document url-prefix() {
-  select.example {
-    padding-right: 25px;
-
-     height:40px;
-      
-    background-image: url("data:image/svg+xml,\
-      <svg version='1.1' xmlns='http://www.w3.org/2000/svg' width='14px'\
-           height='14px' viewBox='0 0 1200 1000' fill='rgb(51,51,51)'>\
-        <path d='M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z'/>\
-      </svg>");
-    background-repeat: no-repeat;
-    background-position: calc(100% - 7px) 50%;
-    -moz-appearance: none;
-    appearance: none;
-   
-  }
-}
-@-moz-document url-prefix() {
-  select.exampleTable {
-    
-     
-     height:25px;
-     
-    background-image: url("data:image/svg+xml,\
-      <svg version='1.1' xmlns='http://www.w3.org/2000/svg' width='14px'\
-           height='14px' viewBox='0 0 1200 1000' fill='rgb(51,51,51)'>\
-        <path d='M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z'/>\
-      </svg>");
-    background-repeat: no-repeat;
-    background-position: calc(100% - 7px) 50%;
-    -moz-appearance: none;
-    appearance: none;
-   
-  }
-}
- .select-style select:focus {
-     outline: none;
-}
- .child_div_1{
-     float:left;
-     margin-right:50px;
-}
- .child_div_2{
-     float:right;
-     margin-right:50%;
-}
- .ngdialog {
-     margin-top:-100px;
-     padding-top:10px;
-     overflow-y: auto;
-}
- .addOnForm input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
- .tempestclassForm input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
-.hardwareForm input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
-.podForm input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
-.uploadForm input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
-.vnfForm input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
-.siteForm input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
-.siteForm li input[type=text], select, textarea {
-     width: 40%;
-     padding: 3px;
-     border: 0.5px solid #ccc;
-     border-radius: 4px;
-     box-sizing: border-box;
-     margin-top: 3px;
-     margin-bottom: 3px;
-     resize: vertical;
-}
- label {
-     font-weight: normal !important;
-}
-.ngdialog-custom{
-       background: #e6e6e6;
-}
-#footerlogo{
-       position:absolute;
-       display:inline-block;
-       bottom:0;
-        width: 250px;
-}
-.borderFrame{
-       margin-top:2px;
-       border:2px solid #cdcdcd;
-       /*border-radius: 0.1px;
-       /*-moz-border-radius: 0.1px;
-       -webkit-border-radius:0.1px;*/
-}
diff --git a/ui/src/main/webapp/resources/images/logo_akraino_edge_stack.png b/ui/src/main/webapp/resources/images/logo_akraino_edge_stack.png
deleted file mode 100755 (executable)
index c81bb53..0000000
Binary files a/ui/src/main/webapp/resources/images/logo_akraino_edge_stack.png and /dev/null differ
diff --git a/ui/src/main/webapp/resources/js/AECCommittedSubmissionsController.js b/ui/src/main/webapp/resources/js/AECCommittedSubmissionsController.js
deleted file mode 100644 (file)
index 9690793..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-
-var AECBlueprintValidationUIApp = angular
-        .module('BlueprintValidationUIManagement');
-
-AECBlueprintValidationUIApp.controller('AECCommittedSubmissionsController',
-        function($scope, restAPISvc, $interval, refreshPeriod) {
-
-            $scope.submissionIdList = [];
-
-            restAPISvc.getRestAPI("/api/submission/", function(data) {
-                $scope.submissions = data;
-            });
-
-            $scope.refreshCommittedSubmissions = function() {
-                restAPISvc.getRestAPI("/api/submission/", function(data) {
-                    $scope.submissions = data;
-                });
-            }
-
-            $scope.modifySubmissionIdList = function(id) {
-                if ($scope.submissionIdList.indexOf(id) === -1) {
-                    $scope.submissionIdList.push(id);
-                } else {
-                    $scope.submissionIdList.splice($scope.submissionIdList
-                            .indexOf(id), 1);
-                }
-            }
-
-            $scope.deleteSubmissions = function() {
-                var confirmation = confirm("Are you sure?");
-                if (confirmation == true) {
-                    angular.forEach($scope.submissionIdList, function(id) {
-                        var submission = {
-                            "submissionId" : id
-                        };
-                        restAPISvc
-                                .deleteRestAPI("/api/submission/", submission);
-                    });
-                }
-            }
-
-            $interval(function() {
-                $scope.refreshCommittedSubmissions();
-            }, refreshPeriod);
-
-        });
diff --git a/ui/src/main/webapp/resources/js/AECFindBySubmissionIdController.js b/ui/src/main/webapp/resources/js/AECFindBySubmissionIdController.js
deleted file mode 100644 (file)
index 2d1a99c..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-
-var AECBlueprintValidationUIApp = angular
-        .module('BlueprintValidationUIManagement');
-
-AECBlueprintValidationUIApp
-        .controller(
-                'AECFindBySubmissionIdController',
-                function($scope, restAPISvc) {
-
-                    initialize();
-
-                    function initialize() {
-                        $scope.results = [];
-                        restAPISvc
-                                .getRestAPI(
-                                        "/api/submission/",
-                                        function(data) {
-                                            $scope.submissions = data;
-                                            $scope.submissionsForDisplay = [];
-                                            angular
-                                                    .forEach(
-                                                            $scope.submissions,
-                                                            function(
-                                                                    submissionData) {
-                                                                var temp = "id: "
-                                                                        + submissionData.submissionId
-                                                                        + " blueprint: "
-                                                                        + submissionData.blueprintInstance.blueprint.blueprintName
-                                                                        + " version: "
-                                                                        + submissionData.blueprintInstance.version
-                                                                        + " layer: "
-                                                                        + submissionData.blueprintInstance.layer
-                                                                        + " lab: "
-                                                                        + submissionData.blueprintInstance.timeslot.lab
-                                                                        + " Start date and time: "
-                                                                        + submissionData.blueprintInstance.timeslot.startDateTime
-                                                                        + " duration: "
-                                                                        + submissionData.blueprintInstance.timeslot.duration;
-                                                                $scope.submissionsForDisplay
-                                                                        .push(temp);
-                                                            });
-                                        });
-                    }
-                    $scope.selectedSubmissionChange = function(
-                            selectedSubmission) {
-                        $scope.results = [];
-                        var id = selectedSubmission.substring(
-                                selectedSubmission.indexOf("id:") + 4,
-                                selectedSubmission.indexOf("blueprint") - 1);
-                        restAPISvc.getRestAPI(
-                                "/api/results/findBySubmissionId/" + id,
-                                function(data) {
-                                    $scope.results = data;
-                                });
-                    }
-
-                });
\ No newline at end of file
diff --git a/ui/src/main/webapp/resources/js/App.js b/ui/src/main/webapp/resources/js/App.js
deleted file mode 100755 (executable)
index 1bc514c..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-
-var AECBlueprintValidationUIApp = angular.module('BlueprintValidationUIManagement', ['ngDialog', 'ui.router', 'base64','App.config','ngStorage','ui.bootstrap', 'ngResource','ngFileUpload','ngMaterial']);
-
-AECBlueprintValidationUIApp.config(function($stateProvider, $urlRouterProvider) {
-    $urlRouterProvider.otherwise('/login')
-    $stateProvider
-        .state('common', {
-            templateUrl: 'views/indexMain.html',
-            abstract: true
-        })
-        .state('login', {
-            url: "/login",
-            controller: 'Login',
-            templateUrl: 'views/login.html'
-        })
-        .state('newSubmission', {
-            url: "/newSubmission",
-            parent: "common",
-            views: {
-                "main": {
-                    controller: 'AECNewSubmissionController',
-                    templateUrl: 'views/newSubmission.html'
-                }
-            }
-        })
-        .state('committedSubmissions', {
-            url: "/committedSubmissions",
-            parent: "common",
-            views: {
-                "main": {
-                    controller: 'AECCommittedSubmissionsController',
-                    templateUrl: 'views/committedSubmissions.html'
-                }
-            }
-        })
-        .state('findBySubmissionId', {
-            url: "/findBySubmissionId",
-            parent: "common",
-            views: {
-                "main": {
-                    controller: 'AECFindBySubmissionIdController',
-                    templateUrl: 'views/findBySubmissionId.html'
-                }
-            }
-        })
-});
-
-AECBlueprintValidationUIApp.controller('Login',function($scope, $http, $filter, filterFilter, $state, $base64,$rootScope,$controller,appContext) {
-    $rootScope.tokenId ="";
-    $scope.usernameVal = '';
-    $scope.passwordVal = '';
-    $rootScope.message = "Please enter credentials";
-    $scope.$state = $state;
-
-    var baseURL = window.location.protocol + '//' + window.location.host;
-    /* eslint-disable no-console */
-    console.log('Base URL for current frame is: ' + baseURL);
-    /* eslint-enable no-console */
-    $scope.goLogin = function() {
-        var arr = $scope.passwordVal;
-        if ($scope.usernameVal == '' && $scope.passwordVal == '') {
-            $scope.userMessage = 'Please enter a username.';
-            $scope.passwordMessage = 'Please enter a password.';
-        } else if ($scope.usernameVal == '') {
-            $scope.userMessage = 'Please enter a username.';
-            $scope.passwordMessage = '';
-        } else if ($scope.passwordVal == '') {
-            $scope.passwordMessage = 'Please enter a password.';
-            $scope.userMessage = '';
-        } else if (arr.length < 6) {
-            $scope.passwordMessage = 'Please enter a valid password.';
-            $scope.userMessage = '';
-        }
-       else {
-            $scope.passwordMessage = '';
-            $scope.userMessage ='';
-            // var userPwd = $scope.usernameVal + ":" + $scope.passwordVal;
-            // var auth = $base64.encode(userPwd);
-            /*
-             * $http({ method: 'POST', url: appContext+'/login', //url:
-             * 'http://'+hostUrl+'/AECPortalMgmt/login', headers: {
-             * 'Authorization': "Basic " + auth, 'Content-Type':
-             * "application/json", 'Accept': "application/json" }, data: { } }).
-             * then(function(response) { if (response.data.statusCode == 200) {
-             * $rootScope.tokenId = response.data.tokenId;
-             * localStorage.setItem("tokenId",response.data.tokenId);
-             * $state.transitionTo('sites'); } else if (response.data.statusCode ==
-             * 401){ $scope.passwordVal= null; $scope.passwordMessage = 'Invalid
-             * Credentials, please try again...';
-             *
-             * localStorage.removeItem("tokenId"); } }, function(error) { if
-             * (error.status == 401) { $scope.passwordMessage = 'Invalid
-             * Credentials, please try again...'; $scope.passwordVal ="";
-             * localStorage.removeItem("tokenId"); } else if (error.status ==
-             * 400) { $scope.passwordMessage = 'Session Invalid, please login
-             * again...'; $scope.passwordVal ="";
-             * localStorage.removeItem("tokenId"); } else if (error.status ==
-             * 307) { $scope.passwordMessage = 'Session expired,Please try
-             * again...'; $scope.passwordVal ="";
-             * localStorage.removeItem("tokenId"); } });
-             */
-            $state.transitionTo('committedSubmissions');
-        }
-    }
-    $scope.goLogout = function() {
-        $http({
-            method: 'POST',
-            url: appContext+'/logout',
-            headers: {
-                'Content-Type': "application/json",
-                'Accept': "application/json",
-                'tokenId' : $rootScope.tokenId
-            },
-        data:{
-        }
-            /*
-             * data: { 'username': $scope.usernameVal, 'passowrd':
-             * $scope.passwordVal }
-             */
-        }).then(function(response) {
-            if (response.data.statusCode == 200) {
-                $rootScope.tokenId ="";
-                localStorage.removeItem("tokenId");
-                $state.transitionTo('login');
-                $rootScope.message = 'User logged out, please login again...';
-            }
-        }, function(response) {
-            $scope.message = 'Unknown error,Try again later' + response.status;
-        });
-    }
-});
-
diff --git a/ui/src/main/webapp/resources/js/CommonController.js b/ui/src/main/webapp/resources/js/CommonController.js
deleted file mode 100644 (file)
index dda7718..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2019 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.
- */
-
-var AECBlueprintValidationUIApp = angular
-        .module('BlueprintValidationUIManagement');
-
-AECBlueprintValidationUIApp.controller('CommonController', function($scope,
-        $http, $sce, ngDialog, $filter, $rootScope, $state, $templateCache) {
-    $scope.errorHandle = function(error) {
-        if (error.status == 400) {
-            localStorage.removeItem("tokenId");
-            $state.transitionTo('login');
-            localStorage.removeItem("tokenId");
-            $rootScope.message = 'Session Invalid, please login again...';
-        } else if (error.status == 401) {
-            localStorage.removeItem("tokenId");
-            $state.transitionTo('login');
-            $rootScope.message = 'Invalid Credentials, please try again...';
-        } else if (error.status == 307) {
-            localStorage.removeItem("tokenId");
-            $state.transitionTo('login');
-            $rootScope.message = 'Session expired,Please try again...';
-        }
-    }
-
-    $scope.$on('onBeforeUnload', function(e, confirmation) {
-        var e2 = e || window.event;
-        if (e2) {
-            confirmation.message = "All data willl be lost.";
-            e2.preventDefault();
-        }
-    });
-    $scope.$on('onUnload', function() {
-        $templateCache.removeAll();
-    });
-
-    $scope.cmp = function(x, y) {
-        return x > y ? 1 : x < y ? -1 : 0;
-    };
-
-});
\ No newline at end of file
diff --git a/ui/src/main/webapp/reusable_chart.js b/ui/src/main/webapp/reusable_chart.js
deleted file mode 100644 (file)
index 01ab32d..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-d3.custom = {};
-
-d3.custom.barChart = function module() {
-    var margin = {
-        top : 20,
-        right : 20,
-        bottom : 40,
-        left : 40
-    }, width = 500, height = 500, gap = 0, ease = 'cubic-in-out';
-    var svg, duration = 500;
-
-    var dispatch = d3.dispatch('customHover');
-    function exports(_selection) {
-        _selection
-                .each(function(_data) {
-
-                    var chartW = width - margin.left - margin.right, chartH = height
-                            - margin.top - margin.bottom;
-
-                    var x1 = d3.scale.ordinal().domain(
-                            _data.map(function(d, i) {
-                                return i;
-                            })).rangeRoundBands([ 0, chartW ], .1);
-
-                    var y1 = d3.scale.linear().domain(
-                            [ 0, d3.max(_data, function(d, i) {
-                                return d;
-                            }) ]).range([ chartH, 0 ]);
-
-                    var xAxis = d3.svg.axis().scale(x1).orient('bottom');
-
-                    var yAxis = d3.svg.axis().scale(y1).orient('left');
-
-                    var barW = chartW / _data.length;
-
-                    if (!svg) {
-                        svg = d3.select(this).append('svg').classed('chart',
-                                true);
-                        var container = svg.append('g').classed(
-                                'container-group', true);
-                        container.append('g').classed('chart-group', true);
-                        container.append('g')
-                                .classed('x-axis-group axis', true);
-                        container.append('g')
-                                .classed('y-axis-group axis', true);
-                    }
-
-                    svg.transition().duration(duration).attr({
-                        width : width,
-                        height : height
-                    })
-                    svg.select('.container-group').attr(
-                            {
-                                transform : 'translate(' + margin.left + ','
-                                        + margin.top + ')'
-                            });
-
-                    svg.select('.x-axis-group.axis').transition().duration(
-                            duration).ease(ease).attr({
-                        transform : 'translate(0,' + (chartH) + ')'
-                    }).call(xAxis);
-
-                    svg.select('.y-axis-group.axis').transition().duration(
-                            duration).ease(ease).call(yAxis);
-
-                    var gapSize = x1.rangeBand() / 100 * gap;
-                    var barW = x1.rangeBand() - gapSize;
-                    var bars = svg.select('.chart-group').selectAll('.bar')
-                            .data(_data);
-                    bars.enter().append('rect').classed('bar', true).attr({
-                        x : chartW,
-                        width : barW,
-                        y : function(d, i) {
-                            return y1(d);
-                        },
-                        height : function(d, i) {
-                            return chartH - y1(d);
-                        }
-                    }).on('mouseover', dispatch.customHover);
-                    bars.transition().duration(duration).ease(ease).attr({
-                        width : barW,
-                        x : function(d, i) {
-                            return x1(i) + gapSize / 2;
-                        },
-                        y : function(d, i) {
-                            return y1(d);
-                        },
-                        height : function(d, i) {
-                            return chartH - y1(d);
-                        }
-                    });
-                    bars.exit().transition().style({
-                        opacity : 0
-                    }).remove();
-
-                    duration = 500;
-
-                });
-    }
-    exports.width = function(_x) {
-        if (!arguments.length)
-            return width;
-        width = parseInt(_x);
-        return this;
-    };
-    exports.height = function(_x) {
-        if (!arguments.length)
-            return height;
-        height = parseInt(_x);
-        duration = 0;
-        return this;
-    };
-    exports.gap = function(_x) {
-        if (!arguments.length)
-            return gap;
-        gap = _x;
-        return this;
-    };
-    exports.ease = function(_x) {
-        if (!arguments.length)
-            return ease;
-        ease = _x;
-        return this;
-    };
-    d3.rebind(exports, dispatch, 'on');
-    return exports;
-};
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/css/att_angular_gridster/sandbox-gridster.css b/ui/src/main/webapp/static/fusion/css/att_angular_gridster/sandbox-gridster.css
new file mode 100644 (file)
index 0000000..1b256ba
--- /dev/null
@@ -0,0 +1,175 @@
+.gridster {
+    position: relative;
+    margin: auto;
+    /* height: 0
+ */
+}
+
+.gridster>ul {
+    margin: 0;
+    list-style: none;
+    padding: 0
+}
+
+.gridster-item {
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    list-style: none;
+    z-index: 2;
+    position: absolute;
+    display: none
+}
+
+.gridster-loaded {
+    -webkit-transition: height .3s;
+    -moz-transition: height .3s;
+    -o-transition: height .3s;
+    transition: height .3s
+}
+
+.gridster-loaded .gridster-item {
+    display: block;
+    position: absolute;
+    -webkit-transition: opacity .3s, left .3s, top .3s, width .3s, height
+        .3s;
+    -moz-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
+    -o-transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
+    transition: opacity .3s, left .3s, top .3s, width .3s, height .3s;
+    -webkit-transition-delay: 50ms;
+    -moz-transition-delay: 50ms;
+    -o-transition-delay: 50ms;
+    transition-delay: 50ms
+}
+
+.gridster-loaded .gridster-preview-holder {
+    display: none;
+    z-index: 1;
+    position: absolute;
+    background-color: #067ab4;
+    /*
+    background-color: rgb(6, 122, 180);
+    -ms-filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#067ab4', endColorstr='#067ab4');  IE
+    opacity: 0.2;
+    */
+    border-color: #fff;
+    -webkit-transition: width .2s, height .3s;
+    -moz-transition: width .2s, height .3s;
+    -o-transition: width .2s, height .3s;
+    transition: width .2s, height .3s;
+    -webkit-transition-delay: 50ms;
+    -moz-transition-delay: 50ms;
+    -o-transition-delay: 50ms;
+    transition-delay: 50ms
+}
+
+.gridster-loaded .gridster-item.gridster-item-moving {
+    -webkit-transition: none;
+    -moz-transition: none;
+    -o-transition: none;
+    transition: none;
+    opacity: 0.9;
+}
+
+.gridster-mobile {
+    height: auto !important
+}
+
+.gridster-mobile .gridster-item {
+    height: auto;
+    position: static;
+    float: none
+}
+
+.gridster-item.ng-leave.ng-leave-active {
+    opacity: 0
+}
+
+.gridster-item.ng-enter {
+    opacity: 1
+}
+
+.gridster-item-moving {
+    z-index: 3
+}
+
+.gridster-item-resizable-handler {
+    position: absolute;
+    font-size: 1px;
+    display: block
+}
+
+.handle-se {
+    cursor: se-resize;
+    width: 0;
+    height: 0;
+    right: 1px;
+    bottom: 1px;
+    border-style: solid;
+    border-width: 0 0 12px 12px;
+    border-color: transparent
+}
+
+.handle-ne {
+    cursor: ne-resize;
+    width: 12px;
+    height: 12px;
+    right: 1px;
+    top: 1px
+}
+
+.handle-nw {
+    cursor: nw-resize;
+    width: 12px;
+    height: 12px;
+    left: 1px;
+    top: 1px
+}
+
+.handle-sw {
+    cursor: sw-resize;
+    width: 12px;
+    height: 12px;
+    left: 1px;
+    bottom: 1px
+}
+
+.handle-e {
+    cursor: e-resize;
+    width: 12px;
+    bottom: 0;
+    right: 1px;
+    top: 0
+}
+
+.handle-s {
+    cursor: s-resize;
+    height: 12px;
+    right: 0;
+    bottom: 1px;
+    left: 0
+}
+
+.handle-n {
+    cursor: n-resize;
+    height: 12px;
+    right: 0;
+    top: 1px;
+    left: 0
+}
+
+.handle-w {
+    cursor: w-resize;
+    width: 12px;
+    left: 1px;
+    top: 0;
+    bottom: 0
+}
+
+.gridster .gridster-item:hover .gridster-box {
+    border: 1.5px solid #B3B2B3
+}
+
+.gridster .gridster-item:hover .handle-se {
+    border-color: transparent transparent #ccc
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/css/att_angular_gridster/ui-gridster.css b/ui/src/main/webapp/static/fusion/css/att_angular_gridster/ui-gridster.css
new file mode 100644 (file)
index 0000000..54bbd89
--- /dev/null
@@ -0,0 +1,143 @@
+/* ui-gridster.css */
+.gridster-container {
+    background-color: #EFEFEF;
+    color: #fff;
+    border: 1px dashed;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
+/* app css for attGridtser */
+.gridster-item-container {
+    background-color: #FFFFFF;
+    position: relative;
+    margin-left: auto;
+    margin-right: auto;
+    min-height: 79px;
+    height: 100%;
+}
+
+.gridster-item-container .gridster-item-header {
+    /* gridster-item Header */
+    position: relative;
+    height: 50px !important;
+    border: 1px solid #d3d3d3;
+    border-bottom: 0;
+    background-color: #E5E5E5;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    z-index: 1;
+    -webkit-border-radius: 2px 2px 0 0;
+    -moz-border-radius: 2px 2px 0 0;
+    -ms-border-radius: 2px 2px 0 0;
+    -o-border-radius: 2px 2px 0 0;
+    border-radius: 2px 2px 0 0;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    overflow: hidden;
+    /* IE6-8 */
+}
+
+.gridster-item-container .gridster-item-header .gridster-item-handle {
+    cursor: move;
+    margin: 12px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    border: 0;
+    vertical-align: middle;
+    -ms-interpolation-mode: bicubic;
+    display: block;
+}
+
+.gridster-item-container .gridster-item-header .gridster-item-header-content
+    {
+    line-height: 44px;
+    margin-left: 26px;
+    font-family: "Omnes-ECOMP-W02", Arial;
+    font-size: 18px;
+    color: #444444;
+    float: left;
+}
+
+.gridster-item-container .gridster-item-header .gridster-item-sub-header-content
+    {
+    position: absolute;
+    top: 29.5px;
+    left: 26px;
+    font-family: "Omnes-ECOMP-W02", Arial;
+    font-size: 12px;
+    color: #444444;
+}
+
+.gridster-item-container .gridster-item-header .gridster-item-header-buttons-container
+    {
+    position: absolute;
+    right: 10px;
+    top: 10px;
+    overflow: hidden;
+    text-align: right;
+    height: 30px;
+    color: #444444;
+}
+
+.gridster-item-container .gridster-item-body {
+    /* gridster-item Body */
+    position: absolute;
+    width: 100%;
+    top: 50px;
+    left: 0;
+    right: 0;
+    bottom: 29px;
+    border: 1px solid #d3d3d3;
+    box-sizing: border-box;
+    overflow: auto;
+    color: #444444;
+    /* text-align: center; */
+}
+
+.gridster-item-container .gridster-item-footer {
+    /* gridster-item Footer */
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    height: 29px !important;
+    text-align: left;
+    cursor: pointer;
+    border: 1px solid #d3d3d3;
+    border-top: 0;
+    background-color: #F2F2F2;
+    -webkit-border-radius: 0 0 2px 2px;
+    -moz-border-radius: 0 0 2px 2px;
+    -ms-border-radius: 0 0 2px 2px;
+    -o-border-radius: 0 0 2px 2px;
+    border-radius: 0 0 2px 2px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    text-decoration: none;
+    /* IE6-8 */
+}
+
+.gridster-item-container .gridster-item-footer:hover {
+    background-color: #E5E5E5;
+    color: #565656;
+    text-decoration: underline;
+}
+
+.gridster-item-container .gridster-item-footer .gridster-item-footer-content
+    {
+    line-height: 30px;
+    font-family: "Omnes-ECOMP-W02", Arial;
+    font-size: 12px;
+    color: #565656;
+    margin: 20px;
+    text-decoration: none;
+}
+
+.gridster-item-container .gridster-item-footer .gridster-item-footer-content:hover
+    {
+    color: #199ddf;
+    text-decoration: underline;
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/css/fusion-sunny.css b/ui/src/main/webapp/static/fusion/css/fusion-sunny.css
new file mode 100644 (file)
index 0000000..243a7e7
--- /dev/null
@@ -0,0 +1,399 @@
+input, textarea, select, div {
+    font-family: Arial;
+    font-size: 11px;
+    font-weight: normal;
+}
+
+form {
+    margin-top: 5px;
+}
+
+.applicationWindow {
+    border-width: 0px 0px 1px 0px;
+    border-style: solid;
+    border-color: #959595;
+    box-shadow: inset 0 0 10px #000000;
+    margin-top: 10px;
+    margin-bottom: 10px;
+    margin-left: 10px;
+    margin-right: 10px;
+}
+
+.feedbackMessage {
+    width: 99%;
+    font-family: Arial;
+    font-size: 11px;
+    color: #1f1f1f;
+    padding: 3px;
+    border: 1px #eeb420 solid;
+    margin: 3px;
+    background: #fff9e5;
+}
+
+.menubar {
+    border-width: 0px 0px 0px 1px;
+    border-style: solid;
+    border-color: #959595;
+}
+
+.footer {
+    /*clear: both;*/
+    border-width: 0px 1px 0px 1px;
+    border-style: solid;
+    border-color: #959595;
+    font-family: Verdana, Arial, Helvetica, sans-serif;
+    font-size: 9px;
+    padding: 10px 10px 30px 10px;
+    background: white;
+}
+
+.pageTitle {
+    font-family: Arial;
+    font-size: 18px;
+    font-weight: bold;
+    margin-top: 5px;
+}
+
+.content {
+    border-width: 0px 1px 0px 1px;
+    border-style: solid;
+    border-color: #959595;
+    font-family: Arial;
+    font-size: 11px;
+    padding: 5px;
+    background: white;
+    /*height: 600px;*/
+}
+
+.popupContent {
+    font-family: Arial;
+    font-size: 11px;
+    padding: 3px;
+}
+
+.logo {
+    border-width: 0px 1px 0px 1px;
+    border-style: solid;
+    border-color: #959595;
+    text-align: right;
+}
+
+.sep {
+    border: 1px solid black
+}
+
+.logo { /*position: relative;*/
+    float: left;
+    padding-top: 25px;
+    padding-left: 25px;
+}
+
+.applicationLogo {
+    float: right;
+    padding-top: 25px;
+    padding-right: 25px;
+}
+
+.applinkWhite {
+    font-family: Arial;
+    font-size: 13px;
+    font-weight: 900;
+    color: #FFFFFF;
+    text-decoration: none;
+}
+
+.terms {
+    font-family: Verdana, Arial, Helvetica, sans-serif;
+    font-size: 9px;
+}
+
+.broadcastMessage {
+    color: red;
+}
+
+.broadcastMessageList {
+    color: red;
+}
+
+.button {
+    margin: 5px 1px 5px 1px;
+    padding: 3px;
+}
+
+.toolbarbutton:hover {
+    color: #005491;
+}
+
+.headerText {
+    font-family: Arial;
+    font-size: 15px;
+    font-weight: 700;
+    color: #000000;
+}
+
+.headerBackground {
+    background: #336699;
+}
+
+.errorMessageText {
+    font-family: Arial;
+    font-size: 11px;
+    font-weight: bold;
+    color: red;
+}
+
+.normalText {
+    font-family: Arial;
+    font-size: 11px;
+    color: #000000;
+}
+
+.normalTextRed {
+    font-family: Arial;
+    font-size: 11px;
+    color: red;
+}
+
+.smallNormalText {
+    font-family: Arial;
+    font-size: 9px;
+    color: #000000;
+}
+
+.tableBorder {
+    border: 1px outset teal
+}
+
+.validationError {
+    background: #b9eaff;
+}
+
+.templatebody {
+    background: url(../images/body_graphic.jpg) repeat-x;
+    /*margin: 40px 80px 40px 80px;*/
+}
+
+/*--------------------- General Content ------------------------------------*/
+.relative {
+    position: relative;
+}
+
+.clear {
+    clear: both;
+}
+
+.left {
+    float: left;
+}
+
+.leftCentered {
+    float: left;
+    text-align: center;
+}
+
+.right {
+    float: right;
+}
+
+.rightAligned {
+    text-align: right;
+}
+
+.centered {
+    text-align: center;
+    align: center;
+}
+
+.noWrap {
+    white-space: nowrap;
+}
+
+.disabled {
+    color: gray;
+    cursor: hand;
+}
+
+/*--------------------- Tab styles -------------------------------------*/
+.current {
+    font-weight: bold;
+    border-width: 1px 1px 1px 1px;
+    border-color: silver;
+    border-style: solid;
+}
+
+.subTab {
+    font-weight: bold;
+    font-family: Arial;
+    font-size: 11px;
+    color: #0F3B82;
+}
+
+/*--------------------- Grid styles ------------------------------------*/
+
+/* Grid navigation and header styles */
+.gridFilterLabel {
+    font-size: 7pt;
+    font-align: justify;
+    font-weight: bold;
+    display: block;
+}
+
+.gridFilterText {
+    height: 17px;
+    font-size: 8pt;
+    width: 60%;
+    font-align: justify;
+}
+
+.gridNavigationBar {
+    font-family: Arial, Verdana;
+    font-size: 11px;
+    font-weight: normal;
+    color: #000;
+    margin: 0px;
+    width: 100%;
+    vertical-align: middle;
+}
+
+.gridNavigationBar .navLinks {
+    float: left;
+    margin-right: 15px;
+    padding-top: 2px;
+    height: 19px;
+    line-height: 19px;
+}
+
+.gridNavigationBar .pageControls {
+    float: left;
+    margin-right: 15px;
+    height: 19px;
+    line-height: 19px;
+}
+
+.gridNavigationBar .pageControls input {
+    font-size: 8pt;
+    height: 17px;
+    vertical-align: middle;
+}
+
+.gridNavigationBar .pageInfo {
+    float: right;
+    vertical-align: middle;
+    height: 19px;
+    line-height: 19px;
+}
+
+.gridNavigationBar .pageInfo input {
+    font-size: 8pt;
+    height: 17px;
+    vertical-align: middle;
+}
+
+.gridNavigationBar span {
+    padding: 3px;
+}
+
+.gridNavigationBar a {
+    text-decoration: underline;
+    color: #000;
+    font-weight: normal;
+}
+
+.gridNavigationBar img {
+    vertical-align: middle;
+}
+
+.gridBulkUpdateRow {
+    height: 35px;
+    line-height: 35px;
+}
+
+.gridBulkUpdateRow input {
+    vertical-align: middle;
+}
+
+/* dummy class used to lock the form elements of a grid - ex. bulk transaction processing */
+.alwaysEnabled {
+    
+}
+
+.hidden {
+    display: none;
+}
+
+.selectedPage {
+    background-color: #C4DFFB;
+    color: white;
+    border-style: solid;
+    border-width: 1px;
+    border-color: gray;
+    padding-left: 3px;
+    padding-right: 3px;
+    vertical-align: middle;
+}
+
+.selectedRow {
+    /*background-color:#C4DFFB;*/
+    
+}
+
+/* Action Item styles */
+.actionList {
+    margin-left: -20px;
+    margin-right: -10px;
+    padding-left: 5px;
+}
+
+.actionList li {
+    float: left;
+    padding-left: 3px;
+    padding-right: 3px;
+}
+
+.actionList li a {
+    text-decoration: none;
+    color: #000;
+}
+
+/* Filter Operator List styles */
+.filterList {
+    margin: 0px;
+}
+
+.filterList li {
+    list-style-type: none;
+    padding: 3px 3px 3px 2px;
+    cursor: hand;
+    font-size: 11px;
+}
+
+.filterList li:hover {
+    background: #404040;
+}
+
+.filterList li a {
+    color: #000;
+    text-decoration: none;
+}
+
+.filterList li:hover a {
+    color: white;
+}
+
+.filterList li a:hover {
+    text-decoration: none;
+    color: white;
+}
+
+.filterListItem a {
+    text-decoration: none;
+    padding: 3px 2px 3px 2px;
+}
+
+/*---------------------- Customized ZK Styles ------------------------------*/
+.z-datebox input, .z-timebox input {
+    font-family: Arial;
+    font-size: 11px;
+    height: 15px;
+    margin-top: 1px;
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/images/att_angular_gridster/grips.png b/ui/src/main/webapp/static/fusion/images/att_angular_gridster/grips.png
new file mode 100644 (file)
index 0000000..29b92cc
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/images/att_angular_gridster/grips.png differ
diff --git a/ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack.png b/ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack.png
new file mode 100644 (file)
index 0000000..af81b31
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack.png differ
diff --git a/ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack2.png b/ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack2.png
new file mode 100644 (file)
index 0000000..b8e3688
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/images/logo_akraino_edge_stack2.png differ
diff --git a/ui/src/main/webapp/static/fusion/js/att_angular_gridster/angular-gridster.js b/ui/src/main/webapp/static/fusion/js/att_angular_gridster/angular-gridster.js
new file mode 100644 (file)
index 0000000..0c9d0ad
--- /dev/null
@@ -0,0 +1,2377 @@
+/*global define:true*/
+(function(root, factory) {
+
+       'use strict';
+
+       if (typeof define === 'function' && define.amd) {
+               // AMD
+               define(['angular'], factory);
+       } else if (typeof exports === 'object') {
+               // CommonJS
+               module.exports = factory(require('angular'));
+       } else {
+               // Browser, nothing "exported". Only registered as a module with
+        // angular.
+               factory(root.angular);
+       }
+}(this, function(angular) {
+
+   'use strict';
+
+    var ie8 = false;
+
+    var getInternetExplorerVersion = function ()
+        // Returns the version of Internet Explorer >4 or
+        // undefined(indicating the use of another browser).
+        {
+            var isIE10 = (eval("/*@cc_on!@*/false") && document.documentMode === 10);
+            if (isIE10) {
+                return 10;
+            }
+            var v = 3,
+                div = document.createElement('div'),
+                all = div.getElementsByTagName('i');
+            do {
+                div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->';
+            } while (all[0]);
+            return v > 4 ? v : undefined;
+        };
+
+    var browserVersion = getInternetExplorerVersion();
+
+    if (browserVersion && browserVersion < 9) {
+        ie8 = true;
+    }
+
+       // This returned angular module 'gridster' is what is exported.
+       return angular.module('attGridsterLib', [])
+
+       .constant('gridsterConfig', {
+               columns: 6, // number of columns in the grid
+               pushing: true, // whether to push other items out of the way
+               floating: true, // whether to automatically float items up so they stack
+               swapping: true, // whether or not to have items switch places instead of
+                        // push down if they are the same size
+               width: 'auto', // width of the grid. "auto" will expand the grid to its
+                        // parent container
+               colWidth: 'auto', // width of grid columns. "auto" will divide the
+                            // width of the grid evenly among the columns
+               rowHeight: 'match', // height of grid rows. 'match' will make it the
+                            // same as the column width, a numeric value will be
+                            // interpreted as pixels, '/2' is half the column
+                            // width, '*5' is five times the column width, etc.
+               margins: [10, 10], // margins in between grid items
+               outerMargin: false,
+               isMobile: false, // toggle mobile view
+               mobileBreakPoint: 100, // width threshold to toggle mobile mode
+               mobileModeEnabled: true, // whether or not to toggle mobile mode when
+                                    // screen width is less than
+                                    // mobileBreakPoint
+               minColumns: 1, // minimum amount of columns the grid can scale down to
+               minRows: 1, // minimum amount of rows to show if the grid is empty
+               maxRows: 100, // maximum amount of rows in the grid
+               defaultSizeX: 1, // default width of an item in columns
+               defaultSizeY: 1, // default height of an item in rows
+               minSizeX: 1, // minimum column width of an item
+               maxSizeX: null, // maximum column width of an item
+               minSizeY: 1, // minumum row height of an item
+               maxSizeY: null, // maximum row height of an item
+               saveGridItemCalculatedHeightInMobile: false, // grid item height in
+                                                        // mobile display. true-
+                                                        // to use the calculated
+                                                        // height by sizeY given
+               resizable: { // options to pass to resizable handler
+                       enabled: false,
+                       handles: ['s', 'e', 'n', 'w', 'se', 'ne', 'sw', 'nw']
+               },
+               draggable: { // options to pass to draggable handler
+                       enabled: true,
+                       scrollSensitivity: 20, // Distance in pixels from the edge of the
+                                    // viewport after which the viewport should
+                                    // scroll, relative to pointer
+                       scrollSpeed: 15 // Speed at which the window should scroll once the
+                            // mouse pointer gets within scrollSensitivity
+                            // distance
+               }
+       })
+
+       .controller('GridsterCtrl', ['gridsterConfig', '$timeout',
+               function(gridsterConfig, $timeout) {
+
+                       var gridster = this;
+
+                       /**
+             * Create options from gridsterConfig constant
+             */
+                       angular.extend(this, gridsterConfig);
+
+                       this.resizable = angular.extend({}, gridsterConfig.resizable || {});
+                       this.draggable = angular.extend({}, gridsterConfig.draggable || {});
+
+                       var flag = false;
+                       this.layoutChanged = function() {
+                               if (flag) {
+                                       return;
+                               }
+                               flag = true;
+                               $timeout(function() {
+                                       flag = false;
+                                       if (gridster.loaded) {
+                                               gridster.floatItemsUp();
+                                       }
+                                       gridster.updateHeight(gridster.movingItem ? gridster.movingItem.sizeY : 0);
+                               }, 30);
+                       };
+
+                       /**
+             * A positional array of the items in the grid
+             */
+                       this.grid = [];
+
+                       /**
+             * Clean up after yourself
+             */
+                       this.destroy = function() {
+                               // empty the grid to cut back on the possibility
+                               // of circular references
+                               if (this.grid) {
+                                       this.grid = [];
+                               }
+                               this.$element = null;
+                       };
+
+                       /**
+             * Overrides default options
+             *
+             * @param {Object}
+             *            options The options to override
+             */
+                       this.setOptions = function(options) {
+                               if (!options) {
+                                       return;
+                               }
+
+                               options = angular.extend({}, options);
+
+                               // all this to avoid using jQuery...
+                               if (options.draggable) {
+                                       angular.extend(this.draggable, options.draggable);
+                                       delete(options.draggable);
+                               }
+                               if (options.resizable) {
+                                       angular.extend(this.resizable, options.resizable);
+                                       delete(options.resizable);
+                               }
+
+                               angular.extend(this, options);
+
+                               if (!this.margins || this.margins.length !== 2) {
+                                       this.margins = [0, 0];
+                               } else {
+                                       for (var x = 0, l = this.margins.length; x < l; ++x) {
+                                               this.margins[x] = parseInt(this.margins[x], 10);
+                                               if (isNaN(this.margins[x])) {
+                                                       this.margins[x] = 0;
+                                               }
+                                       }
+                               }
+                       };
+
+                       /**
+             * Check if item can occupy a specified position in the grid
+             *
+             * @param {Object}
+             *            item The item in question
+             * @param {Number}
+             *            row The row index
+             * @param {Number}
+             *            column The column index
+             * @returns {Boolean} True if if item fits
+             */
+                       this.canItemOccupy = function(item, row, column) {
+                               return row > -1 && column > -1 && item.sizeX + column <= this.columns && item.sizeY + row <= this.maxRows;
+                       };
+
+                       /**
+             * Set the item in the first suitable position
+             *
+             * @param {Object}
+             *            item The item to insert
+             */
+                       this.autoSetItemPosition = function(item) {
+                               // walk through each row and column looking for a place it will
+                // fit
+                               for (var rowIndex = 0; rowIndex < this.maxRows; ++rowIndex) {
+                                       for (var colIndex = 0; colIndex < this.columns; ++colIndex) {
+                                               // only insert if position is not already taken and it
+                        // can fit
+                                               var items = this.getItems(rowIndex, colIndex, item.sizeX, item.sizeY, item);
+                                               if (items.length === 0 && this.canItemOccupy(item, rowIndex, colIndex)) {
+                                                       this.putItem(item, rowIndex, colIndex);
+                                                       return;
+                                               }
+                                       }
+                               }
+                               throw new Error('Unable to place item!');
+                       };
+
+                       /**
+             * Gets items at a specific coordinate
+             *
+             * @param {Number}
+             *            row
+             * @param {Number}
+             *            column
+             * @param {Number}
+             *            sizeX
+             * @param {Number}
+             *            sizeY
+             * @param {Array}
+             *            excludeItems An array of items to exclude from
+             *            selection
+             * @returns {Array} Items that match the criteria
+             */
+                       this.getItems = function(row, column, sizeX, sizeY, excludeItems) {
+                               var items = [];
+                               if (!sizeX || !sizeY) {
+                                       sizeX = sizeY = 1;
+                               }
+                               if (excludeItems && !(excludeItems instanceof Array)) {
+                                       excludeItems = [excludeItems];
+                               }
+                               for (var h = 0; h < sizeY; ++h) {
+                                       for (var w = 0; w < sizeX; ++w) {
+                                               var item = this.getItem(row + h, column + w, excludeItems);
+                                               if (item && (!excludeItems || excludeItems.indexOf(item) === -1) && items.indexOf(item) === -1) {
+                                                       items.push(item);
+                                               }
+                                       }
+                               }
+                               return items;
+                       };
+
+                       /**
+             * @param {Array}
+             *            items
+             * @returns {Object} An item that represents the bounding box of the
+             *          items
+             */
+                       this.getBoundingBox = function(items) {
+
+                               if (items.length === 0) {
+                                       return null;
+                               }
+                               if (items.length === 1) {
+                                       return {
+                                               row: items[0].row,
+                                               col: items[0].col,
+                                               sizeY: items[0].sizeY,
+                                               sizeX: items[0].sizeX
+                                       };
+                               }
+
+                               var maxRow = 0;
+                               var maxCol = 0;
+                               var minRow = 9999;
+                               var minCol = 9999;
+
+                               for (var i = 0, l = items.length; i < l; ++i) {
+                                       var item = items[i];
+                                       minRow = Math.min(item.row, minRow);
+                                       minCol = Math.min(item.col, minCol);
+                                       maxRow = Math.max(item.row + item.sizeY, maxRow);
+                                       maxCol = Math.max(item.col + item.sizeX, maxCol);
+                               }
+
+                               return {
+                                       row: minRow,
+                                       col: minCol,
+                                       sizeY: maxRow - minRow,
+                                       sizeX: maxCol - minCol
+                               };
+                       };
+
+
+                       /**
+             * Removes an item from the grid
+             *
+             * @param {Object}
+             *            item
+             */
+                       this.removeItem = function(item) {
+                               for (var rowIndex = 0, l = this.grid.length; rowIndex < l; ++rowIndex) {
+                                       var columns = this.grid[rowIndex];
+                                       if (!columns) {
+                                               continue;
+                                       }
+                                       var index = columns.indexOf(item);
+                                       if (index !== -1) {
+                                               columns[index] = null;
+                                               break;
+                                       }
+                               }
+                               this.layoutChanged();
+                       };
+
+                       /**
+             * Returns the item at a specified coordinate
+             *
+             * @param {Number}
+             *            row
+             * @param {Number}
+             *            column
+             * @param {Array}
+             *            excludeItems Items to exclude from selection
+             * @returns {Object} The matched item or null
+             */
+                       this.getItem = function(row, column, excludeItems) {
+                               if (excludeItems && !(excludeItems instanceof Array)) {
+                                       excludeItems = [excludeItems];
+                               }
+                               var sizeY = 1;
+                               while (row > -1) {
+                                       var sizeX = 1,
+                                               col = column;
+                                       while (col > -1) {
+                                               var items = this.grid[row];
+                                               if (items) {
+                                                       var item = items[col];
+                                                       if (item && (!excludeItems || excludeItems.indexOf(item) === -1) && item.sizeX >= sizeX && item.sizeY >= sizeY) {
+                                                               return item;
+                                                       }
+                                               }
+                                               ++sizeX;
+                                               --col;
+                                       }
+                                       --row;
+                                       ++sizeY;
+                               }
+                               return null;
+                       };
+
+                       /**
+             * Insert an array of items into the grid
+             *
+             * @param {Array}
+             *            items An array of items to insert
+             */
+                       this.putItems = function(items) {
+                               for (var i = 0, l = items.length; i < l; ++i) {
+                                       this.putItem(items[i]);
+                               }
+                       };
+
+                       /**
+             * Insert a single item into the grid
+             *
+             * @param {Object}
+             *            item The item to insert
+             * @param {Number}
+             *            row (Optional) Specifies the items row index
+             * @param {Number}
+             *            column (Optional) Specifies the items column index
+             * @param {Array}
+             *            ignoreItems
+             */
+                       this.putItem = function(item, row, column, ignoreItems) {
+                               // auto place item if no row specified
+                               if (typeof row === 'undefined' || row === null) {
+                                       row = item.row;
+                                       column = item.col;
+                                       if (typeof row === 'undefined' || row === null) {
+                                               this.autoSetItemPosition(item);
+                                               return;
+                                       }
+                               }
+
+                               // keep item within allowed bounds
+                               if (!this.canItemOccupy(item, row, column)) {
+                                       column = Math.min(this.columns - item.sizeX, Math.max(0, column));
+                                       row = Math.min(this.maxRows - item.sizeY, Math.max(0, row));
+                               }
+
+                               // check if item is already in grid
+                               if (item.oldRow !== null && typeof item.oldRow !== 'undefined') {
+                                       var samePosition = item.oldRow === row && item.oldColumn === column;
+                                       var inGrid = this.grid[row] && this.grid[row][column] === item;
+                                       if (samePosition && inGrid) {
+                                               item.row = row;
+                                               item.col = column;
+                                               return;
+                                       } else {
+                                               // remove from old position
+                                               var oldRow = this.grid[item.oldRow];
+                                               if (oldRow && oldRow[item.oldColumn] === item) {
+                                                       delete oldRow[item.oldColumn];
+                                               }
+                                       }
+                               }
+
+                               item.oldRow = item.row = row;
+                               item.oldColumn = item.col = column;
+
+                               this.moveOverlappingItems(item, ignoreItems);
+
+                               if (!this.grid[row]) {
+                                       this.grid[row] = [];
+                               }
+                               this.grid[row][column] = item;
+
+                               if (this.movingItem === item) {
+                                       this.floatItemUp(item);
+                               }
+                               this.layoutChanged();
+                       };
+
+                       /**
+             * Trade row and column if item1 with item2
+             *
+             * @param {Object}
+             *            item1
+             * @param {Object}
+             *            item2
+             */
+                       this.swapItems = function(item1, item2) {
+                               this.grid[item1.row][item1.col] = item2;
+                               this.grid[item2.row][item2.col] = item1;
+
+                               var item1Row = item1.row;
+                               var item1Col = item1.col;
+                               item1.row = item2.row;
+                               item1.col = item2.col;
+                               item2.row = item1Row;
+                               item2.col = item1Col;
+                       };
+
+                       /**
+             * Prevents items from being overlapped
+             *
+             * @param {Object}
+             *            item The item that should remain
+             * @param {Array}
+             *            ignoreItems
+             */
+                       this.moveOverlappingItems = function(item, ignoreItems) {
+                               // don't move item, so ignore it
+                               if (!ignoreItems) {
+                                       ignoreItems = [item];
+                               } else if (ignoreItems.indexOf(item) === -1) {
+                                       ignoreItems = ignoreItems.slice(0);
+                                       ignoreItems.push(item);
+                               }
+
+                               // get the items in the space occupied by the item's coordinates
+                               var overlappingItems = this.getItems(
+                                       item.row,
+                                       item.col,
+                                       item.sizeX,
+                                       item.sizeY,
+                                       ignoreItems
+                               );
+                               this.moveItemsDown(overlappingItems, item.row + item.sizeY, ignoreItems);
+                       };
+
+                       /**
+             * Moves an array of items to a specified row
+             *
+             * @param {Array}
+             *            items The items to move
+             * @param {Number}
+             *            newRow The target row
+             * @param {Array}
+             *            ignoreItems
+             */
+                       this.moveItemsDown = function(items, newRow, ignoreItems) {
+                               if (!items || items.length === 0) {
+                                       return;
+                               }
+                               items.sort(function(a, b) {
+                                       return a.row - b.row;
+                               });
+
+                               ignoreItems = ignoreItems ? ignoreItems.slice(0) : [];
+                               var topRows = {},
+                                       item, i, l;
+
+                               // calculate the top rows in each column
+                               for (i = 0, l = items.length; i < l; ++i) {
+                                       item = items[i];
+                                       var topRow = topRows[item.col];
+                                       if (typeof topRow === 'undefined' || item.row < topRow) {
+                                               topRows[item.col] = item.row;
+                                       }
+                               }
+
+                               // move each item down from the top row in its column to the row
+                               for (i = 0, l = items.length; i < l; ++i) {
+                                       item = items[i];
+                                       var rowsToMove = newRow - topRows[item.col];
+                                       this.moveItemDown(item, item.row + rowsToMove, ignoreItems);
+                                       ignoreItems.push(item);
+                               }
+                       };
+
+                       /**
+             * Moves an item down to a specified row
+             *
+             * @param {Object}
+             *            item The item to move
+             * @param {Number}
+             *            newRow The target row
+             * @param {Array}
+             *            ignoreItems
+             */
+                       this.moveItemDown = function(item, newRow, ignoreItems) {
+                               if (item.row >= newRow) {
+                                       return;
+                               }
+                               while (item.row < newRow) {
+                                       ++item.row;
+                                       this.moveOverlappingItems(item, ignoreItems);
+                               }
+                               this.putItem(item, item.row, item.col, ignoreItems);
+                       };
+
+                       /**
+             * Moves all items up as much as possible
+             */
+                       this.floatItemsUp = function() {
+                               if (this.floating === false) {
+                                       return;
+                               }
+                               for (var rowIndex = 0, l = this.grid.length; rowIndex < l; ++rowIndex) {
+                                       var columns = this.grid[rowIndex];
+                                       if (!columns) {
+                                               continue;
+                                       }
+                                       for (var colIndex = 0, len = columns.length; colIndex < len; ++colIndex) {
+                                               var item = columns[colIndex];
+                                               if (item) {
+                                                       this.floatItemUp(item);
+                                               }
+                                       }
+                               }
+                       };
+
+                       /**
+             * Float an item up to the most suitable row
+             *
+             * @param {Object}
+             *            item The item to move
+             */
+                       this.floatItemUp = function(item) {
+                               if (this.floating === false) {
+                                       return;
+                               }
+                               var colIndex = item.col,
+                                       sizeY = item.sizeY,
+                                       sizeX = item.sizeX,
+                                       bestRow = null,
+                                       bestColumn = null,
+                                       rowIndex = item.row - 1;
+
+                               while (rowIndex > -1) {
+                                       var items = this.getItems(rowIndex, colIndex, sizeX, sizeY, item);
+                                       if (items.length !== 0) {
+                                               break;
+                                       }
+                                       bestRow = rowIndex;
+                                       bestColumn = colIndex;
+                                       --rowIndex;
+                               }
+                               if (bestRow !== null) {
+                                       this.putItem(item, bestRow, bestColumn);
+                               }
+                       };
+
+                       /**
+             * Update gridsters height
+             *
+             * @param {Number}
+             *            plus (Optional) Additional height to add
+             */
+                       this.updateHeight = function(plus) {
+                               var maxHeight = this.minRows;
+                               plus = plus || 0;
+                               for (var rowIndex = this.grid.length; rowIndex >= 0; --rowIndex) {
+                                       var columns = this.grid[rowIndex];
+                                       if (!columns) {
+                                               continue;
+                                       }
+                                       for (var colIndex = 0, len = columns.length; colIndex < len; ++colIndex) {
+                                               if (columns[colIndex]) {
+                                                       maxHeight = Math.max(maxHeight, rowIndex + plus + columns[colIndex].sizeY);
+                                               }
+                                       }
+                               }
+                               this.gridHeight = this.maxRows - maxHeight > 0 ? Math.min(this.maxRows, maxHeight) : Math.max(this.maxRows, maxHeight);
+                       };
+
+                       /**
+             * Returns the number of rows that will fit in given amount of
+             * pixels
+             *
+             * @param {Number}
+             *            pixels
+             * @param {Boolean}
+             *            ceilOrFloor (Optional) Determines rounding method
+             */
+                       this.pixelsToRows = function(pixels, ceilOrFloor) {
+                               if (ceilOrFloor === true) {
+                                       return Math.ceil(pixels / this.curRowHeight);
+                               } else if (ceilOrFloor === false) {
+                                       return Math.floor(pixels / this.curRowHeight);
+                               }
+
+                               return Math.round(pixels / this.curRowHeight);
+                       };
+
+                       /**
+             * Returns the number of columns that will fit in a given amount of
+             * pixels
+             *
+             * @param {Number}
+             *            pixels
+             * @param {Boolean}
+             *            ceilOrFloor (Optional) Determines rounding method
+             * @returns {Number} The number of columns
+             */
+                       this.pixelsToColumns = function(pixels, ceilOrFloor) {
+                               if (ceilOrFloor === true) {
+                                       return Math.ceil(pixels / this.curColWidth);
+                               } else if (ceilOrFloor === false) {
+                                       return Math.floor(pixels / this.curColWidth);
+                               }
+
+                               return Math.round(pixels / this.curColWidth);
+                       };
+               }
+       ])
+
+       .directive('gridsterPreview', function() {
+               return {
+                       replace: true,
+                       scope: true,
+                       require: '^gridster',
+                       template: '<div ng-style="previewStyle()" class="gridster-item gridster-preview-holder"></div>',
+                       link: function(scope, $el, attrs, gridster) {
+
+                               /**
+                 * @returns {Object} style object for preview element
+                 */
+                               scope.previewStyle = function() {
+
+                                       if (!gridster.movingItem) {
+                                               return {
+                                                       display: 'none'
+                                               };
+                                       }
+
+                                       return {
+                                               display: 'block',
+                                               height: (gridster.movingItem.sizeY * gridster.curRowHeight - gridster.margins[0]) + 'px',
+                                               width: (gridster.movingItem.sizeX * gridster.curColWidth - gridster.margins[1]) + 'px',
+                                               top: (gridster.movingItem.row * gridster.curRowHeight + (gridster.outerMargin ? gridster.margins[0] : 0)) + 'px',
+                                               left: (gridster.movingItem.col * gridster.curColWidth + (gridster.outerMargin ? gridster.margins[1] : 0)) + 'px'
+                                       };
+                               };
+                       }
+               };
+       })
+
+       /**
+     * The gridster directive
+     *
+     * @param {Function}
+     *            $timeout
+     * @param {Object}
+     *            $window
+     * @param {Object}
+     *            $rootScope
+     * @param {Function}
+     *            gridsterDebounce
+     */
+       .directive('gridster', ['$timeout', '$window', '$rootScope', 'gridsterDebounce',
+               function($timeout, $window, $rootScope, gridsterDebounce) {
+                       return {
+                               scope: true,
+                               restrict: 'EAC',
+                               controller: 'GridsterCtrl',
+                               controllerAs: 'gridster',
+                               compile: function($tplElem) {
+
+                                        $tplElem.prepend('<div ng-if="gridster.movingItem" gridster-preview></div>');
+
+                                        return function(scope, $elem, attrs, gridster) {
+                                               gridster.loaded = false;
+
+                                               gridster.$element = $elem;
+
+                                               scope.gridster = gridster;
+
+                                               $elem.addClass('gridster');
+
+                                               var isVisible = function(ele) {
+                                                       return ele.style.visibility !== 'hidden' && ele.style.display !== 'none';
+                                               };
+
+                                               function refresh(config) {
+                                                       gridster.setOptions(config);
+
+                                                       if (!isVisible($elem[0])) {
+                                                               return;
+                                                       }
+
+                                                       // resolve "auto" & "match" values
+                                                       if (gridster.width === 'auto') {
+                                                               gridster.curWidth = $elem[0].offsetWidth || parseInt($elem.css('width'), 10);
+                                                       } else {
+                                                               gridster.curWidth = gridster.width;
+                                                       }
+
+                                                       if (gridster.colWidth === 'auto') {
+                                                               gridster.curColWidth = (gridster.curWidth + (gridster.outerMargin ? -gridster.margins[1] : gridster.margins[1])) / gridster.columns;
+                                                       } else {
+                                                               gridster.curColWidth = gridster.colWidth;
+                                                       }
+
+                                                       gridster.curRowHeight = gridster.rowHeight;
+                                                       if (typeof gridster.rowHeight === 'string') {
+                                                               if (gridster.rowHeight === 'match') {
+                                                                       gridster.curRowHeight = Math.round(gridster.curColWidth);
+                                                               } else if (gridster.rowHeight.indexOf('*') !== -1) {
+                                                                       gridster.curRowHeight = Math.round(gridster.curColWidth * gridster.rowHeight.replace('*', '').replace(' ', ''));
+                                                               } else if (gridster.rowHeight.indexOf('/') !== -1) {
+                                                                       gridster.curRowHeight = Math.round(gridster.curColWidth / gridster.rowHeight.replace('/', '').replace(' ', ''));
+                                                               }
+                                                       }
+
+                                                       gridster.isMobile = gridster.mobileModeEnabled && gridster.curWidth <= gridster.mobileBreakPoint;
+
+                                                       // loop through all items and reset their CSS
+                                                       for (var rowIndex = 0, l = gridster.grid.length; rowIndex < l; ++rowIndex) {
+                                                               var columns = gridster.grid[rowIndex];
+                                                               if (!columns) {
+                                                                       continue;
+                                                               }
+
+                                                               for (var colIndex = 0, len = columns.length; colIndex < len; ++colIndex) {
+                                                                       if (columns[colIndex]) {
+                                                                               var item = columns[colIndex];
+                                                                               item.setElementPosition();
+                                                                               item.setElementSizeY();
+                                                                               item.setElementSizeX();
+                                                                       }
+                                                               }
+                                                       }
+
+                                                       updateHeight();
+                                               }
+
+                                               var optionsKey = attrs.gridster;
+                                               if (optionsKey) {
+                                                       scope.$parent.$watch(optionsKey, function(newConfig) {
+                                                               refresh(newConfig);
+                                                       }, true);
+                                               } else {
+                                                       refresh({});
+                                               }
+
+                                               scope.$watch(function() {
+                                                       return gridster.loaded;
+                                               }, function() {
+                                                       if (gridster.loaded) {
+                                                               $elem.addClass('gridster-loaded');
+                                                       } else {
+                                                               $elem.removeClass('gridster-loaded');
+                                                       }
+                                               });
+
+                                               scope.$watch(function() {
+                                                       return gridster.isMobile;
+                                               }, function() {
+                                                       if (gridster.isMobile) {
+                                                               $elem.addClass('gridster-mobile').removeClass('gridster-desktop');
+                                                       } else {
+                                                               $elem.removeClass('gridster-mobile').addClass('gridster-desktop');
+                                                       }
+                                                       $rootScope.$broadcast('gridster-mobile-changed', gridster);
+                                               });
+
+                                               scope.$watch(function() {
+                                                       return gridster.draggable;
+                                               }, function() {
+                                                       $rootScope.$broadcast('gridster-draggable-changed', gridster);
+                                               }, true);
+
+                                               scope.$watch(function() {
+                                                       return gridster.resizable;
+                                               }, function() {
+                                                       $rootScope.$broadcast('gridster-resizable-changed', gridster);
+                                               }, true);
+
+                                               function updateHeight() {
+                                                    if(gridster.gridHeight){ // need
+                                                                                // to
+                                                                                // put
+                                                                                // this
+                                                                                // check,
+                                                                                // otherwise
+                                                                                // fail
+                                                                                // in
+                                                                                // IE8
+                                                       $elem.css('height', (gridster.gridHeight * gridster.curRowHeight) + (gridster.outerMargin ? gridster.margins[0] : -gridster.margins[0]) + 'px');
+                                                    }
+                                               }
+
+                                               scope.$watch(function() {
+                                                       return gridster.gridHeight;
+                                               }, updateHeight);
+
+                                               scope.$watch(function() {
+                                                       return gridster.movingItem;
+                                               }, function() {
+                                                       gridster.updateHeight(gridster.movingItem ? gridster.movingItem.sizeY : 0);
+                                               });
+
+                                               var prevWidth = $elem[0].offsetWidth || parseInt($elem.css('width'), 10);
+
+                                               var resize = function() {
+                                                       var width = $elem[0].offsetWidth || parseInt($elem.css('width'), 10);
+
+                                                       if (!width || width === prevWidth || gridster.movingItem) {
+                                                               return;
+                                                       }
+                                                       prevWidth = width;
+
+                                                       if (gridster.loaded) {
+                                                               $elem.removeClass('gridster-loaded');
+                                                       }
+
+                                                       refresh();
+
+                                                       if (gridster.loaded) {
+                                                               $elem.addClass('gridster-loaded');
+                                                       }
+
+                                                       $rootScope.$broadcast('gridster-resized', [width, $elem[0].offsetHeight], gridster);
+                                               };
+
+                                               // track element width changes any way we can
+                                               var onResize = gridsterDebounce(function onResize() {
+                                                       resize();
+                                                       $timeout(function() {
+                                                               scope.$apply();
+                                                       });
+                                               }, 100);
+
+                                               scope.$watch(function() {
+                                                       return isVisible($elem[0]);
+                                               }, onResize);
+
+                                               // see
+                        // https://github.com/sdecima/javascript-detect-element-resize
+                                               if (typeof window.addResizeListener === 'function') {
+                                                       window.addResizeListener($elem[0], onResize);
+                                               } else {
+                                                       scope.$watch(function() {
+                                                               return $elem[0].offsetWidth || parseInt($elem.css('width'), 10);
+                                                       }, resize);
+                                               }
+                                               var $win = angular.element($window);
+                                               $win.on('resize', onResize);
+
+                                               // be sure to cleanup
+                                               scope.$on('$destroy', function() {
+                                                       gridster.destroy();
+                                                       $win.off('resize', onResize);
+                                                       if (typeof window.removeResizeListener === 'function') {
+                                                               window.removeResizeListener($elem[0], onResize);
+                                                       }
+                                               });
+
+                                               // allow a little time to place items before floating up
+                                               $timeout(function() {
+                                                       scope.$watch('gridster.floating', function() {
+                                                               gridster.floatItemsUp();
+                                                       });
+                                                       gridster.loaded = true;
+                                               }, 100);
+                                       };
+                               }
+                       };
+               }
+       ])
+
+       .controller('GridsterItemCtrl', function() {
+               this.$element = null;
+               this.gridster = null;
+               this.row = null;
+               this.col = null;
+               this.sizeX = null;
+               this.sizeY = null;
+               this.minSizeX = 0;
+               this.minSizeY = 0;
+               this.maxSizeX = null;
+               this.maxSizeY = null;
+
+               this.init = function($element, gridster) {
+                       this.$element = $element;
+                       this.gridster = gridster;
+                       this.sizeX = gridster.defaultSizeX;
+                       this.sizeY = gridster.defaultSizeY;
+               };
+
+               this.destroy = function() {
+                       // set these to null to avoid the possibility of circular references
+                       this.gridster = null;
+                       this.$element = null;
+               };
+
+               /**
+         * Returns the items most important attributes
+         */
+               this.toJSON = function() {
+                       return {
+                               row: this.row,
+                               col: this.col,
+                               sizeY: this.sizeY,
+                               sizeX: this.sizeX
+                       };
+               };
+
+               this.isMoving = function() {
+                       return this.gridster.movingItem === this;
+               };
+
+               /**
+         * Set the items position
+         *
+         * @param {Number}
+         *            row
+         * @param {Number}
+         *            column
+         */
+               this.setPosition = function(row, column) {
+                       this.gridster.putItem(this, row, column);
+
+                       if (!this.isMoving()) {
+                               this.setElementPosition();
+                       }
+               };
+
+               /**
+         * Sets a specified size property
+         *
+         * @param {String}
+         *            key Can be either "x" or "y"
+         * @param {Number}
+         *            value The size amount
+         * @param {Boolean}
+         *            preventMove
+         */
+               this.setSize = function(key, value, preventMove) {
+                       key = key.toUpperCase();
+                       var camelCase = 'size' + key,
+                               titleCase = 'Size' + key;
+                       if (value === '') {
+                               return;
+                       }
+                       value = parseInt(value, 10);
+                       if (isNaN(value) || value === 0) {
+                               value = this.gridster['default' + titleCase];
+                       }
+                       var max = key === 'X' ? this.gridster.columns : this.gridster.maxRows;
+                       if (this['max' + titleCase]) {
+                               max = Math.min(this['max' + titleCase], max);
+                       }
+                       if (this.gridster['max' + titleCase]) {
+                               max = Math.min(this.gridster['max' + titleCase], max);
+                       }
+                       if (key === 'X' && this.cols) {
+                               max -= this.cols;
+                       } else if (key === 'Y' && this.rows) {
+                               max -= this.rows;
+                       }
+
+                       var min = 0;
+                       if (this['min' + titleCase]) {
+                               min = Math.max(this['min' + titleCase], min);
+                       }
+                       if (this.gridster['min' + titleCase]) {
+                               min = Math.max(this.gridster['min' + titleCase], min);
+                       }
+
+                       value = Math.max(Math.min(value, max), min);
+
+                       var changed = (this[camelCase] !== value || (this['old' + titleCase] && this['old' + titleCase] !== value));
+                       this['old' + titleCase] = this[camelCase] = value;
+
+                       if (!this.isMoving()) {
+                               this['setElement' + titleCase]();
+                       }
+                       if (!preventMove && changed) {
+                               this.gridster.moveOverlappingItems(this);
+                               this.gridster.layoutChanged();
+                       }
+
+                       return changed;
+               };
+
+               /**
+         * Sets the items sizeY property
+         *
+         * @param {Number}
+         *            rows
+         * @param {Boolean}
+         *            preventMove
+         */
+               this.setSizeY = function(rows, preventMove) {
+                       return this.setSize('Y', rows, preventMove);
+               };
+
+               /**
+         * Sets the items sizeX property
+         *
+         * @param {Number}
+         *            columns
+         * @param {Boolean}
+         *            preventMove
+         */
+               this.setSizeX = function(columns, preventMove) {
+                       return this.setSize('X', columns, preventMove);
+               };
+
+               /**
+         * Sets an elements position on the page
+         */
+               this.setElementPosition = function() {
+                       if (this.gridster.isMobile) {
+                               this.$element.css({
+                                       marginLeft: this.gridster.margins[0] + 'px',
+                                       marginRight: this.gridster.margins[0] + 'px',
+                                       marginTop: this.gridster.margins[1] + 'px',
+                                       marginBottom: this.gridster.margins[1] + 'px',
+                                       top: '',
+                                       left: ''
+                               });
+                       } else {
+                               this.$element.css({
+                                       margin: 0,
+                                       top: (this.row * this.gridster.curRowHeight + (this.gridster.outerMargin ? this.gridster.margins[0] : 0)) + 'px',
+                                       left: (this.col * this.gridster.curColWidth + (this.gridster.outerMargin ? this.gridster.margins[1] : 0)) + 'px'
+                               });
+                       }
+               };
+
+               /**
+         * Sets an elements height
+         */
+               this.setElementSizeY = function() {
+                       if (this.gridster.isMobile && !this.gridster.saveGridItemCalculatedHeightInMobile) {
+                               this.$element.css('height', '');
+                       } else {
+                               var computedHeight = (this.sizeY * this.gridster.curRowHeight - this.gridster.margins[0]) + 'px';
+                               // this.$element.css('height', computedHeight);
+                this.$element.attr('style', this.$element.attr('style') + '; ' + 'height: '+computedHeight+' !important;');
+                       }
+               };
+
+               /**
+         * Sets an elements width
+         */
+               this.setElementSizeX = function() {
+                       if (this.gridster.isMobile) {
+                               this.$element.css('width', '');
+                       } else {
+                               this.$element.css('width', (this.sizeX * this.gridster.curColWidth - this.gridster.margins[1]) + 'px');
+                       }
+               };
+
+               /**
+         * Gets an element's width
+         */
+               this.getElementSizeX = function() {
+                       return (this.sizeX * this.gridster.curColWidth - this.gridster.margins[1]);
+               };
+
+               /**
+         * Gets an element's height
+         */
+               this.getElementSizeY = function() {
+                       return (this.sizeY * this.gridster.curRowHeight - this.gridster.margins[0]);
+               };
+
+       })
+
+       .factory('GridsterTouch', [function() {
+               return function GridsterTouch(target, startEvent, moveEvent, endEvent) {
+                       var lastXYById = {};
+
+                       // Opera doesn't have Object.keys so we use this wrapper
+                       var numberOfKeys = function(theObject) {
+                               if (Object.keys) {
+                                       return Object.keys(theObject).length;
+                               }
+
+                               var n = 0,
+                                       key;
+                               for (key in theObject) {
+                                       ++n;
+                               }
+
+                               return n;
+                       };
+
+                       // this calculates the delta needed to convert pageX/Y to offsetX/Y
+            // because offsetX/Y don't exist in the TouchEvent object or in
+            // Firefox's MouseEvent object
+                       var computeDocumentToElementDelta = function(theElement) {
+                               var elementLeft = 0;
+                               var elementTop = 0;
+                               var oldIEUserAgent = navigator.userAgent.match(/\bMSIE\b/);
+
+                               for (var offsetElement = theElement; offsetElement != null; offsetElement = offsetElement.offsetParent) {
+                                       // the following is a major hack for versions of IE less
+                    // than 8 to avoid an apparent problem on the IEBlog with
+                    // double-counting the offsets
+                                       // this may not be a general solution to IE7's problem with
+                    // offsetLeft/offsetParent
+                                       if (oldIEUserAgent &&
+                                               (!document.documentMode || document.documentMode < 8) &&
+                                               offsetElement.currentStyle.position === 'relative' && offsetElement.offsetParent && offsetElement.offsetParent.currentStyle.position === 'relative' && offsetElement.offsetLeft === offsetElement.offsetParent.offsetLeft) {
+                                               // add only the top
+                                               elementTop += offsetElement.offsetTop;
+                                       } else {
+                                               elementLeft += offsetElement.offsetLeft;
+                                               elementTop += offsetElement.offsetTop;
+                                       }
+                               }
+
+                               return {
+                                       x: elementLeft,
+                                       y: elementTop
+                               };
+                       };
+
+                       // cache the delta from the document to our event target
+            // (reinitialized each mousedown/MSPointerDown/touchstart)
+                       var documentToTargetDelta = computeDocumentToElementDelta(target);
+
+                       // common event handler for the mouse/pointer/touch models and their
+            // down/start, move, up/end, and cancel events
+                       var doEvent = function(theEvtObj) {
+
+                               if (theEvtObj.type === 'mousemove' && numberOfKeys(lastXYById) === 0) {
+                                       return;
+                               }
+
+                               var prevent = true;
+
+                               var pointerList = theEvtObj.changedTouches ? theEvtObj.changedTouches : [theEvtObj];
+
+                               for (var i = 0; i < pointerList.length; ++i) {
+                                       var pointerObj = pointerList[i];
+                                       var pointerId = (typeof pointerObj.identifier !== 'undefined') ? pointerObj.identifier : (typeof pointerObj.pointerId !== 'undefined') ? pointerObj.pointerId : 1;
+
+                                        // use the pageX/Y coordinates to
+                                        // compute target-relative coordinates
+                                        // when we have them (in ie < 9, we need
+                                        // to do a little work to put them
+                                        // there)
+                                       if (typeof pointerObj.pageX === 'undefined') {
+
+                                                // initialize assuming our
+                                                // source element is our target
+                                               if(!ie8){
+                                                    pointerObj.pageX = pointerObj.offsetX + documentToTargetDelta.x;
+                                                    pointerObj.pageY = pointerObj.offsetY + documentToTargetDelta.y;
+                                                }
+                                                else{
+                                                    pointerObj.pageX = pointerObj.clientX;
+                                                    pointerObj.pageY = pointerObj.clientY;
+                                                }
+
+                                               if (pointerObj.srcElement.offsetParent === target && document.documentMode && document.documentMode === 8 && pointerObj.type === 'mousedown') {
+                                                       // source element is a child piece of VML, we're in
+                            // IE8, and we've not called setCapture yet - add
+                            // the origin of the source element
+                                                       pointerObj.pageX += pointerObj.srcElement.offsetLeft;
+                                                       pointerObj.pageY += pointerObj.srcElement.offsetTop;
+                                               } else if (pointerObj.srcElement !== target && !document.documentMode || document.documentMode < 8) {
+                                                       // source element isn't the target (most likely it's
+                            // a child piece of VML) and we're in a version of
+                            // IE before IE8 -
+                                                       // the offsetX/Y values are unpredictable so use the
+                            // clientX/Y values and adjust by the scroll offsets
+                            // of its parents
+                                                       // to get the document-relative coordinates (the
+                            // same as pageX/Y)
+                                                       var sx = -2,
+                                                               sy = -2; // adjust for old IE's 2-pixel
+                                            // border
+                                                       for (var scrollElement = pointerObj.srcElement; scrollElement !== null; scrollElement = scrollElement.parentNode) {
+                                                               sx += scrollElement.scrollLeft ? scrollElement.scrollLeft : 0;
+                                                               sy += scrollElement.scrollTop ? scrollElement.scrollTop : 0;
+                                                       }
+
+                                                       pointerObj.pageX = pointerObj.clientX + sx;
+                                                       pointerObj.pageY = pointerObj.clientY + sy;
+                                               }
+                                       }
+
+
+                                       var pageX = pointerObj.pageX;
+                                       var pageY = pointerObj.pageY;
+
+                                       if (theEvtObj.type.match(/(start|down)$/i)) {
+                                               // clause for processing MSPointerDown, touchstart, and
+                        // mousedown
+
+                                               // refresh the document-to-target delta on start in case
+                        // the target has moved relative to document
+                                               documentToTargetDelta = computeDocumentToElementDelta(target);
+
+                                               // protect against failing to get an up or end on this
+                        // pointerId
+                                               if (lastXYById[pointerId]) {
+                                                       if (endEvent) {
+                                                               endEvent({
+                                                                       target: theEvtObj.target,
+                                                                       which: theEvtObj.which,
+                                                                       pointerId: pointerId,
+                                                                       pageX: pageX,
+                                                                       pageY: pageY
+                                                               });
+                                                       }
+
+                                                       delete lastXYById[pointerId];
+                                               }
+
+                                               if (startEvent) {
+                                                       if (prevent) {
+                                                               prevent = startEvent({
+                                                                       target: theEvtObj.target,
+                                                                       which: theEvtObj.which,
+                                                                       pointerId: pointerId,
+                                                                       pageX: pageX,
+                                                                       pageY: pageY
+                                                               });
+                                                       }
+                                               }
+
+                                               // init last page positions for this pointer
+                                               lastXYById[pointerId] = {
+                                                       x: pageX,
+                                                       y: pageY
+                                               };
+
+                                               // IE pointer model
+                                               if (target.msSetPointerCapture) {
+                                                       target.msSetPointerCapture(pointerId);
+                                               } else if (theEvtObj.type === 'mousedown' && numberOfKeys(lastXYById) === 1) {
+                                                       if (useSetReleaseCapture) {
+                                                               target.setCapture(true);
+                                                       } else {
+                                                               document.addEventListener('mousemove', doEvent, false);
+                                                               document.addEventListener('mouseup', doEvent, false);
+                                                       }
+                                               }
+                                       } else if (theEvtObj.type.match(/move$/i)) {
+                                               // clause handles mousemove, MSPointerMove, and
+                        // touchmove
+
+                                               if (lastXYById[pointerId] && !(lastXYById[pointerId].x === pageX && lastXYById[pointerId].y === pageY)) {
+                                                       // only extend if the pointer is down and it's not
+                            // the same as the last point
+
+                                                       if (moveEvent && prevent) {
+                                                               prevent = moveEvent({
+                                                                       target: theEvtObj.target,
+                                                                       which: theEvtObj.which,
+                                                                       pointerId: pointerId,
+                                                                       pageX: pageX,
+                                                                       pageY: pageY
+                                                               });
+                                                       }
+
+                                                       // update last page positions for this pointer
+                                                       lastXYById[pointerId].x = pageX;
+                                                       lastXYById[pointerId].y = pageY;
+                                               }
+                                       } else if (lastXYById[pointerId] && theEvtObj.type.match(/(up|end|cancel)$/i)) {
+                                               // clause handles up/end/cancel
+
+                                               if (endEvent && prevent) {
+                                                       prevent = endEvent({
+                                                               target: theEvtObj.target,
+                                                               which: theEvtObj.which,
+                                                               pointerId: pointerId,
+                                                               pageX: pageX,
+                                                               pageY: pageY
+                                                       });
+                                               }
+
+                                               // delete last page positions for this pointer
+                                               delete lastXYById[pointerId];
+
+                                               // in the Microsoft pointer model, release the capture
+                        // for this pointer
+                                               // in the mouse model, release the capture or remove
+                        // document-level event handlers if there are no down
+                        // points
+                                               // nothing is required for the iOS touch model because
+                        // capture is implied on touchstart
+                                               if (target.msReleasePointerCapture) {
+                                                       target.msReleasePointerCapture(pointerId);
+                                               } else if (theEvtObj.type === 'mouseup' && numberOfKeys(lastXYById) === 0) {
+                                                       if (useSetReleaseCapture) {
+                                                               target.releaseCapture();
+                                                       } else {
+                                                               document.removeEventListener('mousemove', doEvent, false);
+                                                               document.removeEventListener('mouseup', doEvent, false);
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if (prevent) {
+                                       if (theEvtObj.preventDefault) {
+                                               theEvtObj.preventDefault();
+                                       }
+
+                                       if (theEvtObj.preventManipulation) {
+                                               theEvtObj.preventManipulation();
+                                       }
+
+                                       if (theEvtObj.preventMouseEvent) {
+                                               theEvtObj.preventMouseEvent();
+                                       }
+                               }
+                       };
+
+                       var useSetReleaseCapture = false;
+                       // saving the settings for contentZooming and touchaction before
+            // activation
+                       var contentZooming, msTouchAction;
+
+                       this.enable = function() {
+
+                               if (window.navigator.msPointerEnabled) {
+                                       // Microsoft pointer model
+                                       target.addEventListener('MSPointerDown', doEvent, false);
+                                       target.addEventListener('MSPointerMove', doEvent, false);
+                                       target.addEventListener('MSPointerUp', doEvent, false);
+                                       target.addEventListener('MSPointerCancel', doEvent, false);
+
+                                       // css way to prevent panning in our target area
+                                       if (typeof target.style.msContentZooming !== 'undefined') {
+                                               contentZooming = target.style.msContentZooming;
+                                               target.style.msContentZooming = 'none';
+                                       }
+
+                                       // new in Windows Consumer Preview: css way to prevent all
+                    // built-in touch actions on our target
+                                       // without this, you cannot touch draw on the element
+                    // because IE will intercept the touch events
+                                       if (typeof target.style.msTouchAction !== 'undefined') {
+                                               msTouchAction = target.style.msTouchAction;
+                                               target.style.msTouchAction = 'none';
+                                       }
+                               } else if (target.addEventListener) {
+                                       // iOS touch model
+                                       target.addEventListener('touchstart', doEvent, false);
+                                       target.addEventListener('touchmove', doEvent, false);
+                                       target.addEventListener('touchend', doEvent, false);
+                                       target.addEventListener('touchcancel', doEvent, false);
+
+                                       // mouse model
+                                       target.addEventListener('mousedown', doEvent, false);
+
+                                       // mouse model with capture
+                                       // rejecting gecko because, unlike ie, firefox does not send
+                    // events to target when the mouse is outside target
+                                       if (target.setCapture && !window.navigator.userAgent.match(/\bGecko\b/)) {
+                                               useSetReleaseCapture = true;
+
+                                               target.addEventListener('mousemove', doEvent, false);
+                                               target.addEventListener('mouseup', doEvent, false);
+                                       }
+                               } else if (target.attachEvent && target.setCapture) {
+                                       // legacy IE mode - mouse with capture
+                                       useSetReleaseCapture = true;
+                                       target.attachEvent('onmousedown', function() {
+                                               doEvent(window.event);
+                                               window.event.returnValue = false;
+                                               return false;
+                                       });
+                                       target.attachEvent('onmousemove', function() {
+                                               doEvent(window.event);
+                                               window.event.returnValue = false;
+                                               return false;
+                                       });
+                                       target.attachEvent('onmouseup', function() {
+                                               doEvent(window.event);
+                                               window.event.returnValue = false;
+                                               return false;
+                                       });
+                               }
+                       };
+
+                       this.disable = function() {
+                               if (window.navigator.msPointerEnabled) {
+                                       // Microsoft pointer model
+                                       target.removeEventListener('MSPointerDown', doEvent, false);
+                                       target.removeEventListener('MSPointerMove', doEvent, false);
+                                       target.removeEventListener('MSPointerUp', doEvent, false);
+                                       target.removeEventListener('MSPointerCancel', doEvent, false);
+
+                                       // reset zooming to saved value
+                                       if (contentZooming) {
+                                               target.style.msContentZooming = contentZooming;
+                                       }
+
+                                       // reset touch action setting
+                                       if (msTouchAction) {
+                                               target.style.msTouchAction = msTouchAction;
+                                       }
+                               } else if (target.removeEventListener) {
+                                       // iOS touch model
+                                       target.removeEventListener('touchstart', doEvent, false);
+                                       target.removeEventListener('touchmove', doEvent, false);
+                                       target.removeEventListener('touchend', doEvent, false);
+                                       target.removeEventListener('touchcancel', doEvent, false);
+
+                                       // mouse model
+                                       target.removeEventListener('mousedown', doEvent, false);
+
+                                       // mouse model with capture
+                                       // rejecting gecko because, unlike ie, firefox does not send
+                    // events to target when the mouse is outside target
+                                       if (target.setCapture && !window.navigator.userAgent.match(/\bGecko\b/)) {
+                                               useSetReleaseCapture = true;
+
+                                               target.removeEventListener('mousemove', doEvent, false);
+                                               target.removeEventListener('mouseup', doEvent, false);
+                                       }
+                               } else if (target.detachEvent && target.setCapture) {
+                                       // legacy IE mode - mouse with capture
+                                       useSetReleaseCapture = true;
+                                       target.detachEvent('onmousedown');
+                                       target.detachEvent('onmousemove');
+                                       target.detachEvent('onmouseup');
+                               }
+                       };
+
+                       return this;
+               };
+       }])
+
+       .factory('GridsterDraggable', ['$document', '$timeout', '$window', 'GridsterTouch',
+               function($document, $timeout, $window, GridsterTouch) {
+                       function GridsterDraggable($el, scope, gridster, item, itemOptions) {
+
+                               var elmX, elmY, elmW, elmH,
+
+                                       mouseX = 0,
+                                       mouseY = 0,
+                                       lastMouseX = 0,
+                                       lastMouseY = 0,
+                                       mOffX = 0,
+                                       mOffY = 0,
+
+                                       minTop = 0,
+                                       maxTop = 9999,
+                                       minLeft = 0,
+                                       realdocument = $document[0];
+
+                               var originalCol, originalRow;
+                               var inputTags = ['select', 'input', 'textarea', 'button'];
+
+                                var gridsterItemDragElement = $el[0].querySelector('[gridster-item-drag]');
+                                // console.log(gridsterItemDragElement);
+                                var isDraggableAreaDefined = gridsterItemDragElement?true:false;
+                               // console.log(isDraggableAreaDefined);
+
+                               function mouseDown(e) {
+
+                                    if(ie8){
+                                        e.target = window.event.srcElement;
+                                        e.which = window.event.button;
+                                    }
+
+                                    if(isDraggableAreaDefined && (!gridsterItemDragElement.contains(e.target))){
+                                        return false;
+                                    }
+
+                                        if (inputTags.indexOf(e.target.nodeName.toLowerCase()) !== -1) {
+                                            return false;
+                                        }
+
+                                       var $target = angular.element(e.target);
+
+                                       // exit, if a resize handle was hit
+                                       if ($target.hasClass('gridster-item-resizable-handler')) {
+                                               return false;
+                                       }
+
+                                       // exit, if the target has it's own click event
+                                       if ($target.attr('onclick') || $target.attr('ng-click')) {
+                                               return false;
+                                       }
+
+                                       // only works if you have jQuery
+                                       if ($target.closest && $target.closest('.gridster-no-drag').length) {
+                                               return false;
+                                       }
+
+                                       switch (e.which) {
+                                               case 1:
+                                                       // left mouse button
+                                                       break;
+                                               case 2:
+                                               case 3:
+                                                       // right or middle mouse button
+                                                       return;
+                                       }
+
+                                       lastMouseX = e.pageX;
+                                       lastMouseY = e.pageY;
+
+                                       elmX = parseInt($el.css('left'), 10);
+                                       elmY = parseInt($el.css('top'), 10);
+                                       elmW = $el[0].offsetWidth;
+                                       elmH = $el[0].offsetHeight;
+
+                                       originalCol = item.col;
+                                       originalRow = item.row;
+
+                                       dragStart(e);
+
+                                       return true;
+                               }
+
+                               function mouseMove(e) {
+                                       if (!$el.hasClass('gridster-item-moving') || $el.hasClass('gridster-item-resizing')) {
+                                               return false;
+                                       }
+
+                                       var maxLeft = gridster.curWidth - 1;
+
+                                       // Get the current mouse position.
+                                       mouseX = e.pageX;
+                                       mouseY = e.pageY;
+
+                                       // Get the deltas
+                                       var diffX = mouseX - lastMouseX + mOffX;
+                                       var diffY = mouseY - lastMouseY + mOffY;
+                                       mOffX = mOffY = 0;
+
+                                       // Update last processed mouse positions.
+                                       lastMouseX = mouseX;
+                                       lastMouseY = mouseY;
+
+                                       var dX = diffX,
+                                               dY = diffY;
+                                       if (elmX + dX < minLeft) {
+                                               diffX = minLeft - elmX;
+                                               mOffX = dX - diffX;
+                                       } else if (elmX + elmW + dX > maxLeft) {
+                                               diffX = maxLeft - elmX - elmW;
+                                               mOffX = dX - diffX;
+                                       }
+
+                                       if (elmY + dY < minTop) {
+                                               diffY = minTop - elmY;
+                                               mOffY = dY - diffY;
+                                       } else if (elmY + elmH + dY > maxTop) {
+                                               diffY = maxTop - elmY - elmH;
+                                               mOffY = dY - diffY;
+                                       }
+                                       elmX += diffX;
+                                       elmY += diffY;
+
+                                       // set new position
+                                       $el.css({
+                                               'top': elmY + 'px',
+                                               'left': elmX + 'px'
+                                       });
+
+                                       drag(e);
+
+                                       return true;
+                               }
+
+                               function mouseUp(e) {
+                                       if (!$el.hasClass('gridster-item-moving') || $el.hasClass('gridster-item-resizing')) {
+                                               return false;
+                                       }
+
+                                       mOffX = mOffY = 0;
+
+                                       dragStop(e);
+
+                                       return true;
+                               }
+
+                               function dragStart(event) {
+                                       $el.addClass('gridster-item-moving');
+                                       gridster.movingItem = item;
+
+                                       gridster.updateHeight(item.sizeY);
+                                       scope.$apply(function() {
+                                               if (gridster.draggable && gridster.draggable.start) {
+                                                       gridster.draggable.start(event, $el, itemOptions);
+                                               }
+                                       });
+                               }
+
+                               function drag(event) {
+                                       var oldRow = item.row,
+                                               oldCol = item.col,
+                                               hasCallback = gridster.draggable && gridster.draggable.drag,
+                                               scrollSensitivity = gridster.draggable.scrollSensitivity,
+                                               scrollSpeed = gridster.draggable.scrollSpeed;
+
+                                       var row = gridster.pixelsToRows(elmY);
+                                       var col = gridster.pixelsToColumns(elmX);
+
+                                       var itemsInTheWay = gridster.getItems(row, col, item.sizeX, item.sizeY, item);
+                                       var hasItemsInTheWay = itemsInTheWay.length !== 0;
+
+                                       if (gridster.swapping === true && hasItemsInTheWay) {
+                                               var boundingBoxItem = gridster.getBoundingBox(itemsInTheWay),
+                                                       sameSize = boundingBoxItem.sizeX === item.sizeX && boundingBoxItem.sizeY === item.sizeY,
+                                                       sameRow = boundingBoxItem.row === oldRow,
+                                                       sameCol = boundingBoxItem.col === oldCol,
+                                                       samePosition = boundingBoxItem.row === row && boundingBoxItem.col === col,
+                                                       inline = sameRow || sameCol;
+
+                                               if (sameSize && itemsInTheWay.length === 1) {
+                                                       if (samePosition) {
+                                                               gridster.swapItems(item, itemsInTheWay[0]);
+                                                       } else if (inline) {
+                                                               return;
+                                                       }
+                                               } else if (boundingBoxItem.sizeX <= item.sizeX && boundingBoxItem.sizeY <= item.sizeY && inline) {
+                                                       var emptyRow = item.row <= row ? item.row : row + item.sizeY,
+                                                               emptyCol = item.col <= col ? item.col : col + item.sizeX,
+                                                               rowOffset = emptyRow - boundingBoxItem.row,
+                                                               colOffset = emptyCol - boundingBoxItem.col;
+
+                                                       for (var i = 0, l = itemsInTheWay.length; i < l; ++i) {
+                                                               var itemInTheWay = itemsInTheWay[i];
+
+                                                               var itemsInFreeSpace = gridster.getItems(
+                                                                       itemInTheWay.row + rowOffset,
+                                                                       itemInTheWay.col + colOffset,
+                                                                       itemInTheWay.sizeX,
+                                                                       itemInTheWay.sizeY,
+                                                                       item
+                                                               );
+
+                                                               if (itemsInFreeSpace.length === 0) {
+                                                                       gridster.putItem(itemInTheWay, itemInTheWay.row + rowOffset, itemInTheWay.col + colOffset);
+                                                               }
+                                                       }
+                                               }
+                                       }
+
+                                       if (gridster.pushing !== false || !hasItemsInTheWay) {
+                                               item.row = row;
+                                               item.col = col;
+                                       }
+
+                                        if(($window.navigator.appName === 'Microsoft Internet Explorer' && !ie8) || $window.navigator.userAgent.indexOf("Firefox")!==-1){
+                                            if (event.pageY - realdocument.documentElement.scrollTop < scrollSensitivity) {
+                                                    realdocument.documentElement.scrollTop = realdocument.documentElement.scrollTop - scrollSpeed;
+                                            } else if ($window.innerHeight - (event.pageY - realdocument.documentElement.scrollTop) < scrollSensitivity) {
+                                                    realdocument.documentElement.scrollTop = realdocument.documentElement.scrollTop + scrollSpeed;
+                                            }
+                                        }
+                                        else{
+                                            if (event.pageY - realdocument.body.scrollTop < scrollSensitivity) {
+                                                    realdocument.body.scrollTop = realdocument.body.scrollTop - scrollSpeed;
+                                            } else if ($window.innerHeight - (event.pageY - realdocument.body.scrollTop) < scrollSensitivity) {
+                                                    realdocument.body.scrollTop = realdocument.body.scrollTop + scrollSpeed;
+                                            }
+                                        }
+
+
+
+                                       if (event.pageX - realdocument.body.scrollLeft < scrollSensitivity) {
+                                               realdocument.body.scrollLeft = realdocument.body.scrollLeft - scrollSpeed;
+                                       } else if ($window.innerWidth - (event.pageX - realdocument.body.scrollLeft) < scrollSensitivity) {
+                                               realdocument.body.scrollLeft = realdocument.body.scrollLeft + scrollSpeed;
+                                       }
+
+                                       if (hasCallback || oldRow !== item.row || oldCol !== item.col) {
+                                               scope.$apply(function() {
+                                                       if (hasCallback) {
+                                                               gridster.draggable.drag(event, $el, itemOptions);
+                                                       }
+                                               });
+                                       }
+                               }
+
+                               function dragStop(event) {
+                                       $el.removeClass('gridster-item-moving');
+                                       var row = gridster.pixelsToRows(elmY);
+                                       var col = gridster.pixelsToColumns(elmX);
+                                       if (gridster.pushing !== false || gridster.getItems(row, col, item.sizeX, item.sizeY, item).length === 0) {
+                                               item.row = row;
+                                               item.col = col;
+                                       }
+                                       gridster.movingItem = null;
+                                       item.setPosition(item.row, item.col);
+
+                                       scope.$apply(function() {
+                                               if (gridster.draggable && gridster.draggable.stop) {
+                                                       gridster.draggable.stop(event, $el, itemOptions);
+                                               }
+                                       });
+                               }
+
+                               var enabled = null;
+                               var $dragHandles = null;
+                               var unifiedInputs = [];
+
+                               this.enable = function() {
+                                       if (enabled === true) {
+                                               return;
+                                       }
+
+                                       // disable and timeout required for some template rendering
+                                       $timeout(function() {
+                                               // disable any existing draghandles
+                                               for (var u = 0, ul = unifiedInputs.length; u < ul; ++u) {
+                                                       unifiedInputs[u].disable();
+                                               }
+                                               unifiedInputs = [];
+
+                                               if (gridster.draggable && gridster.draggable.handle) {
+                                                       $dragHandles = angular.element($el[0].querySelectorAll(gridster.draggable.handle));
+                                                       if ($dragHandles.length === 0) {
+                                                               // fall back to element if handle not found...
+                                                               $dragHandles = $el;
+                                                       }
+                                               } else {
+                                                       $dragHandles = $el;
+                                               }
+
+                                               for (var h = 0, hl = $dragHandles.length; h < hl; ++h) {
+                                                       unifiedInputs[h] = new GridsterTouch($dragHandles[h], mouseDown, mouseMove, mouseUp);
+                                                       unifiedInputs[h].enable();
+                                               }
+
+                                               enabled = true;
+                                       });
+                               };
+
+                               this.disable = function() {
+                                       if (enabled === false) {
+                                               return;
+                                       }
+
+                                       // timeout to avoid race contition with the enable timeout
+                                       $timeout(function() {
+
+                                               for (var u = 0, ul = unifiedInputs.length; u < ul; ++u) {
+                                                       unifiedInputs[u].disable();
+                                               }
+
+                                               unifiedInputs = [];
+                                               enabled = false;
+                                       });
+                               };
+
+                               this.toggle = function(enabled) {
+                                       if (enabled) {
+                                               this.enable();
+                                       } else {
+                                               this.disable();
+                                       }
+                               };
+
+                               this.destroy = function() {
+                                       this.disable();
+                               };
+                       }
+
+                       return GridsterDraggable;
+               }
+       ])
+
+       .factory('GridsterResizable', ['GridsterTouch', function(GridsterTouch) {
+               function GridsterResizable($el, scope, gridster, item, itemOptions) {
+
+                       function ResizeHandle(handleClass) {
+
+                               var hClass = handleClass;
+
+                               var elmX, elmY, elmW, elmH,
+
+                                       mouseX = 0,
+                                       mouseY = 0,
+                                       lastMouseX = 0,
+                                       lastMouseY = 0,
+                                       mOffX = 0,
+                                       mOffY = 0,
+
+                                       minTop = 0,
+                                       maxTop = 9999,
+                                       minLeft = 0;
+
+                               var getMinHeight = function() {
+                                       return (item.minSizeY ? item.minSizeY : 1) * gridster.curRowHeight - gridster.margins[0];
+                               };
+                               var getMinWidth = function() {
+                                       return (item.minSizeX ? item.minSizeX : 1) * gridster.curColWidth - gridster.margins[1];
+                               };
+
+                               var originalWidth, originalHeight;
+                               var savedDraggable;
+
+                               function mouseDown(e) {
+                                       switch (e.which) {
+                                               case 1:
+                                                       // left mouse button
+                                                       break;
+                                               case 2:
+                                               case 3:
+                                                       // right or middle mouse button
+                                                       return;
+                                       }
+
+                                       // save the draggable setting to restore after resize
+                                       savedDraggable = gridster.draggable.enabled;
+                                       if (savedDraggable) {
+                                               gridster.draggable.enabled = false;
+                                               scope.$broadcast('gridster-draggable-changed', gridster);
+                                       }
+
+                                       // Get the current mouse position.
+                                       lastMouseX = e.pageX;
+                                       lastMouseY = e.pageY;
+
+                                       // Record current widget dimensions
+                                       elmX = parseInt($el.css('left'), 10);
+                                       elmY = parseInt($el.css('top'), 10);
+                                       elmW = $el[0].offsetWidth;
+                                       elmH = $el[0].offsetHeight;
+
+                                       originalWidth = item.sizeX;
+                                       originalHeight = item.sizeY;
+
+                                       resizeStart(e);
+
+                                       return true;
+                               }
+
+                               function resizeStart(e) {
+                                       $el.addClass('gridster-item-moving');
+                                       $el.addClass('gridster-item-resizing');
+
+                                       gridster.movingItem = item;
+
+                                       item.setElementSizeX();
+                                       item.setElementSizeY();
+                                       item.setElementPosition();
+                                       gridster.updateHeight(1);
+
+                                       scope.$apply(function() {
+                                               // callback
+                                               if (gridster.resizable && gridster.resizable.start) {
+                                                       gridster.resizable.start(e, $el, itemOptions); // options
+                                                                            // is
+                                                                            // the
+                                                                            // item
+                                                                            // model
+                                               }
+                                       });
+                               }
+
+                               function mouseMove(e) {
+                                       var maxLeft = gridster.curWidth - 1;
+
+                                       // Get the current mouse position.
+                                       mouseX = e.pageX;
+                                       mouseY = e.pageY;
+
+                                       // Get the deltas
+                                       var diffX = mouseX - lastMouseX + mOffX;
+                                       var diffY = mouseY - lastMouseY + mOffY;
+                                       mOffX = mOffY = 0;
+
+                                       // Update last processed mouse positions.
+                                       lastMouseX = mouseX;
+                                       lastMouseY = mouseY;
+
+                                       var dY = diffY,
+                                               dX = diffX;
+
+                                       if (hClass.indexOf('n') >= 0) {
+                                               if (elmH - dY < getMinHeight()) {
+                                                       diffY = elmH - getMinHeight();
+                                                       mOffY = dY - diffY;
+                                               } else if (elmY + dY < minTop) {
+                                                       diffY = minTop - elmY;
+                                                       mOffY = dY - diffY;
+                                               }
+                                               elmY += diffY;
+                                               elmH -= diffY;
+                                       }
+                                       if (hClass.indexOf('s') >= 0) {
+                                               if (elmH + dY < getMinHeight()) {
+                                                       diffY = getMinHeight() - elmH;
+                                                       mOffY = dY - diffY;
+                                               } else if (elmY + elmH + dY > maxTop) {
+                                                       diffY = maxTop - elmY - elmH;
+                                                       mOffY = dY - diffY;
+                                               }
+                                               elmH += diffY;
+                                       }
+                                       if (hClass.indexOf('w') >= 0) {
+                                               if (elmW - dX < getMinWidth()) {
+                                                       diffX = elmW - getMinWidth();
+                                                       mOffX = dX - diffX;
+                                               } else if (elmX + dX < minLeft) {
+                                                       diffX = minLeft - elmX;
+                                                       mOffX = dX - diffX;
+                                               }
+                                               elmX += diffX;
+                                               elmW -= diffX;
+                                       }
+                                       if (hClass.indexOf('e') >= 0) {
+                                               if (elmW + dX < getMinWidth()) {
+                                                       diffX = getMinWidth() - elmW;
+                                                       mOffX = dX - diffX;
+                                               } else if (elmX + elmW + dX > maxLeft) {
+                                                       diffX = maxLeft - elmX - elmW;
+                                                       mOffX = dX - diffX;
+                                               }
+                                               elmW += diffX;
+                                       }
+
+                                       // set new position
+                                       $el.css({
+                                               'top': elmY + 'px',
+                                               'left': elmX + 'px',
+                                               'width': elmW + 'px',
+                                               'height': elmH + 'px'
+                                       });
+
+                                       resize(e);
+
+                                       return true;
+                               }
+
+                               function mouseUp(e) {
+                                       // restore draggable setting to its original state
+                                       if (gridster.draggable.enabled !== savedDraggable) {
+                                               gridster.draggable.enabled = savedDraggable;
+                                               scope.$broadcast('gridster-draggable-changed', gridster);
+                                       }
+
+                                       mOffX = mOffY = 0;
+
+                                       resizeStop(e);
+
+                                       return true;
+                               }
+
+                               function resize(e) {
+                                       var oldRow = item.row,
+                                               oldCol = item.col,
+                                               oldSizeX = item.sizeX,
+                                               oldSizeY = item.sizeY,
+                                               hasCallback = gridster.resizable && gridster.resizable.resize;
+
+                                       var col = item.col;
+                                       // only change column if grabbing left edge
+                                       if (['w', 'nw', 'sw'].indexOf(handleClass) !== -1) {
+                                               col = gridster.pixelsToColumns(elmX, false);
+                                       }
+
+                                       var row = item.row;
+                                       // only change row if grabbing top edge
+                                       if (['n', 'ne', 'nw'].indexOf(handleClass) !== -1) {
+                                               row = gridster.pixelsToRows(elmY, false);
+                                       }
+
+                                       var sizeX = item.sizeX;
+                                       // only change row if grabbing left or right edge
+                                       if (['n', 's'].indexOf(handleClass) === -1) {
+                                               sizeX = gridster.pixelsToColumns(elmW, true);
+                                       }
+
+                                       var sizeY = item.sizeY;
+                                       // only change row if grabbing top or bottom edge
+                                       if (['e', 'w'].indexOf(handleClass) === -1) {
+                                               sizeY = gridster.pixelsToRows(elmH, true);
+                                       }
+
+                                       if (gridster.pushing !== false || gridster.getItems(row, col, sizeX, sizeY, item).length === 0) {
+                                               item.row = row;
+                                               item.col = col;
+                                               item.sizeX = sizeX;
+                                               item.sizeY = sizeY;
+                                       }
+                                       var isChanged = item.row !== oldRow || item.col !== oldCol || item.sizeX !== oldSizeX || item.sizeY !== oldSizeY;
+
+                                       if (hasCallback || isChanged) {
+                                               scope.$apply(function() {
+                                                       if (hasCallback) {
+                                                               gridster.resizable.resize(e, $el, itemOptions); // options
+                                                                                // is
+                                                                                // the
+                                                                                // item
+                                                                                // model
+                                                       }
+                                               });
+                                       }
+                               }
+
+                               function resizeStop(e) {
+                                       $el.removeClass('gridster-item-moving');
+                                       $el.removeClass('gridster-item-resizing');
+
+                                       gridster.movingItem = null;
+
+                                       item.setPosition(item.row, item.col);
+                                       item.setSizeY(item.sizeY);
+                                       item.setSizeX(item.sizeX);
+
+                                       scope.$apply(function() {
+                                               if (gridster.resizable && gridster.resizable.stop) {
+                                                       gridster.resizable.stop(e, $el, itemOptions); // options
+                                                                            // is
+                                                                            // the
+                                                                            // item
+                                                                            // model
+                                               }
+                                       });
+                               }
+
+                               var $dragHandle = null;
+                               var unifiedInput;
+
+                               this.enable = function() {
+                                       if (!$dragHandle) {
+                                               $dragHandle = angular.element('<div class="gridster-item-resizable-handler handle-' + hClass + '"></div>');
+                                               $el.append($dragHandle);
+                                       }
+
+                                       unifiedInput = new GridsterTouch($dragHandle[0], mouseDown, mouseMove, mouseUp);
+                                       unifiedInput.enable();
+                               };
+
+                               this.disable = function() {
+                                       if ($dragHandle) {
+                                               $dragHandle.remove();
+                                               $dragHandle = null;
+                                       }
+
+                                       unifiedInput.disable();
+                                       unifiedInput = undefined;
+                               };
+
+                               this.destroy = function() {
+                                       this.disable();
+                               };
+                       }
+
+                       var handles = [];
+                       var handlesOpts = gridster.resizable.handles;
+                       if (typeof handlesOpts === 'string') {
+                               handlesOpts = gridster.resizable.handles.split(',');
+                       }
+                       var enabled = false;
+
+                       for (var c = 0, l = handlesOpts.length; c < l; c++) {
+                               handles.push(new ResizeHandle(handlesOpts[c]));
+                       }
+
+                       this.enable = function() {
+                               if (enabled) {
+                                       return;
+                               }
+                               for (var c = 0, l = handles.length; c < l; c++) {
+                                       handles[c].enable();
+                               }
+                               enabled = true;
+                       };
+
+                       this.disable = function() {
+                               if (!enabled) {
+                                       return;
+                               }
+                               for (var c = 0, l = handles.length; c < l; c++) {
+                                       handles[c].disable();
+                               }
+                               enabled = false;
+                       };
+
+                       this.toggle = function(enabled) {
+                               if (enabled) {
+                                       this.enable();
+                               } else {
+                                       this.disable();
+                               }
+                       };
+
+                       this.destroy = function() {
+                               for (var c = 0, l = handles.length; c < l; c++) {
+                                       handles[c].destroy();
+                               }
+                       };
+               }
+               return GridsterResizable;
+       }])
+
+       .factory('gridsterDebounce', function() {
+               return function gridsterDebounce(func, wait, immediate) {
+                       var timeout;
+                       return function() {
+                               var context = this,
+                                       args = arguments;
+                               var later = function() {
+                                       timeout = null;
+                                       if (!immediate) {
+                                               func.apply(context, args);
+                                       }
+                               };
+                               var callNow = immediate && !timeout;
+                               clearTimeout(timeout);
+                               timeout = setTimeout(later, wait);
+                               if (callNow) {
+                                       func.apply(context, args);
+                               }
+                       };
+               };
+       })
+
+       /**
+     * GridsterItem directive
+     *
+     * @param $parse
+     * @param GridsterDraggable
+     * @param GridsterResizable
+     * @param gridsterDebounce
+     */
+       .directive('gridsterItem', ['$parse', 'GridsterDraggable', 'GridsterResizable', 'gridsterDebounce',
+               function($parse, GridsterDraggable, GridsterResizable, gridsterDebounce) {
+                       return {
+                               scope: true,
+                               restrict: 'EA',
+                               controller: 'GridsterItemCtrl',
+                               controllerAs: 'gridsterItem',
+                               require: ['^gridster', 'gridsterItem'],
+                               link: function(scope, $el, attrs, controllers) {
+                                       var optionsKey = attrs.gridsterItem,
+                                               options;
+
+                                        var gridster = controllers[0],
+                                               item = controllers[1];
+
+                                       scope.gridster = gridster;
+
+
+                                       // bind the item's position properties
+                                       // options can be an object specified by
+                    // gridster-item="object"
+                                       // or the options can be the element html attributes object
+                                       if (optionsKey) {
+                                               var $optionsGetter = $parse(optionsKey);
+                                               options = $optionsGetter(scope) || {};
+                                               if (!options && $optionsGetter.assign) {
+                                                       options = {
+                                                               row: item.row,
+                                                               col: item.col,
+                                                               sizeX: item.sizeX,
+                                                               sizeY: item.sizeY,
+                                                               minSizeX: 0,
+                                                               minSizeY: 0,
+                                                               maxSizeX: null,
+                                                               maxSizeY: null
+                                                       };
+                                                       $optionsGetter.assign(scope, options);
+                                               }
+                                       } else {
+                                               options = attrs;
+                                       }
+
+                                       item.init($el, gridster);
+
+                                       $el.addClass('gridster-item');
+
+                                       var aspects = ['minSizeX', 'maxSizeX', 'minSizeY', 'maxSizeY', 'sizeX', 'sizeY', 'row', 'col'],
+                                               $getters = {};
+
+                                       var expressions = [];
+                                       var aspectFn = function(aspect) {
+                                               var expression;
+                                               if (typeof options[aspect] === 'string') {
+                                                       // watch the expression in the scope
+                                                       expression = options[aspect];
+                                               } else if (typeof options[aspect.toLowerCase()] === 'string') {
+                                                       // watch the expression in the scope
+                                                       expression = options[aspect.toLowerCase()];
+                                               } else if (optionsKey) {
+                                                       // watch the expression on the options object in the
+                            // scope
+                                                       expression = optionsKey + '.' + aspect;
+                                               } else {
+                                                       return;
+                                               }
+                                               expressions.push('"' + aspect + '":' + expression);
+                                               $getters[aspect] = $parse(expression);
+
+                                               // initial set
+                                               var val = $getters[aspect](scope);
+                                               if (typeof val === 'number') {
+                                                       item[aspect] = val;
+                                               }
+                                       };
+
+                                       for (var i = 0, l = aspects.length; i < l; ++i) {
+                                               aspectFn(aspects[i]);
+                                       }
+
+                                       var watchExpressions = '{' + expressions.join(',') + '}';
+
+                                       // when the value changes externally, update the internal
+                    // item object
+                                       scope.$watchCollection(watchExpressions, function(newVals, oldVals) {
+                                               for (var aspect in newVals) {
+                                                       var newVal = newVals[aspect];
+                                                       var oldVal = oldVals[aspect];
+                                                       if (oldVal === newVal) {
+                                                               continue;
+                                                       }
+                                                       newVal = parseInt(newVal, 10);
+                                                       if (!isNaN(newVal)) {
+                                                               item[aspect] = newVal;
+                                                       }
+                                               }
+                                       });
+
+                                       function positionChanged() {
+                                               // call setPosition so the element and gridster
+                        // controller are updated
+                                               item.setPosition(item.row, item.col);
+
+                                               // when internal item position changes, update
+                        // externally bound values
+                                               if ($getters.row && $getters.row.assign) {
+                                                       $getters.row.assign(scope, item.row);
+                                               }
+                                               if ($getters.col && $getters.col.assign) {
+                                                       $getters.col.assign(scope, item.col);
+                                               }
+                                       }
+                                       scope.$watch(function() {
+                                               return item.row + ',' + item.col;
+                                       }, positionChanged);
+
+                                       function sizeChanged() {
+                                               var changedX = item.setSizeX(item.sizeX, true);
+                                               if (changedX && $getters.sizeX && $getters.sizeX.assign) {
+                                                       $getters.sizeX.assign(scope, item.sizeX);
+                                               }
+                                               var changedY = item.setSizeY(item.sizeY, true);
+                                               if (changedY && $getters.sizeY && $getters.sizeY.assign) {
+                                                       $getters.sizeY.assign(scope, item.sizeY);
+                                               }
+
+                                               if (changedX || changedY) {
+                                                       item.gridster.moveOverlappingItems(item);
+                                                       gridster.layoutChanged();
+                                                       scope.$broadcast('gridster-item-resized', item);
+                                               }
+                                       }
+
+                                       scope.$watch(function() {
+                                               return item.sizeY + ',' + item.sizeX + ',' + item.minSizeX + ',' + item.maxSizeX + ',' + item.minSizeY + ',' + item.maxSizeY;
+                                       }, sizeChanged);
+
+                                       var draggable = new GridsterDraggable($el, scope, gridster, item, options);
+                                       var resizable = new GridsterResizable($el, scope, gridster, item, options);
+
+                                       var updateResizable = function() {
+                                               resizable.toggle(!gridster.isMobile && gridster.resizable && gridster.resizable.enabled);
+                                       };
+                                       updateResizable();
+
+                                       var updateDraggable = function() {
+                                               draggable.toggle(!gridster.isMobile && gridster.draggable && gridster.draggable.enabled);
+                                       };
+                                       updateDraggable();
+
+                                       scope.$on('gridster-draggable-changed', updateDraggable);
+                                       scope.$on('gridster-resizable-changed', updateResizable);
+                                       scope.$on('gridster-resized', updateResizable);
+                                       scope.$on('gridster-mobile-changed', function() {
+                                               updateResizable();
+                                               updateDraggable();
+                                       });
+
+                                       function whichTransitionEvent() {
+                                               var el = document.createElement('div');
+                                               var transitions = {
+                                                       'transition': 'transitionend',
+                                                       'OTransition': 'oTransitionEnd',
+                                                       'MozTransition': 'transitionend',
+                                                       'WebkitTransition': 'webkitTransitionEnd'
+                                               };
+                                               for (var t in transitions) {
+                                                        if (el.style[t] !== undefined) {
+                                                               return transitions[t];
+                                                       }
+                                               }
+                                       }
+
+                                       var debouncedTransitionEndPublisher = gridsterDebounce(function() {
+                                               scope.$apply(function() {
+                                                       scope.$broadcast('gridster-item-transition-end', item);
+                                               });
+                                       }, 50);
+
+                                       if(whichTransitionEvent()){ // check for IE8, as it
+                                                // evaluates to null
+                                            $el.on(whichTransitionEvent(), debouncedTransitionEndPublisher);
+                                        }
+
+                                       scope.$broadcast('gridster-item-initialized', item);
+
+                                       return scope.$on('$destroy', function() {
+                                               try {
+                                                       resizable.destroy();
+                                                       draggable.destroy();
+                                               } catch (e) {}
+
+                                               try {
+                                                       gridster.removeItem(item);
+                                               } catch (e) {}
+
+                                               try {
+                                                       item.destroy();
+                                               } catch (e) {}
+                                       });
+                               }
+                       };
+               }
+       ])
+
+       .directive('gridsterNoDrag', function() {
+               return {
+                       restrict: 'A',
+                       link: function(scope, $element) {
+                               $element.addClass('gridster-no-drag');
+                       }
+               };
+       })
+
+       ;
+
+}));
diff --git a/ui/src/main/webapp/static/fusion/js/att_angular_gridster/ui-gridster-tpls.js b/ui/src/main/webapp/static/fusion/js/att_angular_gridster/ui-gridster-tpls.js
new file mode 100644 (file)
index 0000000..3ca3db7
--- /dev/null
@@ -0,0 +1,168 @@
+/**
+* FileName ui-gridster
+* Version 0.0.1
+* Build number ad58c6f4f8f8fd7f04ac457f95d76f09
+* Date 08/17/2015
+*/
+
+
+(function(angular, window){
+angular.module("att.gridster", ["att.gridster.tpls", "att.gridster.utilities","att.gridster.gridster"]);
+angular.module("att.gridster.tpls", ["template/gridster/gridster.html","template/gridster/gridsterItem.html","template/gridster/gridsterItemBody.html","template/gridster/gridsterItemFooter.html","template/gridster/gridsterItemHeader.html"]);
+angular.module('att.gridster.utilities', [])
+        .factory('$extendObj', [function() {
+                var _extendDeep = function(dst) {
+                    angular.forEach(arguments, function(obj) {
+                        if (obj !== dst) {
+                            angular.forEach(obj, function(value, key) {
+                                if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {
+                                    _extendDeep(dst[key], value);
+                                } else {
+                                    dst[key] = value;
+                                }
+                            });
+                        }
+                    });
+                    return dst;
+                };
+                return {
+                    extendDeep: _extendDeep
+                };
+            }]);
+
+angular.module('att.gridster.gridster', ['attGridsterLib', 'att.gridster.utilities'])
+        .config(['$compileProvider', function($compileProvider) {
+                $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|javascript):/);
+            }])
+        .constant('attGridsterConfig',
+                {
+                    columns: 3,
+                    margins: [10, 10],
+                    outerMargin: true,
+                    pushing: true,
+                    floating: true,
+                    swapping: true,
+                    draggable: {
+                        enabled: true
+                    }
+                })
+        .directive('attGridster', ['attGridsterConfig', '$extendObj', function(attGridsterConfig, $extendObj) {
+                return {
+                    restrict: 'EA',
+                    scope: {
+                        attGridsterOptions: '=?'
+                    },
+                    templateUrl: 'template/gridster/gridster.html',
+                    replace: false,
+                    transclude: true,
+                    controller: [function() {}],
+                    link: function(scope) {
+                        if (angular.isDefined(scope.attGridsterOptions)) {
+                            attGridsterConfig = $extendObj.extendDeep(attGridsterConfig, scope.attGridsterOptions);
+                        }
+                        scope.attGridsterConfig = attGridsterConfig;
+                    }
+                };
+            }])
+        .directive('attGridsterItem', ['$timeout', function($timeout) {
+                return {
+                    restrict: 'EA',
+                    require: ['^attGridster'],
+                    scope: {
+                        attGridsterItem: '='
+                    },
+                    templateUrl: 'template/gridster/gridsterItem.html',
+                    replace: false,
+                    transclude: true,
+                    controller: [function() {}]
+                };
+            }])
+        .directive('attGridsterItemHeader', [function() {
+                return {
+                    restrict: 'EA',
+                    require: ['^attGridsterItem'],
+                    scope: {
+                        headerText: '@',
+                        subHeaderText: '@?'
+                    },
+                    templateUrl: 'template/gridster/gridsterItemHeader.html',
+                    replace: true,
+                    transclude: true,
+                    link: function(scope, element) {
+                        if (angular.isDefined(scope.subHeaderText) && scope.subHeaderText) {
+                            angular.element(element[0].querySelector('span.gridster-item-sub-header-content')).attr("tabindex", "0");
+                            angular.element(element[0].querySelector('span.gridster-item-sub-header-content')).attr("aria-label", scope.subHeaderText);
+                        }
+                    }
+                };
+            }])
+        .directive('attGridsterItemBody', [function() {
+                return {
+                    restrict: 'EA',
+                    require: ['^attGridsterItem'],
+                    scope: {},
+                    templateUrl: 'template/gridster/gridsterItemBody.html',
+                    replace: true,
+                    transclude: true
+                };
+            }])
+        .directive('attGridsterItemFooter', ['$location', function($location) {
+                return {
+                    restrict: 'EA',
+                    require: ['^attGridsterItem'],
+                    scope: {
+                        attGridsterItemFooterLink: '@?'
+                    },
+                    templateUrl: 'template/gridster/gridsterItemFooter.html',
+                    replace: true,
+                    transclude: true,
+                    controller: ['$scope', function($scope) {
+                            $scope.clickOnFooterLink = function(evt) {
+                                evt.preventDefault();
+                                evt.stopPropagation();
+                                if ($scope.attGridsterItemFooterLink) {
+                                    $location.url($scope.attGridsterItemFooterLink);
+                                }
+                            };
+                        }],
+                    link: function(scope, element) {
+                        if (angular.isDefined(scope.attGridsterItemFooterLink) && scope.attGridsterItemFooterLink) {
+                            element.attr("role", "link");
+                        }
+                    }
+                };
+            }]);
+angular.module("template/gridster/gridster.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/gridster/gridster.html",
+    "<div gridster='attGridsterConfig'><div ng-transclude></div></div>");
+}]);
+
+angular.module("template/gridster/gridsterItem.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/gridster/gridsterItem.html",
+    "<div gridster-item='attGridsterItem' class=\"gridster-item-container\" ng-transclude></div>");
+}]);
+
+angular.module("template/gridster/gridsterItemBody.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/gridster/gridsterItemBody.html",
+    "<div class=\"gridster-item-body\" ng-transclude></div>");
+}]);
+
+angular.module("template/gridster/gridsterItemFooter.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/gridster/gridsterItemFooter.html",
+    "<div class=\"gridster-item-footer\" ng-click=\"clickOnFooterLink($event)\" tabindex=\"0\" ng-keydown=\"(($event.keyCode && $event.keyCode === 13) || ($event.which && $event.which === 13)) && clickOnFooterLink($event)\" >\n" +
+    "    <span class=\"gridster-item-footer-content\" ng-transclude></span>\n" +
+    "</div>");
+}]);
+
+angular.module("template/gridster/gridsterItemHeader.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/gridster/gridsterItemHeader.html",
+    "<div class=\"gridster-item-header\">\n" +
+    "    <img gridster-item-drag src=\"static/fusion/images/att_angular_gridster/grips.png\" alt=\"||\" aria-label=\"Tap/Click to move\" class=\"gridster-item-handle\" />\n" +
+    "    <span class=\"gridster-item-header-content\" tabindex=\"0\" role=\"presentation\" aria-label=\"{{headerText}}\">{{headerText}}</span>\n" +
+    "    <span class=\"gridster-item-sub-header-content\" role=\"presentation\">{{subHeaderText}}</span>\n" +
+    "    <div class=\"gridster-item-header-buttons-container\" ng-transclude></div>\n" +
+    "</div>");
+}]);
+
+return {}
+})(angular, window);
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/css/images/blank.gif b/ui/src/main/webapp/static/fusion/sample/css/images/blank.gif
new file mode 100644 (file)
index 0000000..75b945d
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/css/images/blank.gif differ
diff --git a/ui/src/main/webapp/static/fusion/sample/css/scribble.css b/ui/src/main/webapp/static/fusion/sample/css/scribble.css
new file mode 100644 (file)
index 0000000..c6ab19b
--- /dev/null
@@ -0,0 +1,41 @@
+#scribble-pad {
+    /*         margin-left:auto;
+       margin-right:auto;
+       height: 475px;
+       width: 475px;*/
+    background:
+        url(https://www.ibm.com/developerworks/mydeveloperworks/blogs/bobleah/resource/stickynote.jpg)
+        no-repeat center center;
+    background-size: 110% 110%;
+}
+
+#scribble {
+    white-space: pre-wrap; /* css-3 */
+    white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
+    white-space: -pre-wrap; /* Opera 4-6 */
+    white-space: -o-pre-wrap; /* Opera 7 */
+    word-wrap: break-word; /* Internet Explorer 5.5+ */
+    max-width: 300px;
+    padding: 120px 100px 100px 75px;
+    color: #486891;
+    border-color: #ff0000 #0000ff;
+    border-color: transparent;
+    background-color: rgba(0, 0, 0, 0);
+    font-family: Arial, sans-serif;
+    font-size: 120%;
+    font-style: italic;
+    font-weight: bold;
+    line-height: 1.5em;
+}
+
+#scribble:focus {
+    outline-width: 0;
+}
+
+.c-link {
+    color: #486891;
+    font-family: Arial, sans-serif;
+    font-size: 95%;
+    font-weight: bold;
+    text-decoration: none;
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/css/slider.css b/ui/src/main/webapp/static/fusion/sample/css/slider.css
new file mode 100644 (file)
index 0000000..0bbb790
--- /dev/null
@@ -0,0 +1,143 @@
+div, span, p {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+    vertical-align: baseline;
+}
+
+#container {
+    width: 580px;
+    padding: 10px;
+    margin: 0 auto;
+    position: relative;
+    z-index: 0;
+}
+
+#example {
+    width: 600px;
+    height: 350px;
+    position: relative;
+}
+
+#ribbon {
+    position: absolute;
+    top: -3px;
+    left: -15px;
+    z-index: 500;
+}
+
+#frame {
+    position: absolute;
+    z-index: 0;
+    width: 739px;
+    height: 341px;
+    top: -3px;
+    left: -80px;
+}
+
+/*
+       Slideshow
+*/
+#slides {
+    position: absolute;
+    top: 15px;
+    left: 4px;
+    z-index: 100;
+}
+
+/*
+       Slides container
+       Important:
+       Set the width of your slides container
+       Set to display none, prevents content flash
+*/
+.slides_container {
+    width: 570px;
+    overflow: hidden;
+    position: relative;
+    display: none;
+}
+
+/*
+       Each slide
+       Important:
+       Set the width of your slides
+       If height not specified height will be set by the slide content
+       Set to display block
+*/
+.slides_container div.slide {
+    width: 570px;
+    height: 270px;
+    display: block;
+}
+
+/*
+       Next/prev buttons
+*/
+#slides .next, #slides .prev {
+    position: absolute;
+    top: 107px;
+    left: -39px;
+    width: 24px;
+    height: 43px;
+    display: block;
+    z-index: 101;
+}
+
+#slides .next {
+    left: 585px;
+}
+
+/*
+       Pagination
+*/
+.pagination {
+    margin: 26px auto 0;
+    width: 100px;
+}
+
+.pagination li {
+    float: left;
+    margin: 0 1px;
+    list-style: none;
+}
+
+.pagination li a {
+    display: block;
+    width: 12px;
+    height: 0;
+    padding-top: 12px;
+    background-image: url(../images/pagination.png);
+    background-position: 0 0;
+    float: left;
+    overflow: hidden;
+}
+
+.pagination li.current a {
+    background-position: 0 -12px;
+}
+
+/*
+       Caption
+*/
+.caption {
+    z-index: 500;
+    position: absolute;
+    bottom: -35px;
+    left: 0;
+    height: 30px;
+    padding: 5px 20px 0 20px;
+    background: #000;
+    background: rgba(0, 0, 0, .5);
+    width: 540px;
+    font-size: 1.3em;
+    line-height: 1.33;
+    color: #fff;
+    border-top: 1px solid #000;
+    text-shadow: none;
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/css/spacegallery.css b/ui/src/main/webapp/static/fusion/sample/css/spacegallery.css
new file mode 100644 (file)
index 0000000..8423221
--- /dev/null
@@ -0,0 +1,20 @@
+.spacegallery {
+    position: relative;
+    overflow: hidden;
+}
+
+.spacegallery img {
+    position: absolute;
+    left: 50%;
+}
+
+.spacegallery a {
+    position: absolute;
+    z-index: 1000;
+    display: block;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background: url(images/blank.gif);
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/css/welcome.css b/ui/src/main/webapp/static/fusion/sample/css/welcome.css
new file mode 100644 (file)
index 0000000..f970ecf
--- /dev/null
@@ -0,0 +1,173 @@
+/* Area Chart */
+#areaChart {
+    overflow: hidden;
+}
+
+#lineChart {
+    overflow: hidden;
+}
+
+#areaChart svg {
+    height: 200px;
+    width: 380px;
+    min-width: 100px;
+    min-height: 100px;
+}
+
+#lineChart svg {
+    height: 200px;
+    width: 380px;
+    min-width: 100px;
+    min-height: 100px;
+}
+
+#areaChart tr.z-row-over>td.z-row-inner, tr.z-row-over>.z-cell {
+    background-color: rgb(255, 255, 255);
+}
+
+#lineChart tr.z-row-over>td.z-row-inner, tr.z-row-over>.z-cell {
+    background-color: rgb(255, 255, 255);
+}
+
+#areaChart .nodatadiv {
+    display: table-cell;
+    width: 700px;
+    height: 370px;
+    text-align: center;
+    vertical-align: middle;
+}
+
+#lineChart .nodatadiv {
+    display: table-cell;
+    width: 700px;
+    height: 370px;
+    text-align: center;
+    vertical-align: middle;
+}
+
+#areaChart .nodatainner {
+    padding: 10px;
+}
+
+#lineChart .nodatainner {
+    padding: 10px;
+}
+
+/* Area Chart END  */
+.button--small, [class*=bg-] .button--small {
+    font-size: 14px;
+}
+
+;
+
+/* Gridster (EBIZ) */
+.gridster-item-container .gridster-item-body {
+    bottom: 0px;
+}
+
+.gridster-item-container {
+    min-height: 50px;
+}
+
+.att-accordion {
+    border-width: 0px;
+}
+
+/* End Gridster */
+#myGallery {
+    width: 100%;
+    height: 400px;
+}
+
+#myGallery img {
+    border: 2px solid #52697E;
+}
+
+a.loading {
+    background: #fff url(../images/ajax_small.gif) no-repeat center;
+}
+
+.center {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+#selectedTrafficDay ul {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+#selectedTrafficDay li {
+    float: left;
+    border: 1px solid #000;
+    border-bottom-width: 0;
+    margin: 3px 3px 3px 3px;
+    padding: 5px 5px 5px 5px;
+    background-color: #F2F2F2;
+    color: #696969;
+}
+
+#SelectedTrafficeDayView {
+    padding: 0 1em;
+}
+
+#selectedTrafficDay .active1 {
+    background-color: #FFF;
+    color: #000;
+}
+
+#BusyHourTraffic ul {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+#BusyHourTraffic li {
+    float: left;
+    border: 1px solid #000;
+    border-bottom-width: 0;
+    margin: 3px 3px 3px 3px;
+    padding: 5px 5px 5px 5px;
+    background-color: #F2F2F2;
+    color: #696969;
+}
+
+#BusyHourTrafficView {
+    padding: 0 1em;
+}
+
+#BusyHourTraffic .active2 {
+    background-color: #FFF;
+    color: #000;
+}
+
+#slider {
+    width: 600px;
+    margin: 0 auto;
+    clear: left;
+}
+
+@media only screen and (device-width: 768px) {
+    #slider {
+        width: 400px;
+    }
+}
+
+#container {
+    
+}
+
+#title {
+    float: left;
+    width: 100%;
+    height: 30px;
+    margin:;
+    color: #222222;
+    text-shadow: 1px 1px 2px #A0A0A0;
+}
+
+.content {
+    margin-right: -230px;
+    top: 50px;
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/area_chart.html b/ui/src/main/webapp/static/fusion/sample/html/area_chart.html
new file mode 100644 (file)
index 0000000..47df293
--- /dev/null
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<meta http-equiv="content-type" content="text/html; charset=UTF8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<link href="../../d3/css/nv.d3.css" rel="stylesheet" type="text/css">
+<style>
+body {
+    overflow-y: scroll;
+}
+
+text {
+    font: 12px sans-serif;
+}
+
+svg {
+    display: block;
+}
+
+#chart461 svg {
+    height: 175px;
+    width: 300px;
+    min-width: 100px;
+    min-height: 100px;
+}
+
+tr.z-row-over>td.z-row-inner, tr.z-row-over>.z-cell {
+    background-color: rgb(255, 255, 255);
+}
+
+.nodatadiv {
+    display: table-cell;
+    width: 700px;
+    height: 370px;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.nodatainner {
+    padding: 10px;
+}
+</style>
+<body>
+ <div align="center">
+  <H3></H3>
+ </div>
+ <div id="chart461">
+  <svg></svg>
+ </div>
+ <script src="../../d3/js/d3.v3.min.js"></script>
+ <script src="../../d3/js/nv.d3.min.js"></script>
+ <script src="../../d3/js/models/axis.min.js"></script>
+ <script>
+historicalBarChart = [
+ { "type":"line", "key": "AP_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":2.13}, { "x":1388552400000 , "y":5.0}, { "x":1388552400000 , "y":2.36}, { "x":1388552400000 , "y":10.0}, { "x":1391230800000 , "y":3.15}, { "x":1391230800000 , "y":2.88}, { "x":1391230800000 , "y":3.0}, { "x":1391230800000 , "y":4.0}, { "x":1393650000000 , "y":8.0}, { "x":1393650000000 , "y":3.93}, { "x":1393650000000 , "y":4.27}, { "x":1393650000000 , "y":4.0}, { "x":1396324800000 , "y":4.25}, { "x":1396324800000 , "y":5.35}, { "x":1396324800000 , "y":5.92}, { "x":1396324800000 , "y":12.0}, { "x":1398916800000 , "y":5.55}, { "x":1398916800000 , "y":4.89}, { "x":1398916800000 , "y":5.01}, { "x":1398916800000 , "y":3.27}, { "x":1401595200000 , "y":6.27}, { "x":1401595200000 , "y":9.17}, { "x":1401595200000 , "y":9.31}, { "x":1401595200000 , "y":6.07}, { "x":1404187200000 , "y":8.37}, { "x":1404187200000 , "y":8.11}, { "x":1404187200000 , "y":8.84}, { "x":1404187200000 , "y":8.93}, { "x":1406865600000 , "y":11.79}, { "x":1406865600000 , "y":12.22}, { "x":1406865600000 , "y":12.6}, { "x":1406865600000 , "y":11.61}, { "x":1409544000000 , "y":15.27}, { "x":1409544000000 , "y":19.09}, { "x":1409544000000 , "y":16.09}, { "x":1409544000000 , "y":18.66}, { "x":1412136000000 , "y":18.4}, { "x":1412136000000 , "y":22.05}, { "x":1412136000000 , "y":21.66}, { "x":1412136000000 , "y":19.04}, { "x":1414814400000 , "y":19.13}, { "x":1414814400000 , "y":19.61}, { "x":1414814400000 , "y":17.61}, { "x":1414814400000 , "y":17.5}, { "x":1417410000000 , "y":19.0}, { "x":1417410000000 , "y":15.73}, { "x":1420088400000 , "y":9.67}, { "x":1420088400000 , "y":15.19}, { "x":1420088400000 , "y":15.02}, { "x":1420088400000 , "y":9.62333333333333}, { "x":1422766800000 , "y":16.95}, { "x":1422766800000 , "y":14.29}, { "x":1425186000000 , "y":12.9}, { "x":1425186000000 , "y":16.1166666666667} ] } ,
+ { "type":"line", "key": "ROUTER_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":3.0}, { "x":1388552400000 , "y":4.0}, { "x":1388552400000 , "y":4.89}, { "x":1388552400000 , "y":7.0}, { "x":1391230800000 , "y":4.57}, { "x":1391230800000 , "y":4.0}, { "x":1391230800000 , "y":4.0}, { "x":1391230800000 , "y":7.0}, { "x":1393650000000 , "y":7.0}, { "x":1393650000000 , "y":4.18}, { "x":1393650000000 , "y":5.0}, { "x":1393650000000 , "y":5.0}, { "x":1396324800000 , "y":5.0}, { "x":1396324800000 , "y":5.0}, { "x":1396324800000 , "y":5.06}, { "x":1396324800000 , "y":6.0}, { "x":1398916800000 , "y":5.0}, { "x":1398916800000 , "y":5.0}, { "x":1398916800000 , "y":5.0}, { "x":1398916800000 , "y":5.0}, { "x":1401595200000 , "y":6.0}, { "x":1401595200000 , "y":6.09}, { "x":1401595200000 , "y":6.0}, { "x":1401595200000 , "y":6.0}, { "x":1404187200000 , "y":6.36}, { "x":1404187200000 , "y":7.0}, { "x":1404187200000 , "y":7.0}, { "x":1404187200000 , "y":7.0}, { "x":1406865600000 , "y":7.0}, { "x":1406865600000 , "y":7.02}, { "x":1406865600000 , "y":7.24}, { "x":1406865600000 , "y":7.0}, { "x":1409544000000 , "y":8.23}, { "x":1409544000000 , "y":8.11}, { "x":1409544000000 , "y":8.12}, { "x":1409544000000 , "y":8.03}, { "x":1412136000000 , "y":9.0}, { "x":1412136000000 , "y":8.93}, { "x":1412136000000 , "y":8.57}, { "x":1412136000000 , "y":9.0}, { "x":1414814400000 , "y":5.97}, { "x":1414814400000 , "y":6.0}, { "x":1414814400000 , "y":9.0}, { "x":1414814400000 , "y":9.0}, { "x":1417410000000 , "y":9.0}, { "x":1417410000000 , "y":8.78}, { "x":1420088400000 , "y":3.0}, { "x":1420088400000 , "y":2.01}, { "x":1420088400000 , "y":3.0}, { "x":1420088400000 , "y":3.01}, { "x":1422766800000 , "y":2.67}, { "x":1422766800000 , "y":2.0}, { "x":1425186000000 , "y":2.8}, { "x":1425186000000 , "y":3.63333333333333} ] } ,
+ { "type":"line", "key": "SCTP_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":7.0}, { "x":1388552400000 , "y":10.0}, { "x":1388552400000 , "y":8.27}, { "x":1388552400000 , "y":8.0}, { "x":1391230800000 , "y":10.02}, { "x":1391230800000 , "y":8.04}, { "x":1391230800000 , "y":9.0}, { "x":1391230800000 , "y":10.0}, { "x":1393650000000 , "y":12.0}, { "x":1393650000000 , "y":10.04}, { "x":1393650000000 , "y":11.16}, { "x":1393650000000 , "y":10.0}, { "x":1396324800000 , "y":10.7}, { "x":1396324800000 , "y":13.31}, { "x":1396324800000 , "y":12.73}, { "x":1396324800000 , "y":9.0}, { "x":1398916800000 , "y":12.41}, { "x":1398916800000 , "y":11.95}, { "x":1398916800000 , "y":12.82}, { "x":1398916800000 , "y":9.58}, { "x":1401595200000 , "y":11.28}, { "x":1401595200000 , "y":14.01}, { "x":1401595200000 , "y":14.63}, { "x":1401595200000 , "y":11.83}, { "x":1404187200000 , "y":14.06}, { "x":1404187200000 , "y":13.96}, { "x":1404187200000 , "y":14.66}, { "x":1404187200000 , "y":14.36}, { "x":1406865600000 , "y":16.6}, { "x":1406865600000 , "y":16.95}, { "x":1406865600000 , "y":17.11}, { "x":1406865600000 , "y":15.94}, { "x":1409544000000 , "y":19.86}, { "x":1409544000000 , "y":22.97}, { "x":1409544000000 , "y":21.56}, { "x":1409544000000 , "y":24.55}, { "x":1412136000000 , "y":22.66}, { "x":1412136000000 , "y":26.79}, { "x":1412136000000 , "y":26.54}, { "x":1412136000000 , "y":25.35}, { "x":1414814400000 , "y":21.0}, { "x":1414814400000 , "y":20.35}, { "x":1414814400000 , "y":21.93}, { "x":1414814400000 , "y":23.63}, { "x":1417410000000 , "y":24.0}, { "x":1417410000000 , "y":21.43}, { "x":1420088400000 , "y":12.63}, { "x":1420088400000 , "y":25.14}, { "x":1420088400000 , "y":21.85}, { "x":1420088400000 , "y":12.5766666666667}, { "x":1422766800000 , "y":26.3}, { "x":1422766800000 , "y":24.4}, { "x":1425186000000 , "y":23.3833333333333}, { "x":1425186000000 , "y":24.5833333333333} ] } ,
+ { "type":"line", "key": "DP_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":2.0}, { "x":1388552400000 , "y":5.0}, { "x":1388552400000 , "y":2.17}, { "x":1388552400000 , "y":2.0}, { "x":1391230800000 , "y":3.01}, { "x":1391230800000 , "y":2.56}, { "x":1391230800000 , "y":3.0}, { "x":1391230800000 , "y":9.0}, { "x":1393650000000 , "y":10.0}, { "x":1393650000000 , "y":3.64}, { "x":1393650000000 , "y":4.06}, { "x":1393650000000 , "y":4.0}, { "x":1396324800000 , "y":4.04}, { "x":1396324800000 , "y":5.11}, { "x":1396324800000 , "y":5.9}, { "x":1396324800000 , "y":8.0}, { "x":1398916800000 , "y":5.08}, { "x":1398916800000 , "y":4.65}, { "x":1398916800000 , "y":4.74}, { "x":1398916800000 , "y":2.98}, { "x":1401595200000 , "y":6.13}, { "x":1401595200000 , "y":8.98}, { "x":1401595200000 , "y":9.22}, { "x":1401595200000 , "y":5.84}, { "x":1404187200000 , "y":8.12}, { "x":1404187200000 , "y":7.89}, { "x":1404187200000 , "y":8.41}, { "x":1404187200000 , "y":8.47}, { "x":1406865600000 , "y":11.06}, { "x":1406865600000 , "y":11.84}, { "x":1406865600000 , "y":11.92}, { "x":1406865600000 , "y":10.8}, { "x":1409544000000 , "y":14.58}, { "x":1409544000000 , "y":18.39}, { "x":1409544000000 , "y":15.5}, { "x":1409544000000 , "y":18.33}, { "x":1412136000000 , "y":18.01}, { "x":1412136000000 , "y":21.3}, { "x":1412136000000 , "y":21.11}, { "x":1412136000000 , "y":18.37}, { "x":1414814400000 , "y":18.59}, { "x":1414814400000 , "y":18.81}, { "x":1414814400000 , "y":17.13}, { "x":1414814400000 , "y":16.92}, { "x":1417410000000 , "y":18.0}, { "x":1417410000000 , "y":15.18}, { "x":1420088400000 , "y":9.16}, { "x":1420088400000 , "y":12.13}, { "x":1420088400000 , "y":11.76}, { "x":1420088400000 , "y":9.31}, { "x":1422766800000 , "y":13.47}, { "x":1422766800000 , "y":13.41}, { "x":1425186000000 , "y":12.2333333333333}, { "x":1425186000000 , "y":12.4} ] }
+];
+
+</script>
+ <script src="js/area_chart.min.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/bar_chart.html b/ui/src/main/webapp/static/fusion/sample/html/bar_chart.html
new file mode 100644 (file)
index 0000000..b69ebed
--- /dev/null
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html>
+<meta http-equiv="content-type" content="text/html; charset=UTF8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<link href="../../d3/css/nv.d3.css" rel="stylesheet" type="text/css">
+<style>
+body {
+    overflow-y: scroll;
+}
+
+text {
+    font: 12px sans-serif;
+}
+
+svg {
+    display: block;
+}
+
+#chart461 svg {
+    height: 420px;
+    width: 700px;
+    min-width: 100px;
+    min-height: 100px;
+}
+
+tr.z-row-over>td.z-row-inner, tr.z-row-over>.z-cell {
+    background-color: rgb(255, 255, 255);
+}
+
+.nodatadiv {
+    display: table-cell;
+    width: 700px;
+    height: 370px;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.nodatainner {
+    padding: 10px;
+}
+</style>
+<body>
+ <div align="center">
+  <H3></H3>
+ </div>
+ <div id="chart461">
+  <svg></svg>
+ </div>
+ <script src="../../d3/js/d3.v3.min.js"></script>
+ <script src="../../d3/js/nv.d3.min.js"></script>
+ <script src="../../d3/js/tooltip.js"></script>
+ <script src="../../d3/js/utils.js"></script>
+ <script src="../../d3/js/models/axis.min.js"></script>
+ <script src="../../d3/js/models/multiChart.js"></script>
+ <script>
+historicalBarChart = [
+ { "type":"bar", "key": "AP_CPU", "yAxis": "1", "values": [{ "x":1388552400000 , "y":10}, { "x":1391230800000 , "y":4}, { "x":1393650000000 , "y":4}, { "x":1396324800000 , "y":12}, { "x":1398916800000 , "y":3.27}, { "x":1401595200000 , "y":6.07}, { "x":1404187200000 , "y":8.93}, { "x":1406865600000 , "y":11.61}, { "x":1409544000000 , "y":18.66}, { "x":1412136000000 , "y":19.04}, { "x":1414814400000 , "y":17.5}, { "x":1417410000000 , "y":15.73}, { "x":1420088400000 , "y":9.62333333333333}, { "x":1422766800000 , "y":14.29}, { "x":1425186000000 , "y":16.1166666666667} ] } ,
+ { "type":"bar", "key": "ROUTER_CPU", "yAxis": "1", "values": [{ "x":1388552400000 , "y":7}, { "x":1391230800000 , "y":7}, { "x":1393650000000 , "y":5}, { "x":1396324800000 , "y":6}, { "x":1398916800000 , "y":5}, { "x":1401595200000 , "y":6}, { "x":1404187200000 , "y":7}, { "x":1406865600000 , "y":7}, { "x":1409544000000 , "y":8.03}, { "x":1412136000000 , "y":9}, { "x":1414814400000 , "y":9}, { "x":1417410000000 , "y":8.78}, { "x":1420088400000 , "y":3.01}, { "x":1422766800000 , "y":2}, { "x":1425186000000 , "y":3.63333333333333} ] } ,
+ { "type":"bar", "key": "SCTP_CPU", "yAxis": "1", "values": [{ "x":1388552400000 , "y":8}, { "x":1391230800000 , "y":10}, { "x":1393650000000 , "y":10}, { "x":1396324800000 , "y":9}, { "x":1398916800000 , "y":9.58}, { "x":1401595200000 , "y":11.83}, { "x":1404187200000 , "y":14.36}, { "x":1406865600000 , "y":15.94}, { "x":1409544000000 , "y":24.55}, { "x":1412136000000 , "y":25.35}, { "x":1414814400000 , "y":23.63}, { "x":1417410000000 , "y":21.43}, { "x":1420088400000 , "y":12.5766666666667}, { "x":1422766800000 , "y":24.4}, { "x":1425186000000 , "y":24.5833333333333} ] } ,
+ { "type":"bar", "key": "DP_CPU", "yAxis": "1", "values": [{ "x":1388552400000 , "y":2}, { "x":1391230800000 , "y":9}, { "x":1393650000000 , "y":4}, { "x":1396324800000 , "y":8}, { "x":1398916800000 , "y":2.98}, { "x":1401595200000 , "y":5.84}, { "x":1404187200000 , "y":8.47}, { "x":1406865600000 , "y":10.8}, { "x":1409544000000 , "y":18.33}, { "x":1412136000000 , "y":18.37}, { "x":1414814400000 , "y":16.92}, { "x":1417410000000 , "y":15.18}, { "x":1420088400000 , "y":9.31}, { "x":1422766800000 , "y":13.41}, { "x":1425186000000 , "y":12.4} ] }
+];
+var chart;
+nv.addGraph(function() {
+ chart = nv.models.multiBarChart()
+           .margin({top: 30, right: 60, bottom: 50, left: 100})
+                       .showLegend(true)
+            .reduceXTicks(false)
+           .forceY([0, 34.0])
+                       .showControls(true)
+                       .stacked(false)
+                       .logScale(false)
+                               .legendPos('top')
+           .color(d3.scale.category10().range());
+  chart.xAxis
+       .tickValues([1388552400000,1391230800000,1393650000000,1396324800000,1398916800000,1401595200000,1404187200000,1406865600000,1409544000000,1412136000000,1414814400000,1417410000000,1420088400000,1422766800000])
+             .staggerLabels(false)
+                       .showMaxMin(false)
+                       .rotateLabels(90)
+               .axisLabel('Timestamp')
+        .tickFormat(function(d) {
+         return d3.time.format('%b %y')(new Date(d)) });
+  chart.yAxis
+                       .logScale(false)
+               .axisLabel('')
+        .tickFormat(d3.format(',.1f'));
+ d3.select('#chart461 svg')
+  .datum(historicalBarChart)
+  .transition().duration(1000)
+  .call(chart);
+nv.utils.windowResize(chart.update);
+return chart;
+});
+function redraw() {
+       d3.select('#chart461 svg')
+               .datum(historicalBarChart)
+               .transition().duration(500)
+               .call(chart);
+}
+
+ setInterval(function () {
+ redraw();
+ }, 1500)
+if(historicalBarChart.length <= 0 ) {
+       document.getElementById("chart461").innerHTML = "<div id='noData'><b>No Data Available</b></div>";
+       document.getElementById("chart461").className="nodatadiv";
+       document.getElementById("nodata").className="nodatainner";
+}
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/d3_gauges_demo.html b/ui/src/main/webapp/static/fusion/sample/html/d3_gauges_demo.html
new file mode 100644 (file)
index 0000000..cb318cd
--- /dev/null
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<title>d3.js gauges</title>
+
+<style>
+body {
+    font: 10px arial;
+}
+</style>
+
+<script src="../../d3/js/d3.v3.min.js" charset="utf-8"></script>
+
+
+<script>
+
+      var dataURL = "data/speedometer2.csv";
+      var gauges = [];
+      var recordLength = 0;
+      var dataset ;
+
+    </script>
+<script type="text/javascript" src="js/gauges.min.js"></script>
+
+</head>
+
+<body onload="initialize()">
+ <span id="Bedminster"></span>
+ <span id="Piscataway"></span>
+ <br />
+ <span id="Middletown"></span>
+ <span id="Paramus"></span>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/data/speedometer2.csv b/ui/src/main/webapp/static/fusion/sample/html/data/speedometer2.csv
new file mode 100644 (file)
index 0000000..406143e
--- /dev/null
@@ -0,0 +1,16 @@
+"YEARMONTH","Bedminster","Piscataway","Middletown","Paramus"
+"201401",8.27,4.89,2.36,2.17
+"201402",10.02,4.57,3.15,3.01
+"201403",11.16,5.00,4.27,4.06
+"201404",13.31,5.00,5.35,5.11
+"201405",12.82,5.00,5.01,4.74
+"201406",14.01,6.09,9.17,8.98
+"201407",14.66,7.00,8.84,8.41
+"201408",16.95,7.02,12.22,11.84
+"201409",21.56,8.12,16.09,15.50
+"201410",25.35,9.00,19.04,18.37
+"201411",21.93,9.00,17.61,17.13
+"201412",24.00,9.00,19.00,18.00
+"201501",25.14,2.01,15.19,12.13
+"201502",26.30,2.67,16.95,13.47
+"201503",26.5833333333333,45.63333333333333,16.1166666666667,12.40
diff --git a/ui/src/main/webapp/static/fusion/sample/html/data/speedometer3.csv b/ui/src/main/webapp/static/fusion/sample/html/data/speedometer3.csv
new file mode 100644 (file)
index 0000000..046383e
--- /dev/null
@@ -0,0 +1,2 @@
+"YEARMONTH","Bedminster","Piscataway","Middletown","Paramus"
+"201401",8.27,4.89,2.36,2.17
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/data/worddata.csv b/ui/src/main/webapp/static/fusion/sample/html/data/worddata.csv
new file mode 100644 (file)
index 0000000..13f0d02
--- /dev/null
@@ -0,0 +1,127 @@
+text,frequency
+service,98
+portal,70
+management,70
+virtual,56
+design,56
+studio,42
+operations,42
+inventory,42
+router,28
+restart,28
+process,28
+platform,28
+manage,28
+loop,28
+licensing,28
+license,28
+integrated,28
+flow-through,28
+enable,28
+data,28
+controller,28
+control,28
+configure,28
+component,28
+common,28
+asset,28
+application,28
+ECOMP,28
+workflow,14
+waterfall,14
+visual,14
+view,14
+workflow,14
+waterfall,14
+visual,14
+view,14
+utilization,14
+user,14
+usage,14
+troubleshoot,14
+transformation,14
+track,14
+topolgies,14
+topics,14
+time,14
+tickets,14
+thresholds,14
+templates,14
+structures,14
+standards-based,14
+software,14
+reuse,14
+repository,14
+reports,14
+release,14
+recipes,14
+real-time,14
+provisioning,14
+properties,14
+project-based,14
+processes,14
+physical,14
+oversight,14
+openl-loop,14
+network,14
+monitor,14
+modeling,14
+model-driven,14
+model,14
+message,14
+maximize,14
+manually,14
+machine,14
+layer,14
+interact,14
+instances,14
+initiate,14
+increase,14
+imported,14
+impacts,14
+host,14
+function,14
+feeds,14
+features,14
+faults,14
+extended,14
+engines,14
+engine,14
+dynamic,14
+document-driven,14
+determine,14
+dashboard,14
+current,14
+creation,14
+created,14
+create,14
+configuration,14
+composer,14
+components,14
+collective,14
+certification,14
+bus,14
+basis,14
+available,14
+automation,14
+automated,14
+associated,14
+assignment,14
+appropriate,14
+against,14
+aervice,14
+adminstrators,14
+activation,14
+action,14
+VMs,14
+VM,14
+VLAN,14
+SDK,14
+SBG,14
+SAM,14
+RUBY,14
+Policy,14
+PODS,14
+Ops,14
+GFP,14
+F5FW,14
diff --git a/ui/src/main/webapp/static/fusion/sample/html/donut_d3.html b/ui/src/main/webapp/static/fusion/sample/html/donut_d3.html
new file mode 100644 (file)
index 0000000..9967849
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+body {
+    font: 10px sans-serif;
+}
+
+svg {
+    padding: 10px 0 0 10px;
+}
+
+.arc {
+    stroke: #fff;
+}
+
+.slice text {
+    font-size: 16pt;
+    font-family: Arial;
+}
+</style>
+<body>
+ <script src="../../d3/js/d3.js"></script>
+
+ <script>
+
+var radius = 74,
+    padding = 10;
+
+var width = 200,
+    height = 200;
+
+var outerRadius = height / 2 - 20,
+    innerRadius = outerRadius / 3,
+    cornerRadius = 10;
+//var color = d3.scale.ordinal()
+  //  .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);
+  var color = d3.scale.category10();
+  var dataURL = "data/speedometer3.csv";
+
+
+</script>
+ <script src="js/donut.min.js"></script>
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/js/area_chart.min.js b/ui/src/main/webapp/static/fusion/sample/html/js/area_chart.min.js
new file mode 100644 (file)
index 0000000..9b3decb
--- /dev/null
@@ -0,0 +1 @@
+function redrawAreaChart(){d3.select("#areaChart svg").datum(historicalBarChart).call(area_chart)}var area_chart;nv.addGraph(function(){return area_chart=nv.models.stackedAreaChart().showControls(!1).margin({top:30,right:60,bottom:50,left:100}).showLegend(!1).yAxisTooltipFormat(d3.format(",.1f")).x(function(a){return a.x}).y(function(a){return a.y}).color(d3.scale.category10().range()),area_chart.xAxis.axisLabel("").staggerLabels(!1).showMaxMin(!1).rotateLabels(90).tickFormat(function(a){return d3.time.format("%b %y")(new Date(a))}),area_chart.yAxis.axisLabel("").tickFormat(d3.format(",.1f")),d3.select("#areaChart svg").datum(historicalBarChart).call(area_chart),nv.utils.windowResize(area_chart.update),area_chart}),redrawAreaChart(),historicalBarChart.length<=0&&(document.getElementById("areaChart").innerHTML="<div id='noData'><b>No Data Available</b></div>",document.getElementById("areaChart").className="nodatadiv",document.getElementById("nodata").className="nodatainner");
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/js/donut.min.js b/ui/src/main/webapp/static/fusion/sample/html/js/donut.min.js
new file mode 100644 (file)
index 0000000..60c4fd4
--- /dev/null
@@ -0,0 +1 @@
+function angle(t){var e=90*(t.startAngle+t.endAngle)/Math.PI-90;return e>90?e-180:e}function arcTween(t,e){return function(){d3.select(this).transition().delay(e).attrTween("d",function(e){var r=d3.interpolate(e.outerRadius,t);return function(t){return e.outerRadius=r(t),arc(e)}})}}var arc=d3.svg.arc().padRadius(outerRadius).innerRadius(innerRadius),pie=d3.layout.pie().sort(null).padAngle(.02).value(function(t){return t.performance});d3.csv(dataURL,function(t,e){color.domain(d3.keys(e[0]).filter(function(t){return"YEARMONTH"!==t})),e.forEach(function(t){t.performance=color.domain().map(function(e){return{name:e,performance:+t[e]}})});var r=d3.select("body").append("svg").attr("class","legend").attr("width",radius).attr("height",2*radius).selectAll("g").data(color.domain().slice().reverse()).enter().append("g").attr("transform",function(t,e){return"translate(0,"+20*e+")"});r.append("rect").attr("width",18).attr("height",18).style("fill",color),r.append("text").attr("x",24).attr("y",9).attr("dy",".35em").text(function(t){return t});var a=d3.select("body").append("svg").attr("width",width).attr("height",height).data(e).append("g").attr("transform","translate("+radius+","+height/2+")"),n=a.selectAll("g.slice").data(function(t){return pie(t.performance)}).enter().append("g").attr("class","slice");n.append("path").each(function(t){t.outerRadius=outerRadius-10}).attr("class","arc").attr("d",arc).style("fill",function(t){return color(t.data.name)}).on("mouseover",arcTween(outerRadius,0)).on("mouseout",arcTween(outerRadius-10,150)),n.append("text").attr("dy",".35em").attr("transform",function(t){return t.outerRadius=outerRadius,t.innerRadius=outerRadius/2,"translate("+arc.centroid(t)+")rotate("+angle(t)+")"}).attr("text-anchor","middle").style("fill","white").style("font","bold 12px Arial").text(function(t){return t.value}),a.append("text").attr("dy",".35em").style("text-anchor","middle").text(function(t){return t.YEARMONTH})});
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/js/gauges.min.js b/ui/src/main/webapp/static/fusion/sample/html/js/gauges.min.js
new file mode 100644 (file)
index 0000000..c0fd748
--- /dev/null
@@ -0,0 +1 @@
+function Gauge(t,i){this.placeholderName=t;var n=this;this.configure=function(t){this.config=t,this.config.size=.9*this.config.size,this.config.raduis=.97*this.config.size/2,this.config.cx=this.config.size/2,this.config.cy=this.config.size/2,this.config.min=void 0!=t.min?t.min:0,this.config.max=void 0!=t.max?t.max:100,this.config.range=this.config.max-this.config.min,this.config.majorTicks=t.majorTicks||5,this.config.minorTicks=t.minorTicks||2,this.config.greenColor=t.greenColor||"#109618",this.config.yellowColor=t.yellowColor||"#FF9900",this.config.redColor=t.redColor||"#DC3912",this.config.transitionDuration=t.transitionDuration||500},this.render=function(){this.body=d3.select("#"+this.placeholderName).append("svg:svg").attr("class","gauge").attr("width",this.config.size).attr("height",this.config.size),this.body.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",this.config.raduis).style("fill","#ccc").style("stroke","#000").style("stroke-width","0.5px"),this.body.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",.9*this.config.raduis).style("fill","#fff").style("stroke","#e0e0e0").style("stroke-width","2px");for(var t in this.config.greenZones)this.drawBand(this.config.greenZones[t].from,this.config.greenZones[t].to,n.config.greenColor);for(var t in this.config.yellowZones)this.drawBand(this.config.yellowZones[t].from,this.config.yellowZones[t].to,n.config.yellowColor);for(var t in this.config.redZones)this.drawBand(this.config.redZones[t].from,this.config.redZones[t].to,n.config.redColor);if(void 0!=this.config.label){var i=Math.round(this.config.size/12);this.body.append("svg:text").attr("x",this.config.cx).attr("y",this.config.cy/2+i/2).attr("dy",i/2).attr("text-anchor","middle").text(this.config.label).style("font-size",i+"px").style("fill","#333").style("stroke-width","0px")}for(var i=Math.round(this.config.size/16),e=this.config.range/(this.config.majorTicks-1),o=this.config.min;o<=this.config.max;o+=e){for(var a=e/this.config.minorTicks,r=o+a;r<Math.min(o+e,this.config.max);r+=a){var s=this.valueToPoint(r,.75),c=this.valueToPoint(r,.85);this.body.append("svg:line").attr("x1",s.x).attr("y1",s.y).attr("x2",c.x).attr("y2",c.y).style("stroke","#666").style("stroke-width","1px")}var s=this.valueToPoint(o,.7),c=this.valueToPoint(o,.85);if(this.body.append("svg:line").attr("x1",s.x).attr("y1",s.y).attr("x2",c.x).attr("y2",c.y).style("stroke","#333").style("stroke-width","2px"),o==this.config.min||o==this.config.max){var g=this.valueToPoint(o,.63);this.body.append("svg:text").attr("x",g.x).attr("y",g.y).attr("dy",i/3).attr("text-anchor",o==this.config.min?"start":"end").text(o).style("font-size",i+"px").style("fill","#333").style("stroke-width","0px")}}var f=this.body.append("svg:g").attr("class","pointerContainer"),h=(this.config.min+this.config.max)/2,l=this.buildPointerPath(h),d=d3.svg.line().x(function(t){return t.x}).y(function(t){return t.y}).interpolate("basis");f.selectAll("path").data([l]).enter().append("svg:path").attr("d",d).style("fill","#dc3912").style("stroke","#c63310").style("fill-opacity",.7),f.append("svg:circle").attr("cx",this.config.cx).attr("cy",this.config.cy).attr("r",.12*this.config.raduis).style("fill","#4684EE").style("stroke","#666").style("opacity",1);var i=Math.round(this.config.size/10);f.selectAll("text").data([h]).enter().append("svg:text").attr("x",this.config.cx).attr("y",this.config.size-this.config.cy/4-i).attr("dy",i/2).attr("text-anchor","middle").style("font-size",i+"px").style("fill","#000").style("stroke-width","0px"),this.redraw(this.config.min,0)},this.buildPointerPath=function(t){function i(t,i){var e=n.valueToPoint(t,i);return e.x-=n.config.cx,e.y-=n.config.cy,e}var e=this.config.range/13,o=i(t,.85),a=i(t-e,.12),r=i(t+e,.12),s=t-this.config.range*(1/.75)/2,c=i(s,.28),g=i(s-e,.12),f=i(s+e,.12);return[o,a,f,c,g,r,o]},this.drawBand=function(t,i,e){0>=i-t||this.body.append("svg:path").style("fill",e).attr("d",d3.svg.arc().startAngle(this.valueToRadians(t)).endAngle(this.valueToRadians(i)).innerRadius(.65*this.config.raduis).outerRadius(.85*this.config.raduis)).attr("transform",function(){return"translate("+n.config.cx+", "+n.config.cy+") rotate(270)"})},this.redraw=function(t,i,e){var o=this.body.select(".pointerContainer"),a=o.selectAll("text");y=a.attr("y"),dy=parseFloat(a.attr("dy")),a.selectAll("tspan").remove(),a.append("tspan").attr("x",45).attr("dy",0).text(Math.round(t)),a.append("tspan").attr("x",45).attr("dy",10).text(i),o.selectAll("text").style("fill",function(){var i=n.config.max-n.config.min;return Math.round(t)>.9*i?"#DC3912":Math.round(t)>.5*i&&Math.round(t)<.9*i?"#FF9900":"#000000"});var r=o.selectAll("path");r.transition().duration(void 0!=e?e:this.config.transitionDuration).attrTween("transform",function(){var i=t;t>n.config.max?i=n.config.max+.02*n.config.range:t<n.config.min&&(i=n.config.min-.02*n.config.range);var e=n.valueToDegrees(i)-90,o=n._currentRotation||e;return n._currentRotation=e,function(t){var i=o+(e-o)*t;return"translate("+n.config.cx+", "+n.config.cy+") rotate("+i+")"}})},this.valueToDegrees=function(t){return t/this.config.range*270-(this.config.min/this.config.range*270+45)},this.valueToRadians=function(t){return this.valueToDegrees(t)*Math.PI/180},this.valueToPoint=function(t,i){return{x:this.config.cx-this.config.raduis*i*Math.cos(this.valueToRadians(t)),y:this.config.cy-this.config.raduis*i*Math.sin(this.valueToRadians(t))}},this.configure(i)}function createGauge(t,i,n,e){var o={size:100,label:i,min:void 0!=n?n:0,max:void 0!=e?e:100,minorTicks:5},a=o.max-o.min;o.yellowZones=[{from:o.min+.5*a,to:o.min+.9*a}],o.redZones=[{from:o.min+.9*a,to:o.max}],gauges[t]=new Gauge(t,o),gauges[t].render()}function createGauges(){createGauge("Bedminster","Bedminster",0,50),createGauge("Piscataway","Piscataway",0,50),createGauge("Middletown","Middletown",0,50),createGauge("Paramus","Paramus",0,50)}function updateGauges(t){for(var i in gauges){var n=getValue(i,t),e=getDate1(i,t);n&&gauges[i].redraw(n,e,100)}}function getValue(gauge_id,index){var d=dataset[index];return eval("d."+gauge_id)}function getDate1(t,i){var n=dataset[i];return n.YEARMONTH}function getROUTER_CPU_Value(t){d3.csv(dataURL,function(i){i.forEach(function(i,n){return n==t?i.ROUTER_CPU:void 0})})}function getAP_CPU_Value(t){d3.csv(dataURL,function(i){i.forEach(function(i,n){return n==t?i.AP_CPU:void 0})})}function updateData(){for(var t=0;t<recordLength;t++);}function initialize(){createGauges(),d3.csv(dataURL,function(t){dataset=t,recordLength=t.length,dataset.some(function(t,i){return 1==i?(updateGauges(i),1==i):void 0});var i=1e3,n=2,e=function(){return function(){return updateGauges(n++),n<recordLength?(d3.timer(e(),i),!0):(n=0,d3.timer(e(),i),!0)}};d3.timer(e(),i)})}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/js/line_chart.min.js b/ui/src/main/webapp/static/fusion/sample/html/js/line_chart.min.js
new file mode 100644 (file)
index 0000000..e501260
--- /dev/null
@@ -0,0 +1 @@
+function redrawLineChart(){d3.select("#lineChart svg").datum(historicalBarChart).call(line_chart)}var line_chart;nv.addGraph(function(){return line_chart=nv.models.multiChart().dualaxis(!1).legendPos("top").margin({top:30,right:60,bottom:50,left:100}).showLegend(!1).color(d3.scale.category10().range()),line_chart.lines1.forceY([0,34]),line_chart.lines2.forceY([0,1]),line_chart.xAxis.axisLabel("").staggerLabels(!1).showMaxMin(!1).rotateLabels(90).tickFormat(function(a){return d3.time.format("%b %y")(new Date(a))}),line_chart.yAxis1.axisLabel("").tickFormat(d3.format(",.1f")),d3.select("#lineChart svg").datum(historicalBarChart).call(line_chart),nv.utils.windowResize(line_chart.update),line_chart}),redrawLineChart(),historicalBarChart.length<=0&&(document.getElementById("lineChart").innerHTML="<div id='noData2'><b>No Data Available</b></div>",document.getElementById("lineChart").className="nodatadiv",document.getElementById("nodata2").className="nodatainner");
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/js/pie_chart.min.js b/ui/src/main/webapp/static/fusion/sample/html/js/pie_chart.min.js
new file mode 100644 (file)
index 0000000..f78eec7
--- /dev/null
@@ -0,0 +1 @@
+function redraw(){d3.select("#chart423 svg").datum(historicalBarChart).transition().duration(500).call(chart)}var chart;nv.addGraph(function(){return chart=nv.models.pieChart().margin({top:30,right:60,bottom:50,left:100}).x(function(t){return t.key}).y(function(t){return t.y}),chart.showLegend(!1),d3.select("#chart423 svg").datum(historicalBarChart).transition().duration(1200).call(chart),nv.utils.windowResize(chart.update),chart}),setInterval(function(){redraw()},1500),historicalBarChart.length<=0&&(document.getElementById("chart423").innerHTML="<div id='noData'><b>No Data Available</b></div>",document.getElementById("chart423").className="nodatadiv",document.getElementById("nodata").className="nodatainner");
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/js/worddata.min.js b/ui/src/main/webapp/static/fusion/sample/html/js/worddata.min.js
new file mode 100644 (file)
index 0000000..6b82746
--- /dev/null
@@ -0,0 +1 @@
+function dataViz(t){function e(t){var e=d3.select("svg").append("g").attr("id","wordCloudG").attr("transform","translate(210,175)");e.selectAll("text").data(t).enter().append("text").style("font-size",function(t){return 1*t.size+"px"}).style("fill",function(t){return keywords.indexOf(t.text)>-1?"red":"black"}).style("opacity",.75).attr("text-anchor","middle").attr("transform",function(t){return"translate("+[t.x,t.y]+")rotate("+t.rotate+")"}).text(function(t){return t.text})}d3.layout.cloud().size([420,350]).words(t).rotate(function(t){return t.text.length>5?0:90}).fontSize(function(t){return wordScale(t.frequency)}).on("end",e).start()}d3.csv(dataURL,function(t){dataViz(t)}),wordScale=d3.scale.linear().domain([0,100]).range([0,70]).clamp(!0);
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/line_chart.html b/ui/src/main/webapp/static/fusion/sample/html/line_chart.html
new file mode 100644 (file)
index 0000000..393cc9c
--- /dev/null
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<meta http-equiv="content-type" content="text/html; charset=UTF8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<link href="../../d3/css/nv.d3.css" rel="stylesheet" type="text/css">
+<style>
+body {
+    overflow-y: scroll;
+}
+
+text {
+    font: 12px sans-serif;
+}
+
+svg {
+    display: block;
+}
+
+#chart461 svg {
+    height: 175px;
+    width: 300px;
+    min-width: 100px;
+    min-height: 100px;
+}
+
+tr.z-row-over>td.z-row-inner, tr.z-row-over>.z-cell {
+    background-color: rgb(255, 255, 255);
+}
+
+.nodatadiv {
+    display: table-cell;
+    width: 700px;
+    height: 370px;
+    text-align: center;
+    vertical-align: middle;
+}
+
+.nodatainner {
+    padding: 10px;
+}
+</style>
+<body>
+ <div align="center">
+  <H3></H3>
+ </div>
+ <div id="chart461">
+  <svg></svg>
+ </div>
+ <script src="../../d3/js/d3.v3.min.js"></script>
+ <script src="../../d3/js/nv.d3.min.js"></script>
+ <script src="../../d3/js/models/axis.min.js"></script>
+ <script>
+historicalBarChart = [
+ { "type":"line", "key": "AP_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":2.13}, { "x":1388552400000 , "y":5.0}, { "x":1388552400000 , "y":2.36}, { "x":1388552400000 , "y":10.0}, { "x":1391230800000 , "y":3.15}, { "x":1391230800000 , "y":2.88}, { "x":1391230800000 , "y":3.0}, { "x":1391230800000 , "y":4.0}, { "x":1393650000000 , "y":8.0}, { "x":1393650000000 , "y":3.93}, { "x":1393650000000 , "y":4.27}, { "x":1393650000000 , "y":4.0}, { "x":1396324800000 , "y":4.25}, { "x":1396324800000 , "y":5.35}, { "x":1396324800000 , "y":5.92}, { "x":1396324800000 , "y":12.0}, { "x":1398916800000 , "y":5.55}, { "x":1398916800000 , "y":4.89}, { "x":1398916800000 , "y":5.01}, { "x":1398916800000 , "y":3.27}, { "x":1401595200000 , "y":6.27}, { "x":1401595200000 , "y":9.17}, { "x":1401595200000 , "y":9.31}, { "x":1401595200000 , "y":6.07}, { "x":1404187200000 , "y":8.37}, { "x":1404187200000 , "y":8.11}, { "x":1404187200000 , "y":8.84}, { "x":1404187200000 , "y":8.93}, { "x":1406865600000 , "y":11.79}, { "x":1406865600000 , "y":12.22}, { "x":1406865600000 , "y":12.6}, { "x":1406865600000 , "y":11.61}, { "x":1409544000000 , "y":15.27}, { "x":1409544000000 , "y":19.09}, { "x":1409544000000 , "y":16.09}, { "x":1409544000000 , "y":18.66}, { "x":1412136000000 , "y":18.4}, { "x":1412136000000 , "y":22.05}, { "x":1412136000000 , "y":21.66}, { "x":1412136000000 , "y":19.04}, { "x":1414814400000 , "y":19.13}, { "x":1414814400000 , "y":19.61}, { "x":1414814400000 , "y":17.61}, { "x":1414814400000 , "y":17.5}, { "x":1417410000000 , "y":19.0}, { "x":1417410000000 , "y":15.73}, { "x":1420088400000 , "y":9.67}, { "x":1420088400000 , "y":15.19}, { "x":1420088400000 , "y":15.02}, { "x":1420088400000 , "y":9.62333333333333}, { "x":1422766800000 , "y":16.95}, { "x":1422766800000 , "y":14.29}, { "x":1425186000000 , "y":12.9}, { "x":1425186000000 , "y":16.1166666666667} ] } ,
+ { "type":"line", "key": "ROUTER_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":3.0}, { "x":1388552400000 , "y":4.0}, { "x":1388552400000 , "y":4.89}, { "x":1388552400000 , "y":7.0}, { "x":1391230800000 , "y":4.57}, { "x":1391230800000 , "y":4.0}, { "x":1391230800000 , "y":4.0}, { "x":1391230800000 , "y":7.0}, { "x":1393650000000 , "y":7.0}, { "x":1393650000000 , "y":4.18}, { "x":1393650000000 , "y":5.0}, { "x":1393650000000 , "y":5.0}, { "x":1396324800000 , "y":5.0}, { "x":1396324800000 , "y":5.0}, { "x":1396324800000 , "y":5.06}, { "x":1396324800000 , "y":6.0}, { "x":1398916800000 , "y":5.0}, { "x":1398916800000 , "y":5.0}, { "x":1398916800000 , "y":5.0}, { "x":1398916800000 , "y":5.0}, { "x":1401595200000 , "y":6.0}, { "x":1401595200000 , "y":6.09}, { "x":1401595200000 , "y":6.0}, { "x":1401595200000 , "y":6.0}, { "x":1404187200000 , "y":6.36}, { "x":1404187200000 , "y":7.0}, { "x":1404187200000 , "y":7.0}, { "x":1404187200000 , "y":7.0}, { "x":1406865600000 , "y":7.0}, { "x":1406865600000 , "y":7.02}, { "x":1406865600000 , "y":7.24}, { "x":1406865600000 , "y":7.0}, { "x":1409544000000 , "y":8.23}, { "x":1409544000000 , "y":8.11}, { "x":1409544000000 , "y":8.12}, { "x":1409544000000 , "y":8.03}, { "x":1412136000000 , "y":9.0}, { "x":1412136000000 , "y":8.93}, { "x":1412136000000 , "y":8.57}, { "x":1412136000000 , "y":9.0}, { "x":1414814400000 , "y":5.97}, { "x":1414814400000 , "y":6.0}, { "x":1414814400000 , "y":9.0}, { "x":1414814400000 , "y":9.0}, { "x":1417410000000 , "y":9.0}, { "x":1417410000000 , "y":8.78}, { "x":1420088400000 , "y":3.0}, { "x":1420088400000 , "y":2.01}, { "x":1420088400000 , "y":3.0}, { "x":1420088400000 , "y":3.01}, { "x":1422766800000 , "y":2.67}, { "x":1422766800000 , "y":2.0}, { "x":1425186000000 , "y":2.8}, { "x":1425186000000 , "y":3.63333333333333} ] } ,
+ { "type":"line", "key": "SCTP_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":7.0}, { "x":1388552400000 , "y":10.0}, { "x":1388552400000 , "y":8.27}, { "x":1388552400000 , "y":8.0}, { "x":1391230800000 , "y":10.02}, { "x":1391230800000 , "y":8.04}, { "x":1391230800000 , "y":9.0}, { "x":1391230800000 , "y":10.0}, { "x":1393650000000 , "y":12.0}, { "x":1393650000000 , "y":10.04}, { "x":1393650000000 , "y":11.16}, { "x":1393650000000 , "y":10.0}, { "x":1396324800000 , "y":10.7}, { "x":1396324800000 , "y":13.31}, { "x":1396324800000 , "y":12.73}, { "x":1396324800000 , "y":9.0}, { "x":1398916800000 , "y":12.41}, { "x":1398916800000 , "y":11.95}, { "x":1398916800000 , "y":12.82}, { "x":1398916800000 , "y":9.58}, { "x":1401595200000 , "y":11.28}, { "x":1401595200000 , "y":14.01}, { "x":1401595200000 , "y":14.63}, { "x":1401595200000 , "y":11.83}, { "x":1404187200000 , "y":14.06}, { "x":1404187200000 , "y":13.96}, { "x":1404187200000 , "y":14.66}, { "x":1404187200000 , "y":14.36}, { "x":1406865600000 , "y":16.6}, { "x":1406865600000 , "y":16.95}, { "x":1406865600000 , "y":17.11}, { "x":1406865600000 , "y":15.94}, { "x":1409544000000 , "y":19.86}, { "x":1409544000000 , "y":22.97}, { "x":1409544000000 , "y":21.56}, { "x":1409544000000 , "y":24.55}, { "x":1412136000000 , "y":22.66}, { "x":1412136000000 , "y":26.79}, { "x":1412136000000 , "y":26.54}, { "x":1412136000000 , "y":25.35}, { "x":1414814400000 , "y":21.0}, { "x":1414814400000 , "y":20.35}, { "x":1414814400000 , "y":21.93}, { "x":1414814400000 , "y":23.63}, { "x":1417410000000 , "y":24.0}, { "x":1417410000000 , "y":21.43}, { "x":1420088400000 , "y":12.63}, { "x":1420088400000 , "y":25.14}, { "x":1420088400000 , "y":21.85}, { "x":1420088400000 , "y":12.5766666666667}, { "x":1422766800000 , "y":26.3}, { "x":1422766800000 , "y":24.4}, { "x":1425186000000 , "y":23.3833333333333}, { "x":1425186000000 , "y":24.5833333333333} ] } ,
+ { "type":"line", "key": "DP_CPU", "yAxis": "1","values": [{ "x":1388552400000 , "y":2.0}, { "x":1388552400000 , "y":5.0}, { "x":1388552400000 , "y":2.17}, { "x":1388552400000 , "y":2.0}, { "x":1391230800000 , "y":3.01}, { "x":1391230800000 , "y":2.56}, { "x":1391230800000 , "y":3.0}, { "x":1391230800000 , "y":9.0}, { "x":1393650000000 , "y":10.0}, { "x":1393650000000 , "y":3.64}, { "x":1393650000000 , "y":4.06}, { "x":1393650000000 , "y":4.0}, { "x":1396324800000 , "y":4.04}, { "x":1396324800000 , "y":5.11}, { "x":1396324800000 , "y":5.9}, { "x":1396324800000 , "y":8.0}, { "x":1398916800000 , "y":5.08}, { "x":1398916800000 , "y":4.65}, { "x":1398916800000 , "y":4.74}, { "x":1398916800000 , "y":2.98}, { "x":1401595200000 , "y":6.13}, { "x":1401595200000 , "y":8.98}, { "x":1401595200000 , "y":9.22}, { "x":1401595200000 , "y":5.84}, { "x":1404187200000 , "y":8.12}, { "x":1404187200000 , "y":7.89}, { "x":1404187200000 , "y":8.41}, { "x":1404187200000 , "y":8.47}, { "x":1406865600000 , "y":11.06}, { "x":1406865600000 , "y":11.84}, { "x":1406865600000 , "y":11.92}, { "x":1406865600000 , "y":10.8}, { "x":1409544000000 , "y":14.58}, { "x":1409544000000 , "y":18.39}, { "x":1409544000000 , "y":15.5}, { "x":1409544000000 , "y":18.33}, { "x":1412136000000 , "y":18.01}, { "x":1412136000000 , "y":21.3}, { "x":1412136000000 , "y":21.11}, { "x":1412136000000 , "y":18.37}, { "x":1414814400000 , "y":18.59}, { "x":1414814400000 , "y":18.81}, { "x":1414814400000 , "y":17.13}, { "x":1414814400000 , "y":16.92}, { "x":1417410000000 , "y":18.0}, { "x":1417410000000 , "y":15.18}, { "x":1420088400000 , "y":9.16}, { "x":1420088400000 , "y":12.13}, { "x":1420088400000 , "y":11.76}, { "x":1420088400000 , "y":9.31}, { "x":1422766800000 , "y":13.47}, { "x":1422766800000 , "y":13.41}, { "x":1425186000000 , "y":12.2333333333333}, { "x":1425186000000 , "y":12.4} ] }
+];
+
+</script>
+ <script src="js/line_chart.min.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/pie_chart.html b/ui/src/main/webapp/static/fusion/sample/html/pie_chart.html
new file mode 100644 (file)
index 0000000..180066e
--- /dev/null
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<meta http-equiv="content-type" content="text/html; charset=UTF8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<link href="../../d3/css/nv.d3.css" rel="stylesheet" type="text/css">
+<style>
+body {
+    overflow-y: scroll;
+}
+
+text {
+    font: 12px sans-serif;
+}
+
+tr.z-row-over>td.z-row-inner, tr.z-row-over>.z-cell {
+    background-color: rgb(255, 255, 255);
+}
+
+svg {
+    display: block;
+}
+
+#chart423 svg {
+    height: 275px;
+    width: 300px;
+    min-width: 100px;
+    min-height: 100px;
+}
+</style>
+<body>
+ <div id="chart423">
+  <svg></svg>
+ </div>
+ <script src="../../d3/js/d3.v3.min.js"></script>
+ <script src="../../d3/js/nv.d3.min.js"></script>
+ <script src="../../d3/js/models/legend.js"></script>
+ <script src="../../d3/js/models/pie.js"></script>
+ <script src="../../d3/js/models/pieChart.js"></script>
+ <script src="../../d3/js/utils.js"></script>
+ <script>
+historicalBarChart = [
+{ "key":"Bedminster", "y":8.27},
+{ "key":"Middletown", "y":2.36},
+{ "key":"Paramus", "y":2.17},
+{ "key":"Piscataway", "y":4.89}
+];
+
+</script>
+ <script src="js/pie_chart.min.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/html/wordcloud.html b/ui/src/main/webapp/static/fusion/sample/html/wordcloud.html
new file mode 100644 (file)
index 0000000..8619599
--- /dev/null
@@ -0,0 +1,35 @@
+<html>
+<head>
+<title>Word Cloud Example</title>
+<meta charset="utf-8" />
+<script src="../../d3/js/d3.v3.min.js" type="text/JavaScript"></script>
+<script src="../../d3/js/colorbrewer.js" type="text/JavaScript"></script>
+<script src="../../d3/js/d3.layout.cloud.js" type="text/JavaScript"></script>
+
+</head>
+<style>
+svg {
+    height: 350px;
+    width: 420px;
+    border: 1px solid gray;
+}
+</style>
+<body>
+
+ <div id="viz">
+  <svg>
+  </svg>
+ </div>
+ <div id="controls" />
+</body>
+<footer>
+
+ <script>
+var cloudSize = 200;
+var dataURL = "data/worddata.csv";
+var keywords = ["VNF", "portal", "D2.0", "service", "management", "ECOMP"];
+</script>
+ <script src="js/worddata.min.js" type="text/JavaScript"></script>
+</footer>
+
+</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_drive_test_map.png b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_drive_test_map.png
new file mode 100644 (file)
index 0000000..78a8873
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_drive_test_map.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_county.png b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_county.png
new file mode 100644 (file)
index 0000000..df471d7
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_county.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_regression.png b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_regression.png
new file mode 100644 (file)
index 0000000..e59fc18
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_regression.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_ios_throughput.png b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_ios_throughput.png
new file mode 100644 (file)
index 0000000..76a2d2b
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_ios_throughput.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map.png b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map.png
new file mode 100644 (file)
index 0000000..174ef9b
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map_legend.png b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map_legend.png
new file mode 100644 (file)
index 0000000..f7f2719
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map_legend.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png
new file mode 100644 (file)
index 0000000..ee0ddef
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/1_mon.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/1_mon.png
new file mode 100644 (file)
index 0000000..d46eee5
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/1_mon.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/2_tue.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/2_tue.png
new file mode 100644 (file)
index 0000000..ed82aad
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/2_tue.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/3_wed.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/3_wed.png
new file mode 100644 (file)
index 0000000..8f8c032
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/3_wed.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/4_thu.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/4_thu.png
new file mode 100644 (file)
index 0000000..750dca5
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/4_thu.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/5_fri.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/5_fri.png
new file mode 100644 (file)
index 0000000..599e51f
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/5_fri.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/6_sat.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/6_sat.png
new file mode 100644 (file)
index 0000000..70323ea
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/6_sat.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/7_sun.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/7_sun.png
new file mode 100644 (file)
index 0000000..9d579d6
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/7_sun.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_IN.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_IN.png
new file mode 100644 (file)
index 0000000..af1ac0a
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_IN.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_OUT.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_OUT.png
new file mode 100644 (file)
index 0000000..935b538
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_OUT.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat.png
new file mode 100644 (file)
index 0000000..916a655
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Def.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Def.png
new file mode 100644 (file)
index 0000000..a8b516d
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Def.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Priority.png b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Priority.png
new file mode 100644 (file)
index 0000000..2cf8141
Binary files /dev/null and b/ui/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Priority.png differ
diff --git a/ui/src/main/webapp/static/fusion/sample/js/FusionCharts.js b/ui/src/main/webapp/static/fusion/sample/js/FusionCharts.js
new file mode 100644 (file)
index 0000000..f5f60ad
--- /dev/null
@@ -0,0 +1,430 @@
+/**
+ * FusionCharts: Flash Player detection and Chart embedding. Version 1.2.3F ( 22
+ * November 2008) - Specialized for FusionChartsFREE Checking Flash Version >=6
+ * and added updateChartXML() for FREE Charts. Version: 1.2.3 (1st September,
+ * 2008) - Added Fix for % and & characters, scaled dimensions, fixes in to
+ * properly handling of double quotes and single quotes in setDataXML()
+ * function. Version: 1.2.2 (10th July, 2008) - Added Fix for % scaled
+ * dimensions, fixes in setDataXML() and setDataURL() functions Version: 1.2.1
+ * (21st December, 2007) - Added setting up Transparent/opaque mode:
+ * setTransparent() function Version: 1.2 (1st November, 2007) - Added FORM
+ * fixes for IE Version: 1.1 (29th June, 2007) - Added Player detection, New
+ * conditional fixes for IE
+ *
+ * Morphed from SWFObject (http://blog.deconcept.com/swfobject/) under MIT
+ * License: http://www.opensource.org/licenses/mit-license.php
+ *
+ */
+if (typeof infosoftglobal == "undefined")
+    var infosoftglobal = new Object();
+if (typeof infosoftglobal.FusionChartsUtil == "undefined")
+    infosoftglobal.FusionChartsUtil = new Object();
+infosoftglobal.FusionCharts = function(swf, id, w, h, debugMode,
+        registerWithJS, c, scaleMode, lang, detectFlashVersion,
+        autoInstallRedirect) {
+    if (!document.getElementById) {
+        return;
+    }
+
+    // Flag to see whether data has been set initially
+    this.initialDataSet = false;
+
+    // Create container objects
+    this.params = new Object();
+    this.variables = new Object();
+    this.attributes = new Array();
+
+    // Set attributes for the SWF
+    if (swf) {
+        this.setAttribute('swf', swf);
+    }
+    if (id) {
+        this.setAttribute('id', id);
+    }
+
+    w = w.toString().replace(/\%$/, "%25");
+    if (w) {
+        this.setAttribute('width', w);
+    }
+    h = h.toString().replace(/\%$/, "%25");
+    if (h) {
+        this.setAttribute('height', h);
+    }
+
+    // Set background color
+    if (c) {
+        this.addParam('bgcolor', c);
+    }
+
+    // Set Quality
+    this.addParam('quality', 'high');
+
+    // Add scripting access parameter
+    this.addParam('allowScriptAccess', 'always');
+
+    // Pass width and height to be appended as chartWidth and chartHeight
+    this.addVariable('chartWidth', w);
+    this.addVariable('chartHeight', h);
+
+    // Whether in debug mode
+    debugMode = debugMode ? debugMode : 0;
+    this.addVariable('debugMode', debugMode);
+    // Pass DOM ID to Chart
+    this.addVariable('DOMId', id);
+    // Whether to registed with JavaScript
+    registerWithJS = registerWithJS ? registerWithJS : 0;
+    this.addVariable('registerWithJS', registerWithJS);
+
+    // Scale Mode of chart
+    scaleMode = scaleMode ? scaleMode : 'noScale';
+    this.addVariable('scaleMode', scaleMode);
+
+    // Application Message Language
+    lang = lang ? lang : 'EN';
+    this.addVariable('lang', lang);
+
+    // Whether to auto detect and re-direct to Flash Player installation
+    this.detectFlashVersion = detectFlashVersion ? detectFlashVersion : 1;
+    this.autoInstallRedirect = autoInstallRedirect ? autoInstallRedirect : 1;
+
+    // Ger Flash Player version
+    this.installedVer = infosoftglobal.FusionChartsUtil.getPlayerVersion();
+
+    if (!window.opera && document.all && this.installedVer.major > 7) {
+        // Only add the onunload cleanup if the Flash Player version supports
+        // External Interface and we are in IE
+        infosoftglobal.FusionCharts.doPrepUnload = true;
+    }
+}
+
+infosoftglobal.FusionCharts.prototype = {
+    setAttribute : function(name, value) {
+        this.attributes[name] = value;
+    },
+    getAttribute : function(name) {
+        return this.attributes[name];
+    },
+    addParam : function(name, value) {
+        this.params[name] = value;
+    },
+    getParams : function() {
+        return this.params;
+    },
+    addVariable : function(name, value) {
+        this.variables[name] = value;
+    },
+    getVariable : function(name) {
+        return this.variables[name];
+    },
+    getVariables : function() {
+        return this.variables;
+    },
+    getVariablePairs : function() {
+        var variablePairs = new Array();
+        var key;
+        var variables = this.getVariables();
+        for (key in variables) {
+            variablePairs.push(key + "=" + variables[key]);
+        }
+        return variablePairs;
+    },
+    getSWFHTML : function() {
+        var swfNode = "";
+        if (navigator.plugins && navigator.mimeTypes
+                && navigator.mimeTypes.length) {
+            // netscape plugin architecture
+            swfNode = '<embed type="application/x-shockwave-flash" src="'
+                    + this.getAttribute('swf') + '" width="'
+                    + this.getAttribute('width') + '" height="'
+                    + this.getAttribute('height') + '"  ';
+            swfNode += ' id="' + this.getAttribute('id') + '" name="'
+                    + this.getAttribute('id') + '" ';
+            var params = this.getParams();
+            for ( var key in params) {
+                swfNode += [ key ] + '="' + params[key] + '" ';
+            }
+            var pairs = this.getVariablePairs().join("&");
+            if (pairs.length > 0) {
+                swfNode += 'flashvars="' + pairs + '"';
+            }
+            swfNode += '/>';
+        } else { // PC IE
+            swfNode = '<object id="'
+                    + this.getAttribute('id')
+                    + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'
+                    + this.getAttribute('width') + '" height="'
+                    + this.getAttribute('height') + '">';
+            swfNode += '<param name="movie" value="' + this.getAttribute('swf')
+                    + '" />';
+            var params = this.getParams();
+            for ( var key in params) {
+                swfNode += '<param name="' + key + '" value="' + params[key]
+                        + '" />';
+            }
+            var pairs = this.getVariablePairs().join("&");
+            if (pairs.length > 0) {
+                swfNode += '<param name="flashvars" value="' + pairs + '" />';
+            }
+            swfNode += "</object>";
+        }
+        return swfNode;
+    },
+    setDataURL : function(strDataURL) {
+        // This method sets the data URL for the chart.
+        // If being set initially
+        if (this.initialDataSet == false) {
+            this.addVariable('dataURL', strDataURL);
+            // Update flag
+            this.initialDataSet = true;
+        } else {
+            // Else, we update the chart data using External Interface
+            // Get reference to chart object
+            var chartObj = infosoftglobal.FusionChartsUtil.getChartObject(this
+                    .getAttribute('id'));
+
+            if (!chartObj.setDataURL) {
+                __flash__addCallback(chartObj, "setDataURL");
+            }
+
+            chartObj.setDataURL(strDataURL);
+        }
+    },
+    // This function :
+    // fixes the double quoted attributes to single quotes
+    // Encodes all quotes inside attribute values
+    // Encodes % to %25 and & to %26;
+    encodeDataXML : function(strDataXML) {
+
+        var regExpReservedCharacters = [ "\\$", "\\+" ];
+        var arrDQAtt = strDataXML.match(/=\s*\".*?\"/g);
+        if (arrDQAtt) {
+            for (var i = 0; i < arrDQAtt.length; i++) {
+                var repStr = arrDQAtt[i].replace(/^=\s*\"|\"$/g, "");
+                repStr = repStr.replace(/\'/g, "%26apos;");
+                var strTo = strDataXML.indexOf(arrDQAtt[i]);
+                var repStrr = "='" + repStr + "'";
+                var strStart = strDataXML.substring(0, strTo);
+                var strEnd = strDataXML.substring(strTo + arrDQAtt[i].length);
+                var strDataXML = strStart + repStrr + strEnd;
+            }
+        }
+
+        strDataXML = strDataXML.replace(/\"/g, "%26quot;");
+        strDataXML = strDataXML.replace(/%(?![\da-f]{2}|[\da-f]{4})/ig, "%25");
+        strDataXML = strDataXML.replace(/\&/g, "%26");
+
+        return strDataXML;
+
+    },
+    setDataXML : function(strDataXML) {
+        // If being set initially
+        if (this.initialDataSet == false) {
+            // This method sets the data XML for the chart INITIALLY.
+            this.addVariable('dataXML', this.encodeDataXML(strDataXML));
+            // Update flag
+            this.initialDataSet = true;
+        } else {
+            // Else, we update the chart data using External Interface
+            // Get reference to chart object
+            var chartObj = infosoftglobal.FusionChartsUtil.getChartObject(this
+                    .getAttribute('id'));
+            chartObj.setDataXML(strDataXML);
+        }
+    },
+    setTransparent : function(isTransparent) {
+        // Sets chart to transparent mode when isTransparent is true (default)
+        // When no parameter is passed, we assume transparent to be true.
+        if (typeof isTransparent == "undefined") {
+            isTransparent = true;
+        }
+        // Set the property
+        if (isTransparent)
+            this.addParam('WMode', 'transparent');
+        else
+            this.addParam('WMode', 'Opaque');
+    },
+
+    render : function(elementId) {
+        // First check for installed version of Flash Player - we need a minimum
+        // of 6
+        if ((this.detectFlashVersion == 1) && (this.installedVer.major < 6)) {
+            if (this.autoInstallRedirect == 1) {
+                // If we can auto redirect to install the player?
+                var installationConfirm = window
+                        .confirm("You need Adobe Flash Player 6 (or above) to view the charts. It is a free and lightweight installation from Adobe.com. Please click on Ok to install the same.");
+                if (installationConfirm) {
+                    window.location = "http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash";
+                } else {
+                    return false;
+                }
+            } else {
+                // Else, do not take an action. It means the developer has
+                // specified a message in the DIV (and probably a link).
+                // So, expect the developers to provide a course of way to their
+                // end users.
+                // window.alert("You need Adobe Flash Player 8 (or above) to
+                // view the charts. It is a free and lightweight installation
+                // from Adobe.com. ");
+                return false;
+            }
+        } else {
+            // Render the chart
+            var n = (typeof elementId == 'string') ? document
+                    .getElementById(elementId) : elementId;
+            n.innerHTML = this.getSWFHTML();
+
+            // Added <FORM> compatibility
+            // Check if it's added in Mozilla embed array or if already exits
+            if (!document.embeds[this.getAttribute('id')]
+                    && !window[this.getAttribute('id')])
+                window[this.getAttribute('id')] = document.getElementById(this
+                        .getAttribute('id'));
+            // or else document.forms[formName/formIndex][chartId]
+            return true;
+        }
+    }
+}
+
+/* ---- detection functions ---- */
+infosoftglobal.FusionChartsUtil.getPlayerVersion = function() {
+    var PlayerVersion = new infosoftglobal.PlayerVersion([ 0, 0, 0 ]);
+    if (navigator.plugins && navigator.mimeTypes.length) {
+        var x = navigator.plugins["Shockwave Flash"];
+        if (x && x.description) {
+            PlayerVersion = new infosoftglobal.PlayerVersion(x.description
+                    .replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/,
+                            ".").split("."));
+        }
+    } else if (navigator.userAgent
+            && navigator.userAgent.indexOf("Windows CE") >= 0) {
+        // If Windows CE
+        var axo = 1;
+        var counter = 3;
+        while (axo) {
+            try {
+                counter++;
+                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."
+                        + counter);
+                PlayerVersion = new infosoftglobal.PlayerVersion([ counter, 0,
+                        0 ]);
+            } catch (e) {
+                axo = null;
+            }
+        }
+    } else {
+        // Win IE (non mobile)
+        // Do minor version lookup in IE, but avoid Flash Player 6 crashing
+        // issues
+        try {
+            var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+        } catch (e) {
+            try {
+                var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+                PlayerVersion = new infosoftglobal.PlayerVersion([ 6, 0, 21 ]);
+                axo.AllowScriptAccess = "always"; // error if player version <
+                                                    // 6.0.47 (thanks to Michael
+                                                    // Williams @ Adobe for this
+                                                    // code)
+            } catch (e) {
+                if (PlayerVersion.major == 6) {
+                    return PlayerVersion;
+                }
+            }
+            try {
+                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+            } catch (e) {
+            }
+        }
+        if (axo != null) {
+            PlayerVersion = new infosoftglobal.PlayerVersion(axo.GetVariable(
+                    "$version").split(" ")[1].split(","));
+        }
+    }
+    return PlayerVersion;
+}
+infosoftglobal.PlayerVersion = function(arrVersion) {
+    this.major = arrVersion[0] != null ? parseInt(arrVersion[0]) : 0;
+    this.minor = arrVersion[1] != null ? parseInt(arrVersion[1]) : 0;
+    this.rev = arrVersion[2] != null ? parseInt(arrVersion[2]) : 0;
+}
+// ------------ Fix for Out of Memory Bug in IE in FP9 ---------------//
+/* Fix for video streaming bug */
+infosoftglobal.FusionChartsUtil.cleanupSWFs = function() {
+    var objects = document.getElementsByTagName("OBJECT");
+    for (var i = objects.length - 1; i >= 0; i--) {
+        objects[i].style.display = 'none';
+        for ( var x in objects[i]) {
+            if (typeof objects[i][x] == 'function') {
+                objects[i][x] = function() {
+                };
+            }
+        }
+    }
+}
+// Fixes bug in fp9
+if (infosoftglobal.FusionCharts.doPrepUnload) {
+    if (!infosoftglobal.unloadSet) {
+        infosoftglobal.FusionChartsUtil.prepUnload = function() {
+            __flash_unloadHandler = function() {
+            };
+            __flash_savedUnloadHandler = function() {
+            };
+            window.attachEvent("onunload",
+                    infosoftglobal.FusionChartsUtil.cleanupSWFs);
+        }
+        window.attachEvent("onbeforeunload",
+                infosoftglobal.FusionChartsUtil.prepUnload);
+        infosoftglobal.unloadSet = true;
+    }
+}
+/* Add document.getElementById if needed (mobile IE < 5) */
+if (!document.getElementById && document.all) {
+    document.getElementById = function(id) {
+        return document.all[id];
+    }
+}
+/* Add Array.push if needed (ie5) */
+if (Array.prototype.push == null) {
+    Array.prototype.push = function(item) {
+        this[this.length] = item;
+        return this.length;
+    }
+}
+
+/* Function to return Flash Object from ID */
+infosoftglobal.FusionChartsUtil.getChartObject = function(id) {
+    var chartRef = null;
+    if (navigator.appName.indexOf("Microsoft Internet") == -1) {
+        if (document.embeds && document.embeds[id])
+            chartRef = document.embeds[id];
+        else
+            chartRef = window.document[id];
+    } else {
+        chartRef = window[id];
+    }
+    if (!chartRef)
+        chartRef = document.getElementById(id);
+
+    return chartRef;
+}
+/*
+ * Function to update chart's data at client side (FOR FusionCharts vFREE and
+ * 2.x
+ */
+infosoftglobal.FusionChartsUtil.updateChartXML = function(chartId, strXML) {
+    // Get reference to chart object
+    var chartObj = infosoftglobal.FusionChartsUtil.getChartObject(chartId);
+    // Set dataURL to null
+    chartObj.SetVariable("_root.dataURL", "");
+    // Set the flag
+    chartObj.SetVariable("_root.isNewData", "1");
+    // Set the actual data
+    chartObj.SetVariable("_root.newData", strXML);
+    // Go to the required frame
+    chartObj.TGotoLabel("/", "JavaScriptHandler");
+}
+
+/* Aliases for easy usage */
+var getChartFromId = infosoftglobal.FusionChartsUtil.getChartObject;
+var updateChartXML = infosoftglobal.FusionChartsUtil.updateChartXML;
+var FusionCharts = infosoftglobal.FusionCharts;
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/js/charts.js b/ui/src/main/webapp/static/fusion/sample/js/charts.js
new file mode 100644 (file)
index 0000000..4acb52d
--- /dev/null
@@ -0,0 +1,142 @@
+function drawSingleSeriesChart(tabId, chartId, chartWidth, chartHeight,
+        chartType, chartData, mme, yyyyMo) {
+    // define, set the data for each chart, and render them (if indicated)
+    var myChart = new FusionCharts(
+            "static/fusion/inc/fusionchart/" + chartType,
+            "myChartId" + chartId, chartWidth, chartHeight);
+
+    var mmeLabel = "";// mme + "";
+
+    var chartCaptionId = tabId + "-chartdiv" + chartId + "-label";
+
+    document.getElementById(chartCaptionId).innerHTML = "Hosted Voice Usage in "
+            + yyyyMo;
+
+    myChart
+            .setDataXML("<graph caption='"
+                    + mmeLabel
+                    + "' xAxisName='' yAxisName='# of Inbound/Outbound calls' showNames='1' decimalPrecision='0' formatNumberScale='0'>"
+                    + chartData + "</graph>");
+    myChart.setTransparent(true);
+    myChart.render(tabId + "-" + "chartdiv" + chartId);
+
+}
+
+// gauge charts
+function drawGaugeChart(chartId, gaugeIndex, value) {
+    var myChart = new FusionCharts(
+            "static/fusion/inc/fusionchart/AngularGauge.swf", "myChartId"
+                    + chartId, "300", "300", "0", "0");
+    // CPU for NYCMNYBWLT1 on 201301 : 12.63//
+    var chartData = "<Chart showBorder='0' editMode='1' bgColor='FFFFFF' upperLimit='100' lowerLimit='0' label='CPU' baseFontColor='FFFFFF' majorTMNumber='11' majorTMColor='FFFFFF'  majorTMHeight='8' minorTMNumber='5' minorTMColor='FFFFFF' minorTMHeight='3' toolTipBorderColor='FFFFFF' toolTipBgColor='333333' gaugeOuterRadius='100' gaugeOriginX='150' gaugeOriginY='150' gaugeScaleAngle='270' placeValuesInside='1' gaugeInnerRadius='80%25' annRenderDelay='0' gaugeFillMix='' pivotRadius='10' showPivotBorder='0' pivotFillMix='{CCCCCC},{333333}' pivotFillRatio='50,50' showShadow='0' >"
+            + "<colorRange>"
+            + "<color minValue='0' maxValue='50'   code='C1E1C1' alpha='60'/>"
+            + "<color minValue='50' maxValue='85'  code='F6F164' alpha='60'/>"
+            + "<color minValue='85' maxValue='120' code='F70118' alpha='60'/>"
+            + "</colorRange>"
+            + "<dials>"
+            + "<dial value='"
+            + value
+            + "' borderColor='FFFFFF' bgColor='000000,CCCCCC,000000' borderAlpha='0' baseWidth='10'/>"
+            + "</dials>"
+            + "<annotations>"
+            + "<annotationGroup xPos='150' yPos='150' showBelow='1'>"
+            + "<annotation type='circle' xPos='0' yPos='0' radius='120' startAngle='0' endAngle='360' fillColor='CCCCCC,111111'  fillPattern='linear' fillAlpha='100,100'  fillRatio='50,50' fillAngle='-45'/>"
+            + "<annotation type='circle' xPos='0' yPos='0' radius='110' startAngle='0' endAngle='360' fillColor='111111,cccccc'  fillPattern='linear' fillAlpha='100,100'  fillRatio='50,50' fillAngle='-45'/>"
+            + "<annotation type='text' label='CPU'/>"
+            + "</annotationGroup>"
+            + "</annotations>" + "</Chart>";
+
+    myChart.setDataXML(chartData);
+    myChart.render("chartdiv" + chartId);
+}
+
+function updateGaugeChart(chartId, gaugeIndex, refreshCount) {
+    var myChart = getChartFromId("myChartId" + chartId);
+    var val = 0;
+    if (gaugeIndex == "10")
+        val = 12;
+    else if (gaugeIndex == "20")
+        val = 15;
+    else if (gaugeIndex == "30")
+        val = 52;
+    else if (gaugeIndex == "40")
+        val = 42;
+    myChart.setData(1, val);
+    myChart.setData(2, val + 20);
+}
+
+function updateGaugeChartWithMMEData(chartId, value) {
+    var myChart = getChartFromId("myChartId" + chartId);
+    myChart.setData(1, value);
+}
+
+function updateGaugeChartWithMMEData(chartId, value, yyyyMo, mme) {
+    var myChart = getChartFromId("myChartId" + chartId);
+    myChart.setData(1, value);
+    document.getElementById("cpuYyyyMm").innerHTML = "Hosted Voice Utilization in "
+            + yyyyMo;
+
+}
+
+function drawMultiSeriesChart(tabId, chartId, chartWidth, chartHeight,
+        chartType) {
+    var myChart = new FusionCharts(
+            "static/fusion/inc/fusionchart/" + chartType,
+            "myChartId" + chartId, chartWidth, chartHeight, "0", "0");
+
+    myChart.setTransparent(true);
+
+    var chartData = "<graph caption='Hosted Voice v Audited Communication' xAxisName='Month' yAxisName='Bandwidth Usage'"
+            + " showValues='0' decimalPrecision='0' bgcolor='ffffff' bgAlpha='70'"
+            + " showColumnShadow='1' divlinecolor='c5c5c5' divLineAlpha='60' showAlternateHGridColor='1'"
+            + " alternateHGridColor='f8f8f8' alternateHGridAlpha='60' >"
+            + "<categories>"
+            + "<category name='Jan' />"
+            + "<category name='Feb' />"
+            + "<category name='Mar' />"
+            + "<category name='Apr' />"
+            + "<category name='May' />"
+            + "<category name='Jun' />"
+            + "<category name='Jul' />"
+            + "<category name='Aug' />"
+            + "<category name='Sep' />"
+            + "<category name='Oct' />"
+            + "<category name='Nov' />"
+            + "<category name='Dec' />"
+            + "</categories>"
+            + "<dataset seriesName='Hosted Voice' color='c4e3f7' >"
+            + "<set value='7' />"
+            + "<set value='8.04' />"
+            + "<set value='10.04' />"
+            + "<set value='12.73' />"
+            + "<set value='12.41' />"
+            + "<set value='11.83' />"
+            + "<set value='14.06' />"
+            + "<set value='15.94' />"
+            + "<set value='22.97' />"
+            + "<set value='26.79' />"
+            + "<set value='20.35' />"
+            + "<set value='12.63' />"
+            + "</dataset>"
+            + "<dataset seriesName='Audited Communication' color='Fad35e' >"
+            + "<set value='5.49'/>"
+            + "<set value='8.05'/>"
+            + "<set value='15.36'/>"
+            + "<set value='21.23'/>"
+            + "<set value='23.48' />"
+            + "<set value='15.49' />"
+            + "<set value='26.8' />"
+            + "<set value='30.54' />"
+            + "<set value='64' />"
+            + "<set value='75' />"
+            + "<set value='63' />"
+            + "<set value='34' />"
+            + "</dataset>"
+            + "<trendlines>"
+            + "<line startValue='26000' color='91C728' displayValue='Target' showOnTop='1'/>"
+            + "</trendlines>" + "</graph>";
+
+    myChart.setDataXML(chartData);
+    myChart.render(tabId + "-" + "chartdiv" + chartId);
+}
diff --git a/ui/src/main/webapp/static/fusion/sample/js/scribble.js b/ui/src/main/webapp/static/fusion/sample/js/scribble.js
new file mode 100644 (file)
index 0000000..c255863
--- /dev/null
@@ -0,0 +1,18 @@
+function storeUserScribble(id) {
+    var scribble = document.getElementById('scribble').innerHTML;
+    localStorage.setItem('userScribble', scribble);
+}
+
+function getUserScribble() {
+    if (localStorage.getItem('userScribble')) {
+        var scribble = localStorage.getItem('userScribble');
+    } else {
+        var scribble = 'You can scribble directly on this sticky... and I will also remember your message the next time you visit my blog!';
+    }
+    document.getElementById('scribble').innerHTML = scribble;
+}
+
+function clearLocal() {
+    clear: localStorage.clear();
+    return false;
+}
diff --git a/ui/src/main/webapp/static/fusion/sample/org_chart/css/bootstrap.min.css b/ui/src/main/webapp/static/fusion/sample/org_chart/css/bootstrap.min.css
new file mode 100644 (file)
index 0000000..734e296
--- /dev/null
@@ -0,0 +1,2708 @@
+html, body {
+    margin: 0;
+    padding: 0;
+}
+
+h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address,
+    cite, code, del, dfn, em, img, q, s, samp, small, strike, strong,
+    sub, sup, tt, var, dd, dl, dt, li, ol, ul, fieldset, form, label,
+    legend, button, table, caption, tbody, tfoot, thead, tr, th, td {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    font-weight: normal;
+    font-style: normal;
+    font-size: 100%;
+    line-height: 1;
+    font-family: inherit;
+}
+
+ol, ul {
+    list-style: none;
+}
+
+q:before, q:after, blockquote:before, blockquote:after {
+    content: "";
+}
+
+html {
+    overflow-y: scroll;
+    font-size: 100%;
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+    outline: thin dotted;
+}
+
+a:hover, a:active {
+    outline: 0;
+}
+
+article, aside, details, figcaption, figure, footer, header, hgroup, nav,
+    section {
+    display: block;
+}
+
+audio, canvas, video {
+    display: inline-block;
+    *display: inline;
+    *zoom: 1;
+}
+
+audio:not ([controls] ){
+    display: none;
+}
+
+sub, sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline;
+}
+
+sup {
+    top: -0.5em;
+}
+
+sub {
+    bottom: -0.25em;
+}
+
+img {
+    border: 0;
+    -ms-interpolation-mode: bicubic;
+}
+
+button, input, select, textarea {
+    font-size: 100%;
+    margin: 0;
+    vertical-align: baseline;
+    *vertical-align: middle;
+}
+
+button, input {
+    line-height: normal;
+    *overflow: visible;
+}
+
+button::-moz-focus-inner, input::-moz-focus-inner {
+    border: 0;
+    padding: 0;
+}
+
+button, input[type="button"], input[type="reset"], input[type="submit"]
+    {
+    cursor: pointer;
+    -webkit-appearance: button;
+}
+
+input[type="search"] {
+    -webkit-appearance: textfield;
+    -webkit-box-sizing: content-box;
+    -moz-box-sizing: content-box;
+    box-sizing: content-box;
+}
+
+input[type="search"]::-webkit-search-decoration {
+    -webkit-appearance: none;
+}
+
+textarea {
+    overflow: auto;
+    vertical-align: top;
+}
+
+body {
+    background-color: #ffffff;
+    margin: 0;
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-size: 13px;
+    font-weight: normal;
+    line-height: 18px;
+    color: #404040;
+}
+
+.container {
+    width: 940px;
+    margin-left: auto;
+    margin-right: auto;
+    zoom: 1;
+}
+
+.container:before, .container:after {
+    display: table;
+    content: "";
+    zoom: 1;
+}
+
+.container:after {
+    clear: both;
+}
+
+.container-fluid {
+    position: relative;
+    min-width: 940px;
+    padding-left: 20px;
+    padding-right: 20px;
+    zoom: 1;
+}
+
+.container-fluid:before, .container-fluid:after {
+    display: table;
+    content: "";
+    zoom: 1;
+}
+
+.container-fluid:after {
+    clear: both;
+}
+
+.container-fluid>.sidebar {
+    position: absolute;
+    top: 0;
+    left: 20px;
+    width: 220px;
+}
+
+.container-fluid>.content {
+    margin-left: 240px;
+}
+
+a {
+    color: #0069d6;
+    text-decoration: none;
+    line-height: inherit;
+    font-weight: inherit;
+}
+
+a:hover {
+    color: #00438a;
+    text-decoration: underline;
+}
+
+.pull-right {
+    float: right;
+}
+
+.pull-left {
+    float: left;
+}
+
+.hide {
+    display: none;
+}
+
+.show {
+    display: block;
+}
+
+.row {
+    zoom: 1;
+    margin-left: -20px;
+}
+
+.row:before, .row:after {
+    display: table;
+    content: "";
+    zoom: 1;
+}
+
+.row:after {
+    clear: both;
+}
+
+.row>[class*="span"] {
+    display: inline;
+    float: left;
+    margin-left: 20px;
+}
+
+.span1 {
+    width: 40px;
+}
+
+.span2 {
+    width: 100px;
+}
+
+.span3 {
+    width: 160px;
+}
+
+.span4 {
+    width: 220px;
+}
+
+.span5 {
+    width: 280px;
+}
+
+.span6 {
+    width: 340px;
+}
+
+.span7 {
+    width: 400px;
+}
+
+.span8 {
+    width: 460px;
+}
+
+.span9 {
+    width: 520px;
+}
+
+.span10 {
+    width: 580px;
+}
+
+.span11 {
+    width: 640px;
+}
+
+.span12 {
+    width: 700px;
+}
+
+.span13 {
+    width: 760px;
+}
+
+.span14 {
+    width: 820px;
+}
+
+.span15 {
+    width: 880px;
+}
+
+.span16 {
+    width: 940px;
+}
+
+.span17 {
+    width: 1000px;
+}
+
+.span18 {
+    width: 1060px;
+}
+
+.span19 {
+    width: 1120px;
+}
+
+.span20 {
+    width: 1180px;
+}
+
+.span21 {
+    width: 1240px;
+}
+
+.span22 {
+    width: 1300px;
+}
+
+.span23 {
+    width: 1360px;
+}
+
+.span24 {
+    width: 1420px;
+}
+
+.row>.offset1 {
+    margin-left: 80px;
+}
+
+.row>.offset2 {
+    margin-left: 140px;
+}
+
+.row>.offset3 {
+    margin-left: 200px;
+}
+
+.row>.offset4 {
+    margin-left: 260px;
+}
+
+.row>.offset5 {
+    margin-left: 320px;
+}
+
+.row>.offset6 {
+    margin-left: 380px;
+}
+
+.row>.offset7 {
+    margin-left: 440px;
+}
+
+.row>.offset8 {
+    margin-left: 500px;
+}
+
+.row>.offset9 {
+    margin-left: 560px;
+}
+
+.row>.offset10 {
+    margin-left: 620px;
+}
+
+.row>.offset11 {
+    margin-left: 680px;
+}
+
+.row>.offset12 {
+    margin-left: 740px;
+}
+
+.span-one-third {
+    width: 300px;
+}
+
+.span-two-thirds {
+    width: 620px;
+}
+
+.offset-one-third {
+    margin-left: 340px;
+}
+
+.offset-two-thirds {
+    margin-left: 660px;
+}
+
+p {
+    font-size: 13px;
+    font-weight: normal;
+    line-height: 18px;
+    margin-bottom: 9px;
+}
+
+p small {
+    font-size: 11px;
+    color: #bfbfbf;
+}
+
+h1, h2, h3, h4, h5, h6 {
+    font-weight: bold;
+    color: #404040;
+}
+
+h1 small, h2 small, h3 small, h4 small, h5 small, h6 small {
+    color: #bfbfbf;
+}
+
+h1 {
+    margin-bottom: 18px;
+    font-size: 30px;
+    line-height: 36px;
+}
+
+h1 small {
+    font-size: 18px;
+}
+
+h2 {
+    font-size: 24px;
+    line-height: 36px;
+}
+
+h2 small {
+    font-size: 14px;
+}
+
+h3, h4, h5, h6 {
+    line-height: 36px;
+}
+
+h3 {
+    font-size: 18px;
+}
+
+h3 small {
+    font-size: 14px;
+}
+
+h4 {
+    font-size: 16px;
+}
+
+h4 small {
+    font-size: 12px;
+}
+
+h5 {
+    font-size: 14px;
+}
+
+h6 {
+    font-size: 13px;
+    color: #bfbfbf;
+    text-transform: uppercase;
+}
+
+ul, ol {
+    margin: 0 0 18px 25px;
+}
+
+ul ul, ul ol, ol ol, ol ul {
+    margin-bottom: 0;
+}
+
+ul {
+    list-style: disc;
+}
+
+ol {
+    list-style: decimal;
+}
+
+li {
+    line-height: 18px;
+    color: #808080;
+}
+
+ul.unstyled {
+    list-style: none;
+    margin-left: 0;
+}
+
+dl {
+    margin-bottom: 18px;
+}
+
+dl dt, dl dd {
+    line-height: 18px;
+}
+
+dl dt {
+    font-weight: bold;
+}
+
+dl dd {
+    margin-left: 9px;
+}
+
+hr {
+    margin: 20px 0 19px;
+    border: 0;
+    border-bottom: 1px solid #eee;
+}
+
+strong {
+    font-style: inherit;
+    font-weight: bold;
+}
+
+em {
+    font-style: italic;
+    font-weight: inherit;
+    line-height: inherit;
+}
+
+.muted {
+    color: #bfbfbf;
+}
+
+blockquote {
+    margin-bottom: 18px;
+    border-left: 5px solid #eee;
+    padding-left: 15px;
+}
+
+blockquote p {
+    font-size: 14px;
+    font-weight: 300;
+    line-height: 18px;
+    margin-bottom: 0;
+}
+
+blockquote small {
+    display: block;
+    font-size: 12px;
+    font-weight: 300;
+    line-height: 18px;
+    color: #bfbfbf;
+}
+
+blockquote small:before {
+    content: '\2014 \00A0';
+}
+
+address {
+    display: block;
+    line-height: 18px;
+    margin-bottom: 18px;
+}
+
+code, pre {
+    padding: 0 3px 2px;
+    font-family: Monaco, Andale Mono, Courier New, monospace;
+    font-size: 12px;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+}
+
+code {
+    background-color: #fee9cc;
+    color: rgba(0, 0, 0, 0.75);
+    padding: 1px 3px;
+}
+
+pre {
+    background-color: #f5f5f5;
+    display: block;
+    padding: 8.5px;
+    margin: 0 0 18px;
+    line-height: 18px;
+    font-size: 12px;
+    border: 1px solid #ccc;
+    border: 1px solid rgba(0, 0, 0, 0.15);
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+    white-space: pre;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+}
+
+form {
+    margin-bottom: 18px;
+}
+
+fieldset {
+    margin-bottom: 18px;
+    padding-top: 18px;
+}
+
+fieldset legend {
+    display: block;
+    padding-left: 150px;
+    font-size: 19.5px;
+    line-height: 1;
+    color: #404040;
+    *padding: 0 0 5px 145px;
+    *line-height: 1.5;
+}
+
+form .clearfix {
+    margin-bottom: 18px;
+    zoom: 1;
+}
+
+form .clearfix:before, form .clearfix:after {
+    display: table;
+    content: "";
+    zoom: 1;
+}
+
+form .clearfix:after {
+    clear: both;
+}
+
+label, input, select, textarea {
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-size: 13px;
+    font-weight: normal;
+    line-height: normal;
+}
+
+label {
+    padding-top: 6px;
+    font-size: 13px;
+    line-height: 18px;
+    float: left;
+    width: 130px;
+    text-align: right;
+    color: #404040;
+}
+
+form .input {
+    margin-left: 150px;
+}
+
+input[type=checkbox], input[type=radio] {
+    cursor: pointer;
+}
+
+input, textarea, select, .uneditable-input {
+    display: inline-block;
+    width: 210px;
+    height: 18px;
+    padding: 4px;
+    font-size: 13px;
+    line-height: 18px;
+    color: #808080;
+    border: 1px solid #ccc;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+}
+
+select {
+    padding: initial;
+}
+
+input[type=checkbox], input[type=radio] {
+    width: auto;
+    height: auto;
+    padding: 0;
+    margin: 3px 0;
+    *margin-top: 0;
+    line-height: normal;
+    border: none;
+}
+
+input[type=file] {
+    background-color: #ffffff;
+    padding: initial;
+    border: initial;
+    line-height: initial;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+input[type=button], input[type=reset], input[type=submit] {
+    width: auto;
+    height: auto;
+}
+
+select, input[type=file] {
+    height: 27px;
+    *height: auto;
+    line-height: 27px;
+    *margin-top: 4px;
+}
+
+select[multiple] {
+    height: inherit;
+    background-color: #ffffff;
+}
+
+textarea {
+    height: auto;
+}
+
+.uneditable-input {
+    background-color: #ffffff;
+    display: block;
+    border-color: #eee;
+    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+    -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+    cursor: not-allowed;
+}
+
+:-moz-placeholder {
+    color: #bfbfbf;
+}
+
+::-webkit-input-placeholder {
+    color: #bfbfbf;
+}
+
+input, textarea {
+    -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+    -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+    -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
+    -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+    transition: border linear 0.2s, box-shadow linear 0.2s;
+    -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+    -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+    box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+input:focus, textarea:focus {
+    outline: 0;
+    border-color: rgba(82, 168, 236, 0.8);
+    -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px
+        rgba(82, 168, 236, 0.6);
+    -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px
+        rgba(82, 168, 236, 0.6);
+    box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px
+        rgba(82, 168, 236, 0.6);
+}
+
+input[type=file]:focus, input[type=checkbox]:focus, select:focus {
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+    outline: 1px dotted #666;
+}
+
+form .clearfix.error>label, form .clearfix.error .help-block, form .clearfix.error .help-inline
+    {
+    color: #b94a48;
+}
+
+form .clearfix.error input, form .clearfix.error textarea {
+    color: #b94a48;
+    border-color: #ee5f5b;
+}
+
+form .clearfix.error input:focus, form .clearfix.error textarea:focus {
+    border-color: #e9322d;
+    -webkit-box-shadow: 0 0 6px #f8b9b7;
+    -moz-box-shadow: 0 0 6px #f8b9b7;
+    box-shadow: 0 0 6px #f8b9b7;
+}
+
+form .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on
+    {
+    color: #b94a48;
+    background-color: #fce6e6;
+    border-color: #b94a48;
+}
+
+form .clearfix.warning>label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline
+    {
+    color: #c09853;
+}
+
+form .clearfix.warning input, form .clearfix.warning textarea {
+    color: #c09853;
+    border-color: #ccae64;
+}
+
+form .clearfix.warning input:focus, form .clearfix.warning textarea:focus
+    {
+    border-color: #be9a3f;
+    -webkit-box-shadow: 0 0 6px #e5d6b1;
+    -moz-box-shadow: 0 0 6px #e5d6b1;
+    box-shadow: 0 0 6px #e5d6b1;
+}
+
+form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on
+    {
+    color: #c09853;
+    background-color: #d2b877;
+    border-color: #c09853;
+}
+
+form .clearfix.success>label, form .clearfix.success .help-block, form .clearfix.success .help-inline
+    {
+    color: #468847;
+}
+
+form .clearfix.success input, form .clearfix.success textarea {
+    color: #468847;
+    border-color: #57a957;
+}
+
+form .clearfix.success input:focus, form .clearfix.success textarea:focus
+    {
+    border-color: #458845;
+    -webkit-box-shadow: 0 0 6px #9acc9a;
+    -moz-box-shadow: 0 0 6px #9acc9a;
+    box-shadow: 0 0 6px #9acc9a;
+}
+
+form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on
+    {
+    color: #468847;
+    background-color: #bcddbc;
+    border-color: #468847;
+}
+
+.input-mini, input.mini, textarea.mini, select.mini {
+    width: 60px;
+}
+
+.input-small, input.small, textarea.small, select.small {
+    width: 90px;
+}
+
+.input-medium, input.medium, textarea.medium, select.medium {
+    width: 150px;
+}
+
+.input-large, input.large, textarea.large, select.large {
+    width: 210px;
+}
+
+.input-xlarge, input.xlarge, textarea.xlarge, select.xlarge {
+    width: 270px;
+}
+
+.input-xxlarge, input.xxlarge, textarea.xxlarge, select.xxlarge {
+    width: 530px;
+}
+
+textarea.xxlarge {
+    overflow-y: auto;
+}
+
+input.span1, textarea.span1 {
+    display: inline-block;
+    float: none;
+    width: 30px;
+    margin-left: 0;
+}
+
+input.span2, textarea.span2 {
+    display: inline-block;
+    float: none;
+    width: 90px;
+    margin-left: 0;
+}
+
+input.span3, textarea.span3 {
+    display: inline-block;
+    float: none;
+    width: 150px;
+    margin-left: 0;
+}
+
+input.span4, textarea.span4 {
+    display: inline-block;
+    float: none;
+    width: 210px;
+    margin-left: 0;
+}
+
+input.span5, textarea.span5 {
+    display: inline-block;
+    float: none;
+    width: 270px;
+    margin-left: 0;
+}
+
+input.span6, textarea.span6 {
+    display: inline-block;
+    float: none;
+    width: 330px;
+    margin-left: 0;
+}
+
+input.span7, textarea.span7 {
+    display: inline-block;
+    float: none;
+    width: 390px;
+    margin-left: 0;
+}
+
+input.span8, textarea.span8 {
+    display: inline-block;
+    float: none;
+    width: 450px;
+    margin-left: 0;
+}
+
+input.span9, textarea.span9 {
+    display: inline-block;
+    float: none;
+    width: 510px;
+    margin-left: 0;
+}
+
+input.span10, textarea.span10 {
+    display: inline-block;
+    float: none;
+    width: 570px;
+    margin-left: 0;
+}
+
+input.span11, textarea.span11 {
+    display: inline-block;
+    float: none;
+    width: 630px;
+    margin-left: 0;
+}
+
+input.span12, textarea.span12 {
+    display: inline-block;
+    float: none;
+    width: 690px;
+    margin-left: 0;
+}
+
+input.span13, textarea.span13 {
+    display: inline-block;
+    float: none;
+    width: 750px;
+    margin-left: 0;
+}
+
+input.span14, textarea.span14 {
+    display: inline-block;
+    float: none;
+    width: 810px;
+    margin-left: 0;
+}
+
+input.span15, textarea.span15 {
+    display: inline-block;
+    float: none;
+    width: 870px;
+    margin-left: 0;
+}
+
+input.span16, textarea.span16 {
+    display: inline-block;
+    float: none;
+    width: 930px;
+    margin-left: 0;
+}
+
+input[disabled], select[disabled], textarea[disabled], input[readonly],
+    select[readonly], textarea[readonly] {
+    background-color: #f5f5f5;
+    border-color: #ddd;
+    cursor: not-allowed;
+}
+
+.actions {
+    background: #f5f5f5;
+    margin-top: 18px;
+    margin-bottom: 18px;
+    padding: 17px 20px 18px 150px;
+    border-top: 1px solid #ddd;
+    -webkit-border-radius: 0 0 3px 3px;
+    -moz-border-radius: 0 0 3px 3px;
+    border-radius: 0 0 3px 3px;
+}
+
+.actions .secondary-action {
+    float: right;
+}
+
+.actions .secondary-action a {
+    line-height: 30px;
+}
+
+.actions .secondary-action a:hover {
+    text-decoration: underline;
+}
+
+.help-inline, .help-block {
+    font-size: 13px;
+    line-height: 18px;
+    color: #bfbfbf;
+}
+
+.help-inline {
+    padding-left: 5px;
+    *position: relative;
+    *top: -5px;
+}
+
+.help-block {
+    display: block;
+    max-width: 600px;
+}
+
+.inline-inputs {
+    color: #808080;
+}
+
+.inline-inputs span {
+    padding: 0 2px 0 1px;
+}
+
+.input-prepend input, .input-append input {
+    -webkit-border-radius: 0 3px 3px 0;
+    -moz-border-radius: 0 3px 3px 0;
+    border-radius: 0 3px 3px 0;
+}
+
+.input-prepend .add-on, .input-append .add-on {
+    position: relative;
+    background: #f5f5f5;
+    border: 1px solid #ccc;
+    z-index: 2;
+    float: left;
+    display: block;
+    width: auto;
+    min-width: 16px;
+    height: 18px;
+    padding: 4px 4px 4px 5px;
+    margin-right: -1px;
+    font-weight: normal;
+    line-height: 18px;
+    color: #bfbfbf;
+    text-align: center;
+    text-shadow: 0 1px 0 #ffffff;
+    -webkit-border-radius: 3px 0 0 3px;
+    -moz-border-radius: 3px 0 0 3px;
+    border-radius: 3px 0 0 3px;
+}
+
+.input-prepend .active, .input-append .active {
+    background: #a9dba9;
+    border-color: #46a546;
+}
+
+.input-prepend .add-on {
+    *margin-top: 1px;
+}
+
+.input-append input {
+    float: left;
+    -webkit-border-radius: 3px 0 0 3px;
+    -moz-border-radius: 3px 0 0 3px;
+    border-radius: 3px 0 0 3px;
+}
+
+.input-append .add-on {
+    -webkit-border-radius: 0 3px 3px 0;
+    -moz-border-radius: 0 3px 3px 0;
+    border-radius: 0 3px 3px 0;
+    margin-right: 0;
+    margin-left: -1px;
+}
+
+.inputs-list {
+    margin: 0 0 5px;
+    width: 100%;
+}
+
+.inputs-list li {
+    display: block;
+    padding: 0;
+    width: 100%;
+}
+
+.inputs-list label {
+    display: block;
+    float: none;
+    width: auto;
+    padding: 0;
+    margin-left: 20px;
+    line-height: 18px;
+    text-align: left;
+    white-space: normal;
+}
+
+.inputs-list label strong {
+    color: #808080;
+}
+
+.inputs-list label small {
+    font-size: 11px;
+    font-weight: normal;
+}
+
+.inputs-list .inputs-list {
+    margin-left: 25px;
+    margin-bottom: 10px;
+    padding-top: 0;
+}
+
+.inputs-list:first-child {
+    padding-top: 6px;
+}
+
+.inputs-list li+li {
+    padding-top: 2px;
+}
+
+.inputs-list input[type=radio], .inputs-list input[type=checkbox] {
+    margin-bottom: 0;
+    margin-left: -20px;
+    float: left;
+}
+
+.form-stacked {
+    padding-left: 20px;
+}
+
+.form-stacked fieldset {
+    padding-top: 9px;
+}
+
+.form-stacked legend {
+    padding-left: 0;
+}
+
+.form-stacked label {
+    display: block;
+    float: none;
+    width: auto;
+    font-weight: bold;
+    text-align: left;
+    line-height: 20px;
+    padding-top: 0;
+}
+
+.form-stacked .clearfix {
+    margin-bottom: 9px;
+}
+
+.form-stacked .clearfix div.input {
+    margin-left: 0;
+}
+
+.form-stacked .inputs-list {
+    margin-bottom: 0;
+}
+
+.form-stacked .inputs-list li {
+    padding-top: 0;
+}
+
+.form-stacked .inputs-list li label {
+    font-weight: normal;
+    padding-top: 0;
+}
+
+.form-stacked div.clearfix.error {
+    padding-top: 10px;
+    padding-bottom: 10px;
+    padding-left: 10px;
+    margin-top: 0;
+    margin-left: -10px;
+}
+
+.form-stacked .actions {
+    margin-left: -20px;
+    padding-left: 20px;
+}
+
+.condensed-table th, .condensed-table td {
+    padding: 5px 5px 4px;
+}
+
+.bordered-table {
+    border: 1px solid #ddd;
+    border-collapse: separate;
+    *border-collapse: collapse;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+}
+
+.bordered-table th+th, .bordered-table td+td, .bordered-table th+td {
+    border-left: 1px solid #ddd;
+}
+
+.bordered-table thead tr:first-child th:first-child, .bordered-table tbody tr:first-child td:first-child
+    {
+    -webkit-border-radius: 4px 0 0 0;
+    -moz-border-radius: 4px 0 0 0;
+    border-radius: 4px 0 0 0;
+}
+
+.bordered-table thead tr:first-child th:last-child, .bordered-table tbody tr:first-child td:last-child
+    {
+    -webkit-border-radius: 0 4px 0 0;
+    -moz-border-radius: 0 4px 0 0;
+    border-radius: 0 4px 0 0;
+}
+
+.bordered-table tbody tr:last-child td:first-child {
+    -webkit-border-radius: 0 0 0 4px;
+    -moz-border-radius: 0 0 0 4px;
+    border-radius: 0 0 0 4px;
+}
+
+.bordered-table tbody tr:last-child td:last-child {
+    -webkit-border-radius: 0 0 4px 0;
+    -moz-border-radius: 0 0 4px 0;
+    border-radius: 0 0 4px 0;
+}
+
+table .span1 {
+    width: 20px;
+}
+
+table .span2 {
+    width: 60px;
+}
+
+table .span3 {
+    width: 100px;
+}
+
+table .span4 {
+    width: 140px;
+}
+
+table .span5 {
+    width: 180px;
+}
+
+table .span6 {
+    width: 220px;
+}
+
+table .span7 {
+    width: 260px;
+}
+
+table .span8 {
+    width: 300px;
+}
+
+table .span9 {
+    width: 340px;
+}
+
+table .span10 {
+    width: 380px;
+}
+
+table .span11 {
+    width: 420px;
+}
+
+table .span12 {
+    width: 460px;
+}
+
+table .span13 {
+    width: 500px;
+}
+
+table .span14 {
+    width: 540px;
+}
+
+table .span15 {
+    width: 580px;
+}
+
+table .span16 {
+    width: 620px;
+}
+
+.zebra-striped tbody tr:nth-child(odd) td, .zebra-striped tbody tr:nth-child(odd) th
+    {
+    background-color: #f9f9f9;
+}
+
+.zebra-striped tbody tr:hover td, .zebra-striped tbody tr:hover th {
+    background-color: #f5f5f5;
+}
+
+table .header {
+    cursor: pointer;
+}
+
+table .header:after {
+    content: "";
+    float: right;
+    margin-top: 7px;
+    border-width: 0 4px 4px;
+    border-style: solid;
+    border-color: #000 transparent;
+    visibility: hidden;
+}
+
+table .headerSortUp, table .headerSortDown {
+    background-color: rgba(141, 192, 219, 0.25);
+    text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+}
+
+table .header:hover:after {
+    visibility: visible;
+}
+
+table .headerSortDown:after, table .headerSortDown:hover:after {
+    visibility: visible;
+    filter: alpha(opacity = 60);
+    -khtml-opacity: 0.6;
+    -moz-opacity: 0.6;
+    opacity: 0.6;
+}
+
+table .headerSortUp:after {
+    border-bottom: none;
+    border-left: 4px solid transparent;
+    border-right: 4px solid transparent;
+    border-top: 4px solid #000;
+    visibility: visible;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+    filter: alpha(opacity = 60);
+    -khtml-opacity: 0.6;
+    -moz-opacity: 0.6;
+    opacity: 0.6;
+}
+
+table .blue {
+    color: #049cdb;
+    border-bottom-color: #049cdb;
+}
+
+table .headerSortUp.blue, table .headerSortDown.blue {
+    background-color: #ade6fe;
+}
+
+table .green {
+    color: #46a546;
+    border-bottom-color: #46a546;
+}
+
+table .headerSortUp.green, table .headerSortDown.green {
+    background-color: #cdeacd;
+}
+
+table .red {
+    color: #9d261d;
+    border-bottom-color: #9d261d;
+}
+
+table .headerSortUp.red, table .headerSortDown.red {
+    background-color: #f4c8c5;
+}
+
+table .yellow {
+    color: #ffc40d;
+    border-bottom-color: #ffc40d;
+}
+
+table .headerSortUp.yellow, table .headerSortDown.yellow {
+    background-color: #fff6d9;
+}
+
+table .orange {
+    color: #f89406;
+    border-bottom-color: #f89406;
+}
+
+table .headerSortUp.orange, table .headerSortDown.orange {
+    background-color: #fee9cc;
+}
+
+table .purple {
+    color: #7a43b6;
+    border-bottom-color: #7a43b6;
+}
+
+table .headerSortUp.purple, table .headerSortDown.purple {
+    background-color: #e2d5f0;
+}
+
+.topbar {
+    height: 40px;
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    z-index: 10000;
+    overflow: visible;
+}
+
+.topbar a {
+    color: #bfbfbf;
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.topbar h3 a:hover, .topbar .brand:hover, .topbar ul .active>a {
+    background-color: #333;
+    background-color: rgba(255, 255, 255, 0.05);
+    color: #ffffff;
+    text-decoration: none;
+}
+
+.topbar h3 {
+    position: relative;
+}
+
+.topbar h3 a, .topbar .brand {
+    float: left;
+    display: block;
+    padding: 8px 20px 12px;
+    margin-left: -20px;
+    color: #ffffff;
+    font-size: 20px;
+    font-weight: 200;
+    line-height: 1;
+}
+
+.topbar p {
+    margin: 0;
+    line-height: 40px;
+}
+
+.topbar p a:hover {
+    background-color: transparent;
+    color: #ffffff;
+}
+
+.topbar form {
+    float: left;
+    margin: 5px 0 0 0;
+    position: relative;
+    filter: alpha(opacity = 100);
+    -khtml-opacity: 1;
+    -moz-opacity: 1;
+    opacity: 1;
+}
+
+.topbar form.pull-right {
+    float: right;
+}
+
+.topbar input {
+    background-color: #444;
+    background-color: rgba(255, 255, 255, 0.3);
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-size: normal;
+    font-weight: 13px;
+    line-height: 1;
+    padding: 4px 9px;
+    color: #ffffff;
+    color: rgba(255, 255, 255, 0.75);
+    border: 1px solid #111;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px
+        rgba(255, 255, 255, 0.25);
+    -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px
+        rgba(255, 255, 255, 0.25);
+    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px
+        rgba(255, 255, 255, 0.25);
+    -webkit-transition: none;
+    -moz-transition: none;
+    -ms-transition: none;
+    -o-transition: none;
+    transition: none;
+}
+
+.topbar input:-moz-placeholder {
+    color: #e6e6e6;
+}
+
+.topbar input::-webkit-input-placeholder {
+    color: #e6e6e6;
+}
+
+.topbar input:hover {
+    background-color: #bfbfbf;
+    background-color: rgba(255, 255, 255, 0.5);
+    color: #ffffff;
+}
+
+.topbar input:focus, .topbar input.focused {
+    outline: 0;
+    background-color: #ffffff;
+    color: #404040;
+    text-shadow: 0 1px 0 #ffffff;
+    border: 0;
+    padding: 5px 10px;
+    -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+    -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+    box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.topbar-inner, .topbar .fill {
+    background-color: #222;
+    background-color: #222222;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#333333),
+        to(#222222));
+    background-image: -moz-linear-gradient(top, #333333, #222222);
+    background-image: -ms-linear-gradient(top, #333333, #222222);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333),
+        color-stop(100%, #222222));
+    background-image: -webkit-linear-gradient(top, #333333, #222222);
+    background-image: -o-linear-gradient(top, #333333, #222222);
+    background-image: linear-gradient(top, #333333, #222222);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333',
+        endColorstr='#222222', GradientType=0);
+    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0
+        rgba(0, 0, 0, 0.1);
+    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0
+        rgba(0, 0, 0, 0.1);
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0
+        rgba(0, 0, 0, 0.1);
+}
+
+.topbar div>ul, .nav {
+    display: block;
+    float: left;
+    margin: 0 10px 0 0;
+    position: relative;
+    left: 0;
+}
+
+.topbar div>ul>li, .nav>li {
+    display: block;
+    float: left;
+}
+
+.topbar div>ul a, .nav a {
+    display: block;
+    float: none;
+    padding: 10px 10px 11px;
+    line-height: 19px;
+    text-decoration: none;
+}
+
+.topbar div>ul a:hover, .nav a:hover {
+    color: #ffffff;
+    text-decoration: none;
+}
+
+.topbar div>ul .active>a, .nav .active>a {
+    background-color: #222;
+    background-color: rgba(0, 0, 0, 0.5);
+}
+
+.topbar div>ul.secondary-nav, .nav.secondary-nav {
+    float: right;
+    margin-left: 10px;
+    margin-right: 0;
+}
+
+.topbar div>ul.secondary-nav .menu-dropdown, .nav.secondary-nav .menu-dropdown,
+    .topbar div>ul.secondary-nav .dropdown-menu, .nav.secondary-nav .dropdown-menu
+    {
+    right: 0;
+    border: 0;
+}
+
+.topbar div>ul a.menu:hover, .nav a.menu:hover, .topbar div>ul li.open .menu,
+    .nav li.open .menu, .topbar div>ul .dropdown-toggle:hover, .nav .dropdown-toggle:hover,
+    .topbar div>ul .dropdown.open .dropdown-toggle, .nav .dropdown.open .dropdown-toggle
+    {
+    background: #444;
+    background: rgba(255, 255, 255, 0.05);
+}
+
+.topbar div>ul .menu-dropdown, .nav .menu-dropdown, .topbar div>ul .dropdown-menu,
+    .nav .dropdown-menu {
+    background-color: #333;
+}
+
+.topbar div>ul .menu-dropdown a.menu, .nav .menu-dropdown a.menu,
+    .topbar div>ul .dropdown-menu a.menu, .nav .dropdown-menu a.menu,
+    .topbar div>ul .menu-dropdown .dropdown-toggle, .nav .menu-dropdown .dropdown-toggle,
+    .topbar div>ul .dropdown-menu .dropdown-toggle, .nav .dropdown-menu .dropdown-toggle
+    {
+    color: #ffffff;
+}
+
+.topbar div>ul .menu-dropdown a.menu.open, .nav .menu-dropdown a.menu.open,
+    .topbar div>ul .dropdown-menu a.menu.open, .nav .dropdown-menu a.menu.open,
+    .topbar div>ul .menu-dropdown .dropdown-toggle.open, .nav .menu-dropdown .dropdown-toggle.open,
+    .topbar div>ul .dropdown-menu .dropdown-toggle.open, .nav .dropdown-menu .dropdown-toggle.open
+    {
+    background: #444;
+    background: rgba(255, 255, 255, 0.05);
+}
+
+.topbar div>ul .menu-dropdown li a, .nav .menu-dropdown li a, .topbar div>ul .dropdown-menu li a,
+    .nav .dropdown-menu li a {
+    color: #999;
+    text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
+}
+
+.topbar div>ul .menu-dropdown li a:hover, .nav .menu-dropdown li a:hover,
+    .topbar div>ul .dropdown-menu li a:hover, .nav .dropdown-menu li a:hover
+    {
+    background-color: #191919;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#292929),
+        to(#191919));
+    background-image: -moz-linear-gradient(top, #292929, #191919);
+    background-image: -ms-linear-gradient(top, #292929, #191919);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929),
+        color-stop(100%, #191919));
+    background-image: -webkit-linear-gradient(top, #292929, #191919);
+    background-image: -o-linear-gradient(top, #292929, #191919);
+    background-image: linear-gradient(top, #292929, #191919);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929',
+        endColorstr='#191919', GradientType=0);
+    color: #ffffff;
+}
+
+.topbar div>ul .menu-dropdown .active a, .nav .menu-dropdown .active a,
+    .topbar div>ul .dropdown-menu .active a, .nav .dropdown-menu .active a
+    {
+    color: #ffffff;
+}
+
+.topbar div>ul .menu-dropdown .divider, .nav .menu-dropdown .divider,
+    .topbar div>ul .dropdown-menu .divider, .nav .dropdown-menu .divider
+    {
+    background-color: #222;
+    border-color: #444;
+}
+
+.topbar ul .menu-dropdown li a, .topbar ul .dropdown-menu li a {
+    padding: 4px 15px;
+}
+
+li.menu, .dropdown {
+    position: relative;
+}
+
+a.menu:after, .dropdown-toggle:after {
+    width: 0;
+    height: 0;
+    display: inline-block;
+    content: "&darr;";
+    text-indent: -99999px;
+    vertical-align: top;
+    margin-top: 8px;
+    margin-left: 4px;
+    border-left: 4px solid transparent;
+    border-right: 4px solid transparent;
+    border-top: 4px solid #ffffff;
+    filter: alpha(opacity = 50);
+    -khtml-opacity: 0.5;
+    -moz-opacity: 0.5;
+    opacity: 0.5;
+}
+
+.menu-dropdown, .dropdown-menu {
+    background-color: #ffffff;
+    float: left;
+    display: none;
+    position: absolute;
+    top: 40px;
+    z-index: 900;
+    min-width: 160px;
+    max-width: 220px;
+    _width: 160px;
+    margin-left: 0;
+    margin-right: 0;
+    padding: 6px 0;
+    zoom: 1;
+    border-color: #999;
+    border-color: rgba(0, 0, 0, 0.2);
+    border-style: solid;
+    border-width: 0 1px 1px;
+    -webkit-border-radius: 0 0 6px 6px;
+    -moz-border-radius: 0 0 6px 6px;
+    border-radius: 0 0 6px 6px;
+    -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+    -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+    -webkit-background-clip: padding-box;
+    -moz-background-clip: padding-box;
+    background-clip: padding-box;
+}
+
+.menu-dropdown li, .dropdown-menu li {
+    float: none;
+    display: block;
+    background-color: none;
+}
+
+.menu-dropdown .divider, .dropdown-menu .divider {
+    height: 1px;
+    margin: 5px 0;
+    overflow: hidden;
+    background-color: #eee;
+    border-bottom: 1px solid #ffffff;
+}
+
+.topbar .dropdown-menu a, .dropdown-menu a {
+    display: block;
+    padding: 4px 15px;
+    clear: both;
+    font-weight: normal;
+    line-height: 18px;
+    color: #808080;
+    text-shadow: 0 1px 0 #ffffff;
+}
+
+.topbar .dropdown-menu a:hover, .dropdown-menu a:hover, .topbar .dropdown-menu a.hover,
+    .dropdown-menu a.hover {
+    background-color: #dddddd;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee),
+        to(#dddddd));
+    background-image: -moz-linear-gradient(top, #eeeeee, #dddddd);
+    background-image: -ms-linear-gradient(top, #eeeeee, #dddddd);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee),
+        color-stop(100%, #dddddd));
+    background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd);
+    background-image: -o-linear-gradient(top, #eeeeee, #dddddd);
+    background-image: linear-gradient(top, #eeeeee, #dddddd);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee',
+        endColorstr='#dddddd', GradientType=0);
+    color: #404040;
+    text-decoration: none;
+    -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px
+        rgba(0, 0, 0, 0.025);
+    -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px
+        rgba(0, 0, 0, 0.025);
+    box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px
+        rgba(0, 0, 0, 0.025);
+}
+
+.open .menu, .dropdown.open .menu, .open .dropdown-toggle, .dropdown.open .dropdown-toggle
+    {
+    color: #ffffff;
+    background: #ccc;
+    background: rgba(0, 0, 0, 0.3);
+}
+
+.open .menu-dropdown, .dropdown.open .menu-dropdown, .open .dropdown-menu,
+    .dropdown.open .dropdown-menu {
+    display: block;
+}
+
+.tabs, .pills {
+    margin: 0 0 18px;
+    padding: 0;
+    list-style: none;
+    zoom: 1;
+}
+
+.tabs:before, .pills:before, .tabs:after, .pills:after {
+    display: table;
+    content: "";
+    zoom: 1;
+}
+
+.tabs:after, .pills:after {
+    clear: both;
+}
+
+.tabs>li, .pills>li {
+    float: left;
+}
+
+.tabs>li>a, .pills>li>a {
+    display: block;
+}
+
+.tabs {
+    border-color: #ddd;
+    border-style: solid;
+    border-width: 0 0 1px;
+}
+
+.tabs>li {
+    position: relative;
+    margin-bottom: -1px;
+}
+
+.tabs>li>a {
+    padding: 0 15px;
+    margin-right: 2px;
+    line-height: 34px;
+    border: 1px solid transparent;
+    -webkit-border-radius: 4px 4px 0 0;
+    -moz-border-radius: 4px 4px 0 0;
+    border-radius: 4px 4px 0 0;
+}
+
+.tabs>li>a:hover {
+    text-decoration: none;
+    background-color: #eee;
+    border-color: #eee #eee #ddd;
+}
+
+.tabs .active>a, .tabs .active>a:hover {
+    color: #808080;
+    background-color: #ffffff;
+    border: 1px solid #ddd;
+    border-bottom-color: transparent;
+    cursor: default;
+}
+
+.tabs .menu-dropdown, .tabs .dropdown-menu {
+    top: 35px;
+    border-width: 1px;
+    -webkit-border-radius: 0 6px 6px 6px;
+    -moz-border-radius: 0 6px 6px 6px;
+    border-radius: 0 6px 6px 6px;
+}
+
+.tabs a.menu:after, .tabs .dropdown-toggle:after {
+    border-top-color: #999;
+    margin-top: 15px;
+    margin-left: 5px;
+}
+
+.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle {
+    border-color: #999;
+}
+
+.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after
+    {
+    border-top-color: #555;
+}
+
+.pills a {
+    margin: 5px 3px 5px 0;
+    padding: 0 15px;
+    line-height: 30px;
+    text-shadow: 0 1px 1px #ffffff;
+    -webkit-border-radius: 15px;
+    -moz-border-radius: 15px;
+    border-radius: 15px;
+}
+
+.pills a:hover {
+    color: #ffffff;
+    text-decoration: none;
+    text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
+    background-color: #00438a;
+}
+
+.pills .active a {
+    color: #ffffff;
+    text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
+    background-color: #0069d6;
+}
+
+.pills-vertical>li {
+    float: none;
+}
+
+.tab-content>.tab-pane, .pill-content>.pill-pane, .tab-content>div,
+    .pill-content>div {
+    display: none;
+}
+
+.tab-content>.active, .pill-content>.active {
+    display: block;
+}
+
+.breadcrumb {
+    padding: 7px 14px;
+    margin: 0 0 18px;
+    background-color: #f5f5f5;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff),
+        to(#f5f5f5));
+    background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
+    background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff),
+        color-stop(100%, #f5f5f5));
+    background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
+    background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
+    background-image: linear-gradient(top, #ffffff, #f5f5f5);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',
+        endColorstr='#f5f5f5', GradientType=0);
+    border: 1px solid #ddd;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+    -webkit-box-shadow: inset 0 1px 0 #ffffff;
+    -moz-box-shadow: inset 0 1px 0 #ffffff;
+    box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.breadcrumb li {
+    display: inline;
+    text-shadow: 0 1px 0 #ffffff;
+}
+
+.breadcrumb .divider {
+    padding: 0 5px;
+    color: #bfbfbf;
+}
+
+.breadcrumb .active a {
+    color: #404040;
+}
+
+.hero-unit {
+    background-color: #f5f5f5;
+    margin-bottom: 30px;
+    padding: 60px;
+    -webkit-border-radius: 6px;
+    -moz-border-radius: 6px;
+    border-radius: 6px;
+}
+
+.hero-unit h1 {
+    margin-bottom: 0;
+    font-size: 60px;
+    line-height: 1;
+    letter-spacing: -1px;
+}
+
+.hero-unit p {
+    font-size: 18px;
+    font-weight: 200;
+    line-height: 27px;
+}
+
+footer {
+    margin-top: 17px;
+    padding-top: 17px;
+    border-top: 1px solid #eee;
+}
+
+.page-header {
+    margin-bottom: 17px;
+    border-bottom: 1px solid #ddd;
+    -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+    -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.page-header h1 {
+    margin-bottom: 8px;
+}
+
+.btn.danger, .alert-message.danger, .btn.danger:hover, .alert-message.danger:hover,
+    .btn.error, .alert-message.error, .btn.error:hover, .alert-message.error:hover,
+    .btn.success, .alert-message.success, .btn.success:hover,
+    .alert-message.success:hover, .btn.info, .alert-message.info, .btn.info:hover,
+    .alert-message.info:hover {
+    color: #ffffff;
+}
+
+.btn .close, .alert-message .close {
+    font-family: Arial, sans-serif;
+    line-height: 18px;
+}
+
+.btn.danger, .alert-message.danger, .btn.error, .alert-message.error {
+    background-color: #c43c35;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b),
+        to(#c43c35));
+    background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+    background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b),
+        color-stop(100%, #c43c35));
+    background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+    background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+    background-image: linear-gradient(top, #ee5f5b, #c43c35);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',
+        endColorstr='#c43c35', GradientType=0);
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+    border-color: #c43c35 #c43c35 #882a25;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+
+.btn.success, .alert-message.success {
+    background-color: #57a957;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462),
+        to(#57a957));
+    background-image: -moz-linear-gradient(top, #62c462, #57a957);
+    background-image: -ms-linear-gradient(top, #62c462, #57a957);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462),
+        color-stop(100%, #57a957));
+    background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+    background-image: -o-linear-gradient(top, #62c462, #57a957);
+    background-image: linear-gradient(top, #62c462, #57a957);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',
+        endColorstr='#57a957', GradientType=0);
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+    border-color: #57a957 #57a957 #3d773d;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+
+.btn.info, .alert-message.info {
+    background-color: #339bb9;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de),
+        to(#339bb9));
+    background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+    background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de),
+        color-stop(100%, #339bb9));
+    background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+    background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+    background-image: linear-gradient(top, #5bc0de, #339bb9);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',
+        endColorstr='#339bb9', GradientType=0);
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+    border-color: #339bb9 #339bb9 #22697d;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+
+.btn {
+    cursor: pointer;
+    display: inline-block;
+    background-color: #e6e6e6;
+    background-repeat: no-repeat;
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff),
+        color-stop(25%, #ffffff), to(#e6e6e6));
+    background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
+    background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',
+        endColorstr='#e6e6e6', GradientType=0);
+    padding: 5px 14px 6px;
+    text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+    color: #333;
+    font-size: 13px;
+    line-height: normal;
+    border: 1px solid #ccc;
+    border-bottom-color: #bbb;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px
+        rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px
+        rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px
+        rgba(0, 0, 0, 0.05);
+    -webkit-transition: 0.1s linear all;
+    -moz-transition: 0.1s linear all;
+    -ms-transition: 0.1s linear all;
+    -o-transition: 0.1s linear all;
+    transition: 0.1s linear all;
+}
+
+.btn:hover {
+    background-position: 0 -15px;
+    color: #333;
+    text-decoration: none;
+}
+
+.btn:focus {
+    outline: 1px dotted #666;
+}
+
+.btn.primary {
+    color: #ffffff;
+    background-color: #0064cd;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb),
+        to(#0064cd));
+    background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
+    background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb),
+        color-stop(100%, #0064cd));
+    background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
+    background-image: -o-linear-gradient(top, #049cdb, #0064cd);
+    background-image: linear-gradient(top, #049cdb, #0064cd);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb',
+        endColorstr='#0064cd', GradientType=0);
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+    border-color: #0064cd #0064cd #003f81;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+
+.btn.active, .btn :active {
+    -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px
+        rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px
+        rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px
+        rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled {
+    cursor: default;
+    background-image: none;
+    filter: progid:DXImageTransform.Microsoft.gradient(enabled= false);
+    filter: alpha(opacity = 65);
+    -khtml-opacity: 0.65;
+    -moz-opacity: 0.65;
+    opacity: 0.65;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+.btn[disabled] {
+    cursor: default;
+    background-image: none;
+    filter: progid:DXImageTransform.Microsoft.gradient(enabled= false);
+    filter: alpha(opacity = 65);
+    -khtml-opacity: 0.65;
+    -moz-opacity: 0.65;
+    opacity: 0.65;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+.btn.large {
+    font-size: 15px;
+    line-height: normal;
+    padding: 9px 14px 9px;
+    -webkit-border-radius: 6px;
+    -moz-border-radius: 6px;
+    border-radius: 6px;
+}
+
+.btn.small {
+    padding: 7px 9px 7px;
+    font-size: 11px;
+}
+
+:root .alert-message, :root .btn {
+    border-radius: 0 \0;
+}
+
+button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
+    padding: 0;
+    border: 0;
+}
+
+.close {
+    float: right;
+    color: #000000;
+    font-size: 20px;
+    font-weight: bold;
+    line-height: 13.5px;
+    text-shadow: 0 1px 0 #ffffff;
+    filter: alpha(opacity = 25);
+    -khtml-opacity: 0.25;
+    -moz-opacity: 0.25;
+    opacity: 0.25;
+}
+
+.close:hover {
+    color: #000000;
+    text-decoration: none;
+    filter: alpha(opacity = 40);
+    -khtml-opacity: 0.4;
+    -moz-opacity: 0.4;
+    opacity: 0.4;
+}
+
+.alert-message {
+    position: relative;
+    padding: 7px 15px;
+    margin-bottom: 18px;
+    color: #404040;
+    background-color: #eedc94;
+    background-repeat: repeat-x;
+    background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1),
+        to(#eedc94));
+    background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
+    background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1),
+        color-stop(100%, #eedc94));
+    background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
+    background-image: -o-linear-gradient(top, #fceec1, #eedc94);
+    background-image: linear-gradient(top, #fceec1, #eedc94);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1',
+        endColorstr='#eedc94', GradientType=0);
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+    border-color: #eedc94 #eedc94 #e4c652;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+    border-width: 1px;
+    border-style: solid;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
+    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
+    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+
+.alert-message .close {
+    margin-top: 1px;
+    *margin-top: 0;
+}
+
+.alert-message a {
+    font-weight: bold;
+    color: #404040;
+}
+
+.alert-message.danger p a, .alert-message.error p a, .alert-message.success p a,
+    .alert-message.info p a {
+    color: #ffffff;
+}
+
+.alert-message h5 {
+    line-height: 18px;
+}
+
+.alert-message p {
+    margin-bottom: 0;
+}
+
+.alert-message div {
+    margin-top: 5px;
+    margin-bottom: 2px;
+    line-height: 28px;
+}
+
+.alert-message .btn {
+    -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+    -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+
+.alert-message.block-message {
+    background-image: none;
+    background-color: #fdf5d9;
+    filter: progid:DXImageTransform.Microsoft.gradient(enabled= false);
+    padding: 14px;
+    border-color: #fceec1;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+.alert-message.block-message ul, .alert-message.block-message p {
+    margin-right: 30px;
+}
+
+.alert-message.block-message ul {
+    margin-bottom: 0;
+}
+
+.alert-message.block-message li {
+    color: #404040;
+}
+
+.alert-message.block-message .alert-actions {
+    margin-top: 5px;
+}
+
+.alert-message.block-message.error, .alert-message.block-message.success,
+    .alert-message.block-message.info {
+    color: #404040;
+    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.alert-message.block-message.error {
+    background-color: #fddfde;
+    border-color: #fbc7c6;
+}
+
+.alert-message.block-message.success {
+    background-color: #d1eed1;
+    border-color: #bfe7bf;
+}
+
+.alert-message.block-message.info {
+    background-color: #ddf4fb;
+    border-color: #c6edf9;
+}
+
+.alert-message.block-message.danger p a, .alert-message.block-message.error p a,
+    .alert-message.block-message.success p a, .alert-message.block-message.info p a
+    {
+    color: #404040;
+}
+
+.pagination {
+    height: 36px;
+    margin: 18px 0;
+}
+
+.pagination ul {
+    float: left;
+    margin: 0;
+    border: 1px solid #ddd;
+    border: 1px solid rgba(0, 0, 0, 0.15);
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+    -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination li {
+    display: inline;
+}
+
+.pagination a {
+    float: left;
+    padding: 0 14px;
+    line-height: 34px;
+    border-right: 1px solid;
+    border-right-color: #ddd;
+    border-right-color: rgba(0, 0, 0, 0.15);
+    *border-right-color: #ddd;
+    text-decoration: none;
+}
+
+.pagination a:hover, .pagination .active a {
+    background-color: #c7eefe;
+}
+
+.pagination .disabled a, .pagination .disabled a:hover {
+    background-color: transparent;
+    color: #bfbfbf;
+}
+
+.pagination .next a {
+    border: 0;
+}
+
+.well {
+    background-color: #f5f5f5;
+    margin-bottom: 20px;
+    padding: 19px;
+    min-height: 20px;
+    border: 1px solid #eee;
+    border: 1px solid rgba(0, 0, 0, 0.05);
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+    border-color: #ddd;
+    border-color: rgba(0, 0, 0, 0.15);
+}
+
+.modal-backdrop {
+    background-color: #000000;
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 10000;
+}
+
+.modal-backdrop.fade {
+    opacity: 0;
+}
+
+.modal-backdrop, .modal-backdrop.fade.in {
+    filter: alpha(opacity = 80);
+    -khtml-opacity: 0.8;
+    -moz-opacity: 0.8;
+    opacity: 0.8;
+}
+
+.modal {
+    position: fixed;
+    top: 50%;
+    left: 50%;
+    z-index: 11000;
+    width: 560px;
+    margin: -250px 0 0 -280px;
+    background-color: #ffffff;
+    border: 1px solid #999;
+    border: 1px solid rgba(0, 0, 0, 0.3);
+    *border: 1px solid #999;
+    -webkit-border-radius: 6px;
+    -moz-border-radius: 6px;
+    border-radius: 6px;
+    -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+    -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+    -webkit-background-clip: padding-box;
+    -moz-background-clip: padding-box;
+    background-clip: padding-box;
+}
+
+.modal .close {
+    margin-top: 7px;
+}
+
+.modal.fade {
+    -webkit-transition: opacity .3s linear, top .3s ease-out;
+    -moz-transition: opacity .3s linear, top .3s ease-out;
+    -ms-transition: opacity .3s linear, top .3s ease-out;
+    -o-transition: opacity .3s linear, top .3s ease-out;
+    transition: opacity .3s linear, top .3s ease-out;
+    top: -25%;
+}
+
+.modal.fade.in {
+    top: 50%;
+}
+
+.modal-header {
+    border-bottom: 1px solid #eee;
+    padding: 5px 15px;
+}
+
+.modal-body {
+    padding: 15px;
+}
+
+.modal-body form {
+    margin-bottom: 0;
+}
+
+.modal-footer {
+    background-color: #f5f5f5;
+    padding: 14px 15px 15px;
+    border-top: 1px solid #ddd;
+    -webkit-border-radius: 0 0 6px 6px;
+    -moz-border-radius: 0 0 6px 6px;
+    border-radius: 0 0 6px 6px;
+    -webkit-box-shadow: inset 0 1px 0 #ffffff;
+    -moz-box-shadow: inset 0 1px 0 #ffffff;
+    box-shadow: inset 0 1px 0 #ffffff;
+    zoom: 1;
+    margin-bottom: 0;
+}
+
+.modal-footer:before, .modal-footer:after {
+    display: table;
+    content: "";
+    zoom: 1;
+}
+
+.modal-footer:after {
+    clear: both;
+}
+
+.modal-footer .btn {
+    float: right;
+    margin-left: 5px;
+}
+
+.modal .popover, .modal .twipsy {
+    z-index: 12000;
+}
+
+.twipsy {
+    display: block;
+    position: absolute;
+    visibility: visible;
+    padding: 5px;
+    font-size: 11px;
+    z-index: 1000;
+    filter: alpha(opacity = 80);
+    -khtml-opacity: 0.8;
+    -moz-opacity: 0.8;
+    opacity: 0.8;
+}
+
+.twipsy.fade.in {
+    filter: alpha(opacity = 80);
+    -khtml-opacity: 0.8;
+    -moz-opacity: 0.8;
+    opacity: 0.8;
+}
+
+.twipsy.above .twipsy-arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-top: 5px solid #000000;
+}
+
+.twipsy.left .twipsy-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -5px;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-left: 5px solid #000000;
+}
+
+.twipsy.below .twipsy-arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-bottom: 5px solid #000000;
+}
+
+.twipsy.right .twipsy-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -5px;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-right: 5px solid #000000;
+}
+
+.twipsy-inner {
+    padding: 3px 8px;
+    background-color: #000000;
+    color: white;
+    text-align: center;
+    max-width: 200px;
+    text-decoration: none;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+}
+
+.twipsy-arrow {
+    position: absolute;
+    width: 0;
+    height: 0;
+}
+
+.popover {
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 1000;
+    padding: 5px;
+    display: none;
+}
+
+.popover.above .arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-top: 5px solid #000000;
+}
+
+.popover.right .arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -5px;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-right: 5px solid #000000;
+}
+
+.popover.below .arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-bottom: 5px solid #000000;
+}
+
+.popover.left .arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -5px;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-left: 5px solid #000000;
+}
+
+.popover .arrow {
+    position: absolute;
+    width: 0;
+    height: 0;
+}
+
+.popover .inner {
+    background: #000000;
+    background: rgba(0, 0, 0, 0.8);
+    padding: 3px;
+    overflow: hidden;
+    width: 280px;
+    -webkit-border-radius: 6px;
+    -moz-border-radius: 6px;
+    border-radius: 6px;
+    -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+    -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+}
+
+.popover .title {
+    background-color: #f5f5f5;
+    padding: 9px 15px;
+    line-height: 1;
+    -webkit-border-radius: 3px 3px 0 0;
+    -moz-border-radius: 3px 3px 0 0;
+    border-radius: 3px 3px 0 0;
+    border-bottom: 1px solid #eee;
+}
+
+.popover .content {
+    background-color: #ffffff;
+    padding: 14px;
+    -webkit-border-radius: 0 0 3px 3px;
+    -moz-border-radius: 0 0 3px 3px;
+    border-radius: 0 0 3px 3px;
+    -webkit-background-clip: padding-box;
+    -moz-background-clip: padding-box;
+    background-clip: padding-box;
+}
+
+.popover .content p, .popover .content ul, .popover .content ol {
+    margin-bottom: 0;
+}
+
+.fade {
+    -webkit-transition: opacity 0.15s linear;
+    -moz-transition: opacity 0.15s linear;
+    -ms-transition: opacity 0.15s linear;
+    -o-transition: opacity 0.15s linear;
+    transition: opacity 0.15s linear;
+    opacity: 0;
+}
+
+.fade.in {
+    opacity: 1;
+}
+
+.label {
+    padding: 1px 3px 2px;
+    font-size: 9.75px;
+    font-weight: bold;
+    color: #ffffff;
+    text-transform: uppercase;
+    white-space: nowrap;
+    background-color: #bfbfbf;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+}
+
+.label.important {
+    background-color: #c43c35;
+}
+
+.label.warning {
+    background-color: #f89406;
+}
+
+.label.success {
+    background-color: #46a546;
+}
+
+.label.notice {
+    background-color: #62cffc;
+}
+
+.media-grid {
+    margin-left: -20px;
+    margin-bottom: 0;
+    zoom: 1;
+}
+
+.media-grid:before, .media-grid:after {
+    display: table;
+    content: "";
+    zoom: 1;
+}
+
+.media-grid:after {
+    clear: both;
+}
+
+.media-grid li {
+    display: inline;
+}
+
+.media-grid a {
+    float: left;
+    padding: 4px;
+    margin: 0 0 18px 20px;
+    border: 1px solid #ddd;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+    -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.media-grid a img {
+    display: block;
+}
+
+.media-grid a:hover {
+    border-color: #0069d6;
+    -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+    -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+    box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/org_chart/css/custom.css b/ui/src/main/webapp/static/fusion/sample/org_chart/css/custom.css
new file mode 100644 (file)
index 0000000..9d48c0b
--- /dev/null
@@ -0,0 +1,98 @@
+body, html, div, p, span, a, h1, h2, h3, h4, h5 {
+    margin: 0;
+    padding: 0;
+}
+
+body, html {
+    width: 100%;
+}
+
+body {
+    color: white;
+    font-family: tahoma;
+    font-weight: lighter;
+    padding-top: 40px;
+}
+
+body p {
+    font-size: 14px;
+}
+
+body p a {
+    font-size: 16px;
+}
+
+h1 {
+    color: #E05E00;
+    font-style: italic;
+}
+
+a {
+    color: #E05E00;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+/* general */
+.clear {
+    clear: both;
+}
+
+/* Header */
+.brand {
+    color: #E05E00 !important;
+    font-family: georgia;
+    font-style: italic;
+}
+
+/* list stuff */
+#org {
+    background-color: white;
+    margin: 10px;
+    padding: 10px;
+}
+
+#show-list {
+    cursor: pointer;
+}
+
+/* bootstrap overrides */
+.alert-message {
+    margin: 2px 0;
+}
+
+.topbar {
+    position: absolute;
+}
+
+/* Custom chart styling */
+.jOrgChart {
+    margin: 10px;
+    padding: 20px;
+}
+
+/* Custom node styling */
+.jOrgChart .node {
+    font-weight: bold;
+    font-size: 14px;
+    background-color: #D5D6DB;
+    border-radius: 8px;
+    border: 5px solid gray;
+    color: #793a06;
+    -moz-border-radius: 8px;
+}
+
+.node p {
+    font-family: tahoma;
+    font-size: 10px;
+    line-height: 11px;
+    padding: 2px;
+}
+
+table {
+    margin-left: auto;
+    margin-right: auto;
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/org_chart/css/prettify.css b/ui/src/main/webapp/static/fusion/sample/org_chart/css/prettify.css
new file mode 100644 (file)
index 0000000..dd86846
--- /dev/null
@@ -0,0 +1,91 @@
+.pln {
+    color: #000
+}
+
+@media screen {
+    .str {
+        color: #080
+    }
+    .kwd {
+        color: #008
+    }
+    .com {
+        color: #800
+    }
+    .typ {
+        color: #606
+    }
+    .lit {
+        color: #066
+    }
+    .pun, .opn, .clo {
+        color: #660
+    }
+    .tag {
+        color: #008
+    }
+    .atn {
+        color: #606
+    }
+    .atv {
+        color: #080
+    }
+    .dec, .var {
+        color: #606
+    }
+    .fun {
+        color: red
+    }
+}
+
+@media print , projection {
+    .str {
+        color: #060
+    }
+    .kwd {
+        color: #006;
+        font-weight: bold
+    }
+    .com {
+        color: #600;
+        font-style: italic
+    }
+    .typ {
+        color: #404;
+        font-weight: bold
+    }
+    .lit {
+        color: #044
+    }
+    .pun, .opn, .clo {
+        color: #440
+    }
+    .tag {
+        color: #006;
+        font-weight: bold
+    }
+    .atn {
+        color: #404
+    }
+    .atv {
+        color: #060
+    }
+}
+
+pre.prettyprint {
+    padding: 2px;
+    border: 1px solid #888
+}
+
+ol.linenums {
+    margin-top: 0;
+    margin-bottom: 0
+}
+
+li.L0, li.L1, li.L2, li.L3, li.L5, li.L6, li.L7, li.L8 {
+    list-style-type: none
+}
+
+li.L1, li.L3, li.L5, li.L7, li.L9 {
+    background: #eee
+}
\ No newline at end of file
diff --git a/ui/src/main/webapp/static/fusion/sample/org_chart/prettify.js b/ui/src/main/webapp/static/fusion/sample/org_chart/prettify.js
new file mode 100644 (file)
index 0000000..eef5ad7
--- /dev/null
@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/ui/src/main/webapp/views/committedSubmissions.html b/ui/src/main/webapp/views/committedSubmissions.html
deleted file mode 100644 (file)
index a3d1072..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-<!--
-Copyright (c) 2019 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.
--->
-
-<!DOCTYPE script PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html ng-app="BlueprintValidationUIManagement">
-<head>
-<style>
-.formfield * {
-       vertical-align: top;
-}
-
-.pagination {
-       display: inline-block;
-       float: right;
-}
-
-.pagination li {
-       list-style-type: none;
-       color: white;
-       float: left;
-       padding: 8px 16px;
-       text-decoration: none;
-       transition: background-color .3s;
-       border: 1px solid #ddd;
-}
-
-.pagination li.active {
-       background-color: #DCDCDC;
-       color: white;
-       border: 1px solid #ddd;
-}
-
-input[type="file"] {
-       display: inline-block;
-}
-
-.md-backdrop {
-       display: none;
-}
-/*.md-sidenav-right .md-theme-indigo, .md-sidenav-right .nav-theme {
-         background-color: #cccccc;
-         }*/
-/*.md-sidenav-backdrop md-opaque{
-         opacity:0;
-         }*/
-md-backdrop.md-opaque.md-default-theme, md-backdrop.md-opaque {
-       background-color: rgba(0, 0, 0, 0);
-}
-
-md-content.md-default-theme, md-content {
-       background-color: #cccccc;
-}
-
-md-sidenav.md-default-theme, md-sidenav {
-       background-color: #cccccc;
-}
-
-.vertical-menu {
-       width: 200px;
-       height: 150px;
-       overflow-y: auto;
-}
-
-input[type=text], select, textarea {
-       width: 40%;
-       padding: 3px;
-       border: 0.5px solid #ccc;
-       border-radius: 4px;
-       box-sizing: border-box;
-       margin-top: 3px;
-       margin-bottom: 3px;
-       resize: vertical;
-}
-
-pre {
-       font-size: 15px;
-       color: black;
-}
-</style>
-</head>
-<body ng-controller="AECCommittedSubmissionsController">
- <div id="akrainocontent"
-  style="padding-left: 20px; padding-right: 20px; float: left; width: 90%;">
-  <div>
-   <h1>Committed Submissions</h1>
-  </div>
-  <!-- <label>Select Submissions: </label> -->
-  <br>
-  <div class="selectStyle">
-   <select class="exampleTable" style="width: 200px; height: 40px;">
-    <option value="">All submissions</option>
-   </select>
-  </div>
-  <div id="commandTable" style="padding-bottom: 1px; padding-top: 30px">
-   <form>
-    <div class="form-group">
-     <div class="input-group">
-      <div class="input-group-addon">
-       <i class="fa fa-search"> </i>
-      </div>
-      <input type="text" style="width: 300px" class="form-control"
-       placeholder="Search Committed Submissions" ng-model="q">
-      <div style="float: right;">
-       <a
-        style="padding-left: 5px; font-size: 16px; cursor: pointer; margin-top: 20px; color: #4d4d4d"
-        ng-click="refreshCommittedSubmissions()"> Refresh </a>
-       <button class="refreshbutton" style="margin-left: 5px;"
-        ng-click="deleteSubmissions()">Delete selected
-        submissions</button>
-       <button class="refreshbutton" style="margin-left: 5px;">Delete
-        all submissions</button>
-      </div>
-     </div>
-    </div>
-   </form>
-  </div>
-  <table cellspacing="0" cellpadding="10" class="siteStatusTable">
-   <thead>
-    <tr>
-     <th>&nbsp;</th>
-     <th>Id&nbsp;</th>
-     <th>Status&nbsp;</th>
-     <th>Blueprint&nbsp;</th>
-     <th>Version</th>
-     <th>Layer&nbsp;</th>
-     <th>Desired Timeslot&nbsp;</th>
-     <th>Url of result&nbsp;</th>
-    </tr>
-   </thead>
-   <tbody>
-    <tr class="border_bottom" ng-repeat="submission in submissions">
-     <td><input type="checkbox" name="name1" ng-model="temp"
-      ng-change="modifySubmissionIdList(submission.submissionId)" />&nbsp;</td>
-     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-      submission.submissionId }}</td>
-     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-      submission.submissionStatus }}</td>
-     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-      submission.blueprintInstance.blueprint.blueprintName }}</td>
-     <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-      submission.blueprintInstance.version }}</td>
-     <td style="padding-left: 10px; font-size: 15px; width: 13%;">
-      <a href="#" data-toggle="tooltip"
-      title="{{submission.blueprintInstance.layer_description }}">{{
-       submission.blueprintInstance.layer }}</a>
-     </td>
-     <td style="padding-left: 10px; font-size: 15px; width: 13%;">Lab:
-      {{ submission.blueprintInstance.timeslot.lab }} Start date and
-      time: {{ submission.blueprintInstance.timeslot.startDateTime }}
-      duration(in sec) :
-      {{submission.blueprintInstance.timeslot.duration}}</td>
-     <td style="padding-left: 10px; font-size: 15px; width: 13%;">
-      <a href="{{submission.nexusResultUrl }}">{{
-       submission.nexusResultUrl }}</a>
-     </td>
-    </tr>
-   </tbody>
-  </table>
-  <p></p>
-  <div class="pagination">
-   <ul>
-    <li ng-class="{disabled: currentPage == 0}"><a href
-     ng-click="prevPage()"> Prev </a></li>
-    <li ng-repeat="n in range(pagedItems.length)"
-     ng-class="{active: n == currentPage}" ng-click="setPage()"><a
-     href ng-bind="n + 1">1 </a></li>
-    <li ng-class="{disabled: currentPage == pagedItems.length - 1}">
-     <a href ng-click="nextPage()">Next </a>
-    </li>
-   </ul>
-  </div>
- </div>
-
- <script>
-       $(document).ready(function(){
-               $('[data-toggle="tooltip"]').tooltip(); 
-       });
-       </script>
-
-</body>
-
-
-</html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/views/findBySubmissionId.html b/ui/src/main/webapp/views/findBySubmissionId.html
deleted file mode 100644 (file)
index 2900b25..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-<!--
-Copyright (c) 2019 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.
--->
-
-<!DOCTYPE script PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html ng-app="BlueprintValidationUIManagement">
-<head>
-<style>
-.graph, .empty-graph {
-       border: 1px solid #ccc;
-       width: auto;
-       height: 7px;
-       padding: 0;
-       background: #f33;
-}
-
-.pass-bar {
-       background: #1d4;
-}
-
-.pass-bar, .fail-bar {
-       float: left;
-       height: 100%;
-}
-</style>
-</head>
-<body ng-controller="AECFindBySubmissionIdController">
- <div id="akrainofindbysubmissionidform"
-  style="padding-left: 20px; padding-right: 20px">
-  <div>
-   <h1>Find results by submission</h1>
-  </div>
-
-  <label>Select Submission: </label>
-  <div class="selectStyle">
-   <select class="exampleTable" ng-model="selectedSubmission"
-    ng-init="selectedSubmission=submissionsForDisplay[0]"
-    ng-change="selectedSubmissionChange(selectedSubmission)"
-    ng-options="n for n in submissionsForDisplay">
-   </select>
-  </div>
-
-  <div ng-repeat="result in results">
-
-   <h2>Test info</h2>
-   <p></p>
-   <p>Name: {{result.name}}</p>
-   <p>Generated: {{result.robot.generated}}</p>
-   <p>Generator: {{result.robot.generator}}</p>
-   <p>Errors: {{result.robot.errors}}</p>
-
-   <h2>Test Statistics</h2>
-   <p></p>
-   <table cellspacing="0" cellpadding="10" class="siteStatusTable">
-    <caption>
-     <h3></h3>
-    </caption>
-    <thead>
-     <th>&nbsp;Total statistics&nbsp;</th>
-     <th>Total&nbsp;</th>
-     <th>Pass&nbsp;</th>
-     <th>Fail&nbsp;</th>
-     <th>Pass / Fail&nbsp;</th>
-     </tr>
-    </thead>
-    <tbody>
-     <tr class="border_bottom"
-      ng-repeat="stat in result.robot.statistics.total.stat">
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.content }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       (stat.fail * 1) + (stat.pass*1) }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.pass }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.fail}}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">
-       <div class="graph">
-        <div class="pass-bar"
-         ng-style="{ 'width': {{(100* stat.pass/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
-         title="100%"></div>
-        <div class="fail-bar"
-         ng-style="{ 'width': {{(100* stat.fail/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
-         title="0%"></div>
-       </div>
-      </td>
-     </tr>
-    </tbody>
-   </table>
-
-   <table cellspacing="0" cellpadding="10" class="siteStatusTable">
-    <caption>
-     <h3></h3>
-    </caption>
-    <thead>
-     <th>&nbsp;Statistics by Tag&nbsp;</th>
-     <th>Total&nbsp;</th>
-     <th>Pass&nbsp;</th>
-     <th>Fail&nbsp;</th>
-     <th>Pass / Fail&nbsp;</th>
-     </tr>
-    </thead>
-    <tbody>
-     <tr class="border_bottom"
-      ng-repeat="stat in results.robot.statistics.tag.stat">
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.content }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       (stat.fail * 1) + (stat.pass*1) }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.pass }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.fail}}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">
-       <div class="graph">
-        <div class="pass-bar"
-         ng-style="{ 'width': {{(100* stat.pass/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
-         title="100%"></div>
-        <div class="fail-bar"
-         ng-style="{ 'width': {{(100* stat.fail/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
-         title="0%"></div>
-       </div>
-      </td>
-     </tr>
-    </tbody>
-   </table>
-
-   <table cellspacing="0" cellpadding="10" class="siteStatusTable">
-    <caption>
-     <h3></h3>
-    </caption>
-    <thead>
-     <th>&nbsp;Statistics by Suite&nbsp;</th>
-     <th>Total&nbsp;</th>
-     <th>Pass&nbsp;</th>
-     <th>Fail&nbsp;</th>
-     <th>Pass / Fail&nbsp;</th>
-     </tr>
-    </thead>
-    <tbody>
-     <tr class="border_bottom"
-      ng-repeat="stat in result.robot.statistics.suite.stat">
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.content }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       (stat.fail * 1) + (stat.pass*1) }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.pass }}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">{{
-       stat.fail}}</td>
-      <td style="padding-left: 10px; font-size: 15px; width: 13%;">
-       <div class="graph">
-        <div class="pass-bar"
-         ng-style="{ 'width': {{(100* stat.pass/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
-         title="100%"></div>
-        <div class="fail-bar"
-         ng-style="{ 'width': {{(100* stat.fail/((stat.fail * 1) + (stat.pass*1)) )| number:0}} + '%' }"
-         title="0%"></div>
-       </div>
-      </td>
-     </tr>
-    </tbody>
-   </table>
-
-  </div>
- </div>
-</body>
-
-</html>
-
diff --git a/ui/src/main/webapp/views/indexMain.html b/ui/src/main/webapp/views/indexMain.html
deleted file mode 100644 (file)
index 758bb3a..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-<!--
-Copyright (c) 2019 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.
--->
-
-<div>
- <div class="header" style="width: 100%"
-  style="padding-top:5px; padding-bottom:5px;background-color:#000000;">
-  <a href="https://www.akraino.org/"> <img
-   src="./resources/images/logo_akraino_edge_stack.png" alt="Akraino"
-   width="200" height="57" border="0">
-  </a>
-  <p></p>
-  <p style="color: white;">
-   <b> <font size="14">&emsp;Blueprint Validation UI</font></b>
-  </p>
-  <div class="header-right">
-   <a class="active" href="#home">Home</a> <a href="#"
-    style="font-color: #FFFFFF">Documentation</a> <a href="#"
-    style="font-color: #FFFFFF"
-    ng-show="$state.current.name == 'undefined' || $state.current.name != 'login'"
-    ng-click="goLogout()">Sign Out</a>
-  </div>
- </div>
- <div id="wrapper" style="margin-top: 0.1px;">
-  <div id="sidebar-wrapper"
-   ng-show="$state.current.name == 'undefined' || $state.current.name != 'login'"
-   ng-cloak>
-   <ul class="sidebar-nav">
-    <li><a
-     ng-class="{example : $state.current.name == 'committedSubmissions'}"
-     ui-sref="committedSubmissions"> <i class="fa fa-home"></i> <span>Committed
-       Submissions</span>
-    </a></li>
-    <li><a
-     ng-class="{example : $state.current.name == 'newSubmission'}"
-     ui-sref="newSubmission"> <i class="fa fa-home"></i> <span>New
-       Submission</span>
-    </a></li>
-    <li class="dropdown"><a class="dropdown-toggle"
-     data-toggle="collapse" data-target="#configuracoes1" role="button"
-     aria-haspopup="true" aria-expanded="false"><i class="fa fa-cog"></i>Blueprint
-      Validation Results<span class="caret"> </span></a>
-     <ul id="configuracoes1" class="collapse">
-      <li><a
-       ng-class="{example : $state.current.name == 'eteTest'}"
-       ui-sref="eteTest"> <i class="fa fa-check"></i><span>Get
-         all</span>
-      </a></li>
-      <li><a
-       ng-class="{example : $state.current.name == 'eteChomp'}"
-       ui-sref="eteChomp"> <i class="fa fa-check"></i><span>Get
-         by blueprint name</span>
-      </a></li>
-      <li><a
-       ng-class="{example : $state.current.name == 'eteChomp'}"
-       ui-sref="eteChomp"> <i class="fa fa-check"></i><span>Get
-         by layer</span>
-      </a></li>
-      <li><a
-       ng-class="{example : $state.current.name == 'findBySubmission'}"
-       ui-sref="findBySubmissionId"> <i class="fa fa-check"></i><span>Get
-         by submission id</span>
-      </a></li>
-      <li><a
-       ng-class="{example : $state.current.name == 'eteChomp'}"
-       ui-sref="eteChomp"> <i class="fa fa-check"></i><span>Get
-         by execution dates</span>
-      </a></li>
-      <li><a
-       ng-class="{example : $state.current.name == 'eteChomp'}"
-       ui-sref="eteChomp"> <i class="fa fa-check"></i><span>Get
-         by # of successful runs</span>
-      </a></li>
-      <li><a
-       ng-class="{example : $state.current.name == 'eteChomp'}"
-       ui-sref="eteChomp"> <i class="fa fa-check"></i><span>Get
-         by # of successful last runs</span>
-      </a></li>
-      <li><a
-       ng-class="{example : $state.current.name == 'eteChomp'}"
-       ui-sref="eteChomp"> <i class="fa fa-check"></i><span>Get
-         by # of failed last runs</span>
-      </a></li>
-     </ul></li>
-   </ul>
-  </div>
-  <!-- /#sidebar-wrapper -->
-  <!-- Page Content -->
-  <div id="page-content-wrapper"
-   ng-show="$state.current.name == 'undefined' || $state.current.name != 'login'"
-   style="overflow: auto;" ng-cloak>
-   <div class="container-fluid">
-    <div class="row">
-     <div class="col-lg-12" style="padding-right: 0px;">
-      <div id="wrapper">
-       <!-- Carrega todas as p�ginas-->
-       <div ui-view="main"></div>
-      </div>
-     </div>
-    </div>
-   </div>
-  </div>
-  <!-- /#page-content-wrapper -->
- </div>
-</div>
diff --git a/ui/src/main/webapp/views/login.html b/ui/src/main/webapp/views/login.html
deleted file mode 100644 (file)
index daf5454..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-<!--
-Copyright (c) 2019 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.
--->
--->
-
-<html ng-app="BlueprintValidationUIManagement">
-<head>
-<style>
-.form_bg {
-       background-color: #eee;
-       color: #666;
-       padding: 20px;
-       border-radius: 10px;
-       position: absolute;
-       border: 1px solid #fff;
-       top: 0;
-       right: 0;
-       bottom: 0;
-       left: 0;
-       margin: auto;
-       width: 400px;
-       height: 320px;
-}
-
-.form-control {
-       width: 320px;
-}
-
-.align-center {
-       text-align: center;
-}
-</style>
-</head>
-<body ng-controller="Login">
- <div>
-  <div class="header" style="width: 100%"
-   style="padding-top:10px; padding-bottom:10px">
-   <a href="https://www.akraino.org/"> <img
-    src="./resources/images/logo_akraino_edge_stack.png" alt="Akraino"
-    width="200" height="57" border="0">
-   </a>
-   <div class="header-right">
-    <a class="active" href="#home">Home</a> <a href="#"
-     style="font-color: #FFFFFF">Documentation</a> <a href="#"
-     style="font-color: #FFFFFF"
-     ng-show="$state.current.name == 'undefined' || $state.current.name != 'login'"
-     ng-click="goLogout()">Sign Out</a>
-   </div>
-  </div>
- </div>
- <div class="container">
-  <div class="row">
-   <h1 style="color: blue;" class="align-center">Blueprint
-    Validation UI</h1>
-   <h2 class="align-center">Sign In Page</h2>
-   <div class="form_bg" style="margin-top: 230px;">
-    <form>
-     <br />
-     <div class="form-group">
-      <label
-       style="margin-left: auto; margin-right: auto; padding-left: 15px;">{{message}}</label>
-      <input type="text" style="margin-left: auto; margin-right: auto;"
-       class="form-control" id="userid" placeholder="User name"
-       ng-model="usernameVal"> <label
-       style="display: block; text-align: center; color: red;">{{
-       userMessage }}</label>
-     </div>
-     <div class="form-group">
-      <input type="password"
-       style="margin-left: auto; margin-right: auto;"
-       class="form-control" id="pwd" placeholder="Password"
-       ng-model="passwordVal"> <label
-       style="display: block; text-align: center; color: red;">{{
-       passwordMessage }}</label>
-     </div>
-     <br />
-     <div class="align-center">
-      <button type="submit" class="btn btn-default" id="login"
-       ng-click="goLogin()">Login</button>
-     </div>
-    </form>
-   </div>
-  </div>
- </div>
-</body>
-<html>
\ No newline at end of file
diff --git a/ui/src/main/webapp/views/newSubmission.html b/ui/src/main/webapp/views/newSubmission.html
deleted file mode 100644 (file)
index 11c8afa..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
-Copyright (c) 2019 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.
--->
-
-<!DOCTYPE script PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html ng-app="BlueprintValidationUIManagement">
-<head>
-</head>
-<body ng-controller="AECNewSubmissionController">
- <div id="akrainonewsubmissionform"
-  style="padding-left: 20px; padding-right: 20px">
-  <div>
-   <h1>Submission form</h1>
-  </div>
-
-  <label>Select Blueprint: </label>
-  <div class="selectStyle">
-   <select class="exampleTable" ng-model="selectedBlueprintName"
-    ng-init="selectedBlueprintName=blueprintNames[0]"
-    ng-change="selectedBluePrintNameChange()"
-    ng-options="n for n in blueprintNames">
-   </select>
-  </div>
-
-  <label>Select Blueprint Version: </label>
-  <div class="selectStyle">
-   <select class="exampleTable" ng-model="selectedBlueprintVersion"
-    ng-change="selectedBluePrintVersionChange()"
-    ng-options="y for y in blueprintVersions">
-   </select>
-  </div>
-
-  <label>Select Blueprint Layer: </label>
-  <div class="selectStyle">
-   <select class="exampleTable" ng-model="selectedBlueprintLayer"
-    ng-change="selectedBluePrintLayerChange()"
-    ng-options="l for l in blueprintLayers">
-   </select>
-  </div>
-
-  <label>Select Blueprint Timeslot: </label>
-  <div class="selectStyle">
-   <select class="exampleTable" ng-model="selectedDeclerativeTimeslot"
-    ng-options="v for v in declerativeTimeslots">
-   </select>
-  </div>
-
-  <br>
-  <button class="refreshbutton" style="float: left" ng-click="submit();">Submit</button>
- </div>
-</body>
-
-</html>
-
-
-