From f8a8d5192b1e5013d9e2f699be54b072ef39d5f0 Mon Sep 17 00:00:00 2001 From: talasila Date: Wed, 8 Feb 2017 10:13:29 -0500 Subject: Initial OpenECOMP UI/DMaapBC commit Change-Id: Ia492e1b88311b9bed4c31f593b28deaaad73b7e4 Signed-off-by: talasila --- .../dbcapp/controller/DataBusHomeController.java | 57 + .../dbcapp/controller/DataRouterController.java | 315 + .../controller/DbcappRestrictedBaseController.java | 974 + .../dbcapp/controller/DmaapAccessController.java | 374 + .../dbcapp/controller/HealthCheckController.java | 157 + .../dbcapp/controller/ManifestController.java | 113 + .../dbcapp/controller/MessageRouterController.java | 226 + .../dmaapbc/dbcapp/domain/DmaapAccess.java | 167 + .../dmaapbc/dbcapp/rest/DbcUsvcRestClient.java | 184 + .../dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java | 61 + ...omponentsClientHttpRequestFactoryBasicAuth.java | 65 + .../dmaapbc/dbcapp/service/DmaapAccessService.java | 72 + .../dbcapp/service/DmaapAccessServiceImpl.java | 86 + .../dmaapbc/dbcapp/util/DbcappProperties.java | 88 + .../fusionapp/conf/ExternalAppConfig.java | 203 + .../fusionapp/conf/ExternalAppInitializer.java | 60 + .../fusionapp/conf/HibernateMappingLocations.java | 45 + .../controller/AngularSinglePageController.java | 48 + .../fusionapp/controller/CallflowController.java | 44 + .../controller/ElasticSearchController.java | 128 + .../fusionapp/controller/LeafletMapContoller.java | 43 + .../fusionapp/controller/NetMapController.java | 57 + .../fusionapp/controller/PostDroolsController.java | 138 + .../controller/UserProfileController.java | 73 + .../fusionapp/controller/WelcomeController.java | 44 + .../java/org/openecomp/fusionapp/model/Result.java | 37 + .../fusionapp/service/AdminAuthExtension.java | 34 + .../fusionapp/uebhandler/InitUebHandler.java | 73 + .../fusionapp/uebhandler/MainUebHandler.java | 104 + .../uebhandler/WidgetNotificationHandler.java | 46 + .../fusionapp/util/CustomLoggingFilter.java | 54 + .../org/openecomp/fusionapp/util/LoggerDemo.java | 48 + .../fusionapp/util/ValidateEncodingApp.java | 203 + .../src/main/resources/att-rules.drl | 16 + dcae_dmaapbc_webapp/src/main/resources/cache.ccf | 30 + dcae_dmaapbc_webapp/src/main/resources/logback.xml | 350 + .../src/main/resources/mchange-log.properties | 4 + .../src/main/resources/portal.properties | 50 + .../src/main/resources/state-rules.drl | 38 + .../src/main/webapp/WEB-INF/conf/quartz.properties | 30 + .../src/main/webapp/WEB-INF/conf/raptor.properties | 168 + .../WEB-INF/conf/raptor_app_fusion.properties | 20 + .../WEB-INF/conf/raptor_db_fusion.properties | 0 .../main/webapp/WEB-INF/conf/raptor_pdf.properties | 30 + .../src/main/webapp/WEB-INF/conf/sql.properties | 303 + .../src/main/webapp/WEB-INF/conf/system.properties | 61 + .../webapp/WEB-INF/dbcapp/dbcapp-definitions.xml | 30 + .../src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml | 47 + .../main/webapp/WEB-INF/dbcapp/dbcapp.properties | 36 + .../src/main/webapp/WEB-INF/defs/definitions.xml | 42 + .../webapp/WEB-INF/fusion/conf/fusion.properties | 61 + .../webapp/WEB-INF/fusion/defs/definitions.xml | 260 + .../src/main/webapp/WEB-INF/fusion/jsp/.gitignore | 0 .../main/webapp/WEB-INF/fusion/jsp/broadcast.jsp | 137 + .../webapp/WEB-INF/fusion/jsp/broadcast_list.jsp | 201 + .../webapp/WEB-INF/fusion/jsp/collaborateList.jsp | 146 + .../main/webapp/WEB-INF/fusion/jsp/data_out.jsp | 20 + .../webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp | 46 + .../webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp | 799 + .../WEB-INF/fusion/jsp/ebz/loginSnippet.html | 120 + .../webapp/WEB-INF/fusion/jsp/ebz_template.jsp | 45 + .../fusion/jsp/ebz_template_noheader_nofooter.jsp | 35 + .../fusion/jsp/ebz_template_report_embedded.jsp | 48 + .../webapp/WEB-INF/fusion/jsp/es_search_demo.jsp | 97 + .../webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp | 97 + .../webapp/WEB-INF/fusion/jsp/frame_insert.jsp | 44 + .../src/main/webapp/WEB-INF/fusion/jsp/include.jsp | 30 + .../main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp | 144 + .../src/main/webapp/WEB-INF/fusion/jsp/meta.jsp | 36 + .../webapp/WEB-INF/fusion/jsp/popup_modal.html | 324 + .../WEB-INF/fusion/jsp/popup_modal_role.html | 274 + .../fusion/jsp/popup_modal_rolefunction.html | 87 + .../main/webapp/WEB-INF/fusion/jsp/post_search.jsp | 356 + .../src/main/webapp/WEB-INF/fusion/jsp/profile.jsp | 441 + .../webapp/WEB-INF/fusion/jsp/profile_search.jsp | 104 + .../src/main/webapp/WEB-INF/fusion/jsp/role.jsp | 286 + .../WEB-INF/fusion/jsp/role_function_list.jsp | 213 + .../main/webapp/WEB-INF/fusion/jsp/role_list.jsp | 139 + .../main/webapp/WEB-INF/fusion/jsp/usage_list.jsp | 87 + .../WEB-INF/fusion/jsp/webrtc/collaboration.jsp | 492 + .../main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml | 352 + .../fusion/orm/RNoteBookIntegration.hbm.xml | 44 + .../webapp/WEB-INF/fusion/orm/Workflow.hbm.xml | 48 + .../src/main/webapp/WEB-INF/jsp/error.jsp | 20 + .../src/main/webapp/WEB-INF/jsp/leafletMap.jsp | 288 + .../src/main/webapp/WEB-INF/jsp/login_external.jsp | 154 + .../src/main/webapp/WEB-INF/jsp/net_map.jsp | 38 + .../src/main/webapp/WEB-INF/jsp/user_profile.jsp | 84 + .../src/main/webapp/WEB-INF/jsp/welcome.jsp | 629 + .../src/main/webapp/WEB-INF/web.xml | 38 + .../src/main/webapp/app/dbcapp/att-globe-16x16.ico | Bin 0 -> 1150 bytes .../dbcapp/datarouter/dr-feed-list-controller.js | 286 + .../dbcapp/datarouter/dr-feed-popup-controller.js | 125 + .../dr-feed-pub-sub-list-popup-controller.js | 38 + .../app/dbcapp/datarouter/dr-feed-service.js | 105 + .../dbcapp/datarouter/dr-pub-list-controller.js | 149 + .../dbcapp/datarouter/dr-pub-popup-controller.js | 82 + .../webapp/app/dbcapp/datarouter/dr-pub-service.js | 106 + .../dbcapp/datarouter/dr-sub-list-controller.js | 149 + .../dbcapp/datarouter/dr-sub-popup-controller.js | 89 + .../webapp/app/dbcapp/datarouter/dr-sub-service.js | 105 + .../datarouter/dr_feed_add_popup_template.html | 104 + .../datarouter/dr_feed_edit_popup_template.html | 75 + .../webapp/app/dbcapp/datarouter/dr_feed_list.html | 177 + .../dr_feed_pub_sub_list_popup_template.html | 122 + .../webapp/app/dbcapp/datarouter/dr_pub_list.html | 130 + .../dbcapp/datarouter/dr_pub_popup_template.html | 60 + .../webapp/app/dbcapp/datarouter/dr_sub_list.html | 156 + .../dbcapp/datarouter/dr_sub_popup_template.html | 72 + .../dmaapaccess/dmaap-access-list-controller.js | 194 + .../dmaapaccess/dmaap-access-popup-controller.js | 125 + .../app/dbcapp/dmaapaccess/dmaap-access-service.js | 160 + .../app/dbcapp/dmaapaccess/dmaap_access_list.html | 108 + .../dmaapaccess/dmaap_access_popup_template.html | 73 + .../dbcapp/dmaapaccess/modal-popup-controller.js | 26 + .../webapp/app/dbcapp/home/dbc-home-controller.js | 66 + .../webapp/app/dbcapp/home/dbc-spa-controller.js | 50 + .../src/main/webapp/app/dbcapp/home/dbc-style.css | 77 + .../main/webapp/app/dbcapp/home/dbc-yn-filter.js | 26 + .../main/webapp/app/dbcapp/home/dbc_home_body.html | 51 + .../app/dbcapp/home/dbc_popup_templates.html | 73 + .../src/main/webapp/app/dbcapp/home/dbc_spa.html | 139 + .../webapp/app/dbcapp/home/manifest-service.js | 43 + .../messagerouter/mr-client-list-controller.js | 154 + .../messagerouter/mr-client-popup-controller.js | 127 + .../app/dbcapp/messagerouter/mr-client-service.js | 105 + .../mr-topic-client-list-popup-controller.js | 36 + .../messagerouter/mr-topic-list-controller.js | 248 + .../messagerouter/mr-topic-popup-controller.js | 83 + .../app/dbcapp/messagerouter/mr-topic-service.js | 105 + .../app/dbcapp/messagerouter/mr_client_list.html | 142 + .../messagerouter/mr_client_popup_template.html | 68 + .../mr_topic_client_list_popup_template.html | 74 + .../app/dbcapp/messagerouter/mr_topic_list.html | 154 + .../messagerouter/mr_topic_popup_template.html | 62 + .../webapp/app/fusion/ase/images/bg-top-bar.png | Bin 0 -> 215 bytes .../webapp/app/fusion/ase/images/checkmark_yes.gif | Bin 0 -> 145 bytes .../webapp/app/fusion/ase/images/downCaret.gif | Bin 0 -> 2951 bytes .../webapp/app/fusion/ase/images/home-icon.png | Bin 0 -> 3483 bytes .../webapp/app/fusion/ase/images/menus/cut.gif | Bin 0 -> 532 bytes .../webapp/app/fusion/ase/images/menus/door.gif | Bin 0 -> 580 bytes .../webapp/app/fusion/ase/images/menus/export.gif | Bin 0 -> 613 bytes .../webapp/app/fusion/ase/images/menus/import.gif | Bin 0 -> 605 bytes .../app/fusion/ase/images/menus/page_white_add.gif | Bin 0 -> 163 bytes .../fusion/ase/images/menus/page_white_copy.gif | Bin 0 -> 361 bytes .../fusion/ase/images/menus/page_white_delete.gif | Bin 0 -> 568 bytes .../fusion/ase/images/menus/page_white_edit.gif | Bin 0 -> 576 bytes .../fusion/ase/images/menus/page_white_paste.gif | Bin 0 -> 607 bytes .../webapp/app/fusion/ase/images/menus/trash.gif | Bin 0 -> 617 bytes .../images/menus/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/menus/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/menus/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/menus/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../images/menus/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/menus/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/menus/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../menus/ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../ase/images/menus/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../ase/images/menus/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../ase/images/menus/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../ase/images/menus/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../ase/images/menus/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../src/main/webapp/app/fusion/ase/images/pipe.png | Bin 0 -> 153 bytes .../webapp/app/fusion/ase/images/selfArrow.png | Bin 0 -> 3658 bytes .../webapp/app/fusion/ase/images/smallPostit.png | Bin 0 -> 17715 bytes .../main/webapp/app/fusion/ase/images/trashCan.gif | Bin 0 -> 54898 bytes .../webapp/app/fusion/ase/images/trashCanFull.gif | Bin 0 -> 85500 bytes .../main/webapp/app/fusion/ase/images/triangle.png | Bin 0 -> 289757 bytes .../src/main/webapp/app/fusion/ase/index.html | 14 + .../app/fusion/ase/mocks/networkElements.yml | 95 + .../app/fusion/ase/scripts/BPMNconversion.js | 208 + .../src/main/webapp/app/fusion/ase/scripts/app.js | 55 + .../app/fusion/ase/scripts/arrayManipulation.js | 356 + .../main/webapp/app/fusion/ase/scripts/arrows.js | 213 + .../src/main/webapp/app/fusion/ase/scripts/ase.js | 112 + .../main/webapp/app/fusion/ase/scripts/backend.js | 827 + .../scripts/bower_components/Snap.svg/.bower.json | 35 + .../scripts/bower_components/Snap.svg/CONTRIBUTING | 3 + .../scripts/bower_components/Snap.svg/Gruntfile.js | 62 + .../ase/scripts/bower_components/Snap.svg/LICENSE | 202 + .../ase/scripts/bower_components/Snap.svg/NOTICE | 190 + .../scripts/bower_components/Snap.svg/README.md | 68 + .../scripts/bower_components/Snap.svg/bower.json | 25 + .../bower_components/Snap.svg/component.json | 13 + .../bower_components/Snap.svg/dist/snap.svg-min.js | 21 + .../bower_components/Snap.svg/dist/snap.svg.js | 8170 ++++ .../bower_components/Snap.svg/doc/css/dr.css | 144 + .../bower_components/Snap.svg/doc/css/main.css | 508 + .../bower_components/Snap.svg/doc/css/prism.css | 168 + .../Snap.svg/doc/css/topcoat-desktop-light.css | 3700 ++ .../doc/fonts/sourcecodepro-regular-webfont.eot | Bin 0 -> 23949 bytes .../doc/fonts/sourcecodepro-regular-webfont.svg | 242 + .../doc/fonts/sourcecodepro-regular-webfont.ttf | Bin 0 -> 52660 bytes .../doc/fonts/sourcecodepro-regular-webfont.woff | Bin 0 -> 27068 bytes .../doc/fonts/sourcesanspro-light-webfont.eot | Bin 0 -> 23716 bytes .../doc/fonts/sourcesanspro-light-webfont.svg | 243 + .../doc/fonts/sourcesanspro-light-webfont.ttf | Bin 0 -> 51876 bytes .../doc/fonts/sourcesanspro-light-webfont.woff | Bin 0 -> 26716 bytes .../doc/fonts/sourcesanspro-regular-webfont.eot | Bin 0 -> 23970 bytes .../doc/fonts/sourcesanspro-regular-webfont.svg | 243 + .../doc/fonts/sourcesanspro-regular-webfont.ttf | Bin 0 -> 52456 bytes .../doc/fonts/sourcesanspro-regular-webfont.woff | Bin 0 -> 27076 bytes .../doc/fonts/sourcesanspro-semibold-webfont.eot | Bin 0 -> 23974 bytes .../doc/fonts/sourcesanspro-semibold-webfont.svg | 243 + .../doc/fonts/sourcesanspro-semibold-webfont.ttf | Bin 0 -> 51960 bytes .../doc/fonts/sourcesanspro-semibold-webfont.woff | Bin 0 -> 27048 bytes .../Snap.svg/doc/fonts/stylesheet.css | 57 + .../bower_components/Snap.svg/doc/img/search.svg | 11 + .../Snap.svg/doc/img/search_dark.svg | 16 + .../bower_components/Snap.svg/doc/js/prism.js | 9 + .../bower_components/Snap.svg/doc/reference.html | 14816 +++++++ .../ase/scripts/bower_components/Snap.svg/dr.json | 39 + .../scripts/bower_components/Snap.svg/history.md | 49 + .../scripts/bower_components/Snap.svg/package.json | 24 + .../scripts/bower_components/Snap.svg/template.dot | 157 + .../scripts/bower_components/Snap.svg/test.html | 17 + .../scripts/bower_components/bpmn-js/.bower.json | 30 + .../scripts/bower_components/bpmn-js/.gitignore | 1 + .../ase/scripts/bower_components/bpmn-js/LICENSE | 22 + .../ase/scripts/bower_components/bpmn-js/README.md | 46 + .../scripts/bower_components/bpmn-js/bower.json | 20 + .../dist/assets/bpmn-font/css/bpmn-embedded.css | 150 + .../bpmn-js/dist/assets/bpmn-font/css/bpmn.css | 152 + .../bpmn-js/dist/assets/bpmn-font/font/bpmn.eot | Bin 0 -> 40720 bytes .../bpmn-js/dist/assets/bpmn-font/font/bpmn.svg | 107 + .../bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf | Bin 0 -> 40568 bytes .../bpmn-js/dist/assets/bpmn-font/font/bpmn.woff | Bin 0 -> 13784 bytes .../bpmn-js/dist/assets/diagram-js.css | 457 + .../bower_components/bpmn-js/dist/bpmn-modeler.js | 43358 +++++++++++++++++++ .../bpmn-js/dist/bpmn-modeler.js.map | 1 + .../bpmn-js/dist/bpmn-modeler.min.js | 14 + .../bpmn-js/dist/bpmn-navigated-viewer.js | 27371 ++++++++++++ .../bpmn-js/dist/bpmn-navigated-viewer.js.map | 1 + .../bpmn-js/dist/bpmn-navigated-viewer.min.js | 9 + .../bower_components/bpmn-js/dist/bpmn-viewer.js | 27080 ++++++++++++ .../bpmn-js/dist/bpmn-viewer.js.map | 1 + .../bpmn-js/dist/bpmn-viewer.min.js | 9 + .../bower_components/jquery-mousewheel/.bower.json | 28 + .../jquery-mousewheel/ChangeLog.md | 147 + .../bower_components/jquery-mousewheel/LICENSE.txt | 37 + .../bower_components/jquery-mousewheel/README.md | 76 + .../bower_components/jquery-mousewheel/bower.json | 17 + .../jquery-mousewheel/jquery.mousewheel.js | 221 + .../jquery-mousewheel/jquery.mousewheel.min.js | 8 + .../scripts/bower_components/lodash/.bower.json | 31 + .../ase/scripts/bower_components/lodash/LICENSE | 22 + .../ase/scripts/bower_components/lodash/bower.json | 19 + .../ase/scripts/bower_components/lodash/lodash.js | 12351 ++++++ .../scripts/bower_components/lodash/lodash.min.js | 99 + .../ase/scripts/bower_components/sax/lib/sax.js | 1430 + .../main/webapp/app/fusion/ase/scripts/buttons.js | 382 + .../webapp/app/fusion/ase/scripts/convertToYaml.js | 73 + .../app/fusion/ase/scripts/customContextMenus.js | 1489 + .../app/fusion/ase/scripts/dependencies/Blob.js | 211 + .../app/fusion/ase/scripts/dependencies/base64.js | 143 + .../fusion/ase/scripts/dependencies/interact.js | 5963 +++ .../ase/scripts/dependencies/jquery-2.1.4.min.js | 4 + .../app/fusion/ase/scripts/dependencies/js-yaml.js | 3960 ++ .../ase/scripts/dependencies/saveSvgAsPng.js | 170 + .../webapp/app/fusion/ase/scripts/dictionary.js | 614 + .../app/fusion/ase/scripts/dragMoveListener.js | 55 + .../fusion/ase/scripts/dragMoveListenerArrow.js | 44 + .../webapp/app/fusion/ase/scripts/dropzones.js | 704 + .../webapp/app/fusion/ase/scripts/elements_ase.js | 76 + .../webapp/app/fusion/ase/scripts/menus/bootbox.js | 986 + .../app/fusion/ase/scripts/menus/bootstrap.min.js | 7 + .../app/fusion/ase/scripts/menus/contextMenu.js | 1692 + .../app/fusion/ase/scripts/menus/jquery-ui.min.js | 13 + .../fusion/ase/scripts/menus/jquery.tooltipster.js | 1327 + .../main/webapp/app/fusion/ase/scripts/nodes.js | 1290 + .../main/webapp/app/fusion/ase/scripts/notes.js | 152 + .../main/webapp/app/fusion/ase/scripts/printpdf.js | 519 + .../webapp/app/fusion/ase/scripts/resizable.js | 159 + .../main/webapp/app/fusion/ase/scripts/scroll.js | 77 + .../main/webapp/app/fusion/ase/scripts/services.js | 86 + .../main/webapp/app/fusion/ase/styles/menus/bs.css | 677 + .../app/fusion/ase/styles/menus/jquery-ui.css | 1227 + .../app/fusion/ase/styles/menus/tooltipster.css | 294 + .../main/webapp/app/fusion/ase/styles/style.css | 1028 + .../app/fusion/ase/view-models/ase_view.html | 0 .../app/fusion/ase/view-models/grid_view.html | 0 .../webapp/app/fusion/ase/view-models/index.html | 159 + .../app/fusion/ase/view-models/sidebar_view.html | 0 .../app/fusion/ase/view-models/topbar_view.html | 6 + .../fusion/external/angular-1.5/angular-animate.js | 4121 ++ .../external/angular-1.5/angular-animate.min.js | 56 + .../angular-1.5/angular-animate.min.js.map | 8 + .../fusion/external/angular-1.5/angular-aria.js | 398 + .../external/angular-1.5/angular-aria.min.js | 14 + .../external/angular-1.5/angular-aria.min.js.map | 8 + .../fusion/external/angular-1.5/angular-cookies.js | 322 + .../external/angular-1.5/angular-cookies.min.js | 9 + .../angular-1.5/angular-cookies.min.js.map | 8 + .../fusion/external/angular-1.5/angular-csp.css | 20 + .../fusion/external/angular-1.5/angular-loader.js | 484 + .../external/angular-1.5/angular-loader.min.js | 10 + .../external/angular-1.5/angular-loader.min.js.map | 8 + .../external/angular-1.5/angular-message-format.js | 980 + .../angular-1.5/angular-message-format.min.js | 26 + .../angular-1.5/angular-message-format.min.js.map | 8 + .../external/angular-1.5/angular-messages.js | 687 + .../external/angular-1.5/angular-messages.min.js | 12 + .../angular-1.5/angular-messages.min.js.map | 8 + .../fusion/external/angular-1.5/angular-mocks.js | 2842 ++ .../external/angular-1.5/angular-resource.js | 768 + .../external/angular-1.5/angular-resource.min.js | 15 + .../angular-1.5/angular-resource.min.js.map | 8 + .../fusion/external/angular-1.5/angular-route.js | 1016 + .../external/angular-1.5/angular-route.min.js | 15 + .../external/angular-1.5/angular-route.min.js.map | 8 + .../external/angular-1.5/angular-sanitize.js | 717 + .../external/angular-1.5/angular-sanitize.min.js | 15 + .../angular-1.5/angular-sanitize.min.js.map | 8 + .../external/angular-1.5/angular-scenario.js | 41849 ++++++++++++++++++ .../fusion/external/angular-1.5/angular-touch.js | 729 + .../external/angular-1.5/angular-touch.min.js | 14 + .../external/angular-1.5/angular-touch.min.js.map | 8 + .../app/fusion/external/angular-1.5/angular.js | 30428 +++++++++++++ .../app/fusion/external/angular-1.5/angular.min.js | 307 + .../fusion/external/angular-1.5/angular.min.js.map | 8 + .../app/fusion/external/angular-1.5/errors.json | 1 + .../app/fusion/external/angular-1.5/version.json | 1 + .../app/fusion/external/angular-1.5/version.txt | 1 + .../angular-ui/ui-bootstrap-tpls-1.1.2.min.js | 10 + .../angular-ui/ui-bootstrap-tpls-1.2.4.min.js | 10 + .../webapp/app/fusion/external/bootstrap/bs.css | 678 + .../webapp/app/fusion/external/d3/css/nv.d3.css | 656 + .../main/webapp/app/fusion/external/d3/js/cie.js | 155 + .../app/fusion/external/d3/js/colorbrewer.js | 302 + .../main/webapp/app/fusion/external/d3/js/core.js | 122 + .../app/fusion/external/d3/js/crossfilter.js | 1180 + .../app/fusion/external/d3/js/crossfilter.min.js | 1 + .../webapp/app/fusion/external/d3/js/d3.geom.js | 816 + .../main/webapp/app/fusion/external/d3/js/d3.js | 5 + .../app/fusion/external/d3/js/d3.layout.cloud.js | 433 + .../webapp/app/fusion/external/d3/js/d3.layout.js | 908 + .../main/webapp/app/fusion/external/d3/js/d3.v2.js | 7037 +++ .../webapp/app/fusion/external/d3/js/d3.v2.min.js | 4 + .../webapp/app/fusion/external/d3/js/d3.v3.min.js | 1 + .../webapp/app/fusion/external/d3/js/fisheye.js | 86 + .../main/webapp/app/fusion/external/d3/js/hive.js | 80 + .../webapp/app/fusion/external/d3/js/horizon.js | 192 + .../app/fusion/external/d3/js/interactiveLayer.js | 251 + .../main/webapp/app/fusion/external/d3/js/intro.js | 1 + .../app/fusion/external/d3/js/models/axis-min.js | 1 + .../app/fusion/external/d3/js/models/axis.js | 470 + .../app/fusion/external/d3/js/models/axis.min.js | 1 + .../fusion/external/d3/js/models/backup/bullet.js | 250 + .../external/d3/js/models/backup/bulletChart.js | 349 + .../fusion/external/d3/js/models/boilerplate.js | 104 + .../app/fusion/external/d3/js/models/bullet.js | 385 + .../fusion/external/d3/js/models/bulletChart.js | 343 + .../external/d3/js/models/cumulativeLineChart.js | 782 + .../fusion/external/d3/js/models/discreteBar.js | 349 + .../external/d3/js/models/discreteBarChart.js | 333 + .../fusion/external/d3/js/models/distribution.js | 148 + .../fusion/external/d3/js/models/historicalBar.js | 331 + .../external/d3/js/models/historicalBarChart.js | 419 + .../fusion/external/d3/js/models/indentedTree.js | 337 + .../app/fusion/external/d3/js/models/legend.js | 270 + .../app/fusion/external/d3/js/models/line.js | 284 + .../app/fusion/external/d3/js/models/lineChart.js | 465 + .../external/d3/js/models/linePlusBarChart.js | 433 + .../d3/js/models/linePlusBarWithFocusChart.js | 658 + .../external/d3/js/models/lineWithFisheye.js | 200 + .../external/d3/js/models/lineWithFisheyeChart.js | 297 + .../external/d3/js/models/lineWithFocusChart.js | 574 + .../app/fusion/external/d3/js/models/multiBar.js | 461 + .../fusion/external/d3/js/models/multiBarChart.js | 524 + .../external/d3/js/models/multiBarHorizontal.js | 424 + .../d3/js/models/multiBarHorizontalChart.js | 434 + .../external/d3/js/models/multiBarTimeSeries.js | 384 + .../d3/js/models/multiBarTimeSeriesChart.js | 405 + .../app/fusion/external/d3/js/models/multiChart.js | 452 + .../app/fusion/external/d3/js/models/ohlcBar.js | 380 + .../external/d3/js/models/parallelCoordinates.js | 239 + .../webapp/app/fusion/external/d3/js/models/pie.js | 400 + .../app/fusion/external/d3/js/models/pieChart.js | 292 + .../app/fusion/external/d3/js/models/scatter.js | 674 + .../fusion/external/d3/js/models/scatterChart.js | 628 + .../external/d3/js/models/scatterPlusLineChart.js | 620 + .../app/fusion/external/d3/js/models/sparkline.js | 194 + .../fusion/external/d3/js/models/sparklinePlus.js | 295 + .../fusion/external/d3/js/models/stackedArea.js | 368 + .../external/d3/js/models/stackedAreaChart.js | 629 + .../main/webapp/app/fusion/external/d3/js/nv.d3.js | 13097 ++++++ .../webapp/app/fusion/external/d3/js/nv.d3.min.js | 1 + .../main/webapp/app/fusion/external/d3/js/outro.js | 1 + .../webapp/app/fusion/external/d3/js/sankey.js | 292 + .../webapp/app/fusion/external/d3/js/tooltip.js | 490 + .../main/webapp/app/fusion/external/d3/js/utils.js | 152 + .../external/ebz/angular_js/angular-animate.js | 3721 ++ .../external/ebz/angular_js/angular-cookies.js | 206 + .../external/ebz/angular_js/angular-route.js | 911 + .../external/ebz/angular_js/angular-route.min.js | 14 + .../external/ebz/angular_js/angular-sanitize.js | 647 + .../external/ebz/angular_js/angular-touch.js | 628 + .../app/fusion/external/ebz/angular_js/angular.js | 22024 ++++++++++ .../app/fusion/external/ebz/angular_js/app.js | 6 + .../external/ebz/angular_js/checklist-model.js | 99 + .../external/ebz/angular_js/checklist-model.min.js | 1 + .../app/fusion/external/ebz/angular_js/gestures.js | 1495 + .../app/fusion/external/ebz/angular_js/ng_base.js | 4 + .../external/ebz/angular_js/ui-charts-tpls.js | 3909 ++ .../app/fusion/external/ebz/ebz_header/footer.css | 311 + .../app/fusion/external/ebz/ebz_header/header.css | 1866 + .../external/ebz/ebz_header/portal_ebz_header.css | 63 + .../main/webapp/app/fusion/external/ebz/fn-ebz.css | 1614 + .../fusion/external/ebz/images/headerChatIcon.png | Bin 0 -> 465 bytes .../external/ebz/images/no_favorites_star.png | Bin 0 -> 2794 bytes .../app/fusion/external/ebz/js/attHeaderSnippet.js | 210 + .../webapp/app/fusion/external/ebz/js/footer.js | 110 + .../fusion/external/ebz/sandbox/att-abs-tpls.js | 20451 +++++++++ .../external/ebz/sandbox/att-abs-tpls.min.js | 22 + .../fusion/external/ebz/sandbox/styles/base.css | 1 + .../app/fusion/external/ebz/sandbox/styles/btn.css | 1 + .../fusion/external/ebz/sandbox/styles/demo.css | 2 + .../fusion/external/ebz/sandbox/styles/dtpk.css | 9 + .../fusion/external/ebz/sandbox/styles/frms.css | 1 + .../ebz/sandbox/styles/ie/backgroundsize.min.htc | 12 + .../ebz/sandbox/styles/images/calendar-icon.png | Bin 0 -> 515635 bytes .../ebz/sandbox/styles/images/checkbox.png | Bin 0 -> 1170 bytes .../external/ebz/sandbox/styles/images/down.png | Bin 0 -> 1059 bytes .../ebz/sandbox/styles/images/icon-close-modal.png | Bin 0 -> 1634 bytes .../styles/images/icon-informative-modal.png | Bin 0 -> 5018 bytes .../sandbox/styles/images/icon-warning-modal.png | Bin 0 -> 3831 bytes .../external/ebz/sandbox/styles/images/loader.gif | Bin 0 -> 5732 bytes .../styles/images/loading-spinner-medium.png | Bin 0 -> 2021 bytes .../styles/images/loading-spinner-orange.png | Bin 0 -> 2087 bytes .../styles/images/loading_balls_black-small.gif | Bin 0 -> 3209 bytes .../sandbox/styles/images/loading_balls_black.gif | Bin 0 -> 2636 bytes .../styles/images/loading_balls_blue-small.gif | Bin 0 -> 3210 bytes .../sandbox/styles/images/loading_balls_blue.gif | Bin 0 -> 2636 bytes .../styles/images/loading_balls_white-small.gif | Bin 0 -> 2060 bytes .../sandbox/styles/images/loading_balls_white.gif | Bin 0 -> 1924 bytes .../ebz/sandbox/styles/images/loading_dots.gif | Bin 0 -> 3736 bytes .../ebz/sandbox/styles/images/magnify_glass.png | Bin 0 -> 556 bytes .../ebz/sandbox/styles/images/oops-exclamation.png | Bin 0 -> 836 bytes .../external/ebz/sandbox/styles/images/radio.jpg | Bin 0 -> 1352 bytes .../ebz/sandbox/styles/images/select-arrows.png | Bin 0 -> 1373 bytes .../ebz/sandbox/styles/images/treearrow.png | Bin 0 -> 17821 bytes .../external/ebz/sandbox/styles/images/up.png | Bin 0 -> 1064 bytes .../ebz/sandbox/styles/images/upanddown.png | Bin 0 -> 1033 bytes .../ebz/sandbox/styles/pages/iconography.css | 2 + .../fusion/external/ebz/sandbox/styles/sldr.css | 1 + .../fusion/external/ebz/sandbox/styles/style.css | 1 + .../app/fusion/external/ebz/sandbox/styles/tbs.css | 1 + .../app/fusion/external/ionicons-2.0.1/.gitignore | 4 + .../app/fusion/external/ionicons-2.0.1/LICENSE | 21 + .../app/fusion/external/ionicons-2.0.1/bower.json | 31 + .../fusion/external/ionicons-2.0.1/component.json | 19 + .../fusion/external/ionicons-2.0.1/composer.json | 36 + .../external/ionicons-2.0.1/css/ionicons.css | 1480 + .../external/ionicons-2.0.1/css/ionicons.min.css | 11 + .../external/ionicons-2.0.1/fonts/ionicons.eot | Bin 0 -> 120724 bytes .../external/ionicons-2.0.1/fonts/ionicons.svg | 2230 + .../external/ionicons-2.0.1/fonts/ionicons.ttf | Bin 0 -> 188508 bytes .../external/ionicons-2.0.1/fonts/ionicons.woff | Bin 0 -> 67904 bytes .../ionicons-2.0.1/less/_ionicons-font.less | 27 + .../ionicons-2.0.1/less/_ionicons-icons.less | 1473 + .../ionicons-2.0.1/less/_ionicons-variables.less | 747 + .../external/ionicons-2.0.1/less/ionicons.less | 3 + .../ionicons-2.0.1/png/512/alert-circled.png | Bin 0 -> 2551 bytes .../external/ionicons-2.0.1/png/512/alert.png | Bin 0 -> 766 bytes .../ionicons-2.0.1/png/512/android-add-contact.png | Bin 0 -> 3279 bytes .../ionicons-2.0.1/png/512/android-add.png | Bin 0 -> 240 bytes .../ionicons-2.0.1/png/512/android-alarm.png | Bin 0 -> 6428 bytes .../ionicons-2.0.1/png/512/android-archive.png | Bin 0 -> 1628 bytes .../ionicons-2.0.1/png/512/android-arrow-back.png | Bin 0 -> 1218 bytes .../png/512/android-arrow-down-left.png | Bin 0 -> 1451 bytes .../png/512/android-arrow-down-right.png | Bin 0 -> 1462 bytes .../png/512/android-arrow-forward.png | Bin 0 -> 1191 bytes .../png/512/android-arrow-up-left.png | Bin 0 -> 1499 bytes .../png/512/android-arrow-up-right.png | Bin 0 -> 1482 bytes .../ionicons-2.0.1/png/512/android-battery.png | Bin 0 -> 238 bytes .../ionicons-2.0.1/png/512/android-book.png | Bin 0 -> 3746 bytes .../ionicons-2.0.1/png/512/android-calendar.png | Bin 0 -> 849 bytes .../ionicons-2.0.1/png/512/android-call.png | Bin 0 -> 4766 bytes .../ionicons-2.0.1/png/512/android-camera.png | Bin 0 -> 3871 bytes .../ionicons-2.0.1/png/512/android-chat.png | Bin 0 -> 3577 bytes .../ionicons-2.0.1/png/512/android-checkmark.png | Bin 0 -> 1846 bytes .../ionicons-2.0.1/png/512/android-clock.png | Bin 0 -> 5268 bytes .../ionicons-2.0.1/png/512/android-close.png | Bin 0 -> 2156 bytes .../ionicons-2.0.1/png/512/android-contact.png | Bin 0 -> 3658 bytes .../ionicons-2.0.1/png/512/android-contacts.png | Bin 0 -> 4299 bytes .../ionicons-2.0.1/png/512/android-data.png | Bin 0 -> 4808 bytes .../ionicons-2.0.1/png/512/android-developer.png | Bin 0 -> 4115 bytes .../ionicons-2.0.1/png/512/android-display.png | Bin 0 -> 4909 bytes .../ionicons-2.0.1/png/512/android-download.png | Bin 0 -> 4890 bytes .../ionicons-2.0.1/png/512/android-drawer.png | Bin 0 -> 190 bytes .../ionicons-2.0.1/png/512/android-dropdown.png | Bin 0 -> 777 bytes .../ionicons-2.0.1/png/512/android-earth.png | Bin 0 -> 6517 bytes .../ionicons-2.0.1/png/512/android-folder.png | Bin 0 -> 1688 bytes .../ionicons-2.0.1/png/512/android-forums.png | Bin 0 -> 1739 bytes .../ionicons-2.0.1/png/512/android-friends.png | Bin 0 -> 4868 bytes .../ionicons-2.0.1/png/512/android-hand.png | Bin 0 -> 4650 bytes .../ionicons-2.0.1/png/512/android-image.png | Bin 0 -> 1433 bytes .../ionicons-2.0.1/png/512/android-inbox.png | Bin 0 -> 3018 bytes .../ionicons-2.0.1/png/512/android-information.png | Bin 0 -> 3370 bytes .../ionicons-2.0.1/png/512/android-keypad.png | Bin 0 -> 1055 bytes .../ionicons-2.0.1/png/512/android-lightbulb.png | Bin 0 -> 3515 bytes .../ionicons-2.0.1/png/512/android-locate.png | Bin 0 -> 5003 bytes .../ionicons-2.0.1/png/512/android-location.png | Bin 0 -> 3067 bytes .../ionicons-2.0.1/png/512/android-mail.png | Bin 0 -> 3455 bytes .../ionicons-2.0.1/png/512/android-microphone.png | Bin 0 -> 3267 bytes .../ionicons-2.0.1/png/512/android-mixer.png | Bin 0 -> 2727 bytes .../ionicons-2.0.1/png/512/android-more.png | Bin 0 -> 224 bytes .../ionicons-2.0.1/png/512/android-note.png | Bin 0 -> 249 bytes .../ionicons-2.0.1/png/512/android-playstore.png | Bin 0 -> 3165 bytes .../ionicons-2.0.1/png/512/android-printer.png | Bin 0 -> 1721 bytes .../ionicons-2.0.1/png/512/android-promotion.png | Bin 0 -> 2374 bytes .../ionicons-2.0.1/png/512/android-reminder.png | Bin 0 -> 2890 bytes .../ionicons-2.0.1/png/512/android-remove.png | Bin 0 -> 160 bytes .../ionicons-2.0.1/png/512/android-search.png | Bin 0 -> 4232 bytes .../ionicons-2.0.1/png/512/android-send.png | Bin 0 -> 2079 bytes .../ionicons-2.0.1/png/512/android-settings.png | Bin 0 -> 3883 bytes .../ionicons-2.0.1/png/512/android-share.png | Bin 0 -> 3212 bytes .../ionicons-2.0.1/png/512/android-social-user.png | Bin 0 -> 3644 bytes .../ionicons-2.0.1/png/512/android-social.png | Bin 0 -> 3849 bytes .../ionicons-2.0.1/png/512/android-sort.png | Bin 0 -> 197 bytes .../png/512/android-stair-drawer.png | Bin 0 -> 209 bytes .../ionicons-2.0.1/png/512/android-star.png | Bin 0 -> 2926 bytes .../ionicons-2.0.1/png/512/android-stopwatch.png | Bin 0 -> 5225 bytes .../ionicons-2.0.1/png/512/android-storage.png | Bin 0 -> 233 bytes .../ionicons-2.0.1/png/512/android-system-back.png | Bin 0 -> 1796 bytes .../ionicons-2.0.1/png/512/android-system-home.png | Bin 0 -> 1107 bytes .../png/512/android-system-windows.png | Bin 0 -> 202 bytes .../ionicons-2.0.1/png/512/android-timer.png | Bin 0 -> 3904 bytes .../ionicons-2.0.1/png/512/android-trash.png | Bin 0 -> 2865 bytes .../ionicons-2.0.1/png/512/android-user-menu.png | Bin 0 -> 3568 bytes .../ionicons-2.0.1/png/512/android-volume.png | Bin 0 -> 6022 bytes .../ionicons-2.0.1/png/512/android-wifi.png | Bin 0 -> 4868 bytes .../external/ionicons-2.0.1/png/512/aperture.png | Bin 0 -> 9500 bytes .../external/ionicons-2.0.1/png/512/archive.png | Bin 0 -> 2445 bytes .../ionicons-2.0.1/png/512/arrow-down-a.png | Bin 0 -> 1173 bytes .../ionicons-2.0.1/png/512/arrow-down-b.png | Bin 0 -> 1307 bytes .../ionicons-2.0.1/png/512/arrow-down-c.png | Bin 0 -> 1966 bytes .../ionicons-2.0.1/png/512/arrow-expand.png | Bin 0 -> 2498 bytes .../png/512/arrow-graph-down-left.png | Bin 0 -> 2478 bytes .../png/512/arrow-graph-down-right.png | Bin 0 -> 2545 bytes .../ionicons-2.0.1/png/512/arrow-graph-up-left.png | Bin 0 -> 2440 bytes .../png/512/arrow-graph-up-right.png | Bin 0 -> 2440 bytes .../ionicons-2.0.1/png/512/arrow-left-a.png | Bin 0 -> 1260 bytes .../ionicons-2.0.1/png/512/arrow-left-b.png | Bin 0 -> 1608 bytes .../ionicons-2.0.1/png/512/arrow-left-c.png | Bin 0 -> 1662 bytes .../external/ionicons-2.0.1/png/512/arrow-move.png | Bin 0 -> 1948 bytes .../ionicons-2.0.1/png/512/arrow-resize.png | Bin 0 -> 1266 bytes .../ionicons-2.0.1/png/512/arrow-return-left.png | Bin 0 -> 1082 bytes .../ionicons-2.0.1/png/512/arrow-return-right.png | Bin 0 -> 1124 bytes .../ionicons-2.0.1/png/512/arrow-right-a.png | Bin 0 -> 1317 bytes .../ionicons-2.0.1/png/512/arrow-right-b.png | Bin 0 -> 1671 bytes .../ionicons-2.0.1/png/512/arrow-right-c.png | Bin 0 -> 1657 bytes .../ionicons-2.0.1/png/512/arrow-shrink.png | Bin 0 -> 2594 bytes .../external/ionicons-2.0.1/png/512/arrow-swap.png | Bin 0 -> 1521 bytes .../external/ionicons-2.0.1/png/512/arrow-up-a.png | Bin 0 -> 1115 bytes .../external/ionicons-2.0.1/png/512/arrow-up-b.png | Bin 0 -> 1343 bytes .../external/ionicons-2.0.1/png/512/arrow-up-c.png | Bin 0 -> 2002 bytes .../external/ionicons-2.0.1/png/512/asterisk.png | Bin 0 -> 4023 bytes .../fusion/external/ionicons-2.0.1/png/512/at.png | Bin 0 -> 5852 bytes .../fusion/external/ionicons-2.0.1/png/512/bag.png | Bin 0 -> 3665 bytes .../ionicons-2.0.1/png/512/battery-charging.png | Bin 0 -> 1897 bytes .../ionicons-2.0.1/png/512/battery-empty.png | Bin 0 -> 1019 bytes .../ionicons-2.0.1/png/512/battery-full.png | Bin 0 -> 982 bytes .../ionicons-2.0.1/png/512/battery-half.png | Bin 0 -> 1320 bytes .../ionicons-2.0.1/png/512/battery-low.png | Bin 0 -> 1342 bytes .../external/ionicons-2.0.1/png/512/beaker.png | Bin 0 -> 3931 bytes .../external/ionicons-2.0.1/png/512/beer.png | Bin 0 -> 4559 bytes .../external/ionicons-2.0.1/png/512/bluetooth.png | Bin 0 -> 2909 bytes .../external/ionicons-2.0.1/png/512/bonfire.png | Bin 0 -> 4852 bytes .../external/ionicons-2.0.1/png/512/bookmark.png | Bin 0 -> 1102 bytes .../external/ionicons-2.0.1/png/512/briefcase.png | Bin 0 -> 1475 bytes .../fusion/external/ionicons-2.0.1/png/512/bug.png | Bin 0 -> 4736 bytes .../external/ionicons-2.0.1/png/512/calculator.png | Bin 0 -> 1315 bytes .../external/ionicons-2.0.1/png/512/calendar.png | Bin 0 -> 2577 bytes .../external/ionicons-2.0.1/png/512/camera.png | Bin 0 -> 4190 bytes .../external/ionicons-2.0.1/png/512/card.png | Bin 0 -> 1494 bytes .../external/ionicons-2.0.1/png/512/cash.png | Bin 0 -> 3435 bytes .../ionicons-2.0.1/png/512/chatbox-working.png | Bin 0 -> 2301 bytes .../external/ionicons-2.0.1/png/512/chatbox.png | Bin 0 -> 1870 bytes .../external/ionicons-2.0.1/png/512/chatboxes.png | Bin 0 -> 2562 bytes .../ionicons-2.0.1/png/512/chatbubble-working.png | Bin 0 -> 3028 bytes .../external/ionicons-2.0.1/png/512/chatbubble.png | Bin 0 -> 2579 bytes .../ionicons-2.0.1/png/512/chatbubbles.png | Bin 0 -> 3751 bytes .../ionicons-2.0.1/png/512/checkmark-circled.png | Bin 0 -> 3687 bytes .../ionicons-2.0.1/png/512/checkmark-round.png | Bin 0 -> 2367 bytes .../external/ionicons-2.0.1/png/512/checkmark.png | Bin 0 -> 2134 bytes .../ionicons-2.0.1/png/512/chevron-down.png | Bin 0 -> 1689 bytes .../ionicons-2.0.1/png/512/chevron-left.png | Bin 0 -> 1769 bytes .../ionicons-2.0.1/png/512/chevron-right.png | Bin 0 -> 1831 bytes .../external/ionicons-2.0.1/png/512/chevron-up.png | Bin 0 -> 1677 bytes .../external/ionicons-2.0.1/png/512/clipboard.png | Bin 0 -> 2593 bytes .../external/ionicons-2.0.1/png/512/clock.png | Bin 0 -> 5866 bytes .../ionicons-2.0.1/png/512/close-circled.png | Bin 0 -> 3809 bytes .../ionicons-2.0.1/png/512/close-round.png | Bin 0 -> 2177 bytes .../external/ionicons-2.0.1/png/512/close.png | Bin 0 -> 2244 bytes .../ionicons-2.0.1/png/512/closed-captioning.png | Bin 0 -> 3665 bytes .../external/ionicons-2.0.1/png/512/cloud.png | Bin 0 -> 2067 bytes .../ionicons-2.0.1/png/512/code-download.png | Bin 0 -> 2423 bytes .../ionicons-2.0.1/png/512/code-working.png | Bin 0 -> 2433 bytes .../external/ionicons-2.0.1/png/512/code.png | Bin 0 -> 1720 bytes .../external/ionicons-2.0.1/png/512/coffee.png | Bin 0 -> 3205 bytes .../external/ionicons-2.0.1/png/512/compass.png | Bin 0 -> 7318 bytes .../external/ionicons-2.0.1/png/512/compose.png | Bin 0 -> 4296 bytes .../ionicons-2.0.1/png/512/connection-bars.png | Bin 0 -> 214 bytes .../external/ionicons-2.0.1/png/512/contrast.png | Bin 0 -> 4087 bytes .../external/ionicons-2.0.1/png/512/cube.png | Bin 0 -> 3265 bytes .../external/ionicons-2.0.1/png/512/disc.png | Bin 0 -> 4935 bytes .../ionicons-2.0.1/png/512/document-text.png | Bin 0 -> 1918 bytes .../external/ionicons-2.0.1/png/512/document.png | Bin 0 -> 1914 bytes .../external/ionicons-2.0.1/png/512/drag.png | Bin 0 -> 178 bytes .../external/ionicons-2.0.1/png/512/earth.png | Bin 0 -> 6476 bytes .../external/ionicons-2.0.1/png/512/edit.png | Bin 0 -> 2741 bytes .../fusion/external/ionicons-2.0.1/png/512/egg.png | Bin 0 -> 4234 bytes .../external/ionicons-2.0.1/png/512/eject.png | Bin 0 -> 3209 bytes .../external/ionicons-2.0.1/png/512/email.png | Bin 0 -> 3125 bytes .../ionicons-2.0.1/png/512/eye-disabled.png | Bin 0 -> 3558 bytes .../fusion/external/ionicons-2.0.1/png/512/eye.png | Bin 0 -> 3297 bytes .../external/ionicons-2.0.1/png/512/female.png | Bin 0 -> 2779 bytes .../external/ionicons-2.0.1/png/512/filing.png | Bin 0 -> 2349 bytes .../ionicons-2.0.1/png/512/film-marker.png | Bin 0 -> 2645 bytes .../external/ionicons-2.0.1/png/512/fireball.png | Bin 0 -> 3325 bytes .../external/ionicons-2.0.1/png/512/flag.png | Bin 0 -> 2337 bytes .../external/ionicons-2.0.1/png/512/flame.png | Bin 0 -> 3012 bytes .../external/ionicons-2.0.1/png/512/flash-off.png | Bin 0 -> 5437 bytes .../external/ionicons-2.0.1/png/512/flash.png | Bin 0 -> 1965 bytes .../external/ionicons-2.0.1/png/512/flask.png | Bin 0 -> 2939 bytes .../external/ionicons-2.0.1/png/512/folder.png | Bin 0 -> 1689 bytes .../external/ionicons-2.0.1/png/512/fork-repo.png | Bin 0 -> 3236 bytes .../external/ionicons-2.0.1/png/512/fork.png | Bin 0 -> 3007 bytes .../external/ionicons-2.0.1/png/512/forward.png | Bin 0 -> 2142 bytes .../external/ionicons-2.0.1/png/512/funnel.png | Bin 0 -> 3354 bytes .../ionicons-2.0.1/png/512/game-controller-a.png | Bin 0 -> 2548 bytes .../ionicons-2.0.1/png/512/game-controller-b.png | Bin 0 -> 3623 bytes .../external/ionicons-2.0.1/png/512/gear-a.png | Bin 0 -> 3806 bytes .../external/ionicons-2.0.1/png/512/gear-b.png | Bin 0 -> 2756 bytes .../external/ionicons-2.0.1/png/512/grid.png | Bin 0 -> 1066 bytes .../external/ionicons-2.0.1/png/512/hammer.png | Bin 0 -> 2493 bytes .../external/ionicons-2.0.1/png/512/happy.png | Bin 0 -> 5732 bytes .../external/ionicons-2.0.1/png/512/headphone.png | Bin 0 -> 4082 bytes .../ionicons-2.0.1/png/512/heart-broken.png | Bin 0 -> 4007 bytes .../external/ionicons-2.0.1/png/512/heart.png | Bin 0 -> 2322 bytes .../external/ionicons-2.0.1/png/512/help-buoy.png | Bin 0 -> 5824 bytes .../ionicons-2.0.1/png/512/help-circled.png | Bin 0 -> 3940 bytes .../external/ionicons-2.0.1/png/512/help.png | Bin 0 -> 2678 bytes .../external/ionicons-2.0.1/png/512/home.png | Bin 0 -> 1275 bytes .../external/ionicons-2.0.1/png/512/icecream.png | Bin 0 -> 2317 bytes .../png/512/icon-social-google-plus-outline.png | Bin 0 -> 4071 bytes .../png/512/icon-social-google-plus.png | Bin 0 -> 3888 bytes .../external/ionicons-2.0.1/png/512/image.png | Bin 0 -> 2952 bytes .../external/ionicons-2.0.1/png/512/images.png | Bin 0 -> 5073 bytes .../ionicons-2.0.1/png/512/information-circled.png | Bin 0 -> 3300 bytes .../ionicons-2.0.1/png/512/information.png | Bin 0 -> 2236 bytes .../external/ionicons-2.0.1/png/512/ionic.png | Bin 0 -> 5541 bytes .../ionicons-2.0.1/png/512/ios7-alarm-outline.png | Bin 0 -> 5769 bytes .../external/ionicons-2.0.1/png/512/ios7-alarm.png | Bin 0 -> 3922 bytes .../ionicons-2.0.1/png/512/ios7-albums-outline.png | Bin 0 -> 231 bytes .../ionicons-2.0.1/png/512/ios7-albums.png | Bin 0 -> 226 bytes .../png/512/ios7-americanfootball-outline.png | Bin 0 -> 5767 bytes .../png/512/ios7-americanfootball.png | Bin 0 -> 5675 bytes .../png/512/ios7-analytics-outline.png | Bin 0 -> 5847 bytes .../ionicons-2.0.1/png/512/ios7-analytics.png | Bin 0 -> 4406 bytes .../ionicons-2.0.1/png/512/ios7-arrow-back.png | Bin 0 -> 881 bytes .../ionicons-2.0.1/png/512/ios7-arrow-down.png | Bin 0 -> 1451 bytes .../ionicons-2.0.1/png/512/ios7-arrow-forward.png | Bin 0 -> 898 bytes .../ionicons-2.0.1/png/512/ios7-arrow-left.png | Bin 0 -> 1550 bytes .../ionicons-2.0.1/png/512/ios7-arrow-right.png | Bin 0 -> 1537 bytes .../png/512/ios7-arrow-thin-down.png | Bin 0 -> 1632 bytes .../png/512/ios7-arrow-thin-left.png | Bin 0 -> 1258 bytes .../png/512/ios7-arrow-thin-right.png | Bin 0 -> 1235 bytes .../ionicons-2.0.1/png/512/ios7-arrow-thin-up.png | Bin 0 -> 1647 bytes .../ionicons-2.0.1/png/512/ios7-arrow-up.png | Bin 0 -> 1482 bytes .../ionicons-2.0.1/png/512/ios7-at-outline.png | Bin 0 -> 4303 bytes .../external/ionicons-2.0.1/png/512/ios7-at.png | Bin 0 -> 4153 bytes .../png/512/ios7-barcode-outline.png | Bin 0 -> 233 bytes .../ionicons-2.0.1/png/512/ios7-barcode.png | Bin 0 -> 219 bytes .../png/512/ios7-baseball-outline.png | Bin 0 -> 6676 bytes .../ionicons-2.0.1/png/512/ios7-baseball.png | Bin 0 -> 5565 bytes .../png/512/ios7-basketball-outline.png | Bin 0 -> 6200 bytes .../ionicons-2.0.1/png/512/ios7-basketball.png | Bin 0 -> 6525 bytes .../ionicons-2.0.1/png/512/ios7-bell-outline.png | Bin 0 -> 3615 bytes .../external/ionicons-2.0.1/png/512/ios7-bell.png | Bin 0 -> 2769 bytes .../ionicons-2.0.1/png/512/ios7-bolt-outline.png | Bin 0 -> 2384 bytes .../external/ionicons-2.0.1/png/512/ios7-bolt.png | Bin 0 -> 1892 bytes .../png/512/ios7-bookmarks-outline.png | Bin 0 -> 2454 bytes .../ionicons-2.0.1/png/512/ios7-bookmarks.png | Bin 0 -> 2172 bytes .../ionicons-2.0.1/png/512/ios7-box-outline.png | Bin 0 -> 1602 bytes .../external/ionicons-2.0.1/png/512/ios7-box.png | Bin 0 -> 1032 bytes .../png/512/ios7-briefcase-outline.png | Bin 0 -> 1359 bytes .../ionicons-2.0.1/png/512/ios7-briefcase.png | Bin 0 -> 1316 bytes .../png/512/ios7-browsers-outline.png | Bin 0 -> 372 bytes .../ionicons-2.0.1/png/512/ios7-browsers.png | Bin 0 -> 357 bytes .../png/512/ios7-calculator-outline.png | Bin 0 -> 1785 bytes .../ionicons-2.0.1/png/512/ios7-calculator.png | Bin 0 -> 1500 bytes .../png/512/ios7-calendar-outline.png | Bin 0 -> 236 bytes .../ionicons-2.0.1/png/512/ios7-calendar.png | Bin 0 -> 230 bytes .../ionicons-2.0.1/png/512/ios7-camera-outline.png | Bin 0 -> 3582 bytes .../ionicons-2.0.1/png/512/ios7-camera.png | Bin 0 -> 3099 bytes .../ionicons-2.0.1/png/512/ios7-cart-outline.png | Bin 0 -> 2861 bytes .../external/ionicons-2.0.1/png/512/ios7-cart.png | Bin 0 -> 2200 bytes .../png/512/ios7-chatboxes-outline.png | Bin 0 -> 901 bytes .../ionicons-2.0.1/png/512/ios7-chatboxes.png | Bin 0 -> 512 bytes .../png/512/ios7-chatbubble-outline.png | Bin 0 -> 3640 bytes .../ionicons-2.0.1/png/512/ios7-chatbubble.png | Bin 0 -> 2259 bytes .../png/512/ios7-checkmark-empty.png | Bin 0 -> 920 bytes .../png/512/ios7-checkmark-outline.png | Bin 0 -> 4706 bytes .../ionicons-2.0.1/png/512/ios7-checkmark.png | Bin 0 -> 3080 bytes .../ionicons-2.0.1/png/512/ios7-circle-filled.png | Bin 0 -> 6478 bytes .../ionicons-2.0.1/png/512/ios7-circle-outline.png | Bin 0 -> 4120 bytes .../ionicons-2.0.1/png/512/ios7-clock-outline.png | Bin 0 -> 4320 bytes .../external/ionicons-2.0.1/png/512/ios7-clock.png | Bin 0 -> 2762 bytes .../ionicons-2.0.1/png/512/ios7-close-empty.png | Bin 0 -> 1204 bytes .../ionicons-2.0.1/png/512/ios7-close-outline.png | Bin 0 -> 4999 bytes .../external/ionicons-2.0.1/png/512/ios7-close.png | Bin 0 -> 3426 bytes .../png/512/ios7-cloud-download-outline.png | Bin 0 -> 3953 bytes .../ionicons-2.0.1/png/512/ios7-cloud-download.png | Bin 0 -> 2782 bytes .../ionicons-2.0.1/png/512/ios7-cloud-outline.png | Bin 0 -> 3339 bytes .../png/512/ios7-cloud-upload-outline.png | Bin 0 -> 3927 bytes .../ionicons-2.0.1/png/512/ios7-cloud-upload.png | Bin 0 -> 2815 bytes .../external/ionicons-2.0.1/png/512/ios7-cloud.png | Bin 0 -> 2082 bytes .../png/512/ios7-cloudy-night-outline.png | Bin 0 -> 3814 bytes .../ionicons-2.0.1/png/512/ios7-cloudy-night.png | Bin 0 -> 2870 bytes .../ionicons-2.0.1/png/512/ios7-cloudy-outline.png | Bin 0 -> 2280 bytes .../ionicons-2.0.1/png/512/ios7-cloudy.png | Bin 0 -> 1572 bytes .../ionicons-2.0.1/png/512/ios7-cog-outline.png | Bin 0 -> 8008 bytes .../external/ionicons-2.0.1/png/512/ios7-cog.png | Bin 0 -> 6029 bytes .../png/512/ios7-compose-outline.png | Bin 0 -> 1584 bytes .../ionicons-2.0.1/png/512/ios7-compose.png | Bin 0 -> 2061 bytes .../png/512/ios7-contact-outline.png | Bin 0 -> 4846 bytes .../ionicons-2.0.1/png/512/ios7-contact.png | Bin 0 -> 4218 bytes .../ionicons-2.0.1/png/512/ios7-copy-outline.png | Bin 0 -> 927 bytes .../external/ionicons-2.0.1/png/512/ios7-copy.png | Bin 0 -> 782 bytes .../png/512/ios7-download-outline.png | Bin 0 -> 1163 bytes .../ionicons-2.0.1/png/512/ios7-download.png | Bin 0 -> 1135 bytes .../external/ionicons-2.0.1/png/512/ios7-drag.png | Bin 0 -> 165 bytes .../ionicons-2.0.1/png/512/ios7-email-outline.png | Bin 0 -> 2592 bytes .../external/ionicons-2.0.1/png/512/ios7-email.png | Bin 0 -> 4167 bytes .../ionicons-2.0.1/png/512/ios7-expand.png | Bin 0 -> 485 bytes .../ionicons-2.0.1/png/512/ios7-eye-outline.png | Bin 0 -> 4381 bytes .../external/ionicons-2.0.1/png/512/ios7-eye.png | Bin 0 -> 2973 bytes .../png/512/ios7-fastforward-outline.png | Bin 0 -> 2726 bytes .../ionicons-2.0.1/png/512/ios7-fastforward.png | Bin 0 -> 2158 bytes .../ionicons-2.0.1/png/512/ios7-filing-outline.png | Bin 0 -> 2041 bytes .../ionicons-2.0.1/png/512/ios7-filing.png | Bin 0 -> 1933 bytes .../ionicons-2.0.1/png/512/ios7-film-outline.png | Bin 0 -> 772 bytes .../external/ionicons-2.0.1/png/512/ios7-film.png | Bin 0 -> 722 bytes .../ionicons-2.0.1/png/512/ios7-flag-outline.png | Bin 0 -> 1928 bytes .../external/ionicons-2.0.1/png/512/ios7-flag.png | Bin 0 -> 1483 bytes .../ionicons-2.0.1/png/512/ios7-folder-outline.png | Bin 0 -> 1606 bytes .../ionicons-2.0.1/png/512/ios7-folder.png | Bin 0 -> 1640 bytes .../png/512/ios7-football-outline.png | Bin 0 -> 6266 bytes .../ionicons-2.0.1/png/512/ios7-football.png | Bin 0 -> 5391 bytes .../ionicons-2.0.1/png/512/ios7-gear-outline.png | Bin 0 -> 5721 bytes .../external/ionicons-2.0.1/png/512/ios7-gear.png | Bin 0 -> 3445 bytes .../png/512/ios7-glasses-outline.png | Bin 0 -> 3597 bytes .../ionicons-2.0.1/png/512/ios7-glasses.png | Bin 0 -> 2350 bytes .../ionicons-2.0.1/png/512/ios7-heart-outline.png | Bin 0 -> 3097 bytes .../external/ionicons-2.0.1/png/512/ios7-heart.png | Bin 0 -> 2078 bytes .../ionicons-2.0.1/png/512/ios7-help-empty.png | Bin 0 -> 1669 bytes .../ionicons-2.0.1/png/512/ios7-help-outline.png | Bin 0 -> 5608 bytes .../external/ionicons-2.0.1/png/512/ios7-help.png | Bin 0 -> 3587 bytes .../ionicons-2.0.1/png/512/ios7-home-outline.png | Bin 0 -> 1710 bytes .../external/ionicons-2.0.1/png/512/ios7-home.png | Bin 0 -> 1518 bytes .../png/512/ios7-infinite-outline.png | Bin 0 -> 3028 bytes .../ionicons-2.0.1/png/512/ios7-infinite.png | Bin 0 -> 2989 bytes .../png/512/ios7-information-empty.png | Bin 0 -> 837 bytes .../png/512/ios7-information-outline.png | Bin 0 -> 4563 bytes .../ionicons-2.0.1/png/512/ios7-information.png | Bin 0 -> 2959 bytes .../ionicons-2.0.1/png/512/ios7-ionic-outline.png | Bin 0 -> 5780 bytes .../ionicons-2.0.1/png/512/ios7-keypad-outline.png | Bin 0 -> 7485 bytes .../ionicons-2.0.1/png/512/ios7-keypad.png | Bin 0 -> 7505 bytes .../png/512/ios7-lightbulb-outline.png | Bin 0 -> 3791 bytes .../ionicons-2.0.1/png/512/ios7-lightbulb.png | Bin 0 -> 2696 bytes .../png/512/ios7-location-outline.png | Bin 0 -> 4116 bytes .../ionicons-2.0.1/png/512/ios7-location.png | Bin 0 -> 2767 bytes .../ionicons-2.0.1/png/512/ios7-locked-outline.png | Bin 0 -> 2640 bytes .../ionicons-2.0.1/png/512/ios7-locked.png | Bin 0 -> 2674 bytes .../ionicons-2.0.1/png/512/ios7-loop-strong.png | Bin 0 -> 4101 bytes .../external/ionicons-2.0.1/png/512/ios7-loop.png | Bin 0 -> 4270 bytes .../ionicons-2.0.1/png/512/ios7-medkit-outline.png | Bin 0 -> 1386 bytes .../ionicons-2.0.1/png/512/ios7-medkit.png | Bin 0 -> 1373 bytes .../ionicons-2.0.1/png/512/ios7-mic-off.png | Bin 0 -> 7597 bytes .../ionicons-2.0.1/png/512/ios7-mic-outline.png | Bin 0 -> 3550 bytes .../external/ionicons-2.0.1/png/512/ios7-mic.png | Bin 0 -> 3878 bytes .../ionicons-2.0.1/png/512/ios7-minus-empty.png | Bin 0 -> 153 bytes .../ionicons-2.0.1/png/512/ios7-minus-outline.png | Bin 0 -> 4137 bytes .../external/ionicons-2.0.1/png/512/ios7-minus.png | Bin 0 -> 2520 bytes .../png/512/ios7-monitor-outline.png | Bin 0 -> 225 bytes .../ionicons-2.0.1/png/512/ios7-monitor.png | Bin 0 -> 230 bytes .../ionicons-2.0.1/png/512/ios7-moon-outline.png | Bin 0 -> 2566 bytes .../external/ionicons-2.0.1/png/512/ios7-moon.png | Bin 0 -> 1784 bytes .../ionicons-2.0.1/png/512/ios7-more-outline.png | Bin 0 -> 1598 bytes .../external/ionicons-2.0.1/png/512/ios7-more.png | Bin 0 -> 1700 bytes .../ionicons-2.0.1/png/512/ios7-musical-note.png | Bin 0 -> 1521 bytes .../ionicons-2.0.1/png/512/ios7-musical-notes.png | Bin 0 -> 2124 bytes .../png/512/ios7-navigate-outline.png | Bin 0 -> 4901 bytes .../ionicons-2.0.1/png/512/ios7-navigate.png | Bin 0 -> 3333 bytes .../ionicons-2.0.1/png/512/ios7-paper-outline.png | Bin 0 -> 1361 bytes .../external/ionicons-2.0.1/png/512/ios7-paper.png | Bin 0 -> 1197 bytes .../png/512/ios7-paperplane-outline.png | Bin 0 -> 2952 bytes .../ionicons-2.0.1/png/512/ios7-paperplane.png | Bin 0 -> 4805 bytes .../png/512/ios7-partlysunny-outline.png | Bin 0 -> 4823 bytes .../ionicons-2.0.1/png/512/ios7-partlysunny.png | Bin 0 -> 4052 bytes .../ionicons-2.0.1/png/512/ios7-pause-outline.png | Bin 0 -> 227 bytes .../external/ionicons-2.0.1/png/512/ios7-pause.png | Bin 0 -> 213 bytes .../ionicons-2.0.1/png/512/ios7-paw-outline.png | Bin 0 -> 6318 bytes .../external/ionicons-2.0.1/png/512/ios7-paw.png | Bin 0 -> 4119 bytes .../ionicons-2.0.1/png/512/ios7-people-outline.png | Bin 0 -> 5295 bytes .../ionicons-2.0.1/png/512/ios7-people.png | Bin 0 -> 3439 bytes .../ionicons-2.0.1/png/512/ios7-person-outline.png | Bin 0 -> 3189 bytes .../ionicons-2.0.1/png/512/ios7-person.png | Bin 0 -> 2046 bytes .../png/512/ios7-personadd-outline.png | Bin 0 -> 3246 bytes .../ionicons-2.0.1/png/512/ios7-personadd.png | Bin 0 -> 2110 bytes .../ionicons-2.0.1/png/512/ios7-photos-outline.png | Bin 0 -> 234 bytes .../ionicons-2.0.1/png/512/ios7-photos.png | Bin 0 -> 226 bytes .../ionicons-2.0.1/png/512/ios7-pie-outline.png | Bin 0 -> 4549 bytes .../external/ionicons-2.0.1/png/512/ios7-pie.png | Bin 0 -> 3646 bytes .../ionicons-2.0.1/png/512/ios7-play-outline.png | Bin 0 -> 1474 bytes .../external/ionicons-2.0.1/png/512/ios7-play.png | Bin 0 -> 1216 bytes .../ionicons-2.0.1/png/512/ios7-plus-empty.png | Bin 0 -> 204 bytes .../ionicons-2.0.1/png/512/ios7-plus-outline.png | Bin 0 -> 4415 bytes .../external/ionicons-2.0.1/png/512/ios7-plus.png | Bin 0 -> 2970 bytes .../png/512/ios7-pricetag-outline.png | Bin 0 -> 3007 bytes .../ionicons-2.0.1/png/512/ios7-pricetag.png | Bin 0 -> 2593 bytes .../png/512/ios7-pricetags-outline.png | Bin 0 -> 3563 bytes .../ionicons-2.0.1/png/512/ios7-pricetags.png | Bin 0 -> 3219 bytes .../png/512/ios7-printer-outline.png | Bin 0 -> 1764 bytes .../ionicons-2.0.1/png/512/ios7-printer.png | Bin 0 -> 1456 bytes .../ionicons-2.0.1/png/512/ios7-pulse-strong.png | Bin 0 -> 3326 bytes .../external/ionicons-2.0.1/png/512/ios7-pulse.png | Bin 0 -> 2955 bytes .../ionicons-2.0.1/png/512/ios7-rainy-outline.png | Bin 0 -> 3346 bytes .../external/ionicons-2.0.1/png/512/ios7-rainy.png | Bin 0 -> 2567 bytes .../png/512/ios7-recording-outline.png | Bin 0 -> 4926 bytes .../ionicons-2.0.1/png/512/ios7-recording.png | Bin 0 -> 3762 bytes .../ionicons-2.0.1/png/512/ios7-redo-outline.png | Bin 0 -> 3094 bytes .../external/ionicons-2.0.1/png/512/ios7-redo.png | Bin 0 -> 2054 bytes .../ionicons-2.0.1/png/512/ios7-refresh-empty.png | Bin 0 -> 2685 bytes .../png/512/ios7-refresh-outline.png | Bin 0 -> 6021 bytes .../ionicons-2.0.1/png/512/ios7-refresh.png | Bin 0 -> 4579 bytes .../ionicons-2.0.1/png/512/ios7-reload.png | Bin 0 -> 4195 bytes .../png/512/ios7-reverse-camera-outline.png | Bin 0 -> 3404 bytes .../ionicons-2.0.1/png/512/ios7-reverse-camera.png | Bin 0 -> 3019 bytes .../ionicons-2.0.1/png/512/ios7-rewind-outline.png | Bin 0 -> 2898 bytes .../ionicons-2.0.1/png/512/ios7-rewind.png | Bin 0 -> 2362 bytes .../ionicons-2.0.1/png/512/ios7-search-strong.png | Bin 0 -> 3329 bytes .../ionicons-2.0.1/png/512/ios7-search.png | Bin 0 -> 3361 bytes .../png/512/ios7-settings-strong.png | Bin 0 -> 1714 bytes .../ionicons-2.0.1/png/512/ios7-settings.png | Bin 0 -> 2160 bytes .../ionicons-2.0.1/png/512/ios7-shrink.png | Bin 0 -> 490 bytes .../png/512/ios7-skipbackward-outline.png | Bin 0 -> 1890 bytes .../ionicons-2.0.1/png/512/ios7-skipbackward.png | Bin 0 -> 1533 bytes .../png/512/ios7-skipforward-outline.png | Bin 0 -> 1827 bytes .../ionicons-2.0.1/png/512/ios7-skipforward.png | Bin 0 -> 1556 bytes .../external/ionicons-2.0.1/png/512/ios7-snowy.png | Bin 0 -> 3775 bytes .../png/512/ios7-speedometer-outline.png | Bin 0 -> 4678 bytes .../ionicons-2.0.1/png/512/ios7-speedometer.png | Bin 0 -> 5748 bytes .../ionicons-2.0.1/png/512/ios7-star-half.png | Bin 0 -> 3431 bytes .../ionicons-2.0.1/png/512/ios7-star-outline.png | Bin 0 -> 3572 bytes .../external/ionicons-2.0.1/png/512/ios7-star.png | Bin 0 -> 2463 bytes .../png/512/ios7-stopwatch-outline.png | Bin 0 -> 4823 bytes .../ionicons-2.0.1/png/512/ios7-stopwatch.png | Bin 0 -> 3451 bytes .../ionicons-2.0.1/png/512/ios7-sunny-outline.png | Bin 0 -> 2669 bytes .../external/ionicons-2.0.1/png/512/ios7-sunny.png | Bin 0 -> 2506 bytes .../png/512/ios7-telephone-outline.png | Bin 0 -> 3779 bytes .../ionicons-2.0.1/png/512/ios7-telephone.png | Bin 0 -> 2352 bytes .../png/512/ios7-tennisball-outline.png | Bin 0 -> 5535 bytes .../ionicons-2.0.1/png/512/ios7-tennisball.png | Bin 0 -> 6356 bytes .../png/512/ios7-thunderstorm-outline.png | Bin 0 -> 3053 bytes .../ionicons-2.0.1/png/512/ios7-thunderstorm.png | Bin 0 -> 2492 bytes .../ionicons-2.0.1/png/512/ios7-time-outline.png | Bin 0 -> 5875 bytes .../external/ionicons-2.0.1/png/512/ios7-time.png | Bin 0 -> 4136 bytes .../ionicons-2.0.1/png/512/ios7-timer-outline.png | Bin 0 -> 4578 bytes .../external/ionicons-2.0.1/png/512/ios7-timer.png | Bin 0 -> 6013 bytes .../ionicons-2.0.1/png/512/ios7-toggle-outline.png | Bin 0 -> 5660 bytes .../ionicons-2.0.1/png/512/ios7-toggle.png | Bin 0 -> 4825 bytes .../ionicons-2.0.1/png/512/ios7-trash-outline.png | Bin 0 -> 4497 bytes .../external/ionicons-2.0.1/png/512/ios7-trash.png | Bin 0 -> 2760 bytes .../ionicons-2.0.1/png/512/ios7-undo-outline.png | Bin 0 -> 3114 bytes .../external/ionicons-2.0.1/png/512/ios7-undo.png | Bin 0 -> 1954 bytes .../png/512/ios7-unlocked-outline.png | Bin 0 -> 2580 bytes .../ionicons-2.0.1/png/512/ios7-unlocked.png | Bin 0 -> 2605 bytes .../ionicons-2.0.1/png/512/ios7-upload-outline.png | Bin 0 -> 1128 bytes .../ionicons-2.0.1/png/512/ios7-upload.png | Bin 0 -> 1085 bytes .../png/512/ios7-videocam-outline.png | Bin 0 -> 2038 bytes .../ionicons-2.0.1/png/512/ios7-videocam.png | Bin 0 -> 2715 bytes .../ionicons-2.0.1/png/512/ios7-volume-high.png | Bin 0 -> 2977 bytes .../ionicons-2.0.1/png/512/ios7-volume-low.png | Bin 0 -> 956 bytes .../png/512/ios7-wineglass-outline.png | Bin 0 -> 2527 bytes .../ionicons-2.0.1/png/512/ios7-wineglass.png | Bin 0 -> 2013 bytes .../ionicons-2.0.1/png/512/ios7-world-outline.png | Bin 0 -> 7420 bytes .../external/ionicons-2.0.1/png/512/ios7-world.png | Bin 0 -> 10031 bytes .../external/ionicons-2.0.1/png/512/ipad.png | Bin 0 -> 1356 bytes .../external/ionicons-2.0.1/png/512/iphone.png | Bin 0 -> 1651 bytes .../external/ionicons-2.0.1/png/512/ipod.png | Bin 0 -> 3207 bytes .../fusion/external/ionicons-2.0.1/png/512/jet.png | Bin 0 -> 2856 bytes .../fusion/external/ionicons-2.0.1/png/512/key.png | Bin 0 -> 2722 bytes .../external/ionicons-2.0.1/png/512/knife.png | Bin 0 -> 1822 bytes .../external/ionicons-2.0.1/png/512/laptop.png | Bin 0 -> 2474 bytes .../external/ionicons-2.0.1/png/512/leaf.png | Bin 0 -> 3440 bytes .../external/ionicons-2.0.1/png/512/levels.png | Bin 0 -> 2431 bytes .../external/ionicons-2.0.1/png/512/lightbulb.png | Bin 0 -> 2474 bytes .../external/ionicons-2.0.1/png/512/link.png | Bin 0 -> 2306 bytes .../external/ionicons-2.0.1/png/512/load-a.png | Bin 0 -> 3941 bytes .../external/ionicons-2.0.1/png/512/load-b.png | Bin 0 -> 5473 bytes .../external/ionicons-2.0.1/png/512/load-c.png | Bin 0 -> 4337 bytes .../external/ionicons-2.0.1/png/512/load-d.png | Bin 0 -> 6618 bytes .../external/ionicons-2.0.1/png/512/location.png | Bin 0 -> 2739 bytes .../external/ionicons-2.0.1/png/512/locked.png | Bin 0 -> 2494 bytes .../external/ionicons-2.0.1/png/512/log-in.png | Bin 0 -> 1460 bytes .../external/ionicons-2.0.1/png/512/log-out.png | Bin 0 -> 1637 bytes .../external/ionicons-2.0.1/png/512/loop.png | Bin 0 -> 3794 bytes .../external/ionicons-2.0.1/png/512/magnet.png | Bin 0 -> 4495 bytes .../external/ionicons-2.0.1/png/512/male.png | Bin 0 -> 3788 bytes .../fusion/external/ionicons-2.0.1/png/512/man.png | Bin 0 -> 2126 bytes .../fusion/external/ionicons-2.0.1/png/512/map.png | Bin 0 -> 4906 bytes .../external/ionicons-2.0.1/png/512/medkit.png | Bin 0 -> 1605 bytes .../external/ionicons-2.0.1/png/512/merge.png | Bin 0 -> 3879 bytes .../external/ionicons-2.0.1/png/512/mic-a.png | Bin 0 -> 4098 bytes .../external/ionicons-2.0.1/png/512/mic-b.png | Bin 0 -> 2576 bytes .../external/ionicons-2.0.1/png/512/mic-c.png | Bin 0 -> 1726 bytes .../ionicons-2.0.1/png/512/minus-circled.png | Bin 0 -> 2655 bytes .../ionicons-2.0.1/png/512/minus-round.png | Bin 0 -> 937 bytes .../external/ionicons-2.0.1/png/512/minus.png | Bin 0 -> 160 bytes .../external/ionicons-2.0.1/png/512/model-s.png | Bin 0 -> 4262 bytes .../external/ionicons-2.0.1/png/512/monitor.png | Bin 0 -> 1469 bytes .../external/ionicons-2.0.1/png/512/more.png | Bin 0 -> 3357 bytes .../external/ionicons-2.0.1/png/512/mouse.png | Bin 0 -> 2891 bytes .../external/ionicons-2.0.1/png/512/music-note.png | Bin 0 -> 2519 bytes .../ionicons-2.0.1/png/512/navicon-round.png | Bin 0 -> 1628 bytes .../external/ionicons-2.0.1/png/512/navicon.png | Bin 0 -> 175 bytes .../external/ionicons-2.0.1/png/512/navigate.png | Bin 0 -> 1693 bytes .../external/ionicons-2.0.1/png/512/network.png | Bin 0 -> 3041 bytes .../external/ionicons-2.0.1/png/512/no-smoking.png | Bin 0 -> 5816 bytes .../external/ionicons-2.0.1/png/512/nuclear.png | Bin 0 -> 3618 bytes .../external/ionicons-2.0.1/png/512/outlet.png | Bin 0 -> 2882 bytes .../ionicons-2.0.1/png/512/paper-airplane.png | Bin 0 -> 3678 bytes .../external/ionicons-2.0.1/png/512/paperclip.png | Bin 0 -> 2710 bytes .../external/ionicons-2.0.1/png/512/pause.png | Bin 0 -> 1340 bytes .../external/ionicons-2.0.1/png/512/person-add.png | Bin 0 -> 2410 bytes .../ionicons-2.0.1/png/512/person-stalker.png | Bin 0 -> 3272 bytes .../external/ionicons-2.0.1/png/512/person.png | Bin 0 -> 2258 bytes .../external/ionicons-2.0.1/png/512/pie-graph.png | Bin 0 -> 3608 bytes .../fusion/external/ionicons-2.0.1/png/512/pin.png | Bin 0 -> 2270 bytes .../external/ionicons-2.0.1/png/512/pinpoint.png | Bin 0 -> 4799 bytes .../external/ionicons-2.0.1/png/512/pizza.png | Bin 0 -> 4548 bytes .../external/ionicons-2.0.1/png/512/plane.png | Bin 0 -> 3218 bytes .../external/ionicons-2.0.1/png/512/planet.png | Bin 0 -> 4319 bytes .../external/ionicons-2.0.1/png/512/play.png | Bin 0 -> 1787 bytes .../ionicons-2.0.1/png/512/playstation.png | Bin 0 -> 3275 bytes .../ionicons-2.0.1/png/512/plus-circled.png | Bin 0 -> 3114 bytes .../external/ionicons-2.0.1/png/512/plus-round.png | Bin 0 -> 1567 bytes .../external/ionicons-2.0.1/png/512/plus.png | Bin 0 -> 223 bytes .../external/ionicons-2.0.1/png/512/podium.png | Bin 0 -> 209 bytes .../external/ionicons-2.0.1/png/512/pound.png | Bin 0 -> 2383 bytes .../external/ionicons-2.0.1/png/512/power.png | Bin 0 -> 4727 bytes .../external/ionicons-2.0.1/png/512/pricetag.png | Bin 0 -> 2457 bytes .../external/ionicons-2.0.1/png/512/pricetags.png | Bin 0 -> 2906 bytes .../external/ionicons-2.0.1/png/512/printer.png | Bin 0 -> 1869 bytes .../ionicons-2.0.1/png/512/pull-request.png | Bin 0 -> 3613 bytes .../external/ionicons-2.0.1/png/512/qr-scanner.png | Bin 0 -> 1842 bytes .../external/ionicons-2.0.1/png/512/quote.png | Bin 0 -> 1743 bytes .../ionicons-2.0.1/png/512/radio-waves.png | Bin 0 -> 4978 bytes .../external/ionicons-2.0.1/png/512/record.png | Bin 0 -> 3779 bytes .../external/ionicons-2.0.1/png/512/refresh.png | Bin 0 -> 3582 bytes .../external/ionicons-2.0.1/png/512/reply-all.png | Bin 0 -> 3033 bytes .../external/ionicons-2.0.1/png/512/reply.png | Bin 0 -> 2131 bytes .../external/ionicons-2.0.1/png/512/ribbon-a.png | Bin 0 -> 6449 bytes .../external/ionicons-2.0.1/png/512/ribbon-b.png | Bin 0 -> 5913 bytes .../fusion/external/ionicons-2.0.1/png/512/sad.png | Bin 0 -> 5517 bytes .../external/ionicons-2.0.1/png/512/scissors.png | Bin 0 -> 5061 bytes .../external/ionicons-2.0.1/png/512/search.png | Bin 0 -> 3229 bytes .../external/ionicons-2.0.1/png/512/settings.png | Bin 0 -> 4141 bytes .../external/ionicons-2.0.1/png/512/share.png | Bin 0 -> 2616 bytes .../external/ionicons-2.0.1/png/512/shuffle.png | Bin 0 -> 3420 bytes .../ionicons-2.0.1/png/512/skip-backward.png | Bin 0 -> 2421 bytes .../ionicons-2.0.1/png/512/skip-forward.png | Bin 0 -> 2402 bytes .../png/512/social-android-outline.png | Bin 0 -> 3772 bytes .../ionicons-2.0.1/png/512/social-android.png | Bin 0 -> 2784 bytes .../png/512/social-apple-outline.png | Bin 0 -> 4104 bytes .../ionicons-2.0.1/png/512/social-apple.png | Bin 0 -> 2647 bytes .../png/512/social-bitcoin-outline.png | Bin 0 -> 3790 bytes .../ionicons-2.0.1/png/512/social-bitcoin.png | Bin 0 -> 2424 bytes .../png/512/social-buffer-outline.png | Bin 0 -> 3913 bytes .../ionicons-2.0.1/png/512/social-buffer.png | Bin 0 -> 4687 bytes .../png/512/social-designernews-outline.png | Bin 0 -> 4754 bytes .../ionicons-2.0.1/png/512/social-designernews.png | Bin 0 -> 4242 bytes .../png/512/social-dribbble-outline.png | Bin 0 -> 5588 bytes .../ionicons-2.0.1/png/512/social-dribbble.png | Bin 0 -> 6983 bytes .../png/512/social-dropbox-outline.png | Bin 0 -> 5113 bytes .../ionicons-2.0.1/png/512/social-dropbox.png | Bin 0 -> 6161 bytes .../png/512/social-facebook-outline.png | Bin 0 -> 1788 bytes .../ionicons-2.0.1/png/512/social-facebook.png | Bin 0 -> 1402 bytes .../png/512/social-foursquare-outline.png | Bin 0 -> 3364 bytes .../ionicons-2.0.1/png/512/social-foursquare.png | Bin 0 -> 3021 bytes .../png/512/social-freebsd-devil.png | Bin 0 -> 5300 bytes .../png/512/social-github-outline.png | Bin 0 -> 7475 bytes .../ionicons-2.0.1/png/512/social-github.png | Bin 0 -> 4561 bytes .../png/512/social-google-outline.png | Bin 0 -> 3890 bytes .../ionicons-2.0.1/png/512/social-google.png | Bin 0 -> 3682 bytes .../png/512/social-googleplus-outline.png | Bin 0 -> 4071 bytes .../ionicons-2.0.1/png/512/social-googleplus.png | Bin 0 -> 3888 bytes .../png/512/social-hackernews-outline.png | Bin 0 -> 1994 bytes .../ionicons-2.0.1/png/512/social-hackernews.png | Bin 0 -> 1905 bytes .../png/512/social-instagram-outline.png | Bin 0 -> 3317 bytes .../ionicons-2.0.1/png/512/social-instagram.png | Bin 0 -> 4403 bytes .../png/512/social-linkedin-outline.png | Bin 0 -> 2370 bytes .../ionicons-2.0.1/png/512/social-linkedin.png | Bin 0 -> 2275 bytes .../png/512/social-pinterest-outline.png | Bin 0 -> 6933 bytes .../ionicons-2.0.1/png/512/social-pinterest.png | Bin 0 -> 5532 bytes .../png/512/social-reddit-outline.png | Bin 0 -> 6414 bytes .../ionicons-2.0.1/png/512/social-reddit.png | Bin 0 -> 4498 bytes .../ionicons-2.0.1/png/512/social-rss-outline.png | Bin 0 -> 5945 bytes .../external/ionicons-2.0.1/png/512/social-rss.png | Bin 0 -> 4789 bytes .../png/512/social-skype-outline.png | Bin 0 -> 5608 bytes .../ionicons-2.0.1/png/512/social-skype.png | Bin 0 -> 4269 bytes .../png/512/social-tumblr-outline.png | Bin 0 -> 2725 bytes .../ionicons-2.0.1/png/512/social-tumblr.png | Bin 0 -> 1946 bytes .../external/ionicons-2.0.1/png/512/social-tux.png | Bin 0 -> 7103 bytes .../png/512/social-twitter-outline.png | Bin 0 -> 5569 bytes .../ionicons-2.0.1/png/512/social-twitter.png | Bin 0 -> 3405 bytes .../ionicons-2.0.1/png/512/social-usd-outline.png | Bin 0 -> 5744 bytes .../external/ionicons-2.0.1/png/512/social-usd.png | Bin 0 -> 3446 bytes .../png/512/social-vimeo-outline.png | Bin 0 -> 5525 bytes .../ionicons-2.0.1/png/512/social-vimeo.png | Bin 0 -> 3456 bytes .../png/512/social-windows-outline.png | Bin 0 -> 1775 bytes .../ionicons-2.0.1/png/512/social-windows.png | Bin 0 -> 2550 bytes .../png/512/social-wordpress-outline.png | Bin 0 -> 6418 bytes .../ionicons-2.0.1/png/512/social-wordpress.png | Bin 0 -> 5465 bytes .../png/512/social-yahoo-outline.png | Bin 0 -> 2119 bytes .../ionicons-2.0.1/png/512/social-yahoo.png | Bin 0 -> 1729 bytes .../png/512/social-youtube-outline.png | Bin 0 -> 4655 bytes .../ionicons-2.0.1/png/512/social-youtube.png | Bin 0 -> 2511 bytes .../ionicons-2.0.1/png/512/speakerphone.png | Bin 0 -> 4310 bytes .../ionicons-2.0.1/png/512/speedometer.png | Bin 0 -> 4238 bytes .../external/ionicons-2.0.1/png/512/spoon.png | Bin 0 -> 2306 bytes .../external/ionicons-2.0.1/png/512/star.png | Bin 0 -> 2195 bytes .../external/ionicons-2.0.1/png/512/stats-bars.png | Bin 0 -> 218 bytes .../external/ionicons-2.0.1/png/512/steam.png | Bin 0 -> 3875 bytes .../external/ionicons-2.0.1/png/512/stop.png | Bin 0 -> 1090 bytes .../ionicons-2.0.1/png/512/thermometer.png | Bin 0 -> 1980 bytes .../external/ionicons-2.0.1/png/512/thumbsdown.png | Bin 0 -> 2288 bytes .../external/ionicons-2.0.1/png/512/thumbsup.png | Bin 0 -> 2356 bytes .../ionicons-2.0.1/png/512/toggle-filled.png | Bin 0 -> 3194 bytes .../external/ionicons-2.0.1/png/512/toggle.png | Bin 0 -> 3599 bytes .../external/ionicons-2.0.1/png/512/trash-a.png | Bin 0 -> 2752 bytes .../external/ionicons-2.0.1/png/512/trash-b.png | Bin 0 -> 1882 bytes .../external/ionicons-2.0.1/png/512/trophy.png | Bin 0 -> 3579 bytes .../external/ionicons-2.0.1/png/512/umbrella.png | Bin 0 -> 3416 bytes .../external/ionicons-2.0.1/png/512/university.png | Bin 0 -> 3167 bytes .../external/ionicons-2.0.1/png/512/unlocked.png | Bin 0 -> 2412 bytes .../external/ionicons-2.0.1/png/512/upload.png | Bin 0 -> 2480 bytes .../fusion/external/ionicons-2.0.1/png/512/usb.png | Bin 0 -> 3950 bytes .../ionicons-2.0.1/png/512/videocamera.png | Bin 0 -> 2381 bytes .../ionicons-2.0.1/png/512/volume-high.png | Bin 0 -> 4334 bytes .../external/ionicons-2.0.1/png/512/volume-low.png | Bin 0 -> 2136 bytes .../ionicons-2.0.1/png/512/volume-medium.png | Bin 0 -> 3174 bytes .../ionicons-2.0.1/png/512/volume-mute.png | Bin 0 -> 4803 bytes .../external/ionicons-2.0.1/png/512/wand.png | Bin 0 -> 1933 bytes .../external/ionicons-2.0.1/png/512/waterdrop.png | Bin 0 -> 3169 bytes .../external/ionicons-2.0.1/png/512/wifi.png | Bin 0 -> 3037 bytes .../external/ionicons-2.0.1/png/512/wineglass.png | Bin 0 -> 3734 bytes .../external/ionicons-2.0.1/png/512/woman.png | Bin 0 -> 3592 bytes .../external/ionicons-2.0.1/png/512/wrench.png | Bin 0 -> 2866 bytes .../external/ionicons-2.0.1/png/512/xbox.png | Bin 0 -> 4958 bytes .../app/fusion/external/ionicons-2.0.1/readme.md | 60 + .../ionicons-2.0.1/scss/_ionicons-font.scss | 27 + .../ionicons-2.0.1/scss/_ionicons-icons.scss | 1473 + .../ionicons-2.0.1/scss/_ionicons-variables.scss | 741 + .../external/ionicons-2.0.1/scss/ionicons.scss | 15 + .../external/ionicons-2.0.1/src/alert-circled.svg | 11 + .../fusion/external/ionicons-2.0.1/src/alert.svg | 9 + .../ionicons-2.0.1/src/android-add-circle.svg | 12 + .../external/ionicons-2.0.1/src/android-add.svg | 11 + .../ionicons-2.0.1/src/android-alarm-clock.svg | 15 + .../external/ionicons-2.0.1/src/android-alert.svg | 12 + .../external/ionicons-2.0.1/src/android-apps.svg | 12 + .../ionicons-2.0.1/src/android-archive.svg | 12 + .../ionicons-2.0.1/src/android-arrow-back.svg | 11 + .../ionicons-2.0.1/src/android-arrow-down.svg | 11 + .../src/android-arrow-dropdown-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropdown.svg | 9 + .../src/android-arrow-dropleft-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropleft.svg | 9 + .../src/android-arrow-dropright-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropright.svg | 9 + .../src/android-arrow-dropup-circle.svg | 10 + .../ionicons-2.0.1/src/android-arrow-dropup.svg | 9 + .../ionicons-2.0.1/src/android-arrow-forward.svg | 11 + .../ionicons-2.0.1/src/android-arrow-up.svg | 11 + .../external/ionicons-2.0.1/src/android-attach.svg | 15 + .../external/ionicons-2.0.1/src/android-bar.svg | 12 + .../ionicons-2.0.1/src/android-bicycle.svg | 19 + .../external/ionicons-2.0.1/src/android-boat.svg | 16 + .../ionicons-2.0.1/src/android-bookmark.svg | 7 + .../external/ionicons-2.0.1/src/android-bulb.svg | 18 + .../external/ionicons-2.0.1/src/android-bus.svg | 18 + .../ionicons-2.0.1/src/android-calendar.svg | 11 + .../external/ionicons-2.0.1/src/android-call.svg | 10 + .../external/ionicons-2.0.1/src/android-camera.svg | 12 + .../external/ionicons-2.0.1/src/android-cancel.svg | 11 + .../external/ionicons-2.0.1/src/android-car.svg | 15 + .../external/ionicons-2.0.1/src/android-cart.svg | 14 + .../external/ionicons-2.0.1/src/android-chat.svg | 12 + .../ionicons-2.0.1/src/android-checkbox-blank.svg | 12 + .../src/android-checkbox-outline-blank.svg | 13 + .../src/android-checkbox-outline.svg | 13 + .../ionicons-2.0.1/src/android-checkbox.svg | 13 + .../src/android-checkmark-circle.svg | 9 + .../ionicons-2.0.1/src/android-clipboard.svg | 10 + .../external/ionicons-2.0.1/src/android-close.svg | 12 + .../ionicons-2.0.1/src/android-cloud-circle.svg | 16 + .../ionicons-2.0.1/src/android-cloud-done.svg | 12 + .../ionicons-2.0.1/src/android-cloud-outline.svg | 16 + .../external/ionicons-2.0.1/src/android-cloud.svg | 9 + .../ionicons-2.0.1/src/android-color-palette.svg | 17 + .../ionicons-2.0.1/src/android-compass.svg | 9 + .../ionicons-2.0.1/src/android-contact.svg | 15 + .../ionicons-2.0.1/src/android-contacts.svg | 26 + .../ionicons-2.0.1/src/android-contract.svg | 12 + .../external/ionicons-2.0.1/src/android-create.svg | 13 + .../external/ionicons-2.0.1/src/android-delete.svg | 10 + .../ionicons-2.0.1/src/android-desktop.svg | 13 + .../ionicons-2.0.1/src/android-document.svg | 10 + .../ionicons-2.0.1/src/android-done-all.svg | 13 + .../external/ionicons-2.0.1/src/android-done.svg | 13 + .../ionicons-2.0.1/src/android-download.svg | 9 + .../external/ionicons-2.0.1/src/android-drafts.svg | 15 + .../external/ionicons-2.0.1/src/android-exit.svg | 9 + .../external/ionicons-2.0.1/src/android-expand.svg | 12 + .../src/android-favorite-outline.svg | 13 + .../ionicons-2.0.1/src/android-favorite.svg | 11 + .../external/ionicons-2.0.1/src/android-film.svg | 9 + .../ionicons-2.0.1/src/android-folder-open.svg | 10 + .../external/ionicons-2.0.1/src/android-folder.svg | 14 + .../external/ionicons-2.0.1/src/android-funnel.svg | 7 + .../external/ionicons-2.0.1/src/android-globe.svg | 24 + .../external/ionicons-2.0.1/src/android-hand.svg | 15 + .../ionicons-2.0.1/src/android-hangout.svg | 9 + .../external/ionicons-2.0.1/src/android-happy.svg | 12 + .../external/ionicons-2.0.1/src/android-home.svg | 9 + .../external/ionicons-2.0.1/src/android-image.svg | 13 + .../external/ionicons-2.0.1/src/android-laptop.svg | 14 + .../external/ionicons-2.0.1/src/android-list.svg | 10 + .../external/ionicons-2.0.1/src/android-locate.svg | 16 + .../external/ionicons-2.0.1/src/android-lock.svg | 14 + .../external/ionicons-2.0.1/src/android-mail.svg | 13 + .../external/ionicons-2.0.1/src/android-map.svg | 16 + .../external/ionicons-2.0.1/src/android-menu.svg | 11 + .../ionicons-2.0.1/src/android-microphone-off.svg | 17 + .../ionicons-2.0.1/src/android-microphone.svg | 12 + .../ionicons-2.0.1/src/android-more-horizontal.svg | 9 + .../ionicons-2.0.1/src/android-more-vertical.svg | 9 + .../ionicons-2.0.1/src/android-navigate.svg | 11 + .../src/android-notifications-none.svg | 11 + .../src/android-notifications-off.svg | 13 + .../ionicons-2.0.1/src/android-notifications.svg | 9 + .../external/ionicons-2.0.1/src/android-open.svg | 9 + .../ionicons-2.0.1/src/android-options.svg | 26 + .../external/ionicons-2.0.1/src/android-people.svg | 11 + .../ionicons-2.0.1/src/android-person-add.svg | 17 + .../external/ionicons-2.0.1/src/android-person.svg | 10 + .../ionicons-2.0.1/src/android-phone-landscape.svg | 12 + .../ionicons-2.0.1/src/android-phone-portrait.svg | 12 + .../external/ionicons-2.0.1/src/android-pin.svg | 11 + .../external/ionicons-2.0.1/src/android-plane.svg | 12 + .../ionicons-2.0.1/src/android-playstore.svg | 11 + .../external/ionicons-2.0.1/src/android-print.svg | 10 + .../src/android-radio-button-off.svg | 12 + .../ionicons-2.0.1/src/android-radio-button-on.svg | 13 + .../ionicons-2.0.1/src/android-refresh.svg | 11 + .../ionicons-2.0.1/src/android-remove-circle.svg | 10 + .../external/ionicons-2.0.1/src/android-remove.svg | 7 + .../ionicons-2.0.1/src/android-restaurant.svg | 17 + .../external/ionicons-2.0.1/src/android-sad.svg | 16 + .../external/ionicons-2.0.1/src/android-search.svg | 19 + .../external/ionicons-2.0.1/src/android-send.svg | 7 + .../ionicons-2.0.1/src/android-settings.svg | 19 + .../ionicons-2.0.1/src/android-share-alt.svg | 16 + .../external/ionicons-2.0.1/src/android-share.svg | 12 + .../ionicons-2.0.1/src/android-star-half.svg | 9 + .../ionicons-2.0.1/src/android-star-outline.svg | 10 + .../external/ionicons-2.0.1/src/android-star.svg | 10 + .../ionicons-2.0.1/src/android-stopwatch.svg | 21 + .../external/ionicons-2.0.1/src/android-subway.svg | 13 + .../external/ionicons-2.0.1/src/android-sunny.svg | 18 + .../external/ionicons-2.0.1/src/android-sync.svg | 10 + .../ionicons-2.0.1/src/android-textsms.svg | 10 + .../external/ionicons-2.0.1/src/android-time.svg | 15 + .../external/ionicons-2.0.1/src/android-train.svg | 15 + .../external/ionicons-2.0.1/src/android-unlock.svg | 10 + .../external/ionicons-2.0.1/src/android-upload.svg | 9 + .../ionicons-2.0.1/src/android-volume-down.svg | 8 + .../ionicons-2.0.1/src/android-volume-mute.svg | 7 + .../ionicons-2.0.1/src/android-volume-off.svg | 15 + .../ionicons-2.0.1/src/android-volume-up.svg | 9 + .../external/ionicons-2.0.1/src/android-walk.svg | 12 + .../ionicons-2.0.1/src/android-warning.svg | 11 + .../external/ionicons-2.0.1/src/android-watch.svg | 15 + .../external/ionicons-2.0.1/src/android-wifi.svg | 14 + .../external/ionicons-2.0.1/src/aperture.svg | 20 + .../fusion/external/ionicons-2.0.1/src/archive.svg | 12 + .../external/ionicons-2.0.1/src/arrow-down-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-down-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-down-c.svg | 9 + .../external/ionicons-2.0.1/src/arrow-expand.svg | 12 + .../ionicons-2.0.1/src/arrow-graph-down-left.svg | 7 + .../ionicons-2.0.1/src/arrow-graph-down-right.svg | 7 + .../ionicons-2.0.1/src/arrow-graph-up-left.svg | 7 + .../ionicons-2.0.1/src/arrow-graph-up-right.svg | 7 + .../external/ionicons-2.0.1/src/arrow-left-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-left-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-left-c.svg | 9 + .../external/ionicons-2.0.1/src/arrow-move.svg | 8 + .../external/ionicons-2.0.1/src/arrow-resize.svg | 8 + .../ionicons-2.0.1/src/arrow-return-left.svg | 8 + .../ionicons-2.0.1/src/arrow-return-right.svg | 8 + .../external/ionicons-2.0.1/src/arrow-right-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-right-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-right-c.svg | 9 + .../external/ionicons-2.0.1/src/arrow-shrink.svg | 12 + .../external/ionicons-2.0.1/src/arrow-swap.svg | 10 + .../external/ionicons-2.0.1/src/arrow-up-a.svg | 7 + .../external/ionicons-2.0.1/src/arrow-up-b.svg | 8 + .../external/ionicons-2.0.1/src/arrow-up-c.svg | 9 + .../external/ionicons-2.0.1/src/asterisk.svg | 8 + .../app/fusion/external/ionicons-2.0.1/src/at.svg | 25 + .../ionicons-2.0.1/src/backspace-outline.svg | 21 + .../external/ionicons-2.0.1/src/backspace.svg | 17 + .../app/fusion/external/ionicons-2.0.1/src/bag.svg | 10 + .../ionicons-2.0.1/src/battery-charging.svg | 9 + .../external/ionicons-2.0.1/src/battery-empty.svg | 8 + .../external/ionicons-2.0.1/src/battery-full.svg | 8 + .../external/ionicons-2.0.1/src/battery-half.svg | 9 + .../external/ionicons-2.0.1/src/battery-low.svg | 9 + .../fusion/external/ionicons-2.0.1/src/beaker.svg | 20 + .../fusion/external/ionicons-2.0.1/src/beer.svg | 28 + .../external/ionicons-2.0.1/src/bluetooth.svg | 18 + .../fusion/external/ionicons-2.0.1/src/bonfire.svg | 32 + .../external/ionicons-2.0.1/src/bookmark.svg | 10 + .../fusion/external/ionicons-2.0.1/src/bowtie.svg | 22 + .../external/ionicons-2.0.1/src/briefcase.svg | 12 + .../app/fusion/external/ionicons-2.0.1/src/bug.svg | 30 + .../external/ionicons-2.0.1/src/calculator.svg | 10 + .../external/ionicons-2.0.1/src/calendar.svg | 12 + .../fusion/external/ionicons-2.0.1/src/camera.svg | 15 + .../fusion/external/ionicons-2.0.1/src/card.svg | 14 + .../fusion/external/ionicons-2.0.1/src/cash.svg | 31 + .../ionicons-2.0.1/src/chatbox-working.svg | 11 + .../fusion/external/ionicons-2.0.1/src/chatbox.svg | 8 + .../external/ionicons-2.0.1/src/chatboxes.svg | 12 + .../ionicons-2.0.1/src/chatbubble-working.svg | 12 + .../external/ionicons-2.0.1/src/chatbubble.svg | 9 + .../external/ionicons-2.0.1/src/chatbubbles.svg | 16 + .../ionicons-2.0.1/src/checkmark-circled.svg | 13 + .../ionicons-2.0.1/src/checkmark-round.svg | 9 + .../external/ionicons-2.0.1/src/checkmark.svg | 10 + .../external/ionicons-2.0.1/src/chevron-down.svg | 9 + .../external/ionicons-2.0.1/src/chevron-left.svg | 9 + .../external/ionicons-2.0.1/src/chevron-right.svg | 9 + .../external/ionicons-2.0.1/src/chevron-up.svg | 9 + .../external/ionicons-2.0.1/src/clipboard.svg | 22 + .../fusion/external/ionicons-2.0.1/src/clock.svg | 21 + .../external/ionicons-2.0.1/src/close-circled.svg | 13 + .../external/ionicons-2.0.1/src/close-round.svg | 9 + .../fusion/external/ionicons-2.0.1/src/close.svg | 10 + .../ionicons-2.0.1/src/closed-captioning.svg | 31 + .../fusion/external/ionicons-2.0.1/src/cloud.svg | 9 + .../external/ionicons-2.0.1/src/code-download.svg | 31 + .../external/ionicons-2.0.1/src/code-working.svg | 21 + .../fusion/external/ionicons-2.0.1/src/code.svg | 14 + .../fusion/external/ionicons-2.0.1/src/coffee.svg | 13 + .../fusion/external/ionicons-2.0.1/src/compass.svg | 16 + .../fusion/external/ionicons-2.0.1/src/compose.svg | 14 + .../ionicons-2.0.1/src/connection-bars.svg | 12 + .../external/ionicons-2.0.1/src/contrast.svg | 9 + .../fusion/external/ionicons-2.0.1/src/crop.svg | 11 + .../fusion/external/ionicons-2.0.1/src/cube.svg | 19 + .../fusion/external/ionicons-2.0.1/src/disc.svg | 13 + .../external/ionicons-2.0.1/src/document-text.svg | 15 + .../external/ionicons-2.0.1/src/document.svg | 10 + .../fusion/external/ionicons-2.0.1/src/drag.svg | 11 + .../fusion/external/ionicons-2.0.1/src/earth.svg | 44 + .../fusion/external/ionicons-2.0.1/src/easel.svg | 15 + .../fusion/external/ionicons-2.0.1/src/edit.svg | 13 + .../app/fusion/external/ionicons-2.0.1/src/egg.svg | 7 + .../fusion/external/ionicons-2.0.1/src/eject.svg | 12 + .../external/ionicons-2.0.1/src/email-unread.svg | 19 + .../fusion/external/ionicons-2.0.1/src/email.svg | 15 + .../src/erlenmeyer-flask-bubbles.svg | 15 + .../ionicons-2.0.1/src/erlenmeyer-flask.svg | 21 + .../external/ionicons-2.0.1/src/eye-disabled.svg | 18 + .../app/fusion/external/ionicons-2.0.1/src/eye.svg | 15 + .../fusion/external/ionicons-2.0.1/src/female.svg | 8 + .../fusion/external/ionicons-2.0.1/src/filing.svg | 12 + .../external/ionicons-2.0.1/src/film-marker.svg | 10 + .../external/ionicons-2.0.1/src/fireball.svg | 16 + .../fusion/external/ionicons-2.0.1/src/flag.svg | 12 + .../fusion/external/ionicons-2.0.1/src/flame.svg | 11 + .../external/ionicons-2.0.1/src/flash-off.svg | 16 + .../fusion/external/ionicons-2.0.1/src/flash.svg | 7 + .../fusion/external/ionicons-2.0.1/src/folder.svg | 14 + .../external/ionicons-2.0.1/src/fork-repo.svg | 20 + .../fusion/external/ionicons-2.0.1/src/fork.svg | 14 + .../fusion/external/ionicons-2.0.1/src/forward.svg | 9 + .../fusion/external/ionicons-2.0.1/src/funnel.svg | 13 + .../fusion/external/ionicons-2.0.1/src/gear-a.svg | 15 + .../fusion/external/ionicons-2.0.1/src/gear-b.svg | 11 + .../fusion/external/ionicons-2.0.1/src/grid.svg | 32 + .../fusion/external/ionicons-2.0.1/src/hammer.svg | 11 + .../external/ionicons-2.0.1/src/happy-outline.svg | 23 + .../fusion/external/ionicons-2.0.1/src/happy.svg | 20 + .../external/ionicons-2.0.1/src/headphone.svg | 15 + .../external/ionicons-2.0.1/src/heart-broken.svg | 17 + .../fusion/external/ionicons-2.0.1/src/heart.svg | 10 + .../external/ionicons-2.0.1/src/help-buoy.svg | 13 + .../external/ionicons-2.0.1/src/help-circled.svg | 15 + .../fusion/external/ionicons-2.0.1/src/help.svg | 14 + .../fusion/external/ionicons-2.0.1/src/home.svg | 9 + .../external/ionicons-2.0.1/src/icecream.svg | 15 + .../fusion/external/ionicons-2.0.1/src/image.svg | 13 + .../fusion/external/ionicons-2.0.1/src/images.svg | 20 + .../ionicons-2.0.1/src/information-circled.svg | 11 + .../external/ionicons-2.0.1/src/information.svg | 10 + .../fusion/external/ionicons-2.0.1/src/ionic.svg | 18 + .../ionicons-2.0.1/src/ios-alarm-outline.svg | 21 + .../external/ionicons-2.0.1/src/ios-alarm.svg | 14 + .../ionicons-2.0.1/src/ios-albums-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-albums.svg | 11 + .../src/ios-americanfootball-outline.svg | 24 + .../ionicons-2.0.1/src/ios-americanfootball.svg | 21 + .../ionicons-2.0.1/src/ios-analytics-outline.svg | 24 + .../external/ionicons-2.0.1/src/ios-analytics.svg | 17 + .../external/ionicons-2.0.1/src/ios-arrow-back.svg | 7 + .../external/ionicons-2.0.1/src/ios-arrow-down.svg | 7 + .../ionicons-2.0.1/src/ios-arrow-forward.svg | 7 + .../external/ionicons-2.0.1/src/ios-arrow-left.svg | 7 + .../ionicons-2.0.1/src/ios-arrow-right.svg | 7 + .../ionicons-2.0.1/src/ios-arrow-thin-down.svg | 9 + .../ionicons-2.0.1/src/ios-arrow-thin-left.svg | 9 + .../ionicons-2.0.1/src/ios-arrow-thin-right.svg | 9 + .../ionicons-2.0.1/src/ios-arrow-thin-up.svg | 9 + .../external/ionicons-2.0.1/src/ios-arrow-up.svg | 7 + .../external/ionicons-2.0.1/src/ios-at-outline.svg | 26 + .../fusion/external/ionicons-2.0.1/src/ios-at.svg | 24 + .../ionicons-2.0.1/src/ios-barcode-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-barcode.svg | 10 + .../ionicons-2.0.1/src/ios-baseball-outline.svg | 35 + .../external/ionicons-2.0.1/src/ios-baseball.svg | 27 + .../ionicons-2.0.1/src/ios-basketball-outline.svg | 25 + .../external/ionicons-2.0.1/src/ios-basketball.svg | 21 + .../ionicons-2.0.1/src/ios-bell-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-bell.svg | 11 + .../ionicons-2.0.1/src/ios-body-outline.svg | 27 + .../external/ionicons-2.0.1/src/ios-body.svg | 17 + .../ionicons-2.0.1/src/ios-bolt-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-bolt.svg | 7 + .../ionicons-2.0.1/src/ios-book-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-book.svg | 12 + .../ionicons-2.0.1/src/ios-bookmarks-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-bookmarks.svg | 13 + .../ionicons-2.0.1/src/ios-box-outline.svg | 13 + .../fusion/external/ionicons-2.0.1/src/ios-box.svg | 10 + .../ionicons-2.0.1/src/ios-briefcase-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-briefcase.svg | 13 + .../ionicons-2.0.1/src/ios-browsers-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-browsers.svg | 10 + .../ionicons-2.0.1/src/ios-calculator-outline.svg | 19 + .../external/ionicons-2.0.1/src/ios-calculator.svg | 9 + .../ionicons-2.0.1/src/ios-calendar-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-calendar.svg | 12 + .../ionicons-2.0.1/src/ios-camera-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-camera.svg | 13 + .../ionicons-2.0.1/src/ios-cart-outline.svg | 16 + .../external/ionicons-2.0.1/src/ios-cart.svg | 14 + .../ionicons-2.0.1/src/ios-chatboxes-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-chatboxes.svg | 10 + .../ionicons-2.0.1/src/ios-chatbubble-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-chatbubble.svg | 11 + .../ionicons-2.0.1/src/ios-checkmark-empty.svg | 10 + .../ionicons-2.0.1/src/ios-checkmark-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-checkmark.svg | 10 + .../ionicons-2.0.1/src/ios-circle-filled.svg | 18 + .../ionicons-2.0.1/src/ios-circle-outline.svg | 13 + .../ionicons-2.0.1/src/ios-clock-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-clock.svg | 10 + .../ionicons-2.0.1/src/ios-close-empty.svg | 13 + .../ionicons-2.0.1/src/ios-close-outline.svg | 20 + .../external/ionicons-2.0.1/src/ios-close.svg | 16 + .../src/ios-cloud-download-outline.svg | 19 + .../ionicons-2.0.1/src/ios-cloud-download.svg | 12 + .../ionicons-2.0.1/src/ios-cloud-outline.svg | 12 + .../src/ios-cloud-upload-outline.svg | 20 + .../ionicons-2.0.1/src/ios-cloud-upload.svg | 13 + .../external/ionicons-2.0.1/src/ios-cloud.svg | 9 + .../src/ios-cloudy-night-outline.svg | 24 + .../ionicons-2.0.1/src/ios-cloudy-night.svg | 21 + .../ionicons-2.0.1/src/ios-cloudy-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-cloudy.svg | 14 + .../ionicons-2.0.1/src/ios-cog-outline.svg | 29 + .../fusion/external/ionicons-2.0.1/src/ios-cog.svg | 23 + .../src/ios-color-filter-outline.svg | 25 + .../ionicons-2.0.1/src/ios-color-filter.svg | 29 + .../ionicons-2.0.1/src/ios-color-wand-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-color-wand.svg | 16 + .../ionicons-2.0.1/src/ios-compose-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-compose.svg | 13 + .../ionicons-2.0.1/src/ios-contact-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-contact.svg | 13 + .../ionicons-2.0.1/src/ios-copy-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-copy.svg | 12 + .../ionicons-2.0.1/src/ios-crop-strong.svg | 12 + .../external/ionicons-2.0.1/src/ios-crop.svg | 12 + .../ionicons-2.0.1/src/ios-download-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-download.svg | 11 + .../external/ionicons-2.0.1/src/ios-drag.svg | 11 + .../ionicons-2.0.1/src/ios-email-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-email.svg | 11 + .../ionicons-2.0.1/src/ios-eye-outline.svg | 18 + .../fusion/external/ionicons-2.0.1/src/ios-eye.svg | 13 + .../ionicons-2.0.1/src/ios-fastforward-outline.svg | 8 + .../ionicons-2.0.1/src/ios-fastforward.svg | 7 + .../ionicons-2.0.1/src/ios-filing-outline.svg | 9 + .../external/ionicons-2.0.1/src/ios-filing.svg | 11 + .../ionicons-2.0.1/src/ios-film-outline.svg | 9 + .../external/ionicons-2.0.1/src/ios-film.svg | 11 + .../ionicons-2.0.1/src/ios-flag-outline.svg | 13 + .../external/ionicons-2.0.1/src/ios-flag.svg | 11 + .../ionicons-2.0.1/src/ios-flame-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-flame.svg | 11 + .../ionicons-2.0.1/src/ios-flask-outline.svg | 19 + .../external/ionicons-2.0.1/src/ios-flask.svg | 17 + .../ionicons-2.0.1/src/ios-flower-outline.svg | 75 + .../external/ionicons-2.0.1/src/ios-flower.svg | 38 + .../ionicons-2.0.1/src/ios-folder-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-folder.svg | 13 + .../ionicons-2.0.1/src/ios-football-outline.svg | 20 + .../external/ionicons-2.0.1/src/ios-football.svg | 14 + .../src/ios-game-controller-a-outline.svg | 26 + .../ionicons-2.0.1/src/ios-game-controller-a.svg | 19 + .../src/ios-game-controller-b-outline.svg | 35 + .../ionicons-2.0.1/src/ios-game-controller-b.svg | 23 + .../ionicons-2.0.1/src/ios-gear-outline.svg | 40 + .../external/ionicons-2.0.1/src/ios-gear.svg | 17 + .../ionicons-2.0.1/src/ios-glasses-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-glasses.svg | 11 + .../ionicons-2.0.1/src/ios-grid-view-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-grid-view.svg | 11 + .../ionicons-2.0.1/src/ios-heart-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-heart.svg | 9 + .../external/ionicons-2.0.1/src/ios-help-empty.svg | 12 + .../ionicons-2.0.1/src/ios-help-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-help.svg | 12 + .../ionicons-2.0.1/src/ios-home-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-home.svg | 10 + .../ionicons-2.0.1/src/ios-infinite-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-infinite.svg | 16 + .../ionicons-2.0.1/src/ios-information-empty.svg | 12 + .../ionicons-2.0.1/src/ios-information-outline.svg | 17 + .../ionicons-2.0.1/src/ios-information.svg | 11 + .../ionicons-2.0.1/src/ios-ionic-outline.svg | 18 + .../ionicons-2.0.1/src/ios-keypad-outline.svg | 28 + .../external/ionicons-2.0.1/src/ios-keypad.svg | 20 + .../ionicons-2.0.1/src/ios-lightbulb-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-lightbulb.svg | 16 + .../ionicons-2.0.1/src/ios-list-outline.svg | 23 + .../external/ionicons-2.0.1/src/ios-list.svg | 11 + .../ionicons-2.0.1/src/ios-location-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-location.svg | 8 + .../ionicons-2.0.1/src/ios-locked-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-locked.svg | 12 + .../ionicons-2.0.1/src/ios-loop-strong.svg | 18 + .../external/ionicons-2.0.1/src/ios-loop.svg | 22 + .../ionicons-2.0.1/src/ios-medical-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-medical.svg | 8 + .../ionicons-2.0.1/src/ios-medkit-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-medkit.svg | 13 + .../external/ionicons-2.0.1/src/ios-mic-off.svg | 14 + .../ionicons-2.0.1/src/ios-mic-outline.svg | 12 + .../fusion/external/ionicons-2.0.1/src/ios-mic.svg | 12 + .../ionicons-2.0.1/src/ios-minus-empty.svg | 9 + .../ionicons-2.0.1/src/ios-minus-outline.svg | 16 + .../external/ionicons-2.0.1/src/ios-minus.svg | 10 + .../ionicons-2.0.1/src/ios-monitor-outline.svg | 7 + .../external/ionicons-2.0.1/src/ios-monitor.svg | 10 + .../ionicons-2.0.1/src/ios-moon-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-moon.svg | 13 + .../ionicons-2.0.1/src/ios-more-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-more.svg | 11 + .../ionicons-2.0.1/src/ios-musical-note.svg | 9 + .../ionicons-2.0.1/src/ios-musical-notes.svg | 9 + .../ionicons-2.0.1/src/ios-navigate-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-navigate.svg | 10 + .../ionicons-2.0.1/src/ios-nutrition-outline.svg | 29 + .../external/ionicons-2.0.1/src/ios-nutrition.svg | 17 + .../ionicons-2.0.1/src/ios-paper-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-paper.svg | 8 + .../ionicons-2.0.1/src/ios-paperplane-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-paperplane.svg | 10 + .../ionicons-2.0.1/src/ios-partlysunny-outline.svg | 33 + .../ionicons-2.0.1/src/ios-partlysunny.svg | 28 + .../ionicons-2.0.1/src/ios-pause-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-pause.svg | 10 + .../ionicons-2.0.1/src/ios-paw-outline.svg | 43 + .../fusion/external/ionicons-2.0.1/src/ios-paw.svg | 26 + .../ionicons-2.0.1/src/ios-people-outline.svg | 44 + .../external/ionicons-2.0.1/src/ios-people.svg | 29 + .../ionicons-2.0.1/src/ios-person-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-person.svg | 13 + .../ionicons-2.0.1/src/ios-personadd-outline.svg | 25 + .../external/ionicons-2.0.1/src/ios-personadd.svg | 16 + .../ionicons-2.0.1/src/ios-photos-outline.svg | 10 + .../external/ionicons-2.0.1/src/ios-photos.svg | 10 + .../ionicons-2.0.1/src/ios-pie-outline.svg | 16 + .../fusion/external/ionicons-2.0.1/src/ios-pie.svg | 11 + .../ionicons-2.0.1/src/ios-pint-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-pint.svg | 12 + .../ionicons-2.0.1/src/ios-play-outline.svg | 9 + .../external/ionicons-2.0.1/src/ios-play.svg | 9 + .../external/ionicons-2.0.1/src/ios-plus-empty.svg | 9 + .../ionicons-2.0.1/src/ios-plus-outline.svg | 18 + .../external/ionicons-2.0.1/src/ios-plus.svg | 10 + .../ionicons-2.0.1/src/ios-pricetag-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-pricetag.svg | 11 + .../ionicons-2.0.1/src/ios-pricetags-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-pricetags.svg | 16 + .../ionicons-2.0.1/src/ios-printer-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-printer.svg | 17 + .../ionicons-2.0.1/src/ios-pulse-strong.svg | 12 + .../external/ionicons-2.0.1/src/ios-pulse.svg | 12 + .../ionicons-2.0.1/src/ios-rainy-outline.svg | 20 + .../external/ionicons-2.0.1/src/ios-rainy.svg | 17 + .../ionicons-2.0.1/src/ios-recording-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-recording.svg | 14 + .../ionicons-2.0.1/src/ios-redo-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-redo.svg | 10 + .../ionicons-2.0.1/src/ios-refresh-empty.svg | 10 + .../ionicons-2.0.1/src/ios-refresh-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-refresh.svg | 11 + .../external/ionicons-2.0.1/src/ios-reload.svg | 11 + .../src/ios-reverse-camera-outline.svg | 20 + .../ionicons-2.0.1/src/ios-reverse-camera.svg | 15 + .../ionicons-2.0.1/src/ios-rewind-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-rewind.svg | 7 + .../ionicons-2.0.1/src/ios-rose-outline.svg | 29 + .../external/ionicons-2.0.1/src/ios-rose.svg | 18 + .../ionicons-2.0.1/src/ios-search-strong.svg | 10 + .../external/ionicons-2.0.1/src/ios-search.svg | 10 + .../ionicons-2.0.1/src/ios-settings-strong.svg | 14 + .../external/ionicons-2.0.1/src/ios-settings.svg | 24 + .../ionicons-2.0.1/src/ios-shuffle-strong.svg | 18 + .../external/ionicons-2.0.1/src/ios-shuffle.svg | 20 + .../src/ios-skipbackward-outline.svg | 8 + .../ionicons-2.0.1/src/ios-skipbackward.svg | 7 + .../ionicons-2.0.1/src/ios-skipforward-outline.svg | 8 + .../ionicons-2.0.1/src/ios-skipforward.svg | 7 + .../external/ionicons-2.0.1/src/ios-snowy.svg | 26 + .../ionicons-2.0.1/src/ios-speedometer-outline.svg | 24 + .../ionicons-2.0.1/src/ios-speedometer.svg | 28 + .../external/ionicons-2.0.1/src/ios-star-half.svg | 8 + .../ionicons-2.0.1/src/ios-star-outline.svg | 8 + .../external/ionicons-2.0.1/src/ios-star.svg | 7 + .../ionicons-2.0.1/src/ios-stopwatch-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-stopwatch.svg | 13 + .../ionicons-2.0.1/src/ios-sunny-outline.svg | 27 + .../external/ionicons-2.0.1/src/ios-sunny.svg | 26 + .../ionicons-2.0.1/src/ios-telephone-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-telephone.svg | 12 + .../ionicons-2.0.1/src/ios-tennisball-outline.svg | 19 + .../external/ionicons-2.0.1/src/ios-tennisball.svg | 25 + .../src/ios-thunderstorm-outline.svg | 22 + .../ionicons-2.0.1/src/ios-thunderstorm.svg | 17 + .../ionicons-2.0.1/src/ios-time-outline.svg | 36 + .../external/ionicons-2.0.1/src/ios-time.svg | 27 + .../ionicons-2.0.1/src/ios-timer-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-timer.svg | 12 + .../ionicons-2.0.1/src/ios-toggle-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-toggle.svg | 16 + .../ionicons-2.0.1/src/ios-trash-outline.svg | 17 + .../external/ionicons-2.0.1/src/ios-trash.svg | 12 + .../ionicons-2.0.1/src/ios-undo-outline.svg | 11 + .../external/ionicons-2.0.1/src/ios-undo.svg | 10 + .../ionicons-2.0.1/src/ios-unlocked-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-unlocked.svg | 12 + .../ionicons-2.0.1/src/ios-upload-outline.svg | 14 + .../external/ionicons-2.0.1/src/ios-upload.svg | 10 + .../ionicons-2.0.1/src/ios-videocam-outline.svg | 12 + .../external/ionicons-2.0.1/src/ios-videocam.svg | 11 + .../ionicons-2.0.1/src/ios-volume-high.svg | 19 + .../external/ionicons-2.0.1/src/ios-volume-low.svg | 7 + .../ionicons-2.0.1/src/ios-wineglass-outline.svg | 15 + .../external/ionicons-2.0.1/src/ios-wineglass.svg | 11 + .../ionicons-2.0.1/src/ios-world-outline.svg | 22 + .../external/ionicons-2.0.1/src/ios-world.svg | 29 + .../fusion/external/ionicons-2.0.1/src/ipad.svg | 10 + .../fusion/external/ionicons-2.0.1/src/iphone.svg | 13 + .../fusion/external/ionicons-2.0.1/src/ipod.svg | 13 + .../app/fusion/external/ionicons-2.0.1/src/jet.svg | 14 + .../app/fusion/external/ionicons-2.0.1/src/key.svg | 14 + .../fusion/external/ionicons-2.0.1/src/knife.svg | 9 + .../fusion/external/ionicons-2.0.1/src/laptop.svg | 10 + .../fusion/external/ionicons-2.0.1/src/leaf.svg | 12 + .../fusion/external/ionicons-2.0.1/src/levels.svg | 16 + .../external/ionicons-2.0.1/src/lightbulb.svg | 21 + .../fusion/external/ionicons-2.0.1/src/link.svg | 15 + .../fusion/external/ionicons-2.0.1/src/load-a.svg | 17 + .../fusion/external/ionicons-2.0.1/src/load-b.svg | 20 + .../fusion/external/ionicons-2.0.1/src/load-c.svg | 21 + .../fusion/external/ionicons-2.0.1/src/load-d.svg | 28 + .../external/ionicons-2.0.1/src/location.svg | 11 + .../ionicons-2.0.1/src/lock-combination.svg | 28 + .../fusion/external/ionicons-2.0.1/src/locked.svg | 11 + .../fusion/external/ionicons-2.0.1/src/log-in.svg | 14 + .../fusion/external/ionicons-2.0.1/src/log-out.svg | 17 + .../fusion/external/ionicons-2.0.1/src/loop.svg | 14 + .../fusion/external/ionicons-2.0.1/src/magnet.svg | 14 + .../fusion/external/ionicons-2.0.1/src/male.svg | 10 + .../app/fusion/external/ionicons-2.0.1/src/man.svg | 12 + .../app/fusion/external/ionicons-2.0.1/src/map.svg | 30 + .../fusion/external/ionicons-2.0.1/src/medkit.svg | 12 + .../fusion/external/ionicons-2.0.1/src/merge.svg | 13 + .../fusion/external/ionicons-2.0.1/src/mic-a.svg | 15 + .../fusion/external/ionicons-2.0.1/src/mic-b.svg | 17 + .../fusion/external/ionicons-2.0.1/src/mic-c.svg | 8 + .../external/ionicons-2.0.1/src/minus-circled.svg | 9 + .../external/ionicons-2.0.1/src/minus-round.svg | 8 + .../fusion/external/ionicons-2.0.1/src/minus.svg | 7 + .../fusion/external/ionicons-2.0.1/src/model-s.svg | 33 + .../fusion/external/ionicons-2.0.1/src/monitor.svg | 12 + .../fusion/external/ionicons-2.0.1/src/more.svg | 12 + .../fusion/external/ionicons-2.0.1/src/mouse.svg | 24 + .../external/ionicons-2.0.1/src/music-note.svg | 10 + .../external/ionicons-2.0.1/src/navicon-round.svg | 14 + .../fusion/external/ionicons-2.0.1/src/navicon.svg | 11 + .../external/ionicons-2.0.1/src/navigate.svg | 7 + .../fusion/external/ionicons-2.0.1/src/network.svg | 12 + .../external/ionicons-2.0.1/src/no-smoking.svg | 33 + .../fusion/external/ionicons-2.0.1/src/nuclear.svg | 18 + .../fusion/external/ionicons-2.0.1/src/outlet.svg | 16 + .../external/ionicons-2.0.1/src/paintbrush.svg | 18 + .../external/ionicons-2.0.1/src/paintbucket.svg | 12 + .../external/ionicons-2.0.1/src/paper-airplane.svg | 13 + .../external/ionicons-2.0.1/src/paperclip.svg | 13 + .../fusion/external/ionicons-2.0.1/src/pause.svg | 12 + .../external/ionicons-2.0.1/src/person-add.svg | 13 + .../external/ionicons-2.0.1/src/person-stalker.svg | 18 + .../fusion/external/ionicons-2.0.1/src/person.svg | 10 + .../external/ionicons-2.0.1/src/pie-graph.svg | 11 + .../app/fusion/external/ionicons-2.0.1/src/pin.svg | 11 + .../external/ionicons-2.0.1/src/pinpoint.svg | 11 + .../fusion/external/ionicons-2.0.1/src/pizza.svg | 20 + .../fusion/external/ionicons-2.0.1/src/plane.svg | 10 + .../fusion/external/ionicons-2.0.1/src/planet.svg | 21 + .../fusion/external/ionicons-2.0.1/src/play.svg | 8 + .../external/ionicons-2.0.1/src/playstation.svg | 27 + .../external/ionicons-2.0.1/src/plus-circled.svg | 10 + .../external/ionicons-2.0.1/src/plus-round.svg | 9 + .../fusion/external/ionicons-2.0.1/src/plus.svg | 7 + .../fusion/external/ionicons-2.0.1/src/podium.svg | 11 + .../fusion/external/ionicons-2.0.1/src/pound.svg | 11 + .../fusion/external/ionicons-2.0.1/src/power.svg | 15 + .../external/ionicons-2.0.1/src/pricetag.svg | 13 + .../external/ionicons-2.0.1/src/pricetags.svg | 18 + .../fusion/external/ionicons-2.0.1/src/printer.svg | 14 + .../external/ionicons-2.0.1/src/pull-request.svg | 16 + .../external/ionicons-2.0.1/src/qr-scanner.svg | 12 + .../fusion/external/ionicons-2.0.1/src/quote.svg | 16 + .../external/ionicons-2.0.1/src/radio-waves.svg | 25 + .../fusion/external/ionicons-2.0.1/src/record.svg | 7 + .../fusion/external/ionicons-2.0.1/src/refresh.svg | 15 + .../external/ionicons-2.0.1/src/reply-all.svg | 12 + .../fusion/external/ionicons-2.0.1/src/reply.svg | 9 + .../external/ionicons-2.0.1/src/ribbon-a.svg | 14 + .../external/ionicons-2.0.1/src/ribbon-b.svg | 18 + .../external/ionicons-2.0.1/src/sad-outline.svg | 28 + .../app/fusion/external/ionicons-2.0.1/src/sad.svg | 20 + .../external/ionicons-2.0.1/src/scissors.svg | 23 + .../fusion/external/ionicons-2.0.1/src/search.svg | 10 + .../external/ionicons-2.0.1/src/settings.svg | 18 + .../fusion/external/ionicons-2.0.1/src/share.svg | 11 + .../fusion/external/ionicons-2.0.1/src/shuffle.svg | 11 + .../external/ionicons-2.0.1/src/skip-backward.svg | 15 + .../external/ionicons-2.0.1/src/skip-forward.svg | 15 + .../ionicons-2.0.1/src/social-android-outline.svg | 29 + .../external/ionicons-2.0.1/src/social-android.svg | 22 + .../ionicons-2.0.1/src/social-angular-outline.svg | 11 + .../external/ionicons-2.0.1/src/social-angular.svg | 11 + .../ionicons-2.0.1/src/social-apple-outline.svg | 20 + .../external/ionicons-2.0.1/src/social-apple.svg | 14 + .../ionicons-2.0.1/src/social-bitcoin-outline.svg | 27 + .../external/ionicons-2.0.1/src/social-bitcoin.svg | 14 + .../ionicons-2.0.1/src/social-buffer-outline.svg | 24 + .../external/ionicons-2.0.1/src/social-buffer.svg | 18 + .../ionicons-2.0.1/src/social-chrome-outline.svg | 17 + .../external/ionicons-2.0.1/src/social-chrome.svg | 22 + .../ionicons-2.0.1/src/social-codepen-outline.svg | 26 + .../external/ionicons-2.0.1/src/social-codepen.svg | 26 + .../ionicons-2.0.1/src/social-css3-outline.svg | 12 + .../external/ionicons-2.0.1/src/social-css3.svg | 14 + .../src/social-designernews-outline.svg | 18 + .../ionicons-2.0.1/src/social-designernews.svg | 18 + .../ionicons-2.0.1/src/social-dribbble-outline.svg | 15 + .../ionicons-2.0.1/src/social-dribbble.svg | 26 + .../ionicons-2.0.1/src/social-dropbox-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-dropbox.svg | 13 + .../ionicons-2.0.1/src/social-euro-outline.svg | 19 + .../external/ionicons-2.0.1/src/social-euro.svg | 12 + .../ionicons-2.0.1/src/social-facebook-outline.svg | 9 + .../ionicons-2.0.1/src/social-facebook.svg | 8 + .../src/social-foursquare-outline.svg | 22 + .../ionicons-2.0.1/src/social-foursquare.svg | 20 + .../ionicons-2.0.1/src/social-freebsd-devil.svg | 22 + .../ionicons-2.0.1/src/social-github-outline.svg | 24 + .../external/ionicons-2.0.1/src/social-github.svg | 14 + .../ionicons-2.0.1/src/social-google-outline.svg | 19 + .../external/ionicons-2.0.1/src/social-google.svg | 20 + .../src/social-googleplus-outline.svg | 18 + .../ionicons-2.0.1/src/social-googleplus.svg | 17 + .../src/social-hackernews-outline.svg | 12 + .../ionicons-2.0.1/src/social-hackernews.svg | 9 + .../ionicons-2.0.1/src/social-html5-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-html5.svg | 9 + .../src/social-instagram-outline.svg | 12 + .../ionicons-2.0.1/src/social-instagram.svg | 18 + .../src/social-javascript-outline.svg | 27 + .../ionicons-2.0.1/src/social-javascript.svg | 17 + .../ionicons-2.0.1/src/social-linkedin-outline.svg | 22 + .../ionicons-2.0.1/src/social-linkedin.svg | 13 + .../ionicons-2.0.1/src/social-markdown.svg | 14 + .../external/ionicons-2.0.1/src/social-nodejs.svg | 26 + .../external/ionicons-2.0.1/src/social-octocat.svg | 28 + .../src/social-pinterest-outline.svg | 14 + .../ionicons-2.0.1/src/social-pinterest.svg | 15 + .../external/ionicons-2.0.1/src/social-python.svg | 21 + .../ionicons-2.0.1/src/social-reddit-outline.svg | 26 + .../external/ionicons-2.0.1/src/social-reddit.svg | 18 + .../ionicons-2.0.1/src/social-rss-outline.svg | 16 + .../external/ionicons-2.0.1/src/social-rss.svg | 12 + .../external/ionicons-2.0.1/src/social-sass.svg | 35 + .../ionicons-2.0.1/src/social-skype-outline.svg | 26 + .../external/ionicons-2.0.1/src/social-skype.svg | 20 + .../ionicons-2.0.1/src/social-snapchat-outline.svg | 42 + .../ionicons-2.0.1/src/social-snapchat.svg | 31 + .../ionicons-2.0.1/src/social-tumblr-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-tumblr.svg | 10 + .../external/ionicons-2.0.1/src/social-tux.svg | 53 + .../ionicons-2.0.1/src/social-twitch-outline.svg | 13 + .../external/ionicons-2.0.1/src/social-twitch.svg | 9 + .../ionicons-2.0.1/src/social-twitter-outline.svg | 19 + .../external/ionicons-2.0.1/src/social-twitter.svg | 12 + .../ionicons-2.0.1/src/social-usd-outline.svg | 44 + .../external/ionicons-2.0.1/src/social-usd.svg | 24 + .../ionicons-2.0.1/src/social-vimeo-outline.svg | 23 + .../external/ionicons-2.0.1/src/social-vimeo.svg | 18 + .../ionicons-2.0.1/src/social-whatsapp-outline.svg | 25 + .../ionicons-2.0.1/src/social-whatsapp.svg | 18 + .../ionicons-2.0.1/src/social-windows-outline.svg | 17 + .../external/ionicons-2.0.1/src/social-windows.svg | 17 + .../src/social-wordpress-outline.svg | 16 + .../ionicons-2.0.1/src/social-wordpress.svg | 20 + .../ionicons-2.0.1/src/social-yahoo-outline.svg | 10 + .../external/ionicons-2.0.1/src/social-yahoo.svg | 8 + .../ionicons-2.0.1/src/social-yen-outline.svg | 9 + .../external/ionicons-2.0.1/src/social-yen.svg | 8 + .../ionicons-2.0.1/src/social-youtube-outline.svg | 22 + .../external/ionicons-2.0.1/src/social-youtube.svg | 12 + .../ionicons-2.0.1/src/soup-can-outline.svg | 28 + .../external/ionicons-2.0.1/src/soup-can.svg | 16 + .../external/ionicons-2.0.1/src/speakerphone.svg | 19 + .../external/ionicons-2.0.1/src/speedometer.svg | 15 + .../fusion/external/ionicons-2.0.1/src/spoon.svg | 10 + .../fusion/external/ionicons-2.0.1/src/star.svg | 7 + .../external/ionicons-2.0.1/src/stats-bars.svg | 12 + .../fusion/external/ionicons-2.0.1/src/steam.svg | 20 + .../fusion/external/ionicons-2.0.1/src/stop.svg | 8 + .../external/ionicons-2.0.1/src/thermometer.svg | 11 + .../external/ionicons-2.0.1/src/thumbsdown.svg | 13 + .../external/ionicons-2.0.1/src/thumbsup.svg | 13 + .../external/ionicons-2.0.1/src/toggle-filled.svg | 11 + .../fusion/external/ionicons-2.0.1/src/toggle.svg | 12 + .../external/ionicons-2.0.1/src/transgender.svg | 12 + .../fusion/external/ionicons-2.0.1/src/trash-a.svg | 10 + .../fusion/external/ionicons-2.0.1/src/trash-b.svg | 13 + .../fusion/external/ionicons-2.0.1/src/trophy.svg | 16 + .../external/ionicons-2.0.1/src/tshirt-outline.svg | 11 + .../fusion/external/ionicons-2.0.1/src/tshirt.svg | 8 + .../external/ionicons-2.0.1/src/umbrella.svg | 18 + .../external/ionicons-2.0.1/src/university.svg | 11 + .../external/ionicons-2.0.1/src/unlocked.svg | 10 + .../fusion/external/ionicons-2.0.1/src/upload.svg | 9 + .../app/fusion/external/ionicons-2.0.1/src/usb.svg | 22 + .../external/ionicons-2.0.1/src/videocamera.svg | 11 + .../external/ionicons-2.0.1/src/volume-high.svg | 15 + .../external/ionicons-2.0.1/src/volume-low.svg | 11 + .../external/ionicons-2.0.1/src/volume-medium.svg | 13 + .../external/ionicons-2.0.1/src/volume-mute.svg | 14 + .../fusion/external/ionicons-2.0.1/src/wand.svg | 17 + .../external/ionicons-2.0.1/src/waterdrop.svg | 11 + .../fusion/external/ionicons-2.0.1/src/wifi.svg | 16 + .../external/ionicons-2.0.1/src/wineglass.svg | 21 + .../fusion/external/ionicons-2.0.1/src/woman.svg | 13 + .../fusion/external/ionicons-2.0.1/src/wrench.svg | 11 + .../fusion/external/ionicons-2.0.1/src/xbox.svg | 21 + .../fusion/external/samples/css/images/blank.gif | Bin 0 -> 49 bytes .../app/fusion/external/samples/css/scribble.css | 40 + .../app/fusion/external/samples/css/slider.css | 142 + .../fusion/external/samples/css/spacegallery.css | 18 + .../fusion/external/samples/html/area_chart.html | 49 + .../fusion/external/samples/html/bar_chart.html | 95 + .../external/samples/html/d3_gauges_demo.html | 39 + .../external/samples/html/data/speedometer2.csv | 16 + .../external/samples/html/data/speedometer3.csv | 2 + .../fusion/external/samples/html/data/worddata.csv | 22 + .../app/fusion/external/samples/html/donut_d3.html | 43 + .../external/samples/html/js/area_chart.min.js | 1 + .../fusion/external/samples/html/js/donut.min.js | 1 + .../fusion/external/samples/html/js/gauges.min.js | 1 + .../external/samples/html/js/line_chart.min.js | 1 + .../external/samples/html/js/pie_chart.min.js | 1 + .../external/samples/html/js/worddata.min.js | 1 + .../fusion/external/samples/html/line_chart.html | 49 + .../fusion/external/samples/html/pie_chart.html | 38 + .../fusion/external/samples/html/wordcloud.html | 37 + .../external/samples/images/Calendar-16x16.png | Bin 0 -> 552 bytes .../fusion/external/samples/images/arrow-next.png | Bin 0 -> 1561 bytes .../fusion/external/samples/images/arrow-prev.png | Bin 0 -> 1557 bytes .../images/carousel/slide_b_drive_test_map.png | Bin 0 -> 202465 bytes .../images/carousel/slide_b_eppt_county.png | Bin 0 -> 21222 bytes .../images/carousel/slide_b_eppt_regression.png | Bin 0 -> 11536 bytes .../images/carousel/slide_b_ios_throughput.png | Bin 0 -> 26131 bytes .../samples/images/carousel/slide_b_lata_map.png | Bin 0 -> 192031 bytes .../images/carousel/slide_b_lata_map_legend.png | Bin 0 -> 3021 bytes .../images/carousel/slide_b_nova_sdn_map.png | Bin 0 -> 179361 bytes .../fusion/external/samples/images/copyicon.png | Bin 0 -> 235 bytes .../fusion/external/samples/images/deleteicon.gif | Bin 0 -> 579 bytes .../external/samples/images/example-frame.png | Bin 0 -> 33699 bytes .../app/fusion/external/samples/images/loading.gif | Bin 0 -> 6820 bytes .../external/samples/images/tunnels/1_mon.png | Bin 0 -> 22762 bytes .../external/samples/images/tunnels/2_tue.png | Bin 0 -> 22772 bytes .../external/samples/images/tunnels/3_wed.png | Bin 0 -> 24012 bytes .../external/samples/images/tunnels/4_thu.png | Bin 0 -> 23902 bytes .../external/samples/images/tunnels/5_fri.png | Bin 0 -> 22349 bytes .../external/samples/images/tunnels/6_sat.png | Bin 0 -> 23674 bytes .../external/samples/images/tunnels/7_sun.png | Bin 0 -> 22845 bytes .../samples/images/tunnels/BH_DLSTX_IN.png | Bin 0 -> 10575 bytes .../samples/images/tunnels/BH_DLSTX_OUT.png | Bin 0 -> 10460 bytes .../external/samples/images/tunnels/BH_Nat.png | Bin 0 -> 10420 bytes .../external/samples/images/tunnels/BH_Nat_Def.png | Bin 0 -> 8941 bytes .../samples/images/tunnels/BH_Nat_Priority.png | Bin 0 -> 10590 bytes .../app/fusion/external/samples/js/FusionCharts.js | 361 + .../app/fusion/external/samples/js/charts.js | 132 + .../webapp/app/fusion/external/samples/js/eye.js | 34 + .../app/fusion/external/samples/js/scribble.js | 19 + .../external/samples/js/slides.min.jquery.js | 20 + .../app/fusion/external/samples/js/spacegallery.js | 235 + .../webapp/app/fusion/external/samples/js/utils.js | 252 + .../samples/org_chart/css/bootstrap.min.css | 351 + .../external/samples/org_chart/css/custom.css | 97 + .../samples/org_chart/css/jquery.jOrgChart.css | 51 + .../external/samples/org_chart/css/prettify.css | 1 + .../fusion/external/samples/org_chart/example.html | 85 + .../external/samples/org_chart/example_vsp.html | 88 + .../external/samples/org_chart/images/bkgd.png | Bin 0 -> 133 bytes .../samples/org_chart/images/raspberry.jpg | Bin 0 -> 5755 bytes .../external/samples/org_chart/jquery.jOrgChart.js | 267 + .../fusion/external/samples/org_chart/prettify.js | 28 + .../app/fusion/external/utils/js/browserCheck.js | 24 + .../src/main/webapp/app/fusion/fonts/dummy.txt | 0 .../webapp/app/fusion/images/ATT_Labs_Logo.png | Bin 0 -> 45492 bytes .../webapp/app/fusion/images/Logo_att_labs.png | Bin 0 -> 2011 bytes .../src/main/webapp/app/fusion/images/Rlogo.jpg | Bin 0 -> 3173 bytes .../src/main/webapp/app/fusion/images/Thumbs.db | Bin 0 -> 102912 bytes .../main/webapp/app/fusion/images/action_icon.png | Bin 0 -> 2388 bytes .../app/fusion/images/action_list_spacer.gif | Bin 0 -> 73 bytes .../src/main/webapp/app/fusion/images/active.png | Bin 0 -> 682 bytes .../src/main/webapp/app/fusion/images/add.png | Bin 0 -> 352 bytes .../webapp/app/fusion/images/add_tool_button.png | Bin 0 -> 31105 bytes .../src/main/webapp/app/fusion/images/addicon.png | Bin 0 -> 463 bytes .../app/fusion/images/application_window_bg.jpg | Bin 0 -> 914 bytes .../main/webapp/app/fusion/images/arrow-next.png | Bin 0 -> 1561 bytes .../main/webapp/app/fusion/images/arrow-prev.png | Bin 0 -> 1557 bytes .../fusion/images/att_angular_gridster/grips.png | Bin 0 -> 951 bytes .../src/main/webapp/app/fusion/images/att_logo.png | Bin 0 -> 2827 bytes .../main/webapp/app/fusion/images/backButton.png | Bin 0 -> 816 bytes .../src/main/webapp/app/fusion/images/blank.gif | Bin 0 -> 49 bytes .../main/webapp/app/fusion/images/blueButton.png | Bin 0 -> 1468 bytes .../main/webapp/app/fusion/images/body_graphic.jpg | Bin 0 -> 20667 bytes .../src/main/webapp/app/fusion/images/bubble.png | Bin 0 -> 662 bytes .../src/main/webapp/app/fusion/images/cache.png | Bin 0 -> 1081 bytes .../src/main/webapp/app/fusion/images/calendar.gif | Bin 0 -> 929 bytes .../src/main/webapp/app/fusion/images/chevron.png | Bin 0 -> 252 bytes .../webapp/app/fusion/images/close_container.gif | Bin 0 -> 85 bytes .../webapp/app/fusion/images/collapsed-icon.png | Bin 0 -> 1379 bytes .../main/webapp/app/fusion/images/column-bg.png | Bin 0 -> 165 bytes .../app/fusion/images/copyicon-highlighted.png | Bin 0 -> 264 bytes .../src/main/webapp/app/fusion/images/copyicon.png | Bin 0 -> 235 bytes .../src/main/webapp/app/fusion/images/csv_icon.jpg | Bin 0 -> 632 bytes .../src/main/webapp/app/fusion/images/csv_icon.png | Bin 0 -> 938 bytes .../webapp/app/fusion/images/customers-add.png | Bin 0 -> 755 bytes .../webapp/app/fusion/images/customers-search.png | Bin 0 -> 976 bytes .../main/webapp/app/fusion/images/customers.png | Bin 0 -> 749 bytes .../main/webapp/app/fusion/images/decrypted.png | Bin 0 -> 628 bytes .../app/fusion/images/deleteicon-highlighted.gif | Bin 0 -> 592 bytes .../app/fusion/images/deleteicon-highlighted.png | Bin 0 -> 566 bytes .../main/webapp/app/fusion/images/deleteicon.gif | Bin 0 -> 579 bytes .../src/main/webapp/app/fusion/images/editicon.gif | Bin 0 -> 360 bytes .../main/webapp/app/fusion/images/error_type.gif | Bin 0 -> 398 bytes .../webapp/app/fusion/images/example-frame.png | Bin 0 -> 33699 bytes .../webapp/app/fusion/images/excelicon_multi.gif | Bin 0 -> 1028 bytes .../main/webapp/app/fusion/images/executeicon.png | Bin 0 -> 1076 bytes .../webapp/app/fusion/images/expanded-icon.png | Bin 0 -> 1372 bytes .../src/main/webapp/app/fusion/images/file-add.png | Bin 0 -> 675 bytes .../main/webapp/app/fusion/images/file_import.png | Bin 0 -> 653 bytes .../webapp/app/fusion/images/file_save-all.png | Bin 0 -> 610 bytes .../main/webapp/app/fusion/images/filter_icon.png | Bin 0 -> 29069 bytes .../main/webapp/app/fusion/images/folder_add.png | Bin 0 -> 772 bytes .../webapp/app/fusion/images/folder_closed.png | Bin 0 -> 559 bytes .../webapp/app/fusion/images/folder_delete.png | Bin 0 -> 767 bytes .../main/webapp/app/fusion/images/folder_edit.png | Bin 0 -> 829 bytes .../main/webapp/app/fusion/images/folder_open.png | Bin 0 -> 632 bytes .../main/webapp/app/fusion/images/folder_user.png | Bin 0 -> 887 bytes .../src/main/webapp/app/fusion/images/funnel.png | Bin 0 -> 543 bytes .../src/main/webapp/app/fusion/images/fusion.gif | Bin 0 -> 8821 bytes .../main/webapp/app/fusion/images/grayButton.png | Bin 0 -> 1361 bytes .../app/fusion/images/gray_add_tool_button.png | Bin 0 -> 30883 bytes .../webapp/app/fusion/images/headerChatIcon.png | Bin 0 -> 465 bytes .../webapp/app/fusion/images/icon_remove_all.gif | Bin 0 -> 982 bytes .../src/main/webapp/app/fusion/images/inactive.png | Bin 0 -> 842 bytes .../main/webapp/app/fusion/images/info_type.gif | Bin 0 -> 291 bytes .../app/fusion/images/layout/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../app/fusion/images/layout/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../main/webapp/app/fusion/images/leftButton.png | Bin 0 -> 681 bytes .../src/main/webapp/app/fusion/images/loading.gif | Bin 0 -> 6820 bytes .../main/webapp/app/fusion/images/loading_bar.gif | Bin 0 -> 28954 bytes .../main/webapp/app/fusion/images/login_button.gif | Bin 0 -> 1222 bytes .../src/main/webapp/app/fusion/images/logo_att.jpg | Bin 0 -> 3145 bytes .../webapp/app/fusion/images/logo_att_header.jpg | Bin 0 -> 3145 bytes .../webapp/app/fusion/images/logo_att_header.png | Bin 0 -> 43961 bytes .../main/webapp/app/fusion/images/logo_header.png | Bin 0 -> 37087 bytes .../src/main/webapp/app/fusion/images/m1.gif | Bin 0 -> 636 bytes .../src/main/webapp/app/fusion/images/mail.png | Bin 0 -> 449 bytes .../src/main/webapp/app/fusion/images/map.png | Bin 0 -> 611 bytes .../main/webapp/app/fusion/images/menu/bubble.png | Bin 0 -> 662 bytes .../webapp/app/fusion/images/menu/file_import.png | Bin 0 -> 653 bytes .../app/fusion/images/menu/file_save-all.png | Bin 0 -> 610 bytes .../main/webapp/app/fusion/images/menu/mail.png | Bin 0 -> 449 bytes .../main/webapp/app/fusion/images/menu/profile.png | Bin 0 -> 462 bytes .../webapp/app/fusion/images/menu/speechbubble.png | Bin 0 -> 458 bytes .../main/webapp/app/fusion/images/menu/users.png | Bin 0 -> 938 bytes .../src/main/webapp/app/fusion/images/minus.gif | Bin 0 -> 75 bytes .../fusion/images/mobile_logo_att_header_black.png | Bin 0 -> 34762 bytes .../fusion/images/mobile_logo_att_header_grey.png | Bin 0 -> 34636 bytes .../images/mobile_logo_att_header_horizontal.png | Bin 0 -> 5202 bytes .../fusion/images/mobile_logo_att_header_white.png | Bin 0 -> 34475 bytes .../main/webapp/app/fusion/images/modify_icon.gif | Bin 0 -> 246 bytes .../src/main/webapp/app/fusion/images/note-add.png | Bin 0 -> 589 bytes .../main/webapp/app/fusion/images/note-search.png | Bin 0 -> 876 bytes .../src/main/webapp/app/fusion/images/note.png | Bin 0 -> 583 bytes .../src/main/webapp/app/fusion/images/notes.png | Bin 0 -> 673 bytes .../src/main/webapp/app/fusion/images/offline.png | Bin 0 -> 3483 bytes .../main/webapp/app/fusion/images/offlineMsg.gif | Bin 0 -> 1004 bytes .../src/main/webapp/app/fusion/images/online.png | Bin 0 -> 888 bytes .../src/main/webapp/app/fusion/images/page.gif | Bin 0 -> 131 bytes .../main/webapp/app/fusion/images/pagination.png | Bin 0 -> 724 bytes .../webapp/app/fusion/images/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../webapp/app/fusion/images/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../src/main/webapp/app/fusion/images/pix.gif | Bin 0 -> 49 bytes .../src/main/webapp/app/fusion/images/plus.gif | Bin 0 -> 78 bytes .../src/main/webapp/app/fusion/images/printer.gif | Bin 0 -> 1036 bytes .../src/main/webapp/app/fusion/images/profile.png | Bin 0 -> 462 bytes .../main/webapp/app/fusion/images/report-add.png | Bin 0 -> 724 bytes .../webapp/app/fusion/images/report-favorite.png | Bin 0 -> 693 bytes .../main/webapp/app/fusion/images/report-my.png | Bin 0 -> 739 bytes .../webapp/app/fusion/images/report-public.png | Bin 0 -> 776 bytes .../src/main/webapp/app/fusion/images/report.png | Bin 0 -> 563 bytes .../src/main/webapp/app/fusion/images/reports.png | Bin 0 -> 769 bytes .../app/fusion/images/results-first-active.png | Bin 0 -> 545 bytes .../app/fusion/images/results-first-disabled.png | Bin 0 -> 421 bytes .../app/fusion/images/results-last-active.png | Bin 0 -> 541 bytes .../app/fusion/images/results-last-disabled.png | Bin 0 -> 421 bytes .../app/fusion/images/results-next-active.png | Bin 0 -> 416 bytes .../app/fusion/images/results-next-disabled.png | Bin 0 -> 326 bytes .../app/fusion/images/results-prev-active.png | Bin 0 -> 421 bytes .../app/fusion/images/results-prev-disabled.png | Bin 0 -> 322 bytes .../webapp/app/fusion/images/resultset_last.png | Bin 0 -> 506 bytes .../app/fusion/images/resultset_previous.png | Bin 0 -> 381 bytes .../webapp/app/fusion/images/return_to_top.gif | Bin 0 -> 846 bytes .../main/webapp/app/fusion/images/rightButton.png | Bin 0 -> 731 bytes .../src/main/webapp/app/fusion/images/search.png | Bin 0 -> 3501 bytes .../webapp/app/fusion/images/search_profile.png | Bin 0 -> 880 bytes .../src/main/webapp/app/fusion/images/sort_asc.gif | Bin 0 -> 57 bytes .../main/webapp/app/fusion/images/sort_desc.gif | Bin 0 -> 58 bytes .../src/main/webapp/app/fusion/images/spacer.gif | Bin 0 -> 43 bytes .../main/webapp/app/fusion/images/success_type.gif | Bin 0 -> 260 bytes .../src/main/webapp/app/fusion/images/swoosh.gif | Bin 0 -> 14250 bytes .../src/main/webapp/app/fusion/images/tab-hm.png | Bin 0 -> 249 bytes .../src/main/webapp/app/fusion/images/tab-v-hm.png | Bin 0 -> 317 bytes .../src/main/webapp/app/fusion/images/tab.png | Bin 0 -> 343 bytes .../main/webapp/app/fusion/images/table-add.png | Bin 0 -> 3314 bytes .../main/webapp/app/fusion/images/table-delete.png | Bin 0 -> 3342 bytes .../main/webapp/app/fusion/images/table-edit.png | Bin 0 -> 3348 bytes .../src/main/webapp/app/fusion/images/table.png | Bin 0 -> 496 bytes .../src/main/webapp/app/fusion/images/tabs-bg.png | Bin 0 -> 147 bytes .../main/webapp/app/fusion/images/toolButton.gif | Bin 0 -> 414 bytes .../main/webapp/app/fusion/images/toolButton.png | Bin 0 -> 531 bytes .../src/main/webapp/app/fusion/images/toolbar.png | Bin 0 -> 171 bytes .../src/main/webapp/app/fusion/images/users.png | Bin 0 -> 938 bytes .../main/webapp/app/fusion/images/warning_type.gif | Bin 0 -> 1055 bytes .../src/main/webapp/app/fusion/images/webphone.ico | Bin 0 -> 241 bytes .../main/webapp/app/fusion/images/whiteButton.png | Bin 0 -> 1430 bytes .../att_angular_gridster/angular-gridster.js | 2244 + .../att_angular_gridster/ui-gridster-tpls.js | 168 + .../fusion/scripts/controllers/adminController.js | 65 + .../fusion/scripts/controllers/admin_menu_edit.js | 230 + .../fusion/scripts/controllers/ase-controller.js | 22 + .../scripts/controllers/broadcast-controller.js | 79 + .../controllers/broadcast-list-controller.js | 120 + .../controllers/collaborate-list-controller.js | 63 + .../app/fusion/scripts/controllers/dummy.txt | 0 .../controllers/fn_menu_add_popup_controller.js | 281 + .../scripts/controllers/jcs-admin-controller.js | 83 + .../scripts/controllers/modelpopupController.js | 40 + .../scripts/controllers/post-search-controller.js | 202 + .../scripts/controllers/profile-controller.js | 286 + .../controllers/profile-search-controller.js | 80 + .../scripts/controllers/profileController.js | 38 + .../fusion/scripts/controllers/role-controller.js | 226 + .../controllers/role-function-list-controller.js | 157 + .../scripts/controllers/role-list-controller.js | 102 + .../controllers/rolefunctionpopupController.js | 84 + .../controllers/rolepopupmodelController.js | 205 + .../scripts/controllers/self-profile-controller.js | 284 + .../scripts/controllers/usage-list-controller.js | 41 + .../scripts/controllers/workflows/workflowApp.js | 24 + .../controllers/workflows/workflowController.js | 509 + .../controllers/workflows/workflowRouting.js | 26 + .../webapp/app/fusion/scripts/directives/dummy.txt | 0 .../webapp/app/fusion/scripts/directives/footer.js | 30 + .../webapp/app/fusion/scripts/directives/header.js | 504 + .../app/fusion/scripts/directives/leftMenu.js | 203 + .../webapp/app/fusion/scripts/jquery.resize.js | 158 + .../main/webapp/app/fusion/scripts/layout/debug.js | 348 + .../app/fusion/scripts/layout/jquery-latest.js | 9574 ++++ .../app/fusion/scripts/layout/jquery-ui-latest.js | 14898 +++++++ .../fusion/scripts/layout/jquery.layout-latest.js | 6105 +++ .../main/webapp/app/fusion/scripts/modalService.js | 204 + .../main/webapp/app/fusion/scripts/moment.min.js | 25 + .../webapp/app/fusion/scripts/network/net_map.js | 966 + .../app/fusion/scripts/services/adminService.js | 160 + .../app/fusion/scripts/services/headerService.js | 89 + .../app/fusion/scripts/services/leftMenuService.js | 54 + .../app/fusion/scripts/services/profileService.js | 98 + .../app/fusion/scripts/services/userInfoService.js | 51 + .../app/fusion/scripts/socket/peerBroadcast.js | 122 + .../main/webapp/app/fusion/scripts/utils/dummy.txt | 0 .../app/fusion/scripts/utils/page-resource.js | 114 + .../fusion/scripts/utils/sandbox-resources.html | 28 + .../scripts/view-models/admin-page/admin.html | 114 + .../scripts/view-models/admin-page/profile.html | 49 + .../app/fusion/scripts/view-models/dummy.txt | 0 .../app/fusion/scripts/view-models/footer.html | 42 + .../app/fusion/scripts/view-models/header.html | 186 + .../app/fusion/scripts/view-models/left_menu.html | 41 + .../profile-page/admin_closed_loop.html | 46 + .../view-models/profile-page/admin_menu_edit.html | 175 + .../view-models/profile-page/broadcast.html | 61 + .../view-models/profile-page/broadcast_list.html | 71 + .../view-models/profile-page/collaborate_list.html | 57 + .../view-models/profile-page/jcs_admin.html | 87 + .../view-models/profile-page/popup_modal.html | 282 + .../profile-page/popup_modal_fn_menu_add.html | 155 + .../profile-page/popup_modal_fn_menu_edit.html | 148 + .../view-models/profile-page/popup_modal_role.html | 82 + .../profile-page/popup_modal_rolefunction.html | 46 + .../view-models/profile-page/post_search.html | 139 + .../view-models/profile-page/profile_detail.html | 187 + .../view-models/profile-page/profile_search.html | 72 + .../scripts/view-models/profile-page/role.html | 118 + .../profile-page/role_function_list.html | 88 + .../view-models/profile-page/role_list.html | 61 + .../view-models/profile-page/self_profile.html | 182 + .../view-models/profile-page/usage_list.html | 63 + .../view-models/workflows/workflow-landing.html | 131 + .../view-models/workflows/workflow-listing.html | 85 + .../workflows/workflow-listing.html.bak | 85 + .../view-models/workflows/workflow-new.html | 108 + .../view-models/workflows/workflow-preview.html | 36 + .../view-models/workflows/workflow-remove.html | 38 + .../view-models/workflows/workflow-schedule.html | 116 + .../fusion/scripts/webrtc/RTCMultiConnection.js | 6788 +++ .../app/fusion/scripts/webrtc/getSourceId.html | 78 + .../att_angular_gridster/sandbox-gridster.css | 173 + .../styles/att_angular_gridster/ui-gridster.css | 116 + .../main/webapp/app/fusion/styles/fusion-sunny.css | 381 + .../main/webapp/app/fusion/styles/jquery-ui.css | 1244 + .../fusion/styles/layout/layout-default-latest.css | 243 + .../app/fusion/styles/workflows/workflows.css | 50 + .../drools/controller/drools-list-controller.js | 62 + .../drools/controller/drools-view-controller.js | 64 + .../drools/controller/droolsController.js | 30 + .../app/fusionapp/drools/controller/dummy.txt | 0 .../app/fusionapp/drools/directives/dummy.txt | 0 .../app/fusionapp/drools/services/droolsService.js | 76 + .../webapp/app/fusionapp/drools/utils/dummy.txt | 0 .../fusionapp/drools/view-models/droolsList.html | 47 + .../drools/view-models/droolsSinglePage.html | 92 + .../fusionapp/drools/view-models/droolsView.html | 61 + .../app/fusionapp/drools/view-models/dummy.txt | 0 .../main/webapp/app/fusionapp/external/dummy.txt | 0 .../src/main/webapp/app/fusionapp/fonts/dummy.txt | 0 .../main/webapp/app/fusionapp/icons/7450-icon.png | Bin 0 -> 465 bytes .../main/webapp/app/fusionapp/icons/7450-text.png | Bin 0 -> 295 bytes .../main/webapp/app/fusionapp/icons/7750-icon.png | Bin 0 -> 565 bytes .../main/webapp/app/fusionapp/icons/7750-text.png | Bin 0 -> 632 bytes .../webapp/app/fusionapp/icons/apn-dns-icon.png | Bin 0 -> 1065 bytes .../webapp/app/fusionapp/icons/apn-dns-text.png | Bin 0 -> 901 bytes .../main/webapp/app/fusionapp/icons/atcf-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/atcf-text.png | Bin 0 -> 650 bytes .../main/webapp/app/fusionapp/icons/atgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/atgw-text.png | Bin 0 -> 780 bytes .../main/webapp/app/fusionapp/icons/bgcf-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/bgcf-text.png | Bin 0 -> 645 bytes .../main/webapp/app/fusionapp/icons/com-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/cpm-icon.png | Bin 0 -> 201 bytes .../main/webapp/app/fusionapp/icons/cpm-text.png | Bin 0 -> 572 bytes .../webapp/app/fusionapp/icons/default-icon.png | Bin 0 -> 329 bytes .../webapp/app/fusionapp/icons/dra-epc-icon.png | Bin 0 -> 700 bytes .../webapp/app/fusionapp/icons/dra-epc-text.png | Bin 0 -> 820 bytes .../webapp/app/fusionapp/icons/dra-ims-icon.png | Bin 0 -> 700 bytes .../webapp/app/fusionapp/icons/dra-ims-text.png | Bin 0 -> 851 bytes .../main/webapp/app/fusionapp/icons/dslam-icon.png | Bin 0 -> 774 bytes .../main/webapp/app/fusionapp/icons/dslam-text.png | Bin 0 -> 739 bytes .../main/webapp/app/fusionapp/icons/eatf-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/eatf-text.png | Bin 0 -> 439 bytes .../main/webapp/app/fusionapp/icons/ecscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/ecscf-text.png | Bin 0 -> 604 bytes .../main/webapp/app/fusionapp/icons/emsc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/enb-icon.png | Bin 0 -> 1127 bytes .../main/webapp/app/fusionapp/icons/enb-text.png | Bin 0 -> 627 bytes .../main/webapp/app/fusionapp/icons/enum-icon.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/enum-text.png | Bin 0 -> 551 bytes .../main/webapp/app/fusionapp/icons/esmlc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/esmlc-text.png | Bin 0 -> 701 bytes .../main/webapp/app/fusionapp/icons/ettcs-icon.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/ettcs-text.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/gmlc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/gmlc-text.png | Bin 0 -> 755 bytes .../main/webapp/app/fusionapp/icons/hlr-icon.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/hlr-text.png | Bin 0 -> 376 bytes .../webapp/app/fusionapp/icons/hss-epc-icon.png | Bin 0 -> 646 bytes .../webapp/app/fusionapp/icons/hss-epc-text.png | Bin 0 -> 726 bytes .../webapp/app/fusionapp/icons/hss-ims-icon.png | Bin 0 -> 646 bytes .../webapp/app/fusionapp/icons/hss-ims-text.png | Bin 0 -> 757 bytes .../main/webapp/app/fusionapp/icons/icscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/icscf-text.png | Bin 0 -> 657 bytes .../main/webapp/app/fusionapp/icons/ipag-icon.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/ipag-text.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/isbc-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/isbc-text.png | Bin 0 -> 649 bytes .../main/webapp/app/fusionapp/icons/iwf-icon.png | Bin 0 -> 696 bytes .../main/webapp/app/fusionapp/icons/iwf-text.png | Bin 0 -> 595 bytes .../webapp/app/fusionapp/icons/lrf-rdf-icon.png | Bin 0 -> 953 bytes .../webapp/app/fusionapp/icons/lrf-rdf-text.png | Bin 0 -> 638 bytes .../webapp/app/fusionapp/icons/lrg-rdf-text.png | Bin 0 -> 769 bytes .../main/webapp/app/fusionapp/icons/mgc8-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/mgc8-text.png | Bin 0 -> 771 bytes .../webapp/app/fusionapp/icons/mgcf-emsc-icon.png | Bin 0 -> 388 bytes .../webapp/app/fusionapp/icons/mgcf-emsc-text.png | Bin 0 -> 1140 bytes .../main/webapp/app/fusionapp/icons/mgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/mgw-text.png | Bin 0 -> 823 bytes .../main/webapp/app/fusionapp/icons/mind-icon.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/mind-text.png | Bin 0 -> 550 bytes .../main/webapp/app/fusionapp/icons/mme-icon.png | Bin 0 -> 232 bytes .../main/webapp/app/fusionapp/icons/mme-text.png | Bin 0 -> 252 bytes .../main/webapp/app/fusionapp/icons/mrf-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/mrf-text.png | Bin 0 -> 504 bytes .../main/webapp/app/fusionapp/icons/msc-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/msn-icon.png | Bin 0 -> 465 bytes .../main/webapp/app/fusionapp/icons/msn-text.png | Bin 0 -> 318 bytes .../main/webapp/app/fusionapp/icons/multi-icon.png | Bin 0 -> 329 bytes .../main/webapp/app/fusionapp/icons/n7450-icon.png | Bin 0 -> 464 bytes .../main/webapp/app/fusionapp/icons/n7450-text.png | Bin 0 -> 295 bytes .../webapp/app/fusionapp/icons/n7750a-icon.png | Bin 0 -> 393 bytes .../webapp/app/fusionapp/icons/n7750a-text.png | Bin 0 -> 258 bytes .../webapp/app/fusionapp/icons/n7750b-icon.png | Bin 0 -> 393 bytes .../webapp/app/fusionapp/icons/n7750b-text.png | Bin 0 -> 258 bytes .../webapp/app/fusionapp/icons/n7750c-icon.png | Bin 0 -> 391 bytes .../webapp/app/fusionapp/icons/n7750c-text.png | Bin 0 -> 258 bytes .../webapp/app/fusionapp/icons/n7750d-icon.png | Bin 0 -> 391 bytes .../webapp/app/fusionapp/icons/n7750d-text.png | Bin 0 -> 258 bytes .../main/webapp/app/fusionapp/icons/nb-icon.png | Bin 0 -> 1127 bytes .../main/webapp/app/fusionapp/icons/nb-text.png | Bin 0 -> 499 bytes .../main/webapp/app/fusionapp/icons/pas-icon.png | Bin 0 -> 700 bytes .../main/webapp/app/fusionapp/icons/pas-text.png | Bin 0 -> 596 bytes .../main/webapp/app/fusionapp/icons/pcef-icon.png | Bin 0 -> 785 bytes .../main/webapp/app/fusionapp/icons/pcef-text.png | Bin 0 -> 539 bytes .../main/webapp/app/fusionapp/icons/pcrf-icon.png | Bin 0 -> 785 bytes .../main/webapp/app/fusionapp/icons/pcrf-text.png | Bin 0 -> 594 bytes .../main/webapp/app/fusionapp/icons/pcscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/pcscf-text.png | Bin 0 -> 744 bytes .../main/webapp/app/fusionapp/icons/pgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/pgw-text.png | Bin 0 -> 807 bytes .../main/webapp/app/fusionapp/icons/plrf-icon.png | Bin 0 -> 953 bytes .../main/webapp/app/fusionapp/icons/plrf-text.png | Bin 0 -> 735 bytes .../main/webapp/app/fusionapp/icons/psap-icon.png | Bin 0 -> 322 bytes .../webapp/app/fusionapp/icons/pstn-tdm-icon.png | Bin 0 -> 95 bytes .../webapp/app/fusionapp/icons/pstn-tdm-text.png | Bin 0 -> 95 bytes .../main/webapp/app/fusionapp/icons/rg-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/rg-text.png | Bin 0 -> 540 bytes .../main/webapp/app/fusionapp/icons/rnc-icon.png | Bin 0 -> 591 bytes .../main/webapp/app/fusionapp/icons/rnc-text.png | Bin 0 -> 646 bytes .../main/webapp/app/fusionapp/icons/sbc-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/sbc-text.png | Bin 0 -> 632 bytes .../main/webapp/app/fusionapp/icons/sccas-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/sccas-text.png | Bin 0 -> 861 bytes .../main/webapp/app/fusionapp/icons/scscf-icon.png | Bin 0 -> 855 bytes .../main/webapp/app/fusionapp/icons/scscf-text.png | Bin 0 -> 704 bytes .../main/webapp/app/fusionapp/icons/sdg-icon.png | Bin 0 -> 491 bytes .../main/webapp/app/fusionapp/icons/sdg-text.png | Bin 0 -> 696 bytes .../webapp/app/fusionapp/icons/sgsns4-icon.png | Bin 0 -> 230 bytes .../webapp/app/fusionapp/icons/sgsns4-text.png | Bin 0 -> 469 bytes .../main/webapp/app/fusionapp/icons/sgw-icon.png | Bin 0 -> 388 bytes .../main/webapp/app/fusionapp/icons/sgw-text.png | Bin 0 -> 884 bytes .../main/webapp/app/fusionapp/icons/siad-icon.png | Bin 0 -> 774 bytes .../main/webapp/app/fusionapp/icons/siad-text.png | Bin 0 -> 753 bytes .../webapp/app/fusionapp/icons/ss7-gport-icon.png | Bin 0 -> 286 bytes .../webapp/app/fusionapp/icons/ss7-gport-text.png | Bin 0 -> 418 bytes .../webapp/app/fusionapp/icons/ss7gport-icon.png | Bin 0 -> 646 bytes .../webapp/app/fusionapp/icons/ss7gport-text.png | Bin 0 -> 1011 bytes .../webapp/app/fusionapp/icons/switch-icon.png | Bin 0 -> 877 bytes .../main/webapp/app/fusionapp/icons/tas-icon.png | Bin 0 -> 437 bytes .../main/webapp/app/fusionapp/icons/tas-text.png | Bin 0 -> 858 bytes .../webapp/app/fusionapp/icons/transcoder-icon.png | Bin 0 -> 774 bytes .../webapp/app/fusionapp/icons/transcoder-text.png | Bin 0 -> 1242 bytes .../main/webapp/app/fusionapp/icons/ue-icon.png | Bin 0 -> 577 bytes .../webapp/app/fusionapp/icons/uephone-icon.png | Bin 0 -> 1190 bytes .../webapp/app/fusionapp/icons/usp-dns-icon.png | Bin 0 -> 1065 bytes .../webapp/app/fusionapp/icons/usp-dns-text.png | Bin 0 -> 826 bytes .../src/main/webapp/app/fusionapp/images/dummy.txt | 0 .../app/fusionapp/scripts/controller/dummy.txt | 0 .../scripts/controller/sample-page-controller.js | 80 + .../controller/sample-page-iframe-controller.js | 23 + .../scripts/controller/sampleController.js | 30 + .../app/fusionapp/scripts/directives/dummy.txt | 0 .../webapp/app/fusionapp/scripts/utils/dummy.txt | 0 .../app/fusionapp/scripts/view-models/dummy.txt | 0 .../app/fusionapp/scripts/view-models/sample.html | 60 + .../scripts/view-models/sampleWithIframe.html | 22 + .../scripts/view-models/singlePageSample.html | 89 + .../src/main/webapp/app/fusionapp/styles/dummy.txt | 0 dcae_dmaapbc_webapp/src/main/webapp/index.jsp | 24 + dcae_dmaapbc_webapp/src/main/webapp/manifest.jsp | 47 + .../css/att_angular_gridster/sandbox-gridster.css | 173 + .../css/att_angular_gridster/ui-gridster.css | 116 + .../main/webapp/static/fusion/css/fusion-sunny.css | 362 + .../main/webapp/static/fusion/css/jquery-ui.css | 1225 + .../fusion/css/layout/layout-default-latest.css | 224 + .../src/main/webapp/static/fusion/d3/css/nv.d3.css | 656 + .../src/main/webapp/static/fusion/d3/js/cie.js | 155 + .../main/webapp/static/fusion/d3/js/colorbrewer.js | 302 + .../src/main/webapp/static/fusion/d3/js/core.js | 122 + .../main/webapp/static/fusion/d3/js/crossfilter.js | 1180 + .../webapp/static/fusion/d3/js/crossfilter.min.js | 1 + .../src/main/webapp/static/fusion/d3/js/d3.geom.js | 816 + .../src/main/webapp/static/fusion/d3/js/d3.js | 5 + .../webapp/static/fusion/d3/js/d3.layout.cloud.js | 433 + .../main/webapp/static/fusion/d3/js/d3.layout.js | 908 + .../src/main/webapp/static/fusion/d3/js/d3.v2.js | 7037 +++ .../main/webapp/static/fusion/d3/js/d3.v2.min.js | 4 + .../main/webapp/static/fusion/d3/js/d3.v3.min.js | 1 + .../src/main/webapp/static/fusion/d3/js/fisheye.js | 86 + .../src/main/webapp/static/fusion/d3/js/hive.js | 80 + .../src/main/webapp/static/fusion/d3/js/horizon.js | 192 + .../webapp/static/fusion/d3/js/interactiveLayer.js | 251 + .../src/main/webapp/static/fusion/d3/js/intro.js | 1 + .../webapp/static/fusion/d3/js/models/axis-min.js | 1 + .../main/webapp/static/fusion/d3/js/models/axis.js | 470 + .../webapp/static/fusion/d3/js/models/axis.min.js | 1 + .../static/fusion/d3/js/models/backup/bullet.js | 250 + .../fusion/d3/js/models/backup/bulletChart.js | 349 + .../static/fusion/d3/js/models/boilerplate.js | 104 + .../webapp/static/fusion/d3/js/models/bullet.js | 385 + .../static/fusion/d3/js/models/bulletChart.js | 343 + .../fusion/d3/js/models/cumulativeLineChart.js | 782 + .../static/fusion/d3/js/models/discreteBar.js | 349 + .../static/fusion/d3/js/models/discreteBarChart.js | 333 + .../static/fusion/d3/js/models/distribution.js | 148 + .../static/fusion/d3/js/models/historicalBar.js | 331 + .../fusion/d3/js/models/historicalBarChart.js | 419 + .../static/fusion/d3/js/models/indentedTree.js | 337 + .../webapp/static/fusion/d3/js/models/legend.js | 270 + .../main/webapp/static/fusion/d3/js/models/line.js | 284 + .../webapp/static/fusion/d3/js/models/lineChart.js | 465 + .../static/fusion/d3/js/models/linePlusBarChart.js | 433 + .../d3/js/models/linePlusBarWithFocusChart.js | 658 + .../static/fusion/d3/js/models/lineWithFisheye.js | 200 + .../fusion/d3/js/models/lineWithFisheyeChart.js | 297 + .../fusion/d3/js/models/lineWithFocusChart.js | 574 + .../webapp/static/fusion/d3/js/models/multiBar.js | 461 + .../static/fusion/d3/js/models/multiBarChart.js | 524 + .../fusion/d3/js/models/multiBarHorizontal.js | 424 + .../fusion/d3/js/models/multiBarHorizontalChart.js | 434 + .../fusion/d3/js/models/multiBarTimeSeries.js | 384 + .../fusion/d3/js/models/multiBarTimeSeriesChart.js | 405 + .../static/fusion/d3/js/models/multiChart.js | 452 + .../webapp/static/fusion/d3/js/models/ohlcBar.js | 380 + .../fusion/d3/js/models/parallelCoordinates.js | 239 + .../main/webapp/static/fusion/d3/js/models/pie.js | 400 + .../webapp/static/fusion/d3/js/models/pieChart.js | 292 + .../webapp/static/fusion/d3/js/models/scatter.js | 674 + .../static/fusion/d3/js/models/scatterChart.js | 628 + .../fusion/d3/js/models/scatterPlusLineChart.js | 620 + .../webapp/static/fusion/d3/js/models/sparkline.js | 194 + .../static/fusion/d3/js/models/sparklinePlus.js | 295 + .../static/fusion/d3/js/models/stackedArea.js | 368 + .../static/fusion/d3/js/models/stackedAreaChart.js | 629 + .../src/main/webapp/static/fusion/d3/js/nv.d3.js | 13097 ++++++ .../main/webapp/static/fusion/d3/js/nv.d3.min.js | 1 + .../src/main/webapp/static/fusion/d3/js/outro.js | 1 + .../src/main/webapp/static/fusion/d3/js/sankey.js | 292 + .../src/main/webapp/static/fusion/d3/js/tooltip.js | 490 + .../src/main/webapp/static/fusion/d3/js/utils.js | 152 + .../webapp/static/fusion/images/Logo_att_labs.png | Bin 0 -> 2011 bytes .../src/main/webapp/static/fusion/images/Rlogo.jpg | Bin 0 -> 3173 bytes .../src/main/webapp/static/fusion/images/Thumbs.db | Bin 0 -> 102912 bytes .../webapp/static/fusion/images/action_icon.png | Bin 0 -> 2388 bytes .../static/fusion/images/action_list_spacer.gif | Bin 0 -> 73 bytes .../main/webapp/static/fusion/images/active.png | Bin 0 -> 682 bytes .../src/main/webapp/static/fusion/images/add.png | Bin 0 -> 352 bytes .../static/fusion/images/add_tool_button.png | Bin 0 -> 31105 bytes .../main/webapp/static/fusion/images/addicon.png | Bin 0 -> 463 bytes .../static/fusion/images/application_window_bg.jpg | Bin 0 -> 914 bytes .../webapp/static/fusion/images/arrow-next.png | Bin 0 -> 1561 bytes .../webapp/static/fusion/images/arrow-prev.png | Bin 0 -> 1557 bytes .../fusion/images/att_angular_gridster/grips.png | Bin 0 -> 951 bytes .../webapp/static/fusion/images/backButton.png | Bin 0 -> 816 bytes .../src/main/webapp/static/fusion/images/blank.gif | Bin 0 -> 49 bytes .../webapp/static/fusion/images/blueButton.png | Bin 0 -> 1468 bytes .../main/webapp/static/fusion/images/bubble.png | Bin 0 -> 662 bytes .../src/main/webapp/static/fusion/images/cache.png | Bin 0 -> 1081 bytes .../main/webapp/static/fusion/images/calendar.gif | Bin 0 -> 929 bytes .../main/webapp/static/fusion/images/chevron.png | Bin 0 -> 252 bytes .../static/fusion/images/close_container.gif | Bin 0 -> 85 bytes .../webapp/static/fusion/images/collapsed-icon.png | Bin 0 -> 1379 bytes .../main/webapp/static/fusion/images/column-bg.png | Bin 0 -> 165 bytes .../static/fusion/images/copyicon-highlighted.png | Bin 0 -> 264 bytes .../main/webapp/static/fusion/images/copyicon.png | Bin 0 -> 235 bytes .../main/webapp/static/fusion/images/csv_icon.jpg | Bin 0 -> 632 bytes .../main/webapp/static/fusion/images/csv_icon.png | Bin 0 -> 938 bytes .../webapp/static/fusion/images/customers-add.png | Bin 0 -> 755 bytes .../static/fusion/images/customers-search.png | Bin 0 -> 976 bytes .../main/webapp/static/fusion/images/customers.png | Bin 0 -> 749 bytes .../main/webapp/static/fusion/images/decrypted.png | Bin 0 -> 628 bytes .../fusion/images/deleteicon-highlighted.gif | Bin 0 -> 592 bytes .../fusion/images/deleteicon-highlighted.png | Bin 0 -> 566 bytes .../webapp/static/fusion/images/deleteicon.gif | Bin 0 -> 579 bytes .../src/main/webapp/static/fusion/images/ecomp.png | Bin 0 -> 107597 bytes .../webapp/static/fusion/images/ecomp_trans.png | Bin 0 -> 109926 bytes .../main/webapp/static/fusion/images/editicon.gif | Bin 0 -> 360 bytes .../webapp/static/fusion/images/error_type.gif | Bin 0 -> 398 bytes .../webapp/static/fusion/images/example-frame.png | Bin 0 -> 33699 bytes .../static/fusion/images/excelicon_multi.gif | Bin 0 -> 1028 bytes .../webapp/static/fusion/images/executeicon.png | Bin 0 -> 1076 bytes .../webapp/static/fusion/images/expanded-icon.png | Bin 0 -> 1372 bytes .../main/webapp/static/fusion/images/file-add.png | Bin 0 -> 675 bytes .../webapp/static/fusion/images/file_import.png | Bin 0 -> 653 bytes .../webapp/static/fusion/images/file_save-all.png | Bin 0 -> 610 bytes .../webapp/static/fusion/images/filter_icon.png | Bin 0 -> 29069 bytes .../webapp/static/fusion/images/folder_add.png | Bin 0 -> 772 bytes .../webapp/static/fusion/images/folder_closed.png | Bin 0 -> 559 bytes .../webapp/static/fusion/images/folder_delete.png | Bin 0 -> 767 bytes .../webapp/static/fusion/images/folder_edit.png | Bin 0 -> 829 bytes .../webapp/static/fusion/images/folder_open.png | Bin 0 -> 632 bytes .../webapp/static/fusion/images/folder_user.png | Bin 0 -> 887 bytes .../main/webapp/static/fusion/images/funnel.png | Bin 0 -> 543 bytes .../main/webapp/static/fusion/images/fusion.gif | Bin 0 -> 8821 bytes .../webapp/static/fusion/images/grayButton.png | Bin 0 -> 1361 bytes .../static/fusion/images/gray_add_tool_button.png | Bin 0 -> 30883 bytes .../webapp/static/fusion/images/headerChatIcon.png | Bin 0 -> 465 bytes .../static/fusion/images/icon_remove_all.gif | Bin 0 -> 982 bytes .../main/webapp/static/fusion/images/inactive.png | Bin 0 -> 842 bytes .../main/webapp/static/fusion/images/info_type.gif | Bin 0 -> 291 bytes .../fusion/images/layout/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../fusion/images/layout/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../webapp/static/fusion/images/leftButton.png | Bin 0 -> 681 bytes .../main/webapp/static/fusion/images/loading.gif | Bin 0 -> 6820 bytes .../webapp/static/fusion/images/loading_bar.gif | Bin 0 -> 28954 bytes .../webapp/static/fusion/images/login_button.gif | Bin 0 -> 1222 bytes .../main/webapp/static/fusion/images/logo_att.jpg | Bin 0 -> 3145 bytes .../static/fusion/images/logo_att_header.jpg | Bin 0 -> 3145 bytes .../static/fusion/images/logo_att_header.png | Bin 0 -> 43961 bytes .../webapp/static/fusion/images/logo_header.png | Bin 0 -> 37087 bytes .../src/main/webapp/static/fusion/images/m1.gif | Bin 0 -> 636 bytes .../src/main/webapp/static/fusion/images/mail.png | Bin 0 -> 449 bytes .../src/main/webapp/static/fusion/images/map.png | Bin 0 -> 611 bytes .../webapp/static/fusion/images/menu/bubble.png | Bin 0 -> 662 bytes .../static/fusion/images/menu/file_import.png | Bin 0 -> 653 bytes .../static/fusion/images/menu/file_save-all.png | Bin 0 -> 610 bytes .../main/webapp/static/fusion/images/menu/mail.png | Bin 0 -> 449 bytes .../webapp/static/fusion/images/menu/profile.png | Bin 0 -> 462 bytes .../static/fusion/images/menu/speechbubble.png | Bin 0 -> 458 bytes .../webapp/static/fusion/images/menu/users.png | Bin 0 -> 938 bytes .../src/main/webapp/static/fusion/images/minus.gif | Bin 0 -> 75 bytes .../fusion/images/mobile_logo_att_header_black.png | Bin 0 -> 34762 bytes .../fusion/images/mobile_logo_att_header_grey.png | Bin 0 -> 34636 bytes .../images/mobile_logo_att_header_horizontal.png | Bin 0 -> 5202 bytes .../fusion/images/mobile_logo_att_header_white.png | Bin 0 -> 34475 bytes .../webapp/static/fusion/images/modify_icon.gif | Bin 0 -> 246 bytes .../static/fusion/images/no_favorites_star.png | Bin 0 -> 2794 bytes .../main/webapp/static/fusion/images/note-add.png | Bin 0 -> 589 bytes .../webapp/static/fusion/images/note-search.png | Bin 0 -> 876 bytes .../src/main/webapp/static/fusion/images/note.png | Bin 0 -> 583 bytes .../src/main/webapp/static/fusion/images/notes.png | Bin 0 -> 673 bytes .../main/webapp/static/fusion/images/offline.png | Bin 0 -> 3483 bytes .../webapp/static/fusion/images/offlineMsg.gif | Bin 0 -> 1004 bytes .../main/webapp/static/fusion/images/online.png | Bin 0 -> 888 bytes .../src/main/webapp/static/fusion/images/page.gif | Bin 0 -> 131 bytes .../webapp/static/fusion/images/pagination.png | Bin 0 -> 724 bytes .../static/fusion/images/panel-e-w-toggle.png | Bin 0 -> 459 bytes .../static/fusion/images/panel-n-s-toggle.png | Bin 0 -> 335 bytes .../src/main/webapp/static/fusion/images/pix.gif | Bin 0 -> 49 bytes .../src/main/webapp/static/fusion/images/plus.gif | Bin 0 -> 78 bytes .../main/webapp/static/fusion/images/printer.gif | Bin 0 -> 1036 bytes .../main/webapp/static/fusion/images/profile.png | Bin 0 -> 462 bytes .../webapp/static/fusion/images/report-add.png | Bin 0 -> 724 bytes .../static/fusion/images/report-favorite.png | Bin 0 -> 693 bytes .../main/webapp/static/fusion/images/report-my.png | Bin 0 -> 739 bytes .../webapp/static/fusion/images/report-public.png | Bin 0 -> 776 bytes .../main/webapp/static/fusion/images/report.png | Bin 0 -> 563 bytes .../main/webapp/static/fusion/images/reports.png | Bin 0 -> 769 bytes .../static/fusion/images/results-first-active.png | Bin 0 -> 545 bytes .../fusion/images/results-first-disabled.png | Bin 0 -> 421 bytes .../static/fusion/images/results-last-active.png | Bin 0 -> 541 bytes .../static/fusion/images/results-last-disabled.png | Bin 0 -> 421 bytes .../static/fusion/images/results-next-active.png | Bin 0 -> 416 bytes .../static/fusion/images/results-next-disabled.png | Bin 0 -> 326 bytes .../static/fusion/images/results-prev-active.png | Bin 0 -> 421 bytes .../static/fusion/images/results-prev-disabled.png | Bin 0 -> 322 bytes .../webapp/static/fusion/images/resultset_last.png | Bin 0 -> 506 bytes .../static/fusion/images/resultset_previous.png | Bin 0 -> 381 bytes .../webapp/static/fusion/images/return_to_top.gif | Bin 0 -> 846 bytes .../webapp/static/fusion/images/rightButton.png | Bin 0 -> 731 bytes .../main/webapp/static/fusion/images/search.png | Bin 0 -> 3501 bytes .../webapp/static/fusion/images/search_profile.png | Bin 0 -> 880 bytes .../main/webapp/static/fusion/images/sort_asc.gif | Bin 0 -> 57 bytes .../main/webapp/static/fusion/images/sort_desc.gif | Bin 0 -> 58 bytes .../main/webapp/static/fusion/images/spacer.gif | Bin 0 -> 43 bytes .../webapp/static/fusion/images/success_type.gif | Bin 0 -> 260 bytes .../main/webapp/static/fusion/images/swoosh.gif | Bin 0 -> 14250 bytes .../main/webapp/static/fusion/images/tab-hm.png | Bin 0 -> 249 bytes .../main/webapp/static/fusion/images/tab-v-hm.png | Bin 0 -> 317 bytes .../src/main/webapp/static/fusion/images/tab.png | Bin 0 -> 343 bytes .../main/webapp/static/fusion/images/table-add.png | Bin 0 -> 3314 bytes .../webapp/static/fusion/images/table-delete.png | Bin 0 -> 3342 bytes .../webapp/static/fusion/images/table-edit.png | Bin 0 -> 3348 bytes .../src/main/webapp/static/fusion/images/table.png | Bin 0 -> 496 bytes .../main/webapp/static/fusion/images/tabs-bg.png | Bin 0 -> 147 bytes .../webapp/static/fusion/images/toolButton.gif | Bin 0 -> 414 bytes .../webapp/static/fusion/images/toolButton.png | Bin 0 -> 531 bytes .../main/webapp/static/fusion/images/toolbar.png | Bin 0 -> 171 bytes .../src/main/webapp/static/fusion/images/users.png | Bin 0 -> 938 bytes .../webapp/static/fusion/images/warning_type.gif | Bin 0 -> 1055 bytes .../main/webapp/static/fusion/images/webphone.ico | Bin 0 -> 241 bytes .../webapp/static/fusion/images/whiteButton.png | Bin 0 -> 1430 bytes .../js/att_angular_gridster/angular-gridster.js | 2244 + .../js/att_angular_gridster/ui-gridster-tpls.js | 168 + .../main/webapp/static/fusion/js/jquery.resize.js | 139 + .../main/webapp/static/fusion/js/layout/debug.js | 329 + .../static/fusion/js/layout/jquery-latest.js | 9555 ++++ .../static/fusion/js/layout/jquery-ui-latest.js | 14879 +++++++ .../fusion/js/layout/jquery.layout-latest.js | 6086 +++ .../src/main/webapp/static/fusion/js/moment.min.js | 6 + .../main/webapp/static/fusion/raptor/css/Style.css | 77 + .../static/fusion/raptor/css/bd_quantum_raptor.css | 305 + .../webapp/static/fusion/raptor/css/calendar.css | 97 + .../webapp/static/fusion/raptor/css/dashboard.css | 36 + .../webapp/static/fusion/raptor/css/drupal.css | 83 + .../fusion/raptor/css/form-field-tooltip.css | 12 + .../static/fusion/raptor/css/mobile_raptor.css | 73 + .../webapp/static/fusion/raptor/css/novamap.css | 25 + .../webapp/static/fusion/raptor/css/picker.css | 40 + .../main/webapp/static/fusion/raptor/css/ral.css | 1437 + .../webapp/static/fusion/raptor/css/raptor.css | 62 + .../static/fusion/raptor/css/tree/context-menu.css | 57 + .../raptor/css/tree/drag-drop-folder-tree.css | 64 + .../webapp/static/fusion/raptor/d3/css/nv.d3.css | 656 + .../main/webapp/static/fusion/raptor/d3/js/cie.js | 155 + .../static/fusion/raptor/d3/js/colorbrewer.js | 302 + .../main/webapp/static/fusion/raptor/d3/js/core.js | 122 + .../static/fusion/raptor/d3/js/crossfilter.js | 1180 + .../static/fusion/raptor/d3/js/crossfilter.min.js | 1 + .../webapp/static/fusion/raptor/d3/js/d3.geom.js | 816 + .../main/webapp/static/fusion/raptor/d3/js/d3.js | 3015 ++ .../webapp/static/fusion/raptor/d3/js/d3.layout.js | 908 + .../webapp/static/fusion/raptor/d3/js/d3.v2.js | 7033 +++ .../webapp/static/fusion/raptor/d3/js/d3.v2.min.js | 4 + .../webapp/static/fusion/raptor/d3/js/d3.v3.js | 8444 ++++ .../webapp/static/fusion/raptor/d3/js/d3.v3.min.js | 1 + .../webapp/static/fusion/raptor/d3/js/fisheye.js | 86 + .../main/webapp/static/fusion/raptor/d3/js/hive.js | 80 + .../webapp/static/fusion/raptor/d3/js/horizon.js | 192 + .../static/fusion/raptor/d3/js/interactiveLayer.js | 251 + .../webapp/static/fusion/raptor/d3/js/intro.js | 1 + .../static/fusion/raptor/d3/js/models/axis-min.js | 1 + .../static/fusion/raptor/d3/js/models/axis.js | 470 + .../static/fusion/raptor/d3/js/models/axis.min.js | 1 + .../fusion/raptor/d3/js/models/boilerplate.js | 104 + .../static/fusion/raptor/d3/js/models/bullet.js | 385 + .../fusion/raptor/d3/js/models/bulletChart.js | 343 + .../raptor/d3/js/models/cumulativeLineChart.js | 782 + .../fusion/raptor/d3/js/models/discreteBar.js | 349 + .../fusion/raptor/d3/js/models/discreteBarChart.js | 333 + .../fusion/raptor/d3/js/models/distribution.js | 148 + .../fusion/raptor/d3/js/models/historicalBar.js | 331 + .../raptor/d3/js/models/historicalBarChart.js | 419 + .../fusion/raptor/d3/js/models/indentedTree.js | 337 + .../static/fusion/raptor/d3/js/models/legend.js | 270 + .../static/fusion/raptor/d3/js/models/line.js | 284 + .../static/fusion/raptor/d3/js/models/lineChart.js | 465 + .../fusion/raptor/d3/js/models/linePlusBarChart.js | 433 + .../d3/js/models/linePlusBarWithFocusChart.js | 658 + .../fusion/raptor/d3/js/models/lineWithFisheye.js | 200 + .../raptor/d3/js/models/lineWithFisheyeChart.js | 297 + .../raptor/d3/js/models/lineWithFocusChart.js | 574 + .../static/fusion/raptor/d3/js/models/multiBar.js | 461 + .../fusion/raptor/d3/js/models/multiBarChart.js | 524 + .../raptor/d3/js/models/multiBarHorizontal.js | 424 + .../raptor/d3/js/models/multiBarHorizontalChart.js | 434 + .../raptor/d3/js/models/multiBarTimeSeries.js | 384 + .../raptor/d3/js/models/multiBarTimeSeriesChart.js | 405 + .../fusion/raptor/d3/js/models/multiChart.js | 452 + .../static/fusion/raptor/d3/js/models/ohlcBar.js | 380 + .../raptor/d3/js/models/parallelCoordinates.js | 239 + .../static/fusion/raptor/d3/js/models/pie.js | 400 + .../static/fusion/raptor/d3/js/models/pie.js.bak | 400 + .../static/fusion/raptor/d3/js/models/pieChart.js | 292 + .../static/fusion/raptor/d3/js/models/scatter.js | 674 + .../fusion/raptor/d3/js/models/scatterChart.js | 628 + .../raptor/d3/js/models/scatterPlusLineChart.js | 620 + .../static/fusion/raptor/d3/js/models/sparkline.js | 194 + .../fusion/raptor/d3/js/models/sparklinePlus.js | 295 + .../fusion/raptor/d3/js/models/stackedArea.js | 368 + .../fusion/raptor/d3/js/models/stackedAreaChart.js | 629 + .../webapp/static/fusion/raptor/d3/js/nv.d3.min.js | 1 + .../webapp/static/fusion/raptor/d3/js/outro.js | 1 + .../webapp/static/fusion/raptor/d3/js/sankey.js | 292 + .../webapp/static/fusion/raptor/d3/js/tooltip.js | 490 + .../webapp/static/fusion/raptor/d3/js/utils.js | 152 + .../static/fusion/raptor/dy3/js/dashed-canvas.js | 176 + .../webapp/static/fusion/raptor/dy3/js/data.js | 63 + .../static/fusion/raptor/dy3/js/dygraph-canvas.js | 816 + .../fusion/raptor/dy3/js/dygraph-combined.js | 2 + .../raptor/dy3/js/dygraph-combined_bak_color.js | 2 + .../static/fusion/raptor/dy3/js/dygraph-dev.js | 45 + .../static/fusion/raptor/dy3/js/dygraph-externs.js | 93 + .../static/fusion/raptor/dy3/js/dygraph-gviz.js | 82 + .../raptor/dy3/js/dygraph-interaction-model.js | 676 + .../static/fusion/raptor/dy3/js/dygraph-layout.js | 349 + .../raptor/dy3/js/dygraph-options-reference.js | 867 + .../static/fusion/raptor/dy3/js/dygraph-options.js | 384 + .../fusion/raptor/dy3/js/dygraph-plugin-base.js | 4 + .../fusion/raptor/dy3/js/dygraph-plugin-install.js | 19 + .../static/fusion/raptor/dy3/js/dygraph-tickers.js | 487 + .../static/fusion/raptor/dy3/js/dygraph-utils.js | 1305 + .../webapp/static/fusion/raptor/dy3/js/dygraph.js | 3857 ++ .../webapp/static/fusion/raptor/dy3/js/excanvas.js | 924 + .../static/fusion/raptor/dy3/js/interaction.js | 333 + .../static/fusion/raptor/dy3/js/interaction.min.js | 1 + .../static/fusion/raptor/dy3/js/interaction_sun.js | 303 + .../static/fusion/raptor/dy3/js/moment.min.js | 6 + .../static/fusion/raptor/dy3/js/phantom-driver.js | 206 + .../static/fusion/raptor/dy3/js/phantom-perf.js | 94 + .../static/fusion/raptor/dy3/js/plugins/README | 113 + .../fusion/raptor/dy3/js/plugins/annotations.js | 182 + .../static/fusion/raptor/dy3/js/plugins/axes.js | 315 + .../fusion/raptor/dy3/js/plugins/chart-labels.js | 202 + .../static/fusion/raptor/dy3/js/plugins/grid.js | 124 + .../static/fusion/raptor/dy3/js/plugins/legend.js | 332 + .../fusion/raptor/dy3/js/plugins/range-selector.js | 852 + .../fusion/raptor/dy3/js/rgbcolor/rgbcolor.js | 257 + .../static/fusion/raptor/dy3/js/stacktrace.js | 411 + .../static/fusion/raptor/dy3/js/strftime/Doxyfile | 243 + .../fusion/raptor/dy3/js/strftime/strftime-min.js | 1 + .../fusion/raptor/dy3/js/strftime/strftime.js | 731 + .../static/fusion/raptor/ebz/date_time_picker.css | 557 + .../static/fusion/raptor/ebz/date_time_picker.js | 277 + .../webapp/static/fusion/raptor/ebz/dynamicform.js | 112 + .../main/webapp/static/fusion/raptor/ebz/moment.js | 3688 ++ .../webapp/static/fusion/raptor/ebz/multiselect.js | 62 + .../webapp/static/fusion/raptor/ebz/quick_links.js | 33 + .../fusion/raptor/ebz/report_chart_wizard.html | 313 + .../fusion/raptor/ebz/report_chart_wizard.js | 671 + .../static/fusion/raptor/ebz/report_run.html | 67 + .../webapp/static/fusion/raptor/ebz/report_run.js | 293 + .../static/fusion/raptor/ebz/report_search.html | 34 + .../static/fusion/raptor/ebz/report_search.js | 136 + .../fusion/raptor/images/ATT_Business_logo.gif | Bin 0 -> 8203 bytes .../static/fusion/raptor/images/RAPTOR_BANNER.jpg | Bin 0 -> 6249 bytes .../static/fusion/raptor/images/accessicon.gif | Bin 0 -> 329 bytes .../webapp/static/fusion/raptor/images/active.gif | Bin 0 -> 338 bytes .../webapp/static/fusion/raptor/images/addbtn.png | Bin 0 -> 662 bytes .../static/fusion/raptor/images/ajax-loader.gif | Bin 0 -> 673 bytes .../static/fusion/raptor/images/arrow_add.gif | Bin 0 -> 469 bytes .../static/fusion/raptor/images/arrow_add_edge.gif | Bin 0 -> 564 bytes .../fusion/raptor/images/arrow_add_multiple.gif | Bin 0 -> 748 bytes .../static/fusion/raptor/images/arrow_add_one.gif | Bin 0 -> 631 bytes .../static/fusion/raptor/images/arrow_back.gif | Bin 0 -> 621 bytes .../static/fusion/raptor/images/arrow_cancel.gif | Bin 0 -> 652 bytes .../static/fusion/raptor/images/arrow_left.gif | Bin 0 -> 382 bytes .../static/fusion/raptor/images/arrow_left2.gif | Bin 0 -> 399 bytes .../static/fusion/raptor/images/arrow_next.gif | Bin 0 -> 609 bytes .../static/fusion/raptor/images/arrow_plus.gif | Bin 0 -> 67 bytes .../fusion/raptor/images/arrow_reorder_all.gif | Bin 0 -> 686 bytes .../fusion/raptor/images/arrow_reorder_all.png | Bin 0 -> 29837 bytes .../static/fusion/raptor/images/arrow_right.gif | Bin 0 -> 381 bytes .../static/fusion/raptor/images/arrow_right2.gif | Bin 0 -> 399 bytes .../static/fusion/raptor/images/arrow_save.gif | Bin 0 -> 606 bytes .../static/fusion/raptor/images/att-globe1.jpg | Bin 0 -> 5855 bytes .../static/fusion/raptor/images/button_import.png | Bin 0 -> 546 bytes .../static/fusion/raptor/images/calendar_icon.gif | Bin 0 -> 552 bytes .../fusion/raptor/images/calendar_icon_nav.gif | Bin 0 -> 538 bytes .../fusion/raptor/images/calendar_icon_nav1.gif | Bin 0 -> 1065 bytes .../static/fusion/raptor/images/calender_icon.gif | Bin 0 -> 552 bytes .../fusion/raptor/images/columnblankdown.gif | Bin 0 -> 192 bytes .../static/fusion/raptor/images/columnblankup.gif | Bin 0 -> 193 bytes .../static/fusion/raptor/images/columndown.gif | Bin 0 -> 124 bytes .../static/fusion/raptor/images/columnup.gif | Bin 0 -> 126 bytes .../static/fusion/raptor/images/crosshairs.png | Bin 0 -> 218 bytes .../static/fusion/raptor/images/csv_icon.gif | Bin 0 -> 447 bytes .../static/fusion/raptor/images/deleteicon.gif | Bin 0 -> 80 bytes .../static/fusion/raptor/images/downloadicon.gif | Bin 0 -> 74 bytes .../static/fusion/raptor/images/excel2007.jpg | Bin 0 -> 761 bytes .../static/fusion/raptor/images/excel2007.png | Bin 0 -> 3186 bytes .../static/fusion/raptor/images/excelicon.gif | Bin 0 -> 1055 bytes .../fusion/raptor/images/excelicon_multi.gif | Bin 0 -> 1026 bytes .../fusion/raptor/images/green-arrow-right.gif | Bin 0 -> 201 bytes .../static/fusion/raptor/images/green-arrow.gif | Bin 0 -> 195 bytes .../static/fusion/raptor/images/grnarrowdn.gif | Bin 0 -> 74 bytes .../static/fusion/raptor/images/grnarrowup.gif | Bin 0 -> 106 bytes .../main/webapp/static/fusion/raptor/images/h.png | Bin 0 -> 380 bytes .../static/fusion/raptor/images/inactive.gif | Bin 0 -> 352 bytes .../webapp/static/fusion/raptor/images/loader.gif | Bin 0 -> 958 bytes .../webapp/static/fusion/raptor/images/loading.gif | Bin 0 -> 4176 bytes .../static/fusion/raptor/images/lookup_arrow.gif | Bin 0 -> 645 bytes .../static/fusion/raptor/images/maps/blue.png | Bin 0 -> 1309 bytes .../static/fusion/raptor/images/maps/green.png | Bin 0 -> 1190 bytes .../static/fusion/raptor/images/maps/lightblue.png | Bin 0 -> 1269 bytes .../fusion/raptor/images/maps/map_iphone.jpg | Bin 0 -> 712 bytes .../static/fusion/raptor/images/maps/orange.png | Bin 0 -> 3413 bytes .../static/fusion/raptor/images/maps/pink.png | Bin 0 -> 1321 bytes .../static/fusion/raptor/images/maps/purple.png | Bin 0 -> 1324 bytes .../static/fusion/raptor/images/maps/red.png | Bin 0 -> 1305 bytes .../static/fusion/raptor/images/maps/yellow.png | Bin 0 -> 1309 bytes .../webapp/static/fusion/raptor/images/minus.gif | Bin 0 -> 75 bytes .../static/fusion/raptor/images/modify_icon.gif | Bin 0 -> 246 bytes .../webapp/static/fusion/raptor/images/page.gif | Bin 0 -> 554 bytes .../static/fusion/raptor/images/pdficon_large.gif | Bin 0 -> 434 bytes .../static/fusion/raptor/images/pdficon_small.gif | Bin 0 -> 361 bytes .../static/fusion/raptor/images/pen_paper.gif | Bin 0 -> 618 bytes .../webapp/static/fusion/raptor/images/plus.gif | Bin 0 -> 78 bytes .../static/fusion/raptor/images/popupicon.gif | Bin 0 -> 79 bytes .../static/fusion/raptor/images/position.png | Bin 0 -> 267 bytes .../webapp/static/fusion/raptor/images/printer.gif | Bin 0 -> 1019 bytes .../static/fusion/raptor/images/progress.gif | Bin 0 -> 734 bytes .../static/fusion/raptor/images/question_mark.jpg | Bin 0 -> 426 bytes .../static/fusion/raptor/images/quickhelp_dk.gif | Bin 0 -> 155 bytes .../static/fusion/raptor/images/quickhelp_lt.gif | Bin 0 -> 897 bytes .../webapp/static/fusion/raptor/images/r_back.gif | Bin 0 -> 918 bytes .../webapp/static/fusion/raptor/images/raptor.jpg | Bin 0 -> 889 bytes .../static/fusion/raptor/images/raptor_logo.gif | Bin 0 -> 3150 bytes .../static/fusion/raptor/images/raptor_logo.jpg | Bin 0 -> 1827 bytes .../static/fusion/raptor/images/required.gif | Bin 0 -> 854 bytes .../static/fusion/raptor/images/shareicon.gif | Bin 0 -> 542 bytes .../main/webapp/static/fusion/raptor/images/sv.png | Bin 0 -> 11373 bytes .../static/fusion/raptor/images/tab_left.gif | Bin 0 -> 137 bytes .../static/fusion/raptor/images/tab_left_sel.gif | Bin 0 -> 106 bytes .../static/fusion/raptor/images/tab_right.gif | Bin 0 -> 138 bytes .../static/fusion/raptor/images/tab_right_sel.gif | Bin 0 -> 104 bytes .../static/fusion/raptor/images/test_run.gif | Bin 0 -> 330 bytes .../webapp/static/fusion/raptor/images/text.gif | Bin 0 -> 141 bytes .../raptor/images/tree/context-menu-gradient.gif | Bin 0 -> 807 bytes .../raptor/images/tree/dhtmlgoodies_folder.gif | Bin 0 -> 1120 bytes .../raptor/images/tree/dhtmlgoodies_minus.gif | Bin 0 -> 197 bytes .../raptor/images/tree/dhtmlgoodies_plus.gif | Bin 0 -> 200 bytes .../raptor/images/tree/dhtmlgoodies_sheet.gif | Bin 0 -> 906 bytes .../images/tree/dhtmlgoodies_sheet_crosstab.gif | Bin 0 -> 1144 bytes .../images/tree/dhtmlgoodies_sheet_dashboard.gif | Bin 0 -> 1164 bytes .../images/tree/dhtmlgoodies_sheet_graph.gif | Bin 0 -> 983 bytes .../fusion/raptor/images/tree/dragDrop_ind1.gif | Bin 0 -> 53 bytes .../fusion/raptor/images/tree/dragDrop_ind2.gif | Bin 0 -> 56 bytes .../fusion/raptor/images/tree/folder_close.gif | Bin 0 -> 283 bytes .../fusion/raptor/images/tree/folder_dots.gif | Bin 0 -> 68 bytes .../fusion/raptor/images/tree/folder_folder.gif | Bin 0 -> 980 bytes .../fusion/raptor/images/tree/folder_lastsub.gif | Bin 0 -> 78 bytes .../fusion/raptor/images/tree/folder_open.gif | Bin 0 -> 286 bytes .../fusion/raptor/images/tree/folder_sub.gif | Bin 0 -> 265 bytes .../fusion/raptor/images/tree/grnarrowleft.gif | Bin 0 -> 854 bytes .../fusion/raptor/images/tree/grnarrowright.gif | Bin 0 -> 845 bytes .../static/fusion/raptor/images/txt_icon.gif | Bin 0 -> 154 bytes .../webapp/static/fusion/raptor/images/uF033.png | Bin 0 -> 520 bytes .../webapp/static/fusion/raptor/images/uF034.png | Bin 0 -> 536 bytes .../webapp/static/fusion/raptor/images/uF035.png | Bin 0 -> 487 bytes .../webapp/static/fusion/raptor/images/uF036.png | Bin 0 -> 482 bytes .../fusion/raptor/img/BorderLayout-24x24.png | Bin 0 -> 1369 bytes .../static/fusion/raptor/img/Calendar-16x16.png | Bin 0 -> 552 bytes .../static/fusion/raptor/img/DeleteCross-16x16.png | Bin 0 -> 750 bytes .../webapp/static/fusion/raptor/img/addbtn.png | Bin 0 -> 662 bytes .../static/fusion/raptor/img/button_import.png | Bin 0 -> 546 bytes .../fusion/raptor/img/copyicon-highlighted.png | Bin 0 -> 264 bytes .../webapp/static/fusion/raptor/img/copyicon.png | Bin 0 -> 235 bytes .../static/fusion/raptor/img/cross-small.png | Bin 0 -> 291 bytes .../webapp/static/fusion/raptor/img/csv_icon.gif | Bin 0 -> 447 bytes .../webapp/static/fusion/raptor/img/csv_icon.jpg | Bin 0 -> 632 bytes .../webapp/static/fusion/raptor/img/csv_icon.png | Bin 0 -> 938 bytes .../fusion/raptor/img/deleteicon-highlighted.gif | Bin 0 -> 592 bytes .../fusion/raptor/img/deleteicon-highlighted.png | Bin 0 -> 566 bytes .../webapp/static/fusion/raptor/img/deleteicon.gif | Bin 0 -> 579 bytes .../static/fusion/raptor/img/downloadicon.gif | Bin 0 -> 74 bytes .../webapp/static/fusion/raptor/img/editicon.gif | Bin 0 -> 360 bytes .../webapp/static/fusion/raptor/img/excel2007.jpg | Bin 0 -> 761 bytes .../webapp/static/fusion/raptor/img/excelicon.gif | Bin 0 -> 1055 bytes .../static/fusion/raptor/img/excelicon_multi.gif | Bin 0 -> 1026 bytes .../static/fusion/raptor/img/executeicon.png | Bin 0 -> 1076 bytes .../static/fusion/raptor/img/file_import.png | Bin 0 -> 653 bytes .../static/fusion/raptor/img/pdficon_small.gif | Bin 0 -> 361 bytes .../webapp/static/fusion/raptor/img/pen_paper.gif | Bin 0 -> 618 bytes .../static/fusion/raptor/img/pencil-small.png | Bin 0 -> 309 bytes .../webapp/static/fusion/raptor/img/report-add.png | Bin 0 -> 724 bytes .../static/fusion/raptor/img/report-favorite.png | Bin 0 -> 693 bytes .../webapp/static/fusion/raptor/img/report-my.png | Bin 0 -> 739 bytes .../static/fusion/raptor/img/report-public.png | Bin 0 -> 776 bytes .../webapp/static/fusion/raptor/img/report.png | Bin 0 -> 563 bytes .../webapp/static/fusion/raptor/img/reports.png | Bin 0 -> 769 bytes .../webapp/static/fusion/raptor/img/search.gif | Bin 0 -> 223 bytes .../webapp/static/fusion/raptor/img/search.png | Bin 0 -> 3501 bytes .../webapp/static/fusion/raptor/img/tick-small.png | Bin 0 -> 283 bytes .../static/fusion/raptor/js/CalendarPopup.js | 1486 + .../main/webapp/static/fusion/raptor/js/ajax.js | 214 + .../fusion/raptor/js/ajax_dynamic_content.js | 97 + .../static/fusion/raptor/js/cingular_button.js | 217 + .../main/webapp/static/fusion/raptor/js/drupal.js | 1018 + .../static/fusion/raptor/js/editabledropdown.js | 363 + .../static/fusion/raptor/js/form-field-tooltip.js | 715 + .../main/webapp/static/fusion/raptor/js/gmap.js | 634 + .../main/webapp/static/fusion/raptor/js/jquery.js | 4376 ++ .../webapp/static/fusion/raptor/js/jquery.min.js | 154 + .../static/fusion/raptor/js/label_quantum.js | 5 + .../webapp/static/fusion/raptor/js/nova_button.js | 1184 + .../static/fusion/raptor/js/other_scripts.js | 331 + .../fusion/raptor/js/persist_table_header.js | 47 + .../static/fusion/raptor/js/prototype-1.6.0.3.js | 4320 ++ .../main/webapp/static/fusion/raptor/js/raptor.js | 314 + .../static/fusion/raptor/js/rounded-corners.js | 353 + .../main/webapp/static/fusion/raptor/js/script.js | 482 + .../webapp/static/fusion/raptor/js/tree/ajax.js | 194 + .../static/fusion/raptor/js/tree/context-menu.js | 444 + .../fusion/raptor/js/tree/drag-drop-folder-tree.js | 1059 + .../webapp/static/fusion/raptor/uigrid/ui-grid.css | 1971 + .../webapp/static/fusion/raptor/uigrid/ui-grid.eot | Bin 0 -> 8728 bytes .../webapp/static/fusion/raptor/uigrid/ui-grid.js | 26735 ++++++++++++ .../webapp/static/fusion/raptor/uigrid/ui-grid.svg | 34 + .../webapp/static/fusion/raptor/uigrid/ui-grid.ttf | Bin 0 -> 8564 bytes .../static/fusion/raptor/uigrid/ui-grid.woff | Bin 0 -> 4792 bytes .../static/fusion/raptor/uigrid/vfs_fonts.js | 1 + .../static/fusion/sample/css/images/blank.gif | Bin 0 -> 49 bytes .../webapp/static/fusion/sample/css/scribble.css | 40 + .../webapp/static/fusion/sample/css/slider.css | 142 + .../static/fusion/sample/css/spacegallery.css | 18 + .../webapp/static/fusion/sample/css/welcome.css | 169 + .../static/fusion/sample/html/area_chart.html | 49 + .../static/fusion/sample/html/bar_chart.html | 95 + .../static/fusion/sample/html/d3_gauges_demo.html | 39 + .../fusion/sample/html/data/speedometer2.csv | 16 + .../fusion/sample/html/data/speedometer3.csv | 2 + .../static/fusion/sample/html/data/worddata.csv | 22 + .../webapp/static/fusion/sample/html/donut_d3.html | 43 + .../static/fusion/sample/html/js/area_chart.min.js | 1 + .../static/fusion/sample/html/js/donut.min.js | 1 + .../static/fusion/sample/html/js/gauges.min.js | 1 + .../static/fusion/sample/html/js/line_chart.min.js | 1 + .../static/fusion/sample/html/js/pie_chart.min.js | 1 + .../static/fusion/sample/html/js/worddata.min.js | 1 + .../static/fusion/sample/html/line_chart.html | 49 + .../static/fusion/sample/html/pie_chart.html | 38 + .../static/fusion/sample/html/wordcloud.html | 37 + .../static/fusion/sample/images/Calendar-16x16.png | Bin 0 -> 552 bytes .../static/fusion/sample/images/arrow-next.png | Bin 0 -> 1561 bytes .../static/fusion/sample/images/arrow-prev.png | Bin 0 -> 1557 bytes .../images/carousel/slide_b_drive_test_map.png | Bin 0 -> 202465 bytes .../sample/images/carousel/slide_b_eppt_county.png | Bin 0 -> 21222 bytes .../images/carousel/slide_b_eppt_regression.png | Bin 0 -> 11536 bytes .../images/carousel/slide_b_ios_throughput.png | Bin 0 -> 26131 bytes .../sample/images/carousel/slide_b_lata_map.png | Bin 0 -> 192031 bytes .../images/carousel/slide_b_lata_map_legend.png | Bin 0 -> 3021 bytes .../images/carousel/slide_b_nova_sdn_map.png | Bin 0 -> 179361 bytes .../static/fusion/sample/images/copyicon.png | Bin 0 -> 235 bytes .../static/fusion/sample/images/deleteicon.gif | Bin 0 -> 579 bytes .../static/fusion/sample/images/example-frame.png | Bin 0 -> 33699 bytes .../webapp/static/fusion/sample/images/loading.gif | Bin 0 -> 6820 bytes .../static/fusion/sample/images/tunnels/1_mon.png | Bin 0 -> 22762 bytes .../static/fusion/sample/images/tunnels/2_tue.png | Bin 0 -> 22772 bytes .../static/fusion/sample/images/tunnels/3_wed.png | Bin 0 -> 24012 bytes .../static/fusion/sample/images/tunnels/4_thu.png | Bin 0 -> 23902 bytes .../static/fusion/sample/images/tunnels/5_fri.png | Bin 0 -> 22349 bytes .../static/fusion/sample/images/tunnels/6_sat.png | Bin 0 -> 23674 bytes .../static/fusion/sample/images/tunnels/7_sun.png | Bin 0 -> 22845 bytes .../fusion/sample/images/tunnels/BH_DLSTX_IN.png | Bin 0 -> 10575 bytes .../fusion/sample/images/tunnels/BH_DLSTX_OUT.png | Bin 0 -> 10460 bytes .../static/fusion/sample/images/tunnels/BH_Nat.png | Bin 0 -> 10420 bytes .../fusion/sample/images/tunnels/BH_Nat_Def.png | Bin 0 -> 8941 bytes .../sample/images/tunnels/BH_Nat_Priority.png | Bin 0 -> 10590 bytes .../webapp/static/fusion/sample/js/FusionCharts.js | 361 + .../main/webapp/static/fusion/sample/js/charts.js | 132 + .../src/main/webapp/static/fusion/sample/js/eye.js | 34 + .../fusion/sample/js/jquery.flexslider-min.js | 5 + .../webapp/static/fusion/sample/js/scribble.js | 19 + .../static/fusion/sample/js/slides.min.jquery.js | 20 + .../webapp/static/fusion/sample/js/spacegallery.js | 235 + .../main/webapp/static/fusion/sample/js/utils.js | 252 + .../fusion/sample/org_chart/css/bootstrap.min.css | 351 + .../static/fusion/sample/org_chart/css/custom.css | 97 + .../sample/org_chart/css/jquery.jOrgChart.css | 51 + .../fusion/sample/org_chart/css/prettify.css | 1 + .../static/fusion/sample/org_chart/example.html | 85 + .../fusion/sample/org_chart/example_vsp.html | 88 + .../static/fusion/sample/org_chart/images/bkgd.png | Bin 0 -> 133 bytes .../fusion/sample/org_chart/images/raspberry.jpg | Bin 0 -> 5755 bytes .../fusion/sample/org_chart/jquery.jOrgChart.js | 267 + .../static/fusion/sample/org_chart/prettify.js | 28 + .../src/main/webapp/static/js/jquery-1.10.2.js | 9789 +++++ .../src/main/webapp/static/js/jquery-ui.js | 16617 +++++++ .../src/main/webapp/static/js/jquery.mask.min.js | 12 + .../src/main/webapp/static/js/modalService.js | 169 + .../src/main/webapp/static/js/search.js | 829 + 2832 files changed, 663963 insertions(+) create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java create mode 100644 dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java create mode 100644 dcae_dmaapbc_webapp/src/main/resources/att-rules.drl create mode 100644 dcae_dmaapbc_webapp/src/main/resources/cache.ccf create mode 100644 dcae_dmaapbc_webapp/src/main/resources/logback.xml create mode 100644 dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties create mode 100644 dcae_dmaapbc_webapp/src/main/resources/portal.properties create mode 100644 dcae_dmaapbc_webapp/src/main/resources/state-rules.drl create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_db_fusion.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/.gitignore create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/att-globe-16x16.ico create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/bg-top-bar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/checkmark_yes.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/downCaret.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/home-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/cut.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/door.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/export.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/import.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_add.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_copy.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_delete.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_edit.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_paste.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/trash.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_75_ffffff_40x100.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_65_ffffff_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_dadada_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_222222_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_2e83ff_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_454545_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_888888_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_cd0a0a_256x240.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/pipe.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/selfArrow.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/smallPostit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCan.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCanFull.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/triangle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/index.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrows.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/stylesheet.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-navigated-viewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-navigated-viewer.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-navigated-viewer.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-viewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-viewer.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-viewer.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/ChangeLog.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/LICENSE.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/README.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/jquery.mousewheel.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/jquery-mousewheel/jquery.mousewheel.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/.bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/lodash.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/lodash/lodash.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/sax/lib/sax.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/buttons.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/convertToYaml.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/customContextMenus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/Blob.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/base64.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/interact.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/jquery-2.1.4.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/js-yaml.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dependencies/saveSvgAsPng.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dictionary.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dragMoveListener.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dragMoveListenerArrow.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/dropzones.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/jquery-ui.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/jquery.tooltipster.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/nodes.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/notes.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/printpdf.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/resizable.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/scroll.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/services.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/menus/bs.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/menus/jquery-ui.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/menus/tooltipster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/styles/style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/ase_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/grid_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/index.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/sidebar_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/view-models/topbar_view.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-animate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-animate.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-animate.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-aria.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-aria.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-aria.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-cookies.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-cookies.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-cookies.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-csp.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-loader.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-loader.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-loader.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-message-format.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-message-format.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-message-format.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-messages.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-messages.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-messages.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-mocks.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-resource.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-resource.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-resource.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-route.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-route.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-route.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-sanitize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-sanitize.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-sanitize.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-scenario.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-touch.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-touch.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular-touch.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/angular.min.js.map create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/errors.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/version.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-1.5/version.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-ui/ui-bootstrap-tpls-1.1.2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/angular-ui/ui-bootstrap-tpls-1.2.4.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/bootstrap/bs.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/css/nv.d3.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/cie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/colorbrewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/core.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/crossfilter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/crossfilter.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.geom.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.layout.cloud.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.v2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.v2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/d3.v3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/fisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/hive.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/horizon.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/interactiveLayer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/intro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/axis-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/axis.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/axis.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/backup/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/backup/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/boilerplate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/cumulativeLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/discreteBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/discreteBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/distribution.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/historicalBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/historicalBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/indentedTree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/line.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/linePlusBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/linePlusBarWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineWithFisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineWithFisheyeChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/lineWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarHorizontal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarHorizontalChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarTimeSeries.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiBarTimeSeriesChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/multiChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/ohlcBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/parallelCoordinates.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/pie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/pieChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/scatter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/scatterChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/scatterPlusLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/sparkline.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/sparklinePlus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/stackedArea.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/models/stackedAreaChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/nv.d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/nv.d3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/outro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/sankey.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/d3/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-animate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-cookies.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-route.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-route.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-sanitize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular-touch.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/angular.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/app.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/checklist-model.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/checklist-model.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/gestures.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/ng_base.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/angular_js/ui-charts-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/ebz_header/footer.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/ebz_header/header.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/ebz_header/portal_ebz_header.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/fn-ebz.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/images/headerChatIcon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/images/no_favorites_star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/js/attHeaderSnippet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/js/footer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/att-abs-tpls.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/base.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/btn.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/demo.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/dtpk.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/frms.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/ie/backgroundsize.min.htc create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/calendar-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/checkbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/icon-close-modal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/icon-informative-modal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/icon-warning-modal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loader.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading-spinner-medium.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading-spinner-orange.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_black-small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_black.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_blue-small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_blue.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_white-small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_balls_white.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/loading_dots.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/magnify_glass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/oops-exclamation.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/radio.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/select-arrows.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/treearrow.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/images/upanddown.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/pages/iconography.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/sldr.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ebz/sandbox/styles/tbs.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/.gitignore create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/LICENSE create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/bower.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/component.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/composer.json create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/css/ionicons.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/css/ionicons.min.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/fonts/ionicons.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/_ionicons-font.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/_ionicons-icons.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/_ionicons-variables.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/less/ionicons.less create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/alert-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/alert.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-add-contact.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-alarm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-archive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-back.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-down-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-down-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-up-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-arrow-up-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-battery.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-book.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-calendar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-call.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-chat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-checkmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-clock.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-close.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-contact.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-contacts.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-data.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-developer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-display.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-drawer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-dropdown.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-earth.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-folder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-forums.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-friends.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-hand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-image.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-inbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-information.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-keypad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-lightbulb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-locate.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-location.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-microphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-mixer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-more.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-playstore.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-printer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-promotion.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-reminder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-remove.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-send.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-settings.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-share.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-social-user.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-social.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-sort.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-stair-drawer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-stopwatch.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-storage.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-system-back.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-system-home.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-system-windows.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-timer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-trash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-user-menu.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-volume.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/android-wifi.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/aperture.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/archive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-down-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-down-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-down-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-expand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-down-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-down-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-up-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-graph-up-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-left-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-left-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-left-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-move.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-resize.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-return-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-return-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-right-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-right-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-right-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-shrink.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-swap.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-up-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-up-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/arrow-up-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/asterisk.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/at.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-charging.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-full.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-half.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/battery-low.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/beaker.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/beer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bluetooth.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bonfire.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bookmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/briefcase.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/bug.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/calculator.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/calendar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/card.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/cash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbox-working.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatboxes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbubble-working.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chatbubbles.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/checkmark-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/checkmark-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/checkmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/chevron-up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/clipboard.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/clock.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/close-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/close-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/close.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/closed-captioning.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/cloud.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/code-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/code-working.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/code.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/coffee.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/compass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/compose.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/connection-bars.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/contrast.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/cube.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/disc.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/document-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/document.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/drag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/earth.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/egg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/eject.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/email.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/eye-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/eye.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/female.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/filing.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/film-marker.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/fireball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flash-off.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/flask.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/folder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/fork-repo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/fork.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/funnel.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/game-controller-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/game-controller-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/gear-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/gear-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/grid.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/hammer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/happy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/headphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/heart-broken.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/heart.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/help-buoy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/help-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/help.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/home.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/icecream.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/icon-social-google-plus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/icon-social-google-plus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/image.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/images.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/information-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/information.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ionic.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-alarm-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-alarm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-albums-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-albums.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-americanfootball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-americanfootball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-analytics-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-analytics.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-back.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-down.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-left.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-right.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-thin-up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-arrow-up.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-at-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-at.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-barcode-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-barcode.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-baseball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-baseball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-basketball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-basketball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bell-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bell.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bolt-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bolt.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bookmarks-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-bookmarks.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-box-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-box.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-briefcase-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-briefcase.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-browsers-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-browsers.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calculator-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calculator.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calendar-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-calendar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-camera-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cart-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cart.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatboxes-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatboxes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatbubble-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-chatbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-checkmark-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-checkmark-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-checkmark.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-circle-filled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-circle-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-clock-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-clock.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-close-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-close-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-close.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-download-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-upload-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud-upload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloud.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy-night-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy-night.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cloudy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cog-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-cog.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-compose-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-compose.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-contact-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-contact.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-copy-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-copy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-download-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-download.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-drag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-email-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-email.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-expand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-eye-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-eye.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-fastforward-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-fastforward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-filing-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-filing.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-film-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-film.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-flag-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-flag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-folder-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-folder.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-football-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-football.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-gear-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-gear.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-glasses-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-glasses.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-heart-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-heart.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-help-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-help-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-help.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-home-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-home.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-infinite-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-infinite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-information-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-information-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-information.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-ionic-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-keypad-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-keypad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-lightbulb-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-lightbulb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-location-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-location.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-locked-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-locked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-loop-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-loop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-medkit-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-medkit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-mic-off.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-mic-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-mic.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-minus-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-minus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-minus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-monitor-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-monitor.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-moon-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-moon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-more-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-more.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-musical-note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-musical-notes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-navigate-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-navigate.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paper-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paper.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paperplane-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paperplane.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-partlysunny-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-partlysunny.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pause-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pause.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paw-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-paw.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-people-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-people.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-person-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-person.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-personadd-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-personadd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-photos-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-photos.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pie-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pie.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-play-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-play.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-plus-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-plus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-plus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetag-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetags-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pricetags.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-printer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-printer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pulse-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-pulse.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rainy-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rainy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-recording-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-recording.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-redo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-redo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-refresh-empty.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-refresh-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-refresh.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-reload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-reverse-camera-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-reverse-camera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rewind-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-rewind.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-search-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-settings-strong.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-settings.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-shrink.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipbackward-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipbackward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipforward-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-skipforward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-snowy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-speedometer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-speedometer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-star-half.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-star-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-stopwatch-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-stopwatch.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-sunny-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-sunny.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-telephone-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-telephone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-tennisball-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-tennisball.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-thunderstorm-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-thunderstorm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-time-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-time.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-timer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-timer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-toggle-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-trash-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-trash.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-undo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-undo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-unlocked-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-unlocked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-upload-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-upload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-videocam-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-videocam.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-volume-high.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-volume-low.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-wineglass-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-wineglass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-world-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ios7-world.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ipad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/iphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ipod.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/jet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/key.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/knife.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/laptop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/leaf.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/levels.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/lightbulb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/link.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/load-d.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/location.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/locked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/log-in.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/log-out.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/loop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/magnet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/male.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/man.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/medkit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/merge.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mic-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mic-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mic-c.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/minus-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/minus-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/minus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/model-s.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/monitor.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/more.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/mouse.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/music-note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/navicon-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/navicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/navigate.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/network.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/no-smoking.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/nuclear.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/outlet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/paper-airplane.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/paperclip.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pause.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/person-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/person-stalker.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/person.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pie-graph.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pin.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pinpoint.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pizza.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plane.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/planet.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/play.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/playstation.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plus-circled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plus-round.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/plus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/podium.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pound.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/power.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pricetag.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pricetags.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/printer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/pull-request.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/qr-scanner.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/quote.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/radio-waves.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/record.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/refresh.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/reply-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/reply.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ribbon-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/ribbon-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/sad.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/scissors.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/settings.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/share.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/shuffle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/skip-backward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/skip-forward.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-android-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-android.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-apple-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-apple.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-bitcoin-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-bitcoin.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-buffer-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-buffer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-designernews-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-designernews.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dribbble-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dribbble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dropbox-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-dropbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-facebook-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-facebook.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-foursquare-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-foursquare.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-freebsd-devil.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-github-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-github.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-google-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-google.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-googleplus-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-googleplus.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-hackernews-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-hackernews.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-instagram-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-instagram.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-linkedin-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-linkedin.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-pinterest-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-pinterest.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-reddit-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-reddit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-rss-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-rss.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-skype-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-skype.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-tumblr-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-tumblr.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-tux.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-twitter-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-twitter.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-usd-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-usd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-vimeo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-vimeo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-windows-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-windows.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-wordpress-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-wordpress.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-yahoo-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-yahoo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-youtube-outline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/social-youtube.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/speakerphone.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/speedometer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/spoon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/stats-bars.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/steam.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/stop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/thermometer.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/thumbsdown.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/thumbsup.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/toggle-filled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/trash-a.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/trash-b.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/trophy.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/umbrella.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/university.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/unlocked.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/upload.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/usb.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/videocamera.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-high.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-low.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-medium.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/volume-mute.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wand.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/waterdrop.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wifi.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wineglass.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/woman.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/wrench.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/png/512/xbox.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/readme.md create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/_ionicons-font.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/_ionicons-icons.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/_ionicons-variables.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/scss/ionicons.scss create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/alert-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/alert.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-add-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-add.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-alarm-clock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-alert.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-apps.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-archive.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-back.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropdown-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropdown.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropleft-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropleft.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropright-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropright.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropup-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-dropup.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-arrow-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-attach.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bicycle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-boat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bookmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bulb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-bus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-calendar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-call.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cancel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-car.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-chat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox-blank.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox-outline-blank.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-checkmark-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-clipboard.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-close.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud-done.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-cloud.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-color-palette.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-compass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-contact.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-contacts.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-contract.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-create.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-delete.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-desktop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-document.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-done-all.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-done.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-drafts.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-exit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-expand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-favorite-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-favorite.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-film.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-folder-open.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-folder.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-funnel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-globe.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-hand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-hangout.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-happy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-home.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-image.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-laptop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-list.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-locate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-lock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-mail.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-map.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-menu.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-microphone-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-microphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-more-horizontal.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-more-vertical.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-navigate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-notifications-none.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-notifications-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-notifications.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-open.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-options.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-people.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-person-add.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-person.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-phone-landscape.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-phone-portrait.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-pin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-plane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-playstore.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-print.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-radio-button-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-radio-button-on.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-refresh.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-remove-circle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-remove.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-restaurant.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-sad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-send.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-settings.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-share-alt.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-share.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-star-half.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-star-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-star.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-stopwatch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-subway.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-sunny.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-sync.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-textsms.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-time.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-train.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-unlock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-mute.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-volume-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-walk.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-warning.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-watch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/android-wifi.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/aperture.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/archive.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-down-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-down-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-down-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-expand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-down-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-down-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-up-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-graph-up-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-left-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-left-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-left-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-move.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-resize.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-return-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-return-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-right-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-right-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-right-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-shrink.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-swap.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-up-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-up-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/arrow-up-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/asterisk.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/at.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/backspace-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/backspace.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-charging.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-full.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-half.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/battery-low.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/beaker.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/beer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bluetooth.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bonfire.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bookmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bowtie.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/briefcase.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/bug.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/calculator.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/calendar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/card.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/cash.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbox-working.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatboxes.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbubble-working.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbubble.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chatbubbles.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/checkmark-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/checkmark-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/checkmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/chevron-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/clipboard.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/clock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/close-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/close-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/close.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/closed-captioning.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/cloud.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/code-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/code-working.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/code.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/coffee.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/compass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/compose.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/connection-bars.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/contrast.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/crop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/cube.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/disc.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/document-text.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/document.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/drag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/earth.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/easel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/edit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/egg.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/eject.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/email-unread.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/email.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/erlenmeyer-flask-bubbles.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/erlenmeyer-flask.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/eye-disabled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/eye.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/female.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/filing.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/film-marker.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/fireball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flame.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flash-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/flash.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/folder.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/fork-repo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/fork.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/funnel.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/gear-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/gear-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/grid.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/hammer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/happy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/happy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/headphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/heart-broken.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/heart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/help-buoy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/help-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/help.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/home.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/icecream.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/image.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/images.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/information-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/information.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ionic.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-alarm-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-alarm.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-albums-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-albums.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-americanfootball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-americanfootball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-analytics-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-analytics.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-back.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-down.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-left.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-right.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-thin-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-arrow-up.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-at-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-at.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-barcode-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-barcode.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-baseball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-baseball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-basketball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-basketball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bell-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bell.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-body-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-body.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bolt-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bolt.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-book-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-book.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bookmarks-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-bookmarks.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-box-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-box.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-briefcase-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-briefcase.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-browsers-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-browsers.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calculator-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calculator.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calendar-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-calendar.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-camera-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cart-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatboxes-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatboxes.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatbubble-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-chatbubble.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-checkmark-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-checkmark-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-checkmark.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-circle-filled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-circle-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-clock-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-clock.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-close-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-close-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-close.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-download-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-upload-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud-upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloud.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy-night-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy-night.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cloudy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cog-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-cog.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-filter-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-filter.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-wand-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-color-wand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-compose-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-compose.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-contact-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-contact.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-copy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-copy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-crop-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-crop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-download-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-download.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-drag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-email-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-email.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-eye-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-eye.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-fastforward-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-fastforward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-filing-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-filing.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-film-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-film.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flag-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flame-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flame.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flask-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flask.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flower-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-flower.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-folder-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-folder.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-football-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-football.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-a-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-b-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-game-controller-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-gear-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-gear.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-glasses-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-glasses.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-grid-view-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-grid-view.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-heart-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-heart.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-help-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-help-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-help.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-home-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-home.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-infinite-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-infinite.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-information-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-information-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-information.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-ionic-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-keypad-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-keypad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-lightbulb-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-lightbulb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-list-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-list.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-location-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-location.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-locked-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-locked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-loop-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-loop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medical-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medical.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medkit-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-medkit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-mic-off.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-mic-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-mic.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-minus-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-minus-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-minus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-monitor-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-monitor.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-moon-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-moon.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-more-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-more.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-musical-note.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-musical-notes.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-navigate-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-navigate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-nutrition-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-nutrition.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paper-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paper.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paperplane-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paperplane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-partlysunny-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-partlysunny.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pause-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pause.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paw-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-paw.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-people-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-people.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-person-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-person.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-personadd-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-personadd.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-photos-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-photos.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pie-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pie.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pint-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pint.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-play-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-play.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-plus-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-plus-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-plus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetag-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetags-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pricetags.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-printer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-printer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pulse-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-pulse.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rainy-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rainy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-recording-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-recording.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-redo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-redo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-refresh-empty.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-refresh-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-refresh.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-reload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-reverse-camera-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-reverse-camera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rewind-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rewind.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rose-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-rose.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-search-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-settings-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-settings.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-shuffle-strong.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-shuffle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipbackward-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipbackward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipforward-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-skipforward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-snowy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-speedometer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-speedometer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-star-half.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-star-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-star.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-stopwatch-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-stopwatch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-sunny-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-sunny.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-telephone-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-telephone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-tennisball-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-tennisball.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-thunderstorm-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-thunderstorm.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-time-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-time.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-timer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-timer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-toggle-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-toggle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-trash-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-trash.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-undo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-undo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-unlocked-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-unlocked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-upload-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-videocam-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-videocam.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-volume-high.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-volume-low.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-wineglass-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-wineglass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-world-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ios-world.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ipad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/iphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ipod.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/jet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/key.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/knife.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/laptop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/leaf.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/levels.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/lightbulb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/link.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/load-d.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/location.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/lock-combination.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/locked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/log-in.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/log-out.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/loop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/magnet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/male.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/man.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/map.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/medkit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/merge.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mic-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mic-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mic-c.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/minus-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/minus-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/minus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/model-s.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/monitor.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/more.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/mouse.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/music-note.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/navicon-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/navicon.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/navigate.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/network.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/no-smoking.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/nuclear.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/outlet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paintbrush.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paintbucket.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paper-airplane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/paperclip.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pause.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/person-add.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/person-stalker.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/person.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pie-graph.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pinpoint.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pizza.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plane.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/planet.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/play.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/playstation.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plus-circled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plus-round.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/plus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/podium.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pound.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/power.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pricetag.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pricetags.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/printer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/pull-request.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/qr-scanner.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/quote.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/radio-waves.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/record.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/refresh.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/reply-all.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/reply.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ribbon-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/ribbon-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/sad-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/sad.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/scissors.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/search.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/settings.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/share.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/shuffle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/skip-backward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/skip-forward.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-android-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-android.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-angular-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-angular.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-apple-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-apple.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-bitcoin-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-bitcoin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-buffer-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-buffer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-chrome-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-chrome.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-codepen-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-codepen.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-css3-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-css3.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-designernews-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-designernews.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dribbble-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dribbble.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dropbox-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-dropbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-euro-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-euro.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-facebook-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-facebook.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-foursquare-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-foursquare.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-freebsd-devil.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-github-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-github.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-google-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-google.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-googleplus-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-googleplus.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-hackernews-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-hackernews.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-html5-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-html5.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-instagram-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-instagram.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-javascript-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-javascript.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-linkedin-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-linkedin.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-markdown.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-nodejs.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-octocat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-pinterest-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-pinterest.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-python.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-reddit-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-reddit.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-rss-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-rss.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-sass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-skype-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-skype.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-snapchat-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-snapchat.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-tumblr-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-tumblr.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-tux.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitch-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitch.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitter-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-twitter.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-usd-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-usd.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-vimeo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-vimeo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-whatsapp-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-whatsapp.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-windows-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-windows.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-wordpress-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-wordpress.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yahoo-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yahoo.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yen-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-yen.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-youtube-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/social-youtube.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/soup-can-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/soup-can.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/speakerphone.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/speedometer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/spoon.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/star.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/stats-bars.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/steam.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/stop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/thermometer.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/thumbsdown.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/thumbsup.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/toggle-filled.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/toggle.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/transgender.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/trash-a.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/trash-b.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/trophy.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/tshirt-outline.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/tshirt.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/umbrella.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/university.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/unlocked.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/upload.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/usb.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/videocamera.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-high.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-low.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-medium.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/volume-mute.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wand.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/waterdrop.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wifi.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wineglass.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/woman.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/wrench.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/ionicons-2.0.1/src/xbox.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/scribble.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/slider.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/css/spacegallery.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/area_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/bar_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/d3_gauges_demo.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/data/speedometer2.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/data/speedometer3.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/data/worddata.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/donut_d3.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/area_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/donut.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/gauges.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/line_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/pie_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/js/worddata.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/line_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/pie_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/html/wordcloud.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/Calendar-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_drive_test_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_eppt_county.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_eppt_regression.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_ios_throughput.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_lata_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_lata_map_legend.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/carousel/slide_b_nova_sdn_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/1_mon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/2_tue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/3_wed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/4_thu.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/5_fri.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/6_sat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/7_sun.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_DLSTX_IN.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_DLSTX_OUT.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_Nat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_Nat_Def.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/images/tunnels/BH_Nat_Priority.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/FusionCharts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/charts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/eye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/scribble.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/slides.min.jquery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/spacegallery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/bootstrap.min.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/custom.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/jquery.jOrgChart.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/css/prettify.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/example.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/example_vsp.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/images/bkgd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/images/raspberry.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/jquery.jOrgChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/samples/org_chart/prettify.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/external/utils/js/browserCheck.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/fonts/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/ATT_Labs_Logo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/Logo_att_labs.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/Rlogo.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/Thumbs.db create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/action_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/action_list_spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/addicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/application_window_bg.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/att_angular_gridster/grips.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/att_logo.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/backButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/blueButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/body_graphic.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/cache.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/calendar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/chevron.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/close_container.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/collapsed-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/column-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/copyicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/csv_icon.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/csv_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/customers-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/customers-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/customers.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/decrypted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/deleteicon-highlighted.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/deleteicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/editicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/error_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/executeicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/expanded-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/file-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/filter_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_closed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_open.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/folder_user.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/funnel.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/fusion.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/grayButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/gray_add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/headerChatIcon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/icon_remove_all.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/inactive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/info_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/layout/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/layout/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/leftButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/loading_bar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/login_button.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_att.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_att_header.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_att_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/logo_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/m1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/speechbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/menu/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_black.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_grey.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_horizontal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/mobile_logo_att_header_white.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/modify_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/note-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/note-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/notes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/offline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/offlineMsg.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/online.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/page.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/pagination.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/pix.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/printer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-favorite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-my.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report-public.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/report.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/reports.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-first-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-first-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-last-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-last-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-next-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-next-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-prev-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/results-prev-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/resultset_last.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/resultset_previous.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/return_to_top.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/rightButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/search_profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/sort_asc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/sort_desc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/success_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/swoosh.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tab-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tab-v-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tab.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table-delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table-edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/table.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/tabs-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/toolButton.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/toolButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/toolbar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/warning_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/webphone.ico create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/images/whiteButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/att_angular_gridster/angular-gridster.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/att_angular_gridster/ui-gridster-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/adminController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/admin_menu_edit.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/ase-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/broadcast-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/broadcast-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/collaborate-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/fn_menu_add_popup_controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/jcs-admin-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/modelpopupController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/post-search-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/profile-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/profile-search-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/profileController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/role-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/role-function-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/role-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/rolefunctionpopupController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/rolepopupmodelController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/self-profile-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/usage-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/workflows/workflowApp.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/workflows/workflowController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/controllers/workflows/workflowRouting.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/footer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/header.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/directives/leftMenu.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/jquery.resize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/debug.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/jquery-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/jquery-ui-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/layout/jquery.layout-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/modalService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/moment.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/network/net_map.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/adminService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/headerService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/leftMenuService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/profileService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/services/userInfoService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/socket/peerBroadcast.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/utils/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/utils/page-resource.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/utils/sandbox-resources.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/admin-page/admin.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/admin-page/profile.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/footer.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/header.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/left_menu.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/admin_closed_loop.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/admin_menu_edit.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/broadcast.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/broadcast_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/collaborate_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/jcs_admin.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_fn_menu_add.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_fn_menu_edit.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_role.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/popup_modal_rolefunction.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/post_search.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/profile_detail.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/profile_search.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/role.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/role_function_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/role_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/self_profile.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/profile-page/usage_list.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-landing.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-listing.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-listing.html.bak create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-new.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-preview.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-remove.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/view-models/workflows/workflow-schedule.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/webrtc/RTCMultiConnection.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/scripts/webrtc/getSourceId.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/att_angular_gridster/sandbox-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/att_angular_gridster/ui-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/fusion-sunny.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/jquery-ui.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/layout/layout-default-latest.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusion/styles/workflows/workflows.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/drools-list-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/drools-view-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/droolsController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/controller/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/directives/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/services/droolsService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/utils/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/droolsList.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/droolsSinglePage.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/droolsView.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/drools/view-models/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/external/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/fonts/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7450-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7450-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7750-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/7750-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/apn-dns-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/apn-dns-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atcf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atcf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/atgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/bgcf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/bgcf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/com-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/cpm-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/cpm-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/default-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-epc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-epc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-ims-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dra-ims-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dslam-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/dslam-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/eatf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/eatf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ecscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ecscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/emsc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enb-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enb-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enum-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/enum-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/esmlc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/esmlc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ettcs-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ettcs-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/gmlc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/gmlc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hlr-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hlr-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-epc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-epc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-ims-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/hss-ims-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/icscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/icscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ipag-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ipag-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/isbc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/isbc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/iwf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/iwf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/lrf-rdf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/lrf-rdf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/lrg-rdf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgc8-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgc8-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgcf-emsc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgcf-emsc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mind-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mind-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mme-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mme-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mrf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/mrf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/msc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/msn-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/msn-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/multi-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7450-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7450-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750a-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750a-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750b-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750b-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750c-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750c-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750d-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/n7750d-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/nb-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/nb-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pas-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pas-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcef-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcef-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcrf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcrf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pcscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/plrf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/plrf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/psap-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pstn-tdm-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/pstn-tdm-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rg-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rg-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rnc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/rnc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sbc-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sbc-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sccas-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sccas-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/scscf-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/scscf-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sdg-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sdg-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgsns4-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgsns4-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgw-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/sgw-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/siad-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/siad-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7-gport-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7-gport-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7gport-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ss7gport-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/switch-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/tas-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/tas-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/transcoder-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/transcoder-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/ue-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/uephone-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/usp-dns-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/icons/usp-dns-text.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/images/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/sample-page-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/sample-page-iframe-controller.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/controller/sampleController.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/directives/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/utils/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/sample.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/sampleWithIframe.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/scripts/view-models/singlePageSample.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/app/fusionapp/styles/dummy.txt create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/index.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/manifest.jsp create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/att_angular_gridster/sandbox-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/att_angular_gridster/ui-gridster.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/fusion-sunny.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/jquery-ui.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/css/layout/layout-default-latest.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/css/nv.d3.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/cie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/colorbrewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/core.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/crossfilter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/crossfilter.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.geom.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.layout.cloud.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.v2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.v2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/d3.v3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/fisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/hive.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/horizon.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/interactiveLayer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/intro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/axis-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/axis.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/axis.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/backup/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/backup/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/boilerplate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/cumulativeLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/discreteBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/discreteBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/distribution.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/historicalBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/historicalBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/indentedTree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/line.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/linePlusBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/linePlusBarWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineWithFisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineWithFisheyeChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/lineWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarHorizontal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarHorizontalChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarTimeSeries.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiBarTimeSeriesChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/multiChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/ohlcBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/parallelCoordinates.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/pie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/pieChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/scatter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/scatterChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/scatterPlusLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/sparkline.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/sparklinePlus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/stackedArea.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/models/stackedAreaChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/nv.d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/nv.d3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/outro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/sankey.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/d3/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/Logo_att_labs.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/Rlogo.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/Thumbs.db create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/action_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/action_list_spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/addicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/application_window_bg.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/att_angular_gridster/grips.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/backButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/blueButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/cache.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/calendar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/chevron.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/close_container.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/collapsed-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/column-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/copyicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/csv_icon.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/csv_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/customers-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/customers-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/customers.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/decrypted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/deleteicon-highlighted.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/deleteicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/ecomp.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/ecomp_trans.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/editicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/error_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/executeicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/expanded-icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/file-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/filter_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_closed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_open.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/folder_user.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/funnel.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/fusion.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/grayButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/gray_add_tool_button.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/headerChatIcon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/icon_remove_all.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/inactive.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/info_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/layout/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/layout/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/leftButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/loading_bar.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/login_button.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_att.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_att_header.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_att_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/logo_header.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/m1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/bubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/file_save-all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/mail.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/speechbubble.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/menu/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_black.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_grey.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_horizontal.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/mobile_logo_att_header_white.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/modify_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/no_favorites_star.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/note-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/note-search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/note.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/notes.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/offline.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/offlineMsg.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/online.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/page.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/pagination.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/panel-e-w-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/panel-n-s-toggle.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/pix.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/printer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-favorite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-my.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report-public.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/report.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/reports.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-first-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-first-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-last-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-last-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-next-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-next-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-prev-active.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/results-prev-disabled.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/resultset_last.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/resultset_previous.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/return_to_top.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/rightButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/search_profile.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/sort_asc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/sort_desc.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/spacer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/success_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/swoosh.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tab-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tab-v-hm.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tab.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table-delete.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table-edit.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/table.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/tabs-bg.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/toolButton.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/toolButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/toolbar.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/users.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/warning_type.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/webphone.ico create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/images/whiteButton.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/att_angular_gridster/angular-gridster.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/att_angular_gridster/ui-gridster-tpls.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/jquery.resize.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/debug.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/jquery-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/jquery-ui-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/layout/jquery.layout-latest.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/js/moment.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/Style.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/bd_quantum_raptor.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/calendar.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/dashboard.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/drupal.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/form-field-tooltip.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/mobile_raptor.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/novamap.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/picker.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/ral.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/raptor.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/tree/context-menu.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/css/tree/drag-drop-folder-tree.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/css/nv.d3.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/cie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/colorbrewer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/core.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/crossfilter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/crossfilter.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.geom.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v2.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/d3.v3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/fisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/hive.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/horizon.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/interactiveLayer.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/intro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/axis-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/axis.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/axis.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/boilerplate.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/bullet.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/bulletChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/cumulativeLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/discreteBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/discreteBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/distribution.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/historicalBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/historicalBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/indentedTree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/line.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/linePlusBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/linePlusBarWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineWithFisheye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineWithFisheyeChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/lineWithFocusChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarHorizontal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarHorizontalChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarTimeSeries.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiBarTimeSeriesChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/multiChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/ohlcBar.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/parallelCoordinates.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/pie.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/pie.js.bak create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/pieChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/scatter.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/scatterChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/scatterPlusLineChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/sparkline.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/sparklinePlus.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/stackedArea.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/models/stackedAreaChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/nv.d3.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/outro.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/sankey.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/d3/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dashed-canvas.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/data.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-canvas.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-combined.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-combined_bak_color.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-dev.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-externs.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-gviz.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-interaction-model.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-layout.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-options-reference.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-options.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-plugin-base.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-plugin-install.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-tickers.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph-utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/dygraph.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/excanvas.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/interaction.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/interaction.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/interaction_sun.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/moment.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/phantom-driver.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/phantom-perf.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/README create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/annotations.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/axes.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/chart-labels.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/grid.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/legend.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/plugins/range-selector.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/rgbcolor/rgbcolor.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/stacktrace.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/strftime/Doxyfile create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/strftime/strftime-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/dy3/js/strftime/strftime.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/date_time_picker.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/date_time_picker.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/dynamicform.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/moment.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/multiselect.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/quick_links.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_chart_wizard.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_chart_wizard.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_run.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_run.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_search.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/ebz/report_search.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/ATT_Business_logo.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/RAPTOR_BANNER.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/accessicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/active.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/addbtn.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/ajax-loader.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add_edge.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add_multiple.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_add_one.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_back.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_cancel.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_left.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_left2.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_next.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_reorder_all.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_reorder_all.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_right.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_right2.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/arrow_save.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/att-globe1.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/button_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calendar_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calendar_icon_nav.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calendar_icon_nav1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/calender_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columnblankdown.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columnblankup.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columndown.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/columnup.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/crosshairs.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/csv_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/downloadicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excel2007.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excel2007.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excelicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/green-arrow-right.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/green-arrow.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/grnarrowdn.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/grnarrowup.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/h.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/inactive.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/loader.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/lookup_arrow.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/blue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/green.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/lightblue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/map_iphone.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/orange.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/pink.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/purple.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/red.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/maps/yellow.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/modify_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/page.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/pdficon_large.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/pdficon_small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/pen_paper.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/popupicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/position.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/printer.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/progress.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/question_mark.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/quickhelp_dk.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/quickhelp_lt.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/r_back.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/raptor.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/raptor_logo.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/raptor_logo.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/required.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/shareicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/sv.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_left.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_left_sel.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_right.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tab_right_sel.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/test_run.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/text.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/context-menu-gradient.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_folder.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_minus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_plus.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet_crosstab.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet_dashboard.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dhtmlgoodies_sheet_graph.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dragDrop_ind1.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/dragDrop_ind2.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_close.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_dots.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_folder.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_lastsub.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_open.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/folder_sub.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/grnarrowleft.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/tree/grnarrowright.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/txt_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF033.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF034.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF035.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/images/uF036.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/BorderLayout-24x24.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/Calendar-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/DeleteCross-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/addbtn.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/button_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/copyicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/cross-small.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/csv_icon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/csv_icon.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/csv_icon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/deleteicon-highlighted.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/deleteicon-highlighted.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/downloadicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/editicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/excel2007.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/excelicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/excelicon_multi.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/executeicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/file_import.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/pdficon_small.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/pen_paper.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/pencil-small.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-add.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-favorite.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-my.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report-public.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/report.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/reports.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/search.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/search.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/img/tick-small.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/CalendarPopup.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/ajax.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/ajax_dynamic_content.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/cingular_button.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/drupal.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/editabledropdown.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/form-field-tooltip.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/gmap.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/jquery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/jquery.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/label_quantum.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/nova_button.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/other_scripts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/persist_table_header.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/prototype-1.6.0.3.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/raptor.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/rounded-corners.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/script.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/tree/ajax.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/tree/context-menu.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/js/tree/drag-drop-folder-tree.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.eot create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.svg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.ttf create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/ui-grid.woff create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/raptor/uigrid/vfs_fonts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/images/blank.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/scribble.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/slider.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/spacegallery.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/css/welcome.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/area_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/bar_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/d3_gauges_demo.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/data/speedometer2.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/data/speedometer3.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/data/worddata.csv create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/donut_d3.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/area_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/donut.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/gauges.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/line_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/pie_chart.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/js/worddata.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/line_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/pie_chart.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/html/wordcloud.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/Calendar-16x16.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/arrow-next.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/arrow-prev.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_drive_test_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_county.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_eppt_regression.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_ios_throughput.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_lata_map_legend.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/carousel/slide_b_nova_sdn_map.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/copyicon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/deleteicon.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/example-frame.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/loading.gif create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/1_mon.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/2_tue.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/3_wed.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/4_thu.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/5_fri.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/6_sat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/7_sun.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_IN.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_DLSTX_OUT.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Def.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/images/tunnels/BH_Nat_Priority.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/FusionCharts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/charts.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/eye.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/jquery.flexslider-min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/scribble.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/slides.min.jquery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/spacegallery.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/js/utils.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/bootstrap.min.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/custom.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/jquery.jOrgChart.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/css/prettify.css create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/example.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/example_vsp.html create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/images/bkgd.png create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/images/raspberry.jpg create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/jquery.jOrgChart.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/fusion/sample/org_chart/prettify.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/jquery-1.10.2.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/jquery-ui.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/jquery.mask.min.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/modalService.js create mode 100644 dcae_dmaapbc_webapp/src/main/webapp/static/js/search.js (limited to 'dcae_dmaapbc_webapp/src/main') diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java new file mode 100644 index 0000000..830c1fa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataBusHomeController.java @@ -0,0 +1,57 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.controller; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import javax.servlet.ServletException; + +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; + +/** + * This controller maps requests for the DMaaP-BC-App's landing page, which is + * an Angular single-page application. + */ +@Controller +@RequestMapping("/") +public class DataBusHomeController extends DbcappRestrictedBaseController { + + public static final String APP_NAME = "dmaap-bc-app"; + public static final DateFormat logDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + + /** + * At one time I published the landing page as simply "/dbc", but it can + * also be accessed with a default suffix; e.g., "/dbc.htm". + * + * @return View name key, which is resolved to a file using an Apache tiles + * "definitions.xml" file. + * @throws ServletException + */ + @RequestMapping(value = { "/dbc" }, method = RequestMethod.GET) + public ModelAndView dbcDefaultController() throws ServletException { + // a model is only useful for JSP; this app is angular. + return new ModelAndView("dbc_home_tdkey"); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java new file mode 100644 index 0000000..27f5dd6 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DataRouterController.java @@ -0,0 +1,315 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.slf4j.MDC; +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.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * Data Router controller: serves Ajax requests made by Angular scripts on pages + * that show feeds, publishers and subscribers. + */ +@Controller +@RequestMapping("/") +public class DataRouterController extends DbcappRestrictedBaseController { + + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DataRouterController.class); + + private static final String FEED_PATH = "/dr_feed"; + private static final String PUB_PATH = "/dr_pub"; + private static final String SUB_PATH = "/dr_sub"; + + public DataRouterController() { + } + + /** + * Answers a request for one page of data router feeds. + * + * @param request + * @return Result of + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDRFeedsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.DR_FEED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers a request for one page of data router publishers. + * + * @param request + * + * @return Result of + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDRPubsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.DR_PUB); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers a request for one page of data router subscribers. + * + * @param request + * + * @return Result of + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDRSubsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.DR_SUB); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a feed with the specified information. Expects a JSON block in the + * request body - a Feed object. + * + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDRFeed(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.DR_FEED, null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a publisher with the specified information. Expects a JSON block in + * the request body - a DR_Pub object. + * + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * + * @param request + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDRPub(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.DR_PUB, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a subscriber with the specified information. Expects a JSON block in + * the request body - a DR_Sub object. + * + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * + * @param request + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDRSub(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.DR_SUB, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a feed with the specified information. Expects a JSON block in + * the request body - a Feed object. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateFeed(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.DR_FEED, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a publisher with the specified information. Expects a JSON block + * in the request body - a DR_Pub object. + * + * The pubId may have a dot in it. Spring, in its infinite wisdom, truncates + * extensions on dotted path parameters; e.g., "foo.json" becomes "foo". + * Avoid truncation here with the extra ":.+" incantation at the end. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH + "/{id:.+}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateDRPub(@PathVariable("id") String id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.DR_PUB, id, null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a subscriber with the specified information. Expects a JSON block + * in the request body - a DR_Sub object. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it has a "status" and possibly a "data" + * item; on failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateDRSub(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.DR_SUB, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes a feed with the ID specified as a path parameter. On successful + * delete the endpoint returns 204 (confusingly). + * + * Writes a JSON object as an HTTP response; on success it only has "status" + * item; on failure, also has an "error" item. + * + * @param id + * Path parameter with object ID + * @param request + * @return JSON object + * @throws ServletException + */ + @RequestMapping(value = { FEED_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDRFeed(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.DR_FEED, Long.toString(id), 204); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes the publisher with the ID specified as a path parameter. + * + * The pubId may have a dot in it. Spring, in its infinite wisdom, truncates + * extensions on dotted path parameters; e.g., "foo.json" becomes "foo". + * Avoid truncation here with the extra ":.+" incantation at the end. + * + * @param id + * Path parameter with object ID + * @param request + * @return a JSON object; on success it only has "status" item; on failure, + * also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { PUB_PATH + "/{id:.+}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDRPub(@PathVariable("id") String id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.DR_PUB, id, null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes the subscriber with the ID specified as a path parameter. + * + * @param id + * Path parameter with object ID + * @param request + * @return Writes a JSON object; on success it only has "status" item; on + * failure, also has an "error" item. + * @throws ServletException + */ + @RequestMapping(value = { SUB_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDRSub(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.DR_SUB, Long.toString(id), 204); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java new file mode 100644 index 0000000..a527127 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java @@ -0,0 +1,974 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.controller; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openecomp.dcae.dmaap.bcapi.client.DmaapBcRestClient; +import org.openecomp.dcae.dmaap.bcapi.client.HttpStatusAndResponse; +import org.openecomp.dcae.dmaapbc.model.DR_Pub; +import org.openecomp.dcae.dmaapbc.model.DR_Sub; +import org.openecomp.dcae.dmaapbc.model.DcaeLocation; +import org.openecomp.dcae.dmaapbc.model.Dmaap; +import org.openecomp.dcae.dmaapbc.model.DmaapObject; +import org.openecomp.dcae.dmaapbc.model.ErrorResponse; +import org.openecomp.dcae.dmaapbc.model.Feed; +import org.openecomp.dcae.dmaapbc.model.MR_Client; +import org.openecomp.dcae.dmaapbc.model.Topic; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.dmaapbc.dbcapp.rest.DbcUsvcRestClient; +import org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService; +import org.openecomp.dmaapbc.dbcapp.util.DbcappProperties; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.domain.User; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.CipherUtil; +import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * This base class provides utility methods to child controllers. All of the + * requests are forwarded on to a remote REST API, so there's a large degree of + * commonality among the implementations. Combining them kept the lines-of-code + * count down, at the expense of some complexity. + */ +public class DbcappRestrictedBaseController extends RestrictedBaseController { + + /** + * Query parameter for desired page number + */ + protected static final String PAGE_NUM_QUERY_PARAM = "pageNum"; + + /** + * Query parameter for desired items per page + */ + protected static final String VIEW_PER_PAGE_QUERY_PARAM = "viewPerPage"; + + /** + * Tag for status code in JSON responses - ALWAYS PRESENT. + */ + protected static final String STATUS_RESPONSE_KEY = "status"; + + /** + * Tag for data in JSON responses. + */ + protected static final String DATA_RESPONSE_KEY = "data"; + + /** + * Tag for error message in JSON responses; absent on success. + */ + protected static final String ERROR_RESPONSE_KEY = "error"; + + /** + * Tag for response integer, pages required to display complete result list + */ + protected static final String TOTAL_PAGES_RESPONSE_KEY = "totalPages"; + + /** + * Tag for DMaaP name obtained from REST client. + */ + protected static final String PROFILE_NAME_RESPONSE_KEY = "profileName"; + + /** + * Tag for DMaaP name obtained from REST client. + */ + protected static final String DMAAP_NAME_RESPONSE_KEY = "dmaapName"; + + /** + * Tag for DCAE location name list obtained from REST client. + */ + protected static final String DCAE_LOCATIONS_RESPONSE_KEY = "dcaeLocations"; + + /** + * Logger that conforms with ECOMP guidelines + */ + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DbcappRestrictedBaseController.class); + + /** + * For general use in these methods and subclasses + */ + protected final ObjectMapper mapper = new ObjectMapper(); + + /** + * DAO accesses the profiles via a local database. REST accesses the + * profiles via a remote REST service. + */ + public enum AccessMethod { + DAO, REST + }; + + /** + * Enum for selecting an item type. + */ + public enum DmaapDataItem { + DR_FEED, DR_PUB, DR_SUB, MR_TOPIC, MR_CLIENT; + } + + /** + * Application properties - NOT available to constructor. + */ + @Autowired + private DbcappProperties appProperties; + + /** + * Database access - which might not be used. + */ + @Autowired + private DmaapAccessService dmaapAccessDaoServiceAuto; + + /** + * Read from application properties. + */ + private String mechIdName, mechIdPass; + + /** + * This is set by {@link #getDmaapAccessService()} to the DAO or REST + * implementation as configured in properties. + */ + private DmaapAccessService dmaapAccessService; + + /** + * Hello Spring, here's your no-arg constructor. + */ + public DbcappRestrictedBaseController() { + // Do not serialize null values + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + + /** + * Access method for subclasses. + * + * @return DbcappProperties object that was autowired by Spring. + */ + protected DbcappProperties getAppProperties() { + return appProperties; + } + + /** + * Lazy initialization. As a side effect, caches mech ID and password. + * + * @return Either DAO or REST client that implements the access service + * interface. + */ + protected DmaapAccessService getDmaapAccessService() { + if (dmaapAccessService != null) + return dmaapAccessService; + + // Get the application's mechid + mechIdName = appProperties.getProperty(DbcappProperties.DMAAP_MECHID_NAME); + // This is encrypted + String cipher = appProperties.getProperty(DbcappProperties.DMAAP_MECHID_PASSWORD); + if (mechIdName == null || cipher == null) + throw new RuntimeException("Failed to get MECH_ID name and/or password from properties"); + try { + mechIdPass = CipherUtil.decrypt(cipher); + } catch (Exception ex) { + throw new RuntimeException("Failed to decrypt password from config file", ex); + } + + String accessMethod = appProperties.getProperty(DbcappProperties.PROFILE_ACCESS_METHOD); + if (accessMethod == null) + throw new RuntimeException("Failed to get property " + DbcappProperties.PROFILE_ACCESS_METHOD); + AccessMethod profileAccessMethod = AccessMethod.valueOf(accessMethod.toUpperCase()); + if (AccessMethod.DAO == profileAccessMethod) { + // Spring auto-wired this field + dmaapAccessService = dmaapAccessDaoServiceAuto; + } else { + String url = appProperties.getProperty(DbcappProperties.PROFILE_USVC_URL); + String user = appProperties.getProperty(DbcappProperties.PROFILE_USVC_USER); + String pass = appProperties.getProperty(DbcappProperties.PROFILE_USVC_PASS); + if (url == null || user == null || pass == null) + throw new RuntimeException("getDmaapAccessService: missing property: one of url, user, pass"); + String clearText = null; + try { + clearText = CipherUtil.decrypt(pass); + } catch (Exception ex) { + throw new RuntimeException("getDmaapAccessService: failed to decrypt password from config"); + } + dmaapAccessService = new DbcUsvcRestClient(url, user, clearText); + } + return dmaapAccessService; + } + + /** + * Creates a REST client with appropriate credentials, the user/pass from + * the access profile if present, otherwise with the default mech ID and + * password. + * + * @param dmaapAccess + * @return REST client + */ + protected DmaapBcRestClient getDmaapBcRestClient(DmaapAccess dmaapAccess) { + DmaapBcRestClient restClient = null; + if (dmaapAccess.getMechId() == null || dmaapAccess.getMechId().length() == 0) + restClient = new DmaapBcRestClient(dmaapAccess.getDmaapUrl(), mechIdName, mechIdPass); + else + restClient = new DmaapBcRestClient(dmaapAccess.getDmaapUrl(), dmaapAccess.getMechId(), + dmaapAccess.getPassword()); + return restClient; + } + + /** + * Pulls out of the specified list the appropriate items for the page of + * results specified by the page number and view-per-page parameters. + * + * @param pageNum + * Page number requested by user + * @param viewPerPage + * Number of items per page + * @param itemList + * List of items available + * @return List of items to display + */ + @SuppressWarnings("rawtypes") + private static List shrinkListToPage(final int pageNum, final int viewPerPage, final List itemList) { + // user-friendly page numbers index from 1 + int firstIndexOnThisPage = viewPerPage * (pageNum - 1); + int firstIndexOnNextPage = viewPerPage * pageNum; + int fromIndex = firstIndexOnThisPage < itemList.size() ? firstIndexOnThisPage : itemList.size(); + int toIndex = firstIndexOnNextPage < itemList.size() ? firstIndexOnNextPage : itemList.size(); + // answers empty list if from==to + return itemList.subList(fromIndex, toIndex); + } + + /** + * Gets the body of a HTTP request assuming UTF-8 encoding. + * + * @param request + * @return String version of request body + * @throws IOException If the read fails + */ + protected static String getBody(HttpServletRequest request) throws IOException { + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + char[] charBuffer = new char[512]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + + } + return stringBuilder.toString(); + } + + /** + * Builds a JSON success response from the specified inputs. + * + * @param statusCode + * e.g., 200 for OK + * @param dataPojo + * Plain old Java object to serialize as JSON; ignored if null. + * @throws JsonProcessingException + * If the POJO cannot be serialized + * @return JSON block with items "status" : 200 and "data" : (data..) + */ + protected String buildJsonSuccess(int statusCode, Object dataPojo) throws JsonProcessingException { + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, statusCode); + if (dataPojo != null) + model.put(DATA_RESPONSE_KEY, dataPojo); + String json = mapper.writeValueAsString(model); + return json; + } + + /** + * Builds a JSON error response from the specified inputs. + * + * @param statusCode + * e.g., 500 for internal server error + * @param errMsg + * Information about the operation that failed + * @param exception + * Converted to string; ignored if null. + * @return JSON block with tags "status" and "error". + */ + protected String buildJsonError(int statusCode, String errMsg, Exception exception) { + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, new Integer(500)); + if (exception == null) { + model.put(ERROR_RESPONSE_KEY, errMsg); + } else { + final int enough = 512; + String exString = exception.toString(); + String exceptionMsg = exString.length() > enough ? exString.substring(0, enough) : exString; + model.put(ERROR_RESPONSE_KEY, errMsg + ": " + exceptionMsg); + } + String json = null; + try { + json = mapper.writeValueAsString(model); + } catch (JsonProcessingException ex) { + // serializing the trivial map should never fail + String err = "buildJsonError: failed to serialize"; + logger.error(EELFLoggerDelegate.errorLogger, err, ex); + throw new RuntimeException(err, ex); + } + return json; + } + + /** + * Gets a list of DMaaP access profiles for this user from the database. The + * profiles have passwords in the clear - this method decrypts the database + * entries. + * + * Initializes the list for new users and/or configuration changes. Checks + * the database list against the configured list of URLs, and creates new + * rows for any configured URLs not present for the user. Most environments + * are expected to have exactly one valid URL, and the webapp uses a fixed + * MechID to authenticate itself to the DMaaP bus controller, so this + * approach means new users can start without any setup of URLs. + * + * @param userId + * @return List of DmaapAccess objects + * @throws Exception + */ + protected List getOrInitDmaapAccessList(String userId) throws Exception { + String[] configUrls = getAppProperties().getCsvListProperty(DbcappProperties.DMAAP_REST_URL_LIST); + if (configUrls == null || configUrls.length == 0) + throw new Exception("getOrInitDmaapAccessList: Failed to get DMAAP REST URL list"); + // Update this list to track which URLs are in the database. + List configUrlList = new ArrayList(configUrls.length); + for (String c : configUrls) { + // Validate URL to detect config botches + URL url = new URL(c); + configUrlList.add(url.toExternalForm()); + } + + List dbAccessList = getDmaapAccessService().getDmaapAccessList(userId); + + // Check the database entries against the configuration. Also + // build a list of non-DAO objects with clear-text passwords. + List clearList = new ArrayList(dbAccessList.size()); + for (DmaapAccess dmaapAccess : dbAccessList) { + // drop this URL from the list. + // If it's not known to config, complain because that's a bogus row. + if (!configUrlList.remove(dmaapAccess.getDmaapUrl())) + logger.warn(EELFLoggerDelegate.errorLogger, "getOrInitDmaapAccessList: detected extra URL {}", + dmaapAccess.getDmaapUrl()); + // Return cleartext in JSON + DmaapAccess clone = new DmaapAccess(dmaapAccess); + clone.setPassword(clone.decryptPassword()); + clearList.add(clone); + } + + // Create new rows for any configured URLs not found for this user. + for (int i = 0; i < configUrlList.size(); ++i) { + String missUrl = configUrlList.get(i); + logger.debug(EELFLoggerDelegate.debugLogger, "getOrInitDmaapAccessList: adding missing URL {}", missUrl); + DmaapAccess newDmaapAccess = new DmaapAccess(); + // Create a semi-reasonable name for the table + newDmaapAccess.setName("dmaap-" + Integer.toString(i + 1)); + newDmaapAccess.setUserId(userId); + newDmaapAccess.setDmaapUrl(missUrl); + // Write to db. + getDmaapAccessService().saveDmaapAccess(newDmaapAccess); + // Add to response, which assumes the write was successful. + clearList.add(newDmaapAccess); + } + + return clearList; + } + + /** + * Gets the user's selected DMaaP access profile. + * + * @param userId + * User's UID + * @return DmaapAccess object that is currently selected, or the first one + * found if none are selected; null if no access profiles are + * configured. + * @throws ServletException + * If the user's UID cannot be extracted from request. + */ + protected DmaapAccess getSelectedDmaapAccess(String userId) throws Exception { + List profiles = getOrInitDmaapAccessList(userId); + if (profiles.size() == 0) { + logger.debug("getSelectedDmaapAccess: no rows found, returning null"); + return null; + } + + // Return the first one by default if nothing is selected. + DmaapAccess selected = profiles.get(0); + for (DmaapAccess da : profiles) + if (da.getSelected()) + selected = da; + + return selected; + } + + /** + * Supports sorting a list of feeds by the first column displayed: ID + */ + private static Comparator feedComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + Feed f1 = (Feed) o1; + Feed f2 = (Feed) o2; + // sort these numbers lexicographically, same as the front end + // table. + return f1.getFeedId().compareTo(f2.getFeedId()); + } + }; + + /** + * Supports sorting a list of publishers by the first column displayed: pub + * ID + */ + private static Comparator pubComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + DR_Pub p1 = (DR_Pub) o1; + DR_Pub p2 = (DR_Pub) o2; + return p1.getPubId().compareTo(p2.getPubId()); + } + }; + + /** + * Supports sorting a list of subscribers by the first column displayed: sub + * ID + */ + private static Comparator subComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + DR_Sub s1 = (DR_Sub) o1; + DR_Sub s2 = (DR_Sub) o2; + // sort these numbers lexicographically, same as the front end + // table. + return s1.getSubId().compareTo(s2.getSubId()); + } + }; + + /** + * Supports sorting a list of topics by the first column displayed: FQTN + */ + private static Comparator topicComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + Topic t1 = (Topic) o1; + Topic t2 = (Topic) o2; + return t1.getFqtn().compareTo(t2.getFqtn()); + } + }; + + /** + * Supports sorting a list of clients by the first column displayed: client + * ID. + */ + private static Comparator clientComparator = new Comparator() { + @Override + public int compare(DmaapObject o1, DmaapObject o2) { + MR_Client c1 = (MR_Client) o1; + MR_Client c2 = (MR_Client) o2; + // sort these numbers lexicographically, same as the front end + // table. + return c1.getMrClientId().compareTo(c2.getMrClientId()); + } + }; + + /** + * Gets one page of DMaaP objects and supporting information via the Bus + * Controller REST client. On success, returns a JSON object as String with + * the following tags: + *
    + *
  • status: Integer; HTTP status code 200. + *
  • dmaapName: String, name returned by the remote DMaaP instance. + *
  • dcaeLocations: Array of string, locations returned by the remote + * DMaaP instance. + *
  • data: Array of the desired items; e.g., data router feeds. + *
  • totalPages: Integer, the number of pages required to display the + * complete list of items using the submitted page size + *
+ * + * This duplicates all of {@link #buildJsonSuccess(int, Object)}. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param option + * Specifies which item list type to get: data router feeds, etc. + * @param pageNum + * Page number of results + * @param viewPerPage + * Number of items per page + * @return JSON block as String, see above. + * @throws Exception + */ + private String getItemListForPage(DmaapAccess dmaapAccess, DmaapDataItem option, int pageNum, int viewPerPage) + throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + // Get the instance so the page can display its name + DmaapObject dmaap = restClient.getDmaap(); + if (dmaap instanceof ErrorResponse) { + // Bad password is caught here. + ErrorResponse err = (ErrorResponse) dmaap; + throw new Exception(err.getMessage()); + } + // Get locations for editing + List dcaeLocations = restClient.getDcaeLocations(); + if (dcaeLocations.size() == 1 && dcaeLocations.get(0) instanceof ErrorResponse) { + // Should never happen - bad password is caught right above - but be + // careful. + ErrorResponse err = (ErrorResponse) dcaeLocations.get(0); + throw new Exception(err.getMessage()); + } + // Pass them back as String array + String[] dcaeLocs = new String[dcaeLocations.size()]; + for (int i = 0; i < dcaeLocs.length; ++i) { + DcaeLocation dcaeLoc = (DcaeLocation) dcaeLocations.get(i); + dcaeLocs[i] = dcaeLoc.getDcaeLocationName(); + } + // Get the requested item list + List itemList = null; + switch (option) { + case DR_FEED: + itemList = restClient.getFeeds(); + Collections.sort(itemList, feedComparator); + break; + case DR_PUB: + itemList = restClient.getDRPubs(); + Collections.sort(itemList, pubComparator); + break; + case DR_SUB: + itemList = restClient.getDRSubs(); + Collections.sort(itemList, subComparator); + break; + case MR_TOPIC: + itemList = restClient.getTopics(); + Collections.sort(itemList, topicComparator); + break; + case MR_CLIENT: + itemList = restClient.getMRClients(); + Collections.sort(itemList, clientComparator); + break; + default: + throw new Exception("getItemListForPage: pgmr error, unimplemented case: " + option.name()); + } + + logger.debug("getItemListForPage: list size is {}", itemList.size()); + int pageCount = (int) Math.ceil((double) itemList.size() / viewPerPage); + @SuppressWarnings("unchecked") + List subList = shrinkListToPage(pageNum, viewPerPage, itemList); + itemList = subList; + // Build response here + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, new Integer(200)); + model.put(PROFILE_NAME_RESPONSE_KEY, dmaapAccess.getName()); + model.put(DMAAP_NAME_RESPONSE_KEY, ((Dmaap) dmaap).getDmaapName()); + model.put(DCAE_LOCATIONS_RESPONSE_KEY, dcaeLocs); + model.put(DATA_RESPONSE_KEY, itemList); + model.put(TOTAL_PAGES_RESPONSE_KEY, pageCount); + + // build the response + String outboundJson = null; + try { + outboundJson = mapper.writeValueAsString(model); + } catch (Exception ex) { + // should never happen + logger.error("getItemListForPage: failed to serialize model: ", ex); + throw new Exception("sendItemListForPage", ex); + } + + return outboundJson; + } + + /** + * Gets a page of the specified DMaaP items. This method traps errors and + * constructs an appropriate JSON block if an error happens. + * + * See {@link #getItemListForPage(DmaapAccess, DmaapDataItem, int, int)}. + * + * @param request + * Inbound request + * @param option + * DMaaP item type to get + * @return JSON with list of serialized objects, or an error. + */ + protected String getItemListForPageWrapper(HttpServletRequest request, DmaapDataItem option) + throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("getItemListForPageWrapper: Failed to get UID"); + DmaapAccess selected = getSelectedDmaapAccess(appUser.getLoginId()); + if (selected == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + int pageNum = Integer.parseInt(request.getParameter(PAGE_NUM_QUERY_PARAM)); + int viewPerPage = Integer.parseInt(request.getParameter(VIEW_PER_PAGE_QUERY_PARAM)); + outboundJson = getItemListForPage(selected, option, pageNum, viewPerPage); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to get DMaaP item type " + option.name(), ex); + } + return outboundJson; + } + + /** + * Adds an item of the specified type with the specified content. Constructs + * an object by deserializing the JSON block, but ignores any ID field that + * is supplied. + * + * On success, returns a JSON block as String with any data returned by the + * REST client. Throws an exception on any failure. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param userId + * The UID of the user making the request + * @param itemType + * DMaaP item type to add + * @param itemContent + * JSON block to deserialize as an object + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with result of the operation + * @throws Exception + * on any problem + */ + private String addDmaapItem(DmaapAccess dmaapAccess, String userId, DmaapDataItem itemType, String itemContent, + Integer scAddlStatus) throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + HttpStatusAndResponse hsr = null; + switch (itemType) { + case DR_FEED: + Feed feed = mapper.readValue(itemContent, Feed.class); + logger.debug("addDmaapItem: received feed: {} ", feed); + // Null out any ID to get an auto-generated ID + feed.setFeedId(null); + // Assign the owner to be the webapp user + feed.setOwner(userId); + hsr = restClient.postFeed(feed); + break; + case DR_PUB: + DR_Pub pub = mapper.readValue(itemContent, DR_Pub.class); + logger.debug("addDmaapItem: received pub: {} ", pub); + // Null out any ID to get an auto-generated ID + pub.setPubId(null); + hsr = restClient.postDRPub(pub); + break; + case DR_SUB: + DR_Sub sub = mapper.readValue(itemContent, DR_Sub.class); + logger.debug("addDmaapItem: received sub: {} ", sub); + // Null out any ID to get an auto-generated ID + sub.setSubId(null); + // Assign the owner to be the webapp user + sub.setOwner(userId); + hsr = restClient.postDRSub(sub); + break; + case MR_TOPIC: + Topic topic = mapper.readValue(itemContent, Topic.class); + logger.debug("addDmaapItem: received topic: {} ", topic); + // No ID on topic + topic.setOwner(userId); + hsr = restClient.postTopic(topic); + break; + case MR_CLIENT: + MR_Client client = mapper.readValue(itemContent, MR_Client.class); + logger.debug("addDmaapItem: received client: {} ", client); + client.setMrClientId(null); + hsr = restClient.postMRClient(client); + break; + default: + throw new Exception("addDmaapItem: pgmr error, unimplemented case: " + itemType.name()); + } + + // Build result here + String outboundJson = null; + if (hsr.getStatusCode() == HttpServletResponse.SC_OK + || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) { + outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString()); + } else { + throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode()) + + " with content " + hsr.getResponseString()); + } + return outboundJson; + } + + /** + * Adds the specified DMaaP item that is read from the request body. This + * method traps errors and constructs an appropriate JSON block if an error + * happens. + * + * @param request + * Used to obtain user info from the active session + * @param itemType + * DMaaP item type to add + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON block with success or failure object + */ + protected String addItem(HttpServletRequest request, DmaapDataItem itemType, Integer scAddlStatus) + throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("addDmaapItem: Failed to get UID"); + + DmaapAccess access = getSelectedDmaapAccess(appUser.getLoginId()); + if (access == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + String jsonContent = getBody(request); + outboundJson = addDmaapItem(access, appUser.getLoginId(), itemType, jsonContent, scAddlStatus); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to add DMaaP item " + itemType.name(), ex); + } + + return outboundJson; + } + + /** + * Updates an item of the specified type with the specified content. + * Constructs an object by deserializing the JSON block. + * + * On success, returns a JSON block as String with any data returned by the + * REST client. Throws an exception on any failure. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param userId + * The UID of the user making the request + * @param itemType + * DMaaP item type to update + * @param itemId + * Item identification + * @param itemContent + * JSON block to deserialize as an object + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with result of the operation + * @throws Exception + * on any problem + */ + private String updateDmaapItem(DmaapAccess dmaapAccess, String userId, DmaapDataItem itemType, String itemId, + String itemContent, Integer scAddlStatus) throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + HttpStatusAndResponse hsr = null; + switch (itemType) { + case DR_FEED: + Feed feed = mapper.readValue(itemContent, Feed.class); + logger.debug("updateDmaapItem: received feed: {} ", feed); + // Ensure the owner is the webapp user + feed.setOwner(userId); + hsr = restClient.putFeed(feed); + break; + case DR_PUB: + DR_Pub pub = mapper.readValue(itemContent, DR_Pub.class); + logger.debug("updateDmaapItem: received pub: {} ", pub); + hsr = restClient.putDRPub(pub); + break; + case DR_SUB: + DR_Sub sub = mapper.readValue(itemContent, DR_Sub.class); + logger.debug("updateDmaapItem: received sub: {} ", sub); + // Ensure the owner is the webapp user + sub.setOwner(userId); + hsr = restClient.putDRSub(sub); + break; + case MR_TOPIC: + Topic topic = mapper.readValue(itemContent, Topic.class); + logger.debug("updateDmaapItem: received topic: {} ", topic); + // Ensure the owner is the webapp user + topic.setOwner(userId); + if (true && userId != null) + throw new UnsupportedOperationException("put topic"); + // TODO: someday the backend may implement PUT + break; + case MR_CLIENT: + MR_Client client = mapper.readValue(itemContent, MR_Client.class); + logger.debug("updateDmaapItem: received client: {} ", client); + hsr = restClient.putMRClient(client); + break; + default: + throw new Exception("updateDmaapItem: pgmr error, unimplemented case: " + itemType.name()); + } + + // Build result here + String outboundJson = null; + if (hsr.getStatusCode() == HttpServletResponse.SC_OK + || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) { + outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString()); + } else { + throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode()) + + " with content " + hsr.getResponseString()); + } + return outboundJson; + } + + /** + * Updates the specified DMaaP item that is read from the request body. This + * method traps errors and constructs an appropriate JSON block if an error + * happens. + * + * @param request + * Used to obtain user info from the active session + * @param itemType + * DMaaP item type to update + * @param itemId + * Item identification to update + * @param scUpdatelStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with success or error information. + */ + protected String updateItem(HttpServletRequest request, DmaapDataItem itemType, String itemId, + Integer scUpdatelStatus) throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("updateItem: Failed to get UID"); + DmaapAccess access = getSelectedDmaapAccess(appUser.getLoginId()); + if (access == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + String jsonContent = getBody(request); + outboundJson = updateDmaapItem(access, appUser.getLoginId(), itemType, itemId, jsonContent, + scUpdatelStatus); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to update DMaaP item " + itemType.name(), ex); + } + + return outboundJson; + } + + /** + * Deletes an item of the specified type with the specified ID. + * + * @param dmaapAccess + * Access details for the DMaaP REST API + * @param itemType + * DMaaP item type to delete + * @param itemId + * Item identification + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return On success, returns a JSON block as String with any data returned + * by the REST client. + * @throws Exception + * Throws an exception on any failure. + */ + private String deleteDmaapItem(DmaapAccess dmaapAccess, DmaapDataItem itemType, String itemId, Integer scAddlStatus) + throws Exception { + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + HttpStatusAndResponse hsr = null; + switch (itemType) { + case DR_FEED: + hsr = restClient.deleteFeed(itemId); + break; + case DR_PUB: + hsr = restClient.deleteDRPub(itemId); + break; + case DR_SUB: + hsr = restClient.deleteDRSub(itemId); + break; + case MR_TOPIC: + hsr = restClient.deleteTopic(itemId); + break; + case MR_CLIENT: + hsr = restClient.deleteMRClient(itemId); + break; + default: + throw new Exception("deleteDmaapItem: pgmr error, unimplemented case: " + itemType.name()); + } + + // Build result here + String outboundJson = null; + if (hsr.getStatusCode() == HttpServletResponse.SC_OK + || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) { + outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString()); + } else { + throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode()) + + " with content " + hsr.getResponseString()); + } + return outboundJson; + } + + /** + * Deletes the specified DMaaP item. This method traps errors and constructs + * an appropriate JSON block if an error happens. + * + * @param request + * Used to obtain user info from the active session + * @param itemType + * DMaaP item type to delete + * @param itemId + * item ID to delete + * @param scAddlStatus + * HTTP status code 200 is always accepted. If this parameter is + * not null, the value is also considered a valid HTTP status + * code on success; e.g., 204. + * @return JSON object with success or error information. + */ + protected String deleteItem(HttpServletRequest request, DmaapDataItem itemType, String itemId, Integer scAddlStatus) + throws ServletException { + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("deleteItem: Failed to get UID"); + DmaapAccess selected = getSelectedDmaapAccess(appUser.getLoginId()); + if (selected == null) // leap into exception handler + throw new Exception("No DMaaP access profiles are configured."); + outboundJson = deleteDmaapItem(selected, itemType, itemId, scAddlStatus); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to delete DMaaP item " + itemType.name() + " ID " + itemId, ex); + } + return outboundJson; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java new file mode 100644 index 0000000..9b36c8b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/DmaapAccessController.java @@ -0,0 +1,374 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.dcae.dmaap.bcapi.client.DmaapBcRestClient; +import org.openecomp.dcae.dmaapbc.model.Dmaap; +import org.openecomp.dcae.dmaapbc.model.DmaapObject; +import org.openecomp.dcae.dmaapbc.model.ErrorResponse; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.portalsdk.core.domain.User; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.slf4j.MDC; +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.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * DMaaP Access controller: serves Ajax requests made by Angular on pages where + * the user adds, edits and deletes DMaaP access profiles. This controller must + * defend the database against rogue requests including SQL injection attacks. + */ +@Controller +@RequestMapping("/") +public class DmaapAccessController extends DbcappRestrictedBaseController { + + /** + * Logger that conforms with ECOMP guidelines + */ + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DmaapAccessController.class); + + private static final String DMAAP_ACCESS_PATH = "/dmaap_access"; + private static final String SELECT_DMAAP_ACCESS_PATH = "/select_dmaap_access"; + + /** + * For general use in these methods + */ + private final ObjectMapper mapper; + + /** + * Never forget that Spring autowires fields AFTER the constructor is + * called. + */ + public DmaapAccessController() { + mapper = new ObjectMapper(); + } + + /** + * Gets a list of DMaaP access profiles for this user from the database and + * returns them in a JSON array nested within a response object. + * + * See {@link #getOrInitDmaapAccessList(String)}. + * + * @param request + * @return JSON with access profiles, or an error JSON if the request fails. + * @throws ServletException + */ + @RequestMapping(value = { DMAAP_ACCESS_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getDmaapAccessList(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("getDmaapAccessList: Failed to get UID from request"); + List dbAccessList = getOrInitDmaapAccessList(appUser.getLoginId()); + // Wrap the list in the status indicator. + Map model = new HashMap(); + model.put(STATUS_RESPONSE_KEY, new Integer(200)); + model.put(DATA_RESPONSE_KEY, dbAccessList); + outboundJson = mapper.writeValueAsString(model); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to get DMaaP access profile list", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Adds a DMaaP access profile for the requesting user ID; ignores any + * values for row ID and user ID in the body. + * + * @param request + * @return Trivial JSON object indicating success or failure. + * @throws ServletException + */ + @RequestMapping(value = { DMAAP_ACCESS_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addDmaapAccess(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("addDmaapAccess: Failed to get UID"); + + DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class); + logger.debug("addDmaapAccess: received object: {} ", dmaapAccess); + + // Null out ID to get an auto-generated ID + dmaapAccess.setId(null); + // Overwrite any submitted user id + dmaapAccess.setUserId(appUser.getLoginId()); + // Encrypt password + if (dmaapAccess.getPassword() != null) + dmaapAccess.encryptPassword(dmaapAccess.getPassword()); + + // Create a new row + getDmaapAccessService().saveDmaapAccess(dmaapAccess); + + // Answer success + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to add DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Updates a DMaaP access profile if the row user ID matches the requesting + * user ID. + * + * @param id + * Path parameter with ID of the DMaaP access profile + * @param request + * @return Trivial JSON object indicating success or failure. + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("updateDmaapAccess: Failed to get UID"); + + DmaapAccess domainObj = getDmaapAccessService().getDmaapAccess(id); + if (!appUser.getLoginId().equals(domainObj.getUserId())) + throw new Exception("updateDmaapAccess: mismatch of appUser and row user ID"); + + DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class); + logger.debug("updateDmaapAccess: received object: {} ", dmaapAccess); + + // Use the path-parameter id; don't trust the one in the object + dmaapAccess.setId(id); + // Encrypt password if present + if (dmaapAccess.getPassword() != null) + dmaapAccess.encryptPassword(dmaapAccess.getPassword()); + + // Update the existing row + getDmaapAccessService().saveDmaapAccess(dmaapAccess); + + // Answer "OK" + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to update DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Deletes a DMaaP access profile if the row user ID matches the requesting + * user ID. + * + * @param id + * Path parameter with ID of the DMaaP access profile + * @param request + * @return Trivial JSON object indicating success or failure (altho this is + * slightly contrary to conventions for a DELETE method) + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { + DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("deleteDmaapAccess: Failed to get UID"); + // Validate that this user owns the row with the specified ID + DmaapAccess domainObj = getDmaapAccessService().getDmaapAccess(id); + if (!appUser.getLoginId().equals(domainObj.getUserId())) + throw new Exception("deleteDmaapAccess: mismatch of appUser and row user ID"); + + getDmaapAccessService().deleteDmaapAccess(id); + + // Answer "OK" + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to delete DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Gets the selected DMaaP access row for the requesting user. + * + * See {@link #getSelectedDmaapAccess(String)} + * + * @param request + * @return JSON object with one DmaapAccessProfile, or an error + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { SELECT_DMAAP_ACCESS_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getSelectedDmaapAccessProfile(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("getSelectedDmaapAccessProfile: Failed to get UID"); + DmaapAccess selected = super.getSelectedDmaapAccess(appUser.getLoginId()); + // clone and decrypt + DmaapAccess clear = new DmaapAccess(selected); + try { + clear.setPassword(clear.decryptPassword()); + } catch (Exception ex) { + throw new ServletException("getSelectedDmaapAccessProfile: Failed to decrypt password", ex); + } + outboundJson = buildJsonSuccess(200, clear); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to get selected DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Marks the DMaaP access row as selected (first choice) for the requesting + * user if the row user ID matches the requesting user ID. As a side effect, + * removes selected marking from all other user rows. Returns status, + * additionally an error message on failure. + * + * Choice of PUT is fairly arbitrary - there is no body, but GET is for + * actions that do not change data. + * + * @param id + * Path parameter with ID of the DMaaP access profile + * @param request + * @return Trivial JSON object indicating success or failure. + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { + SELECT_DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String selectDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + User appUser = UserUtils.getUserSession(request); + if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) + throw new Exception("selectDmaapAccess: Failed to get UID"); + // A little inefficient in that it requires 3 database accesses; + // probably could be done in 1 with some sophisticated SQL. + List dmaapAccessList = getDmaapAccessService().getDmaapAccessList(appUser.getLoginId()); + for (DmaapAccess dmaap : dmaapAccessList) { + // Only write out the changed rows. + boolean changed = false; + if (id == dmaap.getId()) { + changed = !dmaap.getSelected(); + dmaap.setSelected(true); + } else { + changed = dmaap.getSelected(); + dmaap.setSelected(false); + } + if (changed) + getDmaapAccessService().saveDmaapAccess(dmaap); + } + + // Answer OK + outboundJson = buildJsonSuccess(200, null); + } catch (Exception ex) { + outboundJson = buildJsonError(500, "Failed to select a DMaaP access profile", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + + /** + * Tests the URL in the DMaaP access profile object. + * + * @param request + * @return JSON with a Dmaap object (which has name etc.) on success, error + * on failure. + * @throws ServletException + * in case of unrecoverable failure + */ + @RequestMapping(value = { "test_dmaap_access" }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String testDmaapAccess(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String outboundJson = null; + try { + DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class); + logger.debug("testDmaapAccess: received object: {} ", dmaapAccess); + if (dmaapAccess.getDmaapUrl() == null || dmaapAccess.getDmaapUrl().trim().length() == 0) + throw new Exception("Null or empty URL"); + + DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess); + // Get the instance so the page can display its name + DmaapObject dmaap = restClient.getDmaap(); + if (dmaap instanceof Dmaap) { + outboundJson = buildJsonSuccess(200, dmaap); + } else { + // Bad credentials lands here. + ErrorResponse err = (ErrorResponse) dmaap; + outboundJson = buildJsonError(500, "Test failed: " + err.getMessage(), null); + } + } catch (Exception ex) { + // This is entirely likely; e.e., unknown host exception on typo. + outboundJson = buildJsonError(500, "Invalid DMaaP URL", ex); + } + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return outboundJson; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java new file mode 100644 index 0000000..90a67a1 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/HealthCheckController.java @@ -0,0 +1,157 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService; +import org.openecomp.portalsdk.core.controller.UnRestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * This controller responds to probes for application health, returning a JSON + * body to indicate current status. + */ +@RestController +@Configuration +@EnableAspectJAutoProxy +@RequestMapping("/") +public class HealthCheckController extends UnRestrictedBaseController { + + private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthCheckController.class); + + private static final String HEALTH_CHECK_PATH = "/healthCheck"; + + @Autowired + private DmaapAccessService dmaapAccessService; + + /** + * Model for JSON response with health-check results. + */ + public class HealthStatus { + // Either 200 or 500 + public int statusCode; + // Additional detail in case of error, empty in case of success. + public String message; + + public HealthStatus(int code, String msg) { + this.statusCode = code; + this.message = msg; + } + + public int getStatusCode() { + return statusCode; + } + + public void setStatusCode(int code) { + this.statusCode = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String msg) { + this.message = msg; + } + } + + /** + * Checks application health by making a trivial query to the database. + * + * @param request + * @return 200 if database access succeeds, 500 if it fails. + */ + @RequestMapping(value = { HEALTH_CHECK_PATH }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus healthCheck(HttpServletRequest request) { + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + HealthStatus healthStatus = null; + try { + logger.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); + dmaapAccessService.getDmaapAccessCount(); + healthStatus = new HealthStatus(200, "health check succeeded"); + } catch (Exception ex) { + logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); + healthStatus = new HealthStatus(500, "health check failed: " + ex.toString()); + } + return healthStatus; + } + + /** + * This implementation does not support suspend/resume. + * + * @param request + * @return Trivial success + */ + @RequestMapping(value = { + HEALTH_CHECK_PATH + "/suspend" }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus healthCheckSuspend(HttpServletRequest request) { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + HealthStatus response = new HealthStatus(200, "suspend not implemented"); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * This implementation does not support suspend/resume. + * + * @param request + * @return Trivial success + */ + @RequestMapping(value = { + HEALTH_CHECK_PATH + "/resume" }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus healthCheckResume(HttpServletRequest request) { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + HealthStatus response = new HealthStatus(200, "resume not implemented"); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers ping request without checking the application health. + * + * @param request + * @return Trivial success + */ + @RequestMapping(value = { HEALTH_CHECK_PATH + "/ping" }, method = RequestMethod.GET, produces = "application/json") + public HealthStatus ping(HttpServletRequest request) { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + HealthStatus response = new HealthStatus(200, "ping received"); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java new file mode 100644 index 0000000..a2986f9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/ManifestController.java @@ -0,0 +1,113 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.controller; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * This controller responds to a request for the web application manifest, + * returning a JSON with the information that was created at build time. + * + * Manifest entries have names with hyphens, which means Javascript code can't + * simply use the shorthand object.key; instead use object['key']. + */ +@RestController +@Configuration +@EnableAspectJAutoProxy +@RequestMapping("/") +public class ManifestController extends RestrictedBaseController { + + private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ManifestController.class); + + /** + * Required to obtain the webapp manifest. + */ + @Autowired + ServletContext context; + + /** + * Gets the content of the webapp manifest file META-INF/MANIFEST.MF. + * + * @return Attributes object with key-value pairs from the manifest + * @throws IOException + */ + private Attributes getWebappManifest() throws IOException { + // Path to resource on classpath + final String MANIFEST_RESOURCE_PATH = "/META-INF/MANIFEST.MF"; + // Manifest is formatted as Java-style properties + InputStream inputStream = context.getResourceAsStream(MANIFEST_RESOURCE_PATH); + if (inputStream == null) + throw new IOException("getWebappManifest: failed to get resource at path " + MANIFEST_RESOURCE_PATH); + Manifest manifest = new Manifest(inputStream); + inputStream .close(); + return manifest.getMainAttributes(); + } + + /** + * Gets the webapp manifest contents as a JSON object. + * + * @param request + * @return A map of key-value pairs. On success: + * + *
+	 * { "manifest" : { "key1": "value1", "key2": "value2" } }
+	 *         
+ * + * On failure: + * + *
+	 * { "error": "message" }
+	 *         
+ */ + @RequestMapping(value = { "/manifest" }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public Map getManifest(HttpServletRequest request) { + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + Map response = new HashMap(); + try { + Attributes attributes = getWebappManifest(); + response.put("manifest", attributes); + } catch (Exception ex) { + logger.error(EELFLoggerDelegate.errorLogger, "getManifest: failed to read manifest", ex); + response.put("error", "failed to get manifest: " + ex.toString()); + } + return response; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java new file mode 100644 index 0000000..1513e17 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/controller/MessageRouterController.java @@ -0,0 +1,226 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.controller; + +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.util.SystemProperties; +import org.slf4j.MDC; +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.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * Message Router controller: serves Ajax requests made by Angular scripts on + * pages that show topics and clients. + */ +@Controller +@RequestMapping("/") +public class MessageRouterController extends DbcappRestrictedBaseController { + + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MessageRouterController.class); + + private static final String TOPIC_PATH = "/mr_topic"; + private static final String CLIENT_PATH = "/mr_client"; + + public MessageRouterController() { + } + + /** + * Answers a request for one page of message router topics. See + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * + * @param request + * @return Item list for the specified page + * @throws ServletException + */ + @RequestMapping(value = { TOPIC_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getMRTopicsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.MR_TOPIC); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Answers a request for one page of message router clients. See + * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)} + * + * @param request + * @return Item list for the specified page + * @throws ServletException + */ + @RequestMapping(value = { CLIENT_PATH }, method = RequestMethod.GET, produces = "application/json") + @ResponseBody + public String getMRClientsByPage(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = getItemListForPageWrapper(request, DmaapDataItem.MR_CLIENT); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a topic with the specified information. Expects a JSON block in the + * request body - a Topic object. + * + * @param request + * @return Item list for the specified page + * @throws ServletException + */ + @RequestMapping(value = { TOPIC_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addTopic(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.MR_TOPIC, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Adds a client with the specified information. Expects a JSON block in the + * request body - a MR_Client object. + * + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { CLIENT_PATH }, method = RequestMethod.POST, produces = "application/json") + @ResponseBody + public String addMRClient(HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = addItem(request, DmaapDataItem.MR_CLIENT, HttpServletResponse.SC_CREATED); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a topic with the specified information. Expects a JSON block in + * the request body - a Topic object. + * + * Writes a JSON object as an HTTP response; on success it has a "status" + * and possibly a "data" item; on failure, also has an "error" item. + * + * @param id + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { TOPIC_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateTopic(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.MR_TOPIC, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Updates a client with the specified information. Expects a JSON block in + * the request body - a MR_Client object. + * + * Writes a JSON object as an HTTP response; on success it has a "status" + * and possibly a "data" item; on failure, also has an "error" item. + * + * @param id + * + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { CLIENT_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json") + @ResponseBody + public String updateMRClient(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = updateItem(request, DmaapDataItem.MR_CLIENT, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes a topic with the FQTN ID specified as a path parameter. + * + * FQTN is a string of dot-separated names. Spring, in its infinite wisdom, + * truncates extensions on dotted path parameters; e.g., "foo.json" becomes + * "foo". Avoid truncation here with the extra ":.+" incantation at the end. + * + * Writes a JSON object as an HTTP response; on success it only has "status" + * item; on failure, also has an "error" item. + * + * @param id + * Path parameter with object ID + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { "/mr_topic/{id:.+}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteTopic(@PathVariable("id") String id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.MR_TOPIC, id, 204); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + + /** + * Deletes a client with the mrClientId specified as a path parameter. + * + * Writes a JSON object as an HTTP response; on success it only has "status" + * item; on failure, also has an "error" item. + * + * @param id + * Path parameter with object ID + * @param request + * @return Success / failure JSON + * @throws ServletException + */ + @RequestMapping(value = { "/mr_client/{id}" }, method = RequestMethod.DELETE, produces = "application/json") + @ResponseBody + public String deleteMRClient(@PathVariable("id") long id, HttpServletRequest request) throws ServletException { + MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME); + String response = deleteItem(request, DmaapDataItem.MR_CLIENT, Long.toString(id), null); + MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date())); + logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); + return response; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java new file mode 100644 index 0000000..bb11dfd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/domain/DmaapAccess.java @@ -0,0 +1,167 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.domain; + +import org.openecomp.portalsdk.core.domain.support.DomainVo; +import org.openecomp.portalsdk.core.util.CipherUtil; + +/** + * Hold an access profile for a DMaaP REST endpoint. Represents one row in the + * DBCA_DMAAP table. + */ +public class DmaapAccess extends DomainVo { + + private static final long serialVersionUID = 6443219375733216340L; + + // parent class defines these fields: + // ID, created, modified, created_id, modified_id + + /** UID for user who owns this row */ + private String userId; + /** Nickname for this row */ + private String name; + /** REST API endpoint */ + private String dmaapUrl; + /** Credentials */ + private String mechId; + /** Credentials */ + private String password; + /** User's preferred access profile */ + private boolean selected; + + /** + * Standard POJO no-arg constructor + */ + public DmaapAccess() { + } + + /** + * Copy constructor + * @param copy + */ + public DmaapAccess(final DmaapAccess copy) { + // Unfortunately DomainVo doesn't provide a copy constructor; + // only the ID field is needed. + this.id = copy.id; + // Our fields + this.userId = copy.userId; + this.name = copy.name; + this.dmaapUrl = copy.dmaapUrl; + this.mechId = copy.mechId; + this.password = copy.password; + this.selected = copy.selected; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDmaapUrl() { + return dmaapUrl; + } + + public void setDmaapUrl(String dmaapUrl) { + this.dmaapUrl = dmaapUrl; + } + + public String getMechId() { + return mechId; + } + + public void setMechId(String mechId) { + this.mechId = mechId; + } + + /** + * Gets the encrypted password. Applications should use + * {@link #decryptPassword()}! + * + * @return The encrypted password + */ + public String getPassword() { + return password; + } + + /** + * Sets the encrypted password. Applications should use + * {@link #encryptPassword(String)}! + * + * @param password + * The encrypted password + */ + public void setPassword(String password) { + this.password = password; + } + + public boolean getSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * A getter that decrypts the value read from the database and returns the + * clear text. Has no side effects. + * + * @return Clear-text password. + * @throws Exception + */ + public String decryptPassword() throws Exception { + if (password == null) + return null; + return CipherUtil.decrypt(password); + } + + /** + * A setter that encrypts the clear-text in preparation for storing in the + * database. + * + * @param clearText + * The clear-text password to be encrypted + * @throws Exception + */ + public void encryptPassword(String clearText) throws Exception { + if (clearText == null) { + password = null; + return; + } + password = CipherUtil.encrypt(clearText); + } + + @Override + public String toString() { + return "DmaapAccess[id=" + id + ", url=" + dmaapUrl + ", ...]"; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java new file mode 100644 index 0000000..43542b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java @@ -0,0 +1,184 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.rest; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; + +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +/** + * Provides methods for accessing the DBC microservice via REST using basic HTTP + * authentication. + * + */ +public class DbcUsvcRestClient implements DmaapAccessService { + + public static final String endpointPath = "/dmaap_access"; + private final String baseUrl; + private final RestTemplate restTemplate; + + /** + * Builds a restTemplate that uses basic HTTP authentication for use by all + * methods in this class. + * + * @param webapiUrl + * @param user + * @param pass + */ + public DbcUsvcRestClient(String webapiUrl, String user, String pass) { + if (webapiUrl == null || user == null || pass == null) + throw new IllegalArgumentException("Nulls not permitted"); + + baseUrl = webapiUrl; + URL url = null; + try { + url = new URL(baseUrl); + } catch (MalformedURLException ex) { + throw new RuntimeException("Failed to parse URL", ex); + } + final HttpHost httpHost = new HttpHost(url.getHost(), url.getPort()); + + // Build a client with a credentials provider + CredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials(new AuthScope(httpHost), new UsernamePasswordCredentials(user, pass)); + HttpClientBuilder clientBuilder = HttpClientBuilder.create(); + CloseableHttpClient httpClient = clientBuilder.setDefaultCredentialsProvider(credsProvider).build(); + + // Create request factory with our superpower client + HttpComponentsClientHttpRequestFactoryBasicAuth requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth( + httpHost); + requestFactory.setHttpClient(httpClient); + + // Put the factory in the template + this.restTemplate = new RestTemplate(); + restTemplate.setRequestFactory(requestFactory); + } + + /** + * Gets the count of DMaaP access profiles. + * + * @return Number of access profiles in the database. + */ + public int getDmaapAccessCount() { + String url = baseUrl + "/count_dmaap_access"; + ResponseEntity daResponse = restTemplate.exchange(url, HttpMethod.GET, null, + DbcUsvcRestResponse.class); + DbcUsvcRestResponse response = daResponse.getBody(); + return response.getStatus(); + } + + /** + * Gets the DMaaP access profiles for the specified userId. + * + * @param userId + * @return List of DmaapAccess items + */ + @Override + public List getDmaapAccessList(final String userId) { + String url = baseUrl + endpointPath + "?userId=" + userId; + // ResponseEntity responseEntity = + // restTemplate.getForEntity(url, Object[].class); + // MediaType contentType = responseEntity.getHeaders().getContentType(); + // HttpStatus statusCode = responseEntity.getStatusCode(); + // Object[] objects = responseEntity.getBody(); + ResponseEntity> daResponse = restTemplate.exchange(url, HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }); + List daList = daResponse.getBody(); + return daList; + } + + /** + * Gets the specified DMaaP access profile. + */ + @Override + public DmaapAccess getDmaapAccess(Long dmaapId) { + String url = baseUrl + endpointPath + "?dmaapId=" + dmaapId; + ResponseEntity daResponse = restTemplate.exchange(url, HttpMethod.GET, null, + new ParameterizedTypeReference() { + }); + DmaapAccess da = daResponse.getBody(); + return da; + } + + /** + * POSTs or PUTs the DMaaP access profile as needed, based on whether the + * object's ID field is set. If not set it creates a new row; if set, it + * updates a row in the remote service table. + * + * @param dmaapAccess + */ + @Override + public void saveDmaapAccess(final DmaapAccess dmaapAccess) { + if (dmaapAccess.getId() == null) { + String url = baseUrl + endpointPath; + restTemplate.postForObject(url, dmaapAccess, String.class); + } else { + String url = baseUrl + endpointPath + "/" + Long.toString(dmaapAccess.getId()); + restTemplate.put(url, dmaapAccess); + } + } + + /** + * Deletes the new DMaaP access profile row in the remote service table. + * + * @param id + */ + @Override + public void deleteDmaapAccess(final Long id) { + String url = baseUrl + endpointPath + "/" + Long.toString(id); + restTemplate.delete(url); + } + + /** + * Simple test + * + * @param args + * @throws Exception + */ + public static void main(String[] args) throws Exception { + if (args.length != 1) + throw new IllegalArgumentException("Single argument expected: userid"); + DbcUsvcRestClient client = new DbcUsvcRestClient("http://localhost:8081/dbus", "dbus_user", "dbus_pass"); + final String userId = args[0]; + System.out.println("Requesting profiles for user " + userId); + List access = client.getDmaapAccessList(userId); + if (access == null) + System.err.println("Received null"); + else + for (DmaapAccess da : access) + System.out.println(da); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java new file mode 100644 index 0000000..50e37d8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java @@ -0,0 +1,61 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.rest; + +/** + * Models the responses sent by the micro service in JSON format. + */ +public class DbcUsvcRestResponse { + + private int status; + private String data, error, exception; + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getException() { + return exception; + } + + public void setException(String exception) { + this.exception = exception; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java new file mode 100644 index 0000000..dd70d48 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java @@ -0,0 +1,65 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.rest; + +import java.net.URI; + +import org.apache.http.HttpHost; +import org.apache.http.client.AuthCache; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.springframework.http.HttpMethod; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; + +/** + * Utility class to enable Basic HTTP Authentication with Spring REST templates. + * + * From: + * http://www.baeldung.com/2012/04/16/how-to-use-resttemplate-with-basic-authentication-in-spring-3-1/ + */ +public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory { + + private HttpHost host; + + public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) { + super(); + this.host = host; + } + + protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { + return createHttpContext(); + } + + private HttpContext createHttpContext() { + // Create AuthCache instance + AuthCache authCache = new BasicAuthCache(); + // Generate BASIC scheme object and add it to the local auth cache + BasicScheme basicAuth = new BasicScheme(); + authCache.put(host, basicAuth); + + // Add AuthCache to the execution context + BasicHttpContext localcontext = new BasicHttpContext(); + localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); + return localcontext; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java new file mode 100644 index 0000000..e0bf0b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessService.java @@ -0,0 +1,72 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.service; + +import java.util.List; + +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; + +/** + * Defines methods to manipulate the database table with DmaapAccess domain + * objects. No method throws a checked exception, in keeping with the Spring + * philosophy of throwing unchecked exceptions. + */ +public interface DmaapAccessService { + + /** + * Gets the number of Dmaap Access entries. + * + * @return Number of rows in the table. + */ + int getDmaapAccessCount(); + + /** + * Gets all DMaaP access rows in the table for the specified user. + * + * @param userId + * UID of the user + * @return List of DMaaP instance objects, which may be empty. + */ + List getDmaapAccessList(String userId); + + /** + * Gets the DMaaP access object with the specified row ID. + * + * @param dmaapId + * @return DMaap instance; null if none exists. + */ + DmaapAccess getDmaapAccess(Long dmaapId); + + /** + * Creates a new managed object (a new row in the table). + * + * @param dmaap + * DMaaP instance to create. + */ + void saveDmaapAccess(DmaapAccess dmaap); + + /** + * Deletes the DMaaP access row with the specified ID. + * + * @param dmaapId + */ + void deleteDmaapAccess(Long dmaapId); + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java new file mode 100644 index 0000000..a7e5185 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java @@ -0,0 +1,86 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.service; + +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Restrictions; +import org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess; +import org.openecomp.portalsdk.core.service.DataAccessService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Hibernate-assisted methods to manipulate the DBCA_DMAAP table. + */ +@Service("dmaapAccessService") +@Transactional +public class DmaapAccessServiceImpl implements DmaapAccessService { + + @Autowired + private DataAccessService dataAccessService; + + public DataAccessService getDataAccessService() { + return dataAccessService; + } + + public void setDataAccessService(DataAccessService dataAccessService) { + this.dataAccessService = dataAccessService; + } + + @SuppressWarnings("unchecked") + @Override + public int getDmaapAccessCount() { + List accesses = (List) getDataAccessService().getList(DmaapAccess.class, null); + return accesses.size(); + } + + @SuppressWarnings("unchecked") + @Override + public List getDmaapAccessList(String userId) { + List restrictionsList = new ArrayList(); + Criterion criterion1 = Restrictions.eq("userId", userId); + restrictionsList.add(criterion1); + List accesses = (List) getDataAccessService().getList(DmaapAccess.class, null, + restrictionsList, null); + return accesses; + } + + @Override + public DmaapAccess getDmaapAccess(Long dmaapId) { + return (DmaapAccess) getDataAccessService().getDomainObject(DmaapAccess.class, dmaapId, null); + } + + @Override + public void saveDmaapAccess(DmaapAccess dmaap) { + getDataAccessService().saveDomainObject(dmaap, null); + } + + @Override + public void deleteDmaapAccess(Long dmaapId) { + DmaapAccess dmaapAccess = getDmaapAccess(dmaapId); + if (dmaapAccess != null) + getDataAccessService().deleteDomainObject(dmaapAccess, null); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java new file mode 100644 index 0000000..d2acf3e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/dmaapbc/dbcapp/util/DbcappProperties.java @@ -0,0 +1,88 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.dmaapbc.dbcapp.util; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; + +/** + * Publishes a list of constants and methods to access the properties that are + * read by Spring from the specified configuration file(s). + * + * Should be used like this (and never in a constructor): + * + *
+ * @Autowired
+ * DbcappProperties properties;
+ * 
+ */ +@Configuration +@PropertySource(value = { "${container.classpath:}/WEB-INF/dbcapp/dbcapp.properties" }) +public class DbcappProperties { + + public static final String DMAAP_REST_URL_LIST = "dmaap.rest.url.list"; + public static final String DMAAP_MECHID_NAME = "dmaap.mechid.name"; + public static final String DMAAP_MECHID_PASSWORD = "dmaap.mechid.password"; + public static final String PROFILE_ACCESS_METHOD = "profile.access.method"; + public static final String PROFILE_USVC_URL = "profile.microservice.url"; + public static final String PROFILE_USVC_USER = "profile.microservice.user.name"; + public static final String PROFILE_USVC_PASS = "profile.microservice.user.password"; + + private Environment environment; + + public DbcappProperties() { + } + + protected Environment getEnvironment() { + return environment; + } + + @Autowired + public void setEnvironment(final Environment environment) { + this.environment = environment; + } + + public boolean containsProperty(String key) { + return environment.containsProperty(key); + } + + public String getProperty(String key) { + return environment.getRequiredProperty(key); + } + + /** + * Gets the values for a comma-separated list property value as a String + * array. + * + * @param key + * @return Array of values with leading and trailing whitespace removed; + * null if key is not found. + */ + public String[] getCsvListProperty(final String key) { + String listVal = getProperty(key); + if (listVal == null) + return null; + String[] vals = listVal.split("\\s*,\\s*"); + return vals; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java new file mode 100644 index 0000000..fc0a54a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppConfig.java @@ -0,0 +1,203 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.conf; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.openecomp.fusionapp.uebhandler.InitUebHandler; +import org.openecomp.fusionapp.uebhandler.MainUebHandler; +import org.openecomp.fusionapp.uebhandler.WidgetNotificationHandler; +import org.openecomp.portalsdk.core.conf.AppConfig; +import org.openecomp.portalsdk.core.conf.Configurable; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager; +import org.openecomp.portalsdk.core.service.DataAccessService; +import org.openecomp.portalsdk.core.util.CacheManager; +import org.openecomp.portalsdk.core.util.SystemProperties; +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.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; + +/** + * Configures Spring features in the DMaaP Bus Control web application. + * Subclasses the ECOMP Portal SDK core AppConfig class to reuse interceptors, + * view resolvers and other features defined there. + */ +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = { "org.openecomp" } ) +@PropertySource(value = { "${container.classpath:}/WEB-INF/conf/app/test.properties" }, ignoreResourceNotFound = true) +@Profile("src") +@EnableAsync +@EnableScheduling +public class ExternalAppConfig extends AppConfig implements Configurable { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ExternalAppConfig.class); + + // private RegistryAdapter schedulerRegistryAdapter; + + @Configuration + @Import(SystemProperties.class) + static class InnerConfiguration { + } + + /** + * @see org.openecomp.portalsdk.core.conf.AppConfig#viewResolver() + */ + public ViewResolver viewResolver() { + return super.viewResolver(); + } + + /** + * @see org.openecomp.portalsdk.core.conf.AppConfig#addResourceHandlers(ResourceHandlerRegistry) + * + * @param registry + */ + public void addResourceHandlers(ResourceHandlerRegistry registry) { + super.addResourceHandlers(registry); + } + + /** + * @see org.openecomp.portalsdk.core.conf.AppConfig#dataAccessService() + */ + public DataAccessService dataAccessService() { + return super.dataAccessService(); + } + + /** + * Creates a new list with entries that are external app + * definitions.xml paths. + * + * @return List of String + */ + public List addTileDefinitions() { + List definitions = new ArrayList(); + definitions.add("/WEB-INF/defs/definitions.xml"); + definitions.add("/WEB-INF/dbcapp/dbcapp-definitions.xml"); + if (logger.isDebugEnabled()) + logger.debug(EELFLoggerDelegate.debugLogger, "addTileDefinitions: list is " + definitions); + 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(); + } + + @PostConstruct + public void initGlobalLocalContext() { + // logger.init(); + } + + + /** + * Creates and returns a new instance of a {@link MainUebHandler}. + * + * @return New instance of {@link MainUebHandler}. + */ + @Bean + public MainUebHandler mainUebHandler() { + + return new MainUebHandler(); + } + + /** + * Creates and returns a new instance of a {@link InitUebHandler}. + * + * @return New instance of {@link InitUebHandler}. + */ + @Bean + public InitUebHandler initUebHandler() { + + return new InitUebHandler(); + } + + /** + * Creates and returns a new instance of a {@link WidgetNotificationHandler} + * . + * + * @return New instance of {@link WidgetNotificationHandler}. + */ + @Bean + public WidgetNotificationHandler widgetNotificationHandler() { + return new WidgetNotificationHandler(); + } + + /** + * Creates and returns a new instance of a {@link SchedulerFactoryBean} and + * populates it with triggers. + * + * @return New instance of {@link SchedulerFactoryBean} + * @throws Exception + */ + // APPLICATIONS REQUIRING QUARTZ SHOULD RESTORE ANNOTATION + /* + @Bean // ANNOTATION COMMENTED OUT + 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; + } + */ +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java new file mode 100644 index 0000000..f9d5065 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/ExternalAppInitializer.java @@ -0,0 +1,60 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.conf; + +import java.util.Arrays; + +import org.openecomp.portalsdk.core.conf.AppInitializer; + +public class ExternalAppInitializer extends AppInitializer{ + + + @Override + protected Class[] getRootConfigClasses() { + return super.getRootConfigClasses(); + } + + @Override + protected Class[] getServletConfigClasses() { +// Class[] configClasses = super.getServletConfigClasses(); +// Class[] additionalConfigClasses = Arrays.copyOf(configClasses, configClasses.length); +// addConfigClass(additionalConfigClasses, ExternalAppConfig.class); +// return additionalConfigClasses; +// + return new Class[] {ExternalAppConfig.class}; + } + + static Class[] addConfigClass(Class[] a, Class e) { + a = Arrays.copyOf(a, a.length + 1); + a[a.length - 1] = e; + return a; + } + + /* + * URL request will direct to the Spring dispatcher for processing + */ + @Override + protected String[] getServletMappings() { + return super.getServletMappings(); + } + +} + + diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java new file mode 100644 index 0000000..bac61a6 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/conf/HibernateMappingLocations.java @@ -0,0 +1,45 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.conf; + +import org.openecomp.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 { + + public Resource[] getMappingLocations() { + return new Resource[] { + // Path is relative to WEB-INF/conf; + // a leading slash gets stripped so don't bother. + new ClassPathResource("../fusion/orm/Fusion.hbm.xml"), + // DBC does not use workflow nor RCloud + // new ClassPathResource("../fusion/orm/Workflow.hbm.xml"), + // new ClassPathResource("../fusion/orm/RNoteBookIntegration.hbm.xml"), + new ClassPathResource("../dbcapp/dbcapp.hbm.xml") + }; + } + + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java new file mode 100644 index 0000000..2a4c6d5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/AngularSinglePageController.java @@ -0,0 +1,48 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.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 for a single-page application sample. The view is restricted to + * authenticated users. The named view resolves to page singlePageSample.html, + * which uses Angular. + */ +@Controller +@RequestMapping("/") +public class AngularSinglePageController extends RestrictedBaseController { + + @RequestMapping(value = { "/singlePageSample" }, method = RequestMethod.GET) + public ModelAndView view(HttpServletRequest request) { + Map model = new HashMap(); + return new ModelAndView("single_page_sample", "model", model); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java new file mode 100644 index 0000000..371284c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/CallflowController.java @@ -0,0 +1,44 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import org.openecomp.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 for a message sequence chart view. The view is restricted to + * authenticated users. The view name defaults to the request name with no + * suffix, "callflow", which resolves to page details.jsp. That page is an + * iframe around page details.html. + */ +@Controller +@RequestMapping("/") +public class CallflowController extends RestrictedBaseController { + + @RequestMapping(value = { "/callflow" }, method = RequestMethod.GET) + public ModelAndView plot() { + final String defaultViewName = null; + return new ModelAndView(defaultViewName); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java new file mode 100644 index 0000000..5b59aa9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/ElasticSearchController.java @@ -0,0 +1,128 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import java.io.IOException; + +import org.json.JSONObject; +import org.openecomp.fusionapp.model.Result; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import io.searchbox.client.JestClient; +import io.searchbox.client.JestClientFactory; +import io.searchbox.client.config.HttpClientConfig; +import io.searchbox.core.Search; +import io.searchbox.core.SearchResult; +import io.searchbox.core.Suggest; +import io.searchbox.core.SuggestResult; +import io.searchbox.params.Parameters; + +/** + * Controller for views that demonstrate Elastic Search features. + */ +@RestController +public class ElasticSearchController extends RestrictedBaseController{ + + @RequestMapping(value = {"/es_search_demo" }, method = RequestMethod.GET) + public ModelAndView search() { + return new ModelAndView("es_search_demo"); + } + + @RequestMapping(value = {"/es_suggest_demo" }, method = RequestMethod.GET) + public ModelAndView suggest() { + return new ModelAndView("es_suggest_demo"); + } + + @RequestMapping(value="/es_suggest/{task}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doSuggest(@PathVariable("task") String task) throws IOException { + JSONObject obj = new JSONObject(task); + String searchTerm = obj.getString("data"); + String searchSize = obj.getString("size"); + String searchFuzzy = obj.getString("fuzzy"); + String resultName = obj.getString("resultname"); + + JestClientFactory factory = new JestClientFactory(); + factory.setHttpClientConfig(new HttpClientConfig + .Builder("http://host:9200") + .multiThreaded(true) + .build()); + JestClient client = factory.getObject(); + + + Suggest suggest = new Suggest.Builder("{\n" + +"\"" + resultName +"\" : {\n" + +"\"text\" : \""+ searchTerm +"\",\n" + +"\"completion\" : {\n" + +"\"field\" : \"suggest\",\n" + +"\"size\" : " + searchSize + ",\n" + +"\"fuzzy\" : \"" + searchFuzzy + "\"\n" + +"}\n" + +"}\n" + +"}").addIndex("customer").build(); + + SuggestResult result = client.execute(suggest); + System.err.println(result.getJsonObject().toString()); + return new ResponseEntity(new Result(result.getJsonObject().toString()),HttpStatus.OK); + } + + @RequestMapping(value="/es_search/{task}",method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity doSearch(@PathVariable("task") String task) throws IOException { + JSONObject obj = new JSONObject(task); + String searchTerm = obj.getString("data"); + String searchSize = obj.getString("size"); + // String searchFuzzy = obj.getString("fuzzy"); + + JestClientFactory factory = new JestClientFactory(); + factory.setHttpClientConfig(new HttpClientConfig + .Builder("http://host:9200") + .multiThreaded(true) + .build()); + JestClient client = factory.getObject(); + + Search search = new Search.Builder("{\n" + +"\"query\" : {\n" + +"\"query_string\" : {\n" + +"\"query\" : \"name:"+ searchTerm +"\"\n" + +"}\n" + +"}\n" + +"}").addIndex("customer").setParameter(Parameters.SIZE,Integer.valueOf(searchSize)).build(); + + SearchResult result = client.execute(search); + System.err.println(result.getJsonObject().toString()); + return new ResponseEntity(new Result(result.getJsonObject().toString()),HttpStatus.OK); + } + + public ResponseEntity sendResult(Result result) { + return new ResponseEntity(result, HttpStatus.OK); + } + + @Override + public boolean isRESTfulCall() { + return true; + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java new file mode 100644 index 0000000..3c461be --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/LeafletMapContoller.java @@ -0,0 +1,43 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import org.openecomp.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 for geographic map view. The view is restricted to authenticated + * users. The view name defaults to the request name with no suffix, + * "leafletMap", which resolves to page leafletMap.jsp. + */ +@Controller +@RequestMapping("/") +public class LeafletMapContoller extends RestrictedBaseController { + + @RequestMapping(value = { "/leafletMap" }, method = RequestMethod.GET) + public ModelAndView plot() { + final String defaultViewName = null; + return new ModelAndView(defaultViewName); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java new file mode 100644 index 0000000..fedd95f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/NetMapController.java @@ -0,0 +1,57 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.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 for a network map view that uses iframes. The view is restricted + * to authenticated users. + */ +@Controller +@RequestMapping("/") +public class NetMapController extends RestrictedBaseController { + + @RequestMapping(value = { "/net_map" }, method = RequestMethod.GET) + public ModelAndView plot(HttpServletRequest request) { + Map model = new HashMap(); + model.put("frame_int", "net_map_int"); + // This view resolves to page frame_insert.jsp + return new ModelAndView("frame_insert", model); + } + + @RequestMapping(value = { "/net_map_int" }, method = RequestMethod.GET) + public ModelAndView plot2() { + // The view name defaults to the request without any suffix. + final String defaultViewName = null; + // This view resolves to page net_map.jsp + return new ModelAndView(defaultViewName); + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java new file mode 100644 index 0000000..0fd902e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/PostDroolsController.java @@ -0,0 +1,138 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.JSONObject; +import org.openecomp.portalsdk.core.command.PostDroolsBean; +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.service.PostDroolsService; +import org.openecomp.portalsdk.core.web.support.JsonMessage; +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; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Controller +@RequestMapping("/") +public class PostDroolsController extends RestrictedBaseController{ + + @Autowired + private PostDroolsService postDroolsService; + + @RequestMapping(value = {"/drools" }, method = RequestMethod.GET) + public ModelAndView drools(HttpServletRequest request) { + + return new ModelAndView(getViewName()); + } + + + @RequestMapping(value = {"/getDrools" }, method = RequestMethod.GET) + public void getDrools(HttpServletRequest request, HttpServletResponse response) { + // Map model = new HashMap(); + + ObjectMapper mapper = new ObjectMapper(); + try { + List beanList = postDroolsService.fetchDroolBeans(); + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(beanList)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @RequestMapping(value = {"/getDroolDetails" }, method = RequestMethod.GET) + public void getDroolDetails(HttpServletRequest request, HttpServletResponse response) { + + ObjectMapper mapper = new ObjectMapper(); + try { + + PostDroolsBean postDroolsBean = new PostDroolsBean(); + String selectedFile = request.getParameter("selectedFile"); + postDroolsBean.setDroolsFile(selectedFile);//sample populated + //postDroolsBean.setSelectedRules("[\"NJ\",\"NY\",\"KY\"]"); + postDroolsBean.setClassName(postDroolsService.retrieveClass(selectedFile)); + + JsonMessage msg = new JsonMessage(mapper.writeValueAsString(postDroolsBean)); + JSONObject j = new JSONObject(msg); + response.getWriter().write(j.toString()); + + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @RequestMapping(value = {"/post_drools/execute" }, method = RequestMethod.POST) + public ModelAndView search(HttpServletRequest request, + HttpServletResponse response) throws Exception { + try { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + JsonNode root = mapper.readTree(request.getReader()); + PostDroolsBean postDroolsBean = mapper.readValue(root.get("postDroolsBean").toString(), PostDroolsBean.class); + + String resultsString = postDroolsService.execute(postDroolsBean.getDroolsFile(), postDroolsBean.getClassName(), postDroolsBean.getSelectedRules()); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application / json"); + request.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + //String responseString = mapper.writeValueAsString(resultsString); + JSONObject j = new JSONObject("{resultsString: "+resultsString+"}"); + + out.write(j.toString()); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return null; + } + + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java new file mode 100644 index 0000000..cf5feb8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/UserProfileController.java @@ -0,0 +1,73 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.openecomp.portalsdk.core.domain.Profile; +import org.openecomp.portalsdk.core.service.ProfileService; +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; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Controller for user profile view. The view is restricted to authenticated + * users. The view name resolves to page user_profile.jsp which uses Angular. + */ + +@Controller +@RequestMapping("/") +public class UserProfileController extends RestrictedBaseController { + + @Autowired + ProfileService service; + + @RequestMapping(value = { "/user_profile" }, method = RequestMethod.GET) + public ModelAndView ProfileSearch(HttpServletRequest request) { + Map model = new HashMap(); + ObjectMapper mapper = new ObjectMapper(); + List profileList = service.findAll(); + try { + model.put("customerInfo", mapper.writeValueAsString(profileList)); + } catch (JsonGenerationException e) { + e.printStackTrace(); + } catch (JsonMappingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return new ModelAndView("user_profile", "model", model); + } + +} + diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java new file mode 100644 index 0000000..510d154 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/controller/WelcomeController.java @@ -0,0 +1,44 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.controller; + +import javax.servlet.http.HttpServletRequest; + +import org.openecomp.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 for welcome view. The view is restricted to authenticated users. + * If no view name is provided, the view name defaults to the request name with + * no suffix, "welcome", which is resolved by consulting a definitions.xml file. + */ +@Controller +@RequestMapping("/") +public class WelcomeController extends RestrictedBaseController { + @RequestMapping(value = { "/welcome" }, method = RequestMethod.GET) + public ModelAndView welcome(HttpServletRequest request) { + // The ECOMP SDK controller process_csp always redirects + // to welcome.htm, so map it to something useful. + return new ModelAndView("dbc_home_tdkey"); + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java new file mode 100644 index 0000000..9dfd546 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/model/Result.java @@ -0,0 +1,37 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.model; + +public class Result { + private String result; + + public Result(String result) { + this.result = result; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java new file mode 100644 index 0000000..d6e5193 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java @@ -0,0 +1,34 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.service; + +import org.openecomp.portalsdk.core.domain.User; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service("adminAuthExtension") +@Transactional +public class AdminAuthExtension { + + public void saveUserExtension(User user){ + //app's developer implement their own logic here, like updating app's related tables + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java new file mode 100644 index 0000000..1b50693 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/InitUebHandler.java @@ -0,0 +1,73 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.uebhandler; + +import java.util.concurrent.ConcurrentLinkedQueue; + +import javax.annotation.PostConstruct; + +import org.openecomp.portalsdk.core.logging.format.AlarmSeverityEnum; +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiConstants; +import org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiProperties; +import org.openecomp.portalsdk.core.onboarding.ueb.UebManager; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsg; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; + +// +// Adding this class for the sole purpose of insuring that the MainUebHandler really +// honors @Async and kicks off a thread. For more info google @Async and read about +// @Async only working if called from different class. +// +@Configuration +public class InitUebHandler { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(InitUebHandler.class); + + + @Autowired + MainUebHandler mainUebHandler; + + public InitUebHandler() { + + } + + @PostConstruct + public void initUeb() { + + try { + String enableListenerThread = PortalApiProperties.getProperty(PortalApiConstants.UEB_LISTENERS_ENABLE); + if (enableListenerThread.equalsIgnoreCase("true")) { + ConcurrentLinkedQueue inboxQueue = new ConcurrentLinkedQueue(); + UebManager.getInstance().initListener(inboxQueue); + mainUebHandler.runHandler(inboxQueue); + logger.info(EELFLoggerDelegate.debugLogger, ("Returned from initiating mainUebHandler...")); + } + else { + logger.info(EELFLoggerDelegate.debugLogger, ("Not starting UEB listening thread because ueb_listeners_enable is not set to true in the properties file.")); + } + } + catch (Exception e) { + logger.error(EELFLoggerDelegate.debugLogger, ("Not starting UEB listening thread because property could not be read " + PortalApiConstants.UEB_LISTENERS_ENABLE),AlarmSeverityEnum.MAJOR); + } + + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java new file mode 100644 index 0000000..604880b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/MainUebHandler.java @@ -0,0 +1,104 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.uebhandler; + +import java.util.concurrent.ConcurrentLinkedQueue; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsg; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsgTypes; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +//------------------------------------------------------------------------- +// Listens for received UEB messages and handles the messages +// +// Note: To implement a synchronous reply call getMsgId on the request +// and putMsgId on the reply (echoing the request MsgId). +// +//------------------------------------------------------------------------- +@Component("MainUebHandler") +public class MainUebHandler { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MainUebHandler.class); + + + ConcurrentLinkedQueue inboxQueue = null; + + @Autowired + WidgetNotificationHandler widgetNotificationHandler; + + @Async + public void runHandler(ConcurrentLinkedQueue queue) { + inboxQueue = queue; + + logger.info(EELFLoggerDelegate.debugLogger, ("==> MainUebHandler started")); + + while (true) { + UebMsg msg = null; + while ((msg = inboxQueue.poll()) != null) { + if (msg.getMsgType() != null) { + logger.debug(EELFLoggerDelegate.debugLogger, ("<== Received UEB message : " + msg.toString())); + + switch (msg.getMsgType()) { + /* + * Add your own defined handler objects, use @Component for + * the class. See WidgetNotificationHandler as an example. + * + * Use @Async on methods for performance + * + * For syncronous replies use UebManager publishReply and + * echo back the msgId in your response ie + * msg.putMsgId(requestMsg.getMsgId()) + * + * case UebMsgTypes.UEB_MSG_TYPE_XYZ: { + * XYZHandler.handleMsg(msg); break; } + */ + case UebMsgTypes.UEB_MSG_TYPE_WIDGET_NOTIFICATION: { + widgetNotificationHandler.handleWidgetNotification(msg); + break; + } + default: { + + logger.info(EELFLoggerDelegate.debugLogger, ("Unknown message type [" + msg.getMsgType() + "] from " + msg.getSourceTopicName())); + + break; + } + } + } + } + + if (Thread.interrupted()) { + + logger.info(EELFLoggerDelegate.debugLogger, ("==> UebMainHandler exiting")); + + break; + } + + try { + Thread.sleep(10); + } catch (InterruptedException e) { + logger.info(EELFLoggerDelegate.debugLogger, ("UebMainHandler interrupted during sleep" + e.getMessage())); + + } + } + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java new file mode 100644 index 0000000..9b0ff58 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/uebhandler/WidgetNotificationHandler.java @@ -0,0 +1,46 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.uebhandler; + +import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.openecomp.portalsdk.core.onboarding.ueb.UebMsg; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +@Component +public class WidgetNotificationHandler { + + EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(WidgetNotificationHandler.class); + + + public WidgetNotificationHandler() { + } + + @Async + public void handleWidgetNotification(UebMsg requestMsg) { + logger.debug(EELFLoggerDelegate.debugLogger, ("handleWidgetNotification received notification: " + requestMsg.toString())); + /* + * Here the notification msg can be handled + * + * requestMsg.getPayload() - returns string that contains the + * Application defined content + */ + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java new file mode 100644 index 0000000..760460f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java @@ -0,0 +1,54 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.util; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.filter.Filter; +import ch.qos.logback.core.spi.FilterReply; + +/** + * Custom Filter class bind with logback.xml + * configuration file to strip out certain log messages + * coming out of special packages or classes. + * + */ +public class CustomLoggingFilter extends Filter { + + /** + * Custom Filter is added to strip out the continuous U-EB logging messages + * But make sure we log the ERROR & WARNING Level messages. + */ + @Override + public FilterReply decide(ILoggingEvent event) { + try { + if ((event.getLevel() != Level.ERROR || event.getLevel() != Level.WARN) && + (event.getThreadName().equalsIgnoreCase("UEBConsumerThread")) && + (event.getLoggerName().contains("com.att.nsa") || event.getLoggerName().contains("org.apache.http")) + ) { + return FilterReply.DENY; + } else { + return FilterReply.NEUTRAL; + } + } catch(Exception e) { + return FilterReply.NEUTRAL; + } + } +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java new file mode 100644 index 0000000..9bdff16 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/LoggerDemo.java @@ -0,0 +1,48 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.LoggerContext; + +public class LoggerDemo { + + private static final Logger log = LoggerFactory.getLogger(LoggerDemo.class); + + public static void main(String[] args) { + new LoggerDemo().new Parent().hello(); + new LoggerDemo().new Child().hello(); + // Flush messages before shutting down async logger + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + loggerContext.stop(); + } + + public class Parent { + public void hello() { + log.info("Hello from " + getClass().getSimpleName()); + } + } + + public class Child extends Parent { + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java new file mode 100644 index 0000000..cd327b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/java/org/openecomp/fusionapp/util/ValidateEncodingApp.java @@ -0,0 +1,203 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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.openecomp.fusionapp.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; + +/** + * Reads bytes from file using a decoder that throws an exception if the bytes + * cannot be decoded as UTF-8. Can be used to validate a single file or a + * directory of files with full recursion. Includes a feature to create a file + * with a non-UTF-8 byte sequence for testing. + */ +public class ValidateEncodingApp { + + private final String charsetName; + private final CharsetDecoder decoder; + private int filesPassed = 0, filesFailed = 0; + + /** + * Obtains a decoder and configures it to blow up on problems. + * + * @param charsetName + * Name of character set to use; e.g., UTF-8 + */ + public ValidateEncodingApp(String charsetName) { + this.charsetName = charsetName; + Charset charset = Charset.forName(charsetName); + decoder = charset.newDecoder(); + decoder.onMalformedInput(CodingErrorAction.REPORT); + decoder.onUnmappableCharacter(CodingErrorAction.REPORT); + } + + /** + * @return The character set name supplied to the constructor + */ + public String getCharsetName() { + return charsetName; + } + + /** + * @return The number of files that could not be validated for whatever + * reason. + */ + public int getFilesFailed() { + return filesFailed; + } + + /** + * @return The number of files successfully validated. + */ + public int getFilesPassed() { + return filesPassed; + } + + /** + * Reads and decodes bytes from the specified file, which will find byte + * sequences that cannot be decoded using the current system. Traps all + * exceptions and reports to System.err. + * + * @param file + * @return True on success, false on IOException or decoding error + */ + private boolean validateFile(File file) { + boolean result = true; + int lineNr = 1; + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(new FileInputStream(file), decoder)); + while (br.readLine() != null) + ++lineNr; + ++filesPassed; + } catch (CharacterCodingException ex) { + ++filesFailed; + System.err.println("Failed at line " + lineNr + ", file " + file.getPath() + ": " + ex.toString()); + result = false; + } catch (IOException ex) { + ++filesFailed; + System.err.println("Failed to read file " + file.getPath() + ": " + ex.toString()); + result = false; + } finally { + if (br != null) + try { + br.close(); + } catch (IOException ex) { + System.err.println("Failed to close file: " + ex.toString()); + } + } + return result; + } + + /** + * Validates all files in the specified directory. Optionally recurses into + * subdirectories. Prints message to stdout when it starts and again when it + * finishes traversing a directory. + * + * @param dir + * Directory to traverse. + * @param isRecurse + * If true, will call itself to process subdirectories. + * @throws Exception + */ + private void validateDirectory(File dir, boolean isRecurse) throws Exception { + if (!dir.exists() || !dir.isDirectory()) + throw new IllegalArgumentException("Not found or not a directory: " + dir.getPath()); + System.out.println("Entering directory " + dir.getPath()); + File[] contents = dir.listFiles(); + for (File f : contents) { + if (f.isFile()) + validateFile(f); + else if (f.isDirectory() && isRecurse) + validateDirectory(f, isRecurse); + } + System.out.println("Leaving directory " + dir.getPath()); + } + + /** + * Prints message(s) and exits + * + * @param msg + */ + private static void usage(String msg) { + if (msg != null) + System.err.println(msg); + System.err.println("Usage: ValidateEncodingApp -validate (file|dir)"); + System.err.println(" ValidateEncodingApp -create filename"); + System.exit(0); + } + + public static void main(String[] args) throws Exception { + + // TODO: extend to accept encoding system name + // and recurse option as arguments. + String charsetName = "UTF-8"; + boolean recurse = true; + + if (args.length != 2) + usage("Unexpected number of arguments"); + + String cmd = args[0]; + File file = new File(args[1]); + + if ("-create".equals(cmd)) { + if (file.exists()) + usage("Will not overwrite existing file: " + file.getPath()); + System.out.println("Creating file with ISO-8859-1 content: " + file.getPath()); + try { + // The word "dolt" has an o with a diagonal slash thru it. + // The slash-o is valid in ISO-8859-1 but not in UTF-8. + final byte[] invalid = "d\u00f8lt\n".getBytes("iso-8859-1"); + FileOutputStream fis = new FileOutputStream(file); + fis.write(invalid); + fis.close(); + } catch (IOException ex) { + System.err.println("Failed to write file: " + ex.toString()); + } + } else if ("-validate".equals(cmd)) { + if (!file.exists()) + usage("Not found: " + file.getPath()); + + ValidateEncodingApp validator = new ValidateEncodingApp(charsetName); + if (file.isFile()) { + System.out.println("Validating decoding of bytes as " + charsetName + " for file " + file.getPath()); + validator.validateFile(file); + } else { + System.out.println("Validating decoding of bytes as " + charsetName + " for files in/below directory " + + file.getPath()); + validator.validateDirectory(file, recurse); + } + System.out.println("Validation success count is " + validator.getFilesPassed()); + System.out.println("Validation failure count is " + validator.getFilesFailed()); + } else { + usage("Unexpected command: " + cmd); + } + + } + +} diff --git a/dcae_dmaapbc_webapp/src/main/resources/att-rules.drl b/dcae_dmaapbc_webapp/src/main/resources/att-rules.drl new file mode 100644 index 0000000..e15c3fb --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/att-rules.drl @@ -0,0 +1,16 @@ +package org.openecomp.portalsdk.core.drools; + + +rule "Drools NJ" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NJ" ) +then +$droolsRuleService.setResultsString("NJ state :" + " Garden State"); +end + +rule "Drools NY" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NY" ) +then +$droolsRuleService.setResultsString("NY state :" + " Empire State"); +end diff --git a/dcae_dmaapbc_webapp/src/main/resources/cache.ccf b/dcae_dmaapbc_webapp/src/main/resources/cache.ccf new file mode 100644 index 0000000..d21404b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/cache.ccf @@ -0,0 +1,30 @@ +# DEFAULT CACHE REGION +jcs.default=DC +jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes +jcs.default.cacheattributes.MaxObjects=1000 +jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache +jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes +jcs.default.elementattributes.IsEternal=true +jcs.default.elementattributes.IsSpool=true + + +# MEMORY SHRINKING CONFIGURATION (Commented) +#jcs.default.cacheattributes.UseMemoryShrinker=true +#jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600 +#jcs.default.cacheattributes.ShrinkerIntervalSeconds=60 +#jcs.default.cacheattributes.MaxSpoolPerRun=500 +#jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes +#jcs.default.elementattributes.IsEternal=false + + +# AUXILLARY CACHE CONFIGURATION +jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory +jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes +jcs.auxiliary.DC.attributes.DiskPath=/tmp + + +# PRE-DEFINED REGION FOR LOOKUP DATA +jcs.region.lookUpObjectCache=DC +jcs.region.lookUpObjectCache.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes +jcs.region.lookUpObjectCache.cacheattributes.MaxObjects=4000 +jcs.region.lookUpObjectCache.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache diff --git a/dcae_dmaapbc_webapp/src/main/resources/logback.xml b/dcae_dmaapbc_webapp/src/main/resources/logback.xml new file mode 100644 index 0000000..65746ed --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/logback.xml @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${defaultLoggerPattern} + + + + + + + + + + + + ${logDirectory}/${generalLogName}.log + + + ${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${applicationLoggerPattern} + + + + + + 256 + + true + + + + + + + + + + + + + + + + + + + ${logDirectory}/${auditLogName}.log + + + ${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${auditLoggerPattern} + + + + 256 + + + + + ${logDirectory}/${metricsLogName}.log + + + ${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${metricsLoggerPattern} + + + + + + 256 + + + + + ${logDirectory}/${errorLogName}.log + + + ${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${errorLoggerPattern} + + + + + 256 + + + + + ${debugLogDirectory}/${debugLogName}.log + + + ${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip + + + 30 + 3GB + + + + ${defaultLoggerPattern} + + + + + 256 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties b/dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties new file mode 100644 index 0000000..ce1fa5f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/mchange-log.properties @@ -0,0 +1,4 @@ +# Direct the proprietary logger used by com.mchange.c3p0 to use slf4j + +com.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog +com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=OFF diff --git a/dcae_dmaapbc_webapp/src/main/resources/portal.properties b/dcae_dmaapbc_webapp/src/main/resources/portal.properties new file mode 100644 index 0000000..c5ae309 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/portal.properties @@ -0,0 +1,50 @@ +# 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 + +testing=testing + +#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.openecomp.portalsdk.core.onboarding.client.OnBoardingApiServiceImpl + +# CSP Global Log On for single sign on +ecomp_redirect_url = http://todo_enter_portal_hostname:8080/ecompportal/login.htm + +# URL of the ECOMP Portal REST API + +ecomp_rest_url = TODO_Portal_URL + +# Applications do not need to run a UEB listener in 1610. +ueb_listeners_enable = false + +# UEB Configuration +# In release 1607, all 6 entries below were required. +# In release 1610, if key ueb_listeners_enable is set to false, +# then only the ueb_app_key is required. +# UEB servers +ueb_url_list = todo_ueb_url_list +# ECOMP Portal listens on this UEB topic +ecomp_portal_inbox_name = ECOMP-PORTAL-INBOX-TEST-DEMETER +# Replace these 3 default values with the ones for your specific App, +# as shown on the on-boarding page on the ECOMP Portal web application. +ueb_app_key = ZOicEniw7BWDL1pM +ueb_app_secret = PJIsBErHfo2RGKzuu03CZKgV +ueb_app_mailbox_name = ECOMP-PORTAL-OUTBOX-TEST-32756 +# Consumer group name for UEB topic. +# Use the special tag '{UUID}' to generate a unique one for each sdk-app server. +ueb_app_consumer_group_name = {UUID} + +decryption_key = AGLDdG4D04BKm2IxIWEr8o== \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/resources/state-rules.drl b/dcae_dmaapbc_webapp/src/main/resources/state-rules.drl new file mode 100644 index 0000000..586ae6b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/resources/state-rules.drl @@ -0,0 +1,38 @@ +package org.openecomp.portalsdk.core.drools; +global String age + +rule "Default" +when +$droolsRuleService : DroolsRuleServiceImpl( state != null ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ $droolsRuleService.getState() +" state legal age is " + getDefaultIfNull(age)); +$droolsRuleService.setResultsString($droolsRuleService.getState()+" state legal age is " + getDefaultIfNull(age)); +end + +rule "Drools NJ" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NJ" ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ "NJ state legal age is " + getDefaultIfNull(age)); +$droolsRuleService.setResultsString("NJ state legal age is " + getDefaultIfNull(age)); +end + +rule "Drools KY" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "KY" ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ "KY state legal age is " + getDefaultIfNull("20")); +$droolsRuleService.setResultsString("KY state legal age is " + getDefaultIfNull("20")); +end + +rule "Drools NY" +when +$droolsRuleService : DroolsRuleServiceImpl( state == "NY" ) +then +System.out.println($droolsRuleService.accessLabel() +" "+ "NY state legal age is " + getDefaultIfNull("21")); +$droolsRuleService.setResultsString("NY state legal age is " + getDefaultIfNull("21")); +end + +function String getDefaultIfNull(String age) { +return age == null ? "18" : age; +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties new file mode 100644 index 0000000..23340dd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/quartz.properties @@ -0,0 +1,30 @@ +################################################################################# +# Quartz configurations for Quantum Work Flow # +################################################################################# + +org.quartz.scheduler.instanceId = AUTO + +################################################################################# +# Main configurations +org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool +org.quartz.threadPool.threadCount = 30 + +============================================================================ +# Configure JobStore +#============================================================================ + +org.quartz.jobStore.misfireThreshold = 60000 + +org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX +org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +org.quartz.jobStore.useProperties = false +#org.quartz.jobStore.dataSource = myDS +org.quartz.jobStore.tablePrefix = FN_QZ_ + +org.quartz.jobStore.isClustered = true +org.quartz.jobStore.clusterCheckinInterval = 20000 + +#============================================================================ +# Configure Datasources +#============================================================================ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties new file mode 100644 index 0000000..d4b8cd0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor.properties @@ -0,0 +1,168 @@ +##C## Mention the name of the framework. At present RAPTOR supports FUSION +system=fusion +##C## Determines the priority for the debug message. +debug_level=5 +##C## Determines the number of records can be downloaded in excel when you select "download all" option. +download_limit=65000 +csv_download_limit=10 +##C## Determines the number of records to be displayed in a single page. +default_page_size=50 +##C## Determines the list size in the form field. +form_fields_list_size=99000 +##C## Determines the scheduler interval +#scheduler_interval=0 => disabled +scheduler_interval=0 +##C## System Name +system_name=RAPTOR +##C## This is used for Bread crumbs. +base_title=ANALYSIS +##C## whether to allow SQL-based report definition (security risk); super users are always allowed to create SQL-based reports +allow_sql_based_reports=yes +##C## Determines whether to include disclaimer page at the bottom of each screen +show_disclaimer=yes +disclaimer_positioned_top_in_csvexcel=yes +##C## Determines whether to display the form page as a separate page before running the report +display_form_before_run=yes +##C## Determines whether to include the form page on the report data page +include_form_with_data=yes +##C## Determines whether to cache chart data in the session => faster re-display if the data volume does not get too large +cache_chart_data=yes +##C## Determines whether to cache report data for the currently displayed page in the session => faster re-display + ##C## if the data volume does not get too large +cache_cur_page_data=yes +##C## Determines Chart width +default_chart_width=700 +##C## Determines Chart height +default_chart_height=420 +##C## Determines whether to permit report deletion only by report owner or by everyone with "write" access +delete_only_by_owner=no +##C## Determines whether to log each report execution and update time and user ID +enable_report_log=yes +##C## Determines whether to cache user roles info in memory (saves many DB reads, but does not account for roles + ##C## assigned after the cache was loaded) +cache_user_roles=yes +##C## Determines whether to convert month formats (e.g. MM/YYYY) to the last day of the month (true) or + ##C## first day (false) - like 12/2003 is converted to either 12/31/2003 or 12/01/2003 +month_format_use_last_day=no +##C## Determines whether to print the report title in the download files +print_title_in_download=yes +##C## Determines whether to show report description when the report is run and in the quick links +show_descr_at_runtime=no +##C## Determines whether to skip labels on the Line chart axis when they overlap +#DEPRECATED skip_chart_labels_to_fit=no +##C## Determines whether to show chart types that are purpose and/or data specific +show_nonstandard_charts=yes +##C## Determines whether to allow the user to change the chart type at runtime +allow_runtime_chart_sel=yes +##C## Determines whether to display the report title as chart title as well +display_chart_title=yes +##C## Determines whether to merge/blank multi-level row headings in cross-tab report +merge_crosstab_row_headings=yes +##C## Determines whether to display chart when displaying the report at first or just a "Show Chart" button +display_chart_by_default=yes +##C## Determines whether to print the form field values in the download files +print_params_in_download=yes +##C## Determines the limitation to the characters in chart label. +skip_chart_labels_limit=30 +##C## Determines whether to users with read-only rights for a report can copy it +can_copy_on_read_only=yes +##C## Determines the no of decimals to be displayed in Totals column +#max_decimals_on_totals=-1 => don't truncate, display all decimal digits +max_decimals_on_totals=2 +##C## Determines which JFreeChart to use. +jfree_version=latest +#jfree_version=0.9.11 +# Added this restriction so that heavily used system which contain +# more than 1000 users can enable this feature not to display whole +# users in the drop down menu +display_all_users=yes +##Sheet name +sheet_name=raptor +#shell_script_name=/home/sundar/test.sh +#download_query_folder=/titan/PROJECT3/RAPTOR/raptor/dwnld/query/ +## this directory is mentioned if the flat file is downloaded using shell script +shell_script_dir=/titan/PROJECT3/RAPTOR/raptor/dwnld/ +flat_file_lower_limit=1 +flat_file_upper_limit=200000 +## whatever request mentioned here would be parsed in sql and request parameter would be filled +request_get_params=isEmbedded +print_footer_in_download=yes +## footer mentioned here appears in downloaded excel +footer_first_line=TODO footer first line +footer_second_line=Use Pursuant to Company Instructions +## to run report in popup window +report_in_popup_window=yes +## to run each report in new popup window if the above is selected +popup_in_new_window=yes +## "Yes" allows the request param to be passed to the drill down report +pass_request_param_in_drilldown=yes +## Show PDF download icon +show_pdf_download=yes +# Show Folder Tree +show_folder_tree=no +#Show folder tree only for Admin Users +show_folder_tree_only_to_admin_users=no +#folder tree should be minimized +folder_tree_minimized=yes +## whatever session mentioned here would be parsed in sql and session parameter would be filled +session_params=login_id +display_formfield_info=yes +customize_formfield_info=yes +#schedule limit for end users +schedule_limit=10 +# customized query if you need any restrictions for schedule and security tab for fusion +#schedule_custom_query_for_users=getAllUsersByCustomer +#schedule_custom_query_for_roles=getAllRolesByCustomer +# customized query if you need any restrictions for schedule and security tab for prisms example +#schedule_custom_query_for_users=SELECT au.user_id, au.first_name||' '||au.last_name user_name FROM app_user au order by 2 +schedule_custom_query_for_users=SELECT au.user_id id, au.first_name||' '||au.last_name name FROM app_user au where user_id = 1 order by 2 +#schedule_custom_query_for_roles=SELECT ar.role_id, ar.descr role_name FROM app_role ar order by 2 +schedule_date_pattern=MM/dd/yyyy hh:mm:ss a +## This is used to display in right format in chart timestamp axis as we give in the sql +#chart_yearly_format=yyyy +#chart_monthly_format=MMM-yyyy +#chart_daily_format=MM-dd-yyyy +chart_hourly_format=MM/dd HH +#chart_minute_format=HH:mm +chart_minute_format=MM-dd-yyyy-HH:mm +#chart_second_format=HH:mm:ss +chart_second_format=MM-dd-yyyy +#chart_millisecond_format=HH:mm:ss.S +schedule_help_text=This form is used to schedule a specific Reporting Platform report to be delivered to one or more email addresses associated with your Company's Business Direct user logins. Note that report output delivered via email does not include the capability to drill down/back up to additional data levels. So, select the appropriate data level report for the scheduled report. View the status of scheduled report requests in the My Schedules menu item. +use_loginid_in_schedYN=Y +session_params_for_scheduling=login_id +session_date_formfield_auto_incr=yes +display_session_param_pdfexcel=login_id;Login Id +session_params_for_displaying_in_scheduling=login_id;Login Id +application_server=tomcat +#gmap properties +gmap_key=ABQIAAAAToJSSetKBMjBJx8MiRw4ghQiU0SbbKnm8C5eu25cpyLwgkLzyRShrQTbgZtqnKAqZU9JwcSq1bKwiA +PROJECT-FOLDER=/Users/sundar/git/st_quantum/quantum/target/quantum-1.0 +# +MARKET-SHAPEFILE-FOLDER=resources/files +# output folder for files generated on server side +OUTPUT-FOLDER=resources/temp +# tile size in pixel +TILE-SIZE=256 +#check if map is disabled or not +map_allowed=Y +max_drilldown_level=2 +admin_role_equiv_to_super_role=N +show_loading_during_formfield_chain=Y +show_print_icon=N +globally_nowrap=N +calendar_output_date_format=MM/dd/yyyy +memory_threshold_percentage=99 +print_params_in_csv_download=yes +notitle_in_dashboard=yes +generate_store_sched_reports=yes +show_excel_2007_download=yes +print_excel_in_landscape=yes +show_animated_chart_option=yes +show_animated_chart_only=no +adjust_content_based_on_height=yes +custom_submit_button_text=Run Button +customize_formfield_layout=yes +#db_type=postgresql +#db_type=oracle +db_type=mysql \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties new file mode 100644 index 0000000..908abed --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_app_fusion.properties @@ -0,0 +1,20 @@ +temp_folder_path=/demeter/WebApps/dev/ECOMP_PORTAL/temp/ +upload_folder_path=/demeter/WebApps/dev/ECOMP_PORTAL/files/ +excel_template_path=/demeter/WebApps/dev/ECOMP_PORTAL/files/raptor_template/ +temp_folder_url=temp/ +upload_folder_url=upload/ +smtp_server=todo.smtp.com +default_email_sender=email-name@email.com +error_page=error_page.jsp +jsp_context_path=raptor/ +img_folder_url=static/fusion/raptor/images/ +base_folder_url=static/fusion/raptor/ +direct_access_url=http://localhost:8080/quantum/raptor_email_attachment.htm?action=raptor&source_page=report_run&display_content=y +#base_action_url=report.htm#/report_run/ +drill_action_url=report.htm#/report_run/c_master= +base_action_url=report_wizard.htm?action= +base_action_url_ng=report#/ +base_action_param=c_master= +super_role_id=1 +admin_role_ids=1 +quick_links_menu_ids=HOME,CUSTOMER,REPORTS diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_db_fusion.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_db_fusion.properties new file mode 100644 index 0000000..e69de29 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties new file mode 100644 index 0000000..c043e47 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/raptor_pdf.properties @@ -0,0 +1,30 @@ +## pdf file specific properties +pdf_data_font_size=9 +pdf_data_font_family=Arial +#reduce the font size from html config +pdf_data_font_size_offset=2 +pdf_data_alternate_color=true +#data row background(white), alternate(light light blue/gray) +pdf_data_background_alternate_hex_code=#EDEDED +pdf_data_default_background_hex_code=#FFFFFF +#header font (white) background (gray) +pdf_data_table_header_font_hex_code=#FFFFFF +pdf_data_table_header_background_hex_code=#8A9BB3 +#footer header +pdf_footer_font_size=9 +pdf_footer_font_family=Arial +pdf_att_proprietary=Proprietary\nUse Pursuant to Company Instructions +pdf_att_proprierary_font_size=7 +pdf_date_timezone=GMT +pdf_date_pattern=MM/dd/yyyy hh:mm:ss a +##page number position at 1 - footer middle, 0 -- header right, 2 - both +pdf_page_number_position=1 +pdf_word_before_page_number=Page +pdf_word_after_page_number= +pdf_coverpage_firstcolumn_size=0.3 +pdf_image_auto_rotate=false +display_create_owner_info=true +#session_info=customer,customerId +display_loginid_for_downloaded_by=false +# please use false if you want landscape to be default. +is_default_orientation_portrait=true diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties new file mode 100644 index 0000000..24cd550 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/sql.properties @@ -0,0 +1,303 @@ +#SQL Statements for PostgreSQL + +#ReportLoader.java + +load.custom.report.xml = SELECT cr.report_xml FROM cr_report cr WHERE rep_id=? + +# need to copy to oracle +load.remoteDB.schema = SELECT 'local' SCHEMA_ID, 'local' SCHEMA_DESC, null DATASOURCE_TYPE FROM dual union SELECT a.SCHEMA_ID, a.SCHEMA_DESC, DATASOURCE_TYPE FROM SCHEMA_INFO a where schema_id <> 'local' order by schema_id +load.remoteDB.schema.where = SELECT a.SCHEMA_ID, a.SCHEMA_DESC, DATASOURCE_TYPE FROM SCHEMA_INFO a where schema_id = '[schema_id]' +#formfield rendering + +formfield.id.name.sql.prefix=SELECT id, name FROM ( +formfield.id.name.sql=SELECT id, name + +formfield.id.name.sql.suffix= + +report.security.create= SELECT coalesce(cr.owner_id, cr.create_id) AS owner_id, cr.create_id, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, maint_id, DATE_FORMAT(cr.maint_date, '%m/%d/%Y') update_date, cr.public_yn FROM cr_report cr WHERE cr.rep_id = [rw.getReportID()] + +db.update.report.xml = SELECT cr.rep_id, cr.report_xml FROM cr_report cr WHERE rep_id=? FOR UPDATE + +update.custom.report.rec = UPDATE cr_report SET title='[Utils.oracleSafe(rw.getReportName())]', descr='[Utils.oracleSafe(rw.getReportDescr())]', public_yn='[(rw.isPublic()]', menu_id='[rw.getMenuID()]', menu_approved_yn='[(rw.isMenuApproved()]', owner_id=[rw.getOwnerID()], maint_id=[rw.getUpdateID()], maint_date=STR_TO_DATE('[rw.getUpdateDate()]', '[Globals.getOracleTimeFormat()]'), dashboard_type_yn='[(rw.isDashboardType()]', dashboard_yn= '[(rw.getReportType().equals(AppConstants.RT_DASHBOARD)]' WHERE rep_id = [rw.getReportID()] + +is.report.already.scheduled = select rep_id from cr_report_schedule where rep_id = ? + +create.custom.report.rec = INSERT INTO cr_report(rep_id, title, descr, public_yn, menu_id, menu_approved_yn, report_xml, owner_id, create_id, create_date, maint_id, maint_date, dashboard_type_yn, dashboard_yn, folder_id) VALUES([rw.getReportID()], '[Utils.oracleSafe(rw.getReportName())]', '[Utils.oracleSafe(rw.getReportDescr())]', '[rw.isPublic()]', '[rw.getMenuID()]', '[rw.isMenuApproved()]', '', [rw.getOwnerID()], [rw.getCreateID()], STR_TO_DATE('[rw.getCreateDate()]', '[Globals.getOracleTimeFormat()]'), [rw.getUpdateID()], STR_TO_DATE('[rw.getUpdateDate()]', '[Globals.getOracleTimeFormat()]'), '[rw.isDashboardType()]', '[rw.getReportType().equals(AppConstants.RT_DASHBOARD)]',[rw.getFolderId()]) + +get.user.report.names = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE coalesce(cr.owner_id, cr.create_id) = [userID] + +get.report.owner.id = SELECT coalesce(cr.owner_id, cr.create_id) AS owner FROM cr_report cr WHERE rep_id = ? + +delete.report.record.log = DELETE FROM cr_report_log WHERE rep_id = [reportID] + +delete.report.record.users = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID] + +delete.report.record.schedule = DELETE FROM cr_report_schedule WHERE rep_id = [reportID] + +delete.report.record.access = DELETE FROM cr_report_access WHERE rep_id = [reportID] + +delete.report.record.email = DELETE FROM cr_report_email_sent_log WHERE rep_id = [reportID] + +delete.report.record.favorite = DELETE FROM cr_favorite_reports WHERE rep_id = [reportID] + +delete.report.record.report = DELETE FROM cr_report WHERE rep_id = [reportID] + +load.quick.links = select finalcr.rep_id, finalcr.title, finalcr.descr from (SELECT cr.rep_id, cr.title, cr.descr FROM (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra LEFT JOIN cr_report cr ON cr.rep_id = ra.rep_id WHERE cr.menu_id LIKE '%[nvls(menuId)]%' AND cr.menu_approved_yn = 'Y' AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) UNION SELECT cr.rep_id, cr.title, cr.descr FROM cr_report cr WHERE cr.menu_id LIKE '%[nvls(menuId)]%' AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' or EXISTS (select * from fn_user_role where user_id=[userID] and role_id in (1)))) finalcr ORDER BY finalcr.title + +load.folder.reports = SELECT cr.rep_id, cr.rep_id report_id, concat([rep_title_sql] , (CASE WHEN cr.public_yn = 'Y' THEN '' ELSE '[PRIVATE_ICON]' END),cr.title,'') title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn FROM cr_report cr JOIN app_user au ON coalesce(cr.owner_id, cr.create_id) = au.user_id AND cr.folder_id= '[folderId]' LEFT JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL(SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id +#If roleList.toString() is '' PostgreSQL returns an error - needs to be null instead of empty + +load.folder.reports.user = AND coalesce(cr.owner_id, cr.create_id) = [userID] + +load.folder.reports.publicsql = AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) + +load.quick.download.links = SELECT a.file_name, b.title,DATE_FORMAT(a.dwnld_start_time, '%W %d-%m-%Y %H:%i:%s') as time, a.dwnld_start_time FROM cr_report_dwnld_log a, cr_report b where a.user_id = [userID] and a.rep_id = b.rep_id and (a.dwnld_start_time) >= STR_TO_DATE(DATE_FORMAT(now() - INTERVAL 1 DAY, '%m/%d/%Y'), '%m/%d/%Y') and a.record_ready_time is not null order by a.dwnld_start_time + +load.reports.to.schedule = SELECT cr.rep_id, Initcap(cr.title), cr.descr FROM cr_report cr LEFT OUTER JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id AND (cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL or cr.owner_id = [userID] )ORDER BY Initcap(cr.title) + +load.reports.to.add.in.dashboard = SELECT cr.rep_id, cr.title, cr.descr FROM cr_report cr LEFT OUTER JOIN (SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON cr.rep_id = ra.rep_id AND (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) AND (cr.dashboard_yn = 'N' or cr.dashboard_yn is null) ORDER BY cr.title + +load.my.recent.links = select rep_id, title, descr, form_fields from ( select rep_id, title, descr, form_fields from (select cr.rep_id, cr.title, a.form_fields, cr.descr, a.log_time, a.user_id, a.action, a.action_value from cr_report_log a, cr_report cr where user_id = [userID] AND action = 'Report Execution Time' and a.rep_id = cr.rep_id order by log_time desc) AS x) AS y where LIMIT 1, 6 + +create.report.log.entry = INSERT INTO cr_report_log (rep_id, log_time, user_id, action, action_value, form_fields) VALUES([reportID], now(), [userID], '[action]' , '[executionTime]', '[form_fields]') + +create.report.log.entry.exec.time = INSERT INTO cr_report_log (rep_id, log_time, user_id, action, action_value, form_fields) VALUES([reportID], NOW() + INTERVAL 1 SECOND, [userID], '[action]' , '[executionTime]', '[formFields]') + +clear.report.log.entries = DELETE FROM cr_report_log WHERE rep_id = ? and user_id = ? + +load.report.log.entries = SELECT x.log_time, x.user_id, (CASE WHEN x.action = 'Report Execution Time' THEN concat('',x.action,'') ELSE x.action END) action, (CASE WHEN x.action = 'Report Execution Time' THEN action_value ELSE 'N/A' END) time_taken, (CASE WHEN x.action = 'Report Execution Time' THEN concat('\"Run') ELSE 'N/A' END) run_image, x.name FROM (SELECT rl.rep_id, DATE_FORMAT(rl.log_time, '%m/%d/%Y %h:%i:%s %p') log_time, rl.action_value, concat(fuser.last_name ,', ',fuser.first_name) name, rl.user_id, rl.action, rl.form_fields FROM cr_report_log rl, fn_user fuser WHERE rl.rep_id = [nvls(reportId)] and rl.action != 'Report Run' and fuser.user_id = rl.user_id ORDER BY rl.log_time DESC) x LIMIT 100 + +does.user.can.schedule.report = select crs.sched_user_id, count(*) from cr_report_schedule crs where sched_user_id = [userId] group by crs.sched_user_id having count(*) >= [Globals.getScheduleLimit()] + +does.user.can.schedule = select crs.schedule_id from cr_report_schedule crs where schedule_id = [scheduleId] + +get.system.date.time = select DATE_FORMAT(now(),'%m/%d/%Y %H:%i:%s') + +get.next.day.date.time = select DATE_FORMAT(NOW() + INTERVAL 1 DAY,'%m/%d/%Y %H:%i:%s') + +get.next.fifteen.minutes.date.time = select DATE_FORMAT(NOW() + INTERVAL 15 MINUTES,'%m/%d/%Y %H:%i:%s') + +get.next.thirty.minutes.date.time = select DATE_FORMAT(NOW() + INTERVAL 30 MINUTES,'%m/%d/%Y %H:%i:%s') + +get.template.file = select template_file from cr_report_template_map where report_id = [reportId] + +load.pdf.img.lookup = select image_id, image_loc from cr_raptor_pdf_img + +load.action.img.lookup = select image_id, image_loc from cr_raptor_action_img + + +#ActionHandler.java + +report.values.map.def.a = SELECT x FROM (SELECT DISTINCT + +report.values.map.def.b = TO_CHAR([colName], '[nvl(displayFormat, AppConstants.DEFAULT_DATE_FORMAT)]') + +report.values.map.def.c = [colName] + +report.values.map.def.d = x FROM [rdef.getTableById(tableId).getTableName()] WHERE [colName] IS NOT NULL ORDER BY 1) xx LIMIT <= [Globals.getDefaultPageSize()] + +test.sched.cond.popup = SELECT 1 WHERE EXISTS ([sql]) + +download.all.email.sent = Select user_id, rep_id from CR_REPORT_EMAIL_SENT_LOG where gen_key='[pdfAttachmentKey.trim()]' and log_id =[report_email_sent_log_id.trim()] and (now() - sent_date) < '1 day' limit 1 + +download.all.gen.key = select schedule_id from cr_report_email_sent_log u where U.GEN_KEY = '[pdfAttachmentKey]' + +download.all.retrieve = SELECT au.user_id FROM (SELECT rs.schedule_id, rs.rep_id FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.run_date IS NOT NULL AND rs.schedule_id = [scheduleId]) x, cr_report r, app_user au WHERE x.rep_id = r.rep_id AND au.user_id IN (SELECT rsu.user_id FROM cr_report_schedule_users rsu WHERE rsu.schedule_id = x.schedule_id and rsu.schedule_id = [scheduleId] UNION SELECT ur.user_id FROM fn_user_role ur WHERE ur.role_id IN (SELECT rsu2.role_id FROM cr_report_schedule_users rsu2 WHERE rsu2.schedule_id = x.schedule_id and rsu2.schedule_id = [scheduleId])) + +download.all.insert = insert into cr_report_dwnld_log (user_id,rep_id,file_name,dwnld_start_time,filter_params) values (?,?,?,?,?) + +#ReportWrapper.java + +report.wrapper.format = SELECT coalesce(cr.owner_id, cr.create_id) owner_id, cr.create_id, DATE_FORMAT(cr.create_date, '[Globals.getOracleTimeFormat()]') create_date, maint_id, DATE_FORMAT(cr.maint_date, '[Globals.getOracleTimeFormat()]') update_date, cr.menu_id, cr.menu_approved_yn FROM cr_report cr WHERE cr.rep_id= [reportID] + +generate.subset.sql = SELECT [colNames.toString()] FROM (SELECT [colNames.toString()] FROM ([reportSQL]) AS x ) AS y + +report.sql.only.first.part = SELECT [colNames.toString()] FROM (SELECT [colNames.toString()] FROM ( + +report.sql.only.second.part.a = [startRow] + +report.sql.only.second.part.b = [pageSize] +#MYSQL: LIMIT [startRow], [pageSize] +#ORacle: rownum >= [startRow] and rownum <= ([startRow]+[pageSize]) +#Postgre: limit [pageSize] offset [startRow] + +report.sql.only.second.part.b.noorderby = LIMIT [startRow] + +generate.sql.visual.select = SELECT + +generate.sql.visual.count = COUNT(*) cnt + +generate.sql.visual.dual = +#No DUAL table in PostgreSQL so this is blank + +#ReportRuntime.java + +load.crosstab.report.data = SELECT [colNames.toString()] FROM ( [reportSQL] + +#RaptorRunHandler.java + +generate.sql.handler = SELECT x.* from ([sql]) AS x LIMIT 2 + +generate.sql.select = SELECT [colNames.toString()] FROM (SELECT [colNames.toString()] FROM ([sql]) AS y) AS x + +#ReportSchedule.java + +load.schedule.data = SELECT rs.enabled_yn, DATE_FORMAT(rs.start_date, '%m/%d/%Y') start_date, DATE_FORMAT(rs.end_date, '%m/%d/%Y') end_date, DATE_FORMAT(rs.run_date, '%m/%d/%Y') run_date, coalesce(DATE_FORMAT(rs.run_date, '%h'), '12') run_hour, coalesce(DATE_FORMAT(rs.run_date, '%i'), '00') run_min, coalesce(DATE_FORMAT(rs.run_date, '%p'), 'AM') run_ampm, rs.recurrence, rs.conditional_yn, rs.notify_type, rs.max_row, rs.initial_formfields, rs.schedule_id, coalesce(DATE_FORMAT(rs.end_date, '%h'), '11') end_hour, coalesce(DATE_FORMAT(rs.end_date, '%i'), '45') end_min, coalesce(DATE_FORMAT(rs.end_date, '%p'), 'PM') end_ampm, encrypt_yn, attachment_yn FROM cr_report_schedule rs WHERE rs.rep_id = [reportID] + +load.schedule.getid = SELECT rsu.user_id, concat(fuser.last_name,', ',fuser.first_name), fuser.login_id FROM cr_report_schedule_users rsu, fn_user fuser WHERE rsu.rep_id = [reportID] AND rsu.schedule_id = [getScheduleID()] and rsu.user_id IS NOT NULL and rsu.user_id = fuser.user_id + +load.schedule.users = SELECT rsu.role_id FROM cr_report_schedule_users rsu WHERE rsu.rep_id = [reportID] AND rsu.schedule_id = [getScheduleID()] AND rsu.role_id IS NOT NULL + +new.schedule.data = select coalesce(max(schedule_id),0)+1 AS sequence from cr_report_schedule + +new.report.data = select coalesce(max(rep_id),0)+1 AS rep_id from cr_report + +execute.update = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID] and schedule_id = [getScheduleID()] + +execute.update.users = INSERT INTO cr_report_schedule_users (schedule_id, rep_id, user_id, role_id, order_no) VALUES([getScheduleID()], [reportID], [emailToUsers.get(i)).getId()], NULL, [(i + 1)]) + +execute.update.roles = INSERT INTO cr_report_schedule_users (schedule_id, rep_id, user_id, role_id, order_no) VALUES([getScheduleID()], [reportID], NULL, [emailToRoles.get(i)).getId()], [((emailToUsers.size() + i + 1)]) + +execute.update.activity = INSERT into cr_schedule_activity_log (schedule_id, notes, run_time) values ([getScheduleID()],'Submitted:Schedule',TO_DATE('[getRunDate()] [getRunHour()]:[getRunMin()] [getRunAMPM()]', 'MM/DD/YYYY HH:MI AM')) + +delete.schedule.data = SELECT 1 FROM cr_report_schedule WHERE rep_id = [reportID] and sched_user_id = [getScheduleUserID()] and schedule_id = [getScheduleID()] + +delete.schedule.data.users = DELETE FROM cr_report_schedule_users WHERE rep_id = [reportID] and schedule_id = [getScheduleID()] + +delete.schedule.data.id = DELETE FROM cr_report_schedule where rep_id = [reportID] and sched_user_id = [getScheduleUserID()] and schedule_id = [getScheduleID()] + +load.cond.sql = SELECT condition_large_sql FROM cr_report_schedule WHERE schedule_id=? + +load.cond.sql.select = SELECT condition_sql FROM cr_report_schedule WHERE schedule_id = [scheduleId] + +persist.cond.sql.update = update cr_report_schedule set condition_large_sql = '' where schedule_id = [scheduleId] +#EMPTY CLOB() changed to '' + +persist.cond.sql.large = SELECT condition_large_sql FROM cr_report_schedule cr WHERE schedule_id=? FOR UPDATE + +persist.cond.sql.set = update cr_report_schedule set condition_sql = ? where schedule_id = [scheduleId] + +#DataCache.java + +get.data.view.actions = SELECT ts.web_view_action FROM cr_table_source ts WHERE ts.web_view_action IS NOT NULL + +get.public.report.id.names = SELECT rep_id, title FROM cr_report WHERE public_yn = 'Y' ORDER BY title + +get.private.accessible.names.a = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE cr.rep_id not in (select rep_id from cr_report_access cra where user_id = '[user_id]' + +get.private.accessible.names.if = OR role_id in ( + +get.private.accessible.names.b = ) AND public_yn = 'N' and cr.owner_id = '[user_id]' order by 2 + +get.group.accessible.names.a = SELECT cr.rep_id, cr.title FROM cr_report cr WHERE cr.rep_id in (select rep_id from cr_report_access cra where user_id = '[user_id]' + +get.group.accessible.names.b = ) AND public_yn = 'N' order by 2 + +get.report.table.sources.a = SELECT table_name, display_name, pk_fields, web_view_action, large_data_source_yn, filter_sql FROM cr_table_source + +get.report.table.sources.where = where SOURCE_DB= '[dBInfo]' + +get.report.table.sources.if = where SOURCE_DB is null or SOURCE_DB = '[AppConstants.DB_LOCAL]' + +get.report.table.sources.else = ORDER BY table_name + +grab.report.table.a = SELECT ts.table_name, ts.display_name, ts.pk_fields, ts.web_view_action, ts.large_data_source_yn, ts.filter_sql FROM cr_table_source ts WHERE + +grab.report.table.if = ts.SOURCE_DB= '[dBInfo]' + +grab.report.table.else = (ts.SOURCE_DB is null or ts.SOURCE_DB = '[AppConstants.DB_LOCAL]') + +grab.report.table.b = except SELECT ts.table_name, ts.display_name, ts.pk_fields, ts.web_view_action, ts.large_data_source_yn, ts.filter_sql from cr_table_source ts where table_name in (select table_name from cr_table_role where role_id not IN [sb.toString()]) and + +grab.report.table.c = ORDER BY 1 + +get.report.table.crjoin = SELECT src_table_name, dest_table_name, join_expr FROM cr_table_join + +get.report.table.joins = SELECT tj.src_table_name, tj.dest_table_name, tj.join_expr FROM cr_table_join tj WHERE ((EXISTS (SELECT 1 FROM cr_table_role trs WHERE trs.table_name=tj.src_table_name AND trs.role_id IN [sb.toString()])) OR (NOT EXISTS (SELECT 1 FROM cr_table_role trs WHERE trs.table_name=tj.src_table_name))) AND ((EXISTS (SELECT 1 FROM cr_table_role trd WHERE trd.table_name=tj.dest_table_name AND trd.role_id IN [sb.toString()])) OR (NOT EXISTS (SELECT 1 FROM cr_table_role trd WHERE trd.table_name=tj.dest_table_name))) + +generate.report.table.col = SELECT a.table_name, a.column_name, a.data_type, a.label FROM user_column_def a WHERE a.table_name = '[tableName.toUpperCase()]' ORDER BY a.column_id + +generate.db.user.sql.a = SELECT utc.table_name, utc.column_name, utc.data_type, + +generate.db.user.sql.if = utc.column_name FROM user_tab_columns utc + +generate.db.user.sql.else = coalesce(x.label, utc.column_name) FROM user_tab_columns utc + +generate.db.user.sql.b = WHERE utc.table_name = '[tableName.toUpperCase()]' + +generate.db.user.sql.c = AND utc.table_name = x.table_name AND utc.column_name = x.column_name + +generate.db.user.sql.d = ORDER BY utc.column_id + +#SearchHandler.java + +load.report.search.result = SELECT cr.rep_id, cr.rep_id report_id, [rep_title_sql] title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, DATE_FORMAT(cr.create_date, '%m/%d/%Y') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn, case when report_xml like '%N%' then 'N' when report_xml like '%Y%' or 1 = (select distinct 1 from cr_report_schedule where rep_id = cr.rep_id) then 'Y' else 'N' end FROM cr_report cr JOIN fn_user au ON coalesce (cr.owner_id, cr.create_id) = au.user_id [fReportID] [fReportName] LEFT JOIN(SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON ra.rep_id = cr.rep_id + +load.report.search.instr = WHERE cr.menu_id LIKE '%[menuId]%' + +load.report.search.result.user = WHERE coalesce(cr.owner_id, cr.create_id) = [userID] + +load.report.search.result.public = WHERE (coalesce(cr.owner_id, cr.create_id) = [userID] OR cr.public_yn = 'Y' OR ra.read_only_yn IS NOT NULL) + +load.report.search.result.fav = WHERE cr.rep_id in (select rep_id from cr_favorite_reports where user_id = [userID] + +load.report.search.result.sort = ORDER BY CASE coalesce(cr.owner_id, cr.create_id) WHEN [userID] THEN ' ' WHEN 'upper(concat(au.first_name,' ',au.last_name))' ELSE 'upper(cr.title)' END + +load.folder.report.result = SELECT cr.rep_id, cr.rep_id report_id, concat([rep_title_sql] , (CASE WHEN cr.public_yn = 'Y' THEN '' ELSE '[PRIVATE_ICON]' END),cr.title,'') title, cr.descr, concat(au.first_name,' ',au.last_name) owner_name, TO_CHAR(cr.create_date, 'MM/DD/YYYY') create_date, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'N' ELSE coalesce(ra.read_only_yn, 'Y') END read_only_yn, CASE WHEN coalesce(cr.owner_id, cr.create_id) = [userID] THEN 'Y' ELSE 'N' END user_is_owner_yn FROM cr_report cr JOIN fn_user au ON coalesce (cr.owner_id, cr.create_id) = au.user_id AND TO_CHAR(cr.rep_id, 'FM99999999') like coalesce('%[fReportID]%', TO_CHAR(cr.rep_id, 'FM99999999')) AND UPPER(cr.title) LIKE UPPER('%[fReportName]%') LEFT JOIN(SELECT rep_id, MIN(read_only_yn) read_only_yn FROM ((SELECT ua.rep_id, ua.read_only_yn FROM cr_report_access ua WHERE ua.user_id = [userID]) UNION ALL (SELECT ra.rep_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.role_id IN ([roleList.toString()]))) report_access GROUP BY rep_id) ra ON ra.rep_id = cr.rep_id + +load.folder.report.result.sort = ORDER BY CASE coalesce(cr.owner_id, cr.create_id) WHEN [userID] THEN ' ' WHEN '(concat(au.first_name,' ',au.last_name))' ELSE 'cr.title' END + +#WizardProcessor.java + +process.filter.add.edit = '[argValue]' + +#ReportDefinition.java + +persist.report.adhoc = SELECT nextval('[Globals.getAdhocReportSequence()]') AS sequence + +#Globals.java + +initialize.roles = SELECT 1 WHERE EXISTS (SELECT 1 FROM cr_table_role) + +initialize.version = SELECT cr_raptor.get_version + +# scheduler + + +scheduler.available.schedules = SELECT x.rep_id, x.schedule_id, x.conditional_yn, x.condition_large_sql, x.notify_type, x.max_row, x.initial_formfields, x.processed_formfields, r.title, x.user_id FROM ( SELECT rs.rep_id, rs.schedule_id, rs.sched_user_id user_id, rs.conditional_yn, rs.condition_large_sql, rs.notify_type, rs.max_row, rs.initial_formfields, rs.processed_formfields FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.start_date <= [currentDate] AND (rs.end_date >= [currentDate] or rs.end_date is null ) AND rs.run_date IS NOT NULL ) x, cr_report r WHERE x.rep_id = r.rep_id + +random.string = select ( concat('Z' , round(random() * 1000000000000) ) ) + + +scheduler.user.emails = SELECT au.user_id FROM (SELECT rs.schedule_id, rs.rep_id FROM cr_report_schedule rs WHERE rs.enabled_yn='Y' AND rs.start_date <= now() AND rs.end_date >= now() AND rs.run_date IS NOT NULL AND rs.schedule_id = [p_schedule_id] ) x, cr_report r, fn_user au WHERE x.rep_id = r.rep_id AND au.user_id IN (SELECT rsu.user_id FROM cr_report_schedule_users rsu WHERE rsu.schedule_id = x.schedule_id and rsu.schedule_id = [p_schedule_id] UNION SELECT ur.user_id FROM fn_user_role ur WHERE ur.role_id IN (SELECT rsu2.role_id FROM cr_report_schedule_users rsu2 WHERE rsu2.schedule_id = x.schedule_id and rsu2.schedule_id = [p_schedule_id])) + + +# my logins + +app.query = SELECT APP_ID, ML_APP_NAME, MOTS_ID from fn_app + +user.log.query = SELECT DISTINCT IFNULL(ORG_USER_ID, '') CUID, '' AWID, CONCAT('"',IFNULL(ORG_USER_ID, ''),'"') APPLICATIONUSERID, CONCAT('"',IFNULL(FIRST_NAME, ''),'"') FIRST_NAME, CONCAT('"',substr(IFNULL(MIDDLE_NAME, ''), 0, 1),'"') MIDDLE_INITIAL, CONCAT('"',IFNULL(LAST_NAME, ''),'"') LAST_NAME, IFNULL(DATE_FORMAT(LAST_LOGIN_DATE, '%Y/%m/%d'), '') LAST_LOGON_DATE, DATE_FORMAT(CREATED_DATE, '%Y/%m/%d') ACCOUNT_ACTIVATION_DATE, IFNULL(DATE_FORMAT(MODIFIED_DATE, '%Y/%m/%d'), '') LAST_DATE_ACCOUNT_MODIFIED, '' LAST_PASSWORD_CHANGE_DATE, CONCAT('"',IFNULL(FIRST_NAME, ''),' ',IFNULL(MIDDLE_NAME, ''),' ',IFNULL(LAST_NAME, ''),'"') FULL_USER_NAME, '' NT_ID, IFNULL(EMAIL, '') EMAIL FROM FN_USER FU, FN_USER_ROLE FUR WHERE FU.USER_ID \= FUR.USER_ID and FUR.app_id \= ? and ACTIVE_YN \= 'Y' and ORG_USER_ID is not null order by 1 + +profile.log.query = SELECT DISTINCT CONCAT('"' , ROLE_NAME , '"') PROFILE_NAME, '""' SECURITY_SETTINGS FROM FN_ROLE FR, FN_USER_ROLE FUR WHERE FUR.ROLE_ID \= FR.ROLE_ID and FR.ACTIVE_YN \= 'Y' and ((FUR.APP_ID \= 1 and FR.ROLE_NAME <> 'Standard User') or (FUR.APP_ID \= ? and FUR.APP_ID <> 1)) ORDER BY 1 + +user.profile.log.query = SELECT DISTINCT IFNULL(ORG_USER_ID, '') CUID, '' AWID, CONCAT('"' , IFNULL(ORG_USER_ID, '') , '"') APPLICATIONUSERID , CONCAT('"' , ROLE_NAME , '"') PROFILE_NAME FROM FN_USER A, FN_USER_ROLE B, FN_ROLE C WHERE A.USER_ID \= B.USER_ID AND B.ROLE_ID \= C.ROLE_ID AND A.ACTIVE_YN \= 'Y' AND C.ACTIVE_YN \= 'Y' AND a.ORG_USER_ID is not null AND ((B.APP_ID \= 1 and C.ROLE_NAME <> 'Standard User') or (B.APP_ID \= ? and B.APP_ID <> 1)) ORDER BY 1 + +all.accounts.log.query = SELECT DISTINCT IFNULL(ORG_USER_ID, '') CUID, (case when A.ACTIVE_YN\='Y' then 'ACTIVE' else 'INACTIVE' end) ACTIVE_YN, CONCAT('"' , IFNULL(ORG_USER_ID, '') , '"') APPLICATIONUSERID , IFNULL(DATE_FORMAT(LAST_LOGIN_DATE, '%Y/%m/%d'), '') LAST_LOGON_DATE, '' LAST_PASSWORD_CHANGE_DATE, CONCAT('"' , ROLE_NAME , '"') PROFILE_NAME FROM FN_USER A, FN_USER_ROLE B, FN_ROLE C WHERE A.USER_ID \= B.USER_ID AND B.ROLE_ID \= C.ROLE_ID AND a.ORG_USER_ID is not null AND ((B.APP_ID \= 1 and C.ROLE_NAME <> 'Standard User') or (B.APP_ID \= ? and B.APP_ID <> 1)) ORDER BY 1 + +# basic sql + +seq.next.val = SELECT nextval('[sequenceName]') AS id + +current.date = now() + +nvl = IFNULL + +# report security +report.user.access = SELECT ra.role_id, ra.user_id, ra.read_only_yn FROM cr_report_access ra WHERE ra.rep_id = [reportID] +add.user.access = INSERT INTO cr_report_access (rep_id, order_no, role_id, user_id, read_only_yn) VALUES([reportID], IFNULL((select order_no from (SELECT MAX(order_no) AS order_no FROM cr_report_access WHERE rep_id=[reportID]) AS temp), 0)+1, NULL, [userID], '[readOnlyAccess]') +update.user.access = UPDATE cr_report_access SET read_only_yn='[readOnlyAccess]' WHERE rep_id=[reportID] AND user_id=[userID] +remove.user.access = DELETE FROM cr_report_access WHERE rep_id=[reportID] AND user_id=[userID] +add.role.access = INSERT INTO cr_report_access (rep_id, order_no, role_id, user_id, read_only_yn) VALUES([reportID], IFNULL((select order_no from (SELECT MAX(order_no) AS order_no FROM cr_report_access WHERE rep_id=[reportID]) AS temp), 0)+1, [roleID], NULL, '[readOnlyAccess]') +update.role.access = UPDATE cr_report_access SET read_only_yn='[readOnlyAccess]' WHERE rep_id=[reportID] AND role_id=[roleID] +remove.role.access = DELETE FROM cr_report_access WHERE rep_id=[reportID] AND role_id=[roleID] + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties new file mode 100644 index 0000000..bafa77d --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/conf/system.properties @@ -0,0 +1,61 @@ +#Local +app_display_name = DMaaP Bus Ctlr + +db.driver = com.mysql.jdbc.Driver +db.connectionURL = jdbc:mysql://localhost:3306/dbca_os +db.userName = xxxxx +db.password = xxxxxx +# db.encrypt_flag = true +db.hib.dialect = org.hibernate.dialect.MySQLDialect +db.min_pool_size = 5 +db.max_pool_size = 10 +hb.dialect = org.hibernate.dialect.MySQLDialect +hb.show_sql = false +hb.db_reconnect = true +hb.idle_connection_test_period = 3600 + +# Directory with the Quantum.lic file +files_path = /opt/app/tomcat/webapps/dmaap-bc-app/WEB-INF/dbcapp + +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== + +#element map files +element_map_file_path = /tmp +element_map_icon_path = app/fusionapp/icons/ + + +# 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/ +# ID generated for DBC to supply to EELF +# A bogus value is cached in SCM: 12345678-.. +instance_uuid = 12345678-90ab-cdef-1234-567890abcdef + +# R Cloud feature +guard_notebook_url=https://host/mini.html?notebook=a06a9cf14211012e221bf842c168849d& + +# Application base URL is a proper prefix of the on-boarded URL. +app_base_url = http://localhost:8080/dmaap-bc-app.1.0.0/ + +# open source authenticate user server +authenticate_user_server=http://todo_enter_auth_server_hostname:8383/openid-connect-server-webapp/allUsers + +# ECOMP Portal Shared Context REST API URL +ecomp_shared_context_rest_url= http://todo_enter_be_hostname:9000/ecompportal/context +# Link shown in Help menu +contact_us_link = https://todo_contact_us_link.com \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml new file mode 100644 index 0000000..bca92c7 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp-definitions.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml new file mode 100644 index 0000000..01a10a2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.hbm.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + seq_dbca_dmaap + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties new file mode 100644 index 0000000..b2c8e0f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/dbcapp/dbcapp.properties @@ -0,0 +1,36 @@ +### +# ================================================================================ +# DCAE DMaaP Bus Controller Web Application +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property +# ================================================================================ +# 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. +# ================================================================================ +### +# Properties for the Data Bus Controller webapp + +dmaap.rest.url.list = http://10.0.4.102:18080/webapi + +# webapp's mechid is sent to DCAE for authorization; +dmaap.mechid.name = xxxxx@dbcapp.dmaap.dcae.openecomp.org +# encrypted with CipherUtil +dmaap.mechid.password = xxxxxxxxxx + +# Valid access methods are "dao" and "rest" +profile.access.method = dao + +# these properties are required if the access method is rest +profile.microservice.url = http://localhost:8081/dbus +profile.microservice.user.name = dbus_user +# encrypted with CipherUtil +profile.microservice.user.password = xxxxxxxxxxxxxxxxxxxxx diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml new file mode 100644 index 0000000..91b6440 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/defs/definitions.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties new file mode 100644 index 0000000..5a43646 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/conf/fusion.properties @@ -0,0 +1,61 @@ +### +# ================================================================================ +# DCAE DMaaP Bus Controller Web Application +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property +# ================================================================================ +# 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. +# ================================================================================ +### + + +# validator settings +#default_error_message = Default error message + +#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. + +authentication_mechanism = BOTH + +user_attribute_name = user + +# User Session settings +#user_attribute_name = user +roles_attribute_name = roles +role_functions_attribute_name = role_functions +#client_device_attribute_name = client_device +#client_device_emulation = false + + +# menu settings +menu_query_name = menuData +#menu_properties_file_location = /WEB-INF/fusion/menu/ +application_menu_set_name = APP +application_menu_attribute_name = applicationMenuData +#application_menu_properties_name = menu.properties +business_direct_menu_set_name = BD +#business_direct_menu_properties_name = bd.menu.properties +business_direct_menu_attribute_name = businessDirectMenuData + +# RAPTOR config settings +#raptor_config_file_path = /WEB-INF/conf/ + +# Role settings +sys_admin_role_id = 1 +#sys_admin_role_function_delete_from_ui = true + +# Profile Search settings +#profile_search_report_id=181 +#callable_profile_search_report_id=386 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml new file mode 100644 index 0000000..c61aaa6 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/defs/definitions.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/.gitignore b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp new file mode 100644 index 0000000..3415f5c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast.jsp @@ -0,0 +1,137 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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.openecomp.portalsdk.core.web.support.UserUtils" %> +<%@ page import="org.openecomp.portalsdk.core.web.support.ControllerProperties" %> +<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties" %> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + "/> + + + +
+

+ + +

Broadcast Message Edit

+
+ +

Broadcast Message Create

+
+
+

+
+ +
+ Please edit the broadcast message details below: 

+
+
+ +
+
+
+
+ + +
+ +
+
+ + +
+ +
+
+ +
+ + +
+
+
+
+
+
+
+ +
+
+ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp new file mode 100644 index 0000000..182a7e3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/broadcast_list.jsp @@ -0,0 +1,201 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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="java.util.*" %> +<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %> +<%@ page import="org.json.JSONObject" %> +<%@ page import="java.io.StringWriter" %> +<%@ page import="org.openecomp.portalsdk.core.web.support.ControllerProperties" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + +
+

+ Broadcast Messages +

+
+ + <%-- Display a table for the broadcast messages of each message location --%> +
+ +
+ {{location.label}} Messages +
+ + + + + + + + + + + + + + + + + {{message.id}} + + + + + + + + + + + +
No.Message TextStart DateEnd DateSort OrderServerActive?Delete?
{{$index+1}}{{message.messageText}} + {{message.displayStartDate}} + {{message.displayEndDate}}{{message.sortOrder}}{{message.siteCd}} +
+ +
+
+
+
+
+ +


+
+
+ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp new file mode 100644 index 0000000..1b538e3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/collaborateList.jsp @@ -0,0 +1,146 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
+
+

User List

+
+ + + + + + + + + + + + + + + + + + + + + + +
User IDLast NameFirst NameEmailUserIdOnline/Offline
+ Offline + Online +
+
+
+
+ Rows Per Page: + +
+
+ Current Page: + +
+
+ Total Page(s): + +
+ + +
+ + + + + + + + + + + +
diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp new file mode 100644 index 0000000..933b214 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/data_out.jsp @@ -0,0 +1,20 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +${model.output_string} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp new file mode 100644 index 0000000..102c920 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_footer.jsp @@ -0,0 +1,46 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + + +
+
+ +
+ +
+
+
+ + +
+
+
+
+
+
+
+ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp new file mode 100644 index 0000000..b10cf6c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/ebz_header.jsp @@ -0,0 +1,799 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ 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.openecomp.portalsdk.core.util.SystemProperties"%> +<%@ page import="org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiProperties"%> +<%@ page import="org.openecomp.portalsdk.core.onboarding.crossapi.PortalApiConstants"%> +<%@ page import="org.openecomp.portalsdk.core.domain.MenuData"%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + +" /> +" /> + +<% + String contactUsLink = SystemProperties.getProperty(SystemProperties.CONTACT_US_LINK); + String redirectUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL); + String portalUrl = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/processSingleSignOn"; + String getAccessLink = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/get_access"; +%> + + + + +<%@include file="/WEB-INF/fusion/jsp/ebz/loginSnippet.html" %> + +
+
+ +
+
+
+ + +
+
+
+
+
  • + + ECOMP Portal +
  • +
    +
    + +
    +
    + + +
    + + +
    +
    +
    +
  • + Unable to load menus +
  • +
    + +
    +
  • +
    + + +
    +
  • +
  •  
  • +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + + +     {{app_name}} + +
    +
    +
    +
    + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html new file mode 100644 index 0000000..c71775b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz/loginSnippet.html @@ -0,0 +1,120 @@ + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp new file mode 100644 index 0000000..5bc66ea --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template.jsp @@ -0,0 +1,45 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> + + + + + <%@ include file="/WEB-INF/fusion/jsp/meta.jsp" %> + + + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp new file mode 100644 index 0000000..b3124fe --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_noheader_nofooter.jsp @@ -0,0 +1,35 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> + + + <%@ include file="/WEB-INF/fusion/jsp/meta.jsp" %> + +
    + +
    +
    + +
    +
    + +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp new file mode 100644 index 0000000..54b85f8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/ebz_template_report_embedded.jsp @@ -0,0 +1,48 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> + + + <%@ include file="/WEB-INF/fusion/jsp/meta.jsp" %> + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp new file mode 100644 index 0000000..938e6fe --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_search_demo.jsp @@ -0,0 +1,97 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + + + +
    +
    Elastic Search - Corporate Location Data System
    +
    +
    + +   +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Customer NamePhoneStreetCityStateZIPCLLI
    {{options._source.name}}{{options._source.suggest.payload.tn}}{{options._source.suggest.payload.addr}}{{options._source.suggest.payload.city}}{{options._source.suggest.payload.st}}{{options._source.suggest.payload.zip}}{{options._source.suggest.payload.clli}}
    +
    +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp new file mode 100644 index 0000000..17548e8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/es_suggest_demo.jsp @@ -0,0 +1,97 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + + + +
    +
    Elastic Search - Corporate Location Data System
    +
    +
    + +   +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Customer NamePhoneStreetCityStateZIPCLLI
    {{options.text}}{{options.payload.tn}}{{options.payload.addr}}{{options.payload.city}}{{options.payload.st}}{{options.payload.zip}}{{options.payload.clli}}
    +
    +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp new file mode 100644 index 0000000..2a8f082 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/frame_insert.jsp @@ -0,0 +1,44 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp new file mode 100644 index 0000000..dd0c98e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/include.jsp @@ -0,0 +1,30 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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.openecomp.portalsdk.core.util.SystemProperties" %> +<%@ page import="org.openecomp.portalsdk.core.web.support.AppUtils" %> + +<%@ page import="java.util.LinkedHashMap" %> + + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp new file mode 100644 index 0000000..4fbaffa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/jcs_admin.jsp @@ -0,0 +1,144 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp"%> --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
    +

    Cache Regions

    + These are the regions which are currently defined in the cache. 'Items' and 'Bytes' refer to the elements currently in memory (not spooled). + You can clear all items for a region by clicking on the Clear icon next to the desired region below. You can also clear all regions which + empties the entire cache.

    + +
    +
    +
    Cache Name
    +
    # of Items
    +
    Bytes
    +
    Status
    +
    Memory Hits
    +
    Aux Hits
    +
    Not Found Misses
    +
    Expired Misses
    +
    Clear?
    +
    Items
    +
    +
    +
    + +
    {{region.size}}
    +
    {{region.byteCount}}
    +
    {{region.status}}
    +
    {{region.hitCountRam}}
    +
    {{region.hitCountAux}}
    +
    {{region.missCountNotFound}}
    +
    {{region.missCountExpired}}
    +
    +
    +
    +
    +
    +
    + +
    Key
    +
    Eternal?
    +
    Created
    +
    Max Life
    +
    Expires
    +
    Clear?
    +
    +
    +
    + + +
    {{item.eternal}}
    +
    {{item.createTime}}
    +
    {{item.maxLifeSeconds}}
    +
    {{item.expiresInSeconds}}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp new file mode 100644 index 0000000..1044775 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/meta.jsp @@ -0,0 +1,36 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html new file mode 100644 index 0000000..ccff557 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal.html @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html new file mode 100644 index 0000000..d573ba5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_role.html @@ -0,0 +1,274 @@ + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html new file mode 100644 index 0000000..50f7fee --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/popup_modal_rolefunction.html @@ -0,0 +1,87 @@ + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp new file mode 100644 index 0000000..4a0dd4e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/post_search.jsp @@ -0,0 +1,356 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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="java.util.*" %> +<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %> +<%@ page import="org.json.JSONObject" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_rolefunction.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_role.html" %> + + +
    + +

    WEBPHONE Search

    +
    + Please enter search criteria below:
    + +
    + Last Name:
    + +
    + +
    + First Name:
    + +
    + +
    + UserId:
    + +
    + +
    + Manager OrgUserId:
    + +
    +
    +
    + Organization:
    + +
    + +
    + Email:
    + +
    +
    + +
    + + + +
    +
    + {{noResultsString}} +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NoNameOrgUserIdOrganizationPhoneEmailImport?
    + {{$index + 1}} + +
    + {{profile.lastName}}, {{profile.firstName}} +
    + + +
    + {{profile.orgUserId}} + + {{profile.orgCode}} + + {{profile.phone}} + + {{profile.email}} + +
    +
    + +
    +
    +
    + Exists +
    +
    +
    + Rows Per Page: + +
    +
    + Current Page: + +
    +
    + Total Page(s): + +
    + +
    + +
    + +
    + + + + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp new file mode 100644 index 0000000..2123003 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile.jsp @@ -0,0 +1,441 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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.openecomp.portalsdk.core.domain.User"%> +<%@ page import="org.openecomp.portalsdk.core.web.support.UserUtils"%> + +<%@page import="org.openecomp.portalsdk.core.web.support.ControllerProperties"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +<%@ include file="/WEB-INF/fusion/jsp/include.jsp"%> + +
    +

    + + +

    Profile Edit

    +
    + +

    Profile Edit

    +
    +
    +

    +
    + +
    + + Please edit the profile details below: 

    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    + + +
    + + + + + + + + + + + + + + + + +
    NameRemove?
    {{ role.name }} + +
    + + + +
    + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp new file mode 100644 index 0000000..c27599c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/profile_search.jsp @@ -0,0 +1,104 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +
    +
    +

    Profile Search

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    User IDLast NameFirst NameEmailOrgUserIdManager OrgUserIdEditActive?
    {{rowData.id}}{{rowData.lastName}}{{rowData.firstName}}{{rowData.email}}{{rowData.orgUserId}}{{rowData.managerId}} +
    + +
    +
    +
    +
    +
    + Rows Per Page: + +
    +
    + Current Page: + +
    +
    + Total Page(s): + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp new file mode 100644 index 0000000..45f600b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role.jsp @@ -0,0 +1,286 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_rolefunction.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_role.html" %> + +
    + +
    +
    +

    + + +

    Role Edit

    +
    + +

    Role Create

    +
    +
    +

    +
    + +
    + +
    + Please edit the role details below: 
    + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    + + + + + + + + + + + + + + +
    NameRemove?
    {{ roleFunction.name }} +
    +
    + Manage Role Functions

    + +
    + + +
    + + + + + + + + + + + + + + +
    NameRemove?
    {{ role.name }} +
    +
    + +
    + + + + + + + + + + + + + + +
    Role
    +
    + +
    +
    {{ availableRole.name }}
    +
    +
    + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp new file mode 100644 index 0000000..45c2d10 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_function_list.jsp @@ -0,0 +1,213 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<%@ include file="/WEB-INF/fusion/jsp/popup_modal_rolefunction.html" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +
    +
    + +

    Role Functions

    + + +

    + +
    + +
    + Click on the edit icon to update a role function, the plus icon to add additional role functions, or the delete icon to remove them. +
    +
    + + + + + + + + + + + + + + + + + +
    NameCodeEdit?Delete?
    {{ availableRoleFunction.name }}{{ availableRoleFunction.code }} + +
    +
    + +
    +
    +
    + + + + + + +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    + +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp new file mode 100644 index 0000000..dbf8878 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/role_list.jsp @@ -0,0 +1,139 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
    +

    Roles

    +
    +
    +Click on a Role to view its details. + +
    +
    + + + + + + + + + + + + + + + + + + +
    NamePriorityActive?Delete?
    {{ availableRole.name }}{{ availableRole.priority }} +
    + +
    +
    +
    +
    +
    + +
    + +
    + +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp new file mode 100644 index 0000000..6e8a370 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/usage_list.jsp @@ -0,0 +1,87 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + +<%-- <%@ include file="/WEB-INF/fusion/jsp/include.jsp" %> --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + +
    +
    +

    + Usage +

    +
    +
    + The following shows all users currently logged into the application. Click the icon to expel a user from the application. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current User Sessions
    User IdUser NameEmailLast Access Time (minutes)Time Remaining (minutes)Expel?
    {{user.id}}{{user.lastName}}{{user.email}}{{user.lastAccess}}{{user.remaining}}
    Current Session
    +
    +
    +
    +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp new file mode 100644 index 0000000..ac80a91 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/jsp/webrtc/collaboration.jsp @@ -0,0 +1,492 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    + +
    +
    + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml new file mode 100644 index 0000000..2520c9a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Fusion.hbm.xml @@ -0,0 +1,352 @@ + + + + + + + + + + + + seq_fn_user + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_audit_log + + + + + + + + + + + + + seq_fn_role + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_menu + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + seq_fn_broadcast_message + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select distinct md.parentMenu.id from MenuData as md where md.label = :paramLabel and md.label is not null + + + + select distinct md.id from MenuData as md where md.label = :paramLabel + + + + select distinct md.id, md.label, md.parentMenu.id from MenuData as md where md.label is not null + + + + select distinct functionCd from MenuData + + + + select distinct code from RoleFunction + + + + from MenuData where menuSetCode = :menu_set_cd and parentMenu is null + + + FROM UrlsAccessible A where upper(A.urlsAccessibleKey.url) = upper(:current_url) + + + + select firstName, lastName from User where id = :user_id + + + + select email from User where id = :user_id + + + + select id, firstName, lastName from User where active = true order by lastName, firstName + + + + select name from Role where id = :role_id + + + + select id, name from Role order by name + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml new file mode 100644 index 0000000..25fe5d9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml new file mode 100644 index 0000000..e524706 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/fusion/orm/Workflow.hbm.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp new file mode 100644 index 0000000..fad43e4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/error.jsp @@ -0,0 +1,20 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +${errMsg} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp new file mode 100644 index 0000000..5351ec0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/leafletMap.jsp @@ -0,0 +1,288 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + + + + + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + +
    SiteUsage
    + + + + + + + + + +
    LinkUsage
    +
    + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp new file mode 100644 index 0000000..870cb50 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/login_external.jsp @@ -0,0 +1,154 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties" %> + +" /> + + + + + + + Login + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +

    ECOMP Portal

    + + +
    +
    + + +
    +
    +                + +
    +
    +
    +






    + +
    + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp new file mode 100644 index 0000000..2ed9758 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/net_map.jsp @@ -0,0 +1,38 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> + + + + + + + + + +
    + +
    + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp new file mode 100644 index 0000000..9be47c5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/user_profile.jsp @@ -0,0 +1,84 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ include file="/WEB-INF/fusion/jsp/popup_modal.html" %> +
    +
    +

    Profile Search

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    User IDLast NameFirst NameEmailOrgUserIdManager OrgUserId
    {{rowData.id}}{{rowData.last_name}}{{rowData.first_name}}{{rowData.email}}{{rowData.orgUserId}}{{rowData.org_manager_userid}}
    +
    +
    +
    + Rows Per Page: + +
    +
    + Current Page: + +
    +
    + Total Page(s): + +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp new file mode 100644 index 0000000..8d84668 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/jsp/welcome.jsp @@ -0,0 +1,629 @@ +<%-- + ================================================================================ + DCAE DMaaP Bus Controller Web Application + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property + ================================================================================ + 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. + ================================================================================ + --%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + Welcome ${sessionScope.user.firstName} ${sessionScope.user.lastName}  + (Last Login:  ${lastLogin}) +
    + +
    +
    +
    +
    +
    + +
    + + + + +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    + + +
    +
    + +
    + +
    +
    +
      +
    • {{Daytab.title}}
    • +
    +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
      +
    • {{TrafficTab.title}}
    • +
    +
    +
    +
    + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + +
    JQuery + +
    Animated Map + +
    Chat Session + +
    +
    +
    +
    +
    + +
    + + + + + + + + + +
    + +
    + + +
    + +
    +
    +
    +
    + +
    + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..40529a0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,38 @@ + + + + + + dmaap-bc-app + + + + + + + 37 + COOKIE + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/att-globe-16x16.ico b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/att-globe-16x16.ico new file mode 100644 index 0000000..d2c5e0f Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/att-globe-16x16.ico differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js new file mode 100644 index 0000000..36b7dd0 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-list-controller.js @@ -0,0 +1,286 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('drFeedListCtrl', function($scope, $log, $modal, modalService, DRFeedService) { + + // populates the table of Data Router feeds + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData = []; + $scope.dbcapp.currentPageNum = 1; + $scope.dbcapp.totalPages = 1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg = null; + $scope.dbcapp.isDataLoading = true; + $scope.dbcapp.isRequestFailed = false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of data router feeds. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, or an + * error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DRFeedService.getFeedsByPage($scope.dbcapp.currentPageNum, $scope.dbcapp.viewPerPage) + .then(function(jsonObj) { + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName=jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations=jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading = false; + }, function(error) { + $log.error("drFeedListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to add a feed. + * Passes data in via an object named "message". + * On success, updates the table. + */ + $scope.dbcapp.addFeedModalPopup = function() { + $scope.dbcapp.editFeed = null; + var modalInstance = $modal.open({ + templateUrl : 'add_feed_popup.html', + controller : 'feedPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + feed : $scope.dbcapp.editFeed, + feedList : $scope.dbcapp.tableData, + dcaeList: $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + // $log.debug('addFeedModalPopup: response: ' + JSON.stringify(response)); + if (response == null) { + // $log.debug('addFeedModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Failed', + 'Failed to add feed:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }); + }; + + /** + * Shows a modal pop-up to edit a feed. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editFeedModalPopup = function(feed) { + $scope.dbcapp.editFeed = feed; + var modalInstance = $modal.open({ + templateUrl : 'edit_feed_popup.html', + controller : 'feedPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + feed : $scope.dbcapp.editFeed, + feedList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editFeedModalPopup: user closed dialog'); + } + else { + // $log.debug('editFeedModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) + modalService.showFailure('Edit Failed', + 'Failed to edit feed ' + feed.feedName + + '\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a feed. + * On successful completion, updates the table. + */ + $scope.dbcapp.deleteFeedModalPopup = function(feed) { + modalService.popupConfirmWin("Confirm", "Delete the feed: " + + feed.feedName + "\nContinue?", function() { + DRFeedService.deleteFeed(feed.feedId).then( + function(response) { + // $log.debug('deleteFeedModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) { + $log.error('deleteFeedModalPopup: failed to delete: ' + response.error); + modalService.showFailure('Delete Failed', + 'Failed to delete feed ' + feed.feedName + + '\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + $log.error('deleteFeed failed'); + modalService.showFailure('Delete Failed', 'feedListCtrl failed to delete object: ' + + JSON.stringify(error)); + }); + }) + }; + + /** + * Shows a modal pop-up with all publishers and subscribers of a feed. + * Passes data in via an object named "message". + */ + $scope.dbcapp.showFeedPubsSubsModalPopup = function(feed) { + var modalInstance = $modal.open({ + templateUrl : 'feed_pub_sub_list_popup.html', + controller : 'feedPubSubListPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + feed : feed + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + // No response expected. + }); + }; + + /** + * Shows a modal pop-up to add a feed publisher. + * Passes data in via an object named "message". + * On successful completion, updates the table. + */ + $scope.dbcapp.addFeedPublisherModalPopup = function(feed) { + $scope.dbcapp.editPub = { feedId : feed.feedId } + var modalInstance = $modal.open({ + templateUrl : 'edit_pub_popup.html', + controller : 'pubPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + pub : $scope.dbcapp.editPub, + pubList : [], + dcaeList: $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addFeedPublisherModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Publisher Failed', + 'Failed to add publisher to feed:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to add a feed subscriber. + * Passes data in via an object named "message". + * On successful completion, updates the table. + */ + $scope.dbcapp.addFeedSubscriberModalPopup = function(feed) { + // Create a subscriber object with the feed ID + $scope.dbcapp.editSub = { feedId : feed.feedId } + var modalInstance = $modal.open({ + templateUrl : 'edit_sub_popup.html', + controller : 'subPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + sub : $scope.dbcapp.editSub, + subList : [], + dcaeList: $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addFeedSubscriberModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Subscriber Failed', + 'Failed to add subscriber to feed:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js new file mode 100644 index 0000000..4efef98 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-popup-controller.js @@ -0,0 +1,125 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('feedPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DRFeedService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.feed == null) { + $scope.dbcapp.label = 'Add Feed'; + // Must add publisher with a feed. + $scope.dbcapp.editFeed = + { + pubs: [ + { username: null } + ] + }; + } + else { + $scope.dbcapp.label = 'Edit Feed'; + $scope.dbcapp.editFeed = message.feed; + } + $scope.dbcapp.dcaeList = message.dcaeList; + + // for populating selection boxes on add and edit popup templates + $scope.dbcapp.asprClassificationList = [ + "unclassified", + "Non-Sensitive Customer Data", + "AT&T Proprietary (Internal Use Only)", + "AT&T Proprietary (Secure Restricted)", + "AT&T Proprietary (Restricted)", + "AT&T Proprietary (Sensitive Personal Information)", + "Customer Sensitive Data", + "Customer Data Conduit", + ]; + + /** + * Validates content of user-editable fields. + * Uses the list in message.feedList + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateFeed = function(feed) { + if (feed == null) + return "No data found.\nPlease enter some values."; + if (feed.feedName == null || feed.feedName.trim() == '') + return "Name is required.\nPlease enter a value."; + if (feed.feedVersion == null || feed.feedVersion.trim() == '') + return "Version is required.\nPlease enter a value."; + if (feed.feedDescription == null || feed.feedDescription.trim() == '') + return "Description is required.\nPlease enter a value."; + if (feed.asprClassification == null || feed.asprClassification.trim() == '') + return "ASPR Classification is required.\nPlease select a value."; + for (var x in message.feedList) { + // Ignore the one being edited. + if (message.feedList[x].feedId == feed.feedId) + continue; + if (message.feedList[x].feedName == feed.feedName) + return "Name " + feed.feedName + " exists.\n" + + "Please choose a different name."; + } + // Extra validation if adding a new feed - check first publisher + if (feed.feedId == null && feed.pubs != null && feed.pubs[0] != null) { + $log.info('validateFeed: pubs[0] is ' + JSON.stringify(feed.pubs[0])); + if (feed.pubs[0].dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + // username, userpwd are optional + } + return null; + } + + $scope.dbcapp.saveFeed = function(feed) { + var validateMsg = $scope.dbcapp.validateFeed(feed); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (feed.feedId == null) { + // No id, so create a new one + DRFeedService.addFeed(feed) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('feedPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DRFeedService.updateFeed(feed) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('feedPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js new file mode 100644 index 0000000..3c15370 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-pub-sub-list-popup-controller.js @@ -0,0 +1,38 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('feedPubSubListPopupCtrl', function($scope, $log, $modalInstance, modalService, message) { + + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + $scope.dbcapp.label = 'Pub/Sub of Feed ' + message.feed.feedName; + + // Source of data table + $scope.dbcapp.showFeed = message.feed; + + // $log.debug('feedPubSubListPopupCtrl: showFeed.pubs is ' + JSON.stringify($scope.dbcapp.showFeed.pubs)); + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js new file mode 100644 index 0000000..a3700dd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-feed-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.factory('DRFeedService', function ($http, $q, $log) { + return { + /** + * Gets one page of data router feed objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getFeedsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dr_feed?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.getFeedsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.getFeedsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new feed. + addFeed: function(feed) { + return $http({ + method: 'POST', + url: 'dr_feed', + data: feed, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.addFeed: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.addFeed failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing feed. + updateFeed: function(feed) { + return $http({ + method: 'PUT', + url: 'dr_feed/' + feed.feedId, + data: feed, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.updateFeed: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.updateFeed failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the feed with the specified ID. + deleteFeed: function(feedId) { + return $http({ + method: 'DELETE', + url: 'dr_feed/' + feedId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRFeedService.deleteFeed: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRFeedService.deleteFeed failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js new file mode 100644 index 0000000..ba90900 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-list-controller.js @@ -0,0 +1,149 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('drPubListCtrl', function($scope, $log, $modal, modalService, DRPubService) { + + // populates the list of Data Router publishers. + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of data router publishers. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, or an + * error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DRPubService.getPubsByPage($scope.dbcapp.currentPageNum,$scope.dbcapp.viewPerPage) + .then(function(jsonObj) { + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading = false; + },function(error){ + $log.error("drPubListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to edit a publisher. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editPubModalPopup = function(pub) { + $scope.dbcapp.editPub = pub; + var modalInstance = $modal.open({ + templateUrl : 'edit_pub_popup.html', + controller : 'pubPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + pub : $scope.dbcapp.editPub, + pubList : $scope.dbcapp.tableData, + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editPubModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Update Failed', + 'Failed to update publisher:\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a publisher. + * On successful completion, updates the table. + */ + $scope.dbcapp.deletePubModalPopup = function(pub) { + modalService.popupConfirmWin("Confirm", "Delete the publisher: " + + pub.pubId + "\nContinue?", function() { + DRPubService.deletePub(pub.pubId).then( + function(response) { + if (response.error != null) + modalService.showFailure('Delete Failed', + 'Failed to delete publisher ' + pub.pubId + + '\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable() + }, + function(error) { + modalService.showFailure('Delete Failed', 'pubListCtrl failed to delete: ' + + JSON.stringify(error)); + }); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js new file mode 100644 index 0000000..07b80e4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-popup-controller.js @@ -0,0 +1,82 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('pubPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DRPubService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.pub == null || message.pub.subId == null) + $scope.dbcapp.label = 'Add Publisher'; + else + $scope.dbcapp.label = 'Edit Publisher'; + $scope.dbcapp.editPub = message.pub; + $scope.dbcapp.dcaeList = message.dcaeList; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validatePub = function(pub) { + if (pub == null) + return "No data found.\nPlease enter some values."; + if (pub.dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + return null; + } + + $scope.dbcapp.savePub = function(pub) { + var validateMsg = $scope.dbcapp.validatePub(pub); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (pub.pubId == null) { + // No id, so create a new one + DRPubService.addPub(pub) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('pubPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DRPubService.updatePub(pub) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('pubPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js new file mode 100644 index 0000000..f317c0f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-pub-service.js @@ -0,0 +1,106 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.factory('DRPubService', function ($http, $q, $log) { + return { + /** + * Gets one page of data router publisher objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getPubsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dr_pub?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.getPubsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.getPubsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new publisher. + addPub: function(pub) { + return $http({ + method: 'POST', + url: 'dr_pub', + data: pub, + responseType: 'json' }) + .then(function(response) { + // $log.debug('DRPubService.addPub: response: ' + JSON.stringify(response)); + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.addPub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.addPub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing publisher. + updatePub: function(pub) { + return $http({ + method: 'PUT', + url: 'dr_pub/' + pub.pubId, + data: pub, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.updatePub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.updatePub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the publisher with the specified ID. + deletePub: function(pubId) { + return $http({ + method: 'DELETE', + url: 'dr_pub/' + pubId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRPubService.deletePub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRPubService.deletePub failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js new file mode 100644 index 0000000..4faf695 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-list-controller.js @@ -0,0 +1,149 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('drSubListCtrl', function($scope, $log, $modal, modalService, DRSubService) { + + // populates the list of Data Router subscribers. + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of data router subscribers. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, or an + * error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DRSubService.getSubsByPage($scope.dbcapp.currentPageNum,$scope.dbcapp.viewPerPage) + .then(function(jsonObj){ + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading = false; + },function(error){ + $log.error("drSubListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to edit a subscriber. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editSubModalPopup = function(sub) { + $scope.dbcapp.editSub = sub; + var modalInstance = $modal.open({ + templateUrl : 'edit_sub_popup.html', + controller : 'subPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + sub : $scope.dbcapp.editSub, + subList : $scope.dbcapp.tableData, + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editSubModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Update Failed', + 'Failed to update subscriber:\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a subscriber. + * On successful completion, updates the table. + */ + $scope.dbcapp.deleteSubModalPopup = function(sub) { + modalService.popupConfirmWin("Confirm", "Delete the subscriber: " + + sub.subId + "\nContinue?", function() { + DRSubService.deleteSub(sub.subId).then( + function(response) { + if (response.error != null) + modalService.showFailure('Delete Failed', + 'Failed to delete subscriber ' + sub.subId + + '\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable() + }, + function(error) { + modalService.showFailure('Delete Failed', 'subListCtrl failed to delete: ' + + JSON.stringify(error)); + }); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js new file mode 100644 index 0000000..c920fc1 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-popup-controller.js @@ -0,0 +1,89 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('subPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DRSubService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.sub == null || message.sub.subId == null) + $scope.dbcapp.label = 'Add Subscriber'; + else + $scope.dbcapp.label = 'Edit Subscriber'; + $scope.dbcapp.editSub = message.sub; + $scope.dbcapp.dcaeList = message.dcaeList; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateSub = function(sub) { + if (sub == null) + return "No data found.\nPlease enter some values."; + if (sub.dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + if (sub.deliveryURL == null || sub.deliveryURL.trim() == '') + return "Delivery URL is required.\nPlease enter a value."; + if (sub.username == null || sub.username.trim() == '') + return "User Name is required.\nPlease enter a value."; + if (sub.userpwd == null || sub.userpwd.trim() == '') + return "Password is required.\nPlease enter a value."; + return null; + } + + $scope.dbcapp.saveSub = function(sub) { + var validateMsg = $scope.dbcapp.validateSub(sub); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (sub.subId == null) { + // No id, so create a new one + DRSubService.addSub(sub) + .then(function(response) { + // $log.debug('subPopupCtrl.saveSub: ' + JSON.stringify(response)); + $modalInstance.close(response); + }, + function (error) { + $log.error('subPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DRSubService.updateSub(sub) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('subPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js new file mode 100644 index 0000000..f399282 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr-sub-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.factory('DRSubService', function ($http, $q, $log) { + return { + /** + * Gets one page of data router subscriber objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getSubsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dr_sub?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.getSubsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.getSubsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new subscriber. + addSub: function(sub) { + return $http({ + method: 'POST', + url: 'dr_sub', + data: sub, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.addSub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.addSub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing subscriber. + updateSub: function(sub) { + return $http({ + method: 'PUT', + url: 'dr_sub/' + sub.subId, + data: sub, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.updateSub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.updateSub failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the subscriber with the specified ID. + deleteSub: function(subId) { + return $http({ + method: 'DELETE', + url: 'dr_sub/' + subId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DRSubService.deleteSub: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DRSubService.deleteSub failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html new file mode 100644 index 0000000..d0d6d94 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_add_popup_template.html @@ -0,0 +1,104 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html new file mode 100644 index 0000000..3fc6d74 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_edit_popup_template.html @@ -0,0 +1,75 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html new file mode 100644 index 0000000..1cff03b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_list.html @@ -0,0 +1,177 @@ + + + +
    +

    Data Router Feeds

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameVerDescriptionClassificationPublish URLLog URLOwnerStatusSuspP+SPubSubDel
    + + + + + + + + + + {{rowData.suspended | dbcYesNoFilter}} + + +
    + +P +
    +
    +
    + +S +
    +
    +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html new file mode 100644 index 0000000..80fe26e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_feed_pub_sub_list_popup_template.html @@ -0,0 +1,122 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html new file mode 100644 index 0000000..300ec99 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_list.html @@ -0,0 +1,130 @@ + + + +
    +

    Feed Publishers

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + +
    Pub IDFeed IDDCAE Location NameStatusUser NameDelete
    + + + + + +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html new file mode 100644 index 0000000..0e42f62 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_pub_popup_template.html @@ -0,0 +1,60 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html new file mode 100644 index 0000000..c5d2525 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_list.html @@ -0,0 +1,156 @@ + + + +
    +

    Feed Subscribers

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Sub IDFeed IDDCAE Location NameDelivery URLLog URLOwnerStatusSuspUser NameDelete
    + + + + + + + + {{rowData.suspended | dbcYesNoFilter}} + + +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html new file mode 100644 index 0000000..10f923c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/datarouter/dr_sub_popup_template.html @@ -0,0 +1,72 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js new file mode 100644 index 0000000..0c60aee --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-list-controller.js @@ -0,0 +1,194 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('dmaapAccessListCtrl', function ($scope, $log, $modal, modalService, DmaapAccessService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // Model for radio-button selection group. + // Uses database row ID as unique value. + $scope.dbcapp.selectDmaapModel = { id: null }; + $("#dialog").hide(); + $scope.dbcapp.isDataLoading=true; + + /** + * Loads the table of DMaaP access profiles. + * + * Interprets the remote controller's response and copies to scope + * variables. The response is either list to be assigned to tableData, + * or an error to be shown. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + DmaapAccessService.getDmaapAccessList() + .then(function(jsonObj) { + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.tableData = jsonObj.data; + $scope.dbcapp.updateDmaapAccessSelection(); + } + $scope.dbcapp.isDataLoading = false; + }, function(error) { + // Called with a string, not JSON obj. + $log.error("dmaapAccessListCtrl.getDmaapAccessList failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Sets a value in the model for the radio-button selection group. + */ + $scope.dbcapp.updateDmaapAccessSelection = function() { + for (var i in $scope.dbcapp.tableData) { + var da = $scope.dbcapp.tableData[i]; + // Set radio button for the selected profile + // $log.info('dmaapAccessListCtrl: examining ' + JSON.stringify(da)); + if (da.selected) { + // $log.info('dmaapAccessListCtrl: selecting id ' + da.id); + $scope.dbcapp.selectDmaapModel.id = da.id; + } + } + }; + + /** + * Handles a click on radio button to select a profile. + */ + $scope.dbcapp.selectDmaapAccess = function(dmaapAccess) { + if (dmaapAccess == null || dmaapAccess.id == null) + $log.error('selectDmaapAccess invoked with null'); + else + DmaapAccessService.setSelectedDmaapAccess(dmaapAccess.id); + }; + + /** + * Shows a modal pop-up to add a DMaaP access profile. + * Passes data in via an object named "message". + * On successful completion, updates the profile list. + * + * After implementing DE238329, this is never called. + */ + $scope.dbcapp.addDmaapAccessModalPopup = function() { + $scope.dbcapp.editDmaapAccess = null; + var modalInstance = $modal.open({ + templateUrl: 'edit_dmaap_access_popup.html', + controller: 'dmaapAccessPopupCtrl', + resolve: { + message: function () { + var dataForPopup = { + dmaapAccess : $scope.dbcapp.editDmaapAccess, + dmaapAccessList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addDmaapAccessModelPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Profile Failed', + 'Failed to add access profile:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to edit a DMaaP access profile. + * Passes data in via an object named "message". + * On successful completion, updates the profile list. + */ + $scope.dbcapp.editDmaapAccessModalPopup = function(dmaapAccess) { + // edit a copy, not the model for the table row. + $scope.dbcapp.editDmaapAccess = JSON.parse(JSON.stringify(dmaapAccess)); + var modalInstance = $modal.open({ + templateUrl: 'edit_dmaap_access_popup.html', + controller: 'dmaapAccessPopupCtrl', + resolve: { + message: function () { + var dataForPopup = { + dmaapAccess : $scope.dbcapp.editDmaapAccess, + dmaapAccessList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addDmaapAccessModelPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Edit Profile Failed', + 'Failed to edit access profile:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a DMaaP access profile. + * On successful completion, updates the profile list. + * + * After implementing DE238329, this is never called. + */ + $scope.dbcapp.deleteDmaapAccess = function(dmaapAccess) { + modalService.popupConfirmWin("Confirm", "Delete the DMaaP access profile: " + + dmaapAccess.name + "\nContinue?", + function() { + // $log.debug('deleteDmaapAccess: deleting id ' + dmaapAccess.id); + DmaapAccessService.deleteDmaapAccess(dmaapAccess.id).then( + function(response) { + if (response.error != null) { + $log.error('deleteDmaapAccess: failed to delete: ' + response.error); + modalService.showFailure('Delete Failed', + 'Failed to delete access profile:\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + $log.error('deleteDmaapAccess failed: ' + error); + modalService.showFailure("Fail", "dmaapAccessListCtrl failed to delete object"); + }); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js new file mode 100644 index 0000000..d4d2301 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-popup-controller.js @@ -0,0 +1,125 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('dmaapAccessPopupCtrl', function($scope, $log, $modalInstance, modalService, message, DmaapAccessService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.dmaapAccess == null) + $scope.dbcapp.label = 'Add Access Profile'; + else + $scope.dbcapp.label = 'Edit Access Profile'; + $scope.dbcapp.editDmaapAccess = message.dmaapAccess; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateProfile = function(dmaapAccess) { + if (dmaapAccess == null) + return "No data found.\nPlease enter some values."; + if (dmaapAccess.name == null || dmaapAccess.name.trim() == '') + return "Name is required.\nPlease enter a value."; + // User cannot edit URL + //if (dmaapAccess.dmaapUrl == null || dmaapAccess.dmaapUrl.trim() == '') + // return "URL is required.\nPlease enter a value."; + //if (dmaapAccess.dmaapUrl.toLowerCase().indexOf('http') != 0) + // return "Unexpected URL prefix.\nPlease enter a URL starting with 'http'."; + for (var x in message.dmaapAccessList) { + // $log.debug('saveDmaapAccess: checking item >' + message.dmaapAccessList[x].name + '<'); + // Ignore the name in the one being edited. + if (message.dmaapAccessList[x].id == dmaapAccess.id) + continue; + if (message.dmaapAccessList[x].name == dmaapAccess.name) + return "Name " + dmaapAccess.name + " exists.\nPlease enter a different name."; + } + return null; + } + + /** + * Tests the URL for validity. Shows a modal dialog to display test result. + * Returns nothing. + */ + $scope.dbcapp.testDmaapAccess = function(dmaapAccess) { + if (dmaapAccess == null || dmaapAccess.dmaapUrl == null || dmaapAccess.dmaapUrl.trim() == '') { + modalService.showFailure("Missing Input", "No URL found.\nPlease enter a URL."); + return; + } + // result should have a data aggregate that's a serialized DMaaP object + DmaapAccessService.testDmaapAccess(dmaapAccess) + .then(function(response) { + if (response.error != null) + modalService.showFailure("Invalid Content", response.error); + else + modalService.showSuccess("Valid URL", "DMaaP name is " + response.data.dmaapName) + }, + function (error) { + modalService.showFailure("Invalid Content", error); + } + ); + } + + /** + * Validates the content; on success, calls service to save it. + */ + $scope.dbcapp.saveDmaapAccess = function(dmaapAccess) { + var validateMsg = $scope.dbcapp.validateProfile(dmaapAccess); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + // Set the selected flag if this is the only access profile. + if (dmaapAccess.id == null && message.dmaapAccessList.length == 0) + dmaapAccess.selected = true; + + if (dmaapAccess.id == null) { + // No id, so create a new one + DmaapAccessService.addDmaapAccess(dmaapAccess) + .then(function(dmaapAccessList) { + + $modalInstance.close(dmaapAccessList); + }, + function (error) { + $log.error('dmaapAccessPopupCtrl: error while adding: ' + error); + } + ); + } + else { + // Has id, so update an existing one + DmaapAccessService.updateDmaapAccess(dmaapAccess) + .then(function(dmaapAccessList) { + $modalInstance.close(dmaapAccessList); + }, + function (error) { + $log.error('dmaapAccessPopupCtrl: error while updating: ' + error); + } + ); + } + + }; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js new file mode 100644 index 0000000..8e92c67 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap-access-service.js @@ -0,0 +1,160 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.factory('DmaapAccessService', function ($http, $q, $log) { + return { + /** + * Gets the list of DMaaP access profiles for the current user (not paginated). + * @return {JSON} Response object from remote side + */ + getDmaapAccessList: function() { + // cache control for IE + var cc = "?cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'dmaap_access' + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.getDmaapAccessList: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('DmaapAccessService.getDmaapAccessList failed: ' + error.data); + return $q.reject(error.data); + }); + }, + + // Gets and returns the selected DMaaP access profile for the current user. + getSelectedDmaapAccess: function() { + // cache control for IE + var cc = "?cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'select_dmaap_access' + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.getSelectedDmaapAccess: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('DmaapAccessService.getSelectedDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Selects the specified DMaaP access profile for the current user. + // Returns nothing. + setSelectedDmaapAccess: function(dmaapId) { + return $http({ + method: 'PUT', + url: 'select_dmaap_access/' + dmaapId, + responseType: 'json' }) + .then(function(response) { + // successful response is status:200 + // $log.info('setSelectedDmaapAccess complete: ' + JSON.stringify(response)); + }, function(error) { + $log.error('DmaapAccessService.setSelectedDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new DMaaP access profile for the current user. + // Returns the current DMaaP access list. + addDmaapAccess: function(dmaapAccess) { + return $http({ + method: 'POST', + url: 'dmaap_access', + data: dmaapAccess, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.addDmaapAccess: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DmaapAccessService.addDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing DMaaP access profile for the current user + // Returns the current DMaaP access list. + updateDmaapAccess: function(dmaapAccess) { + return $http({ + method: 'PUT', + url: 'dmaap_access/' + dmaapAccess.id, + data: dmaapAccess, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.updateDmaapAccess: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DmaapAccessService.updateDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Deletes the specified DMaaP access profile for the current user. + // Returns the current DMaaP access list. + deleteDmaapAccess: function(dmaapId) { + return $http({ + method: 'DELETE', + url: 'dmaap_access/' + dmaapId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.deleteDmaapAccess: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('DmaapAccessService.deleteDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Tests the URL in the access profile by fetching the DMaaP object from it. + testDmaapAccess: function(dmaapAccess) { + return $http({ + method: 'POST', + url: 'test_dmaap_access', + data: dmaapAccess, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('DmaapAccessService.testDmaapAccess: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('DmaapAccessService.testDmaapAccess failed: ' + error); + return $q.reject(error.data); + }); + }, + + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html new file mode 100644 index 0000000..381a850 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_list.html @@ -0,0 +1,108 @@ + + + +
    +

    DMaaP + Access Profiles

    +
    + +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    +
    + Click on a radio button to select that profile for use in this web application. +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    SelectedNameURLMech ID
    + + +
    +
    + +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html new file mode 100644 index 0000000..c64f28c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/dmaap_access_popup_template.html @@ -0,0 +1,73 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js new file mode 100644 index 0000000..00b6e3e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/dmaapaccess/modal-popup-controller.js @@ -0,0 +1,26 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('modalpopupController', function ($scope, $modalInstance, message) { + 'use strict'; + // The modalService from modalService.js requires this controller. + // One is provided by fusion/scripts/controllers/modelpopupController.js + // (yes, with spelling error) but that has cruft not required here. + $scope.message = message; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js new file mode 100644 index 0000000..5b9dbca --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-home-controller.js @@ -0,0 +1,66 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('dbcHomeCtrl', function($scope, $log, DmaapAccessService, ManifestService) { + // Loads info to show on the welcome page. + + // this object holds all app data and functions + $scope.dbcapp = {}; + $scope.dbcapp.selectedDmaapAccess=null; + $scope.dbcapp.isDataLoading = true; + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.manifest=null; + + DmaapAccessService.getSelectedDmaapAccess() + .then(function(jsonObj) { + // must match keys in java controller's method + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.selectedDmaapAccess=jsonObj.data; + + // Next get the manifest + ManifestService.getManifest() + .then(function(jsonObj) { + // $log.debug("dbcHomeCtrl: getManifest returned " + JSON.stringify(jsonObj)); + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + } + else { + $scope.dbcapp.manifest=jsonObj.manifest; + } + },function(error){ + $log.error("dbcHomeCtrl getManifest failed: " + error); + }); + + } + $scope.dbcapp.isDataLoading=false; + },function(error){ + $log.error("dbcHomeCtrl: getSelectdDmaapAccess failed: " + error); + $scope.dbcapp.isDataLoading=false; + }); + + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js new file mode 100644 index 0000000..1be3ffc --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-spa-controller.js @@ -0,0 +1,50 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.config(function($routeProvider) { + $routeProvider + .when('/dmaap', { + templateUrl: 'app/dbcapp/dmaapaccess/dmaap_access_list.html', + controller : 'dmaapAccessListCtrl' + }) + .when('/dr_feed', { + templateUrl: 'app/dbcapp/datarouter/dr_feed_list.html', + controller : 'drFeedListCtrl' + }) + .when('/dr_pub', { + templateUrl: 'app/dbcapp/datarouter/dr_pub_list.html', + controller: 'drPubListCtrl' + }) + .when('/dr_sub', { + templateUrl: 'app/dbcapp/datarouter/dr_sub_list.html', + controller: 'drSubListCtrl' + }) + .when('/mr_topic', { + templateUrl: 'app/dbcapp/messagerouter/mr_topic_list.html', + controller : "mrTopicListCtrl" + }) + .when('/mr_client', { + templateUrl: 'app/dbcapp/messagerouter/mr_client_list.html', + controller: 'mrClientListCtrl' + }) + .otherwise({ + templateUrl: 'app/dbcapp/home/dbc_home_body.html', + controller: 'dbcHomeCtrl' + }); +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css new file mode 100644 index 0000000..86944fb --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-style.css @@ -0,0 +1,77 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ + +/* Tweak height and width of password as set fn-ebz.css */ +input[type="password"].fn-ebz-text.dbcpassword { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + height: 40px; + width: 210px; + border: 1px solid gray; + font-size: .875rem; + padding-left: 10px; + margin-top: 0px; /* override */ + margin-right: 20px; +} + +input[type="text"].fn-ebz-text.dbcpagenum { + width: 85px; + height: 30px; + margin-right: 10px; +} + +/* Adjusts height and width to be narrow */ +select.fn-ebz-select.dbcpageselect { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + height: 30px; + width: 85px; + padding-left: 10px; + padding-right: 10px; + background-color: white; + color: black; + margin-top: 8px; + margin-right: 10px; + font-size: 12px; + appearance: none; /* not supported in IE */ + -webkit-appearance: none; /* not supported in IE */ + -moz-appearance: none; /* not supported in IE */ +} + +/* Adjusts height, width and top margin to match text fields */ +select.fn-ebz-select.dbcselect { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + height: 40px; + width: 210px; + padding-left: 10px; + padding-right: 10px; + background-color: white; + color: black; + margin-top: 0px; + margin-right: 10px; + font-size: 12px; + appearance: none; /* not supported in IE */ + -webkit-appearance: none; /* not supported in IE */ + -moz-appearance: none; /* not supported in IE */ +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js new file mode 100644 index 0000000..79eb99d --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc-yn-filter.js @@ -0,0 +1,26 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.filter('dbcYesNoFilter', + function() { + return function(input) { + return input ? 'Y' : 'N'; + } + } +); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html new file mode 100644 index 0000000..9aa56d4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_home_body.html @@ -0,0 +1,51 @@ + + +

    DMaaP Bus Controller

    + +

    Welcome to the DMaaP Bus Controller web application.

    + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Selected DMaaP access profile: +
      +
    • Name: {{dbcapp.selectedDmaapAccess.name}}
    • +
    • URL: {{dbcapp.selectedDmaapAccess.dmaapUrl}}
    • +
    + + Manifest + information: +
      +
    • Build-Number: {{dbcapp.manifest['Build-Number']}}
    • +
    • Build-Time: {{dbcapp.manifest['Build-Time']}}
    • +
    +
    +
    + +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html new file mode 100644 index 0000000..cf2b77d --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_popup_templates.html @@ -0,0 +1,73 @@ + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html new file mode 100644 index 0000000..d9d2546 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/dbc_spa.html @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js new file mode 100644 index 0000000..03f143a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/home/manifest-service.js @@ -0,0 +1,43 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.factory('ManifestService', function ($http, $q, $log) { + return { + // Gets and returns the manifest for the webapp. + getManifest: function() { + // cache control for IE + var cc = "?cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'manifest' + cc, + cache: false, + responseType: 'json'}) + .then(function(response) { + // $log.debug("ManifestService.getManifest: " + JSON.stringify(response)); + if (response.data == null || typeof response.data != 'object') + return $q.reject('ManifestService.getManifest: response.data null or not object'); + else + return response.data; + }, function(error) { + $log.error('ManifestService.getManifest failed: ' + error.data); + return $q.reject(error.data); + }); + } + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js new file mode 100644 index 0000000..e6b11f8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-list-controller.js @@ -0,0 +1,154 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('mrClientListCtrl', function($scope, $log, $modal, modalService, MRClientService){ + + // populates the table of Message Router clients + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of message router clients. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + MRClientService.getClientsByPage($scope.dbcapp.currentPageNum,$scope.dbcapp.viewPerPage) + .then(function(jsonObj){ + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading=false; + },function(error){ + $log.error("mrClientListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to edit a client. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editClientModalPopup = function(client) { + $scope.dbcapp.editClient = client; + var modalInstance = $modal.open({ + templateUrl : 'edit_client_popup.html', + controller : 'clientPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + client : $scope.dbcapp.editClient, + clientList : $scope.dbcapp.tableData, + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editClientModalPopup: user closed dialog'); + } + else { + // $log.debug('editClientModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) + modalService.showFailure('Edit Failed', + 'Failed to edit client:\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a client. + * On successful completion, updates the table. + */ + $scope.dbcapp.deleteClientModalPopup = function(client) { + modalService.popupConfirmWin("Confirm", + "Delete the client:\n" + client.mrClientId + "\nContinue?", + function() { + // $log.debug('deleteClientModalPopup: ' + topic.fqtn); + MRClientService.deleteClient(client.mrClientId) + .then( + function(response) { + // $log.debug('deleteClientModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) { + modalService.showFailure('Delete Failed', + 'Failed to delete client ' + client.mrClientId + + '\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + modalService.showFailure('Delete Failed', + 'Request failed to delete client ' + client.mrClientId + '\n' + + JSON.stringify(error)); + } + ); + }) + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js new file mode 100644 index 0000000..d4bb40b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-popup-controller.js @@ -0,0 +1,127 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('clientPopupCtrl', function($scope, $log, $modalInstance, modalService, message, MRClientService) { + + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.client == null || message.client.mrClientId == null) + $scope.dbcapp.label = 'Add Client'; + else + $scope.dbcapp.label = 'Edit Client'; + + // client object brings fqtn + $scope.dbcapp.editClient = message.client; + $scope.dbcapp.dcaeList = message.dcaeList; + + // Models for checkboxes + var PUB = 0; + var SUB = 1; + var VIEW = 2; + $scope.dbcapp.clientactionbox = []; + $scope.dbcapp.clientactionbox[PUB] = false; + $scope.dbcapp.clientactionbox[SUB] = false; + $scope.dbcapp.clientactionbox[VIEW] = false; + + // Morph the list of action strings into checks in boxes + for (var aidx in $scope.dbcapp.editClient.action) { + var action = $scope.dbcapp.editClient.action[aidx]; + // $log.debug('clientPopupCtrl: action idx ' + aidx + ', action ' + action); + if ("pub" == action) + $scope.dbcapp.clientactionbox[PUB] = true; + else if ("sub" == action) + $scope.dbcapp.clientactionbox[SUB] = true; + else if ("view" == action) + $scope.dbcapp.clientactionbox[VIEW] = true; + } + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateClient = function(client) { + if (client == null) + return "No data found.\nPlease enter some values."; + if (client.dcaeLocationName == null) + return "DCAE Location is required.\nPlease select a value."; + if (client.clientRole == null || client.clientRole.trim() == '') + return "Client role is required.\nPlease enter a value."; + // I don't like hardcoded strings, but what to do? + // IE does not support startsWith method + // $log.debug('validateClient: ' + client.clientRole.indexOf('com.openecomp.')); + if (client.clientRole.toLowerCase().indexOf('com.openecomp.') != 0) + return "Unexpected client role prefix.\nPlease enter a value starting with 'com.openecomp.'"; + if (client.action.length == 0) + return "An action is required.\nPlease select one or more actions."; + return null; + } + + $scope.dbcapp.saveClient = function(client) { + // Store list of action strings (if any) + var action_list = []; + for (var aidx in $scope.dbcapp.clientactionbox) { + if (aidx == PUB && $scope.dbcapp.clientactionbox[aidx]) + action_list.push('pub'); + else if (aidx == SUB && $scope.dbcapp.clientactionbox[aidx]) + action_list.push('sub'); + else if (aidx == VIEW && $scope.dbcapp.clientactionbox[aidx]) + action_list.push('view'); + } + $scope.dbcapp.editClient.action = action_list; + + var validateMsg = $scope.dbcapp.validateClient(client); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (client.mrClientId == null) { + // No id, so create a new one + MRClientService.addClient(client) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('clientPopupCtrl.saveClient: error while adding: ' + error); + } + ); + } + else { + // Has ID, so update an existing one + MRClientService.updateClient(client) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('clientPopupCtrl.saveClient: error while updating: ' + error); + } + ); + } + + }; // saveClient + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js new file mode 100644 index 0000000..f5f8167 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-client-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.factory('MRClientService', function ($http, $q, $log) { + return { + /** + * Gets one page of message router client objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getClientsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'mr_client?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.getClientsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.getClientsByPage failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Creates a new client. + addClient: function(client) { + return $http({ + method: 'POST', + url: 'mr_client', + data: client, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.addClient: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.addClient failed: ' + error); + return $q.reject(error.data); + }); + }, + + // Updates an existing client. + updateClient: function(client) { + return $http({ + method: 'PUT', + url: 'mr_client/' + client.mrClientId, + data: client, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.updateClient: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.updateClient failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Deletes the client with the specified ID + deleteClient: function(mrClientId) { + return $http({ + method: 'DELETE', + url: 'mr_client/' + mrClientId, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRClientService.deleteClient: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRClientService.deleteClient failed: ' + error); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js new file mode 100644 index 0000000..4546ac9 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-client-list-popup-controller.js @@ -0,0 +1,36 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('topicClientListPopupCtrl', function($scope, $log, $modalInstance, modalService, message) { + + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + $scope.dbcapp.label = 'Clients of Topic ' + message.topic.topicName; + + // Source of data table + $scope.dbcapp.showTopic = message.topic; + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js new file mode 100644 index 0000000..46e1951 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-list-controller.js @@ -0,0 +1,248 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('mrTopicListCtrl', function($scope, $log, $modal, modalService, MRTopicService){ + + // populates the table of Message Router topics + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + // models for controls on screen + $scope.dbcapp.tableData=[]; + $scope.dbcapp.currentPageNum=1; + $scope.dbcapp.totalPages=1; + $scope.dbcapp.viewPerPage = 100; + $scope.dbcapp.viewPerPageOptions = [ + { index : 0, value : 100 }, + { index : 1, value : 500 }, + { index : 2, value : 1000 }, + { index : 3, value : 2500 } + ]; + // other + $scope.dbcapp.errMsg=null; + $scope.dbcapp.isDataLoading=true; + $scope.dbcapp.isRequestFailed=false; + + /** + * Answers an array of the specified size - makes Angular iteration easy. + */ + $scope.dbcapp.buildArraySizeN = function(num) { + // $log.debug("buildArraySizeN: invoked with " + num); + return new Array(num); + } + + /** + * Loads the table of message router topics. + */ + $scope.dbcapp.loadTable = function() { + $scope.dbcapp.isDataLoading = true; + MRTopicService.getTopicsByPage($scope.dbcapp.currentPageNum, $scope.dbcapp.viewPerPage) + .then(function(jsonObj){ + // must match keys in java controller's method + if (jsonObj.error) { + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = jsonObj.error; + $scope.dbcapp.tableData = []; + } + else { + $scope.dbcapp.isRequestFailed = false; + $scope.dbcapp.errMsg = null; + $scope.dbcapp.profileName = jsonObj.profileName; + $scope.dbcapp.dmaapName = jsonObj.dmaapName; + $scope.dbcapp.dcaeLocations = jsonObj.dcaeLocations; + $scope.dbcapp.totalPages = jsonObj.totalPages; + $scope.dbcapp.tableData = jsonObj.data; + } + $scope.dbcapp.isDataLoading=false; + },function(error){ + $log.error("mrTopicListCtrl.loadTable failed: " + error); + $scope.dbcapp.isRequestFailed = true; + $scope.dbcapp.errMsg = error; + $scope.dbcapp.tableData = []; + $scope.dbcapp.isDataLoading = false; + }); + }; + + /** + * Shows a modal pop-up to add a topic. Passes data in via an object named + * "message". On successful completion, updates the table. + */ + $scope.dbcapp.addTopicModalPopup = function() { + $scope.dbcapp.editTopic = null; + var modalInstance = $modal.open({ + templateUrl : 'edit_topic_popup.html', + controller : 'topicPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + topic : $scope.dbcapp.editTopic, + topicList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addFeedModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Failed', + 'Failed to add topic:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to edit a topic. + * Passes data in via an object named "message". + * Always updates the table, even on failure, to discard + * user-entered changes that were not persisted. + */ + $scope.dbcapp.editTopicModalPopup = function(topic) { + $scope.dbcapp.editTopic = topic; + var modalInstance = $modal.open({ + templateUrl : 'edit_topic_popup.html', + controller : 'topicPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + topic : $scope.dbcapp.editTopic, + topicList : $scope.dbcapp.tableData + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('editTopicModalPopup: user closed dialog'); + } + else { + // $log.debug('editTopicModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) + modalService.showFailure('Edit Failed', + 'Failed to edit topic ' + topic.fqtn + + '\n' + response.error); + // refresh in all cases + $scope.dbcapp.loadTable(); + } + }); + }; + + /** + * Shows a modal pop-up to confirm deletion of a topic. On successful + * completion, updates the table. + */ + $scope.dbcapp.deleteTopicModalPopup = function(topic) { + modalService.popupConfirmWin("Confirm", + "Delete the topic:\n" + topic.fqtn + "\nContinue?", + function() { + // $log.debug('deleteTopicModalPopup: ' + topic.fqtn); + MRTopicService.deleteTopic(topic.fqtn) + .then( + function(response) { + // $log.debug('deleteTopicModalPopup: response: ' + JSON.stringify(response)); + if (response.error != null) { + $log.error('deleteTopicModalPopup: failed to delete: ' + response.error); + modalService.showFailure('Delete Failed', + 'Failed to delete topic ' + topic.fqtn + + '\n' + response.error); + } + else { + // success, get the updated list. + $scope.dbcapp.loadTable() + } + }, + function(error) { + modalService.showFailure('Delete Failed', + 'Request failed to delete topic ' + topic.fqtn + '\n' + + JSON.stringify(error)); + } + ); + }) + }; + + /** + * Shows a modal pop-up with all clients of a topic. + * Passes data in via an object named "message". + */ + $scope.dbcapp.showTopicClientsModalPopup = function(topic) { + var modalInstance = $modal.open({ + templateUrl : 'topic_client_list_popup.html', + controller : 'topicClientListPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + topic : topic + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + // No response expected. + }); + }; + + /** + * Shows a modal pop-up to add a client to a topic + * Passes data in via an object named "message". + * On successful completion, updates the table. + */ + $scope.dbcapp.addTopicClientModalPopup = function(topic) { + $scope.dbcapp.editClient = { fqtn : topic.fqtn } + var modalInstance = $modal.open({ + templateUrl : 'edit_client_popup.html', + controller : 'clientPopupCtrl', + resolve : { + message : function() { + var dataForPopup = { + client : $scope.dbcapp.editClient, + clientList : [], // empty list + dcaeList : $scope.dbcapp.dcaeLocations + }; + return dataForPopup; + } + } + }); + modalInstance.result.then(function(response) { + if (response == null) { + // $log.debug('addTopicClientModalPopup: user closed dialog'); + } + else { + if (response.error != null) + modalService.showFailure('Add Client Failed', + 'Failed to add client to topic:\n' + response.error); + else + // success, get the updated list. + $scope.dbcapp.loadTable(); + } + }); + }; + + // Populate the table on load. + $scope.dbcapp.loadTable(); + +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js new file mode 100644 index 0000000..4d885c5 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-popup-controller.js @@ -0,0 +1,83 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.controller('topicPopupCtrl', function($scope, $log, $modalInstance, modalService, message, MRTopicService) { + 'use strict'; + + // this object holds all app data and functions + $scope.dbcapp = {}; + + // Set the label variable for the template + if (message.topic == null) + $scope.dbcapp.label = 'Add Topic'; + else + $scope.dbcapp.label = 'Edit Topic'; + $scope.dbcapp.editTopic = message.topic; + + /** + * Validates content of user-editable fields. + * Returns null if all is well, + * a descriptive error message otherwise. + */ + $scope.dbcapp.validateTopic = function(topic) { + if (topic == null) + return "No data found.\nPlease enter some values."; + if (topic.topicName == null || topic.topicName.trim() == '') + return "Name is required.\nPlease enter a value."; + if (topic.topicDescription == null || topic.topicDescription.trim() == '') + return "Description is required.\nPlease enter a value."; + return null; + } + + $scope.dbcapp.saveTopic = function(topic) { + var validateMsg = $scope.dbcapp.validateTopic(topic); + if (validateMsg != null) { + modalService.showFailure("Invalid Content", validateMsg); + return; + } + + if (topic.fqtn == null) { + // No fqtn, so create a new one + MRTopicService.addTopic(topic) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('topicPopupCtrl.saveTopic: error while adding: ' + error); + } + ); + } + else { + // Has fqtn, so update an existing one + MRTopicService.updateTopic(topic) + .then(function(response) { + $modalInstance.close(response); + }, + function (error) { + $log.error('topicPopupCtrl.saveTopic: error while updating: ' + error); + } + ); + } + + }; // saveTopic + + $scope.dbcapp.close = function() { + $modalInstance.close(); + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js new file mode 100644 index 0000000..49642f7 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr-topic-service.js @@ -0,0 +1,105 @@ +/*- + * ================================================================================ + * DCAE DMaaP Bus Controller Web Application + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * 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. + * ================================================================================ + */ +app.factory('MRTopicService', function ($http, $q, $log) { + return { + /** + * Gets one page of message router topic objects. + * @param {Number} pageNum - page number; e.g., 1 + * @param {Number} viewPerPage - number of items per page; e.g., 25 + * @return {JSON} Response object from remote side + */ + getTopicsByPage: function(pageNum,viewPerPage) { + // cache control for IE + var cc = "&cc=" + new Date().getTime().toString(); + return $http({ + method: 'GET', + url: 'mr_topic?pageNum=' + pageNum + '&viewPerPage=' + viewPerPage + cc, + cache: false, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.getTopicsByPage: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.getTopicsByPage failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Creates a new topic. + addTopic: function(topic) { + return $http({ + method: 'POST', + url: 'mr_topic', + data: topic, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.addTopic: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.addTopic failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Updates an existing topic. + updateTopic: function(topic) { + return $http({ + method: 'PUT', + url: 'mr_topic/' + topic.fqtn, + data: topic, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.updateTopic: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.updateTopic failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + // Deletes the topic with the specified FQTN. + deleteTopic: function(fqtn) { + return $http({ + method: 'DELETE', + url: 'mr_topic/' + fqtn, + responseType: 'json' }) + .then(function(response) { + if (response.data == null || typeof response.data != 'object') + return $q.reject('MRTopicService.deleteTopic: response.data null or not object'); + else + return response.data; + }, + function(error) { + $log.error('MRTopicService.deleteTopic failed: ' + JSON.stringify(error)); + return $q.reject(error.data); + }); + }, + + }; +}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html new file mode 100644 index 0000000..1dac153 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_list.html @@ -0,0 +1,142 @@ + + + +
    +

    Topic Clients

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + +
    MR Client IDDCAE Location NameQualified Topic NameActionClient RoleLast ModifiedStatusTopic URLDelete
    + + + + + + + + +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html new file mode 100644 index 0000000..8f45073 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_client_popup_template.html @@ -0,0 +1,68 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html new file mode 100644 index 0000000..4976138 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_client_list_popup_template.html @@ -0,0 +1,74 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html new file mode 100644 index 0000000..4ed4726 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_list.html @@ -0,0 +1,154 @@ + + + +
    +

    Message Router Topics

    +
    + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + {{dbcapp.errMsg}} +
    + +
    + Access Profile {{dbcapp.profileName}}, DMaaP Name {{dbcapp.dmaapName}} +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Qualified NameNameDescriptionOwnerStatusClAddDelete
    + + + + + + + +
    + +
    +
    +
    + +
    +
    + +
    + Page Number: + + Page Count: + + Rows per Page: + +
    + +
    + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html new file mode 100644 index 0000000..b83c698 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/dbcapp/messagerouter/mr_topic_popup_template.html @@ -0,0 +1,62 @@ + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/bg-top-bar.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/bg-top-bar.png new file mode 100644 index 0000000..3a0a757 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/bg-top-bar.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/checkmark_yes.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/checkmark_yes.gif new file mode 100644 index 0000000..113cd34 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/checkmark_yes.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/downCaret.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/downCaret.gif new file mode 100644 index 0000000..304b645 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/downCaret.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/home-icon.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/home-icon.png new file mode 100644 index 0000000..bf09c85 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/home-icon.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/cut.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/cut.gif new file mode 100644 index 0000000..2dcdc84 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/cut.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/door.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/door.gif new file mode 100644 index 0000000..5705b17 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/door.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/export.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/export.gif new file mode 100644 index 0000000..fdc232e Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/export.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/import.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/import.gif new file mode 100644 index 0000000..f730614 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/import.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_add.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_add.gif new file mode 100644 index 0000000..c6268e7 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_add.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_copy.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_copy.gif new file mode 100644 index 0000000..55e0d29 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_copy.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_delete.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_delete.gif new file mode 100644 index 0000000..8db60b8 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_delete.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_edit.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_edit.gif new file mode 100644 index 0000000..af1b38c Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_edit.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_paste.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_paste.gif new file mode 100644 index 0000000..87a9ae2 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/page_white_paste.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/trash.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/trash.gif new file mode 100644 index 0000000..3969ca5 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/trash.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_0_aaaaaa_40x100.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000..d0605e8 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_0_aaaaaa_40x100.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_75_ffffff_40x100.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000..e812e18 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_flat_75_ffffff_40x100.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_55_fbf9ee_1x400.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000..f28febb Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_65_ffffff_1x400.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000..d252f8a Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_dadada_1x400.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000..b83c741 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_dadada_1x400.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_e6e6e6_1x400.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 0000000..7ee6413 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_95_fef1ec_1x400.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000..6d22f1e Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_highlight-soft_75_cccccc_1x100.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000..2a93588 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_222222_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_222222_256x240.png new file mode 100644 index 0000000..e9c8e16 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_222222_256x240.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_2e83ff_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000..f2bf838 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_2e83ff_256x240.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_454545_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_454545_256x240.png new file mode 100644 index 0000000..d6169e8 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_454545_256x240.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_888888_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_888888_256x240.png new file mode 100644 index 0000000..d3e6e02 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_888888_256x240.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_cd0a0a_256x240.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000..4937018 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/menus/ui-icons_cd0a0a_256x240.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/pipe.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/pipe.png new file mode 100644 index 0000000..90dea7d Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/pipe.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/selfArrow.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/selfArrow.png new file mode 100644 index 0000000..918b8b7 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/selfArrow.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/smallPostit.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/smallPostit.png new file mode 100644 index 0000000..46c47f0 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/smallPostit.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCan.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCan.gif new file mode 100644 index 0000000..9fc7dbe Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCan.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCanFull.gif b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCanFull.gif new file mode 100644 index 0000000..8cd06f1 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/trashCanFull.gif differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/triangle.png b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/triangle.png new file mode 100644 index 0000000..f15527d Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/images/triangle.png differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/index.html b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/index.html new file mode 100644 index 0000000..d1d4b11 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/index.html @@ -0,0 +1,14 @@ + + +
    + +
    diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml new file mode 100644 index 0000000..9437cfa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/mocks/networkElements.yml @@ -0,0 +1,95 @@ +elementsList: +- {displayShortname: eNB, enclosingDomain: RAN, tosca_id: com.trinity.ran.enodeb} +- {displayShortname: SIAD, enclosingDomain: RAN, tosca_id: com.trinity.ran.siad} +- {displayShortname: NodeB, enclosingDomain: RAN, tosca_id: com.trinity.ran.nb} +- {displayShortname: MGCF eMSC, enclosingDomain: RAN, tosca_id: com.trinity.ran.emsc} +- {displayShortname: RNC, enclosingDomain: RAN, tosca_id: com.trinity.ran.rnc} +- {displayShortname: MGW, enclosingDomain: RAN, tosca_id: com.trinity.ran.mgw} +- {displayShortname: SS7 GPORT, enclosingDomain: RAN, tosca_id: com.trinity.ran.ss7_gport} +- {displayShortname: MSN, enclosingDomain: RAN, tosca_id: com.trinity.ran.msn} +- {displayShortname: E-SMLC, enclosingDomain: RAN, tosca_id: com.trinity.ran.e_smlc} +- {displayShortname: SGSN-S4, enclosingDomain: EPC, tosca_id: com.trinity.epc.sgsn_s4} +- {displayShortname: MME, enclosingDomain: EPC, tosca_id: com.trinity.epc.mme} +- {displayShortname: P_LRF (RDF), enclosingDomain: EPC, tosca_id: com.trinity.epc.p_lrf} +- {displayShortname: GMLC, enclosingDomain: EPC, tosca_id: com.trinity.epc.gmlc} +- {displayShortname: PCEF, enclosingDomain: EPC, tosca_id: com.trinity.epc.pcef} +- {displayShortname: SDG, enclosingDomain: EPC, tosca_id: com.trinity.epc.sdg} +- {displayShortname: P-GW, enclosingDomain: EPC, tosca_id: com.trinity.epc.p_gw} +- {displayShortname: S-GW, enclosingDomain: EPC, tosca_id: com.trinity.epc.s_gw} +- {displayShortname: PAS, enclosingDomain: EPC, tosca_id: com.trinity.epc.pas} +- {displayShortname: PCRF, enclosingDomain: EPC, tosca_id: com.trinity.epc.pcrf} +- {displayShortname: MIND, enclosingDomain: EPC, tosca_id: com.trinity.epc.mind} +- {displayShortname: APN DNS, enclosingDomain: EPC, tosca_id: com.trinity.epc.apn_dns} +- {displayShortname: DRA EPC, enclosingDomain: EPC, tosca_id: com.trinity.epc.dra_epc} +- {displayShortname: HSS EPC, enclosingDomain: EPC, tosca_id: com.trinity.epc.hss_epc} +- {displayShortname: HLR, enclosingDomain: EPC, tosca_id: com.trinity.epc.hlr} +- {displayShortname: CPM, enclosingDomain: EPC, tosca_id: com.trinity.epc.cpm} +- {displayShortname: P-LRF/RDF, enclosingDomain: EPC, tosca_id: com.trinity.epc.p_lrf_sup} +- {displayShortname: SBC, enclosingDomain: USP, tosca_id: com.trinity.usp.sbc} +- {displayShortname: ATGW, enclosingDomain: USP, tosca_id: com.trinity.usp.atgw} +- {displayShortname: IWF, enclosingDomain: USP, tosca_id: com.trinity.usp.iwf} +- {displayShortname: ATCF, enclosingDomain: USP, tosca_id: com.trinity.usp.atcf} +- {displayShortname: P-CSCF, enclosingDomain: USP, tosca_id: com.trinity.usp.p_cscf} +- {displayShortname: Transcoder, enclosingDomain: USP, tosca_id: com.trinity.usp.transcoder} +- {displayShortname: I-SBC, enclosingDomain: USP, tosca_id: com.trinity.usp.i_sbc} +- {displayShortname: SCC-AS, enclosingDomain: USP, tosca_id: com.trinity.usp.scc_as} +- {displayShortname: EATF, enclosingDomain: USP, tosca_id: com.trinity.usp.eatf} +- {displayShortname: TAS, enclosingDomain: USP, tosca_id: com.trinity.usp.tas_cts} +- {displayShortname: S-CSCF, enclosingDomain: USP, tosca_id: com.trinity.usp.s_cscf} +- {displayShortname: E-CSCF (911), enclosingDomain: USP, tosca_id: com.trinity.usp.e_cscf} +- {displayShortname: I-CSCF, enclosingDomain: USP, tosca_id: com.trinity.usp.i_cscf} +- {displayShortname: TF / BGCF, enclosingDomain: USP, tosca_id: com.trinity.usp.tf_bgcf} +- {displayShortname: MGC-8, enclosingDomain: USP, tosca_id: com.trinity.usp.mgc8} +- {displayShortname: MRF, enclosingDomain: USP, tosca_id: com.trinity.usp.mrf} +- {displayShortname: USP DNS, enclosingDomain: USP, tosca_id: com.trinity.usp.dns} +- {displayShortname: DRA IMS, enclosingDomain: USP, tosca_id: com.trinity.usp.dra_ims} +- {displayShortname: ENUM, enclosingDomain: USP, tosca_id: com.trinity.usp.enum} +- {displayShortname: HSS IMS, enclosingDomain: USP, tosca_id: com.trinity.usp.hss_ims} +- {displayShortname: CCF, enclosingDomain: "", tosca_id: com.trinity."".dc1.ccf} +- {displayShortname: BGF, enclosingDomain: "", tosca_id: com.trinity."".dc1.bgf} +- {displayShortname: vMS, enclosingDomain: "", tosca_id: com.trinity."".dc1.ms} +- {displayShortname: vNS, enclosingDomain: "", tosca_id: com.trinity."".dc1.ns} +- {displayShortname: vAS, enclosingDomain: "", tosca_id: com.trinity."".dc1.as} +- {displayShortname: vA-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc1.a_sbg} +- {displayShortname: vDBE, enclosingDomain: "", tosca_id: com.trinity."".dc1.dbe} +- {displayShortname: vN-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc1.n_sbg} +- {displayShortname: CCF, enclosingDomain: "", tosca_id: com.trinity."".dc2.ccf} +- {displayShortname: BGF, enclosingDomain: "", tosca_id: com.trinity."".dc2.bgf} +- {displayShortname: vMS, enclosingDomain: "", tosca_id: com.trinity."".dc2.ms} +- {displayShortname: vNS, enclosingDomain: "", tosca_id: com.trinity."".dc2.ns} +- {displayShortname: vAS, enclosingDomain: "", tosca_id: com.trinity."".dc2.as} +- {displayShortname: vA-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc2.a_sbg} +- {displayShortname: vDBE, enclosingDomain: "", tosca_id: com.trinity."".dc2.dbe} +- {displayShortname: vN-SBG, enclosingDomain: "", tosca_id: com.trinity."".dc2.n_sbg} +- {displayShortname: PSX SIP, enclosingDomain: VNI, tosca_id: com.trinity.vni.sip_psx} +- {displayShortname: PSX Policy, enclosingDomain: VNI, tosca_id: com.trinity.vni.policy_psx} +- {displayShortname: IPBE, enclosingDomain: VNI, tosca_id: com.trinity.vni.ipbe} +- {displayShortname: GSX, enclosingDomain: VNI, tosca_id: com.trinity.vni.gsx} +- {displayShortname: BVoIP AS, enclosingDomain: VNI, tosca_id: com.trinity.vni.bvoip_as} +- {displayShortname: NGBE, enclosingDomain: VNI, tosca_id: com.trinity.vni.ngbe} +- {displayShortname: VoLTE UE, enclosingDomain: RAN, tosca_id: com.trinity.ue1} +- {displayShortname: 3G UE, enclosingDomain: RAN, tosca_id: com.trinity.ue2} +- {displayShortname: Trinity UE-A, enclosingDomain: "", tosca_id: com.trinity.ue3} +- {displayShortname: Trinity UE-B, enclosingDomain: "", tosca_id: com.trinity.ue4} +- {displayShortname: VNI UE-PBX, enclosingDomain: VNI, tosca_id: com.trinity.ue5} +- {displayShortname: PSTN, enclosingDomain: VNI, tosca_id: com.trinity.ue6} +- {displayShortname: Intrado SBC, enclosingDomain: NotApplicable, tosca_id: com.trinity.intrado_sbc} +- {displayShortname: FMCC, enclosingDomain: NotApplicable, tosca_id: com.trinity.fmcc} +- {displayShortname: ESGW, enclosingDomain: NotApplicable, tosca_id: com.trinity.esgw} +- {displayShortname: PSAP, enclosingDomain: NotApplicable, tosca_id: com.trinity.psap} +- {displayShortname: IPFR User, enclosingDomain: NotApplicable, tosca_id: com.trinity.ipfr_user} +- {displayShortname: PBX, enclosingDomain: NotApplicable, tosca_id: com.trinity.pbx} +- {displayShortname: IPBE, enclosingDomain: NotApplicable, tosca_id: com.trinity.ipbe} +- {displayShortname: MGCF/eMSC, enclosingDomain: NotApplicable, tosca_id: com.trinity.mgcf_msc} +- {displayShortname: 3G UE, enclosingDomain: NotApplicable, tosca_id: com.trinity.2G_3G_Endpoint} +- {displayShortname: IPBE, enclosingDomain: NotApplicable, tosca_id: com.trinity.vni.pstn_tdm} +- {displayShortname: PSTN, enclosingDomain: NotApplicable, tosca_id: com.trinity.pstn} +- {displayShortname: AT&T LNS Switch, enclosingDomain: NotApplicable, tosca_id: com.trinity.att_lns_switch} +- {displayShortname: SGX, enclosingDomain: NotApplicable, tosca_id: com.trinity.sgx} +- {displayShortname: CNAM DB, enclosingDomain: NotApplicable, tosca_id: com.trinity.cnam_db} +- {displayShortname: LEA, enclosingDomain: VNI, tosca_id: com.trinity.ue10} +- {displayShortname: SS8 LIG, enclosingDomain: VNI, tosca_id: com.trinity.ue9} +- {displayShortname: PGW, enclosingDomain: NotApplicable, tosca_id: com.trinity.usp.pgw} +- {displayShortname: SGW, enclosingDomain: NotApplicable, tosca_id: com.trinity.usp.sgw} +- {displayShortname: PSTN-TDM Switch, enclosingDomain: VNI, tosca_id: com.trinity.ue7} +- {displayShortname: PSAP, enclosingDomain: EPC, tosca_id: com.trinity.ue8} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js new file mode 100644 index 0000000..1dded39 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/BPMNconversion.js @@ -0,0 +1,208 @@ +/* +============================================================================================= +The MIT License (MIT) + +Copyright 2015 AT&T Intellectual Property. All other rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +//Contains functions to convert diagram to BPMN and display in a #canvas div +var xmlText=null; +var lifelineBPMN = []; +var nodeXVal = []; +function convertToBPMN (m,BPMNFilename,whatToDo) { + if (whatToDo!='source'){ + bootbox.hideAll(); + } + + m = decodeJSON(m); + n = JSON.parse(m); + $.each(n.diagram.elements.nodes, function(index, value) { + var newText = value.innerText.replace(/&/g,"&") + .replace(/"/g,""") + .replace(/'/g,"'") + .replace(//g,">"); + value.innerText = newText; + }); + var elementList = n.diagram.elements; //stores all elements + var allNodes = n.diagram.elements.nodes; + var allArrows = n.diagram.elements.arrows; + var allNotes = n.diagram.elements.notes; + var loadedRows = n.diagram.rows; + var loadedCols = n.diagram.cols; + var description = n.diagram.description; + var transposeDown = 75; + xmlText = ''; + lifelineBPMN.length=0; + lifelineBPMN = []; + nodeXVal.length=0; + nodeXVal = []; + xmlText = '\n'; + xmlText += '\n'; + xmlText += ' \n' + for (var i=0; i\n' + for (var j=0; j\n' + } + for (var j=0; j\n' + } + xmlText += ' \n' + var tempId = guid();// + lifelineBPMN.push(tempId);// + xmlText += ' \n'// + } + for (var i=0; i\n' + } + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + var maxY = 0; + for (var i=0; imaxY){ + maxY = parseInt(arrowArr[i][4]); + } + } + for (var i=0; i\n' + xmlText += ' \n' + xmlText += ' \n' + + xmlText += ' \n'// + xmlText += ' \n'// + nodeXVal.push(parseInt(100+i*150)); + xmlText += ' \n'// + } + + for (var i=0; i\n' + for (var j=0; j\n' + xmlText += ' \n' + xmlText += ' \n' + var textWidth = parseInt((arrowArr[arrowIndex][2]).length) * 6 + if (nodeXVal[startNodeIndex]\n' + } + else{ //Points left, so place text right + xmlText += ' \n' + } + xmlText += ' \n' + xmlText += ' \n' + } + else{ + xmlText += ' \n' + for (var j=0; j\n' + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + var textWidth = parseInt((arrowArr[arrowIndex][2]).length) * 6 + xmlText += ' \n' + xmlText += ' \n' + xmlText += ' \n' + } + } + + xmlText += ' \n' + xmlText += ' \n' + xmlText += '' + + //alert(xmlText); + + if (whatToDo=="save"){ + var textToWrite = xmlText + var blob = new Blob([textToWrite], {type: "text/plain;charset=utf-8"}); + + var downloadLink = document.createElement("a"); + + filename = BPMNFilename + ".BPMN"; + + downloadLink.download = filename; + downloadLink.innerHTML="Download File"; + downloadLink.href = window.webkitURL.createObjectURL(blob); + downloadLink.click(); + } + else if (whatToDo =="show"){ + bootbox.dialog({ + size:'large', + message:'
    Please save before exporting
    Export as :
    ', + animate:false, + backdrop:true, + onEscape: function() {}, + callback: function(result){ + if (result == true){ + + } + } + }); + showBPMN(xmlText); + } + else if (whatToDo =="source"){ + return xmlText + } +} + +function showBPMN (xmlText) { + var BpmnViewer = window.BpmnJS; + + var viewer = new BpmnViewer({ container: '#canvas' }); + + viewer.importXML(xmlText, function(err) { + if (!err) { + console.log('success!'); + viewer.get('canvas').zoom('fit-viewport'); + } else { + console.log('something went wrong:', err); + } + }); +} + +function svgprint (quality) { + var setWide = $(document.querySelector('svg')).width(); + var setHeight = $(document.querySelector('svg')).height(); + $(document.querySelector('svg')).attr('width',setWide) + $(document.querySelector('svg')).attr('height',setHeight) + svgAsDataUri(document.querySelector('svg'), {scale:quality}, function(uri){ + console.log(uri) + var img = new Image(); + img.src = uri; + img.onload = function() { + var canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + var context = canvas.getContext('2d'); + context.drawImage(img,0,0); + + var a = document.createElement('a'); + a.download = 'image.png'; + a.href = canvas.toDataURL('image/png'); + document.body.appendChild(a); + a.click(); + } + }) +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js new file mode 100644 index 0000000..7fdf912 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/app.js @@ -0,0 +1,55 @@ +(function() { + +angular.module('eAse',[]) + .controller('ETitleController',eTitleController); + + function eTitleController($scope){ + $scope.title = "My Sequence Diagram"; + $scope.titleEdit = true; + $scope.editTitle = function() { + $scope.titleEdit = !$scope.titleEdit; + }; + $scope.doneEdit = function(event) { + if(event.which === 13) { + $scope.titleEdit = !$scope.titleEdit; + } + }; + $scope.blur = function(event) { + $scope.titleEdit = !$scope.titleEdit; + }; + } +})(); + + + + + + + + + +/* + +app.controller('eSidebarController',function($scope){ + +}); +app.controller('eGridController',function($scope){ + +}); +app.controller('',function($scope){ + +}); +app.directive('sequenceFlow', function () { + return { + restrict: 'E', + templateUrl: "../view-models/ase_view.html", + controller: 'flowController', + scope: '=', + link: function(scope, element, attrs, flowCtrl) { + flowCtrl.init(); + } + } +}); + +*/ + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js new file mode 100644 index 0000000..2f041f3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/arrayManipulation.js @@ -0,0 +1,356 @@ + +//Contains functions to update, create and retrieve arrays. Also uses arrays to determine properties (lNode, rNode) of arrows + +var missingStarts = []; +var missingEnds = []; + +//Stores module's properties in its array +function storeXY (arrayType,id) { + 'use strict'; + var index; + for ( i = 0; i' + + '
    '+ text +'
    '+ + '
    '+ + ''; + dropOffLocation = document.getElementById("nodeChildrenDroppedOffHere"); + dropOffLocation.innerHTML += tag; + var index = nodeArr.push([document.getElementById(id),id,text,parseInt(lX),parseInt(lY),wide,parseInt(lX)+parseInt(wide),parseInt(lY)]); + if (tosca_ID !==null){ + document.getElementById(id).setAttribute('taska_id',tosca_ID); + } + if ( text !== null ){ + document.getElementById(id).setAttribute('sname',text); + } + // When Role is added uncomment. + console.log(role); + if ( role !== null ){ + document.getElementById(id).setAttribute('role_id',role); + } + + if (isOverlapped(id) === true){ + shiftRight(document.getElementById(id),160); + } + if (isOverlapped(id) === false){ + for (i=0;i'+ + '
    '+text+'
    '+ + '
    '+ + ''; + } + if (direction === "left"){ + tag = '
    '+ + '
    '+ + '
    ' + text + '
    '+ + '
    '; + } + if (direction === "self"){ + tag = '
    '+ + '
    '+ + '
    ' + text + '
    '+ + '
    '; + } + + + dropOffLocation = document.getElementById("arrowChildrenDroppedOffHere"); + dropOffLocation.innerHTML += tag; + arrowArr.push([document.getElementById(id),id,text,parseInt(lX),lY,parseInt(wide),parseInt(lX)+parseInt(wide),parseInt(lY),"","",arrowDescription]); + + determineLRNode(id,"arrow"); + } + if (arrayType == "noteArr"){ + tag = '
    ' + + text + + '
    '; + dropOffLocation = document.getElementById("noteChildrenDroppedOffHere"); + dropOffLocation.innerHTML += tag; + noteArr.push([document.getElementById(id),id,text,parseInt(lX),parseInt(lY),wide,parseInt(lX)+parseInt(wide),parseInt(lY)+parseInt(height)]); + + } + +} + +var layers = {}; +var nodesInLayer = []; +function determineLayers () { + var doAgain = true; + layers.length = 0; + var layerNumber = -1; + while (doAgain === true){ + layerNumber++; + nodesInLayer.length = 0; + var classToAssign = 'layer'+layerNumber; + for (var i=0; i ' + + '
    Description:
    ' + + '
    Message Type:
    ', + callback: function(result){ + if (result === true) { + var innerText=$("#arrowInnerText").val(); + var messageType = $("#arrowMessageType").val(); + pushToDict(innerText, "arrow"); + storeText(arrowArr,uuid,innerText); + makeArrow(uuid); + arrowArr[index][10] = $("#arrowDescription").val(); + $(arrowArr[index][0]).attr("message_type",messageType); + } + } + }); + $("#arrowInnerText").autocomplete({ + source: arrowTags, + autoFocus: true, + delay: 0 + }); + $("#arrowMessageType").autocomplete({ + source: messageTags, + autoFocus: true, + delay: 0 + }); + + var currentInput = $("#arrowInnerText").val(); + $("#arrowInnerText").selectRange(0,currentInput.length); + $("#arrowInnerText").click(function(){ + var currentInput = $("#arrowInnerText").val(); + $("#arrowInnerText").selectRange(0,currentInput.length); + }); + $("#arrowInnerText").keyup( function(e) { + if (e.keyCode == 13){ + $(document.getElementsByClassName('btn-primary')[0]).click(); + } + }); + $("#arrowDescription").keyup( function(e) { + if (e.keyCode == 13){ + $(document.getElementsByClassName('btn-primary')[0]).click(); + } + }); +} + +$(document).delegate('.arrowText','mouseover',function(mainEvent){ + if(!$(this).hasClass("bound")){ + console.log("ENTERING"); + var hoverIndex = recallArray(arrowArr,event.target.parentNode.parentNode.id); + if (arrowArr[hoverIndex][10] !== null && arrowArr[hoverIndex][10] !== "") { + arrowDescript = arrowArr[hoverIndex][10]; + } else { + arrowDescript = '--no description entered--'; + } + $('#'+event.target.parentNode.parentNode.id).tooltipster({ + maxWidth:200, + position:'bottom', + theme: 'tooltipster-shadow', + interactive:false, + delay:300, + multiple:false, + trigger:'click', + contentAsHTML:true, + content: arrowDescript + }); + $(this).hover( + function(event){ + var hoverIndex = recallArray(arrowArr,event.target.parentNode.parentNode.id); + if (arrowArr[hoverIndex][10] !== null && arrowArr[hoverIndex][10] !== "") { + arrowDescript = arrowArr[hoverIndex][10]; + } else { + arrowDescript = '--no description entered--'; + } + console.log("ENTERING"+event.target.parentNode.parentNode.id); + $('#'+event.target.parentNode.parentNode.id).tooltipster({ + maxWidth:200, + position:'bottom', + theme: 'tooltipster-shadow', + interactive:false, + delay:300, + multiple:false, + trigger:'click', + contentAsHTML:true, + content: arrowDescript + }); + }, + function(event) { + $(this).addClass("bound"); + console.log("LEAVING"+event.target.parentNode.parentNode.id); + $('#'+event.target.parentNode.parentNode.id).tooltipster('destroy'); + }); + } +}); \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js new file mode 100644 index 0000000..3f3432e --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/ase.js @@ -0,0 +1,112 @@ +//window.filename = ""; +//window.name = "My_Flow_1"; +window.description = "My Sequence Diagram"; +window.arrowTip = 12; +window.resized = false; +window.arrowConnections = true; +window.negativeWidth = false; +window.gridPitchx = 160; +window.gridPitchy = 42; +window.clipboard = []; +window.selection = []; +//var networkMap(); +var step = 1; +var sessiontoken = ''; +var uid= 'XX0000'; +var username= ''; +var toscaDetails = { + 'toscaID':'', + 'name':'', + 'domain':'' +}; +var ase = { + 'elementsFileName' : '', + 'description' : 'My Sequence Diagram', + 'name' : 'My_Flow_1', + 'filename' : '', + 'elementsFile' : '../mocks/networkElements.yml' +}; + + + +$(function() { + + newProject(null,null,initialRows); + + //buildTable(); + //buildDomain(); + + var loadSample = false; + var showBpmn = false; + + + $('#sampleEx').click(function(){ + if (! loadSample ) { + loadSample = loadSampleData(); + } + }); + $('#bpmnEx').click(function(){ + convertToBPMN(makeJSON(),window.description,'show'); + }); + $('#popupEx').click(function(){ + showPopup(); + }); + +// if ( getParameterByName("bpmn") === "1" ) { +// +// } else if ( getParameterByName("sample") === "1" ) { +// $('#sampleDiv').show(); +// } else if ( getParameterByName("interact") === "1" ) { +// +// +// } + + + + + //Allows nodes to scroll with the page and adjusts transparencies + $(window).scroll(function(event) { + scroll(); + }); + + toggleDoubleLine(document.getElementById('row1'),null,"Step 1:",""); + //buildDomain(); + //addStep(document.getElementById('row1'),'row1',step,''); + buildNetworkMap(); + $("#backHome").click(function(){ document.location = "../welcome.htm?showASE=true";}); +}); + +function getParameterByName( name ){ + var regexS = "[\\?&]"+name+"=([^&#]*)"; + var regex = new RegExp( regexS ); + var results = regex.exec( window.location.search ); + if( results == null ){ + return ""; + } else { + return decodeURIComponent(results[1].replace(/\+/g, " ")); + } +} + +function loadSampleData() { + try { + //loadFile(0,null,preloadedJSON); + loadFile(0,null,trinity_3g_json); + } catch(err){ + return false; + } finally { + + } + return true; +} + +function showPopup(){ + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: '
    Sample Dialog
    ', + size: 'small', + message: '

    Sample Dialog using Bootstraps bootbox.dialog components.

    '+ + '

    ' + }); +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js new file mode 100644 index 0000000..1c32fcc --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/backend.js @@ -0,0 +1,827 @@ +/* +============================================================================================= +The MIT License (MIT) + +Copyright 2015 AT&T Intellectual Property. All other rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +//Contains functions to save/export information, load/import from files, and update the titlebar + +var m; +var doc; +var linePosition; +var lineSpacing; +var doubleLineNumbers = []; +var doubleLineText=[] +var doubleLineType=[] + +//Creates a JSON data structure +function makeJSON () { + if (nodeArr.length>1){ + for (var k = nodeArr.length-1; k>=0; k--){ + for (var j = 1; j<=k; j++){ + if (parseInt(document.getElementById(nodeArr[j-1][1]).getAttribute("data_x"))>parseInt(document.getElementById(nodeArr[j][1]).getAttribute("data_x"))) { + var swap = nodeArr[j-1]; + nodeArr[j-1] = nodeArr[j]; + nodeArr[j] = swap; + } + } + } + } + if (arrowArr.length>1){ + for (var k = arrowArr.length-1; k>=0; k--){ + for (var j = 1; j<=k; j++){ + if (parseInt(document.getElementById(arrowArr[j-1][1]).getAttribute("data_y"))>parseInt(document.getElementById(arrowArr[j][1]).getAttribute("data_y"))) { + var swap = arrowArr[j-1]; + arrowArr[j-1] = arrowArr[j]; + arrowArr[j] = swap; + } + } + } + } + var now = new Date; + var utc_timestamp = Date.UTC(now.getUTCFullYear(),now.getUTCMonth(), now.getUTCDate() , + now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds()); + var canvasWidth = $("#grid").width() - $("#sideBar").width(); + + doubleLineNumbers.length=0; + doubleLineText.length=0; + doubleLineType.length=0; + var doubleElements = document.getElementsByClassName("doubleLine"); + $.each(doubleElements,function(index, value){ + doubleLineNumbers.push(($(value).attr('id')).substring(3)); + doubleLineText.push(value.children[0].innerHTML); + doubleLineType.push($(value).attr('messageType')) + }); + m = ""; + m += '{ "diagram": \n'; + m += '{ "created": "' + utc_timestamp + '",\n'; + m += '"rows": "' + rows + '",\n'; + m += '"cols": "' + cols + '",\n'; + m += '"gridPitchy": "' + gridPitchy + '",\n'; + m += '"canvasHeight": "' + $("#grid").height() + '",\n'; + m += '"canvasWidth": "' + canvasWidth + '",\n'; + m += '"encoding": "base64",\n'; + m += '"elements": {"nodes": [\n'; + nodeArr.forEach(saveNodeArrayElements); + m += '],\n "arrows": [\n'; + arrowArr.forEach(saveArrowArrayElements); + m += '],\n "notes": [\n'; + noteArr.forEach(saveNoteArrayElements); + m += '],\n "separators": [\n'; + doubleLineNumbers.forEach(saveSeparatorArrayElements); + m += ']}}}'; + + var n = JSON.parse(m); + return m + +} +function saveNodeArrayElements(element, index, array) { + var myElement = document.getElementById(element[1]); + var roleName = ''; + var infobox = "{\n"; + infobox += '"id":"' + myElement.id + '",\n'; + infobox += '"data_x": "' + myElement.getAttribute('data_x') + '",\n'; + infobox += '"data_y": "' + myElement.getAttribute('data_y') + '",\n'; + infobox += '"width": "' + $(myElement).width() + '",\n'; + infobox += '"innerText": "' + Base64.encode(myElement.getAttribute('sname')) + '",\n'; + infobox += '"bpmn": "' + Base64.encode($.trim(nodeArr[index][10])) + '",\n'; + if (myElement.getAttribute('taska_id')==null) myElement.setAttribute('taska_id',""); + infobox += '"taska_id": "' + Base64.encode(myElement.getAttribute('taska_id')) + '",\n'; + if (nodeArr[index][0].hasAttribute('role_id')) { + roleName = myElement.getAttribute('role_id'); + } + infobox += '"role": "' + Base64.encode(roleName) + '"\n'; + + infobox += "}"; + if(index'){ + databaseHTML = 'Sorry, you are not authenticated to any database at this time.

    Log In

    ' + } + else{ + databaseHTML = '

    Description

    ' + } +*/ + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: '
    Save/Export
    ', + size: 'small', + message: '

    Save locally to hard drive :

    '+ +// message: '
    '+ + '

    Call Flow Name

    '+ + ''+ + '

    ' + + '' + + ' ' + + '

    ' + }); + /* + * Let enter (13) submit the text + * Key "Enter" has the key code 13 + */ +/* + $("#saveLocalFileName").keyup( function(e) { + if (e.keyCode == 13){ + description = $("#saveLocalDescription").val(); + // replace space with underscore + name = ase.description.trim().replace(/ /g,"_"); + saveLocalFile(description); + } + }); +*/ + $("#saveLocalDescription").keyup( function(e) { + if (e.keyCode == 13){ + description = $("#saveLocalDescription").val(); + // replace space with underscore + saveLocalFile(description); + } + }); +/* + $("#saveDBDescription").keyup( function(e) { + if (e.keyCode == 13){ + description = $("#saveDBDescription").val(); + saveDBFile(description); + } + }); +*/ + /* + * Selects all text in text box on focus + * Local File Name Box is removed + */ + /* $("#saveLocalFileName").click(function(){ + var currentInput = $("#saveLocalFileName").val(); + $("#saveLocalFileName"e).selectRange(0,currentInput.length); + }); */ + $("#saveLocalDescription").click(function(){ + var currentInput = $("#saveLocalDescription").val(); + $("#saveLocalDescription").selectRange(0,currentInput.length); + }); + $("#saveDBDescription").click(function(){ + var currentInput = $("#saveDBDescription").val(); + $("#saveDBDescription").selectRange(0,currentInput.length); + }); + + $("input[name=fileType]:radio").change(function () { + if (document.getElementById('json').checked) { + document.getElementById("saveWarning").innerHTML=''; + } else { + document.getElementById("saveWarning").innerHTML='*This file type is not reloadable. Please export a json as well as your desired filetype to enable yourself to edit this document in the future'; + } + }) +} + +function viewSource() { + if (document.getElementById('yaml').checked) { //YAML + sourceCode = convertToYaml(m) + if (sourceCode==false){ + alert("Node(s) missing tosca ID") + } else { + alert(sourceCode); + } + } + + if (document.getElementById('json').checked) { + decodeJSON(m,'show') + }; +} + +function saveLocalFile(description) { + var data = JSON.parse(m); + var name = description.trim().replace(/ /g,"_"); + + $.extend(data.diagram,{"description":description}); + m=JSON.stringify(data,null,' '); + var textToWrite = m; +/* + if (document.getElementById('yaml').checked) { //YAML + m = convertToYaml(textToWrite) + if (m==false){ + bootbox.hideAll(); + bootbox.alert({ + size:'small', + message:"***Node(s) missing taska_id***", + callback: function(result){ + + } + }); + return; + } + var blob = new Blob([m], {type: "text/plain;charset=utf-8"}); + ase.name = name + name = name + ".yml"; + } else if (document.getElementById('bpmnio').checked) { //YAML + convertToBPMN(m,name,'save') + bootbox.hideAll(); + ase.name = name + return; + } + if (document.getElementById('json').checked) { //JSON + var blob = new Blob([m], {type: "text/plain;charset=utf-8"}); + ase.name = name + name = name + ".txt"; + } +*/ + + var JSON_blob = new Blob([m], {type: "text/plain;charset=utf-8"}); + ase.name = name + JSON_name = name + ".txt"; + + YAMLString = convertToYaml(textToWrite) + if (YAMLString==false){ + bootbox.hideAll(); + bootbox.alert({ + size:'small', + message:"***Node(s) missing taska_id***", + callback: function(result){ + + } + }); + return; + } + var YAML_blob = new Blob([YAMLString], {type: "text/plain;charset=utf-8"}); + ase.name = name + YAML_name = name + ".yml"; + + if (navigator.appVersion.toString().indexOf('.NET') > 0) { + window.navigator.msSaveBlob(JSON_blob, JSON_name); + window.navigator.msSaveBlob(YAML_blob, YAML_name); + } else { + var downloadLink = document.createElement("a"); + //window.description=description; + ase.description = description; + downloadLink.download = JSON_name; + downloadLink.innerHTML="Download File"; + downloadLink.href = window.URL.createObjectURL(JSON_blob)||window.webkitURL.createObjectURL(JSON_blob); + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + + var downloadLink = document.createElement("a"); + downloadLink.download = YAML_name; + downloadLink.innerHTML="Download File"; + downloadLink.href = window.URL.createObjectURL(YAML_blob)||window.webkitURL.createObjectURL(YAML_blob); + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + resetTitleBar(); + bootbox.hideAll(); + +} + +//Creates blob and exports to database +function saveDBFile(description) { + bootbox.hideAll(); + + var data = JSON.parse(m); + $.extend(data.diagram,{"description":description}); + m=JSON.stringify(data,null,' '); + + //file name from description + //fileName=description.trim().replace(/ /g,"_"); + + // JSON + var textToWrite = m; + + // YAML + var ymlTextToWrite = convertToYaml(m); + + //window.description=description; + ase.description=description; + + $.post("ase.htm?action=save",{ + jsonString:textToWrite, + ymlString:ymlTextToWrite, + callFlowName:description, + uid:uid}) + .success(function(data){ + console.log("success"); + bootbox.alert({ + size:'small', + message:' Successfully stored!
    The call flow is accessible in the Network Simulator', + callback: function(result){ + } + }); + }) + .error(function(jqXHR, textStatus, errorThrown){ + //console.log(textToWrite); + bootbox.alert({ + size:'small', + message:"***Failed to save to Server***", + callback: function(result){ + } + }); + }); + + +/* + $.post("postjaml.htm",{ + jamlData:textToWrite, + filename:description, + uid:uid}) + .success(function(data){ + console.log("success"); + }) + .error(function(jqXHR, textStatus, errorThrown){ + //console.log(textToWrite); + bootbox.alert({ + size:'small', + message:"***Failed to save to database***", + callback: function(result){ + } + }); + }); +*/ + resetTitleBar(); +} + +//LOADING/////////////////////////////////////////////////////// + +//Prompts user to select file then loads +function loadDialog(){ + //load table into var + var message = null; + //$.get('loadableList.htm?sessiontoken=' + sessiontoken) + // .success(function(data){ + //var message = data; + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: 'Load File', + size: 'small', + message: '

    Load locally from hard drive :

    ' + + '', + //''+ + //'

    '+ + //'

    Load from database :

    '+message + + }); + /* + },"text") + .error(function(jqXHR, textStatus, errorThrown){ //If server not reached + //console.log(jqXHR+' ' +textStatus+' ' +errorThrown); + var message = 'Error: Database not detected or configured'; + bootbox.dialog({ + backdrop:true, + animate:false, + onEscape: function() {}, + title: 'Load File', + size: 'small', + message: '

    Load locally from hard drive :

    ' + + '
    ', + //''+ + //'

    '+ + //'

    Load from database :

    '+message + + }); + }); + */ +} + + + +function loadFile(typeOfLoad,preloadedFile,preloadedJSON) { + //Case of load locally + if(preloadedFile==null && preloadedJSON==null){ + var file = document.getElementById("fileToLoad").files[0]; + var reader = new FileReader(); + reader.onload = recievedText; + reader.readAsText(file); + } + //Not used, but can be useful if you load the page with a parameter of "preloadedJSON" + else if (preloadedFile==null && preloadedJSON!=null){ + recievedText(preloadedJSON); + } + //Case of load from server + else if (preloadedFile!=null && preloadedJSON==null){ + $.get(preloadedFile,function(data){ + recievedText(data); + }); + } + function recievedText (importedText) { //Called when fully loaded + var textFromFileLoaded =""; + if (preloadedFile === null && preloadedJSON === null) { + var textFromFileLoaded = reader.result; + //var path = document.getElementById("fileToLoad").value; + //var loadedFilename = path.replace(/^.*\\/,""); + } else { + textFromFileLoaded = importedText; + } + + m = decodeJSON(textFromFileLoaded,null); + console.log("m=" + m); + + var n = JSON.parse(m); + + var elementList = n.diagram.elements; //stores all elements + var allNodes = n.diagram.elements.nodes; + var allArrows = n.diagram.elements.arrows; + var allNotes = n.diagram.elements.notes; + var loadedRows = n.diagram.rows; + var loadedCols = n.diagram.cols; + var description = n.diagram.description + + + //Promotes backwards compatibility to before descriptions were added + try { + var path = document.getElementById("fileToLoad").value; + var loadedFilename = path.replace(/^.*\\/,""); + } + catch (err){ + var loadedFilename = description; + } + + //Replace + if (typeOfLoad == 0){ + bootbox.hideAll(); + //window.description = n.diagram.description; + ase.description = n.diagram.description; + $('#description').text(ase.description); + linesToMakeDouble = [] + doubleLineText = [] + doubleLineType = [] + var separators = n.diagram.elements.separators; + if (separators == null) separators = [] //Backwards compatibility + $.each(separators,function(index, value){ + linesToMakeDouble.push(value.lineNumber); + doubleLineText.push(value.text); + // Added on Sept 24, 2015 + // double line separator should not store message type + doubleLineType.push(value.messageType); + }); + + rows=loadedRows; + cols=loadedCols; + newProject(linesToMakeDouble,doubleLineText,loadedRows,doubleLineType); + document.getElementById('grid').style.height = 91.5 + (rows-initialRows)*6 + '%'; //Increases height by 6% + for (var j = 0; jrows){ + var deltaRow = loadedRows-rows + for (var i = 0; imaxX){ + maxX = nodeArr[i][3]; + } + } + while (maxX>$("#grid").width() - $("#sideBar").width()){ + addWidth(); + } +} + +function resetTitleBar () { + //if (uid==null || uid=="" || uid==''){ + // document.getElementById("titleBar").innerHTML = '

    ' + description + '

    Log In
    '; + //} + //else{ + //document.getElementById("titleBar").innerHTML = '

    ' + description + '

    Hello, '+username+'
    '; + $("h3 .titleBar").html(ase.description); + /* + $('.loggedIn').tooltipster({ + minWidth:200, + theme: 'tooltipster-shadow', + interactive:true, + trigger:'hover', + contentAsHTML:true, + content: 'Hello '+username+' how are you'+ + '

    Your diagram has'+ + '

  • '+nodeArr.length+' nodes
  • '+ + '
  • '+arrowArr.length+' arrows

  • '+ + 'Log out' + }); + */ + //} +} + +function logIn () { + open("login.htm"); + resetTitleBar(); +} + +function showInfo () { + //Called when user clicks on their name after they are logged in +} + +//Allows editing title by double clicking on the top bar +$("#titleBar").dblclick(function(event) { + var presetSelectMenu='' + presetSelectMenu+='
    ' + bootbox.confirm({ + size:'small', + backdrop:true, + onEscape: function() {}, + title: "Change file attributes", + message:'Filename:
    '+ + '

    Description:
    '+ + '
    '+presetSelectMenu+'
    ', + callback: function(result){ + if (result == true){ + name = $("#saveFileName").val(); + description = $("#saveDescription").val(); + window.selectedPreset = document.getElementById('presetSelect-button').textContent; + resetTitleBar(); + } + } + }); + $( "#presetSelect" ).selectmenu(); + $('#presetSelect-button').css('width','inherit'); + $('#presetSelect-button').css('top',10); + $('#presetSelect-button').css('font-size','14px') + $('#presetSelect-button').css('margin-left',10) + $("#saveFileName").click(function(){ + currentInput = $("#saveFileName").val(); + $("#saveFileName").selectRange(0,currentInput.length); + }); + $("#saveDescription").click(function(){ + currentInput = $("#saveDescription").val(); + $("#saveDescription").selectRange(0,currentInput.length); + }); +}); + +//SELECT TEXT RANGE +$.fn.selectRange = function(start, end) { + return this.each(function() { + if (this.setSelectionRange) { + this.focus(); + this.setSelectionRange(start, end); + } else if (this.createTextRange) { + var range = this.createTextRange(); + range.collapse(true); + range.moveEnd('character', end); + range.moveStart('character', start); + range.select(); + } + }); +}; + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json new file mode 100644 index 0000000..4997498 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/.bower.json @@ -0,0 +1,35 @@ +{ + "name": "Snap.svg", + "version": "0.4.1", + "homepage": "http://snapsvg.io", + "authors": [ + "Dmitry Baranovskiy " + ], + "description": "The JavaScript library for modern SVG graphics", + "main": "dist/snap.svg-min.js", + "keywords": [ + "svg", + "snap", + "js", + "javascript" + ], + "license": "Apache 2", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "demos", + "src" + ], + "_release": "0.4.1", + "_resolution": { + "type": "version", + "tag": "v0.4.1", + "commit": "3919b7a3077dfdb4b31cc4b485d70aab4a163a44" + }, + "_source": "git://github.com/adobe-webplatform/Snap.svg.git", + "_target": "~0.4.1", + "_originalSource": "Snap.svg", + "_direct": true +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING new file mode 100644 index 0000000..c02401a --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/CONTRIBUTING @@ -0,0 +1,3 @@ +Contributions to this code are covered by the Adobe contributors +license agreeent. Developers must sign and submit the Adobe CLA in +order to contribute to this project. \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js new file mode 100644 index 0000000..415c624 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/Gruntfile.js @@ -0,0 +1,62 @@ +module.exports = function(grunt) { + + var pkg = grunt.file.readJSON("package.json"); + + // Project configuration. + grunt.initConfig({ + // Metadata. + pkg: pkg, + banner: grunt.file.read("./src/copy.js") + .replace(/@VERSION/, pkg.version) + .replace(/@DATE/, grunt.template.today("yyyy-mm-dd")) + "\n", + // Task configuration. + uglify: { + options: { + banner: "<%= banner %>", + report: "min" + }, + dist: { + src: "<%= concat.target.dest %>", + dest: "dist/snap.svg-min.js" + } + }, + concat: { + options: { + banner: "<%= banner %>" + }, + target: { + dest: "dist/snap.svg.js", + src: [ + "./node_modules/eve/eve.js", + "./src/amd-banner.js", + "./src/mina.js", + "./src/svg.js", + "./src/element.js", + "./src/matrix.js", + "./src/attr.js", + "./src/class.js", + "./src/attradd.js", + "./src/paper.js", + "./src/path.js", + "./src/set.js", + "./src/equal.js", + "./src/mouse.js", + "./src/filter.js", + "./src/align.js", + "./src/amd-footer.js" + ] + } + }, + exec: { + dr: { + command: "node node_modules/dr.js/dr dr.json" + } + } + }); + + grunt.loadNpmTasks("grunt-contrib-concat"); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-exec"); + + grunt.registerTask("default", ["concat", "uglify", "exec"]); +}; diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE new file mode 100644 index 0000000..86a96fa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013 Adobe Systems Incorporated + + 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. \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE new file mode 100644 index 0000000..b9fb2b2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/NOTICE @@ -0,0 +1,190 @@ +Snap.svg is licensed under the Apache license version 2.0, January 2004 (see LICENSE file). + +Snap.svg uses the following third party libraries that may have licenses +differing from that of Snap.svg itself. You can find the libraries and their +respective licenses below. + + - eve ./node_modules/eve + + https://github.com/adobe-webplatform/eve/ + + Copyright (c) 2013 Adobe Systems Incorporated. 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. + + - Mocha ./node_modules/mocha + + https://github.com/visionmedia/mocha/ + + (The MIT License) + + Copyright (c) 2011-2013 TJ Holowaychuk + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + - Expect ./node_modules/expect.js + + https://github.com/LearnBoost/expect.js + + (The MIT License) + + Copyright (c) 2011 Guillermo Rauch + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + - Grunt ./node_modules/grunt + + http://gruntjs.com + + Copyright (c) 2013 "Cowboy" Ben Alman + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + + - Backbone ./demos/animated-game/js/backbone.js + + http://backbonejs.org/ + + (The MIT License) + + Copyright (c) 2010-2013 Jeremy Ashkenas, DocumentCloud + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + - Underscore ./demos/animated-game/js/underscore.js + + http://underscorejs.org + + (The MIT License) + + Copyright (c) 2010-2013 Jeremy Ashkenas, DocumentCloud + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + - jQuery ./demos/animated-game/js/jquery-1.9.0.min.js + + http://http://jquery.com/ + + (The MIT License) + + Copyright 2013 jQuery Foundation and other contributors + http://jquery.com/ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + 'Software'), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md new file mode 100644 index 0000000..8040710 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/README.md @@ -0,0 +1,68 @@ +[Snap.svg](http://snapsvg.io) +====== + +A JavaScript SVG library for the modern web. Learn more at [snapsvg.io](http://snapsvg.io). + +[Follow us on Twitter.](https://twitter.com/snapsvg) + +### Install +* [Bower](http://bower.io/) - `bower install snap.svg` +* Manual Minified - https://github.com/adobe-webplatform/Snap.svg/raw/master/dist/snap.svg-min.js +* Manual Unminified - https://raw.githubusercontent.com/adobe-webplatform/Snap.svg/master/dist/snap.svg.js + + +### Learn + +* [About Snap.svg](http://snapsvg.io/about/) +* [Getting Started](http://snapsvg.io/start/) +* [API Reference](http://snapsvg.io/docs/) + +### Use + +In your HTML file, load simply by: `` +No other scripts are needed. Both the minified and uncompressed (for development) versions are in the `/dist` folder. + +### Build + +Snap.svg uses [Grunt](http://gruntjs.com/) to build. + +* Open the terminal from the Snap.svg directory: + + cd Snap.svg + +* Install its command line interface (CLI) globally: + + npm install -g grunt-cli + +_*You might need to use `sudo npm`, depending on your configuration._ + +* Install dependencies with npm: + + npm install + +_*Snap.svg uses Grunt 0.4.0. You might want to [read](http://gruntjs.com/getting-started) more on their website if you haven’t upgraded since a lot has changed._ + +* Type `grunt` in the command line to build the files. +* The results will be built into the release folder. +* Alternatively type `grunt watch` to have the build run automatically when you make changes to source files. + +### Contribute + +* [Fill out the CLA](http://snapsvg.io/contributions/). +* [Fork](https://help.github.com/articles/fork-a-repo) the repo. +* Create a branch: + + git checkout -b my_branch + +* Add your changes. +* Commit your changes: + + git commit -am "Added some awesome stuff" + +* Push your branch: + + git push origin my_branch + +* Make a [pull request](https://help.github.com/articles/using-pull-requests) to `dev` branch. + +*Note:* Pull requests to other branches than `dev` or without filled CLA wouldn’t be accepted. diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json new file mode 100644 index 0000000..2d97a8f --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/bower.json @@ -0,0 +1,25 @@ +{ + "name": "Snap.svg", + "version": "0.4.0", + "homepage": "http://snapsvg.io", + "authors": [ + "Dmitry Baranovskiy " + ], + "description": "The JavaScript library for modern SVG graphics", + "main": "dist/snap.svg-min.js", + "keywords": [ + "svg", + "snap", + "js", + "javascript" + ], + "license": "Apache 2", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "demos", + "src" + ] +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json new file mode 100644 index 0000000..a9fdee3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/component.json @@ -0,0 +1,13 @@ +{ + "name": "Snap.svg", + "repo": "adobe-webplatform/Snap.svg", + "description": "The JavaScript library for modern SVG graphics.", + "version": "0.3.0", + "keywords": ["svg", "snap", "js", "javascript"], + "dependencies": {}, + "development": {}, + "main": "dist/snap.svg-min.js", + "scripts": [ + "dist/snap.svg-min.js" + ] +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js new file mode 100644 index 0000000..6567d19 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg-min.js @@ -0,0 +1,21 @@ +// Snap.svg 0.4.1 +// +// Copyright (c) 2013 – 2015 Adobe Systems Incorporated. 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. +// +// build: 2015-04-13 + +!function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g=/\s*,\s*/,h="*",i=function(a,b){return a-b},j={n:{}},k=function(){for(var a=0,b=this.length;b>a;a++)if("undefined"!=typeof this[a])return this[a]},l=function(){for(var a=this.length;--a;)if("undefined"!=typeof this[a])return this[a]},m=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=m.listeners(a),j=0,n=[],o={},p=[],q=b;p.firstDefined=k,p.lastDefined=l,b=a,c=0;for(var r=0,s=h.length;s>r;r++)"zIndex"in h[r]&&(n.push(h[r].zIndex),h[r].zIndex<0&&(o[h[r].zIndex]=h[r]));for(n.sort(i);n[j]<0;)if(e=o[n[j++]],p.push(e.apply(d,g)),c)return c=f,p;for(r=0;s>r;r++)if(e=h[r],"zIndex"in e)if(e.zIndex==n[j]){if(p.push(e.apply(d,g)),c)break;do if(j++,e=o[n[j]],e&&p.push(e.apply(d,g)),c)break;while(e)}else o[e.zIndex]=e;else if(p.push(e.apply(d,g)),c)break;return c=f,b=q,p};m._events=j,m.listeners=function(a){var b,c,d,e,g,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,g=m.length;g>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[h]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},m.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(g),d=0,e=c.length;e>d;d++)!function(a){for(var c,d=a.split(f),e=j,g=0,h=d.length;h>g;g++)e=e.n,e=e.hasOwnProperty(d[g])&&e[d[g]]||(e[d[g]]={n:{}});for(e.f=e.f||[],g=0,h=e.f.length;h>g;g++)if(e.f[g]==b){c=!0;break}!c&&e.f.push(b)}(c[d]);return function(a){+a==+a&&(b.zIndex=+a)}},m.f=function(a){var b=[].slice.call(arguments,1);return function(){m.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},m.stop=function(){c=1},m.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},m.nts=function(){return b.split(f)},m.off=m.unbind=function(a,b){if(!a)return void(m._events=j={n:{}});var c=a.split(g);if(c.length>1)for(var d=0,i=c.length;i>d;d++)m.off(c[d],b);else{c=a.split(f);var k,l,n,d,i,o,p,q=[j];for(d=0,i=c.length;i>d;d++)for(o=0;od;d++)for(k=q[d];k.n;){if(b){if(k.f){for(o=0,p=k.f.length;p>o;o++)if(k.f[o]==b){k.f.splice(o,1);break}!k.f.length&&delete k.f}for(l in k.n)if(k.n[e](l)&&k.n[l].f){var r=k.n[l].f;for(o=0,p=r.length;p>o;o++)if(r[o]==b){r.splice(o,1);break}!r.length&&delete k.n[l].f}}else{delete k.f;for(l in k.n)k.n[e](l)&&k.n[l].f&&delete k.n[l].f}k=k.n}}},m.once=function(a,b){var c=function(){return m.unbind(a,c),b.apply(this,arguments)};return m.on(a,c)},m.version=d,m.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=m:"function"==typeof define&&define.amd?define("eve",[],function(){return m}):a.eve=m}(this),function(a,b){if("function"==typeof define&&define.amd)define(["eve"],function(c){return b(a,c)});else if("undefined"!=typeof exports){var c=require("eve");module.exports=b(a,c)}else b(a,a.eve)}(window||this,function(a,b){var c=function(b){var c={},d=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},e=Array.isArray||function(a){return a instanceof Array||"[object Array]"==Object.prototype.toString.call(a)},f=0,g="M"+(+new Date).toString(36),h=function(){return g+(f++).toString(36)},i=Date.now||function(){return+new Date},j=function(a){var b=this;if(null==a)return b.s;var c=b.s-a;b.b+=b.dur*c,b.B+=b.dur*c,b.s=a},k=function(a){var b=this;return null==a?b.spd:void(b.spd=a)},l=function(a){var b=this;return null==a?b.dur:(b.s=b.s*a/b.dur,void(b.dur=a))},m=function(){var a=this;delete c[a.id],a.update(),b("mina.stop."+a.id,a)},n=function(){var a=this;a.pdif||(delete c[a.id],a.update(),a.pdif=a.get()-a.b)},o=function(){var a=this;a.pdif&&(a.b=a.get()-a.pdif,delete a.pdif,c[a.id]=a)},p=function(){var a,b=this;if(e(b.start)){a=[];for(var c=0,d=b.start.length;d>c;c++)a[c]=+b.start[c]+(b.end[c]-b.start[c])*b.easing(b.s)}else a=+b.start+(b.end-b.start)*b.easing(b.s);b.set(a)},q=function(){var a=0;for(var e in c)if(c.hasOwnProperty(e)){var f=c[e],g=f.get();a++,f.s=(g-f.b)/(f.dur/f.spd),f.s>=1&&(delete c[e],f.s=1,a--,function(a){setTimeout(function(){b("mina.finish."+a.id,a)})}(f)),f.update()}a&&d(q)},r=function(a,b,e,f,g,i,s){var t={id:h(),start:a,end:b,b:e,s:0,dur:f-e,spd:1,get:g,set:i,easing:s||r.linear,status:j,speed:k,duration:l,stop:m,pause:n,resume:o,update:p};c[t.id]=t;var u,v=0;for(u in c)if(c.hasOwnProperty(u)&&(v++,2==v))break;return 1==v&&d(q),t};return r.time=i,r.getById=function(a){return c[a]||null},r.linear=function(a){return a},r.easeout=function(a){return Math.pow(a,1.7)},r.easein=function(a){return Math.pow(a,.48)},r.easeinout=function(a){if(1==a)return 1;if(0==a)return 0;var b=.48-a/1.04,c=Math.sqrt(.1734+b*b),d=c-b,e=Math.pow(Math.abs(d),1/3)*(0>d?-1:1),f=-c-b,g=Math.pow(Math.abs(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},r.backin=function(a){if(1==a)return 1;var b=1.70158;return a*a*((b+1)*a-b)},r.backout=function(a){if(0==a)return 0;a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},r.elastic=function(a){return a==!!a?a:Math.pow(2,-10*a)*Math.sin(2*(a-.075)*Math.PI/.3)+1},r.bounce=function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b},a.mina=r,r}("undefined"==typeof b?function(){}:b),d=function(a){function c(a,b){if(a){if(a.nodeType)return w(a);if(e(a,"array")&&c.set)return c.set.apply(c,a);if(a instanceof s)return a;if(null==b)return a=y.doc.querySelector(String(a)),w(a)}return a=null==a?"100%":a,b=null==b?"100%":b,new v(a,b)}function d(a,b){if(b){if("#text"==a&&(a=y.doc.createTextNode(b.text||b["#text"]||"")),"#comment"==a&&(a=y.doc.createComment(b.text||b["#text"]||"")),"string"==typeof a&&(a=d(a)),"string"==typeof b)return 1==a.nodeType?"xlink:"==b.substring(0,6)?a.getAttributeNS(T,b.substring(6)):"xml:"==b.substring(0,4)?a.getAttributeNS(U,b.substring(4)):a.getAttribute(b):"text"==b?a.nodeValue:null;if(1==a.nodeType){for(var c in b)if(b[z](c)){var e=A(b[c]);e?"xlink:"==c.substring(0,6)?a.setAttributeNS(T,c.substring(6),e):"xml:"==c.substring(0,4)?a.setAttributeNS(U,c.substring(4),e):a.setAttribute(c,e):a.removeAttribute(c)}}else"text"in b&&(a.nodeValue=b.text)}else a=y.doc.createElementNS(U,a);return a}function e(a,b){return b=A.prototype.toLowerCase.call(b),"finite"==b?isFinite(a):"array"==b&&(a instanceof Array||Array.isArray&&Array.isArray(a))?!0:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||J.call(a).slice(8,-1).toLowerCase()==b}function f(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=f(a[c]));return b}function h(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function i(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("â€"),g=d.cache=d.cache||{},i=d.count=d.count||[];return g[z](f)?(h(i,f),c?c(g[f]):g[f]):(i.length>=1e3&&delete g[i.shift()],i.push(f),g[f]=a.apply(b,e),c?c(g[f]):g[f])}return d}function j(a,b,c,d,e,f){if(null==e){var g=a-c,h=b-d;return g||h?(180+180*D.atan2(-h,-g)/H+360)%360:0}return j(a,b,e,f)-j(c,d,e,f)}function k(a){return a%360*H/180}function l(a){return 180*a/H%360}function m(a){var b=[];return a=a.replace(/(?:^|\s)(\w+)\(([^)]+)\)/g,function(a,c,d){return d=d.split(/\s*,\s*|\s+/),"rotate"==c&&1==d.length&&d.push(0,0),"scale"==c&&(d.length>2?d=d.slice(0,2):2==d.length&&d.push(0,0),1==d.length&&d.push(d[0],0,0)),b.push("skewX"==c?["m",1,0,D.tan(k(d[0])),1,0,0]:"skewY"==c?["m",1,D.tan(k(d[0])),0,1,0,0]:[c.charAt(0)].concat(d)),a}),b}function n(a,b){var d=ab(a),e=new c.Matrix;if(d)for(var f=0,g=d.length;g>f;f++){var h,i,j,k,l,m=d[f],n=m.length,o=A(m[0]).toLowerCase(),p=m[0]!=o,q=p?e.invert():0;"t"==o&&2==n?e.translate(m[1],0):"t"==o&&3==n?p?(h=q.x(0,0),i=q.y(0,0),j=q.x(m[1],m[2]),k=q.y(m[1],m[2]),e.translate(j-h,k-i)):e.translate(m[1],m[2]):"r"==o?2==n?(l=l||b,e.rotate(m[1],l.x+l.width/2,l.y+l.height/2)):4==n&&(p?(j=q.x(m[2],m[3]),k=q.y(m[2],m[3]),e.rotate(m[1],j,k)):e.rotate(m[1],m[2],m[3])):"s"==o?2==n||3==n?(l=l||b,e.scale(m[1],m[n-1],l.x+l.width/2,l.y+l.height/2)):4==n?p?(j=q.x(m[2],m[3]),k=q.y(m[2],m[3]),e.scale(m[1],m[1],j,k)):e.scale(m[1],m[1],m[2],m[3]):5==n&&(p?(j=q.x(m[3],m[4]),k=q.y(m[3],m[4]),e.scale(m[1],m[2],j,k)):e.scale(m[1],m[2],m[3],m[4])):"m"==o&&7==n&&e.add(m[1],m[2],m[3],m[4],m[5],m[6])}return e}function o(a){var b=a.node.ownerSVGElement&&w(a.node.ownerSVGElement)||a.node.parentNode&&w(a.node.parentNode)||c.select("svg")||c(0,0),d=b.select("defs"),e=null==d?!1:d.node;return e||(e=u("defs",b.node).node),e}function p(a){return a.node.ownerSVGElement&&w(a.node.ownerSVGElement)||c.select("svg")}function q(a,b,c){function e(a){if(null==a)return I;if(a==+a)return a;d(j,{width:a});try{return j.getBBox().width}catch(b){return 0}}function f(a){if(null==a)return I;if(a==+a)return a;d(j,{height:a});try{return j.getBBox().height}catch(b){return 0}}function g(d,e){null==b?i[d]=e(a.attr(d)||0):d==b&&(i=e(null==c?a.attr(d)||0:c))}var h=p(a).node,i={},j=h.querySelector(".svg---mgr");switch(j||(j=d("rect"),d(j,{x:-9e9,y:-9e9,width:10,height:10,"class":"svg---mgr",fill:"none"}),h.appendChild(j)),a.type){case"rect":g("rx",e),g("ry",f);case"image":g("width",e),g("height",f);case"text":g("x",e),g("y",f);break;case"circle":g("cx",e),g("cy",f),g("r",e);break;case"ellipse":g("cx",e),g("cy",f),g("rx",e),g("ry",f);break;case"line":g("x1",e),g("x2",e),g("y1",f),g("y2",f);break;case"marker":g("refX",e),g("markerWidth",e),g("refY",f),g("markerHeight",f);break;case"radialGradient":g("fx",e),g("fy",f);break;case"tspan":g("dx",e),g("dy",f);break;default:g(b,e)}return h.removeChild(j),i}function r(a){e(a,"array")||(a=Array.prototype.slice.call(arguments,0));for(var b=0,c=0,d=this.node;this[b];)delete this[b++];for(b=0;bc;c++){var e={type:a[c].type,attr:a[c].attr()},f=a[c].children();b.push(e),f.length&&x(f,e.childNodes=[])}}c.version="0.4.0",c.toString=function(){return"Snap v"+this.version},c._={};var y={win:a.window,doc:a.window.document};c._.glob=y;{var z="hasOwnProperty",A=String,B=parseFloat,C=parseInt,D=Math,E=D.max,F=D.min,G=D.abs,H=(D.pow,D.PI),I=(D.round,""),J=Object.prototype.toString,K=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\))\s*$/i,L=(c._.separator=/[,\s]+/,/[\s]*,[\s]*/),M={hs:1,rg:1},N=/([a-z])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/gi,O=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/gi,P=/(-?\d*\.?\d*(?:e[\-+]?\\d+)?)[\s]*,?[\s]*/gi,Q=0,R="S"+(+new Date).toString(36),S=function(a){return(a&&a.type?a.type:I)+R+(Q++).toString(36)},T="http://www.w3.org/1999/xlink",U="http://www.w3.org/2000/svg",V={};c.url=function(a){return"url('#"+a+"')"}}c._.$=d,c._.id=S,c.format=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return A(b).replace(a,function(a,b){return c(a,b,d)})}}(),c._.clone=f,c._.cacher=i,c.rad=k,c.deg=l,c.sin=function(a){return D.sin(c.rad(a))},c.tan=function(a){return D.tan(c.rad(a))},c.cos=function(a){return D.cos(c.rad(a))},c.asin=function(a){return c.deg(D.asin(a))},c.acos=function(a){return c.deg(D.acos(a))},c.atan=function(a){return c.deg(D.atan(a))},c.atan2=function(a){return c.deg(D.atan2(a))},c.angle=j,c.len=function(a,b,d,e){return Math.sqrt(c.len2(a,b,d,e))},c.len2=function(a,b,c,d){return(a-c)*(a-c)+(b-d)*(b-d)},c.closestPoint=function(a,b,c){function d(a){var d=a.x-b,e=a.y-c;return d*d+e*e}for(var e,f,g,h,i=a.node,j=i.getTotalLength(),k=j/i.pathSegList.numberOfItems*.125,l=1/0,m=0;j>=m;m+=k)(h=d(g=i.getPointAtLength(m))).5;){var n,o,p,q,r,s;(p=f-k)>=0&&(r=d(n=i.getPointAtLength(p)))f)return b-f;if(f>a-c)return b-f+a}return b},c.getRGB=i(function(a){if(!a||(a=A(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:Z};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:Z};if(!(M[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=W(a)),!a)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:Z};var b,d,f,g,h,i,j=a.match(K);return j?(j[2]&&(f=C(j[2].substring(5),16),d=C(j[2].substring(3,5),16),b=C(j[2].substring(1,3),16)),j[3]&&(f=C((h=j[3].charAt(3))+h,16),d=C((h=j[3].charAt(2))+h,16),b=C((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4].split(L),b=B(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=B(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),f=B(i[2]),"%"==i[2].slice(-1)&&(f*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5].split(L),b=B(i[0]),"%"==i[0].slice(-1)&&(b/=100),d=B(i[1]),"%"==i[1].slice(-1)&&(d/=100),f=B(i[2]),"%"==i[2].slice(-1)&&(f/=100),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),c.hsb2rgb(b,d,f,g)):j[6]?(i=j[6].split(L),b=B(i[0]),"%"==i[0].slice(-1)&&(b/=100),d=B(i[1]),"%"==i[1].slice(-1)&&(d/=100),f=B(i[2]),"%"==i[2].slice(-1)&&(f/=100),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),c.hsl2rgb(b,d,f,g)):(b=F(D.round(b),255),d=F(D.round(d),255),f=F(D.round(f),255),g=F(E(g,0),1),j={r:b,g:d,b:f,toString:Z},j.hex="#"+(16777216|f|d<<8|b<<16).toString(16).slice(1),j.opacity=e(g,"finite")?g:1,j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:Z}},c),c.hsb=i(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=i(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=i(function(a,b,c,d){if(e(d,"finite")){var f=D.round;return"rgba("+[f(a),f(b),f(c),+d.toFixed(2)]+")"}return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)});var W=function(a){var b=y.doc.getElementsByTagName("head")[0]||y.doc.getElementsByTagName("svg")[0],c="rgb(255, 0, 0)";return(W=i(function(a){if("red"==a.toLowerCase())return c;b.style.color=c,b.style.color=a;var d=y.doc.defaultView.getComputedStyle(b,I).getPropertyValue("color");return d==c?null:d}))(a)},X=function(){return"hsb("+[this.h,this.s,this.b]+")"},Y=function(){return"hsl("+[this.h,this.s,this.l]+")"},Z=function(){return 1==this.opacity||null==this.opacity?this.hex:"rgba("+[this.r,this.g,this.b,this.opacity]+")"},$=function(a,b,d){if(null==b&&e(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&e(a,string)){var f=c.getRGB(a);a=f.r,b=f.g,d=f.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},_=function(a,b,d,f){a=D.round(255*a),b=D.round(255*b),d=D.round(255*d);var g={r:a,g:b,b:d,opacity:e(f,"finite")?f:1,hex:c.rgb(a,b,d),toString:Z};return e(f,"finite")&&(g.opacity=f),g};c.color=function(a){var b;return e(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):e(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):(e(a,"string")&&(a=c.getRGB(a)),e(a,"object")&&"r"in a&&"g"in a&&"b"in a&&!("error"in a)?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1,a.error=1)),a.toString=Z,a},c.hsb2rgb=function(a,b,c,d){e(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var f,g,h,i,j;return a=a%360/60,j=c*b,i=j*(1-G(a%2-1)),f=g=h=c-j,a=~~a,f+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],_(f,g,h,d)},c.hsl2rgb=function(a,b,c,d){e(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var f,g,h,i,j;return a=a%360/60,j=2*b*(.5>c?c:1-c),i=j*(1-G(a%2-1)),f=g=h=c-j/2,a=~~a,f+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],_(f,g,h,d)},c.rgb2hsb=function(a,b,c){c=$(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=E(a,b,c),g=f-F(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:X}},c.rgb2hsl=function(a,b,c){c=$(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=E(a,b,c),h=F(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:Y}},c.parsePathString=function(a){if(!a)return null;var b=c.path(a);if(b.arr)return c.path.clone(b.arr);var d={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},f=[];return e(a,"array")&&e(a[0],"array")&&(f=c.path.clone(a)),f.length||A(a).replace(N,function(a,b,c){var e=[],g=b.toLowerCase();if(c.replace(P,function(a,b){b&&e.push(+b)}),"m"==g&&e.length>2&&(f.push([b].concat(e.splice(0,2))),g="l",b="m"==b?"l":"L"),"o"==g&&1==e.length&&f.push([b,e[0]]),"r"==g)f.push([b].concat(e));else for(;e.length>=d[g]&&(f.push([b].concat(e.splice(0,d[g]))),d[g]););}),f.toString=c.path.toString,b.arr=c.path.clone(f),f};var ab=c.parseTransformString=function(a){if(!a)return null;var b=[];return e(a,"array")&&e(a[0],"array")&&(b=c.path.clone(a)),b.length||A(a).replace(O,function(a,c,d){{var e=[];c.toLowerCase()}d.replace(P,function(a,b){b&&e.push(+b)}),b.push([c].concat(e))}),b.toString=c.path.toString,b};c._.svgTransform2string=m,c._.rgTransform=/^[a-z][\s]*-?\.?\d/i,c._.transform2matrix=n,c._unit2px=q;y.doc.contains||y.doc.compareDocumentPosition?function(a,b){var c=9==a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a==d||!(!d||1!=d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b;)if(b=b.parentNode,b==a)return!0;return!1};c._.getSomeDefs=o,c._.getSomeSVG=p,c.select=function(a){return a=A(a).replace(/([^\\]):/g,"$1\\:"),w(y.doc.querySelector(a))},c.selectAll=function(a){for(var b=y.doc.querySelectorAll(a),d=(c.set||Array)(),e=0;ei;i++)h[g[i].nodeName]=g[i].nodeValue;return h}if(e(a,"string")){if(!(arguments.length>1))return b("snap.util.getattr."+a,d).firstDefined();var k={};k[a]=c,a=k}for(var l in a)a[z](l)&&b("snap.util.attr."+l,d,a[l]);return d},c.parse=function(a){var b=y.doc.createDocumentFragment(),c=!0,d=y.doc.createElement("div");if(a=A(a),a.match(/^\s*<\s*svg(?:\s|>)/)||(a=""+a+"",c=!1),d.innerHTML=a,a=d.getElementsByTagName("svg")[0])if(c)b=a;else for(;a.firstChild;)b.appendChild(a.firstChild);return new t(b)},c.fragment=function(){for(var a=Array.prototype.slice.call(arguments,0),b=y.doc.createDocumentFragment(),d=0,e=a.length;e>d;d++){var f=a[d];f.node&&f.node.nodeType&&b.appendChild(f.node),f.nodeType&&b.appendChild(f),"string"==typeof f&&b.appendChild(c.parse(f).node)}return new t(b)},c._.make=u,c._.wrap=w,v.prototype.el=function(a,b){var c=u(a,this.node);return b&&c.attr(b),c},s.prototype.children=function(){for(var a=[],b=this.node.childNodes,d=0,e=b.length;e>d;d++)a[d]=c(b[d]);return a},s.prototype.toJSON=function(){var a=[];return x([this],a),a[0]},b.on("snap.util.getattr",function(){var a=b.nt();a=a.substring(a.lastIndexOf(".")+1);var c=a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()});return bb[z](c)?this.node.ownerDocument.defaultView.getComputedStyle(this.node,null).getPropertyValue(c):d(this.node,a)});var bb={"alignment-baseline":0,"baseline-shift":0,clip:0,"clip-path":0,"clip-rule":0,color:0,"color-interpolation":0,"color-interpolation-filters":0,"color-profile":0,"color-rendering":0,cursor:0,direction:0,display:0,"dominant-baseline":0,"enable-background":0,fill:0,"fill-opacity":0,"fill-rule":0,filter:0,"flood-color":0,"flood-opacity":0,font:0,"font-family":0,"font-size":0,"font-size-adjust":0,"font-stretch":0,"font-style":0,"font-variant":0,"font-weight":0,"glyph-orientation-horizontal":0,"glyph-orientation-vertical":0,"image-rendering":0,kerning:0,"letter-spacing":0,"lighting-color":0,marker:0,"marker-end":0,"marker-mid":0,"marker-start":0,mask:0,opacity:0,overflow:0,"pointer-events":0,"shape-rendering":0,"stop-color":0,"stop-opacity":0,stroke:0,"stroke-dasharray":0,"stroke-dashoffset":0,"stroke-linecap":0,"stroke-linejoin":0,"stroke-miterlimit":0,"stroke-opacity":0,"stroke-width":0,"text-anchor":0,"text-decoration":0,"text-rendering":0,"unicode-bidi":0,visibility:0,"word-spacing":0,"writing-mode":0};b.on("snap.util.attr",function(a){var c=b.nt(),e={};c=c.substring(c.lastIndexOf(".")+1),e[c]=a;var f=c.replace(/-(\w)/gi,function(a,b){return b.toUpperCase()}),g=c.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()});bb[z](g)?this.node.style[f]=null==a?I:a:d(this.node,e)}),function(){}(v.prototype),c.ajax=function(a,c,d,f){var g=new XMLHttpRequest,h=S();if(g){if(e(c,"function"))f=d,d=c,c=null;else if(e(c,"object")){var i=[];for(var j in c)c.hasOwnProperty(j)&&i.push(encodeURIComponent(j)+"="+encodeURIComponent(c[j]));c=i.join("&")}return g.open(c?"POST":"GET",a,!0),c&&(g.setRequestHeader("X-Requested-With","XMLHttpRequest"),g.setRequestHeader("Content-type","application/x-www-form-urlencoded")),d&&(b.once("snap.ajax."+h+".0",d),b.once("snap.ajax."+h+".200",d),b.once("snap.ajax."+h+".304",d)),g.onreadystatechange=function(){4==g.readyState&&b("snap.ajax."+h+"."+g.status,f,g)},4==g.readyState?g:(g.send(c),g)}},c.load=function(a,b,d){c.ajax(a,function(a){var e=c.parse(a.responseText);d?b.call(d,e):b(e)})};var cb=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};return c.getElementByPoint=function(a,b){var c=this,d=(c.canvas,y.doc.elementFromPoint(a,b));if(y.win.opera&&"svg"==d.tagName){var e=cb(d),f=d.createSVGRect();f.x=a-e.x,f.y=b-e.y,f.width=f.height=1;var g=d.getIntersectionList(f,null);g.length&&(d=g[g.length-1])}return d?w(d):null},c.plugin=function(a){a(c,s,v,y,t)},y.win.Snap=c,c}(a||this);return d.plugin(function(d,e,f,g,h){function i(a,b){if(null==b){var c=!0;if(b=a.node.getAttribute("linearGradient"==a.type||"radialGradient"==a.type?"gradientTransform":"pattern"==a.type?"patternTransform":"transform"),!b)return new d.Matrix;b=d._.svgTransform2string(b)}else b=d._.rgTransform.test(b)?o(b).replace(/\.{3}|\u2026/g,a._.transform||""):d._.svgTransform2string(b),n(b,"array")&&(b=d.path?d.path.toString.call(b):o(b)),a._.transform=b;var e=d._.transform2matrix(b,a.getBBox(1));return c?e:void(a.matrix=e)}function j(a){function b(a,b){var c=q(a.node,b);c=c&&c.match(f),c=c&&c[2],c&&"#"==c.charAt()&&(c=c.substring(1),c&&(h[c]=(h[c]||[]).concat(function(c){var d={};d[b]=URL(c),q(a.node,d)})))}function c(a){var b=q(a.node,"xlink:href");b&&"#"==b.charAt()&&(b=b.substring(1),b&&(h[b]=(h[b]||[]).concat(function(b){a.attr("xlink:href","#"+b)})))}for(var d,e=a.selectAll("*"),f=/^\s*url\(("|'|)(.*)\1\)\s*$/,g=[],h={},i=0,j=e.length;j>i;i++){d=e[i],b(d,"fill"),b(d,"stroke"),b(d,"filter"),b(d,"mask"),b(d,"clip-path"),c(d);var k=q(d.node,"id");k&&(q(d.node,{id:d.id}),g.push({old:k,id:d.id}))}for(i=0,j=g.length;j>i;i++){var l=h[g[i].old];if(l)for(var m=0,n=l.length;n>m;m++)l[m](g[i].id)}}function k(a,b,c){return function(d){var e=d.slice(a,b);return 1==e.length&&(e=e[0]),c?c(e):e}}function l(a){return function(){var b=a?"<"+this.type:"",c=this.node.attributes,d=this.node.childNodes;if(a)for(var e=0,f=c.length;f>e;e++)b+=" "+c[e].name+'="'+c[e].value.replace(/"/g,'\\"')+'"';if(d.length){for(a&&(b+=">"),e=0,f=d.length;f>e;e++)3==d[e].nodeType?b+=d[e].nodeValue:1==d[e].nodeType&&(b+=u(d[e]).toString());a&&(b+="")}else a&&(b+="/>");return b}}var m=e.prototype,n=d.is,o=String,p=d._unit2px,q=d._.$,r=d._.make,s=d._.getSomeDefs,t="hasOwnProperty",u=d._.wrap;m.getBBox=function(a){if(!d.Matrix||!d.path)return this.node.getBBox();var b=this,c=new d.Matrix;if(b.removed)return d._.box();for(;"use"==b.type;)if(a||(c=c.add(b.transform().localMatrix.translate(b.attr("x")||0,b.attr("y")||0))),b.original)b=b.original;else{var e=b.attr("xlink:href");b=b.original=b.node.ownerDocument.getElementById(e.substring(e.indexOf("#")+1))}var f=b._,g=d.path.get[b.type]||d.path.get.deflt;try{return a?(f.bboxwt=g?d.path.getBBox(b.realPath=g(b)):d._.box(b.node.getBBox()),d._.box(f.bboxwt)):(b.realPath=g(b),b.matrix=b.transform().localMatrix,f.bbox=d.path.getBBox(d.path.map(b.realPath,c.add(b.matrix))),d._.box(f.bbox))}catch(h){return d._.box()}};var v=function(){return this.string};m.transform=function(a){var b=this._;if(null==a){for(var c,e=this,f=new d.Matrix(this.node.getCTM()),g=i(this),h=[g],j=new d.Matrix,k=g.toTransformString(),l=o(g)==o(this.matrix)?o(b.transform):k;"svg"!=e.type&&(e=e.parent());)h.push(i(e));for(c=h.length;c--;)j.add(h[c]);return{string:l,globalMatrix:f,totalMatrix:j,localMatrix:g,diffMatrix:f.clone().add(g.invert()),global:f.toTransformString(),total:j.toTransformString(),local:k,toString:v}}return a instanceof d.Matrix?(this.matrix=a,this._.transform=a.toTransformString()):i(this,a),this.node&&("linearGradient"==this.type||"radialGradient"==this.type?q(this.node,{gradientTransform:this.matrix}):"pattern"==this.type?q(this.node,{patternTransform:this.matrix}):q(this.node,{transform:this.matrix})),this},m.parent=function(){return u(this.node.parentNode)},m.append=m.add=function(a){if(a){if("set"==a.type){var b=this;return a.forEach(function(a){b.add(a)}),this}a=u(a),this.node.appendChild(a.node),a.paper=this.paper}return this},m.appendTo=function(a){return a&&(a=u(a),a.append(this)),this},m.prepend=function(a){if(a){if("set"==a.type){var b,c=this;return a.forEach(function(a){b?b.after(a):c.prepend(a),b=a}),this}a=u(a);var d=a.parent();this.node.insertBefore(a.node,this.node.firstChild),this.add&&this.add(),a.paper=this.paper,this.parent()&&this.parent().add(),d&&d.add()}return this},m.prependTo=function(a){return a=u(a),a.prepend(this),this},m.before=function(a){if("set"==a.type){var b=this;return a.forEach(function(a){var c=a.parent();b.node.parentNode.insertBefore(a.node,b.node),c&&c.add()}),this.parent().add(),this}a=u(a);var c=a.parent();return this.node.parentNode.insertBefore(a.node,this.node),this.parent()&&this.parent().add(),c&&c.add(),a.paper=this.paper,this},m.after=function(a){a=u(a);var b=a.parent();return this.node.nextSibling?this.node.parentNode.insertBefore(a.node,this.node.nextSibling):this.node.parentNode.appendChild(a.node),this.parent()&&this.parent().add(),b&&b.add(),a.paper=this.paper,this},m.insertBefore=function(a){a=u(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},m.insertAfter=function(a){a=u(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node.nextSibling),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},m.remove=function(){var a=this.parent();return this.node.parentNode&&this.node.parentNode.removeChild(this.node),delete this.paper,this.removed=!0,a&&a.add(),this},m.select=function(a){return u(this.node.querySelector(a))},m.selectAll=function(a){for(var b=this.node.querySelectorAll(a),c=(d.set||Array)(),e=0;eb;b++)a[b].stop();return this},m.animate=function(a,d,e,f){"function"!=typeof e||e.length||(f=e,e=c.linear),a instanceof w&&(f=a.callback,e=a.easing,d=a.dur,a=a.attr);var g,h,i,j,l=[],m=[],p={},q=this;for(var r in a)if(a[t](r)){q.equal?(j=q.equal(r,o(a[r])),g=j.from,h=j.to,i=j.f):(g=+q.attr(r),h=+a[r]);var s=n(g,"array")?g.length:1;p[r]=k(l.length,l.length+s,i),l=l.concat(g),m=m.concat(h)}var u=c.time(),v=c(l,m,u,u+d,c.time,function(a){var b={};for(var c in p)p[t](c)&&(b[c]=p[c](a));q.attr(b)},e);return q.anims[v.id]=v,v._attrs=a,v._callback=f,b("snap.animcreated."+q.id,v),b.once("mina.finish."+v.id,function(){delete q.anims[v.id],f&&f.call(q)}),b.once("mina.stop."+v.id,function(){delete q.anims[v.id]}),q};var x={};m.data=function(a,c){var e=x[this.id]=x[this.id]||{};if(0==arguments.length)return b("snap.data.get."+this.id,this,e,null),e; +if(1==arguments.length){if(d.is(a,"object")){for(var f in a)a[t](f)&&this.data(f,a[f]);return this}return b("snap.data.get."+this.id,this,e[a],a),e[a]}return e[a]=c,b("snap.data.set."+this.id,this,c,a),this},m.removeData=function(a){return null==a?x[this.id]={}:x[this.id]&&delete x[this.id][a],this},m.outerSVG=m.toString=l(1),m.innerSVG=l(),m.toDataURL=function(){if(a&&a.btoa){var b=this.getBBox(),c=d.format('{contents}',{x:+b.x.toFixed(3),y:+b.y.toFixed(3),width:+b.width.toFixed(3),height:+b.height.toFixed(3),contents:this.outerSVG()});return"data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(c)))}},h.prototype.select=m.select,h.prototype.selectAll=m.selectAll}),d.plugin(function(a){function b(a,b,d,e,f,g){return null==b&&"[object SVGMatrix]"==c.call(a)?(this.a=a.a,this.b=a.b,this.c=a.c,this.d=a.d,this.e=a.e,void(this.f=a.f)):void(null!=a?(this.a=+a,this.b=+b,this.c=+d,this.d=+e,this.e=+f,this.f=+g):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0))}var c=Object.prototype.toString,d=String,e=Math,f="";!function(c){function g(a){return a[0]*a[0]+a[1]*a[1]}function h(a){var b=e.sqrt(g(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}c.add=function(a,c,d,e,f,g){var h,i,j,k,l=[[],[],[]],m=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],n=[[a,d,f],[c,e,g],[0,0,1]];for(a&&a instanceof b&&(n=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),h=0;3>h;h++)for(i=0;3>i;i++){for(k=0,j=0;3>j;j++)k+=m[h][j]*n[j][i];l[h][i]=k}return this.a=l[0][0],this.b=l[1][0],this.c=l[0][1],this.d=l[1][1],this.e=l[0][2],this.f=l[1][2],this},c.invert=function(){var a=this,c=a.a*a.d-a.b*a.c;return new b(a.d/c,-a.b/c,-a.c/c,a.a/c,(a.c*a.f-a.d*a.e)/c,(a.b*a.e-a.a*a.f)/c)},c.clone=function(){return new b(this.a,this.b,this.c,this.d,this.e,this.f)},c.translate=function(a,b){return this.add(1,0,0,1,a,b)},c.scale=function(a,b,c,d){return null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d),this},c.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var f=+e.cos(b).toFixed(9),g=+e.sin(b).toFixed(9);return this.add(f,g,-g,f,c,d),this.add(1,0,0,1,-c,-d)},c.x=function(a,b){return a*this.a+b*this.c+this.e},c.y=function(a,b){return a*this.b+b*this.d+this.f},c.get=function(a){return+this[d.fromCharCode(97+a)].toFixed(4)},c.toString=function(){return"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")"},c.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},c.determinant=function(){return this.a*this.d-this.b*this.c},c.split=function(){var b={};b.dx=this.e,b.dy=this.f;var c=[[this.a,this.c],[this.b,this.d]];b.scalex=e.sqrt(g(c[0])),h(c[0]),b.shear=c[0][0]*c[1][0]+c[0][1]*c[1][1],c[1]=[c[1][0]-c[0][0]*b.shear,c[1][1]-c[0][1]*b.shear],b.scaley=e.sqrt(g(c[1])),h(c[1]),b.shear/=b.scaley,this.determinant()<0&&(b.scalex=-b.scalex);var d=-c[0][1],f=c[1][1];return 0>f?(b.rotate=a.deg(e.acos(f)),0>d&&(b.rotate=360-b.rotate)):b.rotate=a.deg(e.asin(d)),b.isSimple=!(+b.shear.toFixed(9)||b.scalex.toFixed(9)!=b.scaley.toFixed(9)&&b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate,b},c.toTransformString=function(a){var b=a||this.split();return+b.shear.toFixed(9)?"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]:(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[+b.dx.toFixed(4),+b.dy.toFixed(4)]:f)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:f)+(b.rotate?"r"+[+b.rotate.toFixed(4),0,0]:f))}}(b.prototype),a.Matrix=b,a.matrix=function(a,c,d,e,f,g){return new b(a,c,d,e,f,g)}}),d.plugin(function(a,c,d,e,f){function g(d){return function(e){if(b.stop(),e instanceof f&&1==e.node.childNodes.length&&("radialGradient"==e.node.firstChild.tagName||"linearGradient"==e.node.firstChild.tagName||"pattern"==e.node.firstChild.tagName)&&(e=e.node.firstChild,n(this).appendChild(e),e=l(e)),e instanceof c)if("radialGradient"==e.type||"linearGradient"==e.type||"pattern"==e.type){e.node.id||p(e.node,{id:e.id});var g=q(e.node.id)}else g=e.attr(d);else if(g=a.color(e),g.error){var h=a(n(this).ownerSVGElement).gradient(e);h?(h.node.id||p(h.node,{id:h.id}),g=q(h.node.id)):g=e}else g=r(g);var i={};i[d]=g,p(this.node,i),this.node.style[d]=t}}function h(a){b.stop(),a==+a&&(a+="px"),this.node.style.fontSize=a}function i(a){for(var b=[],c=a.childNodes,d=0,e=c.length;e>d;d++){var f=c[d];3==f.nodeType&&b.push(f.nodeValue),"tspan"==f.tagName&&b.push(1==f.childNodes.length&&3==f.firstChild.nodeType?f.firstChild.nodeValue:i(f))}return b}function j(){return b.stop(),this.node.style.fontSize}var k=a._.make,l=a._.wrap,m=a.is,n=a._.getSomeDefs,o=/^url\(#?([^)]+)\)$/,p=a._.$,q=a.url,r=String,s=a._.separator,t="";b.on("snap.util.attr.mask",function(a){if(a instanceof c||a instanceof f){if(b.stop(),a instanceof f&&1==a.node.childNodes.length&&(a=a.node.firstChild,n(this).appendChild(a),a=l(a)),"mask"==a.type)var d=a;else d=k("mask",n(this)),d.node.appendChild(a.node);!d.node.id&&p(d.node,{id:d.id}),p(this.node,{mask:q(d.id)})}}),function(a){b.on("snap.util.attr.clip",a),b.on("snap.util.attr.clip-path",a),b.on("snap.util.attr.clipPath",a)}(function(a){if(a instanceof c||a instanceof f){if(b.stop(),"clipPath"==a.type)var d=a;else d=k("clipPath",n(this)),d.node.appendChild(a.node),!d.node.id&&p(d.node,{id:d.id});p(this.node,{"clip-path":q(d.node.id||d.id)})}}),b.on("snap.util.attr.fill",g("fill")),b.on("snap.util.attr.stroke",g("stroke"));var u=/^([lr])(?:\(([^)]*)\))?(.*)$/i;b.on("snap.util.grad.parse",function(a){a=r(a);var b=a.match(u);if(!b)return null;var c=b[1],d=b[2],e=b[3];return d=d.split(/\s*,\s*/).map(function(a){return+a==a?+a:a}),1==d.length&&0==d[0]&&(d=[]),e=e.split("-"),e=e.map(function(a){a=a.split(":");var b={color:a[0]};return a[1]&&(b.offset=parseFloat(a[1])),b}),{type:c,params:d,stops:e}}),b.on("snap.util.attr.d",function(c){b.stop(),m(c,"array")&&m(c[0],"array")&&(c=a.path.toString.call(c)),c=r(c),c.match(/[ruo]/i)&&(c=a.path.toAbsolute(c)),p(this.node,{d:c})})(-1),b.on("snap.util.attr.#text",function(a){b.stop(),a=r(a);for(var c=e.doc.createTextNode(a);this.node.firstChild;)this.node.removeChild(this.node.firstChild);this.node.appendChild(c)})(-1),b.on("snap.util.attr.path",function(a){b.stop(),this.attr({d:a})})(-1),b.on("snap.util.attr.class",function(a){b.stop(),this.node.className.baseVal=a})(-1),b.on("snap.util.attr.viewBox",function(a){var c;c=m(a,"object")&&"x"in a?[a.x,a.y,a.width,a.height].join(" "):m(a,"array")?a.join(" "):a,p(this.node,{viewBox:c}),b.stop()})(-1),b.on("snap.util.attr.transform",function(a){this.transform(a),b.stop()})(-1),b.on("snap.util.attr.r",function(a){"rect"==this.type&&(b.stop(),p(this.node,{rx:a,ry:a}))})(-1),b.on("snap.util.attr.textpath",function(a){if(b.stop(),"text"==this.type){var d,e,f;if(!a&&this.textPath){for(e=this.textPath;e.node.firstChild;)this.node.appendChild(e.node.firstChild);return e.remove(),void delete this.textPath}if(m(a,"string")){var g=n(this),h=l(g.parentNode).path(a);g.appendChild(h.node),d=h.id,h.attr({id:d})}else a=l(a),a instanceof c&&(d=a.attr("id"),d||(d=a.id,a.attr({id:d})));if(d)if(e=this.textPath,f=this.node,e)e.attr({"xlink:href":"#"+d});else{for(e=p("textPath",{"xlink:href":"#"+d});f.firstChild;)e.appendChild(f.firstChild);f.appendChild(e),this.textPath=l(e)}}})(-1),b.on("snap.util.attr.text",function(a){if("text"==this.type){for(var c=this.node,d=function(a){var b=p("tspan");if(m(a,"array"))for(var c=0;c1&&(a=Array.prototype.slice.call(arguments,0));var b={};return h(a,"object")&&!h(a,"array")?b=a:null!=a&&(b={points:a}),this.el("polyline",b)},g.polygon=function(a){arguments.length>1&&(a=Array.prototype.slice.call(arguments,0));var b={};return h(a,"object")&&!h(a,"array")?b=a:null!=a&&(b={points:a}),this.el("polygon",b)},function(){function d(){return this.selectAll("stop")}function e(a,b){var d=k("stop"),e={offset:+b+"%"};return a=c.color(a),e["stop-color"]=a.hex,a.opacity<1&&(e["stop-opacity"]=a.opacity),k(d,e),this.node.appendChild(d),this}function f(){if("linearGradient"==this.type){var a=k(this.node,"x1")||0,b=k(this.node,"x2")||1,d=k(this.node,"y1")||0,e=k(this.node,"y2")||0;return c._.box(a,d,math.abs(b-a),math.abs(e-d))}var f=this.node.cx||.5,g=this.node.cy||.5,h=this.node.r||0;return c._.box(f-h,g-h,2*h,2*h)}function h(a,c){function d(a,b){for(var c=(b-l)/(a-m),d=m;a>d;d++)g[d].offset=+(+l+c*(d-m)).toFixed(2);m=a,l=b}var e,f=b("snap.util.grad.parse",null,c).firstDefined();if(!f)return null;f.params.unshift(a),e="l"==f.type.toLowerCase()?i.apply(0,f.params):j.apply(0,f.params),f.type!=f.type.toLowerCase()&&k(e.node,{gradientUnits:"userSpaceOnUse"});var g=f.stops,h=g.length,l=0,m=0;h--;for(var n=0;h>n;n++)"offset"in g[n]&&d(n,g[n].offset);for(g[h].offset=g[h].offset||100,d(h,g[h].offset),n=0;h>=n;n++){var o=g[n];e.addStop(o.color,o.offset)}return e}function i(a,b,g,h,i){var j=c._.make("linearGradient",a);return j.stops=d,j.addStop=e,j.getBBox=f,null!=b&&k(j.node,{x1:b,y1:g,x2:h,y2:i}),j}function j(a,b,g,h,i,j){var l=c._.make("radialGradient",a);return l.stops=d,l.addStop=e,l.getBBox=f,null!=b&&k(l.node,{cx:b,cy:g,r:h}),null!=i&&null!=j&&k(l.node,{fx:i,fy:j}),l}var k=c._.$;g.gradient=function(a){return h(this.defs,a)},g.gradientLinear=function(a,b,c,d){return i(this.defs,a,b,c,d)},g.gradientRadial=function(a,b,c,d,e){return j(this.defs,a,b,c,d,e)},g.toString=function(){var a,b=this.node.ownerDocument,d=b.createDocumentFragment(),e=b.createElement("div"),f=this.node.cloneNode(!0);return d.appendChild(e),e.appendChild(f),c._.$(f,{xmlns:"http://www.w3.org/2000/svg"}),a=e.innerHTML,d.removeChild(d.firstChild),a},g.toDataURL=function(){return a&&a.btoa?"data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent(this))):void 0},g.clear=function(){for(var a,b=this.node.firstChild;b;)a=b.nextSibling,"defs"!=b.tagName?b.parentNode.removeChild(b):g.clear.call({node:b}),b=a}}()}),d.plugin(function(a,b){function c(a){var b=c.ps=c.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[K](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]}function d(a,b,c,d){return null==a&&(a=b=c=d=0),null==b&&(b=a.y,c=a.width,d=a.height,a=a.x),{x:a,y:b,width:c,w:c,height:d,h:d,x2:a+c,y2:b+d,cx:a+c/2,cy:b+d/2,r1:N.min(c,d)/2,r2:N.max(c,d)/2,r0:N.sqrt(c*c+d*d)/2,path:w(a,b,c,d),vb:[a,b,c,d].join(" ")}}function e(){return this.join(",").replace(L,"$1")}function f(a){var b=J(a);return b.toString=e,b}function g(a,b,c,d,e,f,g,h,j){return null==j?n(a,b,c,d,e,f,g,h):i(a,b,c,d,e,f,g,h,o(a,b,c,d,e,f,g,h,j))}function h(c,d){function e(a){return+(+a).toFixed(3)}return a._.cacher(function(a,f,h){a instanceof b&&(a=a.attr("d")),a=E(a);for(var j,k,l,m,n,o="",p={},q=0,r=0,s=a.length;s>r;r++){if(l=a[r],"M"==l[0])j=+l[1],k=+l[2];else{if(m=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6]),q+m>f){if(d&&!p.start){if(n=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6],f-q),o+=["C"+e(n.start.x),e(n.start.y),e(n.m.x),e(n.m.y),e(n.x),e(n.y)],h)return o;p.start=o,o=["M"+e(n.x),e(n.y)+"C"+e(n.n.x),e(n.n.y),e(n.end.x),e(n.end.y),e(l[5]),e(l[6])].join(),q+=m,j=+l[5],k=+l[6];continue}if(!c&&!d)return n=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6],f-q)}q+=m,j=+l[5],k=+l[6]}o+=l.shift()+l}return p.end=o,n=c?q:d?p:i(j,k,l[0],l[1],l[2],l[3],l[4],l[5],1)},null,a._.clone)}function i(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/O;return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}}function j(b,c,e,f,g,h,i,j){a.is(b,"array")||(b=[b,c,e,f,g,h,i,j]);var k=D.apply(null,b);return d(k.min.x,k.min.y,k.max.x-k.min.x,k.max.y-k.min.y)}function k(a,b,c){return b>=a.x&&b<=a.x+a.width&&c>=a.y&&c<=a.y+a.height}function l(a,b){return a=d(a),b=d(b),k(b,a.x,a.y)||k(b,a.x2,a.y)||k(b,a.x,a.y2)||k(b,a.x2,a.y2)||k(a,b.x,b.y)||k(a,b.x2,b.y)||k(a,b.x,b.y2)||k(a,b.x2,b.y2)||(a.xb.x||b.xa.x)&&(a.yb.y||b.ya.y)}function m(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function n(a,b,c,d,e,f,g,h,i){null==i&&(i=1),i=i>1?1:0>i?0:i;for(var j=i/2,k=12,l=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;k>p;p++){var q=j*l[p]+j,r=m(q,a,c,e,g),s=m(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return j*o}function o(a,b,c,d,e,f,g,h,i){if(!(0>i||n(a,b,c,d,e,f,g,h)o;)l/=2,m+=(i>j?1:-1)*l,j=n(a,b,c,d,e,f,g,h,m);return m}}function p(a,b,c,d,e,f,g,h){if(!(Q(a,c)Q(e,g)||Q(b,d)Q(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+Q(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+Q(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+Q(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+Q(f,h).toFixed(2)))return{x:l,y:m}}}}function q(a,b,c){var d=j(a),e=j(b);if(!l(d,e))return c?0:[];for(var f=n.apply(0,a),g=n.apply(0,b),h=~~(f/8),k=~~(g/8),m=[],o=[],q={},r=c?0:[],s=0;h+1>s;s++){var t=i.apply(0,a.concat(s/h));m.push({x:t.x,y:t.y,t:s/h})}for(s=0;k+1>s;s++)t=i.apply(0,b.concat(s/k)),o.push({x:t.x,y:t.y,t:s/k});for(s=0;h>s;s++)for(var u=0;k>u;u++){var v=m[s],w=m[s+1],x=o[u],y=o[u+1],z=S(w.x-v.x)<.001?"y":"x",A=S(y.x-x.x)<.001?"y":"x",B=p(v.x,v.y,w.x,w.y,x.x,x.y,y.x,y.y);if(B){if(q[B.x.toFixed(4)]==B.y.toFixed(4))continue;q[B.x.toFixed(4)]=B.y.toFixed(4);var C=v.t+S((B[z]-v[z])/(w[z]-v[z]))*(w.t-v.t),D=x.t+S((B[A]-x[A])/(y[A]-x[A]))*(y.t-x.t);C>=0&&1>=C&&D>=0&&1>=D&&(c?r++:r.push({x:B.x,y:B.y,t1:C,t2:D}))}}return r}function r(a,b){return t(a,b)}function s(a,b){return t(a,b,1)}function t(a,b,c){a=E(a),b=E(b);for(var d,e,f,g,h,i,j,k,l,m,n=c?0:[],o=0,p=a.length;p>o;o++){var r=a[o];if("M"==r[0])d=h=r[1],e=i=r[2];else{"C"==r[0]?(l=[d,e].concat(r.slice(1)),d=l[6],e=l[7]):(l=[d,e,d,e,h,i,h,i],d=h,e=i);for(var s=0,t=b.length;t>s;s++){var u=b[s];if("M"==u[0])f=j=u[1],g=k=u[2];else{"C"==u[0]?(m=[f,g].concat(u.slice(1)),f=m[6],g=m[7]):(m=[f,g,f,g,j,k,j,k],f=j,g=k);var v=q(l,m,c);if(c)n+=v;else{for(var w=0,x=v.length;x>w;w++)v[w].segment1=o,v[w].segment2=s,v[w].bez1=l,v[w].bez2=m;n=n.concat(v)}}}}}return n}function u(a,b,c){var d=v(a);return k(d,b,c)&&t(a,[["M",b,c],["H",d.x2+10]],1)%2==1}function v(a){var b=c(a);if(b.bbox)return J(b.bbox);if(!a)return d();a=E(a);for(var e,f=0,g=0,h=[],i=[],j=0,k=a.length;k>j;j++)if(e=a[j],"M"==e[0])f=e[1],g=e[2],h.push(f),i.push(g);else{var l=D(f,g,e[1],e[2],e[3],e[4],e[5],e[6]);h=h.concat(l.min.x,l.max.x),i=i.concat(l.min.y,l.max.y),f=e[5],g=e[6]}var m=P.apply(0,h),n=P.apply(0,i),o=Q.apply(0,h),p=Q.apply(0,i),q=d(m,n,o-m,p-n);return b.bbox=J(q),q}function w(a,b,c,d,f){if(f)return[["M",+a+ +f,b],["l",c-2*f,0],["a",f,f,0,0,1,f,f],["l",0,d-2*f],["a",f,f,0,0,1,-f,f],["l",2*f-c,0],["a",f,f,0,0,1,-f,-f],["l",0,2*f-d],["a",f,f,0,0,1,f,-f],["z"]];var g=[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]];return g.toString=e,g}function x(a,b,c,d,f){if(null==f&&null==d&&(d=c),a=+a,b=+b,c=+c,d=+d,null!=f)var g=Math.PI/180,h=a+c*Math.cos(-d*g),i=a+c*Math.cos(-f*g),j=b+c*Math.sin(-d*g),k=b+c*Math.sin(-f*g),l=[["M",h,j],["A",c,c,0,+(f-d>180),0,i,k]];else l=[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]];return l.toString=e,l}function y(b){var d=c(b),g=String.prototype.toLowerCase;if(d.rel)return f(d.rel);a.is(b,"array")&&a.is(b&&b[0],"array")||(b=a.parsePathString(b));var h=[],i=0,j=0,k=0,l=0,m=0;"M"==b[0][0]&&(i=b[0][1],j=b[0][2],k=i,l=j,m++,h.push(["M",i,j]));for(var n=m,o=b.length;o>n;n++){var p=h[n]=[],q=b[n];if(q[0]!=g.call(q[0]))switch(p[0]=g.call(q[0]),p[0]){case"a":p[1]=q[1],p[2]=q[2],p[3]=q[3],p[4]=q[4],p[5]=q[5],p[6]=+(q[6]-i).toFixed(3),p[7]=+(q[7]-j).toFixed(3);break;case"v":p[1]=+(q[1]-j).toFixed(3);break;case"m":k=q[1],l=q[2];default:for(var r=1,s=q.length;s>r;r++)p[r]=+(q[r]-(r%2?i:j)).toFixed(3)}else{p=h[n]=[],"m"==q[0]&&(k=q[1]+i,l=q[2]+j);for(var t=0,u=q.length;u>t;t++)h[n][t]=q[t]}var v=h[n].length;switch(h[n][0]){case"z":i=k,j=l;break;case"h":i+=+h[n][v-1];break;case"v":j+=+h[n][v-1];break;default:i+=+h[n][v-2],j+=+h[n][v-1]}}return h.toString=e,d.rel=f(h),h}function z(b){var d=c(b);if(d.abs)return f(d.abs);if(I(b,"array")&&I(b&&b[0],"array")||(b=a.parsePathString(b)),!b||!b.length)return[["M",0,0]];var g,h=[],i=0,j=0,k=0,l=0,m=0;"M"==b[0][0]&&(i=+b[0][1],j=+b[0][2],k=i,l=j,m++,h[0]=["M",i,j]);for(var n,o,p=3==b.length&&"M"==b[0][0]&&"R"==b[1][0].toUpperCase()&&"Z"==b[2][0].toUpperCase(),q=m,r=b.length;r>q;q++){if(h.push(n=[]),o=b[q],g=o[0],g!=g.toUpperCase())switch(n[0]=g.toUpperCase(),n[0]){case"A":n[1]=o[1],n[2]=o[2],n[3]=o[3],n[4]=o[4],n[5]=o[5],n[6]=+o[6]+i,n[7]=+o[7]+j;break;case"V":n[1]=+o[1]+j;break;case"H":n[1]=+o[1]+i;break;case"R":for(var s=[i,j].concat(o.slice(1)),t=2,u=s.length;u>t;t++)s[t]=+s[t]+i,s[++t]=+s[t]+j;h.pop(),h=h.concat(G(s,p));break;case"O":h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);break;case"U":h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=["U"].concat(h[h.length-1].slice(-2));break;case"M":k=+o[1]+i,l=+o[2]+j;default:for(t=1,u=o.length;u>t;t++)n[t]=+o[t]+(t%2?i:j)}else if("R"==g)s=[i,j].concat(o.slice(1)),h.pop(),h=h.concat(G(s,p)),n=["R"].concat(o.slice(-2));else if("O"==g)h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);else if("U"==g)h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=["U"].concat(h[h.length-1].slice(-2));else for(var v=0,w=o.length;w>v;v++)n[v]=o[v];if(g=g.toUpperCase(),"O"!=g)switch(n[0]){case"Z":i=+k,j=+l;break;case"H":i=n[1];break;case"V":j=n[1];break;case"M":k=n[n.length-2],l=n[n.length-1];default:i=n[n.length-2],j=n[n.length-1]}}return h.toString=e,d.abs=f(h),h}function A(a,b,c,d){return[a,b,c,d,c,d]}function B(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]}function C(b,c,d,e,f,g,h,i,j,k){var l,m=120*O/180,n=O/180*(+f||0),o=[],p=a._.cacher(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(b,c,-n),b=l.x,c=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(O/180*f),N.sin(O/180*f),(b-i)/2),r=(c-j)/2,s=q*q/(d*d)+r*r/(e*e);s>1&&(s=N.sqrt(s),d=s*d,e=s*e);var t=d*d,u=e*e,v=(g==h?-1:1)*N.sqrt(S((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*d*r/e+(b+i)/2,x=v*-e*q/d+(c+j)/2,y=N.asin(((c-x)/e).toFixed(9)),z=N.asin(((j-x)/e).toFixed(9));y=w>b?O-y:y,z=w>i?O-z:z,0>y&&(y=2*O+y),0>z&&(z=2*O+z),h&&y>z&&(y-=2*O),!h&&z>y&&(z-=2*O)}var A=z-y;if(S(A)>m){var B=z,D=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+d*N.cos(z),j=x+e*N.sin(z),o=C(i,j,d,e,f,0,h,D,E,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),J=N.tan(A/4),K=4/3*d*J,L=4/3*e*J,M=[b,c],P=[b+K*G,c-L*F],Q=[i+K*I,j-L*H],R=[i,j];if(P[0]=2*M[0]-P[0],P[1]=2*M[1]-P[1],k)return[P,Q,R].concat(o);o=[P,Q,R].concat(o).join().split(",");for(var T=[],U=0,V=o.length;V>U;U++)T[U]=U%2?p(o[U-1],o[U],n).y:p(o[U],o[U+1],n).x;return T}function D(a,b,c,d,e,f,g,h){for(var i,j,k,l,m,n,o,p,q=[],r=[[],[]],s=0;2>s;++s)if(0==s?(j=6*a-12*c+6*e,i=-3*a+9*c-9*e+3*g,k=3*c-3*a):(j=6*b-12*d+6*f,i=-3*b+9*d-9*f+3*h,k=3*d-3*b),S(i)<1e-12){if(S(j)<1e-12)continue;l=-k/j,l>0&&1>l&&q.push(l)}else o=j*j-4*k*i,p=N.sqrt(o),0>o||(m=(-j+p)/(2*i),m>0&&1>m&&q.push(m),n=(-j-p)/(2*i),n>0&&1>n&&q.push(n));for(var t,u=q.length,v=u;u--;)l=q[u],t=1-l,r[0][u]=t*t*t*a+3*t*t*l*c+3*t*l*l*e+l*l*l*g,r[1][u]=t*t*t*b+3*t*t*l*d+3*t*l*l*f+l*l*l*h;return r[0][v]=a,r[1][v]=b,r[0][v+1]=g,r[1][v+1]=h,r[0].length=r[1].length=v+2,{min:{x:P.apply(0,r[0]),y:P.apply(0,r[1])},max:{x:Q.apply(0,r[0]),y:Q.apply(0,r[1])}}}function E(a,b){var d=!b&&c(a);if(!b&&d.curve)return f(d.curve);for(var e=z(a),g=b&&z(b),h={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},i={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},j=(function(a,b,c){var d,e;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"].concat(C.apply(0,[b.x,b.y].concat(a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e].concat(a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"].concat(B(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"].concat(B(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"].concat(A(b.x,b.y,a[1],a[2]));break;case"H":a=["C"].concat(A(b.x,b.y,a[1],b.y));break;case"V":a=["C"].concat(A(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"].concat(A(b.x,b.y,b.X,b.Y))}return a}),k=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)m[b]="A",g&&(n[b]="A"),a.splice(b++,0,["C"].concat(c.splice(0,6)));a.splice(b,1),r=Q(e.length,g&&g.length||0)}},l=function(a,b,c,d,f){a&&b&&"M"==a[f][0]&&"M"!=b[f][0]&&(b.splice(f,0,["M",d.x,d.y]),c.bx=0,c.by=0,c.x=a[f][1],c.y=a[f][2],r=Q(e.length,g&&g.length||0))},m=[],n=[],o="",p="",q=0,r=Q(e.length,g&&g.length||0);r>q;q++){e[q]&&(o=e[q][0]),"C"!=o&&(m[q]=o,q&&(p=m[q-1])),e[q]=j(e[q],h,p),"A"!=m[q]&&"C"==o&&(m[q]="C"),k(e,q),g&&(g[q]&&(o=g[q][0]),"C"!=o&&(n[q]=o,q&&(p=n[q-1])),g[q]=j(g[q],i,p),"A"!=n[q]&&"C"==o&&(n[q]="C"),k(g,q)),l(e,g,h,i,q),l(g,e,i,h,q);var s=e[q],t=g&&g[q],u=s.length,v=g&&t.length;h.x=s[u-2],h.y=s[u-1],h.bx=M(s[u-4])||h.x,h.by=M(s[u-3])||h.y,i.bx=g&&(M(t[v-4])||i.x),i.by=g&&(M(t[v-3])||i.y),i.x=g&&t[v-2],i.y=g&&t[v-1]}return g||(d.curve=f(e)),g?[e,g]:e}function F(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=E(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a}function G(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}var H=b.prototype,I=a.is,J=a._.clone,K="hasOwnProperty",L=/,?([a-z]),?/gi,M=parseFloat,N=Math,O=N.PI,P=N.min,Q=N.max,R=N.pow,S=N.abs,T=h(1),U=h(),V=h(0,1),W=a._unit2px,X={path:function(a){return a.attr("path")},circle:function(a){var b=W(a);return x(b.cx,b.cy,b.r)},ellipse:function(a){var b=W(a);return x(b.cx||0,b.cy||0,b.rx,b.ry)},rect:function(a){var b=W(a);return w(b.x||0,b.y||0,b.width,b.height,b.rx,b.ry)},image:function(a){var b=W(a);return w(b.x||0,b.y||0,b.width,b.height)},line:function(a){return"M"+[a.attr("x1")||0,a.attr("y1")||0,a.attr("x2"),a.attr("y2")]},polyline:function(a){return"M"+a.attr("points")},polygon:function(a){return"M"+a.attr("points")+"z"},deflt:function(a){var b=a.node.getBBox();return w(b.x,b.y,b.width,b.height)}};a.path=c,a.path.getTotalLength=T,a.path.getPointAtLength=U,a.path.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return V(a,b).end;var d=V(a,c,1);return b?V(d,b).end:d},H.getTotalLength=function(){return this.node.getTotalLength?this.node.getTotalLength():void 0},H.getPointAtLength=function(a){return U(this.attr("d"),a)},H.getSubpath=function(b,c){return a.path.getSubpath(this.attr("d"),b,c)},a._.box=d,a.path.findDotsAtSegment=i,a.path.bezierBBox=j,a.path.isPointInsideBBox=k,a.closest=function(b,c,e,f){for(var g=100,h=d(b-g/2,c-g/2,g,g),i=[],j=e[0].hasOwnProperty("x")?function(a){return{x:e[a].x,y:e[a].y}}:function(a){return{x:e[a],y:f[a]}},l=0;1e6>=g&&!l;){for(var m=0,n=e.length;n>m;m++){var o=j(m);if(k(h,o.x,o.y)){l++,i.push(o);break}}l||(g*=2,h=d(b-g/2,c-g/2,g,g))}if(1e6!=g){var p,q=1/0;for(m=0,n=i.length;n>m;m++){var r=a.len(b,c,i[m].x,i[m].y);q>r&&(q=r,i[m].len=r,p=i[m])}return p}},a.path.isBBoxIntersect=l,a.path.intersection=r,a.path.intersectionNumber=s,a.path.isPointInside=u,a.path.getBBox=v,a.path.get=X,a.path.toRelative=y,a.path.toAbsolute=z,a.path.toCubic=E,a.path.map=F,a.path.toString=e,a.path.clone=f}),d.plugin(function(a){var d=Math.max,e=Math.min,f=function(a){if(this.items=[],this.bindings={},this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)a[b]&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},g=f.prototype;g.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],a&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},g.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},g.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this},g.animate=function(d,e,f,g){"function"!=typeof f||f.length||(g=f,f=c.linear),d instanceof a._.Animation&&(g=d.callback,f=d.easing,e=f.dur,d=d.attr);var h=arguments;if(a.is(d,"array")&&a.is(h[h.length-1],"array"))var i=!0;var j,k=function(){j?this.b=j:j=this.b},l=0,m=this,n=g&&function(){++l==m.length&&g.call(this) +};return this.forEach(function(a,c){b.once("snap.animcreated."+a.id,k),i?h[c]&&a.animate.apply(a,h[c]):a.animate(d,e,f,n)})},g.remove=function(){for(;this.length;)this.pop().remove();return this},g.bind=function(a,b,c){var d={};if("function"==typeof b)this.bindings[a]=b;else{var e=c||a;this.bindings[a]=function(a){d[e]=a,b.attr(d)}}return this},g.attr=function(a){var b={};for(var c in a)this.bindings[c]?this.bindings[c](a[c]):b[c]=a[c];for(var d=0,e=this.items.length;e>d;d++)this.items[d].attr(b);return this},g.clear=function(){for(;this.length;)this.pop()},g.splice=function(a,b){a=0>a?d(this.length+a,0):a,b=d(0,e(this.length-a,b));var c,g=[],h=[],i=[];for(c=2;cc;c++)h.push(this[a+c]);for(;cc?i[c]:g[c-j];for(c=this.items.length=this.length-=b-j;this[c];)delete this[c++];return new f(h)},g.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0;return!1},g.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},g.getBBox=function(){for(var a=[],b=[],c=[],f=[],g=this.items.length;g--;)if(!this.items[g].removed){var h=this.items[g].getBBox();a.push(h.x),b.push(h.y),c.push(h.x+h.width),f.push(h.y+h.height)}return a=e.apply(0,a),b=e.apply(0,b),c=d.apply(0,c),f=d.apply(0,f),{x:a,y:b,x2:c,y2:f,width:c-a,height:f-b,cx:a+(c-a)/2,cy:b+(f-b)/2}},g.clone=function(a){a=new f;for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},g.toString=function(){return"Snap‘s set"},g.type="set",a.Set=f,a.set=function(){var a=new f;return arguments.length&&a.push.apply(a,Array.prototype.slice.call(arguments,0)),a}}),d.plugin(function(a,c){function d(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}}function e(b,c,e){c=p(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];for(var f,g,h,i,l=Math.max(b.length,c.length),m=[],n=[],o=0;l>o;o++){if(h=b[o]||d(c[o]),i=c[o]||d(h),h[0]!=i[0]||"r"==h[0].toLowerCase()&&(h[2]!=i[2]||h[3]!=i[3])||"s"==h[0].toLowerCase()&&(h[3]!=i[3]||h[4]!=i[4])){b=a._.transform2matrix(b,e()),c=a._.transform2matrix(c,e()),m=[["m",b.a,b.b,b.c,b.d,b.e,b.f]],n=[["m",c.a,c.b,c.c,c.d,c.e,c.f]];break}for(m[o]=[],n[o]=[],f=0,g=Math.max(h.length,i.length);g>f;f++)f in h&&(m[o][f]=h[f]),f in i&&(n[o][f]=i[f])}return{from:k(m),to:k(n),f:j(m)}}function f(a){return a}function g(a){return function(b){return+b.toFixed(3)+a}}function h(a){return a.join(" ")}function i(b){return a.rgb(b[0],b[1],b[2])}function j(a){var b,c,d,e,f,g,h=0,i=[];for(b=0,c=a.length;c>b;b++){for(f="[",g=['"'+a[b][0]+'"'],d=1,e=a[b].length;e>d;d++)g[d]="val["+h++ +"]";f+=g+"]",i[b]=f}return Function("val","return Snap.path.toString.call(["+i+"])")}function k(a){for(var b=[],c=0,d=a.length;d>c;c++)for(var e=1,f=a[c].length;f>e;e++)b.push(a[c][e]);return b}function l(a){return isFinite(parseFloat(a))}function m(b,c){return a.is(b,"array")&&a.is(c,"array")?b.toString()==c.toString():!1}var n={},o=/[a-z]+$/i,p=String;n.stroke=n.fill="colour",c.prototype.equal=function(a,c){return b("snap.util.equal",this,a,c).firstDefined()},b.on("snap.util.equal",function(b,c){var d,q,r=p(this.attr(b)||""),s=this;if(l(r)&&l(c))return{from:parseFloat(r),to:parseFloat(c),f:f};if("colour"==n[b])return d=a.color(r),q=a.color(c),{from:[d.r,d.g,d.b,d.opacity],to:[q.r,q.g,q.b,q.opacity],f:i};if("viewBox"==b)return d=this.attr(b).vb.split(" ").map(Number),q=c.split(" ").map(Number),{from:d,to:q,f:h};if("transform"==b||"gradientTransform"==b||"patternTransform"==b)return c instanceof a.Matrix&&(c=c.toTransformString()),a._.rgTransform.test(c)||(c=a._.svgTransform2string(c)),e(r,c,function(){return s.getBBox(1)});if("d"==b||"path"==b)return d=a.path.toCubic(r,c),{from:k(d[0]),to:k(d[1]),f:j(d[0])};if("points"==b)return d=p(r).split(a._.separator),q=p(c).split(a._.separator),{from:d,to:q,f:function(a){return a}};var t=r.match(o),u=p(c).match(o);return t&&m(t,u)?{from:parseFloat(r),to:parseFloat(c),f:g(t)}:{from:this.asPX(b),to:this.asPX(b,c),f:f}})}),d.plugin(function(a,c,d,e){for(var f=c.prototype,g="hasOwnProperty",h=("createTouch"in e.doc),i=["click","dblclick","mousedown","mousemove","mouseout","mouseover","mouseup","touchstart","touchmove","touchend","touchcancel"],j={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},k=(function(a,b){var c="y"==a?"scrollTop":"scrollLeft",d=b&&b.node?b.node.ownerDocument:e.doc;return d[c in d.documentElement?"documentElement":"body"][c]}),l=function(){return this.originalEvent.preventDefault()},m=function(){return this.originalEvent.stopPropagation()},n=function(a,b,c,d){var e=h&&j[b]?j[b]:b,f=function(e){var f=k("y",d),i=k("x",d);if(h&&j[g](b))for(var n=0,o=e.targetTouches&&e.targetTouches.length;o>n;n++)if(e.targetTouches[n].target==a||a.contains(e.targetTouches[n].target)){var p=e;e=e.targetTouches[n],e.originalEvent=p,e.preventDefault=l,e.stopPropagation=m;break}var q=e.clientX+i,r=e.clientY+f;return c.call(d,e,q,r)};return b!==e&&a.addEventListener(b,f,!1),a.addEventListener(e,f,!1),function(){return b!==e&&a.removeEventListener(b,f,!1),a.removeEventListener(e,f,!1),!0}},o=[],p=function(a){for(var c,d=a.clientX,e=a.clientY,f=k("y"),g=k("x"),i=o.length;i--;){if(c=o[i],h){for(var j,l=a.touches&&a.touches.length;l--;)if(j=a.touches[l],j.identifier==c.el._drag.id||c.el.node.contains(j.target)){d=j.clientX,e=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();{var m=c.el.node;m.nextSibling,m.parentNode,m.style.display}d+=g,e+=f,b("snap.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},q=function(c){a.unmousemove(p).unmouseup(q);for(var d,e=o.length;e--;)d=o[e],d.el._drag={},b("snap.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c),b.off("snap.drag.*."+d.el.id);o=[]},r=i.length;r--;)!function(b){a[b]=f[b]=function(c,d){if(a.is(c,"function"))this.events=this.events||[],this.events.push({name:b,f:c,unbind:n(this.node||document,b,c,d||this)});else for(var e=0,f=this.events.length;f>e;e++)if(this.events[e].name==b)try{this.events[e].f.call(this)}catch(g){}return this},a["un"+b]=f["un"+b]=function(a){for(var c=this.events||[],d=c.length;d--;)if(c[d].name==b&&(c[d].f==a||!a))return c[d].unbind(),c.splice(d,1),!c.length&&delete this.events,this;return this}}(i[r]);f.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},f.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var s=[];f.drag=function(c,d,e,f,g,h){function i(i,j,l){(i.originalEvent||i).preventDefault(),k._drag.x=j,k._drag.y=l,k._drag.id=i.identifier,!o.length&&a.mousemove(p).mouseup(q),o.push({el:k,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("snap.drag.start."+k.id,d),c&&b.on("snap.drag.move."+k.id,c),e&&b.on("snap.drag.end."+k.id,e),b("snap.drag.start."+k.id,g||f||k,j,l,i)}function j(a,c,d){b("snap.draginit."+k.id,k,a,c,d)}var k=this;if(!arguments.length){var l;return k.drag(function(a,b){this.attr({transform:l+(l?"T":"t")+[a,b]})},function(){l=this.transform().local})}return b.on("snap.draginit."+k.id,i),k._drag={},s.push({el:k,start:i,init:j}),k.mousedown(j),k},f.undrag=function(){for(var c=s.length;c--;)s[c].el==this&&(this.unmousedown(s[c].init),s.splice(c,1),b.unbind("snap.drag.*."+this.id),b.unbind("snap.draginit."+this.id));return!s.length&&a.unmousemove(p).unmouseup(q),this}}),d.plugin(function(a,c,d){var e=(c.prototype,d.prototype),f=/^\s*url\((.+)\)/,g=String,h=a._.$;a.filter={},e.filter=function(b){var d=this;"svg"!=d.type&&(d=d.paper);var e=a.parse(g(b)),f=a._.id(),i=(d.node.offsetWidth,d.node.offsetHeight,h("filter"));return h(i,{id:f,filterUnits:"userSpaceOnUse"}),i.appendChild(e.node),d.defs.appendChild(i),new c(i)},b.on("snap.util.getattr.filter",function(){b.stop();var c=h(this.node,"filter");if(c){var d=g(c).match(f);return d&&a.select(d[1])}}),b.on("snap.util.attr.filter",function(d){if(d instanceof c&&"filter"==d.type){b.stop();var e=d.node.id;e||(h(d.node,{id:d.id}),e=d.id),h(this.node,{filter:a.url(e)})}d&&"none"!=d||(b.stop(),this.node.removeAttribute("filter"))}),a.filter.blur=function(b,c){null==b&&(b=2);var d=null==c?b:[b,c];return a.format('',{def:d})},a.filter.blur.toString=function(){return this()},a.filter.shadow=function(b,c,d,e,f){return"string"==typeof d&&(e=d,f=e,d=4),"string"!=typeof e&&(f=e,e="#000"),e=e||"#000",null==d&&(d=4),null==f&&(f=1),null==b&&(b=0,c=2),null==c&&(c=b),e=a.color(e),a.format('',{color:e,dx:b,dy:c,blur:d,opacity:f})},a.filter.shadow.toString=function(){return this()},a.filter.grayscale=function(b){return null==b&&(b=1),a.format('',{a:.2126+.7874*(1-b),b:.7152-.7152*(1-b),c:.0722-.0722*(1-b),d:.2126-.2126*(1-b),e:.7152+.2848*(1-b),f:.0722-.0722*(1-b),g:.2126-.2126*(1-b),h:.0722+.9278*(1-b)})},a.filter.grayscale.toString=function(){return this()},a.filter.sepia=function(b){return null==b&&(b=1),a.format('',{a:.393+.607*(1-b),b:.769-.769*(1-b),c:.189-.189*(1-b),d:.349-.349*(1-b),e:.686+.314*(1-b),f:.168-.168*(1-b),g:.272-.272*(1-b),h:.534-.534*(1-b),i:.131+.869*(1-b)})},a.filter.sepia.toString=function(){return this()},a.filter.saturate=function(b){return null==b&&(b=1),a.format('',{amount:1-b})},a.filter.saturate.toString=function(){return this()},a.filter.hueRotate=function(b){return b=b||0,a.format('',{angle:b})},a.filter.hueRotate.toString=function(){return this()},a.filter.invert=function(b){return null==b&&(b=1),a.format('',{amount:b,amount2:1-b})},a.filter.invert.toString=function(){return this()},a.filter.brightness=function(b){return null==b&&(b=1),a.format('',{amount:b})},a.filter.brightness.toString=function(){return this()},a.filter.contrast=function(b){return null==b&&(b=1),a.format('',{amount:b,amount2:.5-b/2})},a.filter.contrast.toString=function(){return this()}}),d.plugin(function(a,b){var c=a._.box,d=a.is,e=/^[^a-z]*([tbmlrc])/i,f=function(){return"T"+this.dx+","+this.dy};b.prototype.getAlign=function(a,b){null==b&&d(a,"string")&&(b=a,a=null),a=a||this.paper;var g=a.getBBox?a.getBBox():c(a),h=this.getBBox(),i={};switch(b=b&&b.match(e),b=b?b[1].toLowerCase():"c"){case"t":i.dx=0,i.dy=g.y-h.y;break;case"b":i.dx=0,i.dy=g.y2-h.y2;break;case"m":i.dx=0,i.dy=g.cy-h.cy;break;case"l":i.dx=g.x-h.x,i.dy=0;break;case"r":i.dx=g.x2-h.x2,i.dy=0;break;default:i.dx=g.cx-h.cx,i.dy=0}return i.toString=f,i},b.prototype.align=function(a,b){return this.transform("..."+this.getAlign(a,b))}}),d}); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js new file mode 100644 index 0000000..5475170 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dist/snap.svg.js @@ -0,0 +1,8170 @@ +// Snap.svg 0.4.1 +// +// Copyright (c) 2013 – 2015 Adobe Systems Incorporated. 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. +// +// build: 2015-04-13 + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +// ┌────────────────────────────────────────────────────────────┠\\ +// │ Eve 0.4.2 - JavaScript Events Library │ \\ +// ├────────────────────────────────────────────────────────────┤ \\ +// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\ +// └────────────────────────────────────────────────────────────┘ \\ + +(function (glob) { + var version = "0.4.2", + has = "hasOwnProperty", + separator = /[\.\/]/, + comaseparator = /\s*,\s*/, + wildcard = "*", + fun = function () {}, + numsort = function (a, b) { + return a - b; + }, + current_event, + stop, + events = {n: {}}, + firstDefined = function () { + for (var i = 0, ii = this.length; i < ii; i++) { + if (typeof this[i] != "undefined") { + return this[i]; + } + } + }, + lastDefined = function () { + var i = this.length; + while (--i) { + if (typeof this[i] != "undefined") { + return this[i]; + } + } + }, + /*\ + * eve + [ method ] + + * Fires event with given `name`, given scope and other parameters. + + > Arguments + + - name (string) name of the *event*, dot (`.`) or slash (`/`) separated + - scope (object) context for the event handlers + - varargs (...) the rest of arguments will be sent to event handlers + + = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value. + \*/ + eve = function (name, scope) { + name = String(name); + var e = events, + oldstop = stop, + args = Array.prototype.slice.call(arguments, 2), + listeners = eve.listeners(name), + z = 0, + f = false, + l, + indexed = [], + queue = {}, + out = [], + ce = current_event, + errors = []; + out.firstDefined = firstDefined; + out.lastDefined = lastDefined; + current_event = name; + stop = 0; + for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) { + indexed.push(listeners[i].zIndex); + if (listeners[i].zIndex < 0) { + queue[listeners[i].zIndex] = listeners[i]; + } + } + indexed.sort(numsort); + while (indexed[z] < 0) { + l = queue[indexed[z++]]; + out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + } + for (i = 0; i < ii; i++) { + l = listeners[i]; + if ("zIndex" in l) { + if (l.zIndex == indexed[z]) { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + do { + z++; + l = queue[indexed[z]]; + l && out.push(l.apply(scope, args)); + if (stop) { + break; + } + } while (l) + } else { + queue[l.zIndex] = l; + } + } else { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + } + } + stop = oldstop; + current_event = ce; + return out; + }; + // Undocumented. Debug only. + eve._events = events; + /*\ + * eve.listeners + [ method ] + + * Internal method which gives you array of all event handlers that will be triggered by the given `name`. + + > Arguments + + - name (string) name of the event, dot (`.`) or slash (`/`) separated + + = (array) array of event handlers + \*/ + eve.listeners = function (name) { + var names = name.split(separator), + e = events, + item, + items, + k, + i, + ii, + j, + jj, + nes, + es = [e], + out = []; + for (i = 0, ii = names.length; i < ii; i++) { + nes = []; + for (j = 0, jj = es.length; j < jj; j++) { + e = es[j].n; + items = [e[names[i]], e[wildcard]]; + k = 2; + while (k--) { + item = items[k]; + if (item) { + nes.push(item); + out = out.concat(item.f || []); + } + } + } + es = nes; + } + return out; + }; + + /*\ + * eve.on + [ method ] + ** + * Binds given event handler with a given name. You can use wildcards “`*`†for the names: + | eve.on("*.under.*", f); + | eve("mouse.under.floor"); // triggers f + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. + > Example: + | eve.on("mouse", eatIt)(2); + | eve.on("mouse", scream); + | eve.on("mouse", catchIt)(1); + * This will ensure that `catchIt` function will be called before `eatIt`. + * + * If you want to put your handler before non-indexed handlers, specify a negative value. + * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in caseâ€. + \*/ + eve.on = function (name, f) { + name = String(name); + if (typeof f != "function") { + return function () {}; + } + var names = name.split(comaseparator); + for (var i = 0, ii = names.length; i < ii; i++) { + (function (name) { + var names = name.split(separator), + e = events, + exist; + for (var i = 0, ii = names.length; i < ii; i++) { + e = e.n; + e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}}); + } + e.f = e.f || []; + for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) { + exist = true; + break; + } + !exist && e.f.push(f); + }(names[i])); + } + return function (zIndex) { + if (+zIndex == +zIndex) { + f.zIndex = +zIndex; + } + }; + }; + /*\ + * eve.f + [ method ] + ** + * Returns function that will fire given event with optional arguments. + * Arguments that will be passed to the result function will be also + * concated to the list of final arguments. + | el.onclick = eve.f("click", 1, 2); + | eve.on("click", function (a, b, c) { + | console.log(a, b, c); // 1, 2, [event object] + | }); + > Arguments + - event (string) event name + - varargs (…) and any other arguments + = (function) possible event handler function + \*/ + eve.f = function (event) { + var attrs = [].slice.call(arguments, 1); + return function () { + eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0))); + }; + }; + /*\ + * eve.stop + [ method ] + ** + * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing. + \*/ + eve.stop = function () { + stop = 1; + }; + /*\ + * eve.nt + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + > Arguments + ** + - subname (string) #optional subname of the event + ** + = (string) name of the event, if `subname` is not specified + * or + = (boolean) `true`, if current event’s name contains `subname` + \*/ + eve.nt = function (subname) { + if (subname) { + return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event); + } + return current_event; + }; + /*\ + * eve.nts + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + ** + = (array) names of the event + \*/ + eve.nts = function () { + return current_event.split(separator); + }; + /*\ + * eve.off + [ method ] + ** + * Removes given function from the list of event listeners assigned to given name. + * If no arguments specified all the events will be cleared. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + \*/ + /*\ + * eve.unbind + [ method ] + ** + * See @eve.off + \*/ + eve.off = eve.unbind = function (name, f) { + if (!name) { + eve._events = events = {n: {}}; + return; + } + var names = name.split(comaseparator); + if (names.length > 1) { + for (var i = 0, ii = names.length; i < ii; i++) { + eve.off(names[i], f); + } + return; + } + names = name.split(separator); + var e, + key, + splice, + i, ii, j, jj, + cur = [events]; + for (i = 0, ii = names.length; i < ii; i++) { + for (j = 0; j < cur.length; j += splice.length - 2) { + splice = [j, 1]; + e = cur[j].n; + if (names[i] != wildcard) { + if (e[names[i]]) { + splice.push(e[names[i]]); + } + } else { + for (key in e) if (e[has](key)) { + splice.push(e[key]); + } + } + cur.splice.apply(cur, splice); + } + } + for (i = 0, ii = cur.length; i < ii; i++) { + e = cur[i]; + while (e.n) { + if (f) { + if (e.f) { + for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) { + e.f.splice(j, 1); + break; + } + !e.f.length && delete e.f; + } + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + var funcs = e.n[key].f; + for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) { + funcs.splice(j, 1); + break; + } + !funcs.length && delete e.n[key].f; + } + } else { + delete e.f; + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + delete e.n[key].f; + } + } + e = e.n; + } + } + }; + /*\ + * eve.once + [ method ] + ** + * Binds given event handler with a given name to only run once then unbind itself. + | eve.once("login", f); + | eve("login"); // triggers f + | eve("login"); // no listeners + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) same return function as @eve.on + \*/ + eve.once = function (name, f) { + var f2 = function () { + eve.unbind(name, f2); + return f.apply(this, arguments); + }; + return eve.on(name, f2); + }; + /*\ + * eve.version + [ property (string) ] + ** + * Current version of the library. + \*/ + eve.version = version; + eve.toString = function () { + return "You are running Eve " + version; + }; + (typeof module != "undefined" && module.exports) ? (module.exports = eve) : (typeof define === "function" && define.amd ? (define("eve", [], function() { return eve; })) : (glob.eve = eve)); +})(this); + +(function (glob, factory) { + // AMD support + if (typeof define == "function" && define.amd) { + // Define as an anonymous module + define(["eve"], function (eve) { + return factory(glob, eve); + }); + } else if (typeof exports != 'undefined') { + // Next for Node.js or CommonJS + var eve = require('eve'); + module.exports = factory(glob, eve); + } else { + // Browser globals (glob is window) + // Snap adds itself to window + factory(glob, glob.eve); + } +}(window || this, function (window, eve) { + +// Copyright (c) 2013 Adobe Systems Incorporated. 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 mina = (function (eve) { + var animations = {}, + requestAnimFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + setTimeout(callback, 16); + }, + isArray = Array.isArray || function (a) { + return a instanceof Array || + Object.prototype.toString.call(a) == "[object Array]"; + }, + idgen = 0, + idprefix = "M" + (+new Date).toString(36), + ID = function () { + return idprefix + (idgen++).toString(36); + }, + diff = function (a, b, A, B) { + if (isArray(a)) { + res = []; + for (var i = 0, ii = a.length; i < ii; i++) { + res[i] = diff(a[i], b, A[i], B); + } + return res; + } + var dif = (A - a) / (B - b); + return function (bb) { + return a + dif * (bb - b); + }; + }, + timer = Date.now || function () { + return +new Date; + }, + sta = function (val) { + var a = this; + if (val == null) { + return a.s; + } + var ds = a.s - val; + a.b += a.dur * ds; + a.B += a.dur * ds; + a.s = val; + }, + speed = function (val) { + var a = this; + if (val == null) { + return a.spd; + } + a.spd = val; + }, + duration = function (val) { + var a = this; + if (val == null) { + return a.dur; + } + a.s = a.s * val / a.dur; + a.dur = val; + }, + stopit = function () { + var a = this; + delete animations[a.id]; + a.update(); + eve("mina.stop." + a.id, a); + }, + pause = function () { + var a = this; + if (a.pdif) { + return; + } + delete animations[a.id]; + a.update(); + a.pdif = a.get() - a.b; + }, + resume = function () { + var a = this; + if (!a.pdif) { + return; + } + a.b = a.get() - a.pdif; + delete a.pdif; + animations[a.id] = a; + }, + update = function () { + var a = this, + res; + if (isArray(a.start)) { + res = []; + for (var j = 0, jj = a.start.length; j < jj; j++) { + res[j] = +a.start[j] + + (a.end[j] - a.start[j]) * a.easing(a.s); + } + } else { + res = +a.start + (a.end - a.start) * a.easing(a.s); + } + a.set(res); + }, + frame = function () { + var len = 0; + for (var i in animations) if (animations.hasOwnProperty(i)) { + var a = animations[i], + b = a.get(), + res; + len++; + a.s = (b - a.b) / (a.dur / a.spd); + if (a.s >= 1) { + delete animations[i]; + a.s = 1; + len--; + (function (a) { + setTimeout(function () { + eve("mina.finish." + a.id, a); + }); + }(a)); + } + a.update(); + } + len && requestAnimFrame(frame); + }, + /*\ + * mina + [ method ] + ** + * Generic animation of numbers + ** + - a (number) start _slave_ number + - A (number) end _slave_ number + - b (number) start _master_ number (start time in general case) + - B (number) end _master_ number (end time in gereal case) + - get (function) getter of _master_ number (see @mina.time) + - set (function) setter of _slave_ number + - easing (function) #optional easing function, default is @mina.linear + = (object) animation descriptor + o { + o id (string) animation id, + o start (number) start _slave_ number, + o end (number) end _slave_ number, + o b (number) start _master_ number, + o s (number) animation status (0..1), + o dur (number) animation duration, + o spd (number) animation speed, + o get (function) getter of _master_ number (see @mina.time), + o set (function) setter of _slave_ number, + o easing (function) easing function, default is @mina.linear, + o status (function) status getter/setter, + o speed (function) speed getter/setter, + o duration (function) duration getter/setter, + o stop (function) animation stopper + o pause (function) pauses the animation + o resume (function) resumes the animation + o update (function) calles setter with the right value of the animation + o } + \*/ + mina = function (a, A, b, B, get, set, easing) { + var anim = { + id: ID(), + start: a, + end: A, + b: b, + s: 0, + dur: B - b, + spd: 1, + get: get, + set: set, + easing: easing || mina.linear, + status: sta, + speed: speed, + duration: duration, + stop: stopit, + pause: pause, + resume: resume, + update: update + }; + animations[anim.id] = anim; + var len = 0, i; + for (i in animations) if (animations.hasOwnProperty(i)) { + len++; + if (len == 2) { + break; + } + } + len == 1 && requestAnimFrame(frame); + return anim; + }; + /*\ + * mina.time + [ method ] + ** + * Returns the current time. Equivalent to: + | function () { + | return (new Date).getTime(); + | } + \*/ + mina.time = timer; + /*\ + * mina.getById + [ method ] + ** + * Returns an animation by its id + - id (string) animation's id + = (object) See @mina + \*/ + mina.getById = function (id) { + return animations[id] || null; + }; + + /*\ + * mina.linear + [ method ] + ** + * Default linear easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.linear = function (n) { + return n; + }; + /*\ + * mina.easeout + [ method ] + ** + * Easeout easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.easeout = function (n) { + return Math.pow(n, 1.7); + }; + /*\ + * mina.easein + [ method ] + ** + * Easein easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.easein = function (n) { + return Math.pow(n, .48); + }; + /*\ + * mina.easeinout + [ method ] + ** + * Easeinout easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.easeinout = function (n) { + if (n == 1) { + return 1; + } + if (n == 0) { + return 0; + } + var q = .48 - n / 1.04, + Q = Math.sqrt(.1734 + q * q), + x = Q - q, + X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1), + y = -Q - q, + Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1), + t = X + Y + .5; + return (1 - t) * 3 * t * t + t * t * t; + }; + /*\ + * mina.backin + [ method ] + ** + * Backin easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.backin = function (n) { + if (n == 1) { + return 1; + } + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }; + /*\ + * mina.backout + [ method ] + ** + * Backout easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.backout = function (n) { + if (n == 0) { + return 0; + } + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }; + /*\ + * mina.elastic + [ method ] + ** + * Elastic easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.elastic = function (n) { + if (n == !!n) { + return n; + } + return Math.pow(2, -10 * n) * Math.sin((n - .075) * + (2 * Math.PI) / .3) + 1; + }; + /*\ + * mina.bounce + [ method ] + ** + * Bounce easing + - n (number) input 0..1 + = (number) output 0..1 + \*/ + mina.bounce = function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + }; + window.mina = mina; + return mina; +})(typeof eve == "undefined" ? function () {} : eve); +// Copyright (c) 2013 - 2015 Adobe Systems Incorporated. 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 Snap = (function(root) { +Snap.version = "0.4.0"; +/*\ + * Snap + [ method ] + ** + * Creates a drawing surface or wraps existing SVG element. + ** + - width (number|string) width of surface + - height (number|string) height of surface + * or + - DOM (SVGElement) element to be wrapped into Snap structure + * or + - array (array) array of elements (will return set of elements) + * or + - query (string) CSS query selector + = (object) @Element +\*/ +function Snap(w, h) { + if (w) { + if (w.nodeType) { + return wrap(w); + } + if (is(w, "array") && Snap.set) { + return Snap.set.apply(Snap, w); + } + if (w instanceof Element) { + return w; + } + if (h == null) { + w = glob.doc.querySelector(String(w)); + return wrap(w); + } + } + w = w == null ? "100%" : w; + h = h == null ? "100%" : h; + return new Paper(w, h); +} +Snap.toString = function () { + return "Snap v" + this.version; +}; +Snap._ = {}; +var glob = { + win: root.window, + doc: root.window.document +}; +Snap._.glob = glob; +var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + toInt = parseInt, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + round = math.round, + E = "", + S = " ", + objectToString = Object.prototype.toString, + ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?%?)\s*\))\s*$/i, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + reURLValue = /^url\(#?([^)]+)\)$/, + separator = Snap._.separator = /[,\s]+/, + whitespace = /[\s]/g, + commaSpaces = /[\s]*,[\s]*/, + hsrg = {hs: 1, rg: 1}, + pathCommand = /([a-z])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/ig, + tCommand = /([rstm])[\s,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\s]*,?[\s]*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[\-+]?\\d+)?)[\s]*,?[\s]*/ig, + idgen = 0, + idprefix = "S" + (+new Date).toString(36), + ID = function (el) { + return (el && el.type ? el.type : E) + idprefix + (idgen++).toString(36); + }, + xlink = "http://www.w3.org/1999/xlink", + xmlns = "http://www.w3.org/2000/svg", + hub = {}, + URL = Snap.url = function (url) { + return "url('#" + url + "')"; + }; + +function $(el, attr) { + if (attr) { + if (el == "#text") { + el = glob.doc.createTextNode(attr.text || attr["#text"] || ""); + } + if (el == "#comment") { + el = glob.doc.createComment(attr.text || attr["#text"] || ""); + } + if (typeof el == "string") { + el = $(el); + } + if (typeof attr == "string") { + if (el.nodeType == 1) { + if (attr.substring(0, 6) == "xlink:") { + return el.getAttributeNS(xlink, attr.substring(6)); + } + if (attr.substring(0, 4) == "xml:") { + return el.getAttributeNS(xmlns, attr.substring(4)); + } + return el.getAttribute(attr); + } else if (attr == "text") { + return el.nodeValue; + } else { + return null; + } + } + if (el.nodeType == 1) { + for (var key in attr) if (attr[has](key)) { + var val = Str(attr[key]); + if (val) { + if (key.substring(0, 6) == "xlink:") { + el.setAttributeNS(xlink, key.substring(6), val); + } else if (key.substring(0, 4) == "xml:") { + el.setAttributeNS(xmlns, key.substring(4), val); + } else { + el.setAttribute(key, val); + } + } else { + el.removeAttribute(key); + } + } + } else if ("text" in attr) { + el.nodeValue = attr.text; + } + } else { + el = glob.doc.createElementNS(xmlns, el); + } + return el; +} +Snap._.$ = $; +Snap._.id = ID; +function getAttrs(el) { + var attrs = el.attributes, + name, + out = {}; + for (var i = 0; i < attrs.length; i++) { + if (attrs[i].namespaceURI == xlink) { + name = "xlink:"; + } else { + name = ""; + } + name += attrs[i].name; + out[name] = attrs[i].textContent; + } + return out; +} +function is(o, type) { + type = Str.prototype.toLowerCase.call(type); + if (type == "finite") { + return isFinite(o); + } + if (type == "array" && + (o instanceof Array || Array.isArray && Array.isArray(o))) { + return true; + } + return (type == "null" && o === null) || + (type == typeof o && o !== null) || + (type == "object" && o === Object(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; +} +/*\ + * Snap.format + [ method ] + ** + * Replaces construction of type `{}` to the corresponding argument + ** + - token (string) string to format + - json (object) object which properties are used as a replacement + = (string) formatted string + > Usage + | // this draws a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Snap.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", { + | x: 10, + | y: 20, + | dim: { + | width: 40, + | height: 50, + | "negative width": -40 + | } + | })); +\*/ +Snap.format = (function () { + var tokenRegex = /\{([^\}]+)\}/g, + objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties + replacer = function (all, key, obj) { + var res = obj; + key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) { + name = name || quotedName; + if (res) { + if (name in res) { + res = res[name]; + } + typeof res == "function" && isFunc && (res = res()); + } + }); + res = (res == null || res == obj ? all : res) + ""; + return res; + }; + return function (str, obj) { + return Str(str).replace(tokenRegex, function (all, key) { + return replacer(all, key, obj); + }); + }; +})(); +function clone(obj) { + if (typeof obj == "function" || Object(obj) !== obj) { + return obj; + } + var res = new obj.constructor; + for (var key in obj) if (obj[has](key)) { + res[key] = clone(obj[key]); + } + return res; +} +Snap._.clone = clone; +function repush(array, item) { + for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) { + return array.push(array.splice(i, 1)[0]); + } +} +function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array.prototype.slice.call(arguments, 0), + args = arg.join("\u2400"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + repush(count, args); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count.length >= 1e3 && delete cache[count.shift()]; + count.push(args); + cache[args] = f.apply(scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; +} +Snap._.cacher = cacher; +function angle(x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360; + } else { + return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3); + } +} +function rad(deg) { + return deg % 360 * PI / 180; +} +function deg(rad) { + return rad * 180 / PI % 360; +} +function x_y() { + return this.x + S + this.y; +} +function x_y_w_h() { + return this.x + S + this.y + S + this.width + " \xd7 " + this.height; +} + +/*\ + * Snap.rad + [ method ] + ** + * Transform angle to radians + - deg (number) angle in degrees + = (number) angle in radians +\*/ +Snap.rad = rad; +/*\ + * Snap.deg + [ method ] + ** + * Transform angle to degrees + - rad (number) angle in radians + = (number) angle in degrees +\*/ +Snap.deg = deg; +/*\ + * Snap.sin + [ method ] + ** + * Equivalent to `Math.sin()` only works with degrees, not radians. + - angle (number) angle in degrees + = (number) sin +\*/ +Snap.sin = function (angle) { + return math.sin(Snap.rad(angle)); +}; +/*\ + * Snap.tan + [ method ] + ** + * Equivalent to `Math.tan()` only works with degrees, not radians. + - angle (number) angle in degrees + = (number) tan +\*/ +Snap.tan = function (angle) { + return math.tan(Snap.rad(angle)); +}; +/*\ + * Snap.cos + [ method ] + ** + * Equivalent to `Math.cos()` only works with degrees, not radians. + - angle (number) angle in degrees + = (number) cos +\*/ +Snap.cos = function (angle) { + return math.cos(Snap.rad(angle)); +}; +/*\ + * Snap.asin + [ method ] + ** + * Equivalent to `Math.asin()` only works with degrees, not radians. + - num (number) value + = (number) asin in degrees +\*/ +Snap.asin = function (num) { + return Snap.deg(math.asin(num)); +}; +/*\ + * Snap.acos + [ method ] + ** + * Equivalent to `Math.acos()` only works with degrees, not radians. + - num (number) value + = (number) acos in degrees +\*/ +Snap.acos = function (num) { + return Snap.deg(math.acos(num)); +}; +/*\ + * Snap.atan + [ method ] + ** + * Equivalent to `Math.atan()` only works with degrees, not radians. + - num (number) value + = (number) atan in degrees +\*/ +Snap.atan = function (num) { + return Snap.deg(math.atan(num)); +}; +/*\ + * Snap.atan2 + [ method ] + ** + * Equivalent to `Math.atan2()` only works with degrees, not radians. + - num (number) value + = (number) atan2 in degrees +\*/ +Snap.atan2 = function (num) { + return Snap.deg(math.atan2(num)); +}; +/*\ + * Snap.angle + [ method ] + ** + * Returns an angle between two or three points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + - x3 (number) #optional x coord of third point + - y3 (number) #optional y coord of third point + = (number) angle in degrees +\*/ +Snap.angle = angle; +/*\ + * Snap.len + [ method ] + ** + * Returns distance between two points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + = (number) distance +\*/ +Snap.len = function (x1, y1, x2, y2) { + return Math.sqrt(Snap.len2(x1, y1, x2, y2)); +}; +/*\ + * Snap.len2 + [ method ] + ** + * Returns squared distance between two points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + = (number) distance +\*/ +Snap.len2 = function (x1, y1, x2, y2) { + return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); +}; +/*\ + * Snap.closestPoint + [ method ] + ** + * Returns closest point to a given one on a given path. + > Parameters + - path (Element) path element + - x (number) x coord of a point + - y (number) y coord of a point + = (object) in format + { + x (number) x coord of the point on the path + y (number) y coord of the point on the path + length (number) length of the path to the point + distance (number) distance from the given point to the path + } +\*/ +// Copied from http://bl.ocks.org/mbostock/8027637 +Snap.closestPoint = function (path, x, y) { + function distance2(p) { + var dx = p.x - x, + dy = p.y - y; + return dx * dx + dy * dy; + } + var pathNode = path.node, + pathLength = pathNode.getTotalLength(), + precision = pathLength / pathNode.pathSegList.numberOfItems * .125, + best, + bestLength, + bestDistance = Infinity; + + // linear scan for coarse approximation + for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) { + if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) { + best = scan, bestLength = scanLength, bestDistance = scanDistance; + } + } + + // binary search for precise estimate + precision *= .5; + while (precision > .5) { + var before, + after, + beforeLength, + afterLength, + beforeDistance, + afterDistance; + if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) { + best = before, bestLength = beforeLength, bestDistance = beforeDistance; + } else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) { + best = after, bestLength = afterLength, bestDistance = afterDistance; + } else { + precision *= .5; + } + } + + best = { + x: best.x, + y: best.y, + length: bestLength, + distance: Math.sqrt(bestDistance) + }; + return best; +} +/*\ + * Snap.is + [ method ] + ** + * Handy replacement for the `typeof` operator + - o (…) any object or primitive + - type (string) name of the type, e.g., `string`, `function`, `number`, etc. + = (boolean) `true` if given value is of given type +\*/ +Snap.is = is; +/*\ + * Snap.snapTo + [ method ] + ** + * Snaps given value to given grid + - values (array|number) given array of values or step of the grid + - value (number) value to adjust + - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`. + = (number) adjusted value +\*/ +Snap.snapTo = function (values, value, tolerance) { + tolerance = is(tolerance, "finite") ? tolerance : 10; + if (is(values, "array")) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; +}; +// Colour +/*\ + * Snap.getRGB + [ method ] + ** + * Parses color string as RGB object + - color (string) color string in one of the following formats: + #
      + #
    • Color name (red, green, cornflowerblue, etc)
    • + #
    • #••• — shortened HTML color: (#000, #fc0, etc.)
    • + #
    • #•••••• — full length HTML color: (#000000, #bd2300)
    • + #
    • rgb(•••, •••, •••) — red, green and blue channels values: (rgb(200, 100, 0))
    • + #
    • rgba(•••, •••, •••, •••) — also with opacity
    • + #
    • rgb(•••%, •••%, •••%) — same as above, but in %: (rgb(100%, 175%, 0%))
    • + #
    • rgba(•••%, •••%, •••%, •••%) — also with opacity
    • + #
    • hsb(•••, •••, •••) — hue, saturation and brightness values: (hsb(0.5, 0.25, 1))
    • + #
    • hsba(•••, •••, •••, •••) — also with opacity
    • + #
    • hsb(•••%, •••%, •••%) — same as above, but in %
    • + #
    • hsba(•••%, •••%, •••%, •••%) — also with opacity
    • + #
    • hsl(•••, •••, •••) — hue, saturation and luminosity values: (hsb(0.5, 0.25, 0.5))
    • + #
    • hsla(•••, •••, •••, •••) — also with opacity
    • + #
    • hsl(•••%, •••%, •••%) — same as above, but in %
    • + #
    • hsla(•••%, •••%, •••%, •••%) — also with opacity
    • + #
    + * Note that `%` can be used any time: `rgb(20%, 255, 50%)`. + = (object) RGB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) true if string can't be parsed + o } +\*/ +Snap.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: rgbtoString}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none", toString: rgbtoString}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + if (!colour) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: rgbtoString}; + } + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4].split(commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5].split(commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red /= 100); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green /= 100); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue /= 100); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return Snap.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6].split(commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red /= 100); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green /= 100); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue /= 100); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return Snap.hsl2rgb(red, green, blue, opacity); + } + red = mmin(math.round(red), 255); + green = mmin(math.round(green), 255); + blue = mmin(math.round(blue), 255); + opacity = mmin(mmax(opacity, 0), 1); + rgb = {r: red, g: green, b: blue, toString: rgbtoString}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + rgb.opacity = is(opacity, "finite") ? opacity : 1; + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: rgbtoString}; +}, Snap); +/*\ + * Snap.hsb + [ method ] + ** + * Converts HSB values to a hex representation of the color + - h (number) hue + - s (number) saturation + - b (number) value or brightness + = (string) hex representation of the color +\*/ +Snap.hsb = cacher(function (h, s, b) { + return Snap.hsb2rgb(h, s, b).hex; +}); +/*\ + * Snap.hsl + [ method ] + ** + * Converts HSL values to a hex representation of the color + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (string) hex representation of the color +\*/ +Snap.hsl = cacher(function (h, s, l) { + return Snap.hsl2rgb(h, s, l).hex; +}); +/*\ + * Snap.rgb + [ method ] + ** + * Converts RGB values to a hex representation of the color + - r (number) red + - g (number) green + - b (number) blue + = (string) hex representation of the color +\*/ +Snap.rgb = cacher(function (r, g, b, o) { + if (is(o, "finite")) { + var round = math.round; + return "rgba(" + [round(r), round(g), round(b), +o.toFixed(2)] + ")"; + } + return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1); +}); +var toHex = function (color) { + var i = glob.doc.getElementsByTagName("head")[0] || glob.doc.getElementsByTagName("svg")[0], + red = "rgb(255, 0, 0)"; + toHex = cacher(function (color) { + if (color.toLowerCase() == "red") { + return red; + } + i.style.color = red; + i.style.color = color; + var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + return out == red ? null : out; + }); + return toHex(color); +}, +hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; +}, +hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; +}, +rgbtoString = function () { + return this.opacity == 1 || this.opacity == null ? + this.hex : + "rgba(" + [this.r, this.g, this.b, this.opacity] + ")"; +}, +prepareRGB = function (r, g, b) { + if (g == null && is(r, "object") && "r" in r && "g" in r && "b" in r) { + b = r.b; + g = r.g; + r = r.r; + } + if (g == null && is(r, string)) { + var clr = Snap.getRGB(r); + r = clr.r; + g = clr.g; + b = clr.b; + } + if (r > 1 || g > 1 || b > 1) { + r /= 255; + g /= 255; + b /= 255; + } + + return [r, g, b]; +}, +packageRGB = function (r, g, b, o) { + r = math.round(r * 255); + g = math.round(g * 255); + b = math.round(b * 255); + var rgb = { + r: r, + g: g, + b: b, + opacity: is(o, "finite") ? o : 1, + hex: Snap.rgb(r, g, b), + toString: rgbtoString + }; + is(o, "finite") && (rgb.opacity = o); + return rgb; +}; +/*\ + * Snap.color + [ method ] + ** + * Parses the color string and returns an object featuring the color's component values + - clr (string) color string in one of the supported formats (see @Snap.getRGB) + = (object) Combined RGB/HSB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) `true` if string can't be parsed, + o h (number) hue, + o s (number) saturation, + o v (number) value (brightness), + o l (number) lightness + o } +\*/ +Snap.color = function (clr) { + var rgb; + if (is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) { + rgb = Snap.hsb2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.opacity = 1; + clr.hex = rgb.hex; + } else if (is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) { + rgb = Snap.hsl2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.opacity = 1; + clr.hex = rgb.hex; + } else { + if (is(clr, "string")) { + clr = Snap.getRGB(clr); + } + if (is(clr, "object") && "r" in clr && "g" in clr && "b" in clr && !("error" in clr)) { + rgb = Snap.rgb2hsl(clr); + clr.h = rgb.h; + clr.s = rgb.s; + clr.l = rgb.l; + rgb = Snap.rgb2hsb(clr); + clr.v = rgb.b; + } else { + clr = {hex: "none"}; + clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1; + clr.error = 1; + } + } + clr.toString = rgbtoString; + return clr; +}; +/*\ + * Snap.hsb2rgb + [ method ] + ** + * Converts HSB values to an RGB object + - h (number) hue + - s (number) saturation + - v (number) value or brightness + = (object) RGB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } +\*/ +Snap.hsb2rgb = function (h, s, v, o) { + if (is(h, "object") && "h" in h && "s" in h && "b" in h) { + v = h.b; + s = h.s; + o = h.o; + h = h.h; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = v * s; + X = C * (1 - abs(h % 2 - 1)); + R = G = B = v - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); +}; +/*\ + * Snap.hsl2rgb + [ method ] + ** + * Converts HSL values to an RGB object + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (object) RGB object in the following format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } +\*/ +Snap.hsl2rgb = function (h, s, l, o) { + if (is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = 2 * s * (l < .5 ? l : 1 - l); + X = C * (1 - abs(h % 2 - 1)); + R = G = B = l - C / 2; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); +}; +/*\ + * Snap.rgb2hsb + [ method ] + ** + * Converts RGB values to an HSB object + - r (number) red + - g (number) green + - b (number) blue + = (object) HSB object in the following format: + o { + o h (number) hue, + o s (number) saturation, + o b (number) brightness + o } +\*/ +Snap.rgb2hsb = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, V, C; + V = mmax(r, g, b); + C = V - mmin(r, g, b); + H = (C == 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C == 0 ? 0 : C / V; + return {h: H, s: S, b: V, toString: hsbtoString}; +}; +/*\ + * Snap.rgb2hsl + [ method ] + ** + * Converts RGB values to an HSL object + - r (number) red + - g (number) green + - b (number) blue + = (object) HSL object in the following format: + o { + o h (number) hue, + o s (number) saturation, + o l (number) luminosity + o } +\*/ +Snap.rgb2hsl = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, L, M, m, C; + M = mmax(r, g, b); + m = mmin(r, g, b); + C = M - m; + H = (C == 0 ? null : + M == r ? (g - b) / C : + M == g ? (b - r) / C + 2 : + (r - g) / C + 4); + H = ((H + 360) % 6) * 60 / 360; + L = (M + m) / 2; + S = (C == 0 ? 0 : + L < .5 ? C / (2 * L) : + C / (2 - 2 * L)); + return {h: H, s: S, l: L, toString: hsltoString}; +}; + +// Transformations +/*\ + * Snap.parsePathString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of arrays of path segments + - pathString (string|array) path string or array of segments (in the last case it is returned straight away) + = (array) array of segments +\*/ +Snap.parsePathString = function (pathString) { + if (!pathString) { + return null; + } + var pth = Snap.path(pathString); + if (pth.arr) { + return Snap.path.clone(pth.arr); + } + + var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0}, + data = []; + if (is(pathString, "array") && is(pathString[0], "array")) { // rough assumption + data = Snap.path.clone(pathString); + } + if (!data.length) { + Str(pathString).replace(pathCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + if (name == "m" && params.length > 2) { + data.push([b].concat(params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + if (name == "o" && params.length == 1) { + data.push([b, params[0]]); + } + if (name == "r") { + data.push([b].concat(params)); + } else while (params.length >= paramCounts[name]) { + data.push([b].concat(params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data.toString = Snap.path.toString; + pth.arr = Snap.path.clone(data); + return data; +}; +/*\ + * Snap.parseTransformString + [ method ] + ** + * Utility method + ** + * Parses given transform string into an array of transformations + - TString (string|array) transform string or array of transformations (in the last case it is returned straight away) + = (array) array of transformations +\*/ +var parseTransformString = Snap.parseTransformString = function (TString) { + if (!TString) { + return null; + } + var paramCounts = {r: 3, s: 4, t: 2, m: 6}, + data = []; + if (is(TString, "array") && is(TString[0], "array")) { // rough assumption + data = Snap.path.clone(TString); + } + if (!data.length) { + Str(TString).replace(tCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + data.push([b].concat(params)); + }); + } + data.toString = Snap.path.toString; + return data; +}; +function svgTransform2string(tstr) { + var res = []; + tstr = tstr.replace(/(?:^|\s)(\w+)\(([^)]+)\)/g, function (all, name, params) { + params = params.split(/\s*,\s*|\s+/); + if (name == "rotate" && params.length == 1) { + params.push(0, 0); + } + if (name == "scale") { + if (params.length > 2) { + params = params.slice(0, 2); + } else if (params.length == 2) { + params.push(0, 0); + } + if (params.length == 1) { + params.push(params[0], 0, 0); + } + } + if (name == "skewX") { + res.push(["m", 1, 0, math.tan(rad(params[0])), 1, 0, 0]); + } else if (name == "skewY") { + res.push(["m", 1, math.tan(rad(params[0])), 0, 1, 0, 0]); + } else { + res.push([name.charAt(0)].concat(params)); + } + return all; + }); + return res; +} +Snap._.svgTransform2string = svgTransform2string; +Snap._.rgTransform = /^[a-z][\s]*-?\.?\d/i; +function transform2matrix(tstr, bbox) { + var tdata = parseTransformString(tstr), + m = new Snap.Matrix; + if (tdata) { + for (var i = 0, ii = tdata.length; i < ii; i++) { + var t = tdata[i], + tlen = t.length, + command = Str(t[0]).toLowerCase(), + absolute = t[0] != command, + inver = absolute ? m.invert() : 0, + x1, + y1, + x2, + y2, + bb; + if (command == "t" && tlen == 2){ + m.translate(t[1], 0); + } else if (command == "t" && tlen == 3) { + if (absolute) { + x1 = inver.x(0, 0); + y1 = inver.y(0, 0); + x2 = inver.x(t[1], t[2]); + y2 = inver.y(t[1], t[2]); + m.translate(x2 - x1, y2 - y1); + } else { + m.translate(t[1], t[2]); + } + } else if (command == "r") { + if (tlen == 2) { + bb = bb || bbox; + m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2); + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.rotate(t[1], x2, y2); + } else { + m.rotate(t[1], t[2], t[3]); + } + } + } else if (command == "s") { + if (tlen == 2 || tlen == 3) { + bb = bb || bbox; + m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2); + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.scale(t[1], t[1], x2, y2); + } else { + m.scale(t[1], t[1], t[2], t[3]); + } + } else if (tlen == 5) { + if (absolute) { + x2 = inver.x(t[3], t[4]); + y2 = inver.y(t[3], t[4]); + m.scale(t[1], t[2], x2, y2); + } else { + m.scale(t[1], t[2], t[3], t[4]); + } + } + } else if (command == "m" && tlen == 7) { + m.add(t[1], t[2], t[3], t[4], t[5], t[6]); + } + } + } + return m; +} +Snap._.transform2matrix = transform2matrix; +Snap._unit2px = unit2px; +var contains = glob.doc.contains || glob.doc.compareDocumentPosition ? + function (a, b) { + var adown = a.nodeType == 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a == bup || !!(bup && bup.nodeType == 1 && ( + adown.contains ? + adown.contains(bup) : + a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16 + )); + } : + function (a, b) { + if (b) { + while (b) { + b = b.parentNode; + if (b == a) { + return true; + } + } + } + return false; + }; +function getSomeDefs(el) { + var p = (el.node.ownerSVGElement && wrap(el.node.ownerSVGElement)) || + (el.node.parentNode && wrap(el.node.parentNode)) || + Snap.select("svg") || + Snap(0, 0), + pdefs = p.select("defs"), + defs = pdefs == null ? false : pdefs.node; + if (!defs) { + defs = make("defs", p.node).node; + } + return defs; +} +function getSomeSVG(el) { + return el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) || Snap.select("svg"); +} +Snap._.getSomeDefs = getSomeDefs; +Snap._.getSomeSVG = getSomeSVG; +function unit2px(el, name, value) { + var svg = getSomeSVG(el).node, + out = {}, + mgr = svg.querySelector(".svg---mgr"); + if (!mgr) { + mgr = $("rect"); + $(mgr, {x: -9e9, y: -9e9, width: 10, height: 10, "class": "svg---mgr", fill: "none"}); + svg.appendChild(mgr); + } + function getW(val) { + if (val == null) { + return E; + } + if (val == +val) { + return val; + } + $(mgr, {width: val}); + try { + return mgr.getBBox().width; + } catch (e) { + return 0; + } + } + function getH(val) { + if (val == null) { + return E; + } + if (val == +val) { + return val; + } + $(mgr, {height: val}); + try { + return mgr.getBBox().height; + } catch (e) { + return 0; + } + } + function set(nam, f) { + if (name == null) { + out[nam] = f(el.attr(nam) || 0); + } else if (nam == name) { + out = f(value == null ? el.attr(nam) || 0 : value); + } + } + switch (el.type) { + case "rect": + set("rx", getW); + set("ry", getH); + case "image": + set("width", getW); + set("height", getH); + case "text": + set("x", getW); + set("y", getH); + break; + case "circle": + set("cx", getW); + set("cy", getH); + set("r", getW); + break; + case "ellipse": + set("cx", getW); + set("cy", getH); + set("rx", getW); + set("ry", getH); + break; + case "line": + set("x1", getW); + set("x2", getW); + set("y1", getH); + set("y2", getH); + break; + case "marker": + set("refX", getW); + set("markerWidth", getW); + set("refY", getH); + set("markerHeight", getH); + break; + case "radialGradient": + set("fx", getW); + set("fy", getH); + break; + case "tspan": + set("dx", getW); + set("dy", getH); + break; + default: + set(name, getW); + } + svg.removeChild(mgr); + return out; +} +/*\ + * Snap.select + [ method ] + ** + * Wraps a DOM element specified by CSS selector as @Element + - query (string) CSS selector of the element + = (Element) the current element +\*/ +Snap.select = function (query) { + query = Str(query).replace(/([^\\]):/g, "$1\\:"); + return wrap(glob.doc.querySelector(query)); +}; +/*\ + * Snap.selectAll + [ method ] + ** + * Wraps DOM elements specified by CSS selector as set or array of @Element + - query (string) CSS selector of the element + = (Element) the current element +\*/ +Snap.selectAll = function (query) { + var nodelist = glob.doc.querySelectorAll(query), + set = (Snap.set || Array)(); + for (var i = 0; i < nodelist.length; i++) { + set.push(wrap(nodelist[i])); + } + return set; +}; + +function add2group(list) { + if (!is(list, "array")) { + list = Array.prototype.slice.call(arguments, 0); + } + var i = 0, + j = 0, + node = this.node; + while (this[i]) delete this[i++]; + for (i = 0; i < list.length; i++) { + if (list[i].type == "set") { + list[i].forEach(function (el) { + node.appendChild(el.node); + }); + } else { + node.appendChild(list[i].node); + } + } + var children = node.childNodes; + for (i = 0; i < children.length; i++) { + this[j++] = wrap(children[i]); + } + return this; +} +// Hub garbage collector every 10s +setInterval(function () { + for (var key in hub) if (hub[has](key)) { + var el = hub[key], + node = el.node; + if (el.type != "svg" && !node.ownerSVGElement || el.type == "svg" && (!node.parentNode || "ownerSVGElement" in node.parentNode && !node.ownerSVGElement)) { + delete hub[key]; + } + } +}, 1e4); +function Element(el) { + if (el.snap in hub) { + return hub[el.snap]; + } + var svg; + try { + svg = el.ownerSVGElement; + } catch(e) {} + /*\ + * Element.node + [ property (object) ] + ** + * Gives you a reference to the DOM object, so you can assign event handlers or just mess around. + > Usage + | // draw a circle at coordinate 10,10 with radius of 10 + | var c = paper.circle(10, 10, 10); + | c.node.onclick = function () { + | c.attr("fill", "red"); + | }; + \*/ + this.node = el; + if (svg) { + this.paper = new Paper(svg); + } + /*\ + * Element.type + [ property (string) ] + ** + * SVG tag name of the given element. + \*/ + this.type = el.tagName || el.nodeName; + var id = this.id = ID(this); + this.anims = {}; + this._ = { + transform: [] + }; + el.snap = id; + hub[id] = this; + if (this.type == "g") { + this.add = add2group; + } + if (this.type in {g: 1, mask: 1, pattern: 1, symbol: 1}) { + for (var method in Paper.prototype) if (Paper.prototype[has](method)) { + this[method] = Paper.prototype[method]; + } + } +} + /*\ + * Element.attr + [ method ] + ** + * Gets or sets given attributes of the element. + ** + - params (object) contains key-value pairs of attributes you want to set + * or + - param (string) name of the attribute + = (Element) the current element + * or + = (string) value of attribute + > Usage + | el.attr({ + | fill: "#fc0", + | stroke: "#000", + | strokeWidth: 2, // CamelCase... + | "fill-opacity": 0.5, // or dash-separated names + | width: "*=2" // prefixed values + | }); + | console.log(el.attr("fill")); // #fc0 + * Prefixed values in format `"+=10"` supported. All four operations + * (`+`, `-`, `*` and `/`) could be used. Optionally you can use units for `+` + * and `-`: `"+=2em"`. + \*/ + Element.prototype.attr = function (params, value) { + var el = this, + node = el.node; + if (!params) { + if (node.nodeType != 1) { + return { + text: node.nodeValue + }; + } + var attr = node.attributes, + out = {}; + for (var i = 0, ii = attr.length; i < ii; i++) { + out[attr[i].nodeName] = attr[i].nodeValue; + } + return out; + } + if (is(params, "string")) { + if (arguments.length > 1) { + var json = {}; + json[params] = value; + params = json; + } else { + return eve("snap.util.getattr." + params, el).firstDefined(); + } + } + for (var att in params) { + if (params[has](att)) { + eve("snap.util.attr." + att, el, params[att]); + } + } + return el; + }; +/*\ + * Snap.parse + [ method ] + ** + * Parses SVG fragment and converts it into a @Fragment + ** + - svg (string) SVG string + = (Fragment) the @Fragment +\*/ +Snap.parse = function (svg) { + var f = glob.doc.createDocumentFragment(), + full = true, + div = glob.doc.createElement("div"); + svg = Str(svg); + if (!svg.match(/^\s*<\s*svg(?:\s|>)/)) { + svg = "" + svg + ""; + full = false; + } + div.innerHTML = svg; + svg = div.getElementsByTagName("svg")[0]; + if (svg) { + if (full) { + f = svg; + } else { + while (svg.firstChild) { + f.appendChild(svg.firstChild); + } + } + } + return new Fragment(f); +}; +function Fragment(frag) { + this.node = frag; +} +/*\ + * Snap.fragment + [ method ] + ** + * Creates a DOM fragment from a given list of elements or strings + ** + - varargs (…) SVG string + = (Fragment) the @Fragment +\*/ +Snap.fragment = function () { + var args = Array.prototype.slice.call(arguments, 0), + f = glob.doc.createDocumentFragment(); + for (var i = 0, ii = args.length; i < ii; i++) { + var item = args[i]; + if (item.node && item.node.nodeType) { + f.appendChild(item.node); + } + if (item.nodeType) { + f.appendChild(item); + } + if (typeof item == "string") { + f.appendChild(Snap.parse(item).node); + } + } + return new Fragment(f); +}; + +function make(name, parent) { + var res = $(name); + parent.appendChild(res); + var el = wrap(res); + return el; +} +function Paper(w, h) { + var res, + desc, + defs, + proto = Paper.prototype; + if (w && w.tagName == "svg") { + if (w.snap in hub) { + return hub[w.snap]; + } + var doc = w.ownerDocument; + res = new Element(w); + desc = w.getElementsByTagName("desc")[0]; + defs = w.getElementsByTagName("defs")[0]; + if (!desc) { + desc = $("desc"); + desc.appendChild(doc.createTextNode("Created with Snap")); + res.node.appendChild(desc); + } + if (!defs) { + defs = $("defs"); + res.node.appendChild(defs); + } + res.defs = defs; + for (var key in proto) if (proto[has](key)) { + res[key] = proto[key]; + } + res.paper = res.root = res; + } else { + res = make("svg", glob.doc.body); + $(res.node, { + height: h, + version: 1.1, + width: w, + xmlns: xmlns + }); + } + return res; +} +function wrap(dom) { + if (!dom) { + return dom; + } + if (dom instanceof Element || dom instanceof Fragment) { + return dom; + } + if (dom.tagName && dom.tagName.toLowerCase() == "svg") { + return new Paper(dom); + } + if (dom.tagName && dom.tagName.toLowerCase() == "object" && dom.type == "image/svg+xml") { + return new Paper(dom.contentDocument.getElementsByTagName("svg")[0]); + } + return new Element(dom); +} + +Snap._.make = make; +Snap._.wrap = wrap; +/*\ + * Paper.el + [ method ] + ** + * Creates an element on paper with a given name and no attributes + ** + - name (string) tag name + - attr (object) attributes + = (Element) the current element + > Usage + | var c = paper.circle(10, 10, 10); // is the same as... + | var c = paper.el("circle").attr({ + | cx: 10, + | cy: 10, + | r: 10 + | }); + | // and the same as + | var c = paper.el("circle", { + | cx: 10, + | cy: 10, + | r: 10 + | }); +\*/ +Paper.prototype.el = function (name, attr) { + var el = make(name, this.node); + attr && el.attr(attr); + return el; +}; +/*\ + * Element.children + [ method ] + ** + * Returns array of all the children of the element. + = (array) array of Elements +\*/ +Element.prototype.children = function () { + var out = [], + ch = this.node.childNodes; + for (var i = 0, ii = ch.length; i < ii; i++) { + out[i] = Snap(ch[i]); + } + return out; +}; +function jsonFiller(root, o) { + for (var i = 0, ii = root.length; i < ii; i++) { + var item = { + type: root[i].type, + attr: root[i].attr() + }, + children = root[i].children(); + o.push(item); + if (children.length) { + jsonFiller(children, item.childNodes = []); + } + } +} +/*\ + * Element.toJSON + [ method ] + ** + * Returns object representation of the given element and all its children. + = (object) in format + o { + o type (string) this.type, + o attr (object) attributes map, + o childNodes (array) optional array of children in the same format + o } +\*/ +Element.prototype.toJSON = function () { + var out = []; + jsonFiller([this], out); + return out[0]; +}; +// default +eve.on("snap.util.getattr", function () { + var att = eve.nt(); + att = att.substring(att.lastIndexOf(".") + 1); + var css = att.replace(/[A-Z]/g, function (letter) { + return "-" + letter.toLowerCase(); + }); + if (cssAttr[has](css)) { + return this.node.ownerDocument.defaultView.getComputedStyle(this.node, null).getPropertyValue(css); + } else { + return $(this.node, att); + } +}); +var cssAttr = { + "alignment-baseline": 0, + "baseline-shift": 0, + "clip": 0, + "clip-path": 0, + "clip-rule": 0, + "color": 0, + "color-interpolation": 0, + "color-interpolation-filters": 0, + "color-profile": 0, + "color-rendering": 0, + "cursor": 0, + "direction": 0, + "display": 0, + "dominant-baseline": 0, + "enable-background": 0, + "fill": 0, + "fill-opacity": 0, + "fill-rule": 0, + "filter": 0, + "flood-color": 0, + "flood-opacity": 0, + "font": 0, + "font-family": 0, + "font-size": 0, + "font-size-adjust": 0, + "font-stretch": 0, + "font-style": 0, + "font-variant": 0, + "font-weight": 0, + "glyph-orientation-horizontal": 0, + "glyph-orientation-vertical": 0, + "image-rendering": 0, + "kerning": 0, + "letter-spacing": 0, + "lighting-color": 0, + "marker": 0, + "marker-end": 0, + "marker-mid": 0, + "marker-start": 0, + "mask": 0, + "opacity": 0, + "overflow": 0, + "pointer-events": 0, + "shape-rendering": 0, + "stop-color": 0, + "stop-opacity": 0, + "stroke": 0, + "stroke-dasharray": 0, + "stroke-dashoffset": 0, + "stroke-linecap": 0, + "stroke-linejoin": 0, + "stroke-miterlimit": 0, + "stroke-opacity": 0, + "stroke-width": 0, + "text-anchor": 0, + "text-decoration": 0, + "text-rendering": 0, + "unicode-bidi": 0, + "visibility": 0, + "word-spacing": 0, + "writing-mode": 0 +}; + +eve.on("snap.util.attr", function (value) { + var att = eve.nt(), + attr = {}; + att = att.substring(att.lastIndexOf(".") + 1); + attr[att] = value; + var style = att.replace(/-(\w)/gi, function (all, letter) { + return letter.toUpperCase(); + }), + css = att.replace(/[A-Z]/g, function (letter) { + return "-" + letter.toLowerCase(); + }); + if (cssAttr[has](css)) { + this.node.style[style] = value == null ? E : value; + } else { + $(this.node, attr); + } +}); +(function (proto) {}(Paper.prototype)); + +// simple ajax +/*\ + * Snap.ajax + [ method ] + ** + * Simple implementation of Ajax + ** + - url (string) URL + - postData (object|string) data for post request + - callback (function) callback + - scope (object) #optional scope of callback + * or + - url (string) URL + - callback (function) callback + - scope (object) #optional scope of callback + = (XMLHttpRequest) the XMLHttpRequest object, just in case +\*/ +Snap.ajax = function (url, postData, callback, scope){ + var req = new XMLHttpRequest, + id = ID(); + if (req) { + if (is(postData, "function")) { + scope = callback; + callback = postData; + postData = null; + } else if (is(postData, "object")) { + var pd = []; + for (var key in postData) if (postData.hasOwnProperty(key)) { + pd.push(encodeURIComponent(key) + "=" + encodeURIComponent(postData[key])); + } + postData = pd.join("&"); + } + req.open((postData ? "POST" : "GET"), url, true); + if (postData) { + req.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + } + if (callback) { + eve.once("snap.ajax." + id + ".0", callback); + eve.once("snap.ajax." + id + ".200", callback); + eve.once("snap.ajax." + id + ".304", callback); + } + req.onreadystatechange = function() { + if (req.readyState != 4) return; + eve("snap.ajax." + id + "." + req.status, scope, req); + }; + if (req.readyState == 4) { + return req; + } + req.send(postData); + return req; + } +}; +/*\ + * Snap.load + [ method ] + ** + * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX) + ** + - url (string) URL + - callback (function) callback + - scope (object) #optional scope of callback +\*/ +Snap.load = function (url, callback, scope) { + Snap.ajax(url, function (req) { + var f = Snap.parse(req.responseText); + scope ? callback.call(scope, f) : callback(f); + }); +}; +var getOffset = function (elem) { + var box = elem.getBoundingClientRect(), + doc = elem.ownerDocument, + body = doc.body, + docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft; + return { + y: top, + x: left + }; +}; +/*\ + * Snap.getElementByPoint + [ method ] + ** + * Returns you topmost element under given point. + ** + = (object) Snap element object + - x (number) x coordinate from the top left corner of the window + - y (number) y coordinate from the top left corner of the window + > Usage + | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"}); +\*/ +Snap.getElementByPoint = function (x, y) { + var paper = this, + svg = paper.canvas, + target = glob.doc.elementFromPoint(x, y); + if (glob.win.opera && target.tagName == "svg") { + var so = getOffset(target), + sr = target.createSVGRect(); + sr.x = x - so.x; + sr.y = y - so.y; + sr.width = sr.height = 1; + var hits = target.getIntersectionList(sr, null); + if (hits.length) { + target = hits[hits.length - 1]; + } + } + if (!target) { + return null; + } + return wrap(target); +}; +/*\ + * Snap.plugin + [ method ] + ** + * Let you write plugins. You pass in a function with five arguments, like this: + | Snap.plugin(function (Snap, Element, Paper, global, Fragment) { + | Snap.newmethod = function () {}; + | Element.prototype.newmethod = function () {}; + | Paper.prototype.newmethod = function () {}; + | }); + * Inside the function you have access to all main objects (and their + * prototypes). This allow you to extend anything you want. + ** + - f (function) your plugin body +\*/ +Snap.plugin = function (f) { + f(Snap, Element, Paper, glob, Fragment); +}; +glob.win.Snap = Snap; +return Snap; +}(window || this)); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var elproto = Element.prototype, + is = Snap.is, + Str = String, + unit2px = Snap._unit2px, + $ = Snap._.$, + make = Snap._.make, + getSomeDefs = Snap._.getSomeDefs, + has = "hasOwnProperty", + wrap = Snap._.wrap; + /*\ + * Element.getBBox + [ method ] + ** + * Returns the bounding box descriptor for the given element + ** + = (object) bounding box descriptor: + o { + o cx: (number) x of the center, + o cy: (number) x of the center, + o h: (number) height, + o height: (number) height, + o path: (string) path command for the box, + o r0: (number) radius of a circle that fully encloses the box, + o r1: (number) radius of the smallest circle that can be enclosed, + o r2: (number) radius of the largest circle that can be enclosed, + o vb: (string) box as a viewbox command, + o w: (number) width, + o width: (number) width, + o x2: (number) x of the right side, + o x: (number) x of the left side, + o y2: (number) y of the bottom edge, + o y: (number) y of the top edge + o } + \*/ + elproto.getBBox = function (isWithoutTransform) { + if (!Snap.Matrix || !Snap.path) { + return this.node.getBBox(); + } + var el = this, + m = new Snap.Matrix; + if (el.removed) { + return Snap._.box(); + } + while (el.type == "use") { + if (!isWithoutTransform) { + m = m.add(el.transform().localMatrix.translate(el.attr("x") || 0, el.attr("y") || 0)); + } + if (el.original) { + el = el.original; + } else { + var href = el.attr("xlink:href"); + el = el.original = el.node.ownerDocument.getElementById(href.substring(href.indexOf("#") + 1)); + } + } + var _ = el._, + pathfinder = Snap.path.get[el.type] || Snap.path.get.deflt; + try { + if (isWithoutTransform) { + _.bboxwt = pathfinder ? Snap.path.getBBox(el.realPath = pathfinder(el)) : Snap._.box(el.node.getBBox()); + return Snap._.box(_.bboxwt); + } else { + el.realPath = pathfinder(el); + el.matrix = el.transform().localMatrix; + _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, m.add(el.matrix))); + return Snap._.box(_.bbox); + } + } catch (e) { + // Firefox doesn’t give you bbox of hidden element + return Snap._.box(); + } + }; + var propString = function () { + return this.string; + }; + function extractTransform(el, tstr) { + if (tstr == null) { + var doReturn = true; + if (el.type == "linearGradient" || el.type == "radialGradient") { + tstr = el.node.getAttribute("gradientTransform"); + } else if (el.type == "pattern") { + tstr = el.node.getAttribute("patternTransform"); + } else { + tstr = el.node.getAttribute("transform"); + } + if (!tstr) { + return new Snap.Matrix; + } + tstr = Snap._.svgTransform2string(tstr); + } else { + if (!Snap._.rgTransform.test(tstr)) { + tstr = Snap._.svgTransform2string(tstr); + } else { + tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || ""); + } + if (is(tstr, "array")) { + tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr); + } + el._.transform = tstr; + } + var m = Snap._.transform2matrix(tstr, el.getBBox(1)); + if (doReturn) { + return m; + } else { + el.matrix = m; + } + } + /*\ + * Element.transform + [ method ] + ** + * Gets or sets transformation of the element + ** + - tstr (string) transform string in Snap or SVG format + = (Element) the current element + * or + = (object) transformation descriptor: + o { + o string (string) transform string, + o globalMatrix (Matrix) matrix of all transformations applied to element or its parents, + o localMatrix (Matrix) matrix of transformations applied only to the element, + o diffMatrix (Matrix) matrix of difference between global and local transformations, + o global (string) global transformation as string, + o local (string) local transformation as string, + o toString (function) returns `string` property + o } + \*/ + elproto.transform = function (tstr) { + var _ = this._; + if (tstr == null) { + var papa = this, + global = new Snap.Matrix(this.node.getCTM()), + local = extractTransform(this), + ms = [local], + m = new Snap.Matrix, + i, + localString = local.toTransformString(), + string = Str(local) == Str(this.matrix) ? + Str(_.transform) : localString; + while (papa.type != "svg" && (papa = papa.parent())) { + ms.push(extractTransform(papa)); + } + i = ms.length; + while (i--) { + m.add(ms[i]); + } + return { + string: string, + globalMatrix: global, + totalMatrix: m, + localMatrix: local, + diffMatrix: global.clone().add(local.invert()), + global: global.toTransformString(), + total: m.toTransformString(), + local: localString, + toString: propString + }; + } + if (tstr instanceof Snap.Matrix) { + this.matrix = tstr; + this._.transform = tstr.toTransformString(); + } else { + extractTransform(this, tstr); + } + + if (this.node) { + if (this.type == "linearGradient" || this.type == "radialGradient") { + $(this.node, {gradientTransform: this.matrix}); + } else if (this.type == "pattern") { + $(this.node, {patternTransform: this.matrix}); + } else { + $(this.node, {transform: this.matrix}); + } + } + + return this; + }; + /*\ + * Element.parent + [ method ] + ** + * Returns the element's parent + ** + = (Element) the parent element + \*/ + elproto.parent = function () { + return wrap(this.node.parentNode); + }; + /*\ + * Element.append + [ method ] + ** + * Appends the given element to current one + ** + - el (Element|Set) element to append + = (Element) the parent element + \*/ + /*\ + * Element.add + [ method ] + ** + * See @Element.append + \*/ + elproto.append = elproto.add = function (el) { + if (el) { + if (el.type == "set") { + var it = this; + el.forEach(function (el) { + it.add(el); + }); + return this; + } + el = wrap(el); + this.node.appendChild(el.node); + el.paper = this.paper; + } + return this; + }; + /*\ + * Element.appendTo + [ method ] + ** + * Appends the current element to the given one + ** + - el (Element) parent element to append to + = (Element) the child element + \*/ + elproto.appendTo = function (el) { + if (el) { + el = wrap(el); + el.append(this); + } + return this; + }; + /*\ + * Element.prepend + [ method ] + ** + * Prepends the given element to the current one + ** + - el (Element) element to prepend + = (Element) the parent element + \*/ + elproto.prepend = function (el) { + if (el) { + if (el.type == "set") { + var it = this, + first; + el.forEach(function (el) { + if (first) { + first.after(el); + } else { + it.prepend(el); + } + first = el; + }); + return this; + } + el = wrap(el); + var parent = el.parent(); + this.node.insertBefore(el.node, this.node.firstChild); + this.add && this.add(); + el.paper = this.paper; + this.parent() && this.parent().add(); + parent && parent.add(); + } + return this; + }; + /*\ + * Element.prependTo + [ method ] + ** + * Prepends the current element to the given one + ** + - el (Element) parent element to prepend to + = (Element) the child element + \*/ + elproto.prependTo = function (el) { + el = wrap(el); + el.prepend(this); + return this; + }; + /*\ + * Element.before + [ method ] + ** + * Inserts given element before the current one + ** + - el (Element) element to insert + = (Element) the parent element + \*/ + elproto.before = function (el) { + if (el.type == "set") { + var it = this; + el.forEach(function (el) { + var parent = el.parent(); + it.node.parentNode.insertBefore(el.node, it.node); + parent && parent.add(); + }); + this.parent().add(); + return this; + } + el = wrap(el); + var parent = el.parent(); + this.node.parentNode.insertBefore(el.node, this.node); + this.parent() && this.parent().add(); + parent && parent.add(); + el.paper = this.paper; + return this; + }; + /*\ + * Element.after + [ method ] + ** + * Inserts given element after the current one + ** + - el (Element) element to insert + = (Element) the parent element + \*/ + elproto.after = function (el) { + el = wrap(el); + var parent = el.parent(); + if (this.node.nextSibling) { + this.node.parentNode.insertBefore(el.node, this.node.nextSibling); + } else { + this.node.parentNode.appendChild(el.node); + } + this.parent() && this.parent().add(); + parent && parent.add(); + el.paper = this.paper; + return this; + }; + /*\ + * Element.insertBefore + [ method ] + ** + * Inserts the element after the given one + ** + - el (Element) element next to whom insert to + = (Element) the parent element + \*/ + elproto.insertBefore = function (el) { + el = wrap(el); + var parent = this.parent(); + el.node.parentNode.insertBefore(this.node, el.node); + this.paper = el.paper; + parent && parent.add(); + el.parent() && el.parent().add(); + return this; + }; + /*\ + * Element.insertAfter + [ method ] + ** + * Inserts the element after the given one + ** + - el (Element) element next to whom insert to + = (Element) the parent element + \*/ + elproto.insertAfter = function (el) { + el = wrap(el); + var parent = this.parent(); + el.node.parentNode.insertBefore(this.node, el.node.nextSibling); + this.paper = el.paper; + parent && parent.add(); + el.parent() && el.parent().add(); + return this; + }; + /*\ + * Element.remove + [ method ] + ** + * Removes element from the DOM + = (Element) the detached element + \*/ + elproto.remove = function () { + var parent = this.parent(); + this.node.parentNode && this.node.parentNode.removeChild(this.node); + delete this.paper; + this.removed = true; + parent && parent.add(); + return this; + }; + /*\ + * Element.select + [ method ] + ** + * Gathers the nested @Element matching the given set of CSS selectors + ** + - query (string) CSS selector + = (Element) result of query selection + \*/ + elproto.select = function (query) { + return wrap(this.node.querySelector(query)); + }; + /*\ + * Element.selectAll + [ method ] + ** + * Gathers nested @Element objects matching the given set of CSS selectors + ** + - query (string) CSS selector + = (Set|array) result of query selection + \*/ + elproto.selectAll = function (query) { + var nodelist = this.node.querySelectorAll(query), + set = (Snap.set || Array)(); + for (var i = 0; i < nodelist.length; i++) { + set.push(wrap(nodelist[i])); + } + return set; + }; + /*\ + * Element.asPX + [ method ] + ** + * Returns given attribute of the element as a `px` value (not %, em, etc.) + ** + - attr (string) attribute name + - value (string) #optional attribute value + = (Element) result of query selection + \*/ + elproto.asPX = function (attr, value) { + if (value == null) { + value = this.attr(attr); + } + return +unit2px(this, attr, value); + }; + // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned instantiates. It's a part of SVG with which ordinary web developers may be least familiar. + /*\ + * Element.use + [ method ] + ** + * Creates a `` element linked to the current element + ** + = (Element) the `` element + \*/ + elproto.use = function () { + var use, + id = this.node.id; + if (!id) { + id = this.id; + $(this.node, { + id: id + }); + } + if (this.type == "linearGradient" || this.type == "radialGradient" || + this.type == "pattern") { + use = make(this.type, this.node.parentNode); + } else { + use = make("use", this.node.parentNode); + } + $(use.node, { + "xlink:href": "#" + id + }); + use.original = this; + return use; + }; + function fixids(el) { + var els = el.selectAll("*"), + it, + url = /^\s*url\(("|'|)(.*)\1\)\s*$/, + ids = [], + uses = {}; + function urltest(it, name) { + var val = $(it.node, name); + val = val && val.match(url); + val = val && val[2]; + if (val && val.charAt() == "#") { + val = val.substring(1); + } else { + return; + } + if (val) { + uses[val] = (uses[val] || []).concat(function (id) { + var attr = {}; + attr[name] = URL(id); + $(it.node, attr); + }); + } + } + function linktest(it) { + var val = $(it.node, "xlink:href"); + if (val && val.charAt() == "#") { + val = val.substring(1); + } else { + return; + } + if (val) { + uses[val] = (uses[val] || []).concat(function (id) { + it.attr("xlink:href", "#" + id); + }); + } + } + for (var i = 0, ii = els.length; i < ii; i++) { + it = els[i]; + urltest(it, "fill"); + urltest(it, "stroke"); + urltest(it, "filter"); + urltest(it, "mask"); + urltest(it, "clip-path"); + linktest(it); + var oldid = $(it.node, "id"); + if (oldid) { + $(it.node, {id: it.id}); + ids.push({ + old: oldid, + id: it.id + }); + } + } + for (i = 0, ii = ids.length; i < ii; i++) { + var fs = uses[ids[i].old]; + if (fs) { + for (var j = 0, jj = fs.length; j < jj; j++) { + fs[j](ids[i].id); + } + } + } + } + /*\ + * Element.clone + [ method ] + ** + * Creates a clone of the element and inserts it after the element + ** + = (Element) the clone + \*/ + elproto.clone = function () { + var clone = wrap(this.node.cloneNode(true)); + if ($(clone.node, "id")) { + $(clone.node, {id: clone.id}); + } + fixids(clone); + clone.insertAfter(this); + return clone; + }; + /*\ + * Element.toDefs + [ method ] + ** + * Moves element to the shared `` area + ** + = (Element) the element + \*/ + elproto.toDefs = function () { + var defs = getSomeDefs(this); + defs.appendChild(this.node); + return this; + }; + /*\ + * Element.toPattern + [ method ] + ** + * Creates a `` element from the current element + ** + * To create a pattern you have to specify the pattern rect: + - x (string|number) + - y (string|number) + - width (string|number) + - height (string|number) + = (Element) the `` element + * You can use pattern later on as an argument for `fill` attribute: + | var p = paper.path("M10-5-10,15M15,0,0,15M0-5-20,15").attr({ + | fill: "none", + | stroke: "#bada55", + | strokeWidth: 5 + | }).pattern(0, 0, 10, 10), + | c = paper.circle(200, 200, 100); + | c.attr({ + | fill: p + | }); + \*/ + elproto.pattern = elproto.toPattern = function (x, y, width, height) { + var p = make("pattern", getSomeDefs(this)); + if (x == null) { + x = this.getBBox(); + } + if (is(x, "object") && "x" in x) { + y = x.y; + width = x.width; + height = x.height; + x = x.x; + } + $(p.node, { + x: x, + y: y, + width: width, + height: height, + patternUnits: "userSpaceOnUse", + id: p.id, + viewBox: [x, y, width, height].join(" ") + }); + p.node.appendChild(this.node); + return p; + }; +// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path. +// SIERRA Element.marker(): I suggest the method should accept default reference point values. Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where? Couldn't they also be assigned default values? + /*\ + * Element.marker + [ method ] + ** + * Creates a `` element from the current element + ** + * To create a marker you have to specify the bounding rect and reference point: + - x (number) + - y (number) + - width (number) + - height (number) + - refX (number) + - refY (number) + = (Element) the `` element + * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end. + \*/ + // TODO add usage for markers + elproto.marker = function (x, y, width, height, refX, refY) { + var p = make("marker", getSomeDefs(this)); + if (x == null) { + x = this.getBBox(); + } + if (is(x, "object") && "x" in x) { + y = x.y; + width = x.width; + height = x.height; + refX = x.refX || x.cx; + refY = x.refY || x.cy; + x = x.x; + } + $(p.node, { + viewBox: [x, y, width, height].join(" "), + markerWidth: width, + markerHeight: height, + orient: "auto", + refX: refX || 0, + refY: refY || 0, + id: p.id + }); + p.node.appendChild(this.node); + return p; + }; + // animation + function slice(from, to, f) { + return function (arr) { + var res = arr.slice(from, to); + if (res.length == 1) { + res = res[0]; + } + return f ? f(res) : res; + }; + } + var Animation = function (attr, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + this.attr = attr; + this.dur = ms; + easing && (this.easing = easing); + callback && (this.callback = callback); + }; + Snap._.Animation = Animation; + /*\ + * Snap.animation + [ method ] + ** + * Creates an animation object + ** + - attr (object) attributes of final destination + - duration (number) duration of the animation, in milliseconds + - easing (function) #optional one of easing functions of @mina or custom one + - callback (function) #optional callback function that fires when animation ends + = (object) animation object + \*/ + Snap.animation = function (attr, ms, easing, callback) { + return new Animation(attr, ms, easing, callback); + }; + /*\ + * Element.inAnim + [ method ] + ** + * Returns a set of animations that may be able to manipulate the current element + ** + = (object) in format: + o { + o anim (object) animation object, + o mina (object) @mina object, + o curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished, + o status (function) gets or sets the status of the animation, + o stop (function) stops the animation + o } + \*/ + elproto.inAnim = function () { + var el = this, + res = []; + for (var id in el.anims) if (el.anims[has](id)) { + (function (a) { + res.push({ + anim: new Animation(a._attrs, a.dur, a.easing, a._callback), + mina: a, + curStatus: a.status(), + status: function (val) { + return a.status(val); + }, + stop: function () { + a.stop(); + } + }); + }(el.anims[id])); + } + return res; + }; + /*\ + * Snap.animate + [ method ] + ** + * Runs generic animation of one number into another with a caring function + ** + - from (number|array) number or array of numbers + - to (number|array) number or array of numbers + - setter (function) caring function that accepts one number argument + - duration (number) duration, in milliseconds + - easing (function) #optional easing function from @mina or custom + - callback (function) #optional callback function to execute when animation ends + = (object) animation object in @mina format + o { + o id (string) animation id, consider it read-only, + o duration (function) gets or sets the duration of the animation, + o easing (function) easing, + o speed (function) gets or sets the speed of the animation, + o status (function) gets or sets the status of the animation, + o stop (function) stops the animation + o } + | var rect = Snap().rect(0, 0, 10, 10); + | Snap.animate(0, 10, function (val) { + | rect.attr({ + | x: val + | }); + | }, 1000); + | // in given context is equivalent to + | rect.animate({x: 10}, 1000); + \*/ + Snap.animate = function (from, to, setter, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + var now = mina.time(), + anim = mina(from, to, now, now + ms, mina.time, setter, easing); + callback && eve.once("mina.finish." + anim.id, callback); + return anim; + }; + /*\ + * Element.stop + [ method ] + ** + * Stops all the animations for the current element + ** + = (Element) the current element + \*/ + elproto.stop = function () { + var anims = this.inAnim(); + for (var i = 0, ii = anims.length; i < ii; i++) { + anims[i].stop(); + } + return this; + }; + /*\ + * Element.animate + [ method ] + ** + * Animates the given attributes of the element + ** + - attrs (object) key-value pairs of destination attributes + - duration (number) duration of the animation in milliseconds + - easing (function) #optional easing function from @mina or custom + - callback (function) #optional callback function that executes when the animation ends + = (Element) the current element + \*/ + elproto.animate = function (attrs, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + if (attrs instanceof Animation) { + callback = attrs.callback; + easing = attrs.easing; + ms = attrs.dur; + attrs = attrs.attr; + } + var fkeys = [], tkeys = [], keys = {}, from, to, f, eq, + el = this; + for (var key in attrs) if (attrs[has](key)) { + if (el.equal) { + eq = el.equal(key, Str(attrs[key])); + from = eq.from; + to = eq.to; + f = eq.f; + } else { + from = +el.attr(key); + to = +attrs[key]; + } + var len = is(from, "array") ? from.length : 1; + keys[key] = slice(fkeys.length, fkeys.length + len, f); + fkeys = fkeys.concat(from); + tkeys = tkeys.concat(to); + } + var now = mina.time(), + anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) { + var attr = {}; + for (var key in keys) if (keys[has](key)) { + attr[key] = keys[key](val); + } + el.attr(attr); + }, easing); + el.anims[anim.id] = anim; + anim._attrs = attrs; + anim._callback = callback; + eve("snap.animcreated." + el.id, anim); + eve.once("mina.finish." + anim.id, function () { + delete el.anims[anim.id]; + callback && callback.call(el); + }); + eve.once("mina.stop." + anim.id, function () { + delete el.anims[anim.id]; + }); + return el; + }; + var eldata = {}; + /*\ + * Element.data + [ method ] + ** + * Adds or retrieves given value associated with given key. (Don’t confuse + * with `data-` attributes) + * + * See also @Element.removeData + - key (string) key to store data + - value (any) #optional value to store + = (object) @Element + * or, if value is not specified: + = (any) value + > Usage + | for (var i = 0, i < 5, i++) { + | paper.circle(10 + 15 * i, 10, 10) + | .attr({fill: "#000"}) + | .data("i", i) + | .click(function () { + | alert(this.data("i")); + | }); + | } + \*/ + elproto.data = function (key, value) { + var data = eldata[this.id] = eldata[this.id] || {}; + if (arguments.length == 0){ + eve("snap.data.get." + this.id, this, data, null); + return data; + } + if (arguments.length == 1) { + if (Snap.is(key, "object")) { + for (var i in key) if (key[has](i)) { + this.data(i, key[i]); + } + return this; + } + eve("snap.data.get." + this.id, this, data[key], key); + return data[key]; + } + data[key] = value; + eve("snap.data.set." + this.id, this, value, key); + return this; + }; + /*\ + * Element.removeData + [ method ] + ** + * Removes value associated with an element by given key. + * If key is not provided, removes all the data of the element. + - key (string) #optional key + = (object) @Element + \*/ + elproto.removeData = function (key) { + if (key == null) { + eldata[this.id] = {}; + } else { + eldata[this.id] && delete eldata[this.id][key]; + } + return this; + }; + /*\ + * Element.outerSVG + [ method ] + ** + * Returns SVG code for the element, equivalent to HTML's `outerHTML`. + * + * See also @Element.innerSVG + = (string) SVG code for the element + \*/ + /*\ + * Element.toString + [ method ] + ** + * See @Element.outerSVG + \*/ + elproto.outerSVG = elproto.toString = toString(1); + /*\ + * Element.innerSVG + [ method ] + ** + * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML` + = (string) SVG code for the element + \*/ + elproto.innerSVG = toString(); + function toString(type) { + return function () { + var res = type ? "<" + this.type : "", + attr = this.node.attributes, + chld = this.node.childNodes; + if (type) { + for (var i = 0, ii = attr.length; i < ii; i++) { + res += " " + attr[i].name + '="' + + attr[i].value.replace(/"/g, '\\"') + '"'; + } + } + if (chld.length) { + type && (res += ">"); + for (i = 0, ii = chld.length; i < ii; i++) { + if (chld[i].nodeType == 3) { + res += chld[i].nodeValue; + } else if (chld[i].nodeType == 1) { + res += wrap(chld[i]).toString(); + } + } + type && (res += ""); + } else { + type && (res += "/>"); + } + return res; + }; + } + elproto.toDataURL = function () { + if (window && window.btoa) { + var bb = this.getBBox(), + svg = Snap.format('{contents}', { + x: +bb.x.toFixed(3), + y: +bb.y.toFixed(3), + width: +bb.width.toFixed(3), + height: +bb.height.toFixed(3), + contents: this.outerSVG() + }); + return "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(svg))); + } + }; + /*\ + * Fragment.select + [ method ] + ** + * See @Element.select + \*/ + Fragment.prototype.select = elproto.select; + /*\ + * Fragment.selectAll + [ method ] + ** + * See @Element.selectAll + \*/ + Fragment.prototype.selectAll = elproto.selectAll; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var objectToString = Object.prototype.toString, + Str = String, + math = Math, + E = ""; + function Matrix(a, b, c, d, e, f) { + if (b == null && objectToString.call(a) == "[object SVGMatrix]") { + this.a = a.a; + this.b = a.b; + this.c = a.c; + this.d = a.d; + this.e = a.e; + this.f = a.f; + return; + } + if (a != null) { + this.a = +a; + this.b = +b; + this.c = +c; + this.d = +d; + this.e = +e; + this.f = +f; + } else { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + } + } + (function (matrixproto) { + /*\ + * Matrix.add + [ method ] + ** + * Adds the given matrix to existing one + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + * or + - matrix (object) @Matrix + \*/ + matrixproto.add = function (a, b, c, d, e, f) { + var out = [[], [], []], + m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], + matrix = [[a, c, e], [b, d, f], [0, 0, 1]], + x, y, z, res; + + if (a && a instanceof Matrix) { + matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]; + } + + for (x = 0; x < 3; x++) { + for (y = 0; y < 3; y++) { + res = 0; + for (z = 0; z < 3; z++) { + res += m[x][z] * matrix[z][y]; + } + out[x][y] = res; + } + } + this.a = out[0][0]; + this.b = out[1][0]; + this.c = out[0][1]; + this.d = out[1][1]; + this.e = out[0][2]; + this.f = out[1][2]; + return this; + }; + /*\ + * Matrix.invert + [ method ] + ** + * Returns an inverted version of the matrix + = (object) @Matrix + \*/ + matrixproto.invert = function () { + var me = this, + x = me.a * me.d - me.b * me.c; + return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x); + }; + /*\ + * Matrix.clone + [ method ] + ** + * Returns a copy of the matrix + = (object) @Matrix + \*/ + matrixproto.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + }; + /*\ + * Matrix.translate + [ method ] + ** + * Translate the matrix + - x (number) horizontal offset distance + - y (number) vertical offset distance + \*/ + matrixproto.translate = function (x, y) { + return this.add(1, 0, 0, 1, x, y); + }; + /*\ + * Matrix.scale + [ method ] + ** + * Scales the matrix + - x (number) amount to be scaled, with `1` resulting in no change + - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.) + - cx (number) #optional horizontal origin point from which to scale + - cy (number) #optional vertical origin point from which to scale + * Default cx, cy is the middle point of the element. + \*/ + matrixproto.scale = function (x, y, cx, cy) { + y == null && (y = x); + (cx || cy) && this.add(1, 0, 0, 1, cx, cy); + this.add(x, 0, 0, y, 0, 0); + (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy); + return this; + }; + /*\ + * Matrix.rotate + [ method ] + ** + * Rotates the matrix + - a (number) angle of rotation, in degrees + - x (number) horizontal origin point from which to rotate + - y (number) vertical origin point from which to rotate + \*/ + matrixproto.rotate = function (a, x, y) { + a = Snap.rad(a); + x = x || 0; + y = y || 0; + var cos = +math.cos(a).toFixed(9), + sin = +math.sin(a).toFixed(9); + this.add(cos, sin, -sin, cos, x, y); + return this.add(1, 0, 0, 1, -x, -y); + }; + /*\ + * Matrix.x + [ method ] + ** + * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y + - x (number) + - y (number) + = (number) x + \*/ + matrixproto.x = function (x, y) { + return x * this.a + y * this.c + this.e; + }; + /*\ + * Matrix.y + [ method ] + ** + * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x + - x (number) + - y (number) + = (number) y + \*/ + matrixproto.y = function (x, y) { + return x * this.b + y * this.d + this.f; + }; + matrixproto.get = function (i) { + return +this[Str.fromCharCode(97 + i)].toFixed(4); + }; + matrixproto.toString = function () { + return "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")"; + }; + matrixproto.offset = function () { + return [this.e.toFixed(4), this.f.toFixed(4)]; + }; + function norm(a) { + return a[0] * a[0] + a[1] * a[1]; + } + function normalize(a) { + var mag = math.sqrt(norm(a)); + a[0] && (a[0] /= mag); + a[1] && (a[1] /= mag); + } + /*\ + * Matrix.determinant + [ method ] + ** + * Finds determinant of the given matrix. + = (number) determinant + \*/ + matrixproto.determinant = function () { + return this.a * this.d - this.b * this.c; + }; + /*\ + * Matrix.split + [ method ] + ** + * Splits matrix into primitive transformations + = (object) in format: + o dx (number) translation by x + o dy (number) translation by y + o scalex (number) scale by x + o scaley (number) scale by y + o shear (number) shear + o rotate (number) rotation in deg + o isSimple (boolean) could it be represented via simple transformations + \*/ + matrixproto.split = function () { + var out = {}; + // translation + out.dx = this.e; + out.dy = this.f; + + // scale and shear + var row = [[this.a, this.c], [this.b, this.d]]; + out.scalex = math.sqrt(norm(row[0])); + normalize(row[0]); + + out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1]; + row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear]; + + out.scaley = math.sqrt(norm(row[1])); + normalize(row[1]); + out.shear /= out.scaley; + + if (this.determinant() < 0) { + out.scalex = -out.scalex; + } + + // rotation + var sin = -row[0][1], + cos = row[1][1]; + if (cos < 0) { + out.rotate = Snap.deg(math.acos(cos)); + if (sin < 0) { + out.rotate = 360 - out.rotate; + } + } else { + out.rotate = Snap.deg(math.asin(sin)); + } + + out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate); + out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate; + out.noRotation = !+out.shear.toFixed(9) && !out.rotate; + return out; + }; + /*\ + * Matrix.toTransformString + [ method ] + ** + * Returns transform string that represents given matrix + = (string) transform string + \*/ + matrixproto.toTransformString = function (shorter) { + var s = shorter || this.split(); + if (!+s.shear.toFixed(9)) { + s.scalex = +s.scalex.toFixed(4); + s.scaley = +s.scaley.toFixed(4); + s.rotate = +s.rotate.toFixed(4); + return (s.dx || s.dy ? "t" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) + + (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) + + (s.rotate ? "r" + [+s.rotate.toFixed(4), 0, 0] : E); + } else { + return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)]; + } + }; + })(Matrix.prototype); + /*\ + * Snap.Matrix + [ method ] + ** + * Matrix constructor, extend on your own risk. + * To create matrices use @Snap.matrix. + \*/ + Snap.Matrix = Matrix; + /*\ + * Snap.matrix + [ method ] + ** + * Utility method + ** + * Returns a matrix based on the given parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + * or + - svgMatrix (SVGMatrix) + = (object) @Matrix + \*/ + Snap.matrix = function (a, b, c, d, e, f) { + return new Matrix(a, b, c, d, e, f); + }; +}); +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var has = "hasOwnProperty", + make = Snap._.make, + wrap = Snap._.wrap, + is = Snap.is, + getSomeDefs = Snap._.getSomeDefs, + reURLValue = /^url\(#?([^)]+)\)$/, + $ = Snap._.$, + URL = Snap.url, + Str = String, + separator = Snap._.separator, + E = ""; + // Attributes event handlers + eve.on("snap.util.attr.mask", function (value) { + if (value instanceof Element || value instanceof Fragment) { + eve.stop(); + if (value instanceof Fragment && value.node.childNodes.length == 1) { + value = value.node.firstChild; + getSomeDefs(this).appendChild(value); + value = wrap(value); + } + if (value.type == "mask") { + var mask = value; + } else { + mask = make("mask", getSomeDefs(this)); + mask.node.appendChild(value.node); + } + !mask.node.id && $(mask.node, { + id: mask.id + }); + $(this.node, { + mask: URL(mask.id) + }); + } + }); + (function (clipIt) { + eve.on("snap.util.attr.clip", clipIt); + eve.on("snap.util.attr.clip-path", clipIt); + eve.on("snap.util.attr.clipPath", clipIt); + }(function (value) { + if (value instanceof Element || value instanceof Fragment) { + eve.stop(); + if (value.type == "clipPath") { + var clip = value; + } else { + clip = make("clipPath", getSomeDefs(this)); + clip.node.appendChild(value.node); + !clip.node.id && $(clip.node, { + id: clip.id + }); + } + $(this.node, { + "clip-path": URL(clip.node.id || clip.id) + }); + } + })); + function fillStroke(name) { + return function (value) { + eve.stop(); + if (value instanceof Fragment && value.node.childNodes.length == 1 && + (value.node.firstChild.tagName == "radialGradient" || + value.node.firstChild.tagName == "linearGradient" || + value.node.firstChild.tagName == "pattern")) { + value = value.node.firstChild; + getSomeDefs(this).appendChild(value); + value = wrap(value); + } + if (value instanceof Element) { + if (value.type == "radialGradient" || value.type == "linearGradient" + || value.type == "pattern") { + if (!value.node.id) { + $(value.node, { + id: value.id + }); + } + var fill = URL(value.node.id); + } else { + fill = value.attr(name); + } + } else { + fill = Snap.color(value); + if (fill.error) { + var grad = Snap(getSomeDefs(this).ownerSVGElement).gradient(value); + if (grad) { + if (!grad.node.id) { + $(grad.node, { + id: grad.id + }); + } + fill = URL(grad.node.id); + } else { + fill = value; + } + } else { + fill = Str(fill); + } + } + var attrs = {}; + attrs[name] = fill; + $(this.node, attrs); + this.node.style[name] = E; + }; + } + eve.on("snap.util.attr.fill", fillStroke("fill")); + eve.on("snap.util.attr.stroke", fillStroke("stroke")); + var gradrg = /^([lr])(?:\(([^)]*)\))?(.*)$/i; + eve.on("snap.util.grad.parse", function parseGrad(string) { + string = Str(string); + var tokens = string.match(gradrg); + if (!tokens) { + return null; + } + var type = tokens[1], + params = tokens[2], + stops = tokens[3]; + params = params.split(/\s*,\s*/).map(function (el) { + return +el == el ? +el : el; + }); + if (params.length == 1 && params[0] == 0) { + params = []; + } + stops = stops.split("-"); + stops = stops.map(function (el) { + el = el.split(":"); + var out = { + color: el[0] + }; + if (el[1]) { + out.offset = parseFloat(el[1]); + } + return out; + }); + return { + type: type, + params: params, + stops: stops + }; + }); + + eve.on("snap.util.attr.d", function (value) { + eve.stop(); + if (is(value, "array") && is(value[0], "array")) { + value = Snap.path.toString.call(value); + } + value = Str(value); + if (value.match(/[ruo]/i)) { + value = Snap.path.toAbsolute(value); + } + $(this.node, {d: value}); + })(-1); + eve.on("snap.util.attr.#text", function (value) { + eve.stop(); + value = Str(value); + var txt = glob.doc.createTextNode(value); + while (this.node.firstChild) { + this.node.removeChild(this.node.firstChild); + } + this.node.appendChild(txt); + })(-1); + eve.on("snap.util.attr.path", function (value) { + eve.stop(); + this.attr({d: value}); + })(-1); + eve.on("snap.util.attr.class", function (value) { + eve.stop(); + this.node.className.baseVal = value; + })(-1); + eve.on("snap.util.attr.viewBox", function (value) { + var vb; + if (is(value, "object") && "x" in value) { + vb = [value.x, value.y, value.width, value.height].join(" "); + } else if (is(value, "array")) { + vb = value.join(" "); + } else { + vb = value; + } + $(this.node, { + viewBox: vb + }); + eve.stop(); + })(-1); + eve.on("snap.util.attr.transform", function (value) { + this.transform(value); + eve.stop(); + })(-1); + eve.on("snap.util.attr.r", function (value) { + if (this.type == "rect") { + eve.stop(); + $(this.node, { + rx: value, + ry: value + }); + } + })(-1); + eve.on("snap.util.attr.textpath", function (value) { + eve.stop(); + if (this.type == "text") { + var id, tp, node; + if (!value && this.textPath) { + tp = this.textPath; + while (tp.node.firstChild) { + this.node.appendChild(tp.node.firstChild); + } + tp.remove(); + delete this.textPath; + return; + } + if (is(value, "string")) { + var defs = getSomeDefs(this), + path = wrap(defs.parentNode).path(value); + defs.appendChild(path.node); + id = path.id; + path.attr({id: id}); + } else { + value = wrap(value); + if (value instanceof Element) { + id = value.attr("id"); + if (!id) { + id = value.id; + value.attr({id: id}); + } + } + } + if (id) { + tp = this.textPath; + node = this.node; + if (tp) { + tp.attr({"xlink:href": "#" + id}); + } else { + tp = $("textPath", { + "xlink:href": "#" + id + }); + while (node.firstChild) { + tp.appendChild(node.firstChild); + } + node.appendChild(tp); + this.textPath = wrap(tp); + } + } + } + })(-1); + eve.on("snap.util.attr.text", function (value) { + if (this.type == "text") { + var i = 0, + node = this.node, + tuner = function (chunk) { + var out = $("tspan"); + if (is(chunk, "array")) { + for (var i = 0; i < chunk.length; i++) { + out.appendChild(tuner(chunk[i])); + } + } else { + out.appendChild(glob.doc.createTextNode(chunk)); + } + out.normalize && out.normalize(); + return out; + }; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var tuned = tuner(value); + while (tuned.firstChild) { + node.appendChild(tuned.firstChild); + } + } + eve.stop(); + })(-1); + function setFontSize(value) { + eve.stop(); + if (value == +value) { + value += "px"; + } + this.node.style.fontSize = value; + } + eve.on("snap.util.attr.fontSize", setFontSize)(-1); + eve.on("snap.util.attr.font-size", setFontSize)(-1); + + + eve.on("snap.util.getattr.transform", function () { + eve.stop(); + return this.transform(); + })(-1); + eve.on("snap.util.getattr.textpath", function () { + eve.stop(); + return this.textPath; + })(-1); + // Markers + (function () { + function getter(end) { + return function () { + eve.stop(); + var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue("marker-" + end); + if (style == "none") { + return style; + } else { + return Snap(glob.doc.getElementById(style.match(reURLValue)[1])); + } + }; + } + function setter(end) { + return function (value) { + eve.stop(); + var name = "marker" + end.charAt(0).toUpperCase() + end.substring(1); + if (value == "" || !value) { + this.node.style[name] = "none"; + return; + } + if (value.type == "marker") { + var id = value.node.id; + if (!id) { + $(value.node, {id: value.id}); + } + this.node.style[name] = URL(id); + return; + } + }; + } + eve.on("snap.util.getattr.marker-end", getter("end"))(-1); + eve.on("snap.util.getattr.markerEnd", getter("end"))(-1); + eve.on("snap.util.getattr.marker-start", getter("start"))(-1); + eve.on("snap.util.getattr.markerStart", getter("start"))(-1); + eve.on("snap.util.getattr.marker-mid", getter("mid"))(-1); + eve.on("snap.util.getattr.markerMid", getter("mid"))(-1); + eve.on("snap.util.attr.marker-end", setter("end"))(-1); + eve.on("snap.util.attr.markerEnd", setter("end"))(-1); + eve.on("snap.util.attr.marker-start", setter("start"))(-1); + eve.on("snap.util.attr.markerStart", setter("start"))(-1); + eve.on("snap.util.attr.marker-mid", setter("mid"))(-1); + eve.on("snap.util.attr.markerMid", setter("mid"))(-1); + }()); + eve.on("snap.util.getattr.r", function () { + if (this.type == "rect" && $(this.node, "rx") == $(this.node, "ry")) { + eve.stop(); + return $(this.node, "rx"); + } + })(-1); + function textExtract(node) { + var out = []; + var children = node.childNodes; + for (var i = 0, ii = children.length; i < ii; i++) { + var chi = children[i]; + if (chi.nodeType == 3) { + out.push(chi.nodeValue); + } + if (chi.tagName == "tspan") { + if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) { + out.push(chi.firstChild.nodeValue); + } else { + out.push(textExtract(chi)); + } + } + } + return out; + } + eve.on("snap.util.getattr.text", function () { + if (this.type == "text" || this.type == "tspan") { + eve.stop(); + var out = textExtract(this.node); + return out.length == 1 ? out[0] : out; + } + })(-1); + eve.on("snap.util.getattr.#text", function () { + return this.node.textContent; + })(-1); + eve.on("snap.util.getattr.viewBox", function () { + eve.stop(); + var vb = $(this.node, "viewBox"); + if (vb) { + vb = vb.split(separator); + return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]); + } else { + return; + } + })(-1); + eve.on("snap.util.getattr.points", function () { + var p = $(this.node, "points"); + eve.stop(); + if (p) { + return p.split(separator); + } else { + return; + } + })(-1); + eve.on("snap.util.getattr.path", function () { + var p = $(this.node, "d"); + eve.stop(); + return p; + })(-1); + eve.on("snap.util.getattr.class", function () { + return this.node.className.baseVal; + })(-1); + function getFontSize() { + eve.stop(); + return this.node.style.fontSize; + } + eve.on("snap.util.getattr.fontSize", getFontSize)(-1); + eve.on("snap.util.getattr.font-size", getFontSize)(-1); +}); + +// Copyright (c) 2014 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var rgNotSpace = /\S+/g, + rgBadSpace = /[\t\r\n\f]/g, + rgTrim = /(^\s+|\s+$)/g, + Str = String, + elproto = Element.prototype; + /*\ + * Element.addClass + [ method ] + ** + * Adds given class name or list of class names to the element. + - value (string) class name or space separated list of class names + ** + = (Element) original element. + \*/ + elproto.addClass = function (value) { + var classes = Str(value || "").match(rgNotSpace) || [], + elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || [], + j, + pos, + clazz, + finalValue; + + if (classes.length) { + j = 0; + while ((clazz = classes[j++])) { + pos = curClasses.indexOf(clazz); + if (!~pos) { + curClasses.push(clazz); + } + } + + finalValue = curClasses.join(" "); + if (className != finalValue) { + elem.className.baseVal = finalValue; + } + } + return this; + }; + /*\ + * Element.removeClass + [ method ] + ** + * Removes given class name or list of class names from the element. + - value (string) class name or space separated list of class names + ** + = (Element) original element. + \*/ + elproto.removeClass = function (value) { + var classes = Str(value || "").match(rgNotSpace) || [], + elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || [], + j, + pos, + clazz, + finalValue; + if (curClasses.length) { + j = 0; + while ((clazz = classes[j++])) { + pos = curClasses.indexOf(clazz); + if (~pos) { + curClasses.splice(pos, 1); + } + } + + finalValue = curClasses.join(" "); + if (className != finalValue) { + elem.className.baseVal = finalValue; + } + } + return this; + }; + /*\ + * Element.hasClass + [ method ] + ** + * Checks if the element has a given class name in the list of class names applied to it. + - value (string) class name + ** + = (boolean) `true` if the element has given class + \*/ + elproto.hasClass = function (value) { + var elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || []; + return !!~curClasses.indexOf(value); + }; + /*\ + * Element.toggleClass + [ method ] + ** + * Add or remove one or more classes from the element, depending on either + * the class’s presence or the value of the `flag` argument. + - value (string) class name or space separated list of class names + - flag (boolean) value to determine whether the class should be added or removed + ** + = (Element) original element. + \*/ + elproto.toggleClass = function (value, flag) { + if (flag != null) { + if (flag) { + return this.addClass(value); + } else { + return this.removeClass(value); + } + } + var classes = (value || "").match(rgNotSpace) || [], + elem = this.node, + className = elem.className.baseVal, + curClasses = className.match(rgNotSpace) || [], + j, + pos, + clazz, + finalValue; + j = 0; + while ((clazz = classes[j++])) { + pos = curClasses.indexOf(clazz); + if (~pos) { + curClasses.splice(pos, 1); + } else { + curClasses.push(clazz); + } + } + + finalValue = curClasses.join(" "); + if (className != finalValue) { + elem.className.baseVal = finalValue; + } + return this; + }; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var operators = { + "+": function (x, y) { + return x + y; + }, + "-": function (x, y) { + return x - y; + }, + "/": function (x, y) { + return x / y; + }, + "*": function (x, y) { + return x * y; + } + }, + Str = String, + reUnit = /[a-z]+$/i, + reAddon = /^\s*([+\-\/*])\s*=\s*([\d.eE+\-]+)\s*([^\d\s]+)?\s*$/; + function getNumber(val) { + return val; + } + function getUnit(unit) { + return function (val) { + return +val.toFixed(3) + unit; + }; + } + eve.on("snap.util.attr", function (val) { + var plus = Str(val).match(reAddon); + if (plus) { + var evnt = eve.nt(), + name = evnt.substring(evnt.lastIndexOf(".") + 1), + a = this.attr(name), + atr = {}; + eve.stop(); + var unit = plus[3] || "", + aUnit = a.match(reUnit), + op = operators[plus[1]]; + if (aUnit && aUnit == unit) { + val = op(parseFloat(a), +plus[2]); + } else { + a = this.asPX(name); + val = op(this.asPX(name), this.asPX(name, plus[2] + unit)); + } + if (isNaN(a) || isNaN(val)) { + return; + } + atr[name] = val; + this.attr(atr); + } + })(-10); + eve.on("snap.util.equal", function (name, b) { + var A, B, a = Str(this.attr(name) || ""), + el = this, + bplus = Str(b).match(reAddon); + if (bplus) { + eve.stop(); + var unit = bplus[3] || "", + aUnit = a.match(reUnit), + op = operators[bplus[1]]; + if (aUnit && aUnit == unit) { + return { + from: parseFloat(a), + to: op(parseFloat(a), +bplus[2]), + f: getUnit(aUnit) + }; + } else { + a = this.asPX(name); + return { + from: a, + to: op(a, this.asPX(name, bplus[2] + unit)), + f: getNumber + }; + } + } + })(-10); +}); +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var proto = Paper.prototype, + is = Snap.is; + /*\ + * Paper.rect + [ method ] + * + * Draws a rectangle + ** + - x (number) x coordinate of the top left corner + - y (number) y coordinate of the top left corner + - width (number) width + - height (number) height + - rx (number) #optional horizontal radius for rounded corners, default is 0 + - ry (number) #optional vertical radius for rounded corners, default is rx or 0 + = (object) the `rect` element + ** + > Usage + | // regular rectangle + | var c = paper.rect(10, 10, 50, 50); + | // rectangle with rounded corners + | var c = paper.rect(40, 40, 50, 50, 10); + \*/ + proto.rect = function (x, y, w, h, rx, ry) { + var attr; + if (ry == null) { + ry = rx; + } + if (is(x, "object") && x == "[object Object]") { + attr = x; + } else if (x != null) { + attr = { + x: x, + y: y, + width: w, + height: h + }; + if (rx != null) { + attr.rx = rx; + attr.ry = ry; + } + } + return this.el("rect", attr); + }; + /*\ + * Paper.circle + [ method ] + ** + * Draws a circle + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - r (number) radius + = (object) the `circle` element + ** + > Usage + | var c = paper.circle(50, 50, 40); + \*/ + proto.circle = function (cx, cy, r) { + var attr; + if (is(cx, "object") && cx == "[object Object]") { + attr = cx; + } else if (cx != null) { + attr = { + cx: cx, + cy: cy, + r: r + }; + } + return this.el("circle", attr); + }; + + var preload = (function () { + function onerror() { + this.parentNode.removeChild(this); + } + return function (src, f) { + var img = glob.doc.createElement("img"), + body = glob.doc.body; + img.style.cssText = "position:absolute;left:-9999em;top:-9999em"; + img.onload = function () { + f.call(img); + img.onload = img.onerror = null; + body.removeChild(img); + }; + img.onerror = onerror; + body.appendChild(img); + img.src = src; + }; + }()); + + /*\ + * Paper.image + [ method ] + ** + * Places an image on the surface + ** + - src (string) URI of the source image + - x (number) x offset position + - y (number) y offset position + - width (number) width of the image + - height (number) height of the image + = (object) the `image` element + * or + = (object) Snap element object with type `image` + ** + > Usage + | var c = paper.image("apple.png", 10, 10, 80, 80); + \*/ + proto.image = function (src, x, y, width, height) { + var el = this.el("image"); + if (is(src, "object") && "src" in src) { + el.attr(src); + } else if (src != null) { + var set = { + "xlink:href": src, + preserveAspectRatio: "none" + }; + if (x != null && y != null) { + set.x = x; + set.y = y; + } + if (width != null && height != null) { + set.width = width; + set.height = height; + } else { + preload(src, function () { + Snap._.$(el.node, { + width: this.offsetWidth, + height: this.offsetHeight + }); + }); + } + Snap._.$(el.node, set); + } + return el; + }; + /*\ + * Paper.ellipse + [ method ] + ** + * Draws an ellipse + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - rx (number) horizontal radius + - ry (number) vertical radius + = (object) the `ellipse` element + ** + > Usage + | var c = paper.ellipse(50, 50, 40, 20); + \*/ + proto.ellipse = function (cx, cy, rx, ry) { + var attr; + if (is(cx, "object") && cx == "[object Object]") { + attr = cx; + } else if (cx != null) { + attr ={ + cx: cx, + cy: cy, + rx: rx, + ry: ry + }; + } + return this.el("ellipse", attr); + }; + // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier. + /*\ + * Paper.path + [ method ] + ** + * Creates a `` element using the given string as the path's definition + - pathString (string) #optional path string in SVG format + * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example: + | "M10,20L30,40" + * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates. + * + #

    Here is short list of commands available, for more details see SVG path string format or article about path strings at MDN.

    + # + # + # + # + # + # + # + # + # + # + # + #
    CommandNameParameters
    Mmoveto(x y)+
    Zclosepath(none)
    Llineto(x y)+
    Hhorizontal linetox+
    Vvertical linetoy+
    Ccurveto(x1 y1 x2 y2 x y)+
    Ssmooth curveto(x2 y2 x y)+
    Qquadratic Bézier curveto(x1 y1 x y)+
    Tsmooth quadratic Bézier curveto(x y)+
    Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
    RCatmull-Rom curveto*x1 y1 (x y)+
    + * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier. + * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point. + > Usage + | var c = paper.path("M10 10L90 90"); + | // draw a diagonal line: + | // move to 10,10, line to 90,90 + \*/ + proto.path = function (d) { + var attr; + if (is(d, "object") && !is(d, "array")) { + attr = d; + } else if (d) { + attr = {d: d}; + } + return this.el("path", attr); + }; + /*\ + * Paper.g + [ method ] + ** + * Creates a group element + ** + - varargs (…) #optional elements to nest within the group + = (object) the `g` element + ** + > Usage + | var c1 = paper.circle(), + | c2 = paper.rect(), + | g = paper.g(c2, c1); // note that the order of elements is different + * or + | var c1 = paper.circle(), + | c2 = paper.rect(), + | g = paper.g(); + | g.add(c2, c1); + \*/ + /*\ + * Paper.group + [ method ] + ** + * See @Paper.g + \*/ + proto.group = proto.g = function (first) { + var attr, + el = this.el("g"); + if (arguments.length == 1 && first && !first.type) { + el.attr(first); + } else if (arguments.length) { + el.add(Array.prototype.slice.call(arguments, 0)); + } + return el; + }; + /*\ + * Paper.svg + [ method ] + ** + * Creates a nested SVG element. + - x (number) @optional X of the element + - y (number) @optional Y of the element + - width (number) @optional width of the element + - height (number) @optional height of the element + - vbx (number) @optional viewbox X + - vby (number) @optional viewbox Y + - vbw (number) @optional viewbox width + - vbh (number) @optional viewbox height + ** + = (object) the `svg` element + ** + \*/ + proto.svg = function (x, y, width, height, vbx, vby, vbw, vbh) { + var attrs = {}; + if (is(x, "object") && y == null) { + attrs = x; + } else { + if (x != null) { + attrs.x = x; + } + if (y != null) { + attrs.y = y; + } + if (width != null) { + attrs.width = width; + } + if (height != null) { + attrs.height = height; + } + if (vbx != null && vby != null && vbw != null && vbh != null) { + attrs.viewBox = [vbx, vby, vbw, vbh]; + } + } + return this.el("svg", attrs); + }; + /*\ + * Paper.mask + [ method ] + ** + * Equivalent in behaviour to @Paper.g, except it’s a mask. + ** + = (object) the `mask` element + ** + \*/ + proto.mask = function (first) { + var attr, + el = this.el("mask"); + if (arguments.length == 1 && first && !first.type) { + el.attr(first); + } else if (arguments.length) { + el.add(Array.prototype.slice.call(arguments, 0)); + } + return el; + }; + /*\ + * Paper.ptrn + [ method ] + ** + * Equivalent in behaviour to @Paper.g, except it’s a pattern. + - x (number) @optional X of the element + - y (number) @optional Y of the element + - width (number) @optional width of the element + - height (number) @optional height of the element + - vbx (number) @optional viewbox X + - vby (number) @optional viewbox Y + - vbw (number) @optional viewbox width + - vbh (number) @optional viewbox height + ** + = (object) the `pattern` element + ** + \*/ + proto.ptrn = function (x, y, width, height, vx, vy, vw, vh) { + if (is(x, "object")) { + var attr = x; + } else { + attr = {patternUnits: "userSpaceOnUse"}; + if (x) { + attr.x = x; + } + if (y) { + attr.y = y; + } + if (width != null) { + attr.width = width; + } + if (height != null) { + attr.height = height; + } + if (vx != null && vy != null && vw != null && vh != null) { + attr.viewBox = [vx, vy, vw, vh]; + } else { + attr.viewBox = [x || 0, y || 0, width || 0, height || 0]; + } + } + return this.el("pattern", attr); + }; + /*\ + * Paper.use + [ method ] + ** + * Creates a element. + - id (string) @optional id of element to link + * or + - id (Element) @optional element to link + ** + = (object) the `use` element + ** + \*/ + proto.use = function (id) { + if (id != null) { + if (id instanceof Element) { + if (!id.attr("id")) { + id.attr({id: Snap._.id(id)}); + } + id = id.attr("id"); + } + if (String(id).charAt() == "#") { + id = id.substring(1); + } + return this.el("use", {"xlink:href": "#" + id}); + } else { + return Element.prototype.use.call(this); + } + }; + /*\ + * Paper.symbol + [ method ] + ** + * Creates a element. + - vbx (number) @optional viewbox X + - vby (number) @optional viewbox Y + - vbw (number) @optional viewbox width + - vbh (number) @optional viewbox height + = (object) the `symbol` element + ** + \*/ + proto.symbol = function (vx, vy, vw, vh) { + var attr = {}; + if (vx != null && vy != null && vw != null && vh != null) { + attr.viewBox = [vx, vy, vw, vh]; + } + + return this.el("symbol", attr); + }; + /*\ + * Paper.text + [ method ] + ** + * Draws a text string + ** + - x (number) x coordinate position + - y (number) y coordinate position + - text (string|array) The text string to draw or array of strings to nest within separate `` elements + = (object) the `text` element + ** + > Usage + | var t1 = paper.text(50, 50, "Snap"); + | var t2 = paper.text(50, 50, ["S","n","a","p"]); + | // Text path usage + | t1.attr({textpath: "M10,10L100,100"}); + | // or + | var pth = paper.path("M10,10L100,100"); + | t1.attr({textpath: pth}); + \*/ + proto.text = function (x, y, text) { + var attr = {}; + if (is(x, "object")) { + attr = x; + } else if (x != null) { + attr = { + x: x, + y: y, + text: text || "" + }; + } + return this.el("text", attr); + }; + /*\ + * Paper.line + [ method ] + ** + * Draws a line + ** + - x1 (number) x coordinate position of the start + - y1 (number) y coordinate position of the start + - x2 (number) x coordinate position of the end + - y2 (number) y coordinate position of the end + = (object) the `line` element + ** + > Usage + | var t1 = paper.line(50, 50, 100, 100); + \*/ + proto.line = function (x1, y1, x2, y2) { + var attr = {}; + if (is(x1, "object")) { + attr = x1; + } else if (x1 != null) { + attr = { + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + } + return this.el("line", attr); + }; + /*\ + * Paper.polyline + [ method ] + ** + * Draws a polyline + ** + - points (array) array of points + * or + - varargs (…) points + = (object) the `polyline` element + ** + > Usage + | var p1 = paper.polyline([10, 10, 100, 100]); + | var p2 = paper.polyline(10, 10, 100, 100); + \*/ + proto.polyline = function (points) { + if (arguments.length > 1) { + points = Array.prototype.slice.call(arguments, 0); + } + var attr = {}; + if (is(points, "object") && !is(points, "array")) { + attr = points; + } else if (points != null) { + attr = {points: points}; + } + return this.el("polyline", attr); + }; + /*\ + * Paper.polygon + [ method ] + ** + * Draws a polygon. See @Paper.polyline + \*/ + proto.polygon = function (points) { + if (arguments.length > 1) { + points = Array.prototype.slice.call(arguments, 0); + } + var attr = {}; + if (is(points, "object") && !is(points, "array")) { + attr = points; + } else if (points != null) { + attr = {points: points}; + } + return this.el("polygon", attr); + }; + // gradients + (function () { + var $ = Snap._.$; + // gradients' helpers + function Gstops() { + return this.selectAll("stop"); + } + function GaddStop(color, offset) { + var stop = $("stop"), + attr = { + offset: +offset + "%" + }; + color = Snap.color(color); + attr["stop-color"] = color.hex; + if (color.opacity < 1) { + attr["stop-opacity"] = color.opacity; + } + $(stop, attr); + this.node.appendChild(stop); + return this; + } + function GgetBBox() { + if (this.type == "linearGradient") { + var x1 = $(this.node, "x1") || 0, + x2 = $(this.node, "x2") || 1, + y1 = $(this.node, "y1") || 0, + y2 = $(this.node, "y2") || 0; + return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1)); + } else { + var cx = this.node.cx || .5, + cy = this.node.cy || .5, + r = this.node.r || 0; + return Snap._.box(cx - r, cy - r, r * 2, r * 2); + } + } + function gradient(defs, str) { + var grad = eve("snap.util.grad.parse", null, str).firstDefined(), + el; + if (!grad) { + return null; + } + grad.params.unshift(defs); + if (grad.type.toLowerCase() == "l") { + el = gradientLinear.apply(0, grad.params); + } else { + el = gradientRadial.apply(0, grad.params); + } + if (grad.type != grad.type.toLowerCase()) { + $(el.node, { + gradientUnits: "userSpaceOnUse" + }); + } + var stops = grad.stops, + len = stops.length, + start = 0, + j = 0; + function seed(i, end) { + var step = (end - start) / (i - j); + for (var k = j; k < i; k++) { + stops[k].offset = +(+start + step * (k - j)).toFixed(2); + } + j = i; + start = end; + } + len--; + for (var i = 0; i < len; i++) if ("offset" in stops[i]) { + seed(i, stops[i].offset); + } + stops[len].offset = stops[len].offset || 100; + seed(len, stops[len].offset); + for (i = 0; i <= len; i++) { + var stop = stops[i]; + el.addStop(stop.color, stop.offset); + } + return el; + } + function gradientLinear(defs, x1, y1, x2, y2) { + var el = Snap._.make("linearGradient", defs); + el.stops = Gstops; + el.addStop = GaddStop; + el.getBBox = GgetBBox; + if (x1 != null) { + $(el.node, { + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }); + } + return el; + } + function gradientRadial(defs, cx, cy, r, fx, fy) { + var el = Snap._.make("radialGradient", defs); + el.stops = Gstops; + el.addStop = GaddStop; + el.getBBox = GgetBBox; + if (cx != null) { + $(el.node, { + cx: cx, + cy: cy, + r: r + }); + } + if (fx != null && fy != null) { + $(el.node, { + fx: fx, + fy: fy + }); + } + return el; + } + /*\ + * Paper.gradient + [ method ] + ** + * Creates a gradient element + ** + - gradient (string) gradient descriptor + > Gradient Descriptor + * The gradient descriptor is an expression formatted as + * follows: `()`. The `` can be + * either linear or radial. The uppercase `L` or `R` letters + * indicate absolute coordinates offset from the SVG surface. + * Lowercase `l` or `r` letters indicate coordinates + * calculated relative to the element to which the gradient is + * applied. Coordinates specify a linear gradient vector as + * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`, + * `r` and optional `fx`, `fy` specifying a focal point away + * from the center of the circle. Specify `` as a list + * of dash-separated CSS color values. Each color may be + * followed by a custom offset value, separated with a colon + * character. + > Examples + * Linear gradient, relative from top-left corner to bottom-right + * corner, from black through red to white: + | var g = paper.gradient("l(0, 0, 1, 1)#000-#f00-#fff"); + * Linear gradient, absolute from (0, 0) to (100, 100), from black + * through red at 25% to white: + | var g = paper.gradient("L(0, 0, 100, 100)#000-#f00:25-#fff"); + * Radial gradient, relative from the center of the element with radius + * half the width, from black to white: + | var g = paper.gradient("r(0.5, 0.5, 0.5)#000-#fff"); + * To apply the gradient: + | paper.circle(50, 50, 40).attr({ + | fill: g + | }); + = (object) the `gradient` element + \*/ + proto.gradient = function (str) { + return gradient(this.defs, str); + }; + proto.gradientLinear = function (x1, y1, x2, y2) { + return gradientLinear(this.defs, x1, y1, x2, y2); + }; + proto.gradientRadial = function (cx, cy, r, fx, fy) { + return gradientRadial(this.defs, cx, cy, r, fx, fy); + }; + /*\ + * Paper.toString + [ method ] + ** + * Returns SVG code for the @Paper + = (string) SVG code for the @Paper + \*/ + proto.toString = function () { + var doc = this.node.ownerDocument, + f = doc.createDocumentFragment(), + d = doc.createElement("div"), + svg = this.node.cloneNode(true), + res; + f.appendChild(d); + d.appendChild(svg); + Snap._.$(svg, {xmlns: "http://www.w3.org/2000/svg"}); + res = d.innerHTML; + f.removeChild(f.firstChild); + return res; + }; + /*\ + * Paper.toDataURL + [ method ] + ** + * Returns SVG code for the @Paper as Data URI string. + = (string) Data URI string + \*/ + proto.toDataURL = function () { + if (window && window.btoa) { + return "data:image/svg+xml;base64," + btoa(unescape(encodeURIComponent(this))); + } + }; + /*\ + * Paper.clear + [ method ] + ** + * Removes all child nodes of the paper, except . + \*/ + proto.clear = function () { + var node = this.node.firstChild, + next; + while (node) { + next = node.nextSibling; + if (node.tagName != "defs") { + node.parentNode.removeChild(node); + } else { + proto.clear.call({node: node}); + } + node = next; + } + }; + }()); +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob) { + var elproto = Element.prototype, + is = Snap.is, + clone = Snap._.clone, + has = "hasOwnProperty", + p2s = /,?([a-z]),?/gi, + toFloat = parseFloat, + math = Math, + PI = math.PI, + mmin = math.min, + mmax = math.max, + pow = math.pow, + abs = math.abs; + function paths(ps) { + var p = paths.ps = paths.ps || {}; + if (p[ps]) { + p[ps].sleep = 100; + } else { + p[ps] = { + sleep: 100 + }; + } + setTimeout(function () { + for (var key in p) if (p[has](key) && key != ps) { + p[key].sleep--; + !p[key].sleep && delete p[key]; + } + }); + return p[ps]; + } + function box(x, y, width, height) { + if (x == null) { + x = y = width = height = 0; + } + if (y == null) { + y = x.y; + width = x.width; + height = x.height; + x = x.x; + } + return { + x: x, + y: y, + width: width, + w: width, + height: height, + h: height, + x2: x + width, + y2: y + height, + cx: x + width / 2, + cy: y + height / 2, + r1: math.min(width, height) / 2, + r2: math.max(width, height) / 2, + r0: math.sqrt(width * width + height * height) / 2, + path: rectPath(x, y, width, height), + vb: [x, y, width, height].join(" ") + }; + } + function toString() { + return this.join(",").replace(p2s, "$1"); + } + function pathClone(pathArray) { + var res = clone(pathArray); + res.toString = toString; + return res; + } + function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + if (length == null) { + return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + } else { + return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, + getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length)); + } + } + function getLengthFactory(istotal, subpath) { + function O(val) { + return +(+val).toFixed(3); + } + return Snap._.cacher(function (path, length, onlystart) { + if (path instanceof Element) { + path = path.attr("d"); + } + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += [ + "C" + O(point.start.x), + O(point.start.y), + O(point.m.x), + O(point.m.y), + O(point.x), + O(point.y) + ]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = [ + "M" + O(point.x), + O(point.y) + "C" + O(point.n.x), + O(point.n.y), + O(point.end.x), + O(point.end.y), + O(p[5]), + O(p[6]) + ].join(); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return point; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p.shift() + p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1); + return point; + }, null, Snap._.clone); + } + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, + alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); + // (mx > nx || my < ny) && (alpha += 180); + return { + x: x, + y: y, + m: {x: mx, y: my}, + n: {x: nx, y: ny}, + start: {x: ax, y: ay}, + end: {x: cx, y: cy}, + alpha: alpha + }; + } + function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + if (!Snap.is(p1x, "array")) { + p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y]; + } + var bbox = curveDim.apply(null, p1x); + return box( + bbox.min.x, + bbox.min.y, + bbox.max.x - bbox.min.x, + bbox.max.y - bbox.min.y + ); + } + function isPointInsideBBox(bbox, x, y) { + return x >= bbox.x && + x <= bbox.x + bbox.width && + y >= bbox.y && + y <= bbox.y + bbox.height; + } + function isBBoxIntersect(bbox1, bbox2) { + bbox1 = box(bbox1); + bbox2 = box(bbox2); + return isPointInsideBBox(bbox2, bbox1.x, bbox1.y) + || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y) + || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2) + || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2) + || isPointInsideBBox(bbox1, bbox2.x, bbox2.y) + || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y) + || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2) + || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2) + || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x + || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x) + && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y + || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y); + } + function base3(t, p1, p2, p3, p4) { + var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4, + t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; + return t * t2 - 3 * p1 + 3 * p2; + } + function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) { + if (z == null) { + z = 1; + } + z = z > 1 ? 1 : z < 0 ? 0 : z; + var z2 = z / 2, + n = 12, + Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816], + Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472], + sum = 0; + for (var i = 0; i < n; i++) { + var ct = z2 * Tvalues[i] + z2, + xbase = base3(ct, x1, x2, x3, x4), + ybase = base3(ct, y1, y2, y3, y4), + comb = xbase * xbase + ybase * ybase; + sum += Cvalues[i] * math.sqrt(comb); + } + return z2 * sum; + } + function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) { + if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) { + return; + } + var t = 1, + step = t / 2, + t2 = t - step, + l, + e = .01; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + while (abs(l - ll) > e) { + step /= 2; + t2 += (l < ll ? 1 : -1) * step; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + } + return t2; + } + function intersect(x1, y1, x2, y2, x3, y3, x4, y4) { + if ( + mmax(x1, x2) < mmin(x3, x4) || + mmin(x1, x2) > mmax(x3, x4) || + mmax(y1, y2) < mmin(y3, y4) || + mmin(y1, y2) > mmax(y3, y4) + ) { + return; + } + var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4), + ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4), + denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); + + if (!denominator) { + return; + } + var px = nx / denominator, + py = ny / denominator, + px2 = +px.toFixed(2), + py2 = +py.toFixed(2); + if ( + px2 < +mmin(x1, x2).toFixed(2) || + px2 > +mmax(x1, x2).toFixed(2) || + px2 < +mmin(x3, x4).toFixed(2) || + px2 > +mmax(x3, x4).toFixed(2) || + py2 < +mmin(y1, y2).toFixed(2) || + py2 > +mmax(y1, y2).toFixed(2) || + py2 < +mmin(y3, y4).toFixed(2) || + py2 > +mmax(y3, y4).toFixed(2) + ) { + return; + } + return {x: px, y: py}; + } + function inter(bez1, bez2) { + return interHelper(bez1, bez2); + } + function interCount(bez1, bez2) { + return interHelper(bez1, bez2, 1); + } + function interHelper(bez1, bez2, justCount) { + var bbox1 = bezierBBox(bez1), + bbox2 = bezierBBox(bez2); + if (!isBBoxIntersect(bbox1, bbox2)) { + return justCount ? 0 : []; + } + var l1 = bezlen.apply(0, bez1), + l2 = bezlen.apply(0, bez2), + n1 = ~~(l1 / 8), + n2 = ~~(l2 / 8), + dots1 = [], + dots2 = [], + xy = {}, + res = justCount ? 0 : []; + for (var i = 0; i < n1 + 1; i++) { + var p = findDotsAtSegment.apply(0, bez1.concat(i / n1)); + dots1.push({x: p.x, y: p.y, t: i / n1}); + } + for (i = 0; i < n2 + 1; i++) { + p = findDotsAtSegment.apply(0, bez2.concat(i / n2)); + dots2.push({x: p.x, y: p.y, t: i / n2}); + } + for (i = 0; i < n1; i++) { + for (var j = 0; j < n2; j++) { + var di = dots1[i], + di1 = dots1[i + 1], + dj = dots2[j], + dj1 = dots2[j + 1], + ci = abs(di1.x - di.x) < .001 ? "y" : "x", + cj = abs(dj1.x - dj.x) < .001 ? "y" : "x", + is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y); + if (is) { + if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) { + continue; + } + xy[is.x.toFixed(4)] = is.y.toFixed(4); + var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t), + t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t); + if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) { + if (justCount) { + res++; + } else { + res.push({ + x: is.x, + y: is.y, + t1: t1, + t2: t2 + }); + } + } + } + } + } + return res; + } + function pathIntersection(path1, path2) { + return interPathHelper(path1, path2); + } + function pathIntersectionNumber(path1, path2) { + return interPathHelper(path1, path2, 1); + } + function interPathHelper(path1, path2, justCount) { + path1 = path2curve(path1); + path2 = path2curve(path2); + var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2, + res = justCount ? 0 : []; + for (var i = 0, ii = path1.length; i < ii; i++) { + var pi = path1[i]; + if (pi[0] == "M") { + x1 = x1m = pi[1]; + y1 = y1m = pi[2]; + } else { + if (pi[0] == "C") { + bez1 = [x1, y1].concat(pi.slice(1)); + x1 = bez1[6]; + y1 = bez1[7]; + } else { + bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m]; + x1 = x1m; + y1 = y1m; + } + for (var j = 0, jj = path2.length; j < jj; j++) { + var pj = path2[j]; + if (pj[0] == "M") { + x2 = x2m = pj[1]; + y2 = y2m = pj[2]; + } else { + if (pj[0] == "C") { + bez2 = [x2, y2].concat(pj.slice(1)); + x2 = bez2[6]; + y2 = bez2[7]; + } else { + bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m]; + x2 = x2m; + y2 = y2m; + } + var intr = interHelper(bez1, bez2, justCount); + if (justCount) { + res += intr; + } else { + for (var k = 0, kk = intr.length; k < kk; k++) { + intr[k].segment1 = i; + intr[k].segment2 = j; + intr[k].bez1 = bez1; + intr[k].bez2 = bez2; + } + res = res.concat(intr); + } + } + } + } + } + return res; + } + function isPointInsidePath(path, x, y) { + var bbox = pathBBox(path); + return isPointInsideBBox(bbox, x, y) && + interPathHelper(path, [["M", x, y], ["H", bbox.x2 + 10]], 1) % 2 == 1; + } + function pathBBox(path) { + var pth = paths(path); + if (pth.bbox) { + return clone(pth.bbox); + } + if (!path) { + return box(); + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X.push(x); + Y.push(y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X.concat(dim.min.x, dim.max.x); + Y = Y.concat(dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin.apply(0, X), + ymin = mmin.apply(0, Y), + xmax = mmax.apply(0, X), + ymax = mmax.apply(0, Y), + bb = box(xmin, ymin, xmax - xmin, ymax - ymin); + pth.bbox = clone(bb); + return bb; + } + function rectPath(x, y, w, h, r) { + if (r) { + return [ + ["M", +x + (+r), y], + ["l", w - r * 2, 0], + ["a", r, r, 0, 0, 1, r, r], + ["l", 0, h - r * 2], + ["a", r, r, 0, 0, 1, -r, r], + ["l", r * 2 - w, 0], + ["a", r, r, 0, 0, 1, -r, -r], + ["l", 0, r * 2 - h], + ["a", r, r, 0, 0, 1, r, -r], + ["z"] + ]; + } + var res = [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]]; + res.toString = toString; + return res; + } + function ellipsePath(x, y, rx, ry, a) { + if (a == null && ry == null) { + ry = rx; + } + x = +x; + y = +y; + rx = +rx; + ry = +ry; + if (a != null) { + var rad = Math.PI / 180, + x1 = x + rx * Math.cos(-ry * rad), + x2 = x + rx * Math.cos(-a * rad), + y1 = y + rx * Math.sin(-ry * rad), + y2 = y + rx * Math.sin(-a * rad), + res = [["M", x1, y1], ["A", rx, rx, 0, +(a - ry > 180), 0, x2, y2]]; + } else { + res = [ + ["M", x, y], + ["m", 0, -ry], + ["a", rx, ry, 0, 1, 1, 0, 2 * ry], + ["a", rx, ry, 0, 1, 1, 0, -2 * ry], + ["z"] + ]; + } + res.toString = toString; + return res; + } + var unit2px = Snap._unit2px, + getPath = { + path: function (el) { + return el.attr("path"); + }, + circle: function (el) { + var attr = unit2px(el); + return ellipsePath(attr.cx, attr.cy, attr.r); + }, + ellipse: function (el) { + var attr = unit2px(el); + return ellipsePath(attr.cx || 0, attr.cy || 0, attr.rx, attr.ry); + }, + rect: function (el) { + var attr = unit2px(el); + return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height, attr.rx, attr.ry); + }, + image: function (el) { + var attr = unit2px(el); + return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height); + }, + line: function (el) { + return "M" + [el.attr("x1") || 0, el.attr("y1") || 0, el.attr("x2"), el.attr("y2")]; + }, + polyline: function (el) { + return "M" + el.attr("points"); + }, + polygon: function (el) { + return "M" + el.attr("points") + "z"; + }, + deflt: function (el) { + var bbox = el.node.getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + } + }; + function pathToRelative(pathArray) { + var pth = paths(pathArray), + lowerCase = String.prototype.toLowerCase; + if (pth.rel) { + return pathClone(pth.rel); + } + if (!Snap.is(pathArray, "array") || !Snap.is(pathArray && pathArray[0], "array")) { + pathArray = Snap.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res.push(["M", x, y]); + } + for (var i = start, ii = pathArray.length; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa.length; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa.length; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i].length; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res.toString = toString; + pth.rel = pathClone(res); + return res; + } + function pathToAbsolute(pathArray) { + var pth = paths(pathArray); + if (pth.abs) { + return pathClone(pth.abs); + } + if (!is(pathArray, "array") || !is(pathArray && pathArray[0], "array")) { // rough assumption + pathArray = Snap.parsePathString(pathArray); + } + if (!pathArray || !pathArray.length) { + return [["M", 0, 0]]; + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0, + pa0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + var crz = pathArray.length == 3 && + pathArray[0][0] == "M" && + pathArray[1][0].toUpperCase() == "R" && + pathArray[2][0].toUpperCase() == "Z"; + for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) { + res.push(r = []); + pa = pathArray[i]; + pa0 = pa[0]; + if (pa0 != pa0.toUpperCase()) { + r[0] = pa0.toUpperCase(); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +pa[6] + x; + r[7] = +pa[7] + y; + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "R": + var dots = [x, y].concat(pa.slice(1)); + for (var j = 2, jj = dots.length; j < jj; j++) { + dots[j] = +dots[j] + x; + dots[++j] = +dots[j] + y; + } + res.pop(); + res = res.concat(catmullRom2bezier(dots, crz)); + break; + case "O": + res.pop(); + dots = ellipsePath(x, y, pa[1], pa[2]); + dots.push(dots[0]); + res = res.concat(dots); + break; + case "U": + res.pop(); + res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3])); + r = ["U"].concat(res[res.length - 1].slice(-2)); + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (j = 1, jj = pa.length; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else if (pa0 == "R") { + dots = [x, y].concat(pa.slice(1)); + res.pop(); + res = res.concat(catmullRom2bezier(dots, crz)); + r = ["R"].concat(pa.slice(-2)); + } else if (pa0 == "O") { + res.pop(); + dots = ellipsePath(x, y, pa[1], pa[2]); + dots.push(dots[0]); + res = res.concat(dots); + } else if (pa0 == "U") { + res.pop(); + res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3])); + r = ["U"].concat(res[res.length - 1].slice(-2)); + } else { + for (var k = 0, kk = pa.length; k < kk; k++) { + r[k] = pa[k]; + } + } + pa0 = pa0.toUpperCase(); + if (pa0 != "O") { + switch (r[0]) { + case "Z": + x = +mx; + y = +my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = r[r.length - 2]; + my = r[r.length - 1]; + default: + x = r[r.length - 2]; + y = r[r.length - 1]; + } + } + } + res.toString = toString; + pth.abs = pathClone(res); + return res; + } + function l2c(x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + } + function q2c(x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + } + function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = Snap._.cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4].concat(res); + } else { + res = [m2, m3, m4].concat(res).join().split(","); + var newres = []; + for (var i = 0, ii = res.length; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + } + function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + } + + // Returns bounding box of cubic bezier curve. + // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + // Original version: NISHIO Hirokazu + // Modifications: https://github.com/timo22345 + function curveDim(x0, y0, x1, y1, x2, y2, x3, y3) { + var tvalues = [], + bounds = [[], []], + a, b, c, t, t1, t2, b2ac, sqrtb2ac; + for (var i = 0; i < 2; ++i) { + if (i == 0) { + b = 6 * x0 - 12 * x1 + 6 * x2; + a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; + c = 3 * x1 - 3 * x0; + } else { + b = 6 * y0 - 12 * y1 + 6 * y2; + a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; + c = 3 * y1 - 3 * y0; + } + if (abs(a) < 1e-12) { + if (abs(b) < 1e-12) { + continue; + } + t = -c / b; + if (0 < t && t < 1) { + tvalues.push(t); + } + continue; + } + b2ac = b * b - 4 * c * a; + sqrtb2ac = math.sqrt(b2ac); + if (b2ac < 0) { + continue; + } + t1 = (-b + sqrtb2ac) / (2 * a); + if (0 < t1 && t1 < 1) { + tvalues.push(t1); + } + t2 = (-b - sqrtb2ac) / (2 * a); + if (0 < t2 && t2 < 1) { + tvalues.push(t2); + } + } + + var x, y, j = tvalues.length, + jlen = j, + mt; + while (j--) { + t = tvalues[j]; + mt = 1 - t; + bounds[0][j] = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); + bounds[1][j] = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3); + } + + bounds[0][jlen] = x0; + bounds[1][jlen] = y0; + bounds[0][jlen + 1] = x3; + bounds[1][jlen + 1] = y3; + bounds[0].length = bounds[1].length = jlen + 2; + + + return { + min: {x: mmin.apply(0, bounds[0]), y: mmin.apply(0, bounds[1])}, + max: {x: mmax.apply(0, bounds[0]), y: mmax.apply(0, bounds[1])} + }; + } + + function path2curve(path, path2) { + var pth = !path2 && paths(path); + if (!path2 && pth.curve) { + return pathClone(pth.curve); + } + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d, pcom) { + var nx, ny; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in {T: 1, Q: 1}) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1)))); + break; + case "S": + if (pcom == "C" || pcom == "S") { // In "S" case we have to take into account, if the previous command is C/S. + nx = d.x * 2 - d.bx; // And reflect the previous + ny = d.y * 2 - d.by; // command's control point relative to the current point. + } + else { // or some else or nothing + nx = d.x; + ny = d.y; + } + path = ["C", nx, ny].concat(path.slice(1)); + break; + case "T": + if (pcom == "Q" || pcom == "T") { // In "T" case we have to take into account, if the previous command is Q/T. + d.qx = d.x * 2 - d.qx; // And make a reflection similar + d.qy = d.y * 2 - d.qy; // to case "S". + } + else { // or something else or nothing + d.qx = d.x; + d.qy = d.y; + } + path = ["C"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"].concat(l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"].concat(l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"].concat(l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"].concat(l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i].length > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi.length) { + pcoms1[i] = "A"; // if created multiple C:s, their original seg is saved + p2 && (pcoms2[i] = "A"); // the same as above + pp.splice(i++, 0, ["C"].concat(pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + pcoms1 = [], // path commands of original path p + pcoms2 = [], // path commands of original path p2 + pfirst = "", // temporary holder for original path command + pcom = ""; // holder for previous path command of original path + for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) { + p[i] && (pfirst = p[i][0]); // save current path command + + if (pfirst != "C") // C is not saved yet, because it may be result of conversion + { + pcoms1[i] = pfirst; // Save current path command + i && ( pcom = pcoms1[i - 1]); // Get previous path command pcom + } + p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath + + if (pcoms1[i] != "A" && pfirst == "C") pcoms1[i] = "C"; // A is the only command + // which may produce multiple C:s + // so we have to make sure that C is also C in original path + + fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1 + + if (p2) { // the same procedures is done to p2 + p2[i] && (pfirst = p2[i][0]); + if (pfirst != "C") { + pcoms2[i] = pfirst; + i && (pcom = pcoms2[i - 1]); + } + p2[i] = processPath(p2[i], attrs2, pcom); + + if (pcoms2[i] != "A" && pfirst == "C") { + pcoms2[i] = "C"; + } + + fixArc(p2, i); + } + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg.length, + seg2len = p2 && seg2.length; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + if (!p2) { + pth.curve = pathClone(p); + } + return p2 ? [p, p2] : p; + } + function mapPath(path, matrix) { + if (!matrix) { + return path; + } + var x, y, i, j, ii, jj, pathi; + path = path2curve(path); + for (i = 0, ii = path.length; i < ii; i++) { + pathi = path[i]; + for (j = 1, jj = pathi.length; j < jj; j += 2) { + x = matrix.x(pathi[j], pathi[j + 1]); + y = matrix.y(pathi[j], pathi[j + 1]); + pathi[j] = x; + pathi[j + 1] = y; + } + } + return path; + } + + // http://schepers.cc/getting-to-the-point + function catmullRom2bezier(crp, z) { + var d = []; + for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) { + var p = [ + {x: +crp[i - 2], y: +crp[i - 1]}, + {x: +crp[i], y: +crp[i + 1]}, + {x: +crp[i + 2], y: +crp[i + 3]}, + {x: +crp[i + 4], y: +crp[i + 5]} + ]; + if (z) { + if (!i) { + p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]}; + } else if (iLen - 4 == i) { + p[3] = {x: +crp[0], y: +crp[1]}; + } else if (iLen - 2 == i) { + p[2] = {x: +crp[0], y: +crp[1]}; + p[3] = {x: +crp[2], y: +crp[3]}; + } + } else { + if (iLen - 4 == i) { + p[3] = p[2]; + } else if (!i) { + p[0] = {x: +crp[i], y: +crp[i + 1]}; + } + } + d.push(["C", + (-p[0].x + 6 * p[1].x + p[2].x) / 6, + (-p[0].y + 6 * p[1].y + p[2].y) / 6, + (p[1].x + 6 * p[2].x - p[3].x) / 6, + (p[1].y + 6*p[2].y - p[3].y) / 6, + p[2].x, + p[2].y + ]); + } + + return d; + } + + // export + Snap.path = paths; + + /*\ + * Snap.path.getTotalLength + [ method ] + ** + * Returns the length of the given path in pixels + ** + - path (string) SVG path string + ** + = (number) length + \*/ + Snap.path.getTotalLength = getTotalLength; + /*\ + * Snap.path.getPointAtLength + [ method ] + ** + * Returns the coordinates of the point located at the given length along the given path + ** + - path (string) SVG path string + - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps + ** + = (object) representation of the point: + o { + o x: (number) x coordinate, + o y: (number) y coordinate, + o alpha: (number) angle of derivative + o } + \*/ + Snap.path.getPointAtLength = getPointAtLength; + /*\ + * Snap.path.getSubpath + [ method ] + ** + * Returns the subpath of a given path between given start and end lengths + ** + - path (string) SVG path string + - from (number) length, in pixels, from the start of the path to the start of the segment + - to (number) length, in pixels, from the start of the path to the end of the segment + ** + = (string) path string definition for the segment + \*/ + Snap.path.getSubpath = function (path, from, to) { + if (this.getTotalLength(path) - to < 1e-6) { + return getSubpathsAtLength(path, from).end; + } + var a = getSubpathsAtLength(path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + /*\ + * Element.getTotalLength + [ method ] + ** + * Returns the length of the path in pixels (only works for `path` elements) + = (number) length + \*/ + elproto.getTotalLength = function () { + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + }; + // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length? + /*\ + * Element.getPointAtLength + [ method ] + ** + * Returns coordinates of the point located at the given length on the given path (only works for `path` elements) + ** + - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps + ** + = (object) representation of the point: + o { + o x: (number) x coordinate, + o y: (number) y coordinate, + o alpha: (number) angle of derivative + o } + \*/ + elproto.getPointAtLength = function (length) { + return getPointAtLength(this.attr("d"), length); + }; + // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear. + /*\ + * Element.getSubpath + [ method ] + ** + * Returns subpath of a given element from given start and end lengths (only works for `path` elements) + ** + - from (number) length, in pixels, from the start of the path to the start of the segment + - to (number) length, in pixels, from the start of the path to the end of the segment + ** + = (string) path string definition for the segment + \*/ + elproto.getSubpath = function (from, to) { + return Snap.path.getSubpath(this.attr("d"), from, to); + }; + Snap._.box = box; + /*\ + * Snap.path.findDotsAtSegment + [ method ] + ** + * Utility method + ** + * Finds dot coordinates on the given cubic beziér curve at the given t + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + - t (number) position on the curve (0..1) + = (object) point information in format: + o { + o x: (number) x coordinate of the point, + o y: (number) y coordinate of the point, + o m: { + o x: (number) x coordinate of the left anchor, + o y: (number) y coordinate of the left anchor + o }, + o n: { + o x: (number) x coordinate of the right anchor, + o y: (number) y coordinate of the right anchor + o }, + o start: { + o x: (number) x coordinate of the start of the curve, + o y: (number) y coordinate of the start of the curve + o }, + o end: { + o x: (number) x coordinate of the end of the curve, + o y: (number) y coordinate of the end of the curve + o }, + o alpha: (number) angle of the curve derivative at the point + o } + \*/ + Snap.path.findDotsAtSegment = findDotsAtSegment; + /*\ + * Snap.path.bezierBBox + [ method ] + ** + * Utility method + ** + * Returns the bounding box of a given cubic beziér curve + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + * or + - bez (array) array of six points for beziér curve + = (object) bounding box + o { + o x: (number) x coordinate of the left top point of the box, + o y: (number) y coordinate of the left top point of the box, + o x2: (number) x coordinate of the right bottom point of the box, + o y2: (number) y coordinate of the right bottom point of the box, + o width: (number) width of the box, + o height: (number) height of the box + o } + \*/ + Snap.path.bezierBBox = bezierBBox; + /*\ + * Snap.path.isPointInsideBBox + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside bounding box + - bbox (string) bounding box + - x (string) x coordinate of the point + - y (string) y coordinate of the point + = (boolean) `true` if point is inside + \*/ + Snap.path.isPointInsideBBox = isPointInsideBBox; + Snap.closest = function (x, y, X, Y) { + var r = 100, + b = box(x - r / 2, y - r / 2, r, r), + inside = [], + getter = X[0].hasOwnProperty("x") ? function (i) { + return { + x: X[i].x, + y: X[i].y + }; + } : function (i) { + return { + x: X[i], + y: Y[i] + }; + }, + found = 0; + while (r <= 1e6 && !found) { + for (var i = 0, ii = X.length; i < ii; i++) { + var xy = getter(i); + if (isPointInsideBBox(b, xy.x, xy.y)) { + found++; + inside.push(xy); + break; + } + } + if (!found) { + r *= 2; + b = box(x - r / 2, y - r / 2, r, r) + } + } + if (r == 1e6) { + return; + } + var len = Infinity, + res; + for (i = 0, ii = inside.length; i < ii; i++) { + var l = Snap.len(x, y, inside[i].x, inside[i].y); + if (len > l) { + len = l; + inside[i].len = l; + res = inside[i]; + } + } + return res; + }; + /*\ + * Snap.path.isBBoxIntersect + [ method ] + ** + * Utility method + ** + * Returns `true` if two bounding boxes intersect + - bbox1 (string) first bounding box + - bbox2 (string) second bounding box + = (boolean) `true` if bounding boxes intersect + \*/ + Snap.path.isBBoxIntersect = isBBoxIntersect; + /*\ + * Snap.path.intersection + [ method ] + ** + * Utility method + ** + * Finds intersections of two paths + - path1 (string) path string + - path2 (string) path string + = (array) dots of intersection + o [ + o { + o x: (number) x coordinate of the point, + o y: (number) y coordinate of the point, + o t1: (number) t value for segment of path1, + o t2: (number) t value for segment of path2, + o segment1: (number) order number for segment of path1, + o segment2: (number) order number for segment of path2, + o bez1: (array) eight coordinates representing beziér curve for the segment of path1, + o bez2: (array) eight coordinates representing beziér curve for the segment of path2 + o } + o ] + \*/ + Snap.path.intersection = pathIntersection; + Snap.path.intersectionNumber = pathIntersectionNumber; + /*\ + * Snap.path.isPointInside + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside a given closed path. + * + * Note: fill mode doesn’t affect the result of this method. + - path (string) path string + - x (number) x of the point + - y (number) y of the point + = (boolean) `true` if point is inside the path + \*/ + Snap.path.isPointInside = isPointInsidePath; + /*\ + * Snap.path.getBBox + [ method ] + ** + * Utility method + ** + * Returns the bounding box of a given path + - path (string) path string + = (object) bounding box + o { + o x: (number) x coordinate of the left top point of the box, + o y: (number) y coordinate of the left top point of the box, + o x2: (number) x coordinate of the right bottom point of the box, + o y2: (number) y coordinate of the right bottom point of the box, + o width: (number) width of the box, + o height: (number) height of the box + o } + \*/ + Snap.path.getBBox = pathBBox; + Snap.path.get = getPath; + /*\ + * Snap.path.toRelative + [ method ] + ** + * Utility method + ** + * Converts path coordinates into relative values + - path (string) path string + = (array) path string + \*/ + Snap.path.toRelative = pathToRelative; + /*\ + * Snap.path.toAbsolute + [ method ] + ** + * Utility method + ** + * Converts path coordinates into absolute values + - path (string) path string + = (array) path string + \*/ + Snap.path.toAbsolute = pathToAbsolute; + /*\ + * Snap.path.toCubic + [ method ] + ** + * Utility method + ** + * Converts path to a new path where all segments are cubic beziér curves + - pathString (string|array) path string or array of segments + = (array) array of segments + \*/ + Snap.path.toCubic = path2curve; + /*\ + * Snap.path.map + [ method ] + ** + * Transform the path string with the given matrix + - path (string) path string + - matrix (object) see @Matrix + = (string) transformed path string + \*/ + Snap.path.map = mapPath; + Snap.path.toString = toString; + Snap.path.clone = pathClone; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob) { + var mmax = Math.max, + mmin = Math.min; + + // Set + var Set = function (items) { + this.items = []; + this.bindings = {}; + this.length = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items.length; i < ii; i++) { + if (items[i]) { + this[this.items.length] = this.items[this.items.length] = items[i]; + this.length++; + } + } + } + }, + setproto = Set.prototype; + /*\ + * Set.push + [ method ] + ** + * Adds each argument to the current set + = (object) original element + \*/ + setproto.push = function () { + var item, + len; + for (var i = 0, ii = arguments.length; i < ii; i++) { + item = arguments[i]; + if (item) { + len = this.items.length; + this[len] = this.items[len] = item; + this.length++; + } + } + return this; + }; + /*\ + * Set.pop + [ method ] + ** + * Removes last element and returns it + = (object) element + \*/ + setproto.pop = function () { + this.length && delete this[this.length--]; + return this.items.pop(); + }; + /*\ + * Set.forEach + [ method ] + ** + * Executes given function for each element in the set + * + * If the function returns `false`, the loop stops running. + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Set object + \*/ + setproto.forEach = function (callback, thisArg) { + for (var i = 0, ii = this.items.length; i < ii; i++) { + if (callback.call(thisArg, this.items[i], i) === false) { + return this; + } + } + return this; + }; + /*\ + * Set.animate + [ method ] + ** + * Animates each element in set in sync. + * + ** + - attrs (object) key-value pairs of destination attributes + - duration (number) duration of the animation in milliseconds + - easing (function) #optional easing function from @mina or custom + - callback (function) #optional callback function that executes when the animation ends + * or + - animation (array) array of animation parameter for each element in set in format `[attrs, duration, easing, callback]` + > Usage + | // animate all elements in set to radius 10 + | set.animate({r: 10}, 500, mina.easein); + | // or + | // animate first element to radius 10, but second to radius 20 and in different time + | set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]); + = (Element) the current element + \*/ + setproto.animate = function (attrs, ms, easing, callback) { + if (typeof easing == "function" && !easing.length) { + callback = easing; + easing = mina.linear; + } + if (attrs instanceof Snap._.Animation) { + callback = attrs.callback; + easing = attrs.easing; + ms = easing.dur; + attrs = attrs.attr; + } + var args = arguments; + if (Snap.is(attrs, "array") && Snap.is(args[args.length - 1], "array")) { + var each = true; + } + var begin, + handler = function () { + if (begin) { + this.b = begin; + } else { + begin = this.b; + } + }, + cb = 0, + set = this, + callbacker = callback && function () { + if (++cb == set.length) { + callback.call(this); + } + }; + return this.forEach(function (el, i) { + eve.once("snap.animcreated." + el.id, handler); + if (each) { + args[i] && el.animate.apply(el, args[i]); + } else { + el.animate(attrs, ms, easing, callbacker); + } + }); + }; + setproto.remove = function () { + while (this.length) { + this.pop().remove(); + } + return this; + }; + /*\ + * Set.bind + [ method ] + ** + * Specifies how to handle a specific attribute when applied + * to a set. + * + ** + - attr (string) attribute name + - callback (function) function to run + * or + - attr (string) attribute name + - element (Element) specific element in the set to apply the attribute to + * or + - attr (string) attribute name + - element (Element) specific element in the set to apply the attribute to + - eattr (string) attribute on the element to bind the attribute to + = (object) Set object + \*/ + setproto.bind = function (attr, a, b) { + var data = {}; + if (typeof a == "function") { + this.bindings[attr] = a; + } else { + var aname = b || attr; + this.bindings[attr] = function (v) { + data[aname] = v; + a.attr(data); + }; + } + return this; + }; + setproto.attr = function (value) { + var unbound = {}; + for (var k in value) { + if (this.bindings[k]) { + this.bindings[k](value[k]); + } else { + unbound[k] = value[k]; + } + } + for (var i = 0, ii = this.items.length; i < ii; i++) { + this.items[i].attr(unbound); + } + return this; + }; + /*\ + * Set.clear + [ method ] + ** + * Removes all elements from the set + \*/ + setproto.clear = function () { + while (this.length) { + this.pop(); + } + }; + /*\ + * Set.splice + [ method ] + ** + * Removes range of elements from the set + ** + - index (number) position of the deletion + - count (number) number of element to remove + - insertion… (object) #optional elements to insert + = (object) set elements that were deleted + \*/ + setproto.splice = function (index, count, insertion) { + index = index < 0 ? mmax(this.length + index, 0) : index; + count = mmax(0, mmin(this.length - index, count)); + var tail = [], + todel = [], + args = [], + i; + for (i = 2; i < arguments.length; i++) { + args.push(arguments[i]); + } + for (i = 0; i < count; i++) { + todel.push(this[index + i]); + } + for (; i < this.length - index; i++) { + tail.push(this[index + i]); + } + var arglen = args.length; + for (i = 0; i < arglen + tail.length; i++) { + this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen]; + } + i = this.items.length = this.length -= count - arglen; + while (this[i]) { + delete this[i++]; + } + return new Set(todel); + }; + /*\ + * Set.exclude + [ method ] + ** + * Removes given element from the set + ** + - element (object) element to remove + = (boolean) `true` if object was found and removed from the set + \*/ + setproto.exclude = function (el) { + for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) { + this.splice(i, 1); + return true; + } + return false; + }; + setproto.insertAfter = function (el) { + var i = this.items.length; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + setproto.getBBox = function () { + var x = [], + y = [], + x2 = [], + y2 = []; + for (var i = this.items.length; i--;) if (!this.items[i].removed) { + var box = this.items[i].getBBox(); + x.push(box.x); + y.push(box.y); + x2.push(box.x + box.width); + y2.push(box.y + box.height); + } + x = mmin.apply(0, x); + y = mmin.apply(0, y); + x2 = mmax.apply(0, x2); + y2 = mmax.apply(0, y2); + return { + x: x, + y: y, + x2: x2, + y2: y2, + width: x2 - x, + height: y2 - y, + cx: x + (x2 - x) / 2, + cy: y + (y2 - y) / 2 + }; + }; + setproto.clone = function (s) { + s = new Set; + for (var i = 0, ii = this.items.length; i < ii; i++) { + s.push(this.items[i].clone()); + } + return s; + }; + setproto.toString = function () { + return "Snap\u2018s set"; + }; + setproto.type = "set"; + // export + Snap.Set = Set; + Snap.set = function () { + var set = new Set; + if (arguments.length) { + set.push.apply(set, Array.prototype.slice.call(arguments, 0)); + } + return set; + }; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob) { + var names = {}, + reUnit = /[a-z]+$/i, + Str = String; + names.stroke = names.fill = "colour"; + function getEmpty(item) { + var l = item[0]; + switch (l.toLowerCase()) { + case "t": return [l, 0, 0]; + case "m": return [l, 1, 0, 0, 1, 0, 0]; + case "r": if (item.length == 4) { + return [l, 0, item[2], item[3]]; + } else { + return [l, 0]; + } + case "s": if (item.length == 5) { + return [l, 1, 1, item[3], item[4]]; + } else if (item.length == 3) { + return [l, 1, 1]; + } else { + return [l, 1]; + } + } + } + function equaliseTransform(t1, t2, getBBox) { + t2 = Str(t2).replace(/\.{3}|\u2026/g, t1); + t1 = Snap.parseTransformString(t1) || []; + t2 = Snap.parseTransformString(t2) || []; + var maxlength = Math.max(t1.length, t2.length), + from = [], + to = [], + i = 0, j, jj, + tt1, tt2; + for (; i < maxlength; i++) { + tt1 = t1[i] || getEmpty(t2[i]); + tt2 = t2[i] || getEmpty(tt1); + if ((tt1[0] != tt2[0]) || + (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) || + (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])) + ) { + t1 = Snap._.transform2matrix(t1, getBBox()); + t2 = Snap._.transform2matrix(t2, getBBox()); + from = [["m", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]]; + to = [["m", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]]; + break; + } + from[i] = []; + to[i] = []; + for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) { + j in tt1 && (from[i][j] = tt1[j]); + j in tt2 && (to[i][j] = tt2[j]); + } + } + return { + from: path2array(from), + to: path2array(to), + f: getPath(from) + }; + } + function getNumber(val) { + return val; + } + function getUnit(unit) { + return function (val) { + return +val.toFixed(3) + unit; + }; + } + function getViewBox(val) { + return val.join(" "); + } + function getColour(clr) { + return Snap.rgb(clr[0], clr[1], clr[2]); + } + function getPath(path) { + var k = 0, i, ii, j, jj, out, a, b = []; + for (i = 0, ii = path.length; i < ii; i++) { + out = "["; + a = ['"' + path[i][0] + '"']; + for (j = 1, jj = path[i].length; j < jj; j++) { + a[j] = "val[" + (k++) + "]"; + } + out += a + "]"; + b[i] = out; + } + return Function("val", "return Snap.path.toString.call([" + b + "])"); + } + function path2array(path) { + var out = []; + for (var i = 0, ii = path.length; i < ii; i++) { + for (var j = 1, jj = path[i].length; j < jj; j++) { + out.push(path[i][j]); + } + } + return out; + } + function isNumeric(obj) { + return isFinite(parseFloat(obj)); + } + function arrayEqual(arr1, arr2) { + if (!Snap.is(arr1, "array") || !Snap.is(arr2, "array")) { + return false; + } + return arr1.toString() == arr2.toString(); + } + Element.prototype.equal = function (name, b) { + return eve("snap.util.equal", this, name, b).firstDefined(); + }; + eve.on("snap.util.equal", function (name, b) { + var A, B, a = Str(this.attr(name) || ""), + el = this; + if (isNumeric(a) && isNumeric(b)) { + return { + from: parseFloat(a), + to: parseFloat(b), + f: getNumber + }; + } + if (names[name] == "colour") { + A = Snap.color(a); + B = Snap.color(b); + return { + from: [A.r, A.g, A.b, A.opacity], + to: [B.r, B.g, B.b, B.opacity], + f: getColour + }; + } + if (name == "viewBox") { + A = this.attr(name).vb.split(" ").map(Number); + B = b.split(" ").map(Number); + return { + from: A, + to: B, + f: getViewBox + }; + } + if (name == "transform" || name == "gradientTransform" || name == "patternTransform") { + if (b instanceof Snap.Matrix) { + b = b.toTransformString(); + } + if (!Snap._.rgTransform.test(b)) { + b = Snap._.svgTransform2string(b); + } + return equaliseTransform(a, b, function () { + return el.getBBox(1); + }); + } + if (name == "d" || name == "path") { + A = Snap.path.toCubic(a, b); + return { + from: path2array(A[0]), + to: path2array(A[1]), + f: getPath(A[0]) + }; + } + if (name == "points") { + A = Str(a).split(Snap._.separator); + B = Str(b).split(Snap._.separator); + return { + from: A, + to: B, + f: function (val) { return val; } + }; + } + var aUnit = a.match(reUnit), + bUnit = Str(b).match(reUnit); + if (aUnit && arrayEqual(aUnit, bUnit)) { + return { + from: parseFloat(a), + to: parseFloat(b), + f: getUnit(aUnit) + }; + } else { + return { + from: this.asPX(name), + to: this.asPX(name, b), + f: getNumber + }; + } + }); +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob) { + var elproto = Element.prototype, + has = "hasOwnProperty", + supportsTouch = "createTouch" in glob.doc, + events = [ + "click", "dblclick", "mousedown", "mousemove", "mouseout", + "mouseover", "mouseup", "touchstart", "touchmove", "touchend", + "touchcancel" + ], + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + getScroll = function (xy, el) { + var name = xy == "y" ? "scrollTop" : "scrollLeft", + doc = el && el.node ? el.node.ownerDocument : glob.doc; + return doc[name in doc.documentElement ? "documentElement" : "body"][name]; + }, + preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + addEvent = function (obj, type, fn, element) { + var realName = supportsTouch && touchMap[type] ? touchMap[type] : type, + f = function (e) { + var scrollY = getScroll("y", element), + scrollX = getScroll("x", element); + if (supportsTouch && touchMap[has](type)) { + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) { + var olde = e; + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + } + var x = e.clientX + scrollX, + y = e.clientY + scrollY; + return fn.call(element, e, x, y); + }; + + if (type !== realName) { + obj.addEventListener(type, f, false); + } + + obj.addEventListener(realName, f, false); + + return function () { + if (type !== realName) { + obj.removeEventListener(type, f, false); + } + + obj.removeEventListener(realName, f, false); + return true; + }; + }, + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = getScroll("y"), + scrollX = getScroll("x"), + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch) { + var i = e.touches && e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + var node = dragi.el.node, + o, + next = node.nextSibling, + parent = node.parentNode, + display = node.style.display; + // glob.win.opera && parent.removeChild(node); + // node.style.display = "none"; + // o = dragi.el.paper.getElementByPoint(x, y); + // node.style.display = display; + // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node)); + // o && eve("snap.drag.over." + dragi.el.id, dragi.el, o); + x += scrollX; + y += scrollY; + eve("snap.drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + Snap.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + eve("snap.drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + eve.off("snap.drag.*." + dragi.el.id); + } + drag = []; + }; + /*\ + * Element.click + [ method ] + ** + * Adds a click event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unclick + [ method ] + ** + * Removes a click event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.dblclick + [ method ] + ** + * Adds a double click event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.undblclick + [ method ] + ** + * Removes a double click event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousedown + [ method ] + ** + * Adds a mousedown event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousedown + [ method ] + ** + * Removes a mousedown event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousemove + [ method ] + ** + * Adds a mousemove event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousemove + [ method ] + ** + * Removes a mousemove event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseout + [ method ] + ** + * Adds a mouseout event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseout + [ method ] + ** + * Removes a mouseout event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseover + [ method ] + ** + * Adds a mouseover event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseover + [ method ] + ** + * Removes a mouseover event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseup + [ method ] + ** + * Adds a mouseup event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseup + [ method ] + ** + * Removes a mouseup event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchstart + [ method ] + ** + * Adds a touchstart event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchstart + [ method ] + ** + * Removes a touchstart event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchmove + [ method ] + ** + * Adds a touchmove event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchmove + [ method ] + ** + * Removes a touchmove event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchend + [ method ] + ** + * Adds a touchend event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchend + [ method ] + ** + * Removes a touchend event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchcancel + [ method ] + ** + * Adds a touchcancel event handler to the element + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchcancel + [ method ] + ** + * Removes a touchcancel event handler from the element + - handler (function) handler for the event + = (object) @Element + \*/ + for (var i = events.length; i--;) { + (function (eventName) { + Snap[eventName] = elproto[eventName] = function (fn, scope) { + if (Snap.is(fn, "function")) { + this.events = this.events || []; + this.events.push({ + name: eventName, + f: fn, + unbind: addEvent(this.node || document, eventName, fn, scope || this) + }); + } else { + for (var i = 0, ii = this.events.length; i < ii; i++) if (this.events[i].name == eventName) { + try { + this.events[i].f.call(this); + } catch (e) {} + } + } + return this; + }; + Snap["un" + eventName] = + elproto["un" + eventName] = function (fn) { + var events = this.events || [], + l = events.length; + while (l--) if (events[l].name == eventName && + (events[l].f == fn || !fn)) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + return this; + } + return this; + }; + })(events[i]); + } + /*\ + * Element.hover + [ method ] + ** + * Adds hover event handlers to the element + - f_in (function) handler for hover in + - f_out (function) handler for hover out + - icontext (object) #optional context for hover in handler + - ocontext (object) #optional context for hover out handler + = (object) @Element + \*/ + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + /*\ + * Element.unhover + [ method ] + ** + * Removes hover event handlers from the element + - f_in (function) handler for hover in + - f_out (function) handler for hover out + = (object) @Element + \*/ + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + var draggable = []; + // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture. + // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from? + // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason. + // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start. on start, drag.end. on end and drag.move. on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID? + /*\ + * Element.drag + [ method ] + ** + * Adds event handlers for an element's drag gesture + ** + - onmove (function) handler for moving + - onstart (function) handler for drag start + - onend (function) handler for drag end + - mcontext (object) #optional context for moving handler + - scontext (object) #optional context for drag start handler + - econtext (object) #optional context for drag end handler + * Additionaly following `drag` events are triggered: `drag.start.` on start, + * `drag.end.` on end and `drag.move.` on every move. When element is dragged over another element + * `drag.over.` fires as well. + * + * Start event and start handler are called in specified context or in context of the element with following parameters: + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * Move event and move handler are called in specified context or in context of the element with following parameters: + o dx (number) shift by x from the start point + o dy (number) shift by y from the start point + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * End event and end handler are called in specified context or in context of the element with following parameters: + o event (object) DOM event object + = (object) @Element + \*/ + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + var el = this; + if (!arguments.length) { + var origTransform; + return el.drag(function (dx, dy) { + this.attr({ + transform: origTransform + (origTransform ? "T" : "t") + [dx, dy] + }); + }, function () { + origTransform = this.transform().local; + }); + } + function start(e, x, y) { + (e.originalEvent || e).preventDefault(); + el._drag.x = x; + el._drag.y = y; + el._drag.id = e.identifier; + !drag.length && Snap.mousemove(dragMove).mouseup(dragUp); + drag.push({el: el, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + onstart && eve.on("snap.drag.start." + el.id, onstart); + onmove && eve.on("snap.drag.move." + el.id, onmove); + onend && eve.on("snap.drag.end." + el.id, onend); + eve("snap.drag.start." + el.id, start_scope || move_scope || el, x, y, e); + } + function init(e, x, y) { + eve("snap.draginit." + el.id, el, e, x, y); + } + eve.on("snap.draginit." + el.id, start); + el._drag = {}; + draggable.push({el: el, start: start, init: init}); + el.mousedown(init); + return el; + }; + /* + * Element.onDragOver + [ method ] + ** + * Shortcut to assign event handler for `drag.over.` event, where `id` is the element's `id` (see @Element.id) + - f (function) handler for event, first argument would be the element you are dragging over + \*/ + // elproto.onDragOver = function (f) { + // f ? eve.on("snap.drag.over." + this.id, f) : eve.unbind("snap.drag.over." + this.id); + // }; + /*\ + * Element.undrag + [ method ] + ** + * Removes all drag event handlers from the given element + \*/ + elproto.undrag = function () { + var i = draggable.length; + while (i--) if (draggable[i].el == this) { + this.unmousedown(draggable[i].init); + draggable.splice(i, 1); + eve.unbind("snap.drag.*." + this.id); + eve.unbind("snap.draginit." + this.id); + } + !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp); + return this; + }; +}); + +// Copyright (c) 2013 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob) { + var elproto = Element.prototype, + pproto = Paper.prototype, + rgurl = /^\s*url\((.+)\)/, + Str = String, + $ = Snap._.$; + Snap.filter = {}; + /*\ + * Paper.filter + [ method ] + ** + * Creates a `` element + ** + - filstr (string) SVG fragment of filter provided as a string + = (object) @Element + * Note: It is recommended to use filters embedded into the page inside an empty SVG element. + > Usage + | var f = paper.filter(''), + | c = paper.circle(10, 10, 10).attr({ + | filter: f + | }); + \*/ + pproto.filter = function (filstr) { + var paper = this; + if (paper.type != "svg") { + paper = paper.paper; + } + var f = Snap.parse(Str(filstr)), + id = Snap._.id(), + width = paper.node.offsetWidth, + height = paper.node.offsetHeight, + filter = $("filter"); + $(filter, { + id: id, + filterUnits: "userSpaceOnUse" + }); + filter.appendChild(f.node); + paper.defs.appendChild(filter); + return new Element(filter); + }; + + eve.on("snap.util.getattr.filter", function () { + eve.stop(); + var p = $(this.node, "filter"); + if (p) { + var match = Str(p).match(rgurl); + return match && Snap.select(match[1]); + } + }); + eve.on("snap.util.attr.filter", function (value) { + if (value instanceof Element && value.type == "filter") { + eve.stop(); + var id = value.node.id; + if (!id) { + $(value.node, {id: value.id}); + id = value.id; + } + $(this.node, { + filter: Snap.url(id) + }); + } + if (!value || value == "none") { + eve.stop(); + this.node.removeAttribute("filter"); + } + }); + /*\ + * Snap.filter.blur + [ method ] + ** + * Returns an SVG markup string for the blur filter + ** + - x (number) amount of horizontal blur, in pixels + - y (number) #optional amount of vertical blur, in pixels + = (string) filter representation + > Usage + | var f = paper.filter(Snap.filter.blur(5, 10)), + | c = paper.circle(10, 10, 10).attr({ + | filter: f + | }); + \*/ + Snap.filter.blur = function (x, y) { + if (x == null) { + x = 2; + } + var def = y == null ? x : [x, y]; + return Snap.format('\', { + def: def + }); + }; + Snap.filter.blur.toString = function () { + return this(); + }; + /*\ + * Snap.filter.shadow + [ method ] + ** + * Returns an SVG markup string for the shadow filter + ** + - dx (number) #optional horizontal shift of the shadow, in pixels + - dy (number) #optional vertical shift of the shadow, in pixels + - blur (number) #optional amount of blur + - color (string) #optional color of the shadow + - opacity (number) #optional `0..1` opacity of the shadow + * or + - dx (number) #optional horizontal shift of the shadow, in pixels + - dy (number) #optional vertical shift of the shadow, in pixels + - color (string) #optional color of the shadow + - opacity (number) #optional `0..1` opacity of the shadow + * which makes blur default to `4`. Or + - dx (number) #optional horizontal shift of the shadow, in pixels + - dy (number) #optional vertical shift of the shadow, in pixels + - opacity (number) #optional `0..1` opacity of the shadow + = (string) filter representation + > Usage + | var f = paper.filter(Snap.filter.shadow(0, 2, 3)), + | c = paper.circle(10, 10, 10).attr({ + | filter: f + | }); + \*/ + Snap.filter.shadow = function (dx, dy, blur, color, opacity) { + if (typeof blur == "string") { + color = blur; + opacity = color; + blur = 4; + } + if (typeof color != "string") { + opacity = color; + color = "#000"; + } + color = color || "#000"; + if (blur == null) { + blur = 4; + } + if (opacity == null) { + opacity = 1; + } + if (dx == null) { + dx = 0; + dy = 2; + } + if (dy == null) { + dy = dx; + } + color = Snap.color(color); + return Snap.format('', { + color: color, + dx: dx, + dy: dy, + blur: blur, + opacity: opacity + }); + }; + Snap.filter.shadow.toString = function () { + return this(); + }; + /*\ + * Snap.filter.grayscale + [ method ] + ** + * Returns an SVG markup string for the grayscale filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.grayscale = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + a: 0.2126 + 0.7874 * (1 - amount), + b: 0.7152 - 0.7152 * (1 - amount), + c: 0.0722 - 0.0722 * (1 - amount), + d: 0.2126 - 0.2126 * (1 - amount), + e: 0.7152 + 0.2848 * (1 - amount), + f: 0.0722 - 0.0722 * (1 - amount), + g: 0.2126 - 0.2126 * (1 - amount), + h: 0.0722 + 0.9278 * (1 - amount) + }); + }; + Snap.filter.grayscale.toString = function () { + return this(); + }; + /*\ + * Snap.filter.sepia + [ method ] + ** + * Returns an SVG markup string for the sepia filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.sepia = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + a: 0.393 + 0.607 * (1 - amount), + b: 0.769 - 0.769 * (1 - amount), + c: 0.189 - 0.189 * (1 - amount), + d: 0.349 - 0.349 * (1 - amount), + e: 0.686 + 0.314 * (1 - amount), + f: 0.168 - 0.168 * (1 - amount), + g: 0.272 - 0.272 * (1 - amount), + h: 0.534 - 0.534 * (1 - amount), + i: 0.131 + 0.869 * (1 - amount) + }); + }; + Snap.filter.sepia.toString = function () { + return this(); + }; + /*\ + * Snap.filter.saturate + [ method ] + ** + * Returns an SVG markup string for the saturate filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.saturate = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + amount: 1 - amount + }); + }; + Snap.filter.saturate.toString = function () { + return this(); + }; + /*\ + * Snap.filter.hueRotate + [ method ] + ** + * Returns an SVG markup string for the hue-rotate filter + ** + - angle (number) angle of rotation + = (string) filter representation + \*/ + Snap.filter.hueRotate = function (angle) { + angle = angle || 0; + return Snap.format('', { + angle: angle + }); + }; + Snap.filter.hueRotate.toString = function () { + return this(); + }; + /*\ + * Snap.filter.invert + [ method ] + ** + * Returns an SVG markup string for the invert filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.invert = function (amount) { + if (amount == null) { + amount = 1; + } +// + return Snap.format('', { + amount: amount, + amount2: 1 - amount + }); + }; + Snap.filter.invert.toString = function () { + return this(); + }; + /*\ + * Snap.filter.brightness + [ method ] + ** + * Returns an SVG markup string for the brightness filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.brightness = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + amount: amount + }); + }; + Snap.filter.brightness.toString = function () { + return this(); + }; + /*\ + * Snap.filter.contrast + [ method ] + ** + * Returns an SVG markup string for the contrast filter + ** + - amount (number) amount of filter (`0..1`) + = (string) filter representation + \*/ + Snap.filter.contrast = function (amount) { + if (amount == null) { + amount = 1; + } + return Snap.format('', { + amount: amount, + amount2: .5 - amount / 2 + }); + }; + Snap.filter.contrast.toString = function () { + return this(); + }; +}); + +// Copyright (c) 2014 Adobe Systems Incorporated. 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. +Snap.plugin(function (Snap, Element, Paper, glob, Fragment) { + var box = Snap._.box, + is = Snap.is, + firstLetter = /^[^a-z]*([tbmlrc])/i, + toString = function () { + return "T" + this.dx + "," + this.dy; + }; + /*\ + * Element.getAlign + [ method ] + ** + * Returns shift needed to align the element relatively to given element. + * If no elements specified, parent `` container will be used. + - el (object) @optional alignment element + - way (string) one of six values: `"top"`, `"middle"`, `"bottom"`, `"left"`, `"center"`, `"right"` + = (object|string) Object in format `{dx: , dy: }` also has a string representation as a transformation string + > Usage + | el.transform(el.getAlign(el2, "top")); + * or + | var dy = el.getAlign(el2, "top").dy; + \*/ + Element.prototype.getAlign = function (el, way) { + if (way == null && is(el, "string")) { + way = el; + el = null; + } + el = el || this.paper; + var bx = el.getBBox ? el.getBBox() : box(el), + bb = this.getBBox(), + out = {}; + way = way && way.match(firstLetter); + way = way ? way[1].toLowerCase() : "c"; + switch (way) { + case "t": + out.dx = 0; + out.dy = bx.y - bb.y; + break; + case "b": + out.dx = 0; + out.dy = bx.y2 - bb.y2; + break; + case "m": + out.dx = 0; + out.dy = bx.cy - bb.cy; + break; + case "l": + out.dx = bx.x - bb.x; + out.dy = 0; + break; + case "r": + out.dx = bx.x2 - bb.x2; + out.dy = 0; + break; + default: + out.dx = bx.cx - bb.cx; + out.dy = 0; + break; + } + out.toString = toString; + return out; + }; + /*\ + * Element.align + [ method ] + ** + * Aligns the element relatively to given one via transformation. + * If no elements specified, parent `` container will be used. + - el (object) @optional alignment element + - way (string) one of six values: `"top"`, `"middle"`, `"bottom"`, `"left"`, `"center"`, `"right"` + = (object) this element + > Usage + | el.align(el2, "top"); + * or + | el.align("middle"); + \*/ + Element.prototype.align = function (el, way) { + return this.transform("..." + this.getAlign(el, way)); + }; +}); + +return Snap; +})); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css new file mode 100644 index 0000000..e85f5a8 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/dr.css @@ -0,0 +1,144 @@ +#content section.code { + display: block; + font-weight: 400; + background: #181818; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} +#content section.code pre code { + font-size: 14px; +} +code { + font-family: source-code-pro, Menlo, "Arial Unicode MS", sans-serif; +} +a.dr-hash, +a.dr-sourceline { + -webkit-transition: opacity 0.2s linear; + color: #333; + font-family: Menlo, "Arial Unicode MS", sans-serif; + margin: 0 0 0 .3em; + opacity: 0; + text-decoration: none; +} +h2:hover a.dr-hash, +h3:hover a.dr-hash, +h4:hover a.dr-hash, +h5:hover a.dr-hash, +h2:hover a.dr-sourceline, +h3:hover a.dr-sourceline, +h4:hover a.dr-sourceline, +h5:hover a.dr-sourceline { + opacity: 1; +} +.dr-param { + float: left; + min-width: 8em; +} +.dr-type { + float: left; +} +.dr-title { + float: left; + margin: 0 8px 0 0; +} +.dr-type em, +.dr-returns em, +.dr-property em { + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + background: #ccc; + border-radius: 5px; + float: left; + font-size: .75em; + font-style: normal; + font-weight: 700; + margin: 0 8px 0 0; + min-width: 80px; + padding: 2px 5px; + text-align: center; +} +.dr-type em.amp, +.dr-returns em.amp, +.dr-property em.amp { + float: none; + background: none; + font-size: 1em; + font-weight: 400; + font-style: italic; + margin: 0; + padding: 0; + min-width: 0; +} +.dr-property em.dr-type { + margin: 4px 16px 0 0; +} +em.dr-type-string { + background: #e1edb1; + color: #3d4c00; +} +em.dr-type-object { + background: #edb1b1; + color: #4c0000; +} +em.dr-type-function { + background: #cfb1ed; + color: #26004c; +} +em.dr-type-number { + background: #b1c9ed; + color: #001e4c; +} +em.dr-type-boolean { + background: #b1edc9; + color: #004c1e; +} +em.dr-type-array { + background: #edd5b1; + color: #4c2d00; +} +.dr-optional { + display: none; +} +ol.dr-json { + background: #ddd; + list-style: none; + margin: 0 -30px; + padding: 16px 30px; + line-height: 1.5; +} +ol.dr-json .dr-json-key { + float: left; + min-width: 50px; + margin-right: 16px; +} +ol.dr-json .dr-json-description { + display: table; +} +ol.dr-json ol.dr-json { + margin: 0; + padding: 0 0 0 50px; +} +#pageNav li.dr-lvl1 a { + padding-left: 1em; +} +#pageNav li.dr-lvl2 a { + padding-left: 2em; +} +#pageNav li.dr-lvl3 a { + padding-left: 3em; +} +#pageNav li.dr-lvl4 a { + padding-left: 4em; +} +#pageNav li.dr-lvl5 a { + padding-left: 5em; +} +#pageNav li.dr-lvl6 a { + padding-left: 6em; +} +#pageNav ol { + list-style: none; + margin: 0; + padding: 0; +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css new file mode 100644 index 0000000..2d0bda3 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/main.css @@ -0,0 +1,508 @@ +html,body{ + margin:0; + padding:0; + height: 100%; +} +body { + font-family: source-sans-pro, sans-serif; + position: relative; + -webkit-font-smoothing: antialiased; +} +body.light { + background: #F4F4F4; +} +body.dark { + color: #F0F1F1; + background: #4A4D4E; +} +body.light { + color: #181919; +} + +h1 { + font-weight: 600; +} +#wrapper { + width: 100%; + overflow-x: hidden; + background: inherit; + position: relative; +} +#site { + width: 100%; + position: relative; + z-index: 10; + background: inherit; + left: 0; + transition: all 0.2s ease-out; + -webkit-transition: all 0.2s ease-out; + transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); +} +#site:before{ + position: absolute; + content: ''; + left: -4px; + height: 100%; + width: 4px; + background: #3B3E3E; +} +#site.open { + transform: translate3d(250px, 0, 0); + -webkit-transform: translate3d(250px, 0, 0); +} +pre { + font-family: source-code-pro, sans-serif; + font-size: 12px; +} +/* Main Header */ +#main-header { + color: #373435; + background: #fff; + height: 98px; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px 20px; + position: relative; +} +#main-header hgroup { + text-align: center; +} +#main-header hgroup h1 { + font-size: 40px; + margin: 5px 0 0; + letter-spacing: -.065em; + line-height: 1.1em; +} +#main-header hgroup a { + color: #464646; + text-decoration: none; +} +#main-header hgroup a:hover { + color: #000; +} +#main-header hgroup p { + font-size: 13px; + color: #999; + margin: 0; +} +#main-header nav { + display: none; +} +#slide-menu-button { + position: absolute; + top: 20px; + left: 20px; + display: inline-block; + vertical-align: top; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-background-clip: padding; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + padding: 0 0.5rem; + line-height: 2rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: baseline; + -webkit-box-shadow: inset 0 1px #fff; + box-shadow: inset 0 1px #fff; + -webkit-border-radius: 3px; + border-radius: 3px; + width: 2.6rem; + height: 2.6rem; + line-height: 2.6rem; + border: 1px solid transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +#slide-menu:disabled, +#slide-menu.is-disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} +#slide-menu-button:active, +#slide-menu-button.is-active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + -webkit-box-shadow: inset 0 1px rgba(0,0,0,0.12); + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} +#slide-menu-button span { + background-repeat: no-repeat; + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCIgWw0KCTwhRU5USVRZIG5zX2V4dGVuZCAiaHR0cDovL25zLmFkb2JlLmNvbS9FeHRlbnNpYmlsaXR5LzEuMC8iPg0KCTwhRU5USVRZIG5zX2FpICJodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlSWxsdXN0cmF0b3IvMTAuMC8iPg0KCTwhRU5USVRZIG5zX2dyYXBocyAiaHR0cDovL25zLmFkb2JlLmNvbS9HcmFwaHMvMS4wLyI+DQoJPCFFTlRJVFkgbnNfdmFycyAiaHR0cDovL25zLmFkb2JlLmNvbS9WYXJpYWJsZXMvMS4wLyI+DQoJPCFFTlRJVFkgbnNfaW1yZXAgImh0dHA6Ly9ucy5hZG9iZS5jb20vSW1hZ2VSZXBsYWNlbWVudC8xLjAvIj4NCgk8IUVOVElUWSBuc19zZncgImh0dHA6Ly9ucy5hZG9iZS5jb20vU2F2ZUZvcldlYi8xLjAvIj4NCgk8IUVOVElUWSBuc19jdXN0b20gImh0dHA6Ly9ucy5hZG9iZS5jb20vR2VuZXJpY0N1c3RvbU5hbWVzcGFjZS8xLjAvIj4NCgk8IUVOVElUWSBuc19hZG9iZV94cGF0aCAiaHR0cDovL25zLmFkb2JlLmNvbS9YUGF0aC8xLjAvIj4NCl0+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zOng9IiZuc19leHRlbmQ7IiB4bWxuczppPSImbnNfYWk7IiB4bWxuczpncmFwaD0iJm5zX2dyYXBoczsiDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDAgNDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDQwIDQwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzd2l0Y2g+DQoJPGZvcmVpZ25PYmplY3QgcmVxdWlyZWRFeHRlbnNpb25zPSImbnNfYWk7IiB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4NCgkJPGk6cGdmUmVmICB4bGluazpocmVmPSIjYWRvYmVfaWxsdXN0cmF0b3JfcGdmIj4NCgkJPC9pOnBnZlJlZj4NCgk8L2ZvcmVpZ25PYmplY3Q+DQoJPGcgaTpleHRyYW5lb3VzPSJzZWxmIj4NCgkJPGcgb3BhY2l0eT0iMC43Ij4NCgkJCTxnIG9wYWNpdHk9IjAuNzUiPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzksMTF2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwxMywzOSwxMi41MiwzOSwxMXoiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMTBWOWMwLTEuNDctMC40OC0yLTItMkgzQzEuNDcsNywxLDcuNTIsMSw5djFjMCwxLjU1LDAuNTIsMiwyLDJoMzQNCgkJCQkJQzM4LjUsMTIsMzksMTEuNTIsMzksMTB6Ii8+DQoJCQk8L2c+DQoJCTwvZz4NCgkJPGcgb3BhY2l0eT0iMC43Ij4NCgkJCTxnIG9wYWNpdHk9IjAuNzUiPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzksMjJ2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwyNCwzOSwyMy41MiwzOSwyMnoiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMjF2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MWMwLDEuNTUsMC41MiwyLDIsMmgzNA0KCQkJCQlDMzguNSwyMywzOSwyMi41MiwzOSwyMXoiLz4NCgkJCTwvZz4NCgkJPC9nPg0KCQk8ZyBvcGFjaXR5PSIwLjciPg0KCQkJPGcgb3BhY2l0eT0iMC43NSI+DQoJCQkJPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zOSwzM3YtMWMwLTEuNDcxLTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwzNSwzOSwzNC41MiwzOSwzM3oiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMzJ2LTFjMC0xLjQ3MS0wLjQ4LTItMi0ySDNjLTEuNTMsMC0yLDAuNTItMiwydjFjMCwxLjU1LDAuNTIsMiwyLDJoMzQNCgkJCQkJQzM4LjUsMzQsMzksMzMuNTIsMzksMzJ6Ii8+DQoJCQk8L2c+DQoJCTwvZz4NCgk8L2c+DQo8L3N3aXRjaD4NCjxpOnBnZiAgaWQ9ImFkb2JlX2lsbHVzdHJhdG9yX3BnZiI+DQoJPCFbQ0RBVEFbDQoJZUp6c3ZlbVNKTG1SSnZnRTlnNitQMXFFSEprS0dnQ0RBY1lkV1pId09IbzRRM2FYa094anBXV2tKSmtWVGVaMEhpVlpXZVJ5bjM3MQorMVFWZ0xsN1pFVWVSVksySzFDVkVhNE9nNW5oVU9qeHFlTHYvbzh2Zi9QRjlkZHZmdmZ3UmJxYUQ5UGYvZDNOMjRkbjc5NjgvZm1CCjFNTXZYcjc4N3R0M2IwSDZ5YTkvZWdqcjFTeVZybjlSdjdLSy8venc5dHNYYjE3L25GOWRKZm55SGxmLzVCZmZQdnZkdzh1WEQ0ZGYKUG52OTlicy9QSHY1OFBhbmg1LzhWTDcvN1l0M0x4K2t4aCtldmZyZGQyOS8vL0QyNnRzLy92Nm5mbXRwNi9iWk8vbCsrVm44V1VpSAorUE01SHI3OEZiNSs5dnFQejc3OTlzWC8rNENicFlwN0hkOTg5L3JyRjY5L2Yzenovd2p4OEVYS2g3UWR2aWp5MVg5LzhldUhiOS96Ci9lMmI1OSs5ZW5qOTdzdTNiNTQvZlB2dHpadVhiOTUrKy9QRHpaK2Z2VDc4NnRudjVadG5oLzliM3VETm53N0hsOCtlLzhja2I1Mi8KdW4veDhrRmU4Tld6ZDRjUTBSZlh2d2p4cStOM0wxNSsvUS9mdmZyZGc3ejZ1cEdjdm1LVC8vU3R0Q1hONG0rUXkxZS9lQ1dVM3p5OApleWZQSlRkRWYvNzY3NC9qWXdpUjVTZi85dXVIMzc5ZzkwdTMvSytmV3JOdjMzeno2dG5iLzhDMWh5K1crU0QvMlIxLysvRHFtNWZTCmUzemRPRi9sd3hmOHQvOXA5ZVF0V09lTHVGYnBsYkllMGx3UEtWZjl2dmZOd3g5ZlBQenA1NGQvZVBQNlFUdmcrdTI3MytnUUxNczgKNjcvNnphKy9rekgrcDljdjNzbURyU0J0MmdPL2V2UDF3MHVwMzY2L2YvbU1MODRTK3I5YTRiZlBaRTY4azdGNzgvSzdkNXhaMWU4ZwpQZnpMWjM5K3dEQUZ2Y0UvZnZQdytyZHYvcG5QK0VVTTBrN2NyclpEWE9TTlF0eVdRNmhzUCtKUnQ3bmRNL1IvdFdrMGhHYThmY3lRCkwyV2Mvdkh0aTkrL2VQM3pMMUtWdms1eDFpSDgrN2N2dnU0akdBN1YvcGZHcitydy8rYi82OVBLaTc5NzkvRGFubDdtemMydmhua3cKWC8zcU4zTFh1OWRmMzd4NWhkNy9GaE5jSnNCcm1Sc3YzL3hldjJ0Lzh4dTUvTHR2OUEzNCtTc1pxQy9mdm5pTk5xZC80RGYxcXk5ZgpmaWRmL2YzYk45OTk4NHZYLy81bStva3U3WDkrZUM3clY4Ynk2OE0vL3U1L3l3ZFpuNXliaDkrK2ZmWmNHcERQcmM3VnN4ZmYvUFM5Cnpjbkx2WDA0NkpkeUpULzY3KysvK3ZiaDMyVlY5Y3VWZXZmNmp3OHYzM3d6Tk5zb3dsVU8vL0xzN1RmZjMvU1hMNSs5ZnZiMlFIcHIKK1pjdi9pamZQSk9lNm0xMzJoTWFsVm55alhRT0wyR1ZreHU4cDhMdzFSTnU5T3pkSDRRQlBieisrdHZXdG43Y1A3alN2cis5M3p6SApISHg3T0w3OTd0cy9ISDc3NXMzTDF1eitxOWE2a1VsRi9iK05lM3pKQzE3LzQydnRvUE03V1lYVE93bi8rWnU3aTlSKy9BN3k1ZDl5CjZ6ZlBYcjU4OGZ1M3o3NzV3NHZubDI1dzRmdDJKLzN1UXliV24xLzk3czNMRjkrKzZ2TnBvSHo1N08yN0Y4OWZQdnptejkrK2UzajEKNU1FOTNIMzlRcGpjSTh2NHZYVis4NmRuNzU3LzRaY3ZmdmYyMmRzWEQrOWRmUmlBZjMveCttdVorNy81N3NXN2g5NUJiMTU5QXlubAo4SnMvUFB2bWdhL3g3Zy8zclBtYjFtRCtTbGoveU55LytPSTlYRCtzaCtQcjRmdS9mL3ZzNnhleW9ZalE5ZmR2WG43OThQcndhN0QzCmFmZEp0cTl5T0g0OS9kczBXd2tzeStIdnZqcStuZjdiTkovK2hKTVNoNUtzTEZZeS8vZXk0djlKZm8ybHRGTG5iVmV1aDNLVWNtUGwKZGloMzgvMDAzM3ZaUGRqNEU0ZVNockxzU3RZeThWY0pxNVRDMzNVbzI2NWNoMk1yTjYwY3c2MFUvM1E3eVljN2ttN0QvVmpHcnVQRAorVThheWpLVUhGZVVTWC9GTXBRYU55bjY3L1ZRamxxbS8rdlNXRDQybW1rM25zc3dxbjFzcFV4dGVKZGhrSFZVeDlHdFV2QWJvMXAzCjQ3c05JeXovVGpiVVB0akhOc3o2RzZOOE40NjIvS3MvODhXeGp0TnVvSk9NSzM1alpESEdLMHZsS0plVEViNjJzaDliR1V2OHVtTzUKUFJsRnYybmlHUFl4UTlGQjhpSGJiTEJrZ0NZYkk0elZqWlZibGpzcjl5aStzdkF5NDFnR2p0SmlIVi9ab1VjdWtudjJUZVRMcjN5OQpqYTl5eXljTzlvUXJwNHc4d3NUNzRqNHhwYlNrTlJWUnRyWjBsSEtiN21XMHc1S1daY2xMV2VxeUxkZkxjYmxkN3BaNzZjaVlVMTd5Cm1rdmU4blUrNXB0OGwrOG5lYUFnczNSWjg3cXVkZDNXNi9XNDNxeTM2NzNNaFNEZHNKUmMxbExMVm83bHB0eVdlNWtub2NhNjFGelgKV3VwV3IrdXgzdGE3ZWkvekpVNWIycFpOMnRucXRtM0g3V2E3Mis1bDBvVHJkTDFjNSt2MXVsNXYxOWZYUnlrMzE3ZlhkNXhKVVY1ZwpPZVpqT2RiakpsOGRqemZIdStPOXpLNHdzYmZUelhLVGIrUUJicmFiNjV2anpjM043YzI5VExiQVVWaHU4KzE2S3c5M1cyKzMyK1B0CnplM2Q3ZjNkTE9PUzdwYTc5YTdjMWJ2dFR1NTFkM04zTzkzZDNkMWpSdHhMaDkzbmUzblRlM24yKzJzcGNzdDd1ZkwrNUVmR2NwYlIKYkovdmhuSTdsSnVoSEhmbGVpaWJsMG4rcVVNcFExbDNKUTlsR1VvYWlrekE2VDYyTXJLd3puem44ZEh2eHAvYlhiblJNdkhYY1NqWApROWwycFE2bERHVWRTcDd1Y2l2THJxU2h4S0dFb2N4ajBTNmZyTy9IcHg5L2JvWnkxTUtWdVJ2SC9lanR4OHhIYXo5RSsyR1JvWmlHCjBkZ1B3YjdqOTkxdDNYelN0K3pQcVhYcHZpUDN2YmZ2c1pOKzJuZk5kTklqMmh2WFZqYVdhcVZZV1ZteWxZVWxXWWtUMTU1dG1jcjYKMi9UM045TjcrYytSNWRyS3hsS3R5TnFlNUovVlNyYXlzQ1FyeW5xZDBRc0g5Ykc4NC9nZE9WNlY0NU01SUJpRW1kMSt5MjYrWnE4Vwo5dVBDZmd2c3B6dDJ6SkVkVVNlK2VlYTc0Z1ZudnRBdFgrQ2FqMXo0aEF1ZlNKNURac3VkZE9hTjhLMXI0VjlWK05ncTNHd1JyaGFGCm04K1RUS1E3NmVVYllYclh3djdxZFJGR21JVWhKdGxSZ3V5dzl6TGl0OUlkeCsxYTJHYmRpakRRTEl3MHlSWVVaRCsrbDRsd0s5MTAKRkc2NzFUb0o0MTJGQVM4MUNTc09zbkhmeXd5NWxUNDhsbXRoMWJVVVlkcFptSGNTRmg1a283K1h1WE1ySFhzVUJyOEpveS9DN3JPdwovU1RNUDZ6ekpOUDRUc2I0UmphR2E5a2dxbXdUYTg2eVlTVFpPSUxJRHZjeTNXNWxMSTZ5cVd5eXVaUmxsVzFta2UwbXlxWXp5N3kvCmsxbHhJeHZSdFd4SWRaS2RhVTFaOXFna2UxVVFXZVZlWnVpdERCOTJVV3lyMkdpemJHN1lpRU9jQTdoc0UyaXRGdXA1TGRhVEJhV2IKT3VRMzdQd2JKUU9WRkVSMjRIeDQ1SFpzaGczNDVmMWlpQjJ4TTRiN2dkVXJTOWhrVW1XWlVFRW0wNldwRkcyUDRPNkRIOTJCQXRjbApkcUhNMWVzN2tlMUYySXBrdHhFaGdQZkdmdGMydTFWbVdiMnczYVcyM1dHenU4WU5lWEdUR0pMSm9NV2xCZ29OZHhRYmdna091WWtPCjEyTzNveGNncDgzMzJxUjhvREIzeTQ5WUxicFdmRU5zdXlpLzU1dnpyWFVZcmltVjNLWGR5RklrREUzb1VRbFBCUitWNUc0b2lOOUoKMDhHRWJIMGRsNXBOU3FaYXdhYThvZDRNRzJGdjZNVVhlMElmZVJ3b0hhU2RzRUJKSWNuSUY1a0JSODZGRStuQXV5TGJCdUFjWitRNQpmYXAwdmpOeUh2SWU3ZUlMN0dqUGpiNlBGMm5YbjZ6R1QxNk14eWIrZXVtS1ROMnBPTVhVSGkxNXB4bVp0alRaSC82akF2bE9SOTJyCllMN0hOQVd0U2Zvc3gybW4yTjFRZ25hbEFMKzNrMUpQU2xjaTlhOTFjald6bGVXc3BMTVNMeFQ3bVhhYTdwbENoeFUzQ21udDkrM0YKSW54aWFwcjJqU2xqUjlYT0xwYnQwVkpkNzVzR0pWL0wrc1RTVmNvOGxtbi9zUmtiK3QvbkpUMVNPQ21tT1Q2eFhPcmdDMlY2WXNVbgovMXpTM1QvcDU3TTE2UHRpYUQycU1xcUwyYmRXVk1KeW80UWJLYXJwd203RXNKVSttZHJzeTl2TkluMzZuNjVtbDFCOTlZNEw5cWpyCjJGWDY4OVZhbWdsZ3RaS2JnYURiaHRLNFFLZnZYNW55VnpOTGRQUFV5WEwwQlhrN0RVYXQwY2gxdkxnY2p6dlQyUG1DTkdQSzZmcXMKT3l0YnQ4NjRoZWJTRW0yZnA3T1ZlYm9JenhmbGU4dDBaakM4dEZMZnQzNVBsdWMwMkNBL2VRMi9ieDMvOVpmZFoyL3drb2c2YWovbgorby9LSStmNmowc2hNM1RvTzBvYm0ybCtxOGtic1drLzk0UEVVWFlTUnh3MG9CdlJnYWdCVGFJQ1FRbFNGUWhLMEV3TlNIV2dHeHAvClZBK3FUUTlLcGdkQkU3b1JMZWhJUGFqU2xMUk1WSVVDRjhjOXRlSmIzRUd1cjZJSnFTNEViU2lxTmtSOTZOYjBvU1Axb1VwOUNCb1IKT0ZlWVRDbTZwNFlMdFVnVkk2aEdsYW9SbEtPRnlsSGdVcnFuaG5SRERRazZFclNrSW5kRlZWR0VKbEdVRXRsaG9Hbm1qdXJTcmFoTApVSmlnTWtGcGd0cFVsa3pGQ2FwVElxZWFxVDdkbTJKOTFES0ozQWJKRGJKYm9meTJvbjdDVDZEODFMazRaRm9kaXk2bHFXUldxVUNoCkxGUGoxR2RTMXlCanVTVlZmNDhNZUJTUktBOU5neEMwWTZwbmpITW51ZXg0NUk0alRqdVpCT1dFdDExa2ErK1JJTTRsaHFleGlVZloKeCtkY3g2WXRhaG5OVk9QUDNpdzNtQnIzdGpEZlZ5ZjdJKzVLMnBXOTJTMmZsSFZYeXJRejVaV2RrYTlTVWRxWDY1TnlQQzFUczNsNQp1VDByNXovMzU4WG4yRFR1MVBmaFFva1hTN3BZekpKM1h2SWpaWDIwTkZ2dXREUHNGcHFiMzFlMjd5blgwODZjZkxrY24xakkzS2VkCjVmcDk1ZlpwWmJwQXZEU0lUeTdUbzE5OTVNLzVKdnF4RFpuaFptN3FaelNQaFpiRmlwb3ozYnhackxqMWM3Tml0dEhKVEtYKzQ3eWgKTHhzZkQrZXNyaUs3Sk85V1dyWFpMaE9OUmxyV1Z0ek1XMXZackZ5M2NyekFvK1JuT21OUWwxaFROOTFmNWtZREg1b2VZVUtQY1ovSAp1TTdBYVk2MDRUek9hOTdEWTNaTXhSakw5RjZlY29HVGZCOExtZDdQTjU3QU1rNVl3elJ5aVk5bURjTjZmNHd4UEpFTm5LLzh4OWZ4Cis4dGZhQjEva0ExMVowVVZrZTFHaloxMHdrTE9Tc3N5aWFTM0RyN1lvM0FDOWNmTzVwR0ZUemJUSzF0Rm9IVFA3QzE4czdLNXFITTIKVVJTRmc3Wk1sRS9kU3dzLzdSMDl0ZXFyVFpBdTZhL0ZEM3kyMXhTQTRiZkZBbExmTGJ5M0VDenB3WjNveEsyUXRPbklQUW8zdW0zdQozRm5FUDBpUzhPa3U4bmlRa0F2RjhrMUU5R3Y2ZDIrRVg5eVpsM2UrRHBQSThaSHlQTnk5Y1BpdTE0V1Mvalk0ZnVuNmxZTHBDRUV3CjBNQ1k2QWFHSXhnQ2VhRTd1RTdIalQ1aDlRcmZrQmRoYWQvVFB6dzNsdXZNMXRtc3M5Zk9WbzJqVG8yVmRoYnFyTE16emM0ck80L3MKdkhIa2lMZFQ0NE1qLyt0OGI4L3JSaFkzc3JXQm1VMERIOXV6cmhObWRVSHlPZWRIZzB4eldXNTVqTXVjaUIxam1kN0hOYjZYVFR4eApnLy9ZZFd5RzYzK2JSbEJ4T0VUNWF6M1UrV3FSNVhJbzZVb1dTRVRWMzB4Lzk5VlRxaDYvUFcveEtrdkZQQjlxdUJJOWNIMjB1ZE42CmFPc3FyR1ZiZ253Wm9OMUdSeW5uV3VNaWY1UWM3ZXNZOHJvZFVFRWJpVmRwemt1NzJTYzN4S2VaUlRQTnE5U2FaWkd2dUU2VWExRysKMmRhMjVIa2pkbHFZNHBMbGo0amZZV2dyWGMzQ1Z2cERmYWIyOU5uV1dSZ3Eyc3Boem9YWFZXSEUycGFvaUZYYmo4SlIwWmFNVzk1MgpiZVY1M29abit6enRmZndveG5KVlU5clFVczFsKzhTaFBHM3R3a3kxSjkrMksrSG5qMDNUZlNWcDVYamJJSTZPVkx3TVh2ekh0OC8vCjhPTHJuMDcrQjREOURiSjR0YTVCOWttTVk0cWxyQVF3eXVKaTkrSnJqUHh1MmRvVkI3OUM0eERzaW9OZFljdFVIbGlVOWVHVlB1SmkKN2JDblhvaHVXdGFybERDOVArTEcrK3MvcEp0Lzh4OS9sajdHdjNMaG9oMzgzM3ovdWJkZEo5cCtrODJmV1d4M3ViWU41WFowUE50bQpzUmdXU25ZRFNrS3lGd1REZVMwVUVZRDBPbEkwdUtkVlNFV0NsY0xBTmNXQU8rNFNBSHBoMzljOS81cld2dHRUWUtPQ0dOMGpwUFp0Ck5aTmpMNTROQUtvdVhVZHcwaXZjUUhINU1hemtwWi9IMGJDajhUcWJVWVpXUWtWT0VEdlIwQk9uaHNKaUtBckZVUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJR0pLQ3BzSTdBMVBjWkhYcnZoOGVNcUJEbm9RTkdYMnpUUkFLQmgwWXdRTWRQbkNqMHM0QUlWaWFkTE01ak9CV3h3bGlyQ0VKSWIxVwpSeEZTWmxVTVlhV2NDdmtVMG1tV2ZvQkllaU9UYmFZWW1nMHdlRnZVUDQ1dU5keEZSMTdzZ0J0bU81eWIxL09HMWtFMUJ4WXoreTNtCk1RaG1DSDh5WU9aSmFCa0ZCSFR6dHpyY28yS2JETk4wMjNCTTE0WmVjbk40TnBpU3dwTm1Da1YzT3kvNkFCUnRVRkUxbjZvL1BEV3QKSWxPeldLbGRGR29ZbGRiZ2Erb1pSeG9XYmllS2xmZFVPTHJLb2VoUGpKdnFIYXA1ZE4yRDJvZmhRUlVSQ3YwREdzZzZVUW1wVkVKYwpEYm5kcVNJbnlvanBJaGg2UjQxU0gzR05aRHBSU1RBbk5nT1MzbENxdm10dzBraUZ4RUdsbzBaeVE0M2tEZ0xwWkFwSkdoU1NZc3JJCmtjcklMWlVSQlp4MlBXUVo5QkRvSUUwTG1Xamo2R3JJdVNLU1RSR2hLdEwwa0NOMUVXb2l5b2NNY0dmNDV3R2tTRS9oK2Q5MzdlODkKMWF6bWs4R281WVA1SXUrNlY5TC9Hbjgza1BVSXFsZUR2RUdzUTdQUXA0YXc3Ny9UN3ZkaTdOZmgyTG5oN3RYNEwxeHgyaUh2SFg5Zgo3Ri8xR3VpLzZzenQvMTd2ZkF5M0J0VTIvRDJCUDNBVUQxanRqdFJPNXNKWURhdTltaTlhUFIwZFZFOC95RFRncy91UzYwc3RFUkJ6CnVzdzRZd2lja2RYLy9qMW05QkdjK2dzZTh5Nll0M0owTVlUbWxoZ2RGT2NPMFhPZjZ1SmVqbE5IN1BtbjhmZnAzeU10ZThSQUR3MVoKSHNWdVBJN3NTTHUvMHpSOFdFNWNOcU1qNTdMUHVuL2ZQTmpUbWE5SCs2NjdsSHV2OWg3dWc5QTlNRHRrNnZFQ01yVVlLTFhEVVIySQphaEJVNWZUYzRXV1BuOGdicnJuUjYxWmZhTXpJNUNmSnRuemQ5UGN1MGV2bUVpMWtWdVlXblNnRmROL29MUjlPdHozZCtIenJhNXRmCjIvNThBeVJtbEp1Z2JJT1Q3WVBqVGpqdWhTTjJkSThlM2VOSEc0SjBVc0hIUEtTbkdOTEhVS1R2d1pGT0EzVHRvOEJyUWJueU9WcDgKS044UEdPK1diN09GVHcwbmZZNlVMczJvdmtkTEQzaHBLd05jZWpwRFROL3VFTk9QejhwcS9vTjFQemVuQVMwOVlxWG5ObEh2emE2awpiNmJ0SDl1YzFWbTdjYS9qM0oxcytxN2NDdnNrVGdZSlZGNnVybHlmMEhmV1hUZURyMThudDVUSlpuaXhXYjVTV2FDSW9xeVhIRnczCkN2VUw2N1MvNDlUbjVGY014Q1VuM1dsSXhHbTU3QW1NcDhiOXM2Q0ppOEVUZXp6L1dTREZkQjVOY1FMM3Z4eFVjUjVZWVhFQTA4WG8KaW5MaXNWMVAvTG1QQjFtazZkRTRpL0NlbGZQWXVwR1ZNMTFjUE1mQm1kVFh6N2lHaHBXMHM5NWRiU0prcGt6RkdlSTdyQjdDS0NwMAo2amtJczhxMGpZZ1dYVmVvMTNtTElaZWRHVU5xZHhQZjUycVBWcCs2cmx1Z2RyK0pJRnpOa0NJZm02VkdMVnpkWnJSZWlmeFUrOU44CmRBdThmMW1Tc0Q3WXBsSVIxbS9YaGxCRTdzY2I0aSs4YWwyRVp3NHZrVmU1TkhSRDVTYzNwRGF3T3FmRWZzeHBxelQ2eVQ1YlUwKzcKVUhBOWpHdmF1OWJNZHBYelBCcFJQcjJsRHpLbmZQZnExY05iV0ZUMER4ckJ6R28xU0g0dWtJMVMxUmhHV1Jwa3o3Rit4eFlFZStlaQp1NEtBSWRHNmVKMmJERjJhcE53akdUMFVkUlNGZTlncDFiMXBpRnFzRGFYWkEwb1YwYW40enNkMXpreXRrNEx3TkVqQ3FuSnVnMFI4CnRLM3N6alZQMFQySlhqSUFLTnVoOW9rTm5YcmlSTUJUSWZ4SkZWRlhSbysrUHhwdmNnK0ZDbnZSY05lbURHZHJOZWVKMmlxaFhMUkQKVkZOWnRkZ3U1Y0ZEdVczR3piUHNJS0tHSVowYVdEMjFrbHZwUDZXVjJzcDFLOGRlcHZWbUtOM2J2bmU1akRET3NDdHBLT3k3cVN5dAo1RjA1LzZrblpidFFycWR5ZlZadUhpbTM3eW5OYlRSZDlsbFR1Zi9Rd29rODFmZzV5bmtNYm8vQ0xTME85OWhYYWRqSGsxUXV5bU9QCkpzWlNuRXdkM2NXa2NKbmREL3BsZHcxdkZnZHpPMWhxRmw4ZnNNOU10aVp1NkIyY1c3QnV0bkRkU25QYnRVM25POXBpTUlFVHpZN1oKNWlZc01VZk94RnZNUUhjTFI4Nmo3aEsrcGt2WXhvOVl5VUJ0SU5FKzVyYVhTbU12YkM4UU9HaDNtYzN1a21sMVVSZncxaHpBdDJiOQpCUU9NRk9LNjFRWGkzdGJzTHZUOVR0L2ovdTBPNEcyd3Vkd3dLaGdHenp2REVUYmY3M1RpL0YwcEczZUVqVHVCVmVMdFVKb09vZW5nCkdZN1ZkT0lFWG5kUW1lME1LTE56Q0EvSW1JYUpVVzFrRDRKeHNld1U2M0tPY1RuSDA5MU1GMUF0RjlFc285eDZqbXJwWmJvZ0dWOUUKeUQwQklMZGNSdEk5aHFKN2I2R21Ic2FZWFkvVzlTaGRqOC90c2JuK0RGM3FONUYrRU5vcG91K2piM3NjczB2V1hZcnVnYlpOUUI0RQo0bHNGUmUwRGE3dVlleDVPMjFYREU3VncxQWVuQytyZ1pSUEZtU3A0b2dlYUpqaGRVQVgzeXVCZUhkd3JoTlZNb2FWdGRubHFhbUZYCkRWMDVqQzN0eGp5b2lQZURvbmpYRklNV0ZUejVqYS83ejlaS2JhWHZYWDBienEwc3ZVeW1WM2J0TWc0NlpoaDF6VUhqN0dYVXhEaWUKMDZERDNPeks4YXhjbjVSTFAzVWlPOTJYaXpzM1RUMlBseVlHVGYzUGs3SjhjT0VPTm0zcGM1UVBqOVorZjd3MlF5U25reGpKODVqdApmYVRrUG01N2pOdzI1OXpVREhhanNlN09wbWszMU8zTWRPcXJhOTQ2OTlkZCsvZ1dHeC90MEhnU3kzRFRQRlhiU1VSRDZyWTZzOWJkCmxkdUpLLzdJNmIrWkE2dFFPSFhYcFJydXV2Tnk3Nzdza1E2RnNtMmVMTnhCdlpoeEYvSndSMzYxRDN6WUtKU1VadURMSnA2M0dJZ0oKMWo3YSsrNXRrN3VsM2UvR09NVVlFcUZCRVNvT2VXaUVCa2VvV2tFM3hOU2lKTzVOLzFEdXFVenVTR3ZodFZrTVBYQmlESjFZVFpNdwpKU1dsaWJxUGg2U0dDN0Z4ajBYSGVaekZQaUoybTB6OTJnWUI5TEdnMkY2V1N3R3lIaVo3L25NZXgvWlkrTlFGSVB4MFJycjdtUEkrCmhCWEJLSFVIaXJqOHZRRXU4bHhGdVNQbVJnVGF6UUFUR2JhSDBLMFF6ZVp3Z3ZQNGlLcy94RHJ3VDY5ZlAzdjE4UFhoOTBZNmhKOU8KbDRnZDYzSWg0MDl1dXNhUTlTYzhIcmV1NGUvM0hyMCtHUXoxRklLNkQrTGZnMC9WQjZ6KzMrc2Q1bFRVaXFrQlRyZTllNnViT0pZegpKY2tmM0lQdSsrT2Z2c0J4MGpjd284VlRzeEc4QjBrNzlmZDUrZ01mN1lGN2pvQ3h0M2Y5UFZtSGg5M2pqcHJkWThrVExnTi8wOVM3CnZ5Y08ra0VTbEh5bTlDVFg5MU5QVC9LRFpsVDU4WUgxZ1FjYmQxcEtucEdJTmhhMU9rTVhMelREWHFuaDZjSWZGeG5pWjJoS3VLT20KM3lXbE5iMmpmUm9IbmVlTFBGVEkwblRlY2RGbzREQ3M1eHZDR3hLeEJ4dlhMVGhNSWhaZ282WHpUaGFvbWwwcWw2UkNtRFFWMnZYVQpFRXlSN0svUVZuZzdKRDl6QkpNRDZudnFzMkl3ZW9Mb0hhMHlOYmpLSHFwaVFKVWRjRDZieldRUG5COHRKM2ZiL2RUTUp3cGNpYWF2CkxHWkljU2o5YWtxUHEwRmR0L0FmVTU4bXM3VW8xdjdXZ0M1ajZRRWh1NUQxbml0eFg2YW0xZldTTHBibGtaTDNaVG9ockU4cTVmRXkKUGZwVi9iZ3lmVURsQzhyZmVabWVWdTNwNWNjR0wxUm9Vb0pMWVd2aklpcDdSVW9DWlpkck1SSmRWTGpwcXpHM0MxazFYVStheTZqSgpWOWpleCt5S2lRYmIxZUJ6RnNQVFFITWRNTmRDZDZhR2xmUEluWDNjVG1NNUFNbWRSZTRvVUc1dHhscmhQNVBOeEJ0enFONVpFTWRzCmNUekIxQk9IenVVV3orUEZiUS82Y3owWlovRis3WFlPdDM1MHcwaVBFdW1HbEhCYXBqRi8wTTRxazNiYzdyemtzMEplT0EyMm45TnkKd2NmeFNPazJwVHFOSDU1VXppdzgreko5WDRVUExVOXQ4TWsvMDlPci9xZHA4REVPQXAzaXp1RHBtVnJFdGZxR1dxNngxWlFHVDlJSwovbUVxMmdTaGhCN1QyREswUWplN2I3anF2TXZPcXE0ZWg5eU9icDZMSE1SNWlFTnRMMFQvWGVRaXprY0tzZ29xTTduZWNSSTFpSi95CmtzNVBvcGxjT2xmSlpvOHMwOEJZL0tmUDBUMWYyU0ZEVGdFd3ptR21NeWJ6R0xPSmo1UVRqak05a1FGOUh6dHFaWHJmbHg5UjNzdmoKUHFyODJPQmZvTUVQaVU1NThzLzdHdHpqaHRPWldhVHM3RGhtdzVtYVZXU1hPWEVNczZIZFJzMGdMaFc1ZTNzMTB4TUJJU29ZVFJaNwpVTGxPWUhlNmI5TFJRbHZ4Nk1xK3AzU1VMSUtra0dsQXhpZGFRckVRRTUzWGluUUFLNEhkVzEya3dBb2t1cTJ6Z1IzQVp0UWpCdGVwCnNxclVmTlpaZWRGa2JPakdRcGJnVzUzTmJhM0ZGN21QcGZNcmQwdDFNQnVWcDRrYVZOZVRSa1ZvMUc3MkNzbXAwRHI4S0lMNDlrSTUKejZhaW51RDV2U1ZPTi9ISlpYbEttWjVXN1daOWFwbWVYdlUvVFlOdTFybzlTejU3bERsYjdySXNPbVJqdmJYRVhTc1RkczFNMVhXawpqV3FsZlNwWWFxNmp6REs2dG1DVWdra0s5aWc0cytESVVpZVdnc3h2bVg1TG9lWFo4MjdSVTlYU0Q5ZmkwVlJUQTVFL0pmWHdhZkxoCmxuNjRZOGNuOHpLNWg4bTlTOGtnNUtFNWxXNEhJUG4xa0YycnU1SG9RcHJNZytUdW83M3J5QjFIM1duVVhVYWp3eWgxYjlFME9vdDIKanFKVE45R3BrK2dSLzlCMDRpQjZ6RDIwY3c2OXp6TTBQZVlZdXVRVWVvSWZpTEU1VHkwM1R5blQwNm85WW9tNlVLYW5WLzFQMCtDUApIT1JIRHZJakIvbmJYWjkvK3czK3lFRis1Q0EvY3BDLzNmWDV0OTlnOTNWZlBMbnU2VVM0eWt0Y2F0am91bDYyd29RcVdlWVlLS1ZrCmRYMkhHZEZURi83Z24rc0ZyL2xuYmRVYzZNZ3NFOUloaDZ0WmVOam9Sai81eHV2TFBlV0xOVndoYnYrUWxxczE5UHhPNzZteHY3NUkKcXptdU9GTTR4YTFjdVA2MFJydStsQXMrLzVIOGlXNy9lTm50SCtIMlQrNzJiOW5FN2s2Z3liY25FT1ZIQzNlczY5dXpjdk5oUlpzNQpoU0hqNTMwK2x6UHZrRVloZDZESmJIRHgyNFlUUHo5NnFaN0gyYmd4Y1R4R3JneWdzdkhreGZIVXhaUHlOOWRNVDJKejB6TDdkVHVYCnpRVWRpdjM0N01aV0sxeENRaGdXd3ZPNnRPTnk3SlNhZGk2UHAvRG9TV2Zxa0c3R2s4MThhb1dSa2FXMUtxY3BLZU1ZYk9FOTg4SmMKYVhVSmlYblI1cnhzYzd6d3gyWHN6K2RyVXFOTDh4d0RXeE5aU1p1Rml4eFF5em1zaTZFNkRjK1poSWZXaXV2NzQzemM5WHJ2ei9JcQpuNzF2UHBFRlhtU0E4Y094bzNlR1o3eHc0bEhEalJxTWNYTFk1ZmZoSnNzWmJ2SVMyUE1FcmFwN1AwN2JmRS9ybDkvaU1vaDA5ejZUCnY5TEhRQ2kvRjk0blBOWGpCVDUzVEFMdk1IbEV3dnRhL3dCNDRyNzlGdkd3NXlwMWdPbnRlTVBwRno4NHlpOWRtdXRwTjljTlp4WlAKTXI2T1NaWjBTN2hyYVY1N2t0YzhISSttR2M2T0U3TmtNNlJ2Q09mcnFWelhsc0wxMnVMMGRON1NQYVh4eHBFcVhxYTZWd3pLczlGWgpkYlJnNGp0enlYZFlUeHJpaE9IQXF0T3F3Y0F3NFNQbTk4N2llNVBoQ1RNZFdXTWNwbWRJd3l4djJWMU84N3VNR1Y0aW5lOHpYZktlCjVXWE04eklFa0V5UFJaQzBzekU4Z0tSNkFNbm5ndE5lWG0xUGg5T2V6TzBQelpXd1h3QWZjelgzSXJsdW5wSDlJSVdRbU5CUnJ4UnUKdGRaMXpKazUzTzVETHZxMGRWWXZMclM2U3c3Wk1xQjVEclF4RzdQRFJVMnE0dUNmWlg1MitHb0hjalFJcTE1dzExQ3Y4d0FONlpmNgp4ZkxEQzNaNUJHL01FNXk0Z0k3bSswMjJVdlFPajV4RGVUbDcwRi9pZ2k2Nm9oL0cyTWpUYkRtWDh1V0VDL2x5TEZmTzFBTE1YS1B3CkVFY1BhOVFkYTFmbEF4THFXRURqN1k3VENLK1o3TGdkanpMMFdMWFlZOVgwdnYwZStlS2Q0bnRTOTdTN2RjNDJuY1RGUlp0QWMyTncKT2o2MEpFWmhEWGM4WkdqajZVTHBHS1FQYjVrM2M1V25pSEpQbkI2MDBXeVlwSWs3Sm4vTXdnSm4yZ2MzbVZSWkpsZVllUFRQVVdaYwpFZmFkWkduZU04cnRta2Y2WURMb0FaR1hKYXNubks3NS9jRWhsaFArTkNQODhwL3d2bTA1RGFrY1cxNzVob3QzL05aajdHelAwQWg0Cm4zWnBCanEyZllTdmorRDBFV1BlY04zSzVOSU9kSHNoWC81NytPWXA1MFFXcTQ3OUg0RC9sNkgvYTN2VnNvT2RLZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJVUhISW5abDNHUno2OHozR29FOVpkTVA5NmhDTVdMd091K3Z3dXZNUWhRN05aU2JaUElLRVRuTEtFaDMweUU2UXovWUNRSC91Sm1KKwpNckUrTjhUNEpPSjZBT2U1STRSbklXQUhJQjFnY2hKeE54dmhOSURKQU4raVR6YWVmZnhwUngvclVhdlRwNXkxNmljUy8vaGtIL1ZrCmc1aTR5dFNQVlBERHZGSEJYK2Q1Z2NSM0pjc2paUVpIYVI2cjh6OTZucThxa3R1UXkvOHpONnVDNVRKSDVnVFBhd2pNUUNiZEoxMUwKcWJHbzhTUWgxWHU4OEVkcmNvMVhtNmpRdzVOKzFtYlZIUE5wOW5Gdk1seGg4LzFzWnZlVFpyVlBaeVFleFRzTFYrR0w1VENuamFNegpyMVZmbnNuOUwveHhVWkQvVEExK2twQy9YSkx4bDUzZG5HbVRrTDJuV3BMMmV5Wm9kK2FJOU96M2xwZ0g3Rm1USU9zZWVXZWJZaklsCkhOdmVOcG4rZmR2MDczRGpCNU12N1hnVnp5L2VEbFlaejFVWkRxV1NoVHp0VDZNNk9ZaHFmd2pWaUFQZkgwQTFIRVUxcGhwOC81bDUKVHl2MzA0Y2RhZlQ5NWEvZm9OcmxOQlh2UHY0Sk5qZFkydlNjZEpYeVhNSTd0a1JXaVZuaENwTWkzOWdHem1oczNjRWh6MW5TcXBaUApmTEhzYkc0NHVlRXVjVzlJMzBpVHlkTFNxUkh2T3pWemlhWkFtaTF0VmFUQkJJNXdUN3hXTGNkWmoxanFnTnJCWFhLU2pPejByRy9tCnU3cGM4c1d5VEhXNVdOYVBMZFBIWC9xWkd0U3AwYk91ZVNvNlQ3V3Y1MjE2WXNOaS8yOEQzVk0xdzhDYlBNdHpwTHRqVE1vOC9vdmYKWTVMcmVVaDNQUUxabjRSMy82aWZIeHQ4d2dWMkNNWXNxL0ZHQkhtY2hvdHpjR2VlZm52a3FiY1E5Q0tGUEloNEVQQWczaTA4em5ibQpRYmFRN0VhNWpvaVZ4OFM2UWJCcm90MnRJUyt1TFl1OG56M3J4MFdrYVRqRTIxUGo5NHo2NHltejQ0bmIyOW1VYnhraDkrZlZ2LzlVCitpY2RXdjE5eDh2LzhHUDUyUnRVVTh5Tm5RT2RhWklad1YzVjBoNW8wb09XOGVEOWg1cE03UUNQZFc5MDJsbTRqME9DSkxkd2U1S2sKMGNnZDZqeVpwZnZlOHVuZG1yMzd4bXpleHhiNzZSdEpUNWpaZjRhTW45TkozczNscktSSFNyeGNwa2UrQ0I5YnBvKy85RE0xcUZpSAo3aE1ZdlFMdUZ3aG5DQWpIUDR3SGovZmNlQ0kzeGwxYXZKNGsvU2taOGZZNThaajV5ME5YVWl0ajlNc2UrWFVTU0hQeHNNeTc2YkdvCm5EUHN5dFBLemZUOUlKY1BLMy85QmtjRDMxOWRLdjRoR255dmJqRTk4c1hsUXdmT3M2ZVBXZFNwRlUwWGp5Qll6N0pMN2pOTWhyT0YKNU12b09Oa2EybXp0ck9hTlczYkhHZGtCRnhkUzNJUVRiczhrLzJEM2lSYjVld1B6cWswK3lXNStMNDk5SkNkZmhYZkhxdnZLWDEwcQovcFFHTDZzSXl5TTZoV2tjMDVrS2NxYXNuR1JVSG1GaFhmdHBHdEhVMGtENzNxVlpwSFYzVVhsSGM4M2VHQmo2U0Myc1dDTEFoYUplCnBLQUZoTUx0UktudnhwTCtGUU5DTThXZlpmYURpVStCenpEd3didzNFOTE4STFxanluOXExVlBoN3pnMXVZOFNuOGw1a084ZzFVR00KZy9CMlRWMERjbGo2aTBmUy90amcyYzllUDdOQTQ2bDk4TE4zNG9uQ3QxY0VIUlNVMmxFK2UwMXptd1pWczU2b21tV25wRm94VmVVVApPK2JzNXkvUzRQdFZnOGVPSzdReVhUd1M2dlJNcDFHZGFWck9XUzlTSzVvTXVUa2VYbkF6NERidkcyQXJ0R1I2eVE0Rlc0ZVVlcFlEClVKUHF1UmR4OUNPK3o1TjRudEN3cHpQa1FRSmI4eHJ0ODNqZE1OTk9wR1VKU2ZsNURxR2VZdm5YbG9vL3BjRkhkSWRIaW1rYzA1a0sKY3E2czdKV1pRYys1ZEpEQTFNOE5zSEswckNMOWVJQzdJYi9JM0hLTXZDZkx5R1BlMDlGMzZtZU5iK1l4N1FmN1JUdGNYQS8wdTU1MgpwdXhvaHV4S3Y5OE43ZGVCbnI4c0R3eDd0VUpLL3VwUzhRL1I0SHQxaSttUkx4NVhZTzR1NlR4ZEk1cUdMUHk5akFwVlY3TThKMERYCnhWWnpJNVNlcG44eUphNGYxMzQwUmU4OFkvOTRZbnNIK2EzbVNqRG53ZVJZdjdQemNmVWs5blYzTnU3TjNlMEo2cXdJUndJK1ROZ1cKVHU1dHVERjM4VUhEejlsY1BhVmU0YURmUTFtdVFpNkRVKzdUbXFGcks4OXhJNDU2RG5IbGNUekNNMFBXM0k1TDJtSWdtaG40NnRHWApGOUpoS1ZmQ2x2dkRmSEpMZXZyUkI3MVNMWWU0WEpYZGMzeDBDNS9rVE11WG5HbDVoMHk5aUhzNTNhK2VuQXgyV1U0Uk1LY1ltRENjCnc0cjhUME9XV3o4bzBrOGc4bi83QVlmNzR5RzdpSlZPUDA4NzBXQTgyZkZVU0lEQUpjSldPN2ZYTVp3ZkR1RTBkZkVrSCtwMDNCOTUKM0pPcFAyWWZKQ0oxUEwvaGZqaG83ZndBaDIwNEpHMS9oTVBTam5DSTA2T25PSFFOL0hvd1QwSFlEUHU4clpFbmlNMnhsdUtuWnEyegpMS0RJdUFJZUdCOGV6ZFQ2NFJmck9WdXlKT2gybGpteHhHSlhWbzlaMkJUSGVobVcraEhYZnRwYXV3Z0R6ei9pd0gvRWdmK0lBLytzCk9QQjF1N1RTaEhvV1hSU2VFRjMwZUc1NjArZytzMG1tN1RSUG5HMVBTT0h0azdjZkYzUnI1Nno2a1VIOTBLRGFEZzFhaDhPTCtvR2gKT0JucGhQZC9NQ2ZkemNLUHVsclBTemc3UzJFMzRSNzcvcFBtVnJrb01wWDh2c2kxUjZPKzNuUHl3UTUzZkRta3JNc3U2NldwT3pUdgpGb3E4QzFoN05FNnROMWhQWXRST1R3NDRlOXJMNFdtUFQ5N0htZVZ1Q2ovT2ZaL0tmOSt6S3A3RzBwK1VKLy8weE5ZZ214SzFDNW16CkVOWkJtZGR0c3lsdWJMYk45ZE16UlUvV3lTZTM5YmtqM2Y3bER5L2VQZnpYdy9IbHMrZi9JY3RpOS9FdmNRckl1ZG5zSTg4Qm1jNFMKem5xNmFrODNPNmFhdlczSENlNXpWWHVPMlJ1Z3J1NHN2V3djOE9oN3JQemo2ZkhINVBqSGpvLy9GUGovelpEeG52ai82ZU1EQUt5MApGSkNlcVBIVTdISmlOZmtoejFjNXM2eCs5QWtyazZxcGo4d1V6OTJaN1NoS25TdzlQN0dMd0QxSHNZaStHME1BWFBpOXN3TlBuNURuCi9DUS9zVmtOMzJjeGZGcTh4ZmxoQ3g4YmNiRlBMZEFQV3poTklYRjdJVW5CazZiQ1I1eGNNMyt1czJ1bUN4TmhGNnBELzk4NEVjWXoKU1gwYURNbXEzemNWdmk5aDlUNWR0Wm1ScC9wcEFTNm5rK0oyK3ZnUWwyR0tEQk5sZXVSWWpuMDZpczhuUFpzTS9aZHI4SkpuNnRMQgoyR1hQM2FZTHpPMkNmbkV4OC9BKzc3QUZGRTJmR0ZGVU5LYW9oeFJOSHg5VFpKNkZveG9mYUhaSXQ4c2thMk9mZHVUdVF1S1JIK3JvCm9vOHgxVjA4dkdqNkVHTmR3L0k1a3M4VHQ5MzIxRzJUbVNXWXZhMGxiN3Q5VXZxMmZmSTJpMGFhUGkwY1NhTjZEYlhLZUtUcDR3T1MKaUZnRm5tRTFwQ3BBcXJLYzdrL1N3NVFMR1dSK25Bby9Ub1VmcDhLUFUrR3h0RkVma0ZUcExEL1VoMS83UTVtY2hQRFZQN3g1L2VYYgpGNi9mdlhqOSt5KytHSFR0OFl2cEg3N0JOMG0vK2ZMWnUzY1BiMStMRW43OThzL2ZmdnRNMUcvNzQ3QnRWOXVhRm5oT2wzVk5oN2dzClY3S055eDlodlpLNXRQSkpyL252di81SmZuM0hQOTNuK0s5LzVzZi9JWC8rYnlIK1NWNys4S3ZEdi8yditmQzFYdkpyK2VYMzhDWVAKcjRSNGRxUERMMGVxUDg4dmgrc3YwWFpYdjViL2YzYjk5dDN0aStmdlhyeDUvZXp0bnc4L3A4bmlaOGMzYjE3SzIvL0NldUtydTY5Zgp2SHZ6OXF2anMrZi9JYjMxMVc5ZnZIejQ2dGNQejkvOTlQQmY1WUwvVS82M1YvMHYzN0dCVzc3TlAzSTZSQndWcURiSUVETW54aUlUCm9sclNQenRBdGZwWmdjdFc1N1FkL3ZVWkc5cDFYQXJoYWs2cmpIdTlTaUxaYThmSXEwVVJ1QTU1dTFwRnBEcklpcitTcHZJaEZ4elcKS3U5Y3BYcU42WkR6VlpDMWRYaU95MnEra3NWYkR6bGVyUWdCRmNuL2FwRlZkVmkyS3hINmNYYnNlaFZrQVI2V2RDVnJMZHBsMjlVcwpYT0dRNU12Q3hvdmVMZGFySEdIUXIvTlYzamFab3VVcXdmakt5OHB5SlNxSTFGb1JtQ3QzVytVdTg3SWVVdFJuQWlIbHVoMlN2SVpJCnQzcVpFRU9vNVNERFhJT00vVnF1SUcvQ1A3NGhTbFMwSUJuT1hFQ0lxZHFycmZNVmxKTERzbDdoN0o5RGxLNEpzaFlQUzdoS290OGMKV28yVXJ4YS9LRnlKb0xxMng0NXJScTQwVFptRzVHVHJlcldFYlRtRUxFTXFnNkJYclZkYlNPc0JOd2gxNHdOSmk5SldYWEFlYms1WAp4Z1NFeWZoRjhqYnNzaS9DbGJBb2RIV3FWM091NGJCSUh3cjdFNEk4QmVaRElEdkplcDMwT1NDZWgxRHNOUlpoS1J1ZVdVWWNuU3VmCkY0VERZcnczRzdDRW1TLzlLYS9LMFVRclhCWnl6N3pLZTZaRngydkpWL0trTmw0cFhNbmZNb2RXNmRjZzd5V1hWMUVuRHVzaTQ1YmwKbGt1VW0waTdxOXhNaGxZdmt5a1hwT01PWlVXMGRtVW5DbmRlY0puc1NFS1FSWmx5a0haV21XV2h0RWtscTJSRlc0ajZQYVJaWG1pVApjYStMakxNTWsweDh6bUNaa3NMdmRjVGtzYTdXV2ZwY1ppQ2NUREtWY0RONXN5cFhaNWxUU1dZYnAzU0pPdXQ0bVF5d0tEYVJrZGRGCk9pQ2g5K1JlOHV4elR2Rnd0c3B3MWI5elFkOXl5Q3RUMmFFKzE4bXJrU2dUQy9rSU9WczJCRjNMdE1JYlJIYkEzRDdyNUpISGtxMjYKMTVHVkkwcmQwSWdSL0ZZK3U1VW9jM2RiVWN1YWtibkdGMnYzY2tLYnFYaWdYc3ZmbzdWejhtTCszaW1nSTJSWVNwSTFML1BxMVk2NAo2THhLTWl0bFA5NUFrTzFWT0lTdzJpeWoyQWc2YURMTGdxeU1YbXZSdS9aMm5HQjMwOHVjR0s5RVk1VkJhKzJFcTBWR2Y3aWJFZlF5CmY2Wld5NSs2dFhQeWJ2N1MvK1dmNUo5L2V2SUc4WXR2di9yVk05bFRiOTU4OCtldjN2dzdONHkvZi92bXUyOTBoN2g4eGE4ZnZubDQKOXU3aDY2L2tGcnVkWkR2ODVLZUhmLzJYQzN1S1RJeTh6c1FVQ1YvWjZQR2NTNUdld1c0aXJLakVQTzRtUmMvbDF0MWtxVmRseTdJeApZc0VzT25NN0Via0o0Q3FWQ1NKNnYweGxtU2hWZUt6MHN0WkFRbHdSOXRoRlFkaEtCRkVtaTE0bXF4RlJCNGVTdGZGRzJLd0dMM05pCm1EZTdMbUtYbHAwNWhOVW93dnZXdUEwVVhybllEdDdyeWNUVmVuUFZCMnVVcmVvbXp3dWRLRXlHODd5OWNRWEQydzVuM2JKZjcyRkIKZndnVHFWRzZWYmpLcXgxUjVBOXdyQ0RzY0JHaDF6bFd3RllqbzJJZjlRMlF2M2p0VmRDRlNYYWwxa1lqMkoxYVI1TVlaREFyN3VUTgp6THBNMjYzbXZtejc0N1JLL3NDdG1aUFgyazM4M1pSTGFhNExrR3F6N0E5MERzMjVoTlV5SGMvTTZWblZ6eTUvYkl2czJEcmhvdXlkCjdORzh3QUdibFZWaTVRSjBsNE9JRmNKdjR5emY1aXdNR1ZNSzIvVXNlNDNzQjNqV09SaXZuSVU3cjdLU3VWV0FXd1ZoMzlqc3RrVzIKMWlxYm42emtUVGFmd3lhN2dFZ1NlaGwyQUhtNVRaaURNUDREOXpYWmZUWVJla1M3a00vQ0I0S0lNYktIYkZ1MDdVaUlKVmZkUjRUcgpIQ0prRzlHWTBKc2l6SUVnMWF1SUc4STE1clRZWlVKYzVJME9zdWZCOXNtYnJWVkVCOWxFNndLSjZMUS9UbllXTEE3c3JYTGZQTXY5ClgrMkllRi9zeFBLZWVVbWNScGcxVVhoY1FKZmI1K2ZleDZYR1hrZjJlT1FvNlkwNHdXNmxWemxSUmxpMHYwTnJwcUJybDdYZnl3bDYKbVQxUXIrV1AzTm81ZWJIZFhBdUg2MjgrbWJVRlNJK3laVUx3a0wxZkYya2paaGtsR1Z4NThxdFFaYTdJc0ZYTVlQQVNVVlJySXlpUApFc2xZNXNCUVMzcHhGY21vdCtNRXU1dGU1c1J5QlFYODBOc1JrVG5MOFBlN0dVRXY4MmRxdGZ5cFd6c243OVo2VDNVcjl0NG5yOVVnClV5VkQzc1dVRWE3SURvU09nRTEzbGJFUmVUTUlLeGZobFk4V1NzUktGVFlqUTRTbHUyRmg2SHlRU1FaR0s0dzNZNWFMNUhzVnNaNWsKK3ErekxJeFE0VUplWXlPd0l5RHJ6MnV2Skt1R2ZEc2w1L2RHRUkxbDRPNUdGT0ZsWFdYMUJ3aVc1T2FMWFNiU1VDM1lGSVR0T25zUAowQnVLek5sQVhzUFdSWW9xM0hXeUNyU2RFbVg2TG41bG80cEVEQ01JZDUwTjR3S1dDbmZJQWExdklsWjJDcStVSFhhck12eTluanhqCnljdkNMWS9xeTBBUmpXRUwyYTUwS2htSWFGL29yTVRueDVyTkFUckJDaTgrbmovb0lQRktXWEdKYzFqMnlCWHlqUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJak8xVldyRGJ5R3ljWlorUVVmVjlOSlRlUTNHV01STEd5dWxIaFV3K3lBVTFzRjdCcXA2dEorYXRiNXdjZll4am1JRytBcGg0aGxKUQpPQUJsa1hVZFpIdEcyQnk0Y0oyRExSLzVzS3p5Z0tLOUpqQi8yYVNrdTRUamI3UGUvM1NHbm16VDBCMDRTUU51VTB5NjZWU0loL0xXCkt6aFlVVjVBMWgyRVhTTUhTNmY0QkZuQTRZZDZVVjUvRFVOVGpXQjMxQXNiVlRvaUNUOFltaElwZEpWbE05elNLSHBsZTdSV3J6MTkKYSt2MExiMFhSRFBWM3NHTW5uTlVLUjFqV3pPWWlGTkZEeGJCZXdaRnhuL0xPMHBSTFV2SG8xR3hzbW8rREczSmVnZ1lrWDVQbytpVgo2U29LS3gvcnlTNEwrTlhRVnFQczd0bW83ZGxhVyszNVQ5K3o5WUNzRXZhTktMTFVURi90aUVEVVo2eXdwTDI4VkZYQ2crZ0dDYlBRCkNjNk1rSFdtMTFxckRtdHJweEhzYnM5dHVpa3h5UlNCbU52YWlmWkM3VzVHMFBYdHo5UnErVk43TzZmdjlyaTA5aW5tSnVpSXM1QkgKK3hMWUd4UXROeTlCSGNpQVdMcDVLU3dpZ1ltV3RUTXZRU2lWdlc5cjVpVlZHSVFMdUhrSkl1bzhMOHZPdklTMk5naHNibDRDcitUZAozTHdVYUw0UVBqR2FsOGd0d2ZQY3ZDUnZmZ1h6ZFRNdmdSRGozcm9VNHFKU25GbVh3RjFsZXcvTnVrVFdKMHJIenJwRXZpbkNZN011ClljT1FUbHVhZGFuVjZOWWxzTXhscWYycFF4UlJhS3RyTXkrRktITi8yeG1YUUNwVk9MUWJsNW9rNE9ZbHJMQ2E2cll6TDRIeDVpUjgKdXBtWFpCRnRFVlkwc3k1aFVjbnVzVE11eWRMTE0zck9iRXV5L0dYZVJqY3R5Y2UwMENqWVRVdmdCd2tIcEpobFNacElhZDNjc0NSOApXd2FxN094S0ltWXpNNTZibFRaS3lLVlpsV1Jud0p3ZGJVcmtmVnNKemFhRXJvTVE2U1lsdWZjVlhBQTdrMUtRdTNKSnVVa3B5SFROCkFDSzc5aVhjbHJOMk5Da0ZLSytsVzVTd2ZjNTFYWnBGS2RTb3MzaTBLR0dub2xqckZpVzVyMnpLOHNodVVqcGJXQ2Q3RitOdHdySXoKS1RXaVc0TXdIV29XR2RqTVJTRXk5V0FlVFVyWXJTS0VPNjhUWUxTRXVjMGJjY0pvNU9sRU13VzFadHhZMU80MW1wVGFBL1ZhL2g3ZQp6dW1MamJ4YTVLRmxaMUxxUkRNRmdTK21MVGRia2NpY0NKdmFkaFlsY0ZTRSt3eTFacjFwYjhZSmc0Mm5FODBTMU5zeFcxRy8yMkJSCmFvL1VLdmt6dDJaTzN1eHYzYUQwOGRxOUxQQll5WVhNT1BkcXBNcFNwb0d1dVJGazR3YW9WQWhCcHd2WVVNNW1PWVpLc1VScTVtbWIKNFQyUWpoWkpFWmZsWk9aSmJzVlNRN1lOZHhDWS9SL0duU3lNcEpueFJjWGdXaFIySWs4ZFF5T29CUjRDZXVtVllGa3ZJc0xYYW40RgpKMnlidHQvczd5QmlOY3dySGxJMk0rRTRHMVVFQ2lNd3hzWjFJT2pMVmRFMnVJUzlXdXU3WUNicTg5NDhNUTZVV2UyYjJBUkVDRkk3ClZLY0tVeFFaZmxFckxqMEhNWnB6QUh4eHphRlR0T2ZnaEVqcldDK3FwMkJveXlsK1R6ZGJHN1dZUzY2MUJkMkpvOWZ1NlJTOTBwK3QKMWV0djVXMmR2ZWNQSXVvMEl6L2szSFhkbHIwdkRTb0tPWGR6cHFHZWFQT2xlOU1nbSthOHVsL00zR215VTRzSWlDdmRueWJhdmV6RAo5TERaU3NDMkl2SjkzbnZVS09NbDNxRzQwTG5xM0cwK05XZ09JaGI1bWpHbkdsVGN0V0FTdVZjTjNJM1AxdHhxMkpPNmhjdjlhdGk2CkFxWjA4NnlKdkNDRG4zSjNyY0VLSUpQZGg5QThaOURHUkJ3czNia202MEJ1empYb2RXQkJXVXk0Ynl1enZZTjcyS2d5eWExR0YxdFMKMTg3T3gwYkpNeSt4T2RuZzJscmt6czNMRmloNkxIc3ZHNVZycUNITnl3YlJVM2FqT0xqWkZuU0lTUUhkenliN21MNlJPOW9DOWxFWgpyZVpxbzdraEIzZlFtYThOTDY0K0ZYZTJRVDNmSXVhM3U5dlFnZlBpN00vOWJWUnZOcnlqTzl6aW5DQmVidDNqSmt4VUpCL2JrSnJMCkxkSkZVa1AzdWZGS3ZHOXp1c0d5Mm1hUE85M1FYQzF4N1Y0MzJDbXBwRFMvbTJ4dElxaVpnYWM1M21LRVJpZzdaUE84UlhER1FLZWEKODdVdzY5emMrZDVnRXFLWTZjNDNLSmVMOVBmaGZHRSs0bjdEOTF4V3IvYlVLaHR6M0xvRERvWU12a3h6aXpYS3pnazMxRE1IMjlCVwpvOWc5ZDQ0NE1JS2E2ZnkxdHFESTBzRGI3dGtvTzEvY1VLODlmMnZyOUQzUDNIRlJ1aXBMcCszOWNUREFjTzQxNTFjTXN0R1cwRjFrClR0ZzU1SG90MjMrR2hockZicmh6eVdHRU00VGszaFRVa2hDSEd4cGg1NVBydGRxVHQ0Wk8zL0QvdDBKVVNFSE5sU0hCS0dqVEdic2gKOVRwOExkb2hkdFlaUmpxbzM5S24wR1JwYnlaRnVCOHBybWlxZzIxRnZBNGxFV0hvQzJ3dXdpbDBMc3F0MU9EbkZOV1lrbnIwZWoyNAozQ2pHZzZQa0RRelJlRmJJWUwxK3BXZzFkcVZzU0x5blhEa25tRzFnSk1WK2RQYWFKeHBRZ2o0RkcxbWUrM1k4VUlOdU5tZ0hGbWxZClliZEE1ZzRmQTh5VVRsSE5SQlpQbXRlaG5uQ2VDald2TjlVcGMyYzBuU3F2b050M2Eyc1JkaERETXR6VEtjOXRKUGxvdlpvL2ZXdnEKN0MwZmwyMCtoNThYL2h2T2daMmpGM1pjSFYvMzlNS01QOE9EMDF5OVFRUWgyQXIydmw1YWlubWx1M0hCTkhTV05Vckt3NXhxMU1YbgpsTHQ3WTNiTzZPN2VSdG01ZTNzOTkrTkdyb0EwVWxMcGs2cFRNWlI1ZFBCaUY1dXpqZEcraHg3eCtVYUl3c2pwLzJwUGhROGdydDNyCjIzWk1kOFkyd3M3ejI2dTVWN2MzMVNsMnk1MzNseHNyRmZqV0Z1UmpXdGI4bGs3WU9ZQ0hhdTNwVzFPbmIva0QrSURCcjRRdjFMMlcKMktpdUpUWnJvR3VKbUJZMHFveGFJcmlIaVBxeGFZbFFxRUlWSnVoYUlpd090QmVPV21LejQ3bVcyTXh4cmdEQ0RGM1dXSFphSW5TLwplVkFsWVNKYlpESzdrdWlmUngzUmFVMUZoSmw2aFgrdjZYNzArS1Z0M2V1SXNHS1ZCYy9XNnJXZWN4M3h2QzlQN1VpcldpeDJPbUtuCnVsNUhzd3htVmRQOThNZWFjdG5yaUxUNnBDVU85VUpWbTE5dnExRkdmVzJnbWw3WDIzTGRyOTl6MUJIN3MvVjY3YTFhVzZmdmVkbWgKL0NtbThDVWJMQVdHWnpoOVgrMnB4WlNlWlhFbjRhb2FCRmJWREptbFVkd2VUZ3ZuVUE4N09seHp2YTFHc1hzNjh6RHFabGFFMXBacwpSTUxGMXVHZVRuRmp1cmtxVzczMi9LMnQwL2Y4UWJ6TEVldVU3bG5aQ0NqZVUyb1h0V0VyaEJoRkZSeGlvaVc3ME15ZmtDb0pYTHdVCkd2NEIzZGdjMXlHVGc3NG9HTlJqVUxhcElvZDBzR2hKa1dDRkxVWjlXZHJtSE9RUTRYekVacXkyR01JZXNPQ2djbUVxUURMVkxvZkcKMkd4TndLbHNVUkU0OHJLSnV2NmFpbDVadG5XaGQ1V0dYdlNyZEpiTmFhajRDVzhsKzc3cTNmQjBWVkxnaUlZT3Z4VzFHMEtJRXYzUQp0RHRSNFdUVENIUitLNEIycHZ6SHpVOEJ1Q0ttdzl3T0tTeTRnaEhBVm1HdkZxV2JMNENkcDlMbHVHSVJWY1Y5cmh0VTJES3JmcXhhCnN6UnJHbXlBd2hjelR5YUhaNHNXY05qVFJPcE1ORHFrNUpwdnB1MS80V05WSGNsRk1RSVVDbFdIUEowREo1cGRYQlUvZ2l1V3NoaTgKdVZQZGJJQlpRME92OUVrQnNKN2FxYnJpamFKekpDa2VaNmdubTJLb2VXeXJVZXllZW1XakpvTy85cmFpYnBYRFBXUGZQSWRuYS9YYQo4N2UyVHQvekI1RUNZM1pBd0Z5NkZOaW84S3BUR1Y2Q3dlTjhDV0tZU01oWGN6UVhCeVpVWFdGbmhTMWxVUnk5eW9Telh3ZDFrZjVBClVkcWFOQVpoczFEN2dDaW81Z2JYUHFDR3VHNGNYVG5vRWlCOEw1aW92VjdaSENxNDZSMDRLeFc2c0kwU1lEbWhnaE5xWDhpc1ZIbTEKVVdUWk5BbXdVMHR5R1pPK00vaWRrVnNtY3RvckRyR09Jbkl4R0FxTWZmcXdxeitzL0tHM3JMTzlwbE9jTjVRZFZlMkYyQ0ZnTHd5MAp3SGxiMjZBOWdmdndZU0crNjJ0dU5paUFYT2lnekI0RElHd2orVDA1ditlbHFqMUlybEsrcXlKK3RQVUxOcHBpcG9tUUJrMi9VdGxJCkVjMGNGclE1V25lczJhMHIyYlhCMlBWUzJxd1dDQVR3OE5MRUhseHJCRHVsUVFES3JzNkQ4V0VYUXdOU2g2UTFyczNzYUZQMGZLNmYKc0JaTVNRRFo4REkwbmIzYVUyVnJxWXVhUE5hbDZsZ3RzRGxpYzlDdWQ0b3VCK25vQXQ3WjZ4WDFwUTV0TlVvYXpIV2RtbkhVVlRnTQpiY0VxQkl4OHY2ZFI5TXIyYksxZWUvN1cxdWw3Tm9lYlRGdDZ0ekRmdVZXOTJsTTNOV01DckVLM0dPd0htWjZNRldoSTRsMk1va2lICm9OaWRvWjZzMTVoM2JUV0szZE92TkdveEMxZHJDLzVTbURyN1BaMmlWL3F6OVhydCtWdGJwKy9aZWtBR1pzdllja1g1SXl6eDFZNksKcmJuUVhEKzd2UVFqeWIyd0VnSFJDTDdpWjdyL2U3VUZ5ZWJTMEZTaitDMzF5a2FGK0VPZm9iY0ZLRVVKL1k3MldSbUZQNWRYNmkvawo3Wnk5b3I4ODdLMlZxQytndXBNNVhBZnFBdWxYb1hvaVRLcWpnWkkxektLeHB0SXB5bnRnMG9DSjNLa0VkZkd4dksyQll2ZlVLeHMxCm1tRFgyNElmQUs2SGZrK2pQTGVudFdkcjlkcnpXMXZuNzlsNklNRzlHeFhQSklxTCtjOGFGZlkxQ09IZ2hETm1uaXczaW1vQS82WjUKQzUzeTNNUVN1dmlIZW9CQndEdlltbW9VdjZXTENFWTFxMFZ2UzFnbjBKVDlsa1pRRjRFOW1GZnFMK1R0bkwzaUQ2RFBOd3d6ZGdwNgp2SGFnYm14VkszT0pPcW9iVzlDYTRTaHlXRGRNRXFtNi9kMkIzUkQwMWF2Z3lHN2dzRFBzYkEzYUhVVVV5RnNOYlFnQUZZS2tDZG5JCnNkM29LSFZvT3JnYk5WTjJINDJCdTJrR1dkYWxvN3NwNUFCMjB1RGQ0S2RwTzRGMzQ4MElXR3I0YnRqRjdFYW5uWE82RHhrUUduOVEKLzlwQnZLSERKRlZkREZMTm5Sclkwb2E4YnBUbjN1M2c5ME05dzNBUGJUbkY3K2xxa0ZHcjltSnJTdTVFSDJpL3BWTmNFdFJINi9YYQpTM2xUcDI5NVdUMy9ISGh2ZXIyaW96MDdWVkVhRFZ5Tk9TV1RaK3NZN0VaUmM0VkJ0WWQ2aHVidVRUV0MzVkV2YkZUWnhWZkNhbHRUCnhlekEvWlpsTUJmM1IydjEydE8zdGs3ZnNuRXptRzdoN0lQYUxwekNzQmVOS2dKVW5nTWlBa1hJS21ycEMrWkRuR2NQL3dpMnNjSm0KVzVaMUhlcWwyWUNhcmFWRzhUczZVMUlxVEd4QWVmVzJNS0dXYmJ5blUxU3MweWRydGRxenQ1Yk8zdkVITVUwMFdESFdFS0hVSS9TZApzaGhOaG81OXgwTEppVjR1QTc5RHgra2hrSTUrcHljUExLREIzeUhuYkNYR2puOXZGQlZ2RkFEZnF6bTJIY0syMmNDZHNvVlIzekVxCmVTbms0UWFDcDlDbzZvaWg0TUZDbTJ6ZFlQQndscXNLNGZCMjlENGx5RTVaWVdEd0t4dFZwSms1MHFkaE1IamdlK2ltYnpENFJsSHgKeDJEd3ZaN0QyMk14cEVHbnVObkJCU2VqaGl1Q2doMEZIK25tQVVUQVVmQkE1cXp0WVIwRkR6ZUUyc2tjQlEvM1FpcHI3aWg0NkJKZAorWEFVUE56c2hFODBGRHgxamhSVHg4R2o5YVo4TkJ3OFVBZTB0emdNSGlOQXZ0cHc4TmhJa0RqSEJDUUR3a01SWCtzQWhNZEd4V2M0Cm43SW5kbUJIaVdNUUE0SXBYdTJwb29MaDZPS0dPT2M3YndNVzNnaytTWWhmNzdVTTRqNDAxQ2gyUTcyd1VWMnhhMDBCT0JWSDlIMmoKNkpYK1lMMWVlL2pXMXVsTE5rbmZJZUtBZVMzQkF4MGR2dDZvRGVLTzJVOW55VURKUThoSHA4SndCY2RmYnd1Q05tRS83WjVHMFNzTgp2ajdVTTRqNzBGYWo3TzdacU8zWldsdnQrVS9mcy9XQXc4VXhkOHJpMXV0T0ZSWkdJSXdEejBXQXZab0pyM1o4ZXFNNGF5S012ZGR6CnBIdHZxMVBzbnMrbkFSRlAzWVNHbE43V2JHL1c3MmtVWGUzdDJWcTk5dnplMXRsN1BpN3hmZzVjL0E0czVzRDRoaFZyeVBpR0ZXdlEKK0IxV3JHSGpHMWFzZ2VNYlZxejV3M1pZc1FhUGIxaXhobzl2V0xFR2tOOWh4UnBDdm1IRkdrUytZY1VjSTcrRGlqV1FmSU9LTlpoOApnNG8xLzlvT0t0Wmc4QTBxMXBEeURTclc2NHhRc2VhZWE2L1E0UElOSzlidzhnTlNyQUhtRzFLc0krWWRLOVlnOHlOV3JFSG1HMWJNCklmTU5LdFl3OHlOU3JJSG1IU2ptcVBtR0UzUGMvQTRuNXNENUJoTno1SHhEaVRsMmZnY1NjL0I4dzRnNWVyNUJ4QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJREQ2L0E0ZzEvSHdEaURtQXZ1SERHb0oreEljMUJIM0RoelVJZlhkak80aCtodzl6RkgyRGh6VVlmWU9ITlJ6OURoN1dnUFFOSHRhUQo5QTBmZHI0V1QzMmdCam5mNGNNR3FtRzZHbmk5NGI0YXhuMkhEMnRRK0Y3UDBmSzlyVTRac0ZvRDFUQmRyYTJHKzJyMzNPSEQyck1OCjlkcnplMXRuN3preWYzcVNkdml3Z1dxd0xvZXlPL0NyNGQxSGVGaER4ZmRhaHBzZjJtbVVBYTAxVUEzVjFac3k0RmUvNFFBUGEwL1YKS3JYbmJ1MmN2dDhsOWJKN0VtRnVFeFpoOXA1R2hTV2hxSlNWeVZBS29qZk0rbElEVjZOUlZQMTNMdC9yQ1pkS1N4amJhaFM3WnpNYwpLRlZXRkZqNTBKWnQrY005QnlGZ2VEYXYxNS9mMnpwN3o3WWVQa1hCUGtuWlJLMHVMV3FjS1ZqeHIvYlVvRkUyc01VVUlDWXhXSE5TCllaZTdmYU80RWNhVXFWWXZHTkNsTjlVb2Rzdm5ackF6YXRKZzFhR3RqTDA5ai9jMGlsN3BqOWFxdGFkdlRaMitaZS9MajljdjRRbWMKaStvY0lqT2FOTnFwc0cweGVRV1E1dGloQVRDbjRKOW5VeVdkb3BxWEorcG85UmhTbDllaHJVNnhleXBIZCtvMksvUzN0eVdVc29IUgp0SHM2UmUvcHo5YnIrZlAzdGs3ZnN6R2twWnFrZ1kwSEMrWFZub3JlTmZUWmxyT2xEZ0dDT2VnNVNGdW42SHNBRDFQaldFOTJHaHBNCmUxdU5ZdmYwUGExUjYwb0luN2NGQzFvZDdxaWY5U3AvTHE4enZJKzFjdnFHbjJVUmh0TkZLQktZK3RDU2dvdGU3YWtBUlVIZGh0MlUKbnRNbFdPS0poSEF3V0NxZDB0YlNHdU5ZVHg0Z09pQkQyMm9VdTZlYmZScFZrMlMxcGhiR3Z3eDNWSUl2ZTNzd3J6VzhrYlp6K29xOQpJejlCZ0QvaFpxcStNUXJUUWhkZjdhbUFuQ1dOYjlaWWRCbldBbTgrbFhNSzRFNVJaVzFXQ0VhclZoMy8ycHJxRkx1bE8zK05LbnBWCm9KempUY0hNYWlLQTNkRW96MDNGdFNkcjlkclR0NlpPMy9JSG1aU3drTUJQTEtJL3NqS2FZOG1KaSs1UzhQSFVMWVVEbElpcU9oTTUKclgzV2R4SlpyOGo5V3AxVlhUaTlFU2ZZclZ3NVY2SXM1SVZPY0crbWFMaEV2MWNaSXJYYkF4VVBxdkJIdG5iT1hxeTdVcVBxd0JzQwpXdHlQMklqU1cvT3F6czhVNVRFMlROaWtEbFdxc1U1UXhycXBBdHRxQVk1UVZRUFFkaHJCN3FhWE9SR1RBeXlwdFlQMXMyM0QzWXpnCnJsZDlwbGJMbjlyYk9YMjNIMkw1Y1p1RnlBSjFnMTZqVjNzcTVMdlZRbVVpSEVGUVZPYW8wb1JtUm5PSzg3RTFwVFRXdzl0dmVXeXIKVWV5ZXpzZU1XaFRTUGJSVlRhem85Nnc5c2Nid2JLMWVlLzdXMXVsN2ZnNXg0cVF2WTFZak5PVnRHRWRmN2Fnd3RzQWpEQVZ0aWJPYQp6U2hmUnpldkdFRUZUcmpRbG0yb05hdTNiR2pJS1g1RHZiQlJJOS9rMEp1aUhTZlY0WTVPMFN2OXdYcTk5a3F0cmRPWC9DRmtYRERPCjFSTEdCTWVJZEdJMFVBT2N0VVFMdG5nMm9GRFcxQW1xd3FVclpPa2ZxMkdOTWF0SGE2cFI3STZ1L0JrVnJoRmlIRnRiU0Y0YTZuQkwKSStpRjdjbGFOWC80MXRMSkszNytDVWtiekd6eDFMSkFISVBjcURBMlpaVzNwQTIxQjJyd0hqeVdXMW83UmQrSytYTzNzZDVNODhYUQpsQlBzam43ZDdCTnlKZ3JVR3hLS2FORExjRU9uZVAvcmcvVjY3ZUZiVzZjditYbTJWaUI3a29hK01pengxWTVZUFNuQmF1WkR4dm9zCmFzOUZzdjVPVWVGaThVeDhyWjVJV1VncU5MVFZLSFpMdDhNb1ZmcU11ZFI2VzNIV3dKOStUNmM4dDRmVlordjE3UEY3VXljdjZWMzMKMmNLNkhnL1grbHcrUTBBamsxbDhHNW9ad0s4RnE4N0J6UEtpY3dIT3g3SE1BR1Zsc0xvUnlsd1JlMUZ6UnpJWEdyaFNCeklYakViYQp3NWhsN29zUUVEdUtHZWtiS3h3TURtSmVrWU9CcU9ZQnc0eXdyUlhENHhCbUdFcm5VanVDR1U2SVV0SWV3QXl6OCt6SUp1YmpKVVF4CmRmaHlKZ0I5RDE2V204MGNhY2N1TXp3eXJoMjd2QUl3UU4yM1k1Y0xBVnhMaHk2WFRkWXRzY3lHWEthSVRPUGdBRnlHQ1hjcnk5cVIKeTRHUVF6cFV6WWxJcE15NmJYdnNNdEF5RWJab2h5NURGbHRTQnk2ZmpmYmU0bGhoZEFZYkdtSExuV2dXYk9SZDVDZzZHQmtoM2FtRQpQV2E1d0Erd2JwMVk1TmtxRkZadnB4TUc4SEFuR3NhNHQyTXc1SDYzQWEzY244bHJ0YWUyZHM3ZTdYSC95aWVoT2VJZXBReUNBNVFoCnpqZHdjczA3V0hKaHJFaHFxR1RoejhpQzB6REp6Q01UOTRoaytEK0M1ZGtqSUJtaWN3Y1pZMmFqaVJHS0xPdDNnOTI3RVJOU3hBMzQKWWdRZG5XQ1EwMGlaTy9CNDNpT081dzQxQmc2NFlzY3lwSEdFL25HQ000WUMzVEhHMFI3RGtjTkltclN1ZTN6eHdpeDFuWWFFNmRHdwpwUVFYTDliSUNDMDJkQU0vWiszVEJpa0daSUJaT3djM09lWmZ5VXZIRTFkN0VrY1RZeDdOS2V6QnhLWGF3allzTWZwbFJCSXozK3k2Cnh4RUxDOGtobEE0amhqRjRYVHVJdUJZYnYrSHhBZ1BiNGJweUNERm5uS09IZDlOdnY3YkJjaFp6ZmpYY2NDY2ExSmM1aG9BUmNqUXcKbVBFcFpoaHpjNmtEc1FBSEgwSnZwaE1HOEc0bkdzYTN0Mk13NEhhekFTemNuOGlJL1ptdG1iTTM4eGVIQlMzbnZBY0tkNkpqZTJtWgpIdEMvQU9LWEU0eXdDSnNsYkNORVdIYlJkV3lsRVhZQVlTYzZwdGZiYWJCZnU5a09IR3dQNUxUK3hOYksyWHY1Q3lkRy9BNGczVmNqCjBiRzhXRnRrR3c3M1RjamFXOVk5S2hoV3IxQ0hTdGloNktiMFpwd3dJblE3MFlDODNvd2hmZHV0Qmpod2V4NnYwOTdDMnpoOUxYOWYKNUdJSzg3YUhBbmVpb1hmUmoyR0UvV2JHSGc2SVgyN3h3UHBUWC9SYWNFMVNxL1IyR21FQTVIYWk0WFo3T3didDdYY2JFTUQ5bWJ4VwplMnB2NS9UZC9LVmg1c25NOXptZ2Z4dlJFYnV5T0xiRVBEWUc2b1hwcWRCelBXQi9oWmt0c1F4RXVEZDVpbmhyeHdrakVMY1REYS9iCjJqRkViN3ZaZ1BwdFQrUjEybnQ0STZjdmRza1pCcWQzWk9ENUNCZnNWQWY1SWE0MExCNGFEQ0NnN0w0NHIydVBGNFRmT1pUWWlSWHAKbGJjQmQ5Z0lJM1N2RVIzaDE5cHhFR0M3MjRnVTdBL2wxUDdnM3RMNUMzNTJyZUtqazBVODhnVEw0V2UvZVAzdXdpRWorUFhzZHk4Zgo5RUYrK2ViNVYvL3o0Yy9hZHA0UFAvdjF3N05MUjVQY3ZuajExWmNQYjU4L3ZINDMxSC9zSGwrK2ZmamppNGMvZmZYck4zLzYxbDR2Cndac2t1dTFqTitDWkovLzk0Y1h2Ly9EdTBRN3hxbSsrK1VvNjh2N3RtOWZmVy9lWEQvLys3c21WOFpMU0t5OGV2djJBZDd4NTg5TGYKVWNPNzF2ZS80Nys4K1ByZEh5Nk81WjJla1hQMyttdTc3dUtaT2YvanhSOGZmanJwTCtwWHE4N1BsVEhmVURLMnFxanBXRU9hTHA2WApvd2pwRHpzMngyN2xEVGVNMHU1MlBQZW1VZHRqL2JKZmY0bTJ1L292Y1dvT1RjbXlJOHc0ZGpndU9HVUtta1VOY2RZemlhT2ZTYnpzCmtxbGt6ZFdMVklDTFp3RUhFZUlsc25jamxTVUlBUUVKY0tHck9nNEwvMXlWNEJpa2hmaHMwR0tsSlhXMnRpdHlWS2s5Q2tkYmdkZEIKcGJtWjFNQWVxZHdGUUJJWHVoY1RzamdWWkdHQVVpL2Jjb0g1SElMdzRyWXFwTUFBbEF6RXpZNUFJQ1JMQ01haGhZQWRUd2hFQ3JYTApBSHhFcHJHY0ZiMVVlQUJLTW0wUFFnQ1F5U1NrMk41TTA3d25XSzREUmFRUTRERkJSbFB1blRRZndpa2dleXBmVFBiakxVY2lsVGErClBXQ1kwSjQycGtaTlNtREdOeWhmaXdNZ1IrcXlCcjB3TFp0U01zY2pCOHVSTmRQZzFxL01sWHRTbE02aER1ckNPK3BsQzhqU2pOSm8KZlZsdDVKQWZIRkVIT1BNcGE1Z3dqVjNJTmJGcURpOHEvOGh4c2phaEUvRVFWQVNRMVduVkJLR3NGdVlrMG1wV1ZQVUt4QzhzQ3lVNQprSDlkN2ZRSmhycXV3YXlyVEdFd3cvR21ZZGg2bGdid0RzSFRicTRPZ0E2dW5hL29DcWJXZzN1bExrWlpsQUl2Uzd0eW9TMDA0RkN4CnhZelB6QlNNL0ZrODFCNzNaR1FXS05HTkhaQ1VWdGVKbzQwMkE5QkpLQ3JMemV5S3dQTVhITThUVEVhUVd5NDBCcFZWVlM1MHh4S3AKeUsyVy8ydzJXeGpuRGhDTUplbjRwbG8xbzF4ZE1LUXp6RVVLSzAzSmp2TGdZS3N4RWI2NVJlT25Tb1FVeE1Tc20wbzdoY3V5MnRJaApaZldIQlZUT3JzdXNvMWthMFhyT0NtNWxQQVVvbEVuMEtoaUNZRUxDaUZkRE9Hb3l3aG51T0xpenEybTBHeXpwVXZmR0wxeEVLOTJZCktGNFJlbWxHbnBJTmpuVUZqeEUxaUNqL1pmV0FOc2o5U0hFQ3d4YVJkck9HMUFCd1hLTTZKWm44aExoQ2d4V1F5T1M1Z0JSR2JSdlQKa29BNGpkaWJvZUx4OCtJdWF2aUFnV09Vc1Nyb1NuajRrSWR1WTlwVVRWT29pVHZ4aFkwZHN3MGtwQkNHUGNwRGxMQzRLck56V0xCSwpLcFZLc1Bja2lVaGJCUU5mWkVqUXFtSVpMRExNSXh5Z3BraUhnckNHSHM1RUhBS0lTTElubnd1ODUyaUd3RU1RbHFSWmZaMVRhSEJNCkptZE9jektJUGhLelZXWVZEblFKVjdQa2dRUG9teVZDRUtEK3pveFhxMW9IVm9scUFMUWxiVkN2UXpJWEMybEFrWlpaRnhrSU5HTEQKdkxJQmpENzdVVlpDV0wwN1pvVFV5N2NnSnJ0TWRJRmx1S3hxaGc1ditMbDF2bXpWdEFnSERDUkdkczB5VVdEZUsxa0JDclRzbDAyVgpQWDJ6b0hjcmlGaUpodXFFcmdCblJad1YwWmxnZlFNY2YvYjhqQ0RTbWdHZ0g4NGdtMjN2RW9Md1REWDVzQjBRaHF1WXZYS0ZsMVF0ClFGUkRVQ2RWaS9xck9HNEx1NDIvR0x6TWtYMnJRTmd0Z2FGdVBHbGkwZkJsT3VIaGNGa2RoRlJ3N2dOdUJUZ09RL0ZocXlzOENhdFoKaUFQU0M4SlEyeGdYaUZIbTRySnFYOU9PSFBWNE9OSFJpMEduTnhKd2NHWmo2d1ZyRVVUYVZ0ZFY4MG5pc2hLTXdMdXRnRXZIeGw4MwpwTENVM3l1Vk9SaXB6Wklyb29vNllXS0JwU3JUa0VZR2doRkdzdUNLclhkVHY2MXM5eHpZVEIvQ3V1cThLZ3c2eXJZckY1czE0WXBKCmgyREh0ZVdoVytZaTAzTUxIRUx1MHJyL2J6QVlaUjBpeS9QRzhFV01ZU0U4QjViN2xXTVdRdW9DRWF6dm9JR0Q4Zk9zSXkyclQwRlEKekdzaGhGUWNrdDJhUWk3MHF2anBLdXVObVVyMWtUZlIrZkFLb3RzdCtsN1Nvem8vbUNtNDBMcTNJR0VpWEhMWUVDRENWYVo4WHRlVwpBMTYyTFRoYVlSU2UxYVBCWEZFRjdHSFZKQzA3NlhCdjZxTUVBTVJUZ0tYYmo0OVlORFl2RW1uS25UMXVBQTBIWktQWHdHbHVHWkg1Cm9HT1RKVFFrV0hnbHVEWUpnTVVqYVJLRkpSQVlFeHZBbFQxVUFpbytUWExZREt0NktXWWVMb1VVNWJySmg1bmF1QktlbXpDZnNNQmEKTGFUY1o1TE5ESjViTlVFZ2pLNUpYanpZbHNVMWcyaXRUUmMzd2QwTWg4VldZNEg5QkxkRktFMk82Vjh0a3hBeXFabllNVmZHUHJYUApnY0Y3aTVxblhGclJTRkhJUlVWcmFXd3F6MmhSdVNjdWpHMFJucHNkZExocUFpZ0UvWWFzdWhORlJ6cXY0dkFaWndPRTNDUlZTRm9MCnBNdW81ajZjTTR2TS95SzRhbFRhd25QL3pLeWdqNWhvZ29hbExVZXpWaUVWS2dpMFdVQk13bGpncXRsVDB5UEFEU2RVTWRlTkdibDQKWHVFQ3pxblpGTWo4MHFMN29MNVhWYjh5WmpuTldSbHhYWW5aNFkyelJIV2VZaDNYMGlXM2pkdXNlbVR3RVNPQlBLRTBsNjRRZXlzMwpTM29yL0NJKzlycjVlMFFlZW9iUGVWVmNRMFpPTFJEbUpuc1huVkxJeDB1K2duRVNNUVpwK210U3ZxSkhCVmExVHQrWXhCN1FaNWxLCmtPSlhaMGhQMENMSnhCYUQ3Qyt5V2tTRHM4dG1qZFNqWXBBTVRJbUZpOUN3T0d0V1gxMzlRZTJnejkxZWdhZ0VFQXR0VDFWRGQwSEkKbVBZSlRrcnNscGl6S2JUTFpvQlRzZlhRYmdZQ1lPV0tWOWU0a0FCeHRjejZic3JHZ3ZYMnFqckVzbWlpWlRoVTY2cm52N0dMc1BpMgo1SHpNd1ByY0hDT2RRTVVlVWZSTnkxYVhjZnFnRVhndldjZ2JRazViTGNTWFluOGk5d0dEb0swUHZwbEJMT1FwUE1KSVpXaTRPTUFPCnNKMHYyYlk5NW9TS1BPMGl1V1FDWW9GUEdjU0VaR3VJZ2VlYVFseGtVQUpqN3hHSFZ1YlNMbU5LdkdXeGtRVUIxZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJSS9aTDBDUjNqRGNGb1hvd1FWQ1pLek4zY3FZQmxUb0ZHUVJkM0ZGUHZnRXZoaExHWGhUWkVaN0ZqRk9HWm0yNkFNbTlVTnRWbTU5TQpQdDNRRzF1TWxmY0NqVXNST1JXd1BFQ29ub2t5ckhtL2ZZT0ljUVlNZUU3WmFnVVNSSWpRM0d3SURNYm42cjJJL0FMZ1o1aTUwQ2d4CnJzd2dMWE9hOGtzbklDallkOVJHcktiK01TNEFtK1ZNK1JkQld5cUI2V2Vkd0NZcXRUcW1vbENKWnk0eUovRG9Fdy8vTWlMc0VWQkkKTkZ1cE5MMUFyV01DZVp1S0N5QldwUjlic2lFMWh4RFZheWdxWVZseFVDM0VIR0JMSVRhRHdhQS9NQmp1VVpkbkJFMGtaOVhxOUlqWgpZajZZdWRxeE9BVWRWOXBWaEFtZ3FaeFVYU051QW9NUnF4RVFOdzM1cmpFcjVHaUFNQXVuN0x3YXdoWkhDU1RxUlNvSmtETXdwV1N5CldSWEJ1bVprdmI2YWJWWWg3MnMwaVJ6TGlWeUlsaGUvRjlZWTVBRllYbGEzUkZma1NDNG1nczZXa0JLWGJRNjhuemROWEFoaXBHSzYKRWIrRjlPTWJkRzljQlFzTXdzLzZhZ25ndGppMDFLM2kwSldnVFNKbjM2cjRMazFzdG5ZNUhrTk5TRklzTHBjRmxRcHhIRTNRcEtYYwpiSG5hVURJdWpEZzNhS3pZYklzbHVTTjZPTklVcFI3eEJkQU9rVm0yWlppTkdrT0VPSExXNFZnQUNMMmdWM0VSeEdHaytVN05ONTRVClRFQXBLbW5lTHoweU9xaWV4MG5PZk9LQnpFeFo4T3laQ01BanpGdkc5TzhJbWl1YTlhYXN1clBQalhzNEVkbGc2NktJLzFVVHB0dVEKTVJ5VG92b1ZqcXR2REorVENLR0lxMlZaMWJ5TnhUZ2xDSHFBbEdwVmZobWxmYzJkWWZsZ0dlcGZiTVBGM3Nma1RnV1NrMGNZVURLRApxVUoySnd0ZzVBR1ZjR3U2U0w0aStBOWhqMUQ5Zk92VWVBK2tmY3FLdEZGZEI5YkNUZkc4ekE3dkJGZHRhTG5zdFRZMWRjR1dvaDViCkl5REdLM3RZWHlQQ0pKbzFsYURzTUh4SW5Xa25JblJ6S1NOeGt5YUJTenJsTkdlN0IzU0ZsVllnaEpQektFL0MweXBQbHkvS0FaajYKczZxeXhEQjdIa3dRZzJLZWtCRlk4NmtqNHBEWitiT2RneEJydC9HQnV1YWdySDlGZjRHU0dZUWR3YkVRaDRSOG1Nd2tBTXJzUnhvdQo4RSt1eS81S1pyelhPMVM5TXVwSlRnZ0x0QVhDTy9CSUw3cXE3Q3dCUm90aDkxdXh4d0J6VEhRcldBNzJBYjVscWhhbmk0U1ZtNTQ0ClFPY2k0S0FsSVdtOGNJdEZVMWxYYllsM0JGT2gyNXh2d0JnT2c4ZVFzZ1E5OTRDSEl1SEN6WlBKQU9hQ0JVNXE1b0VKWEZuUmtvTW0KUFJkbFcycngzYlBmVWZHbXEvSjNWRXVjR1h4V0tGQUlNVTEyZWhQdEszcGxVS2xKeFlYTUNMcUVjRnV5NDhRVEJUSmtSWVY5eHR6eQpmeVl6aTJJOVlESUNSOHk4M1VoM2ptNUdWbFVhYTVGUDE4MmZpTFBUb3luQTloZkdzbTRhNlFJS2hWdUF3dFh5ek9UcmF3OTVVWE1xCnFNdHFvVEUwcGVJdDhxYXdjMEtLUUtHVzdsZFM2Z00xYjhndmlyWjRZQkl6Q0ZXTjR1UE1URHlDd1pQdDRRQ2pXVE9KeHh3dDFRNE4KM3B4anErWUYwc0FCSlBpTTdmelh0cEt3c2RCSUNHc1dQS1VCRTV6V0hNQUtvU0dGVmYwZ3o4MHNwc2Jhc0JydUI1b1JKVU9leWFmUgp4bnhXbVBCcTdOY3RtclNYWmk5V1VuQU5USFl4V3Q1SENxSlpWNExiajNSNEdZU0hidVZwa3BzeUM0TFlFSi9IblFkTFlZVWdvR2F1Cll1dUJ4d3hpR1NDUkdLTVlFTEZjR1NNY2JNV2owZGt0OXJCd01tYUduY0lnTmlna1NUZG0zWkZ4RENWRHUyYUc1dmVVaXlLQmE3MUkKT1hjek9ZcGJlc2xHNFJTR2xMNzU3Z1UvQ1RHNGNGVkE5NGw2Z2JvekNINkFrVlFHZDZWem40NXh2aWZlUGxmMVE2UjUxaXMxSC9ScwpFZzRNYXJTM1NnL1E2dGFzYkJYbmJtNDAxOEV1eUx4WUc3UFJHcUVtaG8xdnZwWm5TejZEb0JreVpiUkNDekJCWjVadGN0Rmc4N1ZOCkd6Z0YwRkpXNlFHcG9MZ1NObU13V01iVU16azJhN1ozUXdwb0pueVpaelVQWVQ0anBuSGpPWWNhU0VwbVR5U1pzemo0UWhpbEg1SHgKSzJzVXVaMGVSZTJMQkdSVVFZUitzY3d6SkJKM2dGMk5TWnV3NUMzK2ZsMDBsY3MybDZLRTBCZFR6WHBvZEt5enZoeWNGWnM1NXhqWQpnRFd6QWF4aEJoWXMxWFhORFBkUksyeWNkUVV5RGFqMUNHWmhTU3FINkpMUHFxUUJGTWk4WG9oSUxmb1p6ampHMU1OMXdwaGpQNWdLCldXZXBNU1owdzhxRVo0VFpBVHFjRnczRnA0a0JhUmFhV1RyaTNFTkNVK2VDOTRMRUNJNVF6VlRDWUppWktkZ0p1dE1oc3h6cU1GOFcKTytXYSt4a01uQ25idG9RRnpIdTUwd0tpTHhRUUVHZWVqRlBVRmtCME16OFdlRHJ3ZlV6OUlnb1loYWNNYUtML1RXWWpDTzFlUE4rQgpXWWg4ejRXcEI2dWVWbVJNdmtVejZXd01EeEk1QS9ZaWZCS0oxMC9ScVhyTVljSkprSmxWbUU4RWVTQUNSRlVRa0xkemcwSElNOUNSCldQVm9NOWdoMlF6Q2pYQW9PUUdSdUJVaXZkVWg1RGZEdDVHckpSWm02ZHJVMUVaemZxSTh3M3hBVzlJS0t2WlVOWDhqeWV2TXpNeVIKbS9oV1RRb2lSSGlqMHltN21RVEVpc1RNSUdZNFI3SmxLTjQyOVJZUkMwQm5hSEY5bGpTNCsrRkI1VjZCcHBtdWVtYWMya2JLdXRveAp2OElJL2MyQ0JaWWhXVUtraFErdVVtRjNZRG96N2dmTk1XN21pRElIR2tTNnlMQmlSSEJ4azBIZVhjbzJ6TGNFRlFQb2NUOStkcXZ0CktKM0lYQlB3U2dwdnJLeEdHQU44cjdCQWtzQXdrVUFvUVd6WDJlbWRzeHBwMlJLVFo0S1hzV3R3UjBaSGc5THVDT3VGWmpPQmZvYVYKdmJqQVFIeDUxTnphVEpXMVZiVkNxa1NYZFlyakphbkI2Q0ZTTVpxbVd6V0ZsQjBTQUVPcU0yVjR0UFVvY0lUSll2WEFaSWpnT3owRgpCZ3VJWnMyc0NTbGxoZmZ6OGJLZSs0aHpXS3VlbmFWcHYxblBLRVhUelVXRWZiUUw5UnlVZ0FRb21GNmdLT2dxS1pEdFhLeHZBais0Cjl1SUtyMldnaUE3ZkFpQVJNUWNnTU1RZ204aUdjNC9odlZnUndPazhPNmg0QnNPYmN2WkF2Q01QbUxPTHVCMkJrTmJVcmlLMEY4UmcKMndnTXMyZ2FXamsvMDAyMWRsV0ZxUWZnUTRlUkppZjFDV3E0dzZLeUZSMXdVanZ4R0dNVFEyaC9wZWtuV01UaEJ1NjN3cDVnc29XNgpyWXhBY1FENVQ4eHJxcldRdlFGOXNVTEsxZUFqQnZjai9mcnN4a3NRMGExNVZyQXJuRUdZaW5sV095M2NJMjVnODlQc1M5U3RFYUgrCk5PaVZxT1l6cTBTM0dseE5hTFRCQkpDSkRkb0hnSm0wK0RMN3JOcW9hWFpDVkN6MkN2dXNNbzZkZU9kMW1PY0dNTTFnRVMxT2dGcm4KUGRGb21QQ1dVSUI3c09nUUZGUGdyS2NPNndUdHdFUTdkcThFWVVmZUlnRmNEeE9URTNCMFc5NWFyeXNOTzNyUndDa0NTUUgyaVlxcwpwLzF4MlpxSEV6U3VidEN5T2NxWjBCUnVNNGJLZ0lBdXhqay84M0RaU2xWOE01c1Aya0ZjTmpZakluZVJ2MkhUeTdxaHVTN3FoUWVSCmJqYmtDZ3c4djdxc2tBMEw3Qmx3Y0ppcmdvWUFnSklnSVM5dUNnR2hiZ3pVS2ZRNEZRckF0TEtYNHNlcEZNcS9CejBpYzJVbDJveHoKTk1CeHNmTVFRU2d0Z2Q5bWJ0ZG8vc095cVdPTkcxTFFaeVFPQkpmTjN2bEZoWWtGY0I0SWdpMkR5YXFpSHQ2VVo5WnVDbjI1c1htNApZRElnQkZMdk5Xc3dRSXFLU0NOaFU0UDE3R0FIbU80aFZnTHZ0M3JVSVNBUnpEdFFOR2ROVXV0MDNQcEY5TXZDOGgxV0RTK2krNTFKCnZQU2pNR28yMm4xMnF5WVRTY21zUy9CSkUrbXp3UE5UdEU4NXl0QlQzZnNHNkF6U1E5RTl0Rm82R2pBcytvOFd2WnM4S1M3YjZPL3gKUjZSZ0E4OW1XdFc1UE5QS0xmMnRjQ0VMa3NRRWIyZHhnd2cyZ2ZTSmpBb0FBYUtvaHNJc1l6dVp5cUhlemR5WWNQSGxUYk4yMGVzego5K1UvR3dCbVZpdEh2dEtWeDM3RDZXK0VhU0VuTURkcEkraTZCNTlrRWtlcnRSWFZ3WkRES2xkTm9FbVZTWGFaa2p5b2tVSTNUS2ZxCkdlTm54TWtqdjFvRkQ5elV4OEF0MXAzUVc5S3NJTEJPWmp1NmsyWitaREtqcTJxemc5WVQ1WDduWnpBMzg2MW1ndmRVOHcwOGtKdUcKNUVhQXM2WDBJenVVdGhsUWtEcFE1Und1SmVpT1VQUkFTZ1dBNno2Q2ljMHNpNHI0aHBiSGhSNGRmb0dVdlp2R1E5RGE1OG9KMVF3egprT0d6bmtRQ1FZS1cyRVY5bExocWJrbEtrUU5uMDZZb3NEQXpHNjhpdStmbnhPUndNbnRyVDIzS1BRQkdGRFVxV040eDV2VW94VUJGCkdXZjZJWjR2dHplclNMR0pFS2pWY3FwU2g0SG1VSG5HQzRGbTdLRE5UNXhnSmhYVVRyb0I4cEFxb0tXaTZVdUVJa0UxNUJIcUxvSEMKOXFnbitITFdzQlk1SWV3akJDeEZneHZDWlQwbnZ4dmkxakxqTThpY296bWRSR2FqL2ZCTW9ybVpIazJ0TFdNYXFpWkt3RkhwczhhVAp0ampTTmNMSndUT2xrRFBCUXRGbE05N25TQ2dha2djWDMyeEhncE5JcitOcUdDWGE4UUpycmVDOHRNL1Y5dEcxUENKMEFJTmNGOHQ4CnpLWVRBNGMwYThKR1R5RVd1cW12UWRWK2VHY1g1cXd5SFJQUldKVFFreDI1dFl5R1Vod3FzNUMyQXFqQnBFdXpFc3lBYU9rSGw5RisKdUtpVkJpbUI0ZDlrMC9EWmd4QldKWkEza0ZDN0RaQmdNTFJOTUZiUTdIVTB6VUs4aHBjSmJoK1lwOXQ3bWN3Sk9TRkZtM3FLalNESQpBRE9CZkFsNnJyUENrWWo5Z3A5aGVPZnhZOFh5SlBESTVFMFhsRisxQXRVVHpTb1RtZTBOWjdwdUNvUWdBYndDUnNoNWRURjBNOXhECjBPVkExQnNNamN4RVVUVGRGblVvV1hmQjhRR3doOUUyU0tzbHN3QXVXZ3ZaekxkcVdTaVlNSFV3aUFLL1JkZExNcUVjK3RhcURodGQKQ0xObWN5SjJaZW5tSG1ZbjRacGNOTHRYMVJNN2RlR3pCdmhRNUVSZisyV0V6OHdHaXd4bVZFWDNMWXZkRFh3WWhPUWFGeTJDUERwRwp6WDlNdU16emUwSFE3QjF4b2ZCOTFYWUtzSjJDUXl2QkpyRHhRdEtrS29xd1NhSk9ZR1RpUTIvcXpPUldodWhpV00wd0pMQlRBUVBLCnpJTVJjRXZJSjBoblNWQlE2c1kyRU1uazBJOUVCZ0Y4dUhLR3lZNjhhZ2o5eWxSdnlPYmJRL1RwZjRocW1XQ1lQVStjVFlvSUpTRXgKcmJaMnRGOUZOekVHRml1YWFUY1pseG9Ndm9JRFkyQW5nU2RzZFZrS2x3VXlhd1VJSTgwbkRJdUlOaU40cDVobEQrdHh6aDExTjhOTQp4VVc2YXBZRldnMnh0TG1kTVN0Q1prUWNoWmwyR2JZemdLNW1WVlVJU2t6R1pFQ2dGNUlFOTB6aEZIakloUERZRWhCUVljZVR3Uk8rCkpsdUdKVU1HeW1IV2RjWVg0em5TOEYxbU5RTEJMMWF4Z3VEdGhyY2RmakVDeW9CVkMzNVVLb2haRVczcTBZUDNEQ1lwd2lJWHZZeG0KQ2RTQWdPeVhFUkVBWXJXazNCVG0xbVIrTVJBZzZSTTQ2VEpwUmhiQVRLNUxwQmloWS9BWE1TYzFVLzh0RGFIQVphN3ZWdFVwQXcyRgorb0NpNnhaRzNCUGdCSWdQdkMvQWUzZWNWcVRXc0FZREpPUHp4cytLZWxrdERuY05LcmZxUlVsZEpraEFIaFlGUFJGK1BGNG1mQ3BxCnV3M3l1REo0WDFURmpNZDJRVDlIUTNtVW9odHVKdGR5alNYb3ZmSmlBYjFBWmNKQUNLOGdnN2JYVE1WNnJicDhuOXRJYzVVQkVNeGcKLzlWMkpRQ0NpWFdEUUw0cVRxbzduUEdFVldHUnE5YWhWN0hCSkVFb0NsZk9jenZTYVRZVmZjWnkzNmpWVUVLam5ZMEtTOVUwRG5sVAoyNFFLamFwVHJXWmQxRlBqWU1OY0ZWeEpOQzRVUXpDSTFOd25XWkdyWUNQMG9PRVVKZHdkekFiVEJRUTZKRUJ3dSs4TVVLVThMMmcwCktNMW1aVWN6MVE1ald2MW1henRVYmxNUElUQmZ0TmE3alI5Mkp0ZURHVFlNRnp2ZVhUa2o1bVdnOXI0UjFLMnVESTQwYlZYY1REQ3IKOHRhZDFKRDJkTTY0M1h2Vy9HUU5JUnd0WG9OQnk5bWxscWl1eDlVUVp0anRaK0JUMXVyaUgxWlg1bHhZSGNjSElrTjVRT1ErRkZOTApCWUJRSVNVczJyRGJJSHBUT0hpQlFnQU1Ld2liNWltaUZqNEZvd21PdG9lblZVM2hhNXNoS2cvVGtWczVJU0xOVGdtcG9BTEJPWTNKClVXaURHd0pFTnA1cys4cW12WjhKZjI1WHV4QjI5Wk12bURGUFJ2Mm5oNS85NXQzYkY2OS9mL2pKOFhqOS9QbDNydz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJZnYzbTNUUFUzY1ZiMlVra2tCWUllb0JWRkZhTVYwYXRqTU1Jczh0UXhiTHVoRmxSZlJRUW1DNGFsbE1INzlCVVJyd0VxSFZSUVlJWQpWNDE1TVZ3K3BWVkd0NFFXenJBcXVnOVd4SVcyZHQ2VFVUQlFDVGN6OHFuUDBTZ3FUbmhpNGw1djArbk8zQitxTkxrakNzZVpGUmNDClZ5Z2U2b3dqMjZEYVJCYzVUbFlGcTFmRDQ2Ymh1bXVLcm00Rm5jdzhNSFpXVVl5cFRFZ0lSaUVPK2VUQ1dYZE5VSW1uSVNXdmFqVzIKSUltZ2dSdWcwQVRodXBxR00xVUZEK1BwS1h6Q0dZbFo1NThCTEFkRGNUbDNnYU8rRW8ra1dYNEpxWUZITE5zNEZzWjdsS3VtOHVyWgowSlZFNHZoQXdHRGpjN0JSWllRU3JscVczSzVLd0RreTlkNmlWeEVSQUoxK0NScmZRQTY3R1hwRzN3eWFYT0JKZzBYZkxLblJvN2pOCkdad0tIQmJiVllOeEVITTFjM0VTNk1wYTVEQlJ6WG9rSUpaanRmUWxUWXJFazRPb1V4dlltc0IyVmtyamlIeUVZUXMxZkhlanNzcTkKSVN2N0FpUU9DdVpxU1VIMHNFaDFaTkVaZStQYTYycEpYbmdjdEdYVDhCaHY5WWNHNXZsTFFLZjdWVXhVd3hRUm1MMVVjVFl5cG9WRwpBUUNqd0dIV2ViQjJKME1acjdPeFJvaDlNSUtnRmtlUi9vaUV6M1gydE1TZ3dWS0YvVzJlRnp1eE0zUDdoeVdOclVBU1hvTyttRjQxClcxOW4wMFdpaFNvV0lBTWhwRU9hWm1ZT1FJeXJPWGlBVjREd3lTMTRVNTZucHVwTndmaVJhRTdZRExlT3pzZXBHNGdQYVpXd3E2NkIKNlN6VWd3dUJCT2R6QU9UdmNremtzQXZEZ1pFOTgraU9XZ3FubWU2dHlCa1BPWmZ4WmY1aUFNbERuYTIrR2lHb2NWa1ZjMFh6UEpxTgpNZml4SFYrRlREbFlSVEJTY3c4RUFSQUJuSlNRWjIxSDB3aXRxZ2k0NTVBcDlwSDlpV1lLcE1TQTFGUm1sV3pnRXl4b0J5bldaN01SCndla21NaGJXaDd5NWVzbVdxbExDRE9nYXozRkJoRUJkMUJYTm15MUpaVWpLRWxpTndDWHprUllGbkpNQWl3ekVoSWF4V2VpcUpWSGgKUUt5MU1WRUJUZHBzZU5FMENUUXQ2R1ZaK1JyVGVLSzdnV1dEL1I2eVBGMDRUaERCa0NZWnZjeUp5WFQreFVJcmNEb0U0SStSR0d6RgpSYmY0RXNDa0tKUzFXbjcrZkNHNHRnNEVoSHU2U3VuRW10VmtIK2ttbUl1NjZ6SDdmVDdDSGJINXdiQUF3aU9lRmhZOFFyRFdXZk9pClFSUmtaQmQwQnh5NFNjM09XUSs4Y0VrSFFKY3huSENyaW1VMHI5R1ZWakxIcmNXUmNMYmpmSGEweFNxeUNEaldhOVMxUU13Z3hxeHgKSzZ6d2pUN2l4VmVWMm5CbjErY2hrbURoYmJScTM5aEFpd1FWV0FuR2pJelpGUFVpWFRGTVdhamU3NmJSZ01pejl1QVM1enNnTVhwbQpSS0ZLdW93bmluUnJ0N2pxU0tXb3Npa0Nxa2xBQWhxNHlNbTlHV0hFQ2t0Ykwram5va2V0WStMQlEwZlFsdXp6Q3Y4Q0VqMVZUWlRSCjlBVU1zd0lEWjZRaldUVVRNcVZQSE15UXNwNTB4VTBYUm1wSURNcXVOc1hjYk5WV05RQmQ2bzVHREF0Nk5qSGVWTStUYUZJUXJFb0kKQnlSVnA2TzZCK21maHA1REF1RjVjRkM3dnNiVzZxcjFvb0w3cW1xK3BQQVZrMFd5a05JQmREUnlNSW5acHNjTnAyQnlEUFlWUFpJdQpyN3FqTzRZak9kRElJQnJFblFDS3p1Zms0Q1ZHRFN2ODBJSGRQS2lJMHltbzQ0UUU5YjliaEF1dkk5QW5MRDNtbkZRT0QrelZ5NnlaCjdEY2U2QUNLOXVpc0hJK1Via1FyYW9RUGxCWTJUV1ZLVHNIOEs2b0tSUFhJV1F4RWJydXBScHJEeXNaM0FxYU51RHVBQXkwcFBUTWoKTzZHWnhHZ2M5MXF6UVJZQ0FYbkxTSUZlc05VZTFtalUxZUpWTWUwQVR3bDZXSUxLdG51NSszUEs5Z1RhODBDWnFwTlprNmtGRGZXQwpqTXM0ZHFDTUNUSkk1ZzNER1M4RXppMmFhWW5xbnNaaVlZMXB2QWlQaDZGMkE5Mnk2a25yM1BxVjBmdlpGYXNleUtLeGhKckdrSjZ1Cm1ldUdXUTJoZjJuK2c5UXUybGE2ZXZ5aW9zbi92R2tsekhUaE5FbVE5Nkx6STNxbXhhQ3dMOEFlNlE5ajRDQW5qZHJQK0dhQW0xY2UKT3FOdWMvZ2hwTW1LQ1UrRXB3Rytrcmw1ZUM4R3oyMTh4Sll4a2VkSEppN3NhSGtsNExnbTB0c0RMN0s1bzhMTUdEYW1qcU1yS3FxNwpHNFNBN2tnOWFCTDNTbkR6SlpvS1VZY29wLzZFMVZLWHpXb0U0bFhZd25oRU5mUnBUWkdta2YwZVA0ZlFGM2o2Z2JOb0VTOHczK01rCmxzMWlDb0RPd01sQ1FLZlJUb1Z6WUdnMnBybkNyMW9zRlJkcy83TW12YXpBSzh5UWl2RmVPRmNjeG0rbVUyaEJiSXRCTElEbFYzOGQKOFBBdzdzSWgyK0lWT0lteFFIcHdQcWpvU2JoQWFmZml3ZVdhRjJUbFpnZEtRUmcrOG5ndUxRUU9salBJNEYvTVYzcHVBUzN1UG84UQpSQ2kzRmNHTEFwT241ZllWZ2xES3RaaVJqY2NzV1pDYWhxVERSdGloMTNva0djOEVObE1Zb3ZXWXNpSXIrb2FFaGNjTnEvSFVMeXRRCmFLRHB1Uk9abHVxd2VpNkhhcGtuTEtWb000WnhPSXZucDRqcU1RUjhudmxBc3UxUmhlZ0d0U2N1bk9zeFdrNUxxRnF3aFFFTHFPYnUKMlk1aGpZUGRyUUp3eVVOVHpUY09WSUllbGFyUVp4S2dMc2N4WWdBZS9aWEhBeUcyU0kvOFlob1JNT3hpWjN0eGprYW1wZWdISkcvMAowRzBlSG1vcFBia3QyM0ZMeUNyaS9Qakd4b3dSTEF6aENob2hTV1JKTXNNb3Zkd3crS2JZTlY3NjFBSGVCSkZCUnZTOEp6cFg2RlpVCllNQkt3emxOQ00wNldJVUpwcWpCaFMzT083bGR0bGpLQnh4cDBHZElVR050V2kzWFY0dk5UYW90YVl3a3BEQ3pwdlBkbGszUmRqeG0KZ2FHd0NMeExCTWtraTZnbHM4WmhnL1BjczRRd3BDdDU2RGxNeE5pK2s2bG1yQUhzSmhDVHBaMzNaeG1yMDZaNFl6Yk9sSEtiNWU5QQovSzRzdUxScERvaG0zNGFFbExBRlIzMHp5a0xKWEg4TUJhL3FBaUNhU2tjdHFzZVlpejdZSWR0WWFkbGkyZ0VneE5URGtxeXpNNE5WCk5UamtqV1hBeXJJcUxDUWpoUWVHWXpHdkRXcmtHdHRsQkd1RHFORTVGbFdmMVVYR3p6QkE1S0lHQ0wwS1JneGhUSm53WVEzK1ZKQ0YKNTZGWkxDOERRbEFoaXV1WVlXWEJDYUV4S2F5RXZZbEdWdXhOYWRIbG1zdGdnNGViaFdrM2k2cThJTkJRQUFMRG5rQ0F1d1VFTjRXQgpTRUVEYlRFYUdDSElzSHVDNEhkVDdGaFJDT0Z6MndtcExpNUluVkUxU2JuT3E4cmNJZ1FjZ2w4bHk3bkFxd0x6a1NzeEdWSWYxamxtCkc5cXFmUTZNblN2TmF3VWlJaFU4b0k0RVFyYUtoNFBDMVErSFZORVZySmNWVFJDQVkrMnE1ZDZtWVk1WldSbkl1ZXFaS3d3VG5vM1AKUWNUVm1MZk1OSmR4dHMwNWVWenJxdkJyQUluY2trTEJEUlp0T0ZZM2srU1NmbGF2RlQ1elVnZDF2ZmxWUEVNQ2dYcmNITkJNcGY5MgowVTlFSXlVTGlsUFJKU2lhQ0lwRlpBeFBOZ1JRdEN4QzBjS3QzQmZtUWhuVHBqQkVwMnFjVE1vODlWcGRuMFRIenJRbURqc01zQ1E0Cnd5SzZQMmkyQS9nWWx4Y3RpTUk4dW5rZXdoMXBGV1dnbGFzMW1OUHcrMVlMV1NLU0tKb2R3OStOOHBOSVlSdDBEb3BsZElRdjVxVmgKYUhaUzNnZ0Frb3BscTA3czZObU0wV0hnc1J4TGlubFp3MW9vMExmREFqYzlhaHRTTGIxL09MR1pSNlFWZW9jMVZ4Q3owUTdDRWd5ZApWVkU2QkJ4VGRNYk90aWx1aHArWjc2anF1dk9yRnJxQUZVWFB6endCemxNL25RcmduMVc2QngvR0lvZnFuS0tmUWltekN4T0pKMkN1CjZzWGtIbHV5SjdLYURZQ2FOVXVCTXZsWjVUWFk4UmloRERNZ0pPVjEwWEJvcG5MQS9zVjBVS1duckdJWUY0aVc3NEdHWHJTZG5VRGYKV3U3cURkcW1teDhlNTNtMkF3L2dMV0F1ZUNJR2c2WnhBa1RmTVNqME5xNmFGbzN2eStNR3dURmhUNG5aY3VtcXM0MmYxUUUzTjErdgpWdHFLZFlnR2srclJMN2g1VUF1ZHUrMVV4QTYybzZBV0pqRXNkRkFHQVpCSEZCZk9FbTVTQUVEMGxnRlVzNi9EKzBlRG5OVWlBUndGCnpUaWdBWjQwS2lERjlFU2U4d2VyUkxIVUtjemJpeTJtakxsVVNsV0JwdFhDOVhDU0VaaUhTZXlFdW95WEdaRjUwNkVQVk4yK2dZZGcKNHZOcTV3TTVRV1czcXRieFZtdWIxVHlNb0J0R1NEZkMzR0ZialZnOWl5OE1vd0Q4MUdUeVZiVk1HalVPSHRxYWxFTlVwcU93dE1SYQphU21ySGxUQWNPMjZFMHVUeHRIVmFNSDUxU0JCZ0NDU3JlRm1SUzlyTm13OEVyTVhnQWhJSE1PL0VFbk1rNVpYd3djQ3hGM05EY0xwCmlDUkZLMDEwbWs5bVM1cVNOVjJwYXNjUXBVcERZNE84a0lqRmh5R2lvQXdDWE5nNEFwVU1HeW4xNEJsaW5udGZubHN5ci9GR1l4OVIKamZBSTRqTnpGbTVKc1N0b3BxVlZNakVFUGg4bVRFVzJzVVJ2VmJaZGI3UDFTdHVKSS9Rd0gydFdJNUpIaWpIcUNKTzNNR0ZVVUdOVQpOU2VYM2k2bzFhWGFoczdMQU9tQUNSMTZLd2dVQWFzRlVmdGw5QzJEQ0E4c0E4cG05blZtWEdMVUdCSm1kc3ZkU1JoaDUwSW1MNDB2ClhEU1BCM1pYWmxSZ3gvSTR2RmhVbGRWWHN4UmlvS3FDczdseUJRb01qUm9ZaDBRc01GVTRPRm9mcTI1bXdLanFKbWNlQVZJcW55SXEKREpaV2phMjV3Nkx1eVNGcUh2VkV6VkVEVXV2WVRGRTNzWTY0TzFBQlFiVGM2ZlFyY1JzMElKSzZZbzJnN3hmY0JMSnE0QUFXSVBnNQp3SEFVWWJET21DSFBLY29VaWlWbWJQWGdRb0ZLUjlHSitLQ3FhaGllc3dYY0VPeTlXREN4YXRCMDlDd2FKY3lNRTd6U0k0azd2cnIyCllHSlZJOERQNkV5RnlrWWhDTW5YR0dRYjY0QzRRYlJYc0hlazEwdlY2RTJQMEtINjNTbGhpQzNveEtnNTBvdW0rWUdEbFc5RTRITDIKQ0J4WU45aXA4R1VsbW8xTlZZRXUyUklQcWdpVExYNk5kczVTTzhySHdyMFh5eEFCdlVnVE9FS3kzelRUa3NvbnRJWDYwYzY1YUZCKwpDRXUvZzZXUnROUXJyTVB6NVlDcHlFMm5ORUFGckxtYUxtdmROTW9aa1ovY2xRbWpZdUtOZVFUWEI0WDdZL2xEaitPekJxdW1xZmVECkpqWmtoN1hEeDRMQ3BCaWFSZUVhYVU0V0U3V29wREV6Z1JvUHErTGg5RXBtZFYySC9rZDRTMUdQdDY3aWJFQksrdE5kd09ZWkJId3UKYzBVeWZSVlkzYlphMU1pcGJIVHpHUVd2Ly9KSUN1Y1BidWl2bjR6NkpOdnV4K1haUFQzUGJkWFR2OGVzdTFpcG9kU1dkRGZ5U0tyVQpjdTdDNEl0RHJzYVV1MmxUOTZLbjNNV2hvNWovbm5GMzVUa2k2NWh3RjdvMFpyRG4yNFZHS3ZkdDZYYWhRMVU5VXJCbDI0Mk1hVmxhCnNsMTh4cU42cmwxOFhqUkRiMHUxeTJ0Q2JwbDIwVzRwVzB1MEd4bXp2a3V6QzRTaXBmU2pReEYyVmxqUE5jbHVOdVRXa0dNWG1HbUsKd0paaUY0R1NNS2g0aHQzRkVGRzdCTHNqa2ZsMWwyVEpXejI5N3BMVWZMdkxycnNrUmZLMzVMckk1UDcvc2ZkdXU3NGt5WG5mRS9RNwo3QnNEdG9HaEtzK1psMUpiaG1XM1pFR3daQW1HUWRETmxrU0RQU05RbEFtL3ZkZDNpTXlzdFhvb0Nkd0NmS0VMY25yRnJxcC9IVE1qCkk3NzRCUmRSd2RhdHpuNi8wTHBNc3VVUlpOMXFoWS9CdXMzVDZNM1ZoYVJTN0ZkamRZTjF0cW02aU5qb2c3K2d1b2hhNURJT1U1ZTkKZWVZNlNGMG00MHQ1RTNXYmkwTTJVTGNWYWUwMlQ1ZUczdDQ0M1ZiTVdRaWFMbzZUNTJIcE5vdklYaWhkdE1RUnVVQWtYZWdmQzFONApCdWxpWlNhVXdzWFJaZnF6OUlQUlpjSFFPQkRkUGtQQ2RERjA0ZkVYQzVZNGQ0NGh6V2tRZERFSGkrQi9BWFE1VmZkNitMbXMzQXBVCk1UNnhxTzk2MFhPallzbjRYQlNKemNQTzVaOHV6TjNSZVhpM3ludWFuSXVPTUpwQkRjNGRsU0dpRzVzN0hLa0lhaTU2SFdDbURHZ3UKa3V3b3lMcVp1Y3VOTlFLWnV4SXpKUUhNeForY0JTNHdHblpaTldpNUsybCtNU3dYN2hOV0p6Y3JkM2JsSVFPVml5OFlxODRnNWVLOApxL2Jkb0Z5SXN4QlBDVTR1UzJMeHFRUW5sek1jSVc0M2NaalRYaDJiazh0Wno4UmJjbkl0SWlzdlRpNDFaUGpJemNtbGdpeEpDcW4xCkpBelVMODRiWHRXMU5nMU9MdTc3WTIzb293dzQ4OHNYSlhlNXkwNVFjdlVacXcwVksxQTRJeU80ZFdOeVpaeHIwdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJYkdHZ0dyeHZ1dGFqd2UzRzVQSmRvZHphbUZ4Nkt4UmtYYnN4OG5oamNwZnB6a0hKQmJzaDZaT2dDQlg2L2FZRjEyYmtycXhmQ2tTdQpGMEFCeUYzVCtxbUxqd3NiUHFiQTR5S3FnTnJ0b09QaU5GcTUyYmpJdUROV0lqUXVYdjFIQjZYdUZXSTVDbG9QR0hlaHFxMmx6Y1hsCnkxT0Rpb3U1RWl1K2k0a0xQcW5iK3pBODI1WWNyQ0RpdGtObjJ5TlFzKzR2ZUxoZ0Z1QkhBNGZicFBpN1liaE5ZYTlBNGFLK0Y3OFMKSkZ6OHpWKzVTSHBJVUVBc0hCemNIazJPbkl1QXMxREdEY0h0YnRRVEROenV4R0FnY0JIdnhpdHpFM0JaUzl0SEFIQ2hSL0pycjFrdApLWTEzNDIrclMzbUNmZ3ZPR2ZWOWh0K0tmMWRlN050cXZFaXdiNnVyVkFKOWk3K0Jjcm5KdC9zNEJ0OHl3UUhaczhDM3Rhb1kvdWJlCkZnK09nYjFGRkxxV0h0UmIrRkR0NlMvcUxWZEVxd1QwTm5jOTkyRGVmbmJOSWh3cEVUQW01MW5leUZzVVJTQTBaZUl0YUJGTmZGc0MKYjV1N0M5NjhXOElobnJseHQ4M2xTa0c3eFQ2Wkl0dFRPSXVWaHRwRGluV0wzK25zNUM2SWJjdGFGMXlnVzZJUkxocHVOUjAzTUxmSQpVeVB5ZEZGdVVXZGVSdDJRVzFSc00zNXN4bTEwRnJzUnR3QjQ0cFV5MGJhNVdldjVrMEs1bTI4TGhIRTVkTnVXbmIwMDNCWi9zNFQ1Cll0dFc1NWNEYmN2dkUwWGRJdHZ1UHkrd2JaMUt3Z1hZOW1PaHBNSlh3MXFhS3dodXJDMXkyNkI3QnRhMnVZWWdxTGJ3UW5IWGI2Z3QKM0poZU45SVdJd21URjBiYTRwK2JPTGliYUl0VElVL09RRnNreWxBQUhEemJWaG5MdTJtMk1QR0xNczRXZitPdUI4MFd3d2ZrSGpmTQpGZzRYNGFCbTJVS01oekJMc0d5QlZXbUNxdS9KQVRsSERySWkyVUtiaU1CRWdHeEp2eXoxeGJHbGt1SGpKZ1hHdGpvWUVCUmJnR2N4Ck9OOFFXeUFWTDRSdGRVNDVDTFlnVWZKRHZnQzJoZjFFOHViWEVqejU4WG9FdmhaL3AxVmU5TnE4eEc4TGVHMVc4Qy9RdFpuUThCZTQKdHJoMXNMbTFoZW1ydkxHMWhjclEvS0xXSW1XV1ZmVEVpbUpRbUhWZVV2MTB3TUxYQzFtTEZFUStGRnNvTXJpcUMyQXRKQVZFZXI2QQp0Ui92S3g2MWdiV1k0L1NFUE5XakdyKythYlVvTFdqandHcmgrai9qc0dvZnljOWZxRnFnMXNZNHBGcmNuSXRUKzNDWXV5bTFtSmhRCml4bVVXa2dlaTlvUnFpYU43ZWhmaUZxZ1pqRXZiRVF0MGhLaXlJcFF1NFFWZWdGcWtUbDd4Z2JVb2l6bTBHbXpaWGozbElvVVpoTDkKbElJQ2JsUHlRZE11ZFVCOW9XbVJOVVloVDVCcFVkSFcxZ0hUeHQ4M2x6WnNnYVZkV3N1Yk9BditKOWJZRjVRV0ZaVm9wQnhiMFBtdgpHMG03Lzc2SXRHRUxJQzNxZlhEVXphUDFhM2JqYUJmTHhldW0wYUo4SGk1S3dHZ2ZMb0VGeTlpYXhhMHJDaG90NUIyRVdRU045cUZXCnJMeHB0UGc2S1JJSkd1M3ZtRmJDV2pSd3RBOHJac1VDM2dNT3lqOTd1V2kwOEtyd2Q2RGF1ajd6bTBVTHNpRkFRa2JSZnJ3c0hBTTMKaXBZcXgvSW0wV0tXZnRJRzBRSm5NeEcvREJBdFJnaUdRRzRRTGJ1bnozbEF0QS9vejRqTUI0a1dxMklNakRlSVZoU3RkRGkwai9seApnYUZGa0tYTUY0VVdJV05FbFFKQ0M1bk0wMG93YURIdVBDTy9FTFNZVVRycVNrMmdCVlNBWlVOUk1JTlFVU2t2L214dUd2ck5uMlZsCnM0cVhtV25IMzFQYy9aMXF3bUZLR3hzK2k1eXlRRUxXYkRhRmRpNzBMUHl3cmlKY2NwdllkMm5XRFo2RnlCQkJtSnM3RzdiQXprSWEKTW1mYTFGbmVFS0kzams0Y0FpTzhLOEdjaFJRQVkyQWdaL0h2N0E1eEVXZGhtK3k5STBsTGNSMTM4R2FSWWMvdFJadEZucDFNV2NObQp5ekxjMUt4Wk1HeGR1YnlyK0twMUlVR2F4Y2pHUllRUnNxMG9WWDl6WnVHd0kxNFhOc1R2eUtBelpUYit2aUd6MjJiR0xKcnpQa3ppCjZqMzY3TEtHUTR1QXNLbGNGMkpXRFRGRzM0alpWRjFNdFJHemtDSUloM1VJczZrNGk3c0pzOWhLdUZHTGVmQzlNT0J4QTJacFRSY2wKRmdiaFJvTXZtMWdSMk1hYkx3dnBBMHV4cnoyN2FQNmJMMHZMek9YTmw4WHhLRi9jZkZuQlFsYzVmRmxwWWNvbndDemg0c1VKREdhNApTM1plSWdDelJLZU9OTitBV1ZxRkhEVmdGdi9Cbk9ZR3pQSS9tRjY2Q2JNQ3k1WjVDTE84T2tSbk5tR1cvNVNNNU4wUXF6eGRQUmVFCldXYWYrR0lFWVphUGhwQzBtekNMQkpGU1VTYk00ajQ5ZFpaRG1OV1RaK0xySXN3eUw4WklZUkJteVRaRlZYa2daZ21pWitqeVJzemkKQjFEMnNnbXpPQi9seDRJd3kwTXkvSG9UWmlsc1lwUXhDTFBFNFdmM0xaYk1NcHY0OVNMTVNoTFZEMkNXQm5ZT0NjQXNMT0lTM1lSWgp3bG1adnd6Q0xHS1ZpdnNHWVphQlAyVVlMOElzTTJQNmtFeVlaWXhuK1Q2eGVtMDFRWFplZ0Zrd0Y2UkJGbDhXREVRQ3N3TXZpMFpWCmFwVjI0V1ZYaStwUzgyVzUxVGgwV1J4bU9lMjU0YklJMmZEQkJsdVdnU2tWVlpndGkrdWdFdW5GbGwzTFgwS2daVmNTejIrVFpaRWMKU1BYTmxVV2NVTzNEakpXZFJiaXhUWldGQWV2TkYxUjI1bWlhWnFZc0RLSUNHaW1yN0VWNUUyVlJvcTN5VVFObEdUNUQxbjREWlpuUApiMk84Z2JLODVQejBBNVRsbytOWEdFQlpjREFSbDd4NXNzdTFpTWJKSWxiRjRMOXBzdmk3OXBzbEN3dGxKVWJKNGdDUG9tc2t5UksyCitmRTkzU0RaeEt4N1Nwc2txemk1a3d3c0lNRHNKNHppUlpMbElFWVljNUJrZWRPclhoVnhHbkNqTUtyZktGa0cxSWNhR3hJbFN3T2kKYllHU3BjRUUybzJTVlE2bTVZMlNWWnBram8yU1ZmNWx6UmRLRnFkTWVWaWdaRmx1dy9yYWFQU0ljbE44SHpkTGxpME9vQ0VJbGl5RwpkbjVyWnNueW5yQlc3bUxKMG9qNHVWbXl6SXdqQWgwc1dSaVlSTGhac2pBR2daWXNXUm9RVndtV0xBMXNTM2F4WkNsNXBLYkdNRmwyCkJNSFhIekJaREI5VUhOdzBXY2tnODl3MFdXNkYyU3Rvc2lrN1ozSFRaR0ZrZWlGb3Nsc3NLWnBzSXJ4bnRCZE5Ga2I2RWtHVHBRRmgKdktESjBzRG1NQmRORnFNMktibUd5WXJvdjFMUVpObmFHd1BXelpPRmtXV3lBWlJOcElhV3VZR3lOTENLK3dMS3lvaGtoWUd5UEE0TApEZzJVaFlFczl4c295MDRJeUxZSFVGYkZFbmtGVUpaOVFQa09YMEJaMWNZQXpXcWdMTnJWY05JT29peVV6eFMyM2tSWnlxR05rU1pSCk5sV2pmVTJVNWQ5OHB5K2tMSTJRQ0FSU1ZxcnFyQXdST1Z6OE5XcVRicVNzWk5UNnJpblFZT09mcFZwQUVtVzNRdm9teXRLdGExbUQKbkFTZUlQSFRtUW1pTEVUMFQvb0VsSVV4c1JneWlMS3dlSXA2b2dkOFBYbkdqWlJOcDMyQmtiSThGbnRHQkZJV29uaXFMRjlJV1Z5agovS3hBeW5JK1ZvTFdoRGE0TitNVFVaWktKNWFYQlZFVys2bWdMWWl5dUJFaUc5eEVXVWpZVFhVM1VSWXZGaitLQU1xbTVvNlJMNkFzCnkyV29DQW1nTEx0d0tUVnJvQ3g5Y1FDU2JxQnNpb3ozQnNyS2NuQ3lYMTM0N2R4akxIMmtGTjg0V1VFUzhxYkpZbXlsTk5vMFdUMzQKbFY0NFdScmhpd1ZPRm9lbWdEbDRzakJ3VnJwNXNreVR6N0Z4c3Z3YnMxVHdaR1hvNjhXVHhZOGhqUnc0V1g0UEFralNqOExNWUJUWgpscXNodjRZU2xjREpNaStaK3ViRVloU2FiYjVnc2hqUG5GbWtyVWRyVGFGa093YVlaNzVJc3JBOVpyNU9iVUpNaVRpeVVPZk9GMFdXCm5lZytibHRBWkx0ckE3MEovc1NRY0NOa3UxdTZCa0VXMktoSFFXSEVpTkFxRnRQRHhZOGxqSFhWTUxIWGErdWJIaHQvWC9EWWJUSTcKZG5yT0RTb3NXS2tzMHJuSXNhTXBhcnkzS1FLRUJEZzIvcjY0c2R0a2JPekh1VlBuYUdyc2ZBU3R1cUN4UWNzTlp1eDhOTFFGTW5ZKwpiaGgxRVdPeGo4bXZqTTFNQzBpQ0Z6c2Z2Ym8zTG5hNEJVN1FZcGtiVTRpS3RGalFCTWpOdTJDeGhJaVd1Vm14QVJVTlZDd0MwQjhECndRMktoUW1mVW9CaThUZHlvY0dKSFNLMzNwVFlZYWxYUUdLSHU1Y0VJNVpCNnR4ZmlOaHVEeUVRc2ZqY0prdkU1Y0dONkJad0VXSUQKR3hXQVdEUzhRVFl6K0xBOUszbC80V0ZwS25uVFliRUxrWVNHd3dMNnd3em9nY09DaUZYR1JzTWltWW1Vczhpd2dHR3hIMWw5NWJkWQo3Qk5jV0NSbUtWY3hGblo0VFhoVFlkbk9sQldtZ3NKMnJYRUNDZHNOL2J1SnNEeVJ1bm13YkROOWFMQ2RZYS82Z3NHeXVBdHZvbG13CjNjVE9RTUh1UXh3UWJIZCtMeml3dzBtVFozL0Vvc0NDU29GUUJDQ3dHSlBTaFh5ZDBTYmpRc0JDeDhYVlNXeXp0RndLQUN4SlYwUzcKSHY0cmlSV29JVk1xQ1g5MjNpUFJYNmYxQ2pmOWRSbzBHL0JYcU4xWnZXVDJLMUMyS05PN3lLK0xvZDJ5d2E5WWJiTEJnd3VDNCs4TAorN3BOcHI2QzY5SkY5aHRXam5HZGNUTmZsNkV3Z1h6Rk9veWZheUJmaVRkb2FoYTFrYTh3U2xHc2lCVjFIUXdlalNoZDZacktMK0lyCmdVaEQ4VWI1RTVCYlVVdHE1Q3Uzb056MFFyNWlDdU9vSGNoWE9KUmw4MTVuMFJPL2NhOVlKcUhTUDJpdlBKdEhHNm5pRjM3Q05LSjEKMXczQVZjQ1ZCdTVWYm9JZ3VXclRsZHdwOXNhOTJsVW9HL2NLQTBlendMM1N3UExsQy9kS1A0c25idHdyOFFrWWVvTDMrc1hsK1BHSAovNks4VjRiUXdQQzVlYTgwSXNvWXZGZUYxVXJlZ0ZkR3kwaDN2NGl2RElwQWVCTEVWMkllZUhBUlgxZlZ1M0FEWDNIQlhKMEg4SFV2CkJBUDRpckFYKzN2ZXdGZTFQcFREUXVJckRUam51Z042WFk1QXZlTjVvbFFFOEZVUnRkNDI4SlUxZlNTMVg4QlhCcFllSjdNa0srb1MKa0FmeGxmRUxacXN2NU90MkRJMTg1ZnRub1lEcTR1bktJa04vSVY5dkkyUHV5Ukh3UUw0UzZkQ1VwdG5JVndyTklXSUo1R3NpYkRmbgpqWHcxdEtLOGtLOVVDRklQWU9Tcm1HQ3RiT1FySGlFWE9UZnlGZVVaV0VJRzhSVmxSVVFtcTVwMXVhbkd6WHVGSnNsUWFYck44RWt4CkNnVHVsYkdqcWk1L0cvZkthRWRYUTJQeEJ4NzM2UXpjS3cxTmxYbW45b1hHMmpmdWxjZEJoRE53ci95MVBGKzBWOGJvMkJ2WnRGY3UKQnl2ckwxalB4d2dUYVlNSDlvb3dqUHMwc3pvSXpDYXNFUVAxeXRLSlhGK2tWeFFORVJwcjBPdVk0cllGNTNXNFNPdkd2TUpXVkpGSQpWZnR3dldoQVhvZS9oaHZ5Q2wzYU10TVZRa2pSTW9Qd09yb2lPVGZnZFRSWDI1dnZPb2FLVUUxM1JZaUZyUElMN29wK0RSaFRBKzdhCmw3dGJtdTNhSFd1NzBhNWdEaUZvRkdUWHJnaGVjRjNKS0JydGhYVmw4eEJrcGtSMXhSSHdoZ1hVbGYyUXgzZ3hYYnVyTDZPTUZUMHMKc2lyWFdiT0dNOGQ2K3lhNnN2OXdMUnZveWtMcm5EZlBGYXdvT0hrM3poVXViOVk1TVZtR0xvRkZsMEdZYTNVVjRNMXl4ZHJSemV2cApZTmE1QWJBTStlTnZ1T0EzeUpVTnpVZmVIRmYyeXNsbFkxd0JJSVZ5NWFhNG92NlJMcmNocnExcG0yQzRRdG1DdGZHTmNJVU5ybndnClhLR0lhVUt2Y2pVSnhZeHBiYnQ2dkZVbEpBTGcycXJrc05jK3JDQzY4YTJvQjJmSnU1a1Y0WVFIdmhXMUpKZy9iM29yUUJQNG5ZQzMKdHJsNzBuTE1SeFVNeWJvWHV4VTJmRHFCYm0yZVhvTGNpdk1vSnNSRnJoWXljSVRhREc1RlFuRWNkUitJQUVYaTJZMXB3WlV1MXdvQQpYSXJGRGN2cHpXeWRiaVIvSTF1WFZ6ZUJiRjN1MHhQRVZtaDZpWGk3Z0swUWpMS0kwYnhXbHRDc3RYR3QwQ2NqQUhmUldpVmozcXpXCjVUQjJvRnJ4ZC94S2tGb1ptSWVySGFUV0NLRUhxQlYxUGVBZzNKeFcxT2h4N1dsTTZ6TEdMeWl0eS9IY0c5S0tuSURlakFnb3UySTcKeEtxaU9lWHhnclRTU0t5dzVWT0pHTTFjTjZTVjRXejRxamVrbFEydUVmb0xTQ3NtZHNNQnlXaE4wWjdnWXJTZUk1blJDZ01STk1GbwpwWG9mUVltYjBRb3ZKbDRJcGFuZ2dMTjN0aG10VHMydUY2T1ZuaGRiUDVqUnlnd2tacDFndEg1eDJDSlk5ZjBZcmNzdFcxNklWa1JkCktmUVBRaXVpcmxHOHdQVU1wdlJrWXV1V3N5eFN5Z3h0eFhBQmd3cEJUV2ZGYmt5ZzNIQldGaVhLcXlhYWRRVmZOUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaUtzS2wxMm9WcjIyOFAxWWNoaWJvV3ZUOU5xRWhmRW5yM09CV2VtR00xOGZZRll1ZHBoYURqQXJRM2l1NGR0NFZZYnhXQnRwTGl2UApDN1hTbTh0S0I1ZmtyYzg3OWlxZHZkb2NzeUptam04Ynkwb0xPN0hlV0ZidXdGb1lZMWw1MFpoTWpHWGRmOTlZVm9aeldhMXZMS3NxCmMyZmRXRmJtcjFoZGNHRlpHZnhtZzdnUnNyVkh5czdnc3RMenpRS3NucHBDZUU0NWJTd3JZdThzT2pLVmxmOWVoSURkVkZhZUVlNWMKVUZsVDlCRUlLaXZGK3hoRWJ5b3JqZnlvVFdXbGdVT0txYXdjekZBN2NGTlo2ZTNodklQS0NnT3JZNFBLQ2dQVjVqZVZsWXRLanYyaQpzbExac0JReTBxOWpkSmhLQ0cwcUt4ZVp1R3VCWmNWN0RkRitVRm1WV3l6MVJXVWxUd0pJZzZDeUtzR2QrcWF5SWpiUE1lV21zaExvCjBRUmQxVmdJeHQ0OFVGWkY5RFZlYlNvclZRd0lGQVdWbFlZaUNpc0NXTnlyS25Cekt0cWhpZUs5TnBXVlhMcWtZTjRRNGkzcEJ0MVUKVmdnZUVPb0xLQ3R6YmZNd1dhR0RZZERpWnJLQ3A4WDA5TjRLbmdPQkM0YXlJdTNCOStPR3NzTEk1cXlDc2dJR1JIY2dvS3hJenpCQwpkRU5aeVI3RGtqT2dyRERRWXdzb0t3MlFTdDlRVmdKNldNOXZLS3VJUFI5M002Q3MzSTIxTGhlVU5UVzdhUUZsUlYwcmx4VUJaVlh6CmJqQ0VENVNWYVN2V214akt5cE91OGdVSVpRVytqYUNBaThrS20zN0xUTlpFVWsydG04bEtBK0ltTjVNVlJtTEhnc25LclhqOVpyTHkKd0VtYytNMWtSZjVQbkFveldmRmtpYThLSnVzMjNFeldZelNURlFkblFDSm9xNG42NGp4ZlRGWmtUT2wwN2EyeUZqQ0JaTjEvWDBUVwpzQVdRTlJIU0JTbUNnYXo3WmJ5QnJNeDhvaTQ3Z0t3c0ZVWnlPb0NzVEdPWmdIKzZ1OE80NUo3cEMwWVNDNnVTQUxJeUdhVy9kNTBEClgvU3FtOTlVZ3Z5SUIwRkVBLzRWNjhlYngwcThWWk1QcWV4eENkWmJBRmtad3BrM2o1Vkl3Q2RMVWpQMGFhZ3FQbmlzL0ppY1BMNDYKVEZTNUJ1YXg0dStPQkY3d1dHR2dwM1B6V0dGa29ENTRyRFM0R1NsNXJEUThPazQ5MzBwV210UkVWbVpYS1hJS0lpdjBhaXlKZXhGWgo4Wmk3T2VzRVlyS0NmNmdmS0lHc2xHOFJHSElCV2FrVHlJS2c2NHZHK2xuWlhBTlo4ZGF4ODlPTHlBb3IrY0NieUVvTEhzbEdzdEpDClFkdU5aT1h4Mk9vOGtLeFV6TEVxTlpDc3NEQnVkU0ZaNldBeSsya2tLd2xXZytxaklJY2treUl2SnV1MmJTWXJKeVBxTW9QSnluczEKeXljb0s2eDZwUXhsaFlHTC9RMWw1U2JVek54UVZscjVoQUxLS3Z6WE1LWlZ1TTZzRWU4RlphV0k3akZycVd2bTdCb3FOcFNWakFLbAo4eThvS3dPMnJFOE9LQ3RySUtsVk0yNlZiejJ2KzRLeWN0R1NqbTFGTDdSQUFHN0RUV1E5Um9OMjBNSkMxQkR6V0wvNDJOL1ZqZis0CkUxV1lpWU5qVlZWNTJqUldlT3RjWVFXTUZaSGNYdDhzVmdTSldGNXJGR3VYdW5xVFdLZEsyRjhnMWcvYklERFZTRlhJSmhBc0RCQXIKVnMxbzBITnpXTEdPNi9jdUErckVEV0cxM3ZQRllFVXRJSW9FakdCRmV3MXhTRVJnUmJ5eXBmb0NzRUp5alFwNzgxY1Ira0xOYk5CTgpnWldGL09QR3I4STJpV1FWZlJWQnVtZHU5aXBVOVNpV3VkR3JVR2Vqd0NMUXEvaDdJY1J2OGlyK1JubnZUVjRsdlBialF3anlLclRuClVERHNVNFBJbHF1Umd4SmpNZ1J1c2JDclVGY1hmTzB1N1FLVmJ1RUdYZEJWS0crSWw5YUFXcGJHOTBDdWxzNlcyQmR2RlI1RXhuTEIKdUZYMlhudktwcTJDYWxlZitZYXRsaUk5d0dhdFFndmVpR1IxU1FRTUtDQjZrVlpoaEdRMFFLdUZoUHQ4T0tzRkViVlMzcGpWc3FRawpKV1VWbVZBeU5mMmlJTlhNRmdrWFk3V2FMUmVJVmNiQTF0aUVWU3pZdWE2OUFLdUlUcERuRXJHcXg5UUM0MVc3UlZZM1hSVTI2b3dNClY4VStTNWxKUlVvZjh3Y3V0R3F6eENuSXFzM3Q1d0tzMm1LcU9XQlZxRTRZU0RkWUZaSUl2S2ZHcXNJNUhPa0ZWVVVnbEFrdU0xV0gKRVRPQlZCMHM5SHNCVlpFQXo2S2xrcWM2alBZSm5DcDJBWUxncHFsQzZjTDhsMkdxbU0zQlh6WkxGVElzMWlsY0tGVmNIaWJwSUtuaQo4cGxCZFhnUzRVT0VXbStPS2dKdjBDMEdScFhaYXBFVG1hM3JLdFMvR2FyZFBQOUFxRWFKY0JCVXUrdi9iNEFxR3g2VXRmbXB1K2pUCitOVEMwdVQwb3FkV002OENuZ3JJSjlKalpxZTJzdkdSRzUxS2tFU3VtNXphM0ZZb3dLbk5Lc1dibXdwYkVRQ1ZxbHBTSlhyZTFOUlcKQkpxL3FhblZBdnVBcHNLTFl0YzBKODlRL2NTZWZoY3lsYUtEVVRZeEZhUU9mRGdHcHVJT1FFbDU4MUpoZTFiZnVGVGdGNmZFTjZTbApGcVkrMGd1V0dpaVZZS1VXbGwvblFLWGl6NHlydWtpcHVCdVBoRU1FcFJhOGVpS1pNTUZmV0psZlhwaFVWUDJ3N2t1RkZTVnIrZ2hJCkttcUt5SFc5R0ttc0FjaHRJMUpGdmxxYmtJbzhaUjh2UG1ydUtySU1QQ3IrQmpRazZLajQrNm5yQlVmTnlJTTg3YkJSUVJaU2grbkIKcHJDVkgvcE5SaVVnM1RhQVVTSGdRSTR2d0toNFdiTUFwNXVMMm9BMmVnNFdGWE1qbk1LZ29pSSs5SWlsdXFHb2l6WGo2VEJSS3lzdQpEeElWNDVaZW8wTkViY0xkYkNKcThwUnBJQ3BlaFpwZU9GUzhRWEEzZ29ZSzNTVFNGMEZEeGF6SXk3MWdxS0FrUVA4UUxGUUVFSldpCnhFU0RMSHNlbjBpb1VNKzBBMExGbWwwL1F2SUxXMitXL01hZ2ZyeFlnRTFzQ3FvRm94dUNDbDF2TFc4R0tzSVBwUjRFS3FhT2NnQ28KeUhDbS91YWZJdnE4NXNHZjRsVmwyd0RUVHo4bS9xcUt5QU0vTFhKZWduMmFQVE1IK3BSbHZYaUxMdklweEJWOWJPNHBGaEFrNFFYMgpGS1ZBVC9wRVBRVUF2bTdvS1JKbGoxd3FESjFjdWxBdGV6RlBKVlZnWTNaSlloRkRkS3RsS1VjZWxycktvZHpRVTBUVFJZczI5UlFHCm9lRU41L25pNTM1UEp4ckQ1dkQ2TktDblVBVkFjUlhNMDBBbkJmSVV1YXNwU3VrbW5tSWxEaGxrQUU5UjhneWhTUEJPU1J5bzY0VTcKeFNnRVg4RzAwMlpTWThCTzhmZVlMOVJwYzRZN1NLZklEaUx1SHFCVDBrTWc0NzA0cDYySk5oS0JZaUNTNEcwRXdCVEFEK2VuTnVWMApwcDBCcFEyTFpkNEJWUzBDVFlQVitJMDRoUTAzTWdpbnk1aDlBMDVCaHRTL2Jyd3BJdG1ZOVlKdWlpb1lCcmE4RFJKbnlDemRiTk01CjFkWXowS1lCOWd4bTZaaEtWOXhnVTRUWDRGK0VyVThKUVFOckduL2ZWTk93QmRSMGVIWU5YT25vV2tUZVRGTW9MSXZrVzdUTnBOQnEKRUUzMzN4ZlFOR3pCTXlXRGRkV05NeDFHS053MFUwaE1TVEl4ekJSQU13UjZBMlpLd0ZrZUw1YnBjQy9hUUprT2ExMENYSXBYdStUeApBcGtDQm1yOEtZVmUwelR2d0poQzZSYlV6cUNZSXI1V0ZDOWtMSUovbDBNeFpSd3h2UmltMDVDWlFKaE90OW9KZ3FrYjI5NzhVc1lzCld3MThLWE9jSWlkeHJsTU90Tjd3MHFEMkJMdDBUamVEQ1hUcDlNZjNJcGRPWmlPbDMzSlJFa3RjQWx5S3Y3UEN4WnRiU2x1YUcxc0sKMWl0RUMwRXRSWDBLZkxBYldycE94ekJXZGhFRk8xSXdTMW5sa1YvRVV1Q0JFQVVLWUNuZU9lbm16U3VOMXI4dlhPa01BR1BRU2xlcwpWZ0pXeXJLck50K3NVcE5vTjZrVTU3UDY0WlNpNklTVmVEZW1GR0ZCb3Fvejc1UEtFZ0pTdW85d0lVcG41QkJOS0oxT3NRU1BORDd0Cm0wOEsyYVBvcDhLVHpxUWJ0N0dqbzVwQWR0TkplNkJDdzRoTUMvR2JacE5TUFR6ckcwMDYzSlI2azBuSnhlamxnRW5IYytwUFE5bzcKbmxPQktyVGE0ODRlUVNYOU1LZ3U4NGFTZGtkN041TzBQMUU0NmJMYmJiaUlwTWNtSUdrM29HVURNVWRXZWMrTFIwckpTdjIyYWFRbwpLd21NRzUySzZ1cW5GNHUwcnFnTU5vcVUrdlFlSFpla0xJOFdUenRuaU94T0tvb0E2dGd6eUh1bWFsUW52bDhRMG1hOXdHYVFJcW5WCjJpYVFqcURnM2dCUzVBOGhJdy8rS0ZkRDNnaTFvU1FnbW9vV0tncVVBeFdEN2xoZVc3TlVUSnM5V3JONldyelFveFdMNndDWjRrYkQKb0pwb2swZXI1WHczZUJRTjczVFdUclpGcmlld281K2RreCsvbytQelg2bWpmeXQxbFAyWEtETEFTUG94eGtveVc1cTcwNUpxMTVQYgpNaTF0eDFjVUt3bkd5MmtJU1RDMFdYTzZ1enNodWs4Y2YycDFCYXl1RUwycmEwbW90VWh5ZVJqY2hxYldJOUs2Y3c3RDRJMzFYc1kvCnNhajBPYlFBZ1psQm84TnlDQlpxdk1TeWZvUUxVS3VxUlYrem5UMGZKR3lKQ2NmS2hDdEtrOHZUbUxJSTU3d2M1SXVyYkducVRDWlkKT3FRTVkvV1IrRTVqVklFT2lyd3UxT0xDSjlUeTBXMEZNZ3RiY1JjSUJ4NXErNnppelpiazZLQ1Q3V2x5ZjZ4WmdaelVYRUlKQyt2ZgptV2tsTkF1V2tzNmVoTWpSMnJwSXcrNWJnVFVwTGhnV3lqZ1JnWjRCNW0vdUtjMG1yMWoyc20zNzR0bGlQYzlBKzZOUmt3MWxJLy9lCnEvS3BiQTNIeW5rV01pVjEwUDJZaXh2YmhaUEppSDV5VWJ6RUh1T2RDMGpNSXl4cnFPSTNveXN4V2FQc3YwUGxPMUErc1ZCU201NXEKNjNCL0hTWmRZRUhva245WC9WMERza2pqVkVQdHhsWTUzYzIxWU9rdEd2NGdza3hMTDZjNXZBQnRrTkJTUzRWSHJqWk1qemlncVR1dgpyajBqSjhibFJkSjJEenRoUUJHYjJTRWJqZGZaamFvcjE0NlhvRTVEcGRCemdEQlVQaWFFcnRGMVFDZzFURC9FRjB5WGpPRVc4bkVyCndXQXhLRytzV2xRTlIwb1JqK1czT3YwcDBaTGliT0gxZVQ5a1B2QTNpMUo0ZkZiL3c0SUJIcFlVMkFCOHQ2eW14aFAzOGJzS3kvQlcKRkR3QlVOV25wTXpqa29wdzlRUDFORHNRNC9OU25XNm1wUzUyVkhaZktIdzJZM3F5aHBXQ0RWcEI5S05sOEJjNmtWVTB3S25PcktqWQpUUWNmbFVMRFNnaFRWaEcvRHNXd1gzN2M0MUtXcVBSZUx2Q0VWZG80RWsxTjExZUpPQzRJdXEwc1dZN2pGVS9Jb0hFODlZOUVySVF0CkJ6QXFaM1dsWm5OME1OMzNyYVVWekZGWSticnd2V0dPRGt2bXhaYmRybC9rTm8rakVHeUR6VzZPUTJFb2JpZTBQMzRoOFkxcmtqNm0KTWM4b3dnN09LSDVtM3djR0RPazdJRjZCcDFNNStBM0RWVUFMd09pZzZ5ekV1ckg3QW1vM3NLTTJtNGJBOGJIeU8xZ3FRTkV6V2RKdwpKUzU0a2p0U2t4Y0R6WVArbHRBTmY2ZTRPNCsxdG9tUVhlOG56RW5zNTZyNmZlU2YvVHdvZXVBM2hlZTdXMEhnUk9uM0xFdUQwMXpDCkxPa0NrMzhReTFzeW5BQ0hXQVF6c25URmJ4RllFSURuODV1UG4rUlhpUVp5S3o5Ky96anRRU2YySkwzZ090YkFnT09xV0xiWEpFb0kKVnVUOThKdHFQem1ZeVM2MHlNZWs1bXpGbnRuNERDaXgyR05zRllQNndheGxiNjVaQWl5WmxLelV1T1V1SEhqSmxLeGpzZDNRUUZjUQprTU00cithZ3JWOGpIcXhVUERaeXUvRzN6Z0h6Q2ZrbzNkSmZXa3BNMGFoZDVMcUdWaVRadXh1NzhVZ01FWEllaVY4c2dXM29XY215ClJKK1pYNFpieTdFbkMxWW1pQlFoVm9XM2xZaGlEajZqUzYzTzdpWHNGMENRYnRORC96alM0ay9xdlVQTUFQSVR6ZTNEYnhVNTZ1d0UKRVBYbncwTXhCRnNmbzZnZkwyWjcrUk5ZZWFCYWFEaU1DOHZIeUsvVEp6dUZmZDlXMThNa1FTSThrVFdUbnpuK0E0YkhiOEhIRGEyeQpKTDdzaGVITi9aTStISlE5dVBIVnhCMkFxNXZQbnFWaWliRXRYeVFFK1hwN2t1RWIxV0p3M2d6a1ErZ3Jza2RORlNMNTUzQXB1U3lCCmxYVXNzS1FzSi9OaitIQXowSmN6R2lGUVNYbnBWbVMxdENMRDcxY2JwUlNCZGVJbEl6QXhhMG1kcUdQdDdvS2QyRmYzOGxMVWh4ZFcKUWdwZ1lXMHNjQlYweG1DaDMxc0VkZk9lVFJoNnJaeVRlakdKRmZTeHRsNjl5STl3NXhOYjVGS0Jvekx6dFIxQ3FIeC9TelhkS3JvWgpraS9RUnJpT3pRMW9VWUgxdUxWRkk1bWNQYit5bTFSQmRRUkYyZWhSM2djVkpGOU02TXo0aEhxZ2FtNExrV0RhTStadzBocTdGR29mCkE1dXVxaWg4Z2ZOZmNyTVlxOFQ1TS8vMXN4M2RRc3dUeVBsdG1IREFxYWVaNDNsWnB0Qnc0U0lUVllHUGgxck5GZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJSFp1eFpxNXNwVmhVMVVIV3hneVZXSGRiRWpUaVh1eWloZi9BODRXRlZLL3Vya25jTWI0aDF0dXcvV0ZSTW9lV0lzUGlDOWRkK3FlTwpyZEVqcXdWMmkzMDBLT0lNTGo4Ri9sa3RUeGRIMHVHYzZoNmROS25YakdFQmYydENRc3FTelRxenlXV0RKSys2OTlQNWt4eis2UGg5Ckx2ZDhtZXJYU1lrcUxXMnZBWVpmT3haT1BSS29VUkNNampVMVY0MU42cW5kbldENjBhc0hpa2YxYmxVMUYyR3hPQnVwY0R4a3Q4MGwKcWVmVGg1MVZKREFmdDA1YkpEaHgzWlRWSldlaHowSmliaTFwTXVvdEpJTE12dUpMUnNkVVlpaVE3R1MzbnlPMURDb1RaTWhyQzlXbQpwVW1UMGZDa0pyL1R6VllaYU9HZUxESkdKSHQvSkRYRkkraGUyWkJ1eW04RDhWZXNRR3YyUGVzSVBBVUFwamkwdzVtNDlQaVFOVVl5CkJ3VjlGVlhNMjZMc1UxWHEvbXlIVlJWblFjQjA2cU1JbHQ2ZmZybXJGb045M08vbFR3bFJKRG9TVkZlU0cwVGRwK2dzOFRrajFjUkEKR1FBcUkzaHUxVEFXSnY5SUhFcTVCM2FsN0QybHZpTzBoUUhrYWRZMFhxUktQQXZZY0VzV092emEwOTRmbENqNWNRa29heS9BTzhpcwpIWEVkSkY0THJoWjVYeW5oS21yRFU1S09UMEtBVy84bzJNZ3laYm9IZTRoRldESjhobWF3SHFzRDZEUGszSUtLMXo3NURGUnFWSGtwCm81cTdwMGdqa2J2VGJaZndqVFRyb3JSajk2QklLY0RrODFZamVNclVlUTdiZ2dhZU1mUWM2L1NpRlZGWGptS0E4M1BhaGw1U0hxRXQKZXRIRFp6dmJlWFZGcHdsNTY4dENXWWwzREdOcm9oWVRpOGNmd0tmT0JlOStYVUVxZ1JPaEo0bGdQRTZXZlhTYk9EdWRrdGhzaU5GagpVajd2Vjl2bDd5eHMwejJMZU92eTN4UjFQY1JJVGxucXhzWGdzVlU5Sk5KZWhlTnBlclJVRmRCU3U1Mi9QZHFCOUVWbm14TDJxU29CCjl3VmJwb0VpZmxVTVRFbzFlcmdoRjA2cUc5UmsrckttdXBnVUxoMVlJc0VoREVUYkhXTEI5MGdmaEtGTkJsWWgrb1lRbUJiditlRVYKNlFkempjYXNXSnB3dUs2VVpJcWpCRkFMREE4bGNOaVJzU1d5UnZaM0JjZ1JoZkpKcEdrMk1lMTJyTkxqdVA2Z3l3dE1TeXc2S0NrZQpmai9zSWliN3FSRDBONDU5MlpNNkFrTWw2dHNRTnFha0dwMXZOUElqUU0zN0NrYm5sRitnR0RGSkJWdk1qcWlQUExLVzdJcm9FZUh0Cm0wa3V5KzdVbGtmb2dHRWQxVDRmVy9JV3Z6MTBBaC81TUlyYXdZSm5wdkg4OFRCRDRWT1ZBSnoxRFA0RUN1ZWowZTFIOUQzd2JDdXAKQlJTUkluYlFteitWNWp0V0l0VXpJc2dDZ2c3Zk1sZ2Z0MWNYdTRvNnlhVEhwU1VUOGZreHZ0WUlmN0p1R29NY0FXbGRGczNzTEpzZwpNZlRxOGNOWG5EY0dEenMxa2NONm9lb1lpd2l2SGZwangza0ZOQTdOeFpScUFacHRhSGgwbjU4cUxTbm11WjNzb0NWV1pidkptcmZiCnFaUEJzUE5sZ1pSdjlmQW50eFh4WVhvK3cwZ1hWQUx5WmZ6czVNY2FJS05PdXFJNkhzSTh2Sk5xa1lYTUUzdXhkd1hBY2hERU1xWUgKek50WjMrRGlOcHlpdVd5dnhybmxZaGxJeGdjMmliMW9lazAvdmdINUFMbk1IZDJFc1l1T2dmRUluUkdnT0N2a2xLaldFb2FLQkJBTgoxWmNQSzdYb3J4M0pRT1B4ay83T1ZLM0FiUWs5TFE3UDhuYktEeEZPd051OUdETEtVZ0hqSXVCOEkwekttWVNYQ0NqVzRHYndhSGxCCkpnaGxLcGJ3azhVdHgza0sxUnBKV0lWZzRBVWdwZ0ZHTHRzWUY0UHRZRUVyRlJwMmp5K29wL0NPOFhEb1ZseTYwcENaZmhmQ3FMQ2cKSm9BWDJhd1M0Uzh5WUY2YXBnVnN4KzVVT2xmOGI1WG1FQmZMd0pGMmRHa2JubmRMRkc3QzI2WHFjMEJOakFmZkFqR3dSSXptbmtSUgo4NUtTWHNlY3ExQUtrQXFpYzFCV0tsY1h1V08vZkxORUkxaEtSZkRKTEQ3QlIrNTBSajBFdys0WUk2dFQrckFxbGd3ckF0eXdLSTZNClBpc1FLTUhBakFBSGo1WDJqblFxYzNWREVCNEtDMGRZV0hqSW4wekxCc3V2TWpXcE9NV2FsTFptSkozQmZyNWtET1VPVlVqalRyTUIKV29UODlvYzBFTDVRbkE3Z2FDTERHWjBxVWl6RE1sWWc5b3ZEMUNpN2U1Z3VLQ0xsY1RNK3kwZmR6bUhvdWU3OUdHWnZpdVp4RzRiRgpRYUJRWUsxWWgwc21SV0RTbncyUUtPcFRvRGp4MGxpeEVFNWlGSnJ2SlI3eHNKd1BjZWNlMlFVQ1J0bHFHR0UwaEZSYlJwd0kzYTE0CnFvUWVSOStCSkJJampSQkZzdjB0c1VPd2NPS0dHSWowSXZqS0pWakswQU5CazVIcGU3UGRzUjB3V056cElQa0ZoaCsvRzBJUlJjSkcKNGxuTHJDeTI3VkNxcUxEeGVKY0tLTWRJek12RXhSTXNBdnhQemRwVGl1WEhEaEVicWo1WnFSM0dEM2UwY0E3RlRCbDlWSjlYcDRBNgovSEgxb3NXckNjOXVmOCt3RHNic3B3cGxlU3dGdkRGZ1JKUGFvUjF6dkR4cys3QVl2YVNQd2J0U0krZUVjWVl2Q0hsRmVFYVBWUjg1CkcyekdwQk5DV3JnSEJLNDgwSWJ4WVQwZThnRlZXVEhXb1lzZEk5K1BPYlE1dVZVUis4NFc3VWdTR2U5U01rT0tWbkxVY1dXTG1aUEgKc0xYSFJMYk1ibmhqMkpMUHA4VysyTHhMT1MzblYzUU9VMW1yWXNUTkE1R0UyenZoNVJKSEdpVmovQ1NReldJT2ZpNlA4Ymc5YkNSSwp2bkowNHNXSGx0ek5PV01TOUxjb0MyV1UvRjRyazBOUTBVVjdBSkMxdEU1MUVVT204cmRvTzdZZjRUYU1mS0I3NHc3RlEwQU90M2hGCmJ4VW9ZUmlhVzQ3bFlPanRqOFlETmliUW80U3NudTJ5bThCUm1WRHU0ZWd0SjdyaS9CVi9jU2R5aWpHcUNtRmpkQ3pSWWhZV3FBZGgKVVIzWExLZTZFMVo1SWxQcW1FeXR0cnRvNzU4a0NZUXRzM3ZNemhCc2N4VktPU0xlVC9oYlU0K2NpNGlNU0ZIbU5VSStxOTNRTFlkOQprNk1iSnZnZk5YdllhM2hMWVdtUHR1bWhrSmQxNnBheDB3RVBOYm9zSE9Qd2U2M29GOWY1eFNyQkp4SlRLK0c5UmNpSEl4UUtDZVVmCmRIVld4TGx6RzdsS1U1Ri9waFRnem1RU0NKMEVvdTlFTnNqU2dKSWlrZ1ByTEYzakRRdW1ZRm5QZEhLUGVUVnNzNW9ubDNoekNJU0IKLzRFRkYyY2FOc2h5VnJCandRWkw3MDVQVTZtc1BhMnZoSlZkVzNCTkpIbHh4S3FrbUdVVjR5dHA1N3dqSEVLaG5xQ201aVNGT0FsOQpJNHdreUdaa1JIN2EwR1RROCs0ZkJrMmlqV3JNeXZTK3BscjJ4WUNoTVUrN2JnMCtlcElOcGFRWmdlYVJHcWVwUjRzNC9tS21LMEk0CmdYK3hHZnlBbkNHckUra1NLczN2WmltWkRhbTZoMWVFVXVVVEdzeUNTWUVMSTdvc0hLblo1NGJ1TWpsYStNVU5mczRoNDhYQVZCQUwKd1Z1MkhuaEx1U2pmblJtWXhidU04aHZYdE1EWUpoNFRmRlZVUFdRR1psSFh3ODFzR1J3R0VBc3FWb2RsYWlpeXRtdDh5MGhnbXJKOApMQi8xays5VndWNHZZTEN2ZTJuOThTcHp2WUFxcCtxVzB1d1pCd3R4VTRqcXkrbER6cDFwbTY2S1FBM1p5UTA5Ui9lY2tGaU5oTDlaCmJBMERwek51TWNiYSt6MXdZbWh0bm9XV3MvNE1CTkNnMUYwL2F4N3NTQ0VDdzkycktYR3FoQVdiZURGZC9RaThVVjJiSXFkbVNuYkkKc0hwU0lwcjEzVWpjVVVjSkIyT244ZzUrSExKWlpadGp1MUhqM3FDTkR1SWh3eFF6Q2o5cXhGMWg1YjFHSVZqMmR1SVFFeVR6eU5JaQpGTGpkZmxnNTFhb0JkeDZSQkx1Mll5NkxHYmorNkVscXoyYWlDTVRuakdBSE1CYmhOQVhGZ0tYa2ZCTVdPVkpGenMvWmJqV0RUcUQrCjREUGNGc0JyVXNEWWp2VnhGNW5sK1ozMTVUeHQ4Qks0YUE2TDdtMVJvUDVzbHQzWG9FWnQ0N1l3Y2g3NGdHT3RiSStjU1BqMW1RMDIKdVovVEFkUTJUNHBZZVU1S2pOdzZBQloyRzJDZVFpazZrdzhSU1Q0Um9obmRjeEZmN3Q2T2ZSZGhZYU1mNXU1WERrdEUwV2Mxb2FZdApkZXBoQmh3dUFLb0IwYXdJZVFuQzh4Q0VacDZHMFFpa1FoZzJhaEdjZ1dYNlpGbUx4WHcrRXpWcVUrNjNZT2xieFlOREp6am1MeGtLCmgyd0hFMUhhL1hsUkN4Zk9XMkliWHpjOVY5SVZWQSttSDBuMktqcFhkWlhBc1dwQWxJWmNGbWFveVBKbkRoVWhwdExsYU9LcStZbVQKZStncmJGSklJeUNWOVh1UGtCL01QZkEvWUZGb0ZHOUxqay9rTWJFWERHd0lFN2dkRmR1YW9CUXVwcm9WaG5MdHFBdzNyQWdOa1ZMYwpSRkNmVlBQQXdrWXg2RDEwOHB2ZGpaQnJjUWlNRFphVFV4bFVIdTBHeCtnTGtnTzlQY3dwaGRYYmVSRkh5MHdLWkdmSmx3RjlDR0pPCkVKUnBaVFlOb1cwT0dMQ3dtcnN2QTRvU0tRMDdxTFJFUEsvUzd0QlNvc0tmYit0OXFIUnViQ1NBNGJhanlEZU55SUhSeVVqM0NCSVcKWGlhVFRtN1RrclNka1JrQ2ZDSWNpV29TRGlWaDBRaGlrTzdaYmczWHhaS3loYk9BVW1adFlsVGJnNVp4K1VXWlJGckVUY0IvUE5Jcwo2Q285dGNlT1JCR0pFYy9sWlltZU10bEphTWoxT2Rkd214aXowTUtBeXdFK2twRzlhbWRmbWNubC9qR0FEQnNkeEMvcnN1cVRqVWZtCmNKaTNhQW9hRWI5OXVtdlNNS0dKTklFUTNHaGVvSEs4S0tHSVNSdGIwQlc1akNXVk8rdzR5QWVMRVFodTRBcUxVcjNZcGg1TkZEbHAKUEJ3ZEoxaThIeWNXR2pneVpKRE12TnR1UHpRaU9sTEVVbVAwSE9velNjRndBMW1DNnA1UnVFWTFla0orSHplYnkwSGVhTWFCNGRiawpwSzRLdUYzRmJidHA1SVd6VXIzSys2UGdqUllzOWFnaG8wNUxFZmF5OTFTdGRkRWJSUU5IVjhUVEtUWExGbzlTRTFCYi9PVGpma1QxCmlRNXZ6c3NoVlBsSXpQZDJzMzc4NGI4bzVKZUJTREtYMlk3VVFBaGFsYTN0RnBVeFBKbVM1VHJGb2NoNS9vNGxxb1JVa0o0K1hkRVYKSHg5cTRhYm9sZDRRc0YreXV5YlRzU3RURXRnUEIxM0JMUzJVZTlieU9STXgwT1dMblRod1VhMFAwNFdMN0laSU5iY2RJNjEyYnRvcgpSbG9WaXFMV2lKMEI4UU1VUjZBSUZ4bTNYS0xNSHBiK25GQ25SSDJzVGs1eWUxa2pnVkwyeG9XbytsTlRackgyUllaenpNNjVqQm9rCnIvM0JKK0Nna04wTU9yR3dPODM5NXRnNk5TWFJ3b3dERkN5c0w4K1A5WFRVdEpTeDkxUVpSSEVraXVKY050b2dmWGhLbktzUmhzWGwKTTF6bUZhcVRwTStHWWtZQytWRGhrSmZjZHE3OXNNME1SVVptdlFKY1pFWnJzY0lOWUJ0MTRrd3NQTTMxTW5nTU94WU1KWjRTVXRrTApDcXlKdXhOWittUWVGUTFLVnRSUDFJbWpONHlOTDk3ajdHbnhhTUZ0T0lJUnNUMVBoTXo5eGg2cllaT2p5a3dXeithZjVJQU95NGhWCkk4T2lReWZDSUNoamFvZzAwdEladVJyR1EzRFBHTkNoeWw4Nk5SWVN3eFBtb2hvM1EwS2cxYUpkbW52YWNLWkVhU0hiaDVYb05JTlcKOGl6UEttNktxMm9CU3JqeUNUMG1Ncnk2MnFwMXlyaEk5U3lhQ3RnN01ybHFqb2FZMVhkTldISDRoUUt6NnNZdWxBVW5JYXYwMEhqegpZMDhsMzFrYVFORklFNm8zTVc5U05hdUxqZ0VKa1NWTDB5MXdhckppSENwY3d1U1JuS1dxZkRqVWlhK0dLdGhZL0R5TTFMRkxBcGVPCmpxWENvbmx5Wkl0WE1Wdms4TkJnNVR6SkZ1aGVjRW1GV21zNE01SEVoV1VuRE1ld3M0ck1ZYlpJbGUxUmtPZXM1RkNoOW5GWUV2VEUKazRUb2pUbEsvQ1JYQlZnRThYTnJydnpuZjhpVHpScFYrSk93TnNzVWxRVkZxcEZCT2NwaG5kSlg3emxZU25RSWc0YURRd2JGaTltNgpUenFZbE14YU5LQzFDU1d6b2N2R2VnTWNVNnllS2ZtakNEQS8xZ3F3S0dIVUVJYVlES1Bybkc1MmlQVVYxekRxU0Y4NXJnOXEwaURFCklwWnBwR3YxMDQzeEJMS051blVZbGd4U0krRmtPSGlpQmlESGUwYytMQVRSc0xZbW9acmFzOTE3c2hlV0RyNWxydUpnSjViQWNZWHYKdFFrenQxU05ERS9yNmxrUnk2M2tYNlMra1F0M3R3Q2hINDRwaU9FUUNzU0dQdm1mL1JMb282UmNIT2ZUWTlLalhCejVhYXdldXZWdApKNVBmdTVvTkRvY3FPRkZUemJIVnNiQU02OXBUdUNCY0xpZ3FnVEd0NkxmbEpFSjIzTGplbXBEdVJkNDVIRjh2RFlmRHJoalNKYmFZClRhcGFDclc1MG9XR1BUekp4MDNnWWVUS25Ma0luZ0paV0k4VTNzenR5TEw5M21qUGhPWUFqSzA5VGxWd08rWWdPQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaS9nblNRQ0trWm41Vmk2UG1mYUliRWxpU0xDcUVtck5KdWtPYjRRRzJPNENVc2hCV1F6d1JNUExuaFMvNHh6RjE2N1BMUUNBMDZrMwpxdS9FQVVJd0krVEVEc2VwUWVXWW11eC9kcVpGbGFYRFNrRzRGK3dRejZjclB4UzA3NmFIbFVPakNhdXF4c1owTVFDaWlhd0x4Uyt3CnBUQmhEejc2anJ4Y3gydnFlc3hRNGRQMERaSW5oZWsvSzNLMEpPQlNNaUZxS0dDbG84NWMrWlIrZlRJa3g0YXl5ZUtwWGZNQUQ1S2kKV0dqTStRc2xKc2Z1TU1WWGJ6VGlqOThQWVV6bnBEQU12UlMzK2RYV3FVS2ZGUjdjMFBLWWxsNGRuaWYvQ0h1R3NvcHhSS2EzOHVOVwp6K3h4dVJ4MmJxN3VvUGZNNnFtMjYyUzY5SnA2NE15a0RSY3FaZDVDaDBHYmt6MjB5R2xCZVZ2dTkzYkdJTE1BVEF1N25lbERBN0FWCkxpaW9aYzJPZVNGOHBJcDZ4WlVnNWdvRlo1M3lZOGY3SGJKOXVnTGIxTFR6M0FhOTN4SEIyT1NHQmU4OUg2YzBrM1ZOdExCUkJYTGwKcXJsSnJnZEs3RHU4RjVNdW1SdFNrUE5mMVduaFVRaDFXMWcrYUxVc2RoUW9FWmt4cmwrU2RVMU1reTQvemFFNm9xSElVenhOTHExWgpSRld6OGh4ODZEQTBQMTZWd21ISDJkUGVrVDNuYUUxT2tFaUQ4UURqclY5VXc1M0graVZkWkRGSEVDNmZMckk0cERNalVvOEJqU015CnhwSlF6bEFWOThqWWxYSmRNYTBSM0NVRGk0Tmd5UDNzS0lBaUFzMTYxNWNiRWNMQ0pRRUNOTjErejU0aHViVFduRkk5eXFXaDlrYUkKVmVra01KSlFlamJkSy96SFdHMTNWYVFtcHMyeU93MGhXakpSVTZKRXRGVURDeVVNc2FNSzVORUJpYm1yN0s2dmlUUjhOcW9vSG9JUQp1TnU1Z2hJNmMxZzVqRUpVejVET2VQeHdtZFZSZEt6V1VFN0F5UEFjNWtoOEVEQU1COUVZU2VTUjZJaWpvSCsvNk9XSisxKzlQc3BSClBndFZNbUtMMU16d2hxRVU5ekZNRktJUVJXTTU1Q2NOamc3d0w1VnZJSk9rR0U5WWxFbWlTUExhREZtZG5wUjNVQjRkM2s1MmRmSDIKa3pLWjE1alJrYjVBK0JLSG1tUG9UZFJVM1F5WlNHd2VFSmVKa2dxdXcxZDh2V0NnNlNNY0ZnZWdydysxMEtzckhCdDdLcUtOK25wTwpwckFRcW9HMmdpdnJXSHBuWVhsbS9DYjhTTlpYWWQyTEgxaEtjc0hocHUrRS9LdjRIS01yOWNRN3kzS0NLVjM0aDB1c1BLUmFxUU5jCkFibGh4dUtiMVNYd0swWUVNMUN3RUlWcVRCRkRuSzR6cXlwSW9JV2hKcm9mTWRQVklqb3RyRXlNY2pQZWpLb1VBSSt0QWFvcVVLSWQKbXhzb1l5d2puQS95UTZZL1FOMUFubXdiNWxDb1NUdHVhM2Jnb2thUkRuZzdVTFRtbW81QWZwY3VRYlVrNzI5dlYyS1ZOc25CcUxjRgpWY214L04zVzFaVHR5T3hQU0tIQlVpWDNmbVdaV2lzdDB0RlZIV1NoMTVCc3JyT3V2bk84VnBWaHAzYXE2Z2FGSnBUWnorSkhvaytmCkxXSHNBRDdhYjR5bVI3bUxrL2hOektFbndnZ3pMS3MydVp5WlVoeFlxUDJFOTdwSFBCUnEwTGZ0SVVjWUNuTXpZOG1BQk55ZHpNeXcKOHdBLytpVmdFeG5OcGtsU3lnZThIR1pFK1huaEV3eEp3bDVzd1RxclZSeXFSbFRzTE1sQ1Z4dExuNUZETXJhSnBIRHJwby9IckRJcwphMGtHd1NrZEJvNzRWUm54dUVncGg1YVZtc3hvNE1HZzhEWDdFMUY5TGFLK3NZQ2h1cEFlRERJQjFJcEIvcG5zNVM5MGc4ZWd5SmtkCmJ3VTlFdzE0SzdvekRZOEVKVGtKRHdJK2xVbUlXSFVKQWVwMnQ0b2JrTUhhOU1JcVF5dTlRSkc2a0hrSENRYnkyRHRLVFFSL1RtTE4KcWFVNi9UbGVaWEYxRkxlSnB1SDBjQkd2MFdSSHQwdk53bkRaTExhaitKRktNYm9OTWZac2E3S3FocnFoVW4xcWZKTFV5OHAxM3lMLwpUTG51SEphYWNzSnhPcHdoVm82NXJMNmpMckFlbWdLdGZFNVE1bUdsZ1B1L0VDR0NSWW92Uk1Rb21zdFhUU0Yxbml4K0p5ODM2Wjg1CnFtQU9ubHFIWk9VOEtZekZpamltYUxFVEVQYmlSWDA0WlZ6MElVZzhxVXVCakl3WEhwWWQ3bnZXWmFWU1JrclhJa0xCc2VTcE1LMzIKM05idVNtdW9idEtRZGtIdjRoZFAvM3V1SmxoNUlWalIxSHZOQWtwMnFXbWlRQXZOQUI1ZW94bzlPNzBJdlRZVkN0Z214ZEl6dTRFdApXeUJBOUlVNkM5VVdwQmFsTnQzdVJQSUV3YVU1RWNGdWQ2ejZWb3JhMVVVT21nVW1ZN2dLVERmdEF4a1prcy9QZmtNOUNQYnhaWG5VClcyNkhodm1MU2c4bExiQVJucVdtajcxcmxndFpsMG9TR0JQa05TSS93bXc3TmYyUGFralY0M2tvQ293SUtNVjg2dFFjTld6VkJjZzgKLzZ5S0U0SjYxQlN2RkVOVmtCS09wcy9hc3ptSmw1MkZMaTBTZUJ0bzB0aTFtVmM0UWxpS1gyUmxGbjZIMjBpc2RzNXpXb21DTC9uWgo4UC9IM2gxRU5ta3FYRWlPQldwVVZidFp1d1VZSU1qdmVxbEtNa3ZsOFZSd2dsWmdoV3ozSnY0azJ6Z3dLZ2xXMHpnMUMwcVVwV1J5CkFDcEx1ak94OU1rWlMyVVNJQkFpMmpNME1iRFdvUWlyUXRycFVkeVEyL0F0aHdBc25mSSsrYVpJSnpMU2loOWdIQVlXNGxOcU1sME0KSzRtZHNBWFNwamdsckZRdnlwMVMzUDdxWHQybVJJM2pqU2wxNDg4SVNGT0hEY203YWk2SlJMY21jYkxhVWQremZKUytlbzY0WHArbQp6TU5DTVFjc1BOdmNGQ21PUFlXeHg5SWtNdmNLMU9jV1BKTXA4Z3E3b0tRUWZTQ3lwMmM4Z3RDU25YbEZVUm9CT1UzVEd6OVdKQXNVCkw2MzZIdkE5alNnOVoyQVB5U21GL0I5LzdoRGE3MWdpcWp1VnZFeVNKMEFyUXRvT0cvQlpQTUo2eUhKWGtVQmNRYmtMa2FwWnRaM3EKVXg5d1hPN0pkN2d3U2hSUmMrUXF1bXFvWGIxYzFPazRFYnY3cUNxWkRXVlNET2MvK2xtcTlBa2ZrZGdIMFJ1cE9nUk1rUUhEM0RXZgo1Ym5pcWN5UFp1VmNwSDl3VG9vcFdnazF1akxIZFgvUXNMSWJBR0ZjVmIrZ01xRWFnZWhoRGdvdDUvMUpEazhEQ0V6Nndha3B6MXJECnFXZ1hqN2s0cjhEclpHMGZia045RkdaalF3d21TRkg2bjF3cnJtRWY5YnoxNXU4OEtxb2lYZ0dTR1FaOHExZU4zSVFhWHNwSm84ME0KNDlKREdqWnEwM2w4MW53QlVrQU5DYXJPVzdGaGR3Vng0UXFzS1ZWZEpCMHRmclBETmMwZlRremxqYUJpVGc4ek95M1Bpc2NpL3BFKwp6QjdzQm9oRytYSjJGTkh0WWFSN2RZbTZwY1NuM3kzaVlTVlQxWDFTZmd0N3JxRGdicDRWcktyd0NvcEVkNEtSRmtaUitsQVVSWHVpCjBSVGpsNCs3QWxSM0lHVC9FR3BJYXBCS1VOU0VsWUFlWnJTd2FLNW40bmFjOHhCVWRxa3lQL0Urcm53RThwdGNKOEU2dTc5a0JqcHcKcnF5bTQ3ZHRsa2VMS0IrczlHaG9aU0Y3cVk3dm9yR1JmdEZLd1NFWjZjK2VaYldjSlVUajhXeWsxMjVhMVlONEdBZThhdndJOTBRcwpTdFdSdy9LaXBNb1MzamQxVlFzMVNuVThMSFpVdjVLbzVKUkFxY25pV21WMENtUWViK2lyMTU3RFlBeUlwZkhDUXNiS1lRcXZ4Mk92CjU0bFhuYUpkK1V2bFQ2TE1NaTIycFhyc0FOUVM1ZGZkMm4xa3B5TXV4TTRiak9qRFNnUUNZcVkyS05tWDNER1k4OXF6TDdJTGo4OXAKa3RlR1EwMlZGeks3UXpsSFNyWkVxVWxPbG9XaEtHbWs0dm1rdWdpZVpLNGN4WHlSU0F5ZlVOd2gxbjh0MVcwWHVrY3M0OUtFSzJFOQoxazk3NXNJMERKNnJLa0xiOE1UOERGZUUxaHBUdGNrZTdhcStWUk1FTGt5bXBtcTkrRmhKa0QzMWhDUk1hNHQ5bFhMYzBKRWk1ZUk1CmJBbkdvV1FXT1FORkEreDBmWUtBRzdpYlpKVDdGQWZIYXFpWmhCRnRxcDVpWm4zUHNxd3p5aUtIS0lrS09WZHpmeWRtNEZrdnpkcGgKT0tiYlQwT1lkM28ycGpxZDdueFhHVHpkRlJvbzI0Tmw2NzlDMThIeXVFZFYya3FINTRDc2ZWa1lmTmRsaCtTYVh1TVAxVzB5Q2NzMwpEUEkwbmtTdzhaQ2RNelR1Q1pWeUZabERFOFpqWHhFaHk4ZlNZWUZYMlJ1cnFPSmQweUlzbXlzQlZBbGRJVmdEZTZMMk9qaldNdjdOCldjbDZWbUQ0QlFrc0VNT3EwaHlyMUJmdG9vY3p1cUtub1VWaWlJU1l0dTNHRTlLalE5TXpqcmpvcWRmRnI0Z3NaUW9QQjRGanBkRzkKMFJweGIxemp6SUFWNVpmcjBmb2lVcDV5K3RmaitRbmI4UjFIRkxKVTdTazhCU3piMlVCVFNrN1hLNkRvU0o4cTZPanRhT0V3aEtPSApxSVIzZ0N1azZYVXRybFY1eEdua1VHS0hPRU9YRG9TSUdPalNydTNZQ3BwbFBzdFNoRzFCZE96czJhTjg3VEg3Y01wRlVHSTJLOGVyCjVYdFk1RHRPcFEzT2RnenZONlZaV3IzL2ZvNzBibHQ1dFp6WUlQT21RZ3VpUy9wMU0rZ3lLMTk1NzJCMzAxcGNkdFM5V1lLb2h3WlMKQjliTFBTNEdBeUhhM2IyZFJGd3JtV0tBbnh6ZWN3ZjFpV2dicmtBVTRTb1pwWWI0TVZFbWtJQ3lKR0E1YWNTM2xVUm1SU0pGWkFvbQo4c29TZ1BJMTVtaEZWbnBNM3l2SVlKT05WZjIyTTdxN05PYXZBRS9QSlEvOVovK2VFL0pMSVUzZVRLWlRZVEdHUzZvaTdIZ2dadUh2CnJDa0NFSzVESEQ2MndjMjZTVXBtc1ZsQmFIVVF4bThLak8xNlJsYkJzVVFwa2RXV3JJZFpUaExxSjVQRjg4ditBdmVrdm1aUjhVK0QKL00vbCt2L1lVV2w3WkJyR1Vya2dWUnRzWnV4aUs5WXM4ZGl0bjJRcis2TWdLdVNDMkNxOERVSklwSWlJY1RxSDFZNUdBbE9jMVZqUApPN3dDVzE0RnNteU9wVW1zNDJTWlVOOXFlcDBab3YxczY3SWtReUFuZzV1VlIrTWJGZEU1bWpURm5wemxZYVZPbWhaaUlkR0phWmVZCnhyRm0zTmkwSWh0ZEg1TjNsdk54TEdTbTd4Zmp4N2JvTXBOaU9pelg1bmI0VEI4RkR1VW56ZDNjeHhZTkg4TXcxYjBkWmhnRytPR0oKMGhtbjlyOHJ3NzhydlZnandIQXJWTCtQNElTUE1tNkRrQlh1cHdMNGNVdng1Nm1DMTVvR2d4K1QwMlFXV2ZxaDJuQnVFd3Nyb0lBWQpEQzJ1S3RMS24vWGJMdjQvbG53WHF4eHJrcENWV256bnczbEoxTEczWGZyVjVsWUhFUzdEcERRNVRUMGZXS2o4b3VheVNrWnQwenFxCks1TUtxa0VvV0tXSnVsclZ3OFA0bnVWNGIwOTdUMElsYUkxZkVQazFtMFRFYmRRZXFxZ0xXY3pOaXQrbllpUWRrRUVzejRjbnhWbWQKRXJlbTJxdGRrSkdNUkNXSUUyTklNemcrcy9uaEVQNUVLRklFZGtMbXcyVWpyeDMza1k0OHdGY3FCL2Rxa1hpTlFuWEFrSHBSZXo3cQpFM21lUUh2TWJSaitvcHMxc1pRb3hJREhsVjVjZ0laK1pnbUhhekpaRC9EWnovcnhPenB4LzVXai9iZHl0S1BDNElYUlJwUXNEU1d4CkdXRkVUSnZSR0VPMEVjMW14T05tYUpmbHpHc3d0RUdGWDEzbFd5eW1nTHRMdXZ4TjBFWjVKc3VlRE5DT3psT2JuNDNsR3Z2djNQanMKdkpRdzNmUnNNbU00ODBjZCt2SVljN096dVZ0U3BRcmpjamo0c0Y5Qi9FaGVLbGE3dWRuMUNiU21zZG1JRERGYkVOVHNadjNjQzVvZApmV2syTTV0RWUyYzRxYkdwMXFPOWlObkhhR0IyZGRQTXpjc0dtcEF3aVJ1WERiUlJMV0pqY3lxdVJTdTJEY3V1Vmc2OFdObE1ObVpWCkozT2dxS0dvQ2xKMmkvbjJBbVZEQml1ZXM0UGNBUkRjbUd5V0NGUVJmcU1ndncxWFl3Y2tHOFhTSEZHRGtVMHBReWx2UkhaekFkRW0KWktPM1dyWXdINTIvaXVvV2J6NDIyNitab1UwaE13NlM1NEZqTjh2M1hteHNBdUJhT1doc3hKL1VVczlrYkt6K2hrOXdZMktaQ3k3OQpjTEZaZEtiY0hCT0lmWVppN0lKaW85OU5zVHlNTXl2b3RNOVF0US9qYXBpaXlkdStpZGljeUxzdzJRUmlzeDdRNkhIaTY2SnM4SVhECmpxcTN6Y01tWlBqYmhtSHp6NlZuczRITnFDcFRBdGdvYkpHVlJZY2dDWHRVMFZCdUR2WndtR1Jqc0Q5V05FeCtiUXIyY20rL0Z3UWIKcXdWMlJBd0c5bExUd0NCZ3I2UWw0Z3VBVFVHTjlxRjdoU1B6dFF2NjlYSS80UmY4ZW5ablpZTjlEVUJFSjU3YjZPdXh4Tng2a2EvWApWRS9qRGI1bTFWbkpxaUZnZ0pjTkpVUkN2Sm5pYkROUkpTSVdKeDBKVStHckRiNkdSZG1ORzN5ZDZFS25FSld5MDBWMGlRbndOUzBTCmxNNmI3ZGE5REE3d05kYlBUMmlHa2IzQ29vY3B5QnQ3dmFyVGFvRzlSajhPYlJiWWF6YkVZT3p0NWw3TE9sWHZxZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaE0yVExQWWZodEE5cm5pOHVkZXdEaW5vemIxbW01RHVza2J2cDFqcHpiMWU1cmx2N0hVMEVRcnFOZW8xbXRkeUczcU4rV0o1WmMrQQpzOWRWbTNpOVpnalhMdUExakV5QkJ1OGFjWTJSODdlTnU4YlpOS24vZGlVekdqd3JiR1BXOVJvbWk0Wk9lUTBuSDI3U05kYTZUTzBFCjZIbzIxY2dHNWhwbHU0Wnlic2gxZDV1bXpiaHVTeDdiUmx5M2kzRzRoNjVtWmFZQjF3Qnk4S2VEYjkya3lIelJyWnZqY3NHMmJ0TjAKMFVCYnc3Qi9LYkt1U01kUTdoMWc2Mmo0R1Z4cjZoejFLVzJxTlhNVDFDa2FhdDBqYXhwTTZ6YjhTdDFJYXlTREZLTnlWZ1Fhc1AyRgpjSEpNVG5IZVBPc2FsVitCczY1UGFEQ2R0VWM1WkhNUng0WlpWME4zTnN5NlJnMVRzS3hoR0cxOGU2R3N6N0ZNc21iK2QraXJvdXFYCkpUS3NuRDhnYXl6cXBzVm1YRFFnbDZoaUlXT3M0YXlSZzMxanJITS9CVVNrV0dkT1pQTHhwS3Y1N0FsR0tGVmFic3o0NGl4ZkRHdlUKeDNEdEdBaHJRRkthZWRVa1dHT0daMlRoQmxpVGlQSW9qazU2U0l0aXQ4Qlh0K1k4NEUydnhpcUhTTm1BVitQWG1FOE5Kalc3K0tVMwp1WnBRa0J0d1hZTjRIZHpxNkNMN3dsWWo1YUtVcnFuVmRVVlkzTkJxSk9NWTY3eVoxWUJpODgwTFFEVk9xUm5uR0FicEdHOWdOWkRsClJZZGltU0QranBwVzVudGhVQkgrQmF1dWthY1BWald1bFpORm9LcVA0U0pWc3lLeXBrT3FidEhIUGtEVkxRcEpiazUxaTI1VndhbHUKVVVvU21Pcm1ibmczcFpvbEh6SXhFbzdWbjlJMlpsUmpBK1ZmTDBRMXpvaDNMUWpWSUV1d1NqMEExYTBxRm5uanFXSFRoMmcrTlF5YQpONHlueGlCRWljMU5weWFVaEJoZnc2a2htbVRvT2VEVUFCQ3BxdWxpVXlORnE3SGJhT3JhTEdJTk1qVSthR2JxYmpBMUZTT1BzcUtzCmRhZ09XbXdzZFlscDlxWlNJd2wvTTZsclpPY0RTVjJDVG40VHFVdG9Td0pJalFha0tsMDBqNW9kU1MwODJEanFqREtVcE4xRWNGR3IKdnMyaXprc3hvNXRFWFpqUWxEeWQza1JoWms5MU9nemVsbUp5NzRXaFJybThJdWltVU9kZFhCbHdhY0JzMHZyMllsQjM1NzNDOW5DRgptWVZ0OEpvWUdVMTNQVGdFYWk3UDJpRlE5eWpqRTMvNmNjTHVoWjkyYmVxaFR6OU9TRzM0Tk1iM21qK3hweDh4L1E1Nit2bVROM2dhCmZsVjZZNmN4QjZKbjhNWk9WelpsbFk1ZVZZOVZ1ZHViT1QwWmhHN2ZEblA2RVJicklLZVgweW92NHZSeUVqQ0kwMXkvSE53MC9od3oKdmVmeGJBMzRoazF6cTVJdjFqUzZSeHBIZlZqVGp0TnQxSFJYQ2ZraFRXL0REWnJleHVCTUw0Y21BaC9ORUdFYXg4QnpiQTYvN3EzcwpHRy9HOURFY3hQUzJCV0U2NzZyUEFFekhxM2p6cFZFTTBFZ2pGbDRhU3lXMkZ3cTY5TU5ZWktwdnVqU09rTnVZZ1pjV3BxRG1nNWZHCkI4MHV5aSs4OUVOSVl5a0hMLzA3SnQxcVQ0Y3ZEVkxCbU9aOTd4RUx6a2RuSGovdzBnWkhiTHAwRG1MMURaZkdLcHVwaW1CTEwvcXEKN1Z1d3BURVN6Zkx0alphR1o4Q0tkcE9sSC81a3Rab0JEaW5LeHovT3p6c0dXUnBlVVowenVBd2ZreUdHTHZiaTNHaHBPUVhTQW0yeQpOSW9sQVVFOFlHbmNxbVM1NHFPUGdHcnpGMVk2bTBpd3FkSm9TUDgwZ1NKSU1NQ3dKVVhSeFpTR1lLUzcxNEpHYllqcmpOVlE1Vld6ClJ1Y0dTcE0vMmkzR2xQNWJsV3liSncwRDVTQTNUaHJIS2sxdUZJVHp5TkYzcCs4bHlXMk9ZOTBzYWJpRzNiMHhpRlZoZWZqVXRiSUsKa05EWGtiKzlRTkxiR0J4cEtDSllUeHdZYWQ2aVZOOFVhV0pPeWpnUTZlS2lwTTJReGhZTStONElhUmo1VUlJZ0RTSENNK1lCU09QcwpyVTNaSlk2NEFBNU5RWTh1UzRqaURZK211bzArNVdGSDE5RG1CRG9hUlJOYy9nUVJHalFoeWlGdWNEVFdHTkVWazhiK0dCb1pzTkp0CnVLblJ4MmhvZEZ0V1h3UXorb3RUSFQ0M2hpQmo4aTVtdFByeWpINlkwZFRKc1d3dm1ORlVDRkltZnlHajhhRXlGckNSMGRoTUJPRlEKV0FGanpGalBSWXltTVYzY1o3M2NlVzFnZEdJQmFodHZZRFRlTDNJRXJoMjcrb0lZR00yL3AvbkV6OEd0RCtsUk56QWFNa2psRWdNWQpMVEZTK1VTTUp2U0JSYVZCaktha2tzSEZJRVlUNnNNYytrMk1wbFVNWVJPaitYaEdiNGNZVGVrSzgyNDNNcHBxbFZibVJrWlRxY0p3ClZDQ2p1VWt5WVB1dzR5Q3ZaN2c0a05GVXFqNnRibVEwVkRpaUZ0N0lhT3JhQlFNMk1qcVI3Y3NDQXlPajhVNktmSHNqb3lsc1pwQTAKa05Hd0VJS3dtZEZpSTVtVWZmb0ZKdlZYMnNob3FJK1VPUXhrTkhYQ2pEM2Z5R2lxeXhoaURXUTBHMll3dm1wa05BMTh6VzlrdEdScAovUkNqYWNDU2JST2pZV0hkNEFzWmpVc1MxRG1RMFJCcUsrWWR5R2pLa1pSN3ZaRFJiSzRiM3hGcnJSbTdVa2JReUdqRUpab3h0YUdXClIrQ01NZHdBUnE4bW9ldm1SYVBObnBvK0hsNzBhbEhHYkdBME54b0hGNDJqRU9oNTA2TFhqT2RxV0RRRGJvejhCaXdhbDBIUjF3c1cKaldLZ2lMS1RGWTFPN3VSckJpcWF2RjJWNGdRb0doRlJkVUUwSjNvVzRmdzJKcHJhbDZ3dzg2WkVvMCszMmo4YUVnMkRHSjFtUkdPMwphb3owUmtRallxY2laUk9pR1JTa3VpRUkwV3p5emJ6aFRZam1GZWRIU1EzbHBCNzNpTnFFYUZTOTlqcSt2UURSeTVXdG13L04xdHJPCmV4QjB5Szdmb2pkdk9EUnN4UlhOWkVQak1Bb0pDdzNOWHVDUGtKZEJoazRVSnlUakdOU0VKaWlvZ1liV1RPS09pQnNOTFE1Y2NUOVMKZGpzamIySHBXQUtMZ0pyQXNmMW1ROFBxQW1pem9XbEJzNWRnUTlNUVVPbk5ocWFWdFVuQmh1WVAxQmtrYUhqalRHaXQrZTNGaGtiQQptV0s4ellabWFZTUt1cU1BQkZYTi9HQnVPRFRMS2FoaURqZzBLaFNFN3dvNE5HK1FxaXd2T0hSUzhmdjZ0dUhRN0xmTkFIekFvVm5iCjhKZ09zK0hRckM3WldHbkFvV2xoSENqZzBMU29zK0lGaDZZU1ZTb2wwNkhaVTZpNXBsS3lEUEFpdXNzSU54NWE2bFNTMDQySDVuYmsKRXdVZUd0T1IybnZmZUdoNk5XcDFhRHowVWJFR0hocVdHcFRualllR1ZVNkg4ZEEwTURvWmVHaGExSHpxd2tNekZzZXFVTk9oMWRuRApNaUNoZXhCbTR1QjJBNks1T0tKQUpBalJpZEJmWS9ERmlXbHVoZjRpUk12S1Q5ZUVhQjVMOWFzaVJNT2diZzQzSVpvdFVpaGFDRUswCkZnRm1SbXNwWE1aaHFHOUN0SXFubW5SMVV5VTl4WE45SUtLNVlKa3UrdCtJYU1xMHhaTTNJcHBLYm4wV1JrVFRvZy9nWWtUVFN0RkYKTUtJbGxjOW1BVlF2d0V3MHVCalJFc2JyY0ZwTnd4OVpKdEVURWIwVjd5OUVOTDFDOW04T1JEUnVtUVNGZ1loV05PTVRJWm9SRGRYVwpHaEhOY0FhbnVHQkVLOERSamU4SVJuUTY3VXpNaUhaMFpCNUdOQ01xTS9BZCt6Yy9ybEorV2pDaTZRVXF1UjByVnN5dm54SFJXQXhJClNCSWNTVmJhcUFpVWlHaVMyWko3S1c5RU5BTy82dkpnUkRSZU13SW9naENkV3JUTHZRalJMSitpeWlZSTBXd05LSTJRQ2RIMDVIT3EKYjBKMDJvS0JJRVRMY3ZqUVgxY0FlMjJBMGZjSnVYL3dvWkVFWk5vdThOQ0o1SXRIb0NQNWQ4QUJrdmgyODZGcHBUVFlmR2djWDVMegpBRVRESWxuNkRZaUdWWEptODZGcFVGclFnR2habVBDNkFOSDRSYmFtQ2o0MEVwUE1Cd1FlR3BtOGdQZHRQRFR6a0N4VENqNzA2dFk3CkJ2WVpRMXdrd1RZZGVwVEl5TnJZbzhOd3NLRTdxc1Vka3Qxb2FCZ2ZzNXM1czhBZzFJN0IwSkJTVDBXd3RtdlBkcHJVV1pzSzNhUFUKTkxicTFSbXNtd25kM2Z0Nkk2Rkhjc0lxU00vb3E4MHA1Z1pDazZpODZqR3lOM2FUUHB3NDZHMjRhZERIYUJqMDlIeStJYytBT2FtQwo2MEpCaithdytONnFDSHV6U2REYmNJT2dqMUVjNk5HdFBnME1OS2dTQkx2ZEZPaU54QTRJTkVMUFRBa0ZBeG9HTmErN0VORFlMVGpPCkRCN04wTzRFQUhvK2Z0MXYvdk9JRmx1QmZ3YkVSWDBEalg4R3RVUjB5b3YrVFBTdkEzU01wMndXY0xDZlJ4SlM4U0kvdzdRc2V5TUUKQ0lZYURlSXh2UXhEbUcvczgzZ2luV3ZxODNCRHBBMTlob0Yxb1RmenVkc1AyY3huQkVCWm94SEk1eEVmN1VFK2I2UmFFSjhCWldOYQpPSURQNElSdUZuWmdpV2tzTWpJaGo5M0VBalh0K2NNZ1R1Rk5lKzVKZVYrem5oR1FaVm8vVU0rNllCbnVYS0Rxd1FMMGpIUzMrbkdaCjh6eThTbjFobnRuM2VkVkRlZTVhZVczR2N3L0k1bzE0NWluVkEzakdEV1lGalBITytMdll1MjFuSDJGK0F1N2NBNmtiYk9mcktKdnMKM0NNekdtRG5FU21rb0RqdmNlREdPZ09ZcURKZVU1MHg1cVViNFR5alYrTE5kSjdkWXZTOTFUS3lQWWpPa1BJMWs1b0Q2RXk4NWF5SAo1d3hEOTAwa3pubUdoT1RHT2MvZ1J3Zk5HWFVPVE00RnpCbkVhdmJqdkZET2k1SHNja2pPV0NvejcyV1E4Lzc3NWpnZm96SE9RTHBFCmYyRldiczFpWXQ4TmNWN0JTUXFHTTlhUyt1cUQ0WnlvYlhjenU4MXdobFVMbUlpNlVYMURrdWJPcTJONVpEanpidUVMYVJPQlZJRncKaG1Xd2ppQVl6dHlHSC9waE9HTUcxZlFRREdjMGVIZXBMdEw4V05Qd2hiajV6UitYUjY3SXhqZnpsSGgzQTkvTWd2NFp2T1ZkUkFLbgprUmNkL0daVzlFOURzTlZaTUVYWDdadmZ6R2ZKUWduem0vbEtOQU9pSlY1T1ZqTysrTTFzRXhsWG9GQTNQRDBPWlFZNGYvV0RmdnpoCnZ5akFtWEZCVXE1dWdET3RsRGdFd0ZuUndwSVBzSmxoUURXTHVCRE9ERmRSSHhRSVp6eFgvNElSenVBeDhnVzVDYzY0Y2hVWUJzSDUKckdhRDRLeHZlbW9DUFlGWmRueTFENlhNV283Nnk3WmpsdDNPU0h2RkxNVmgyUVJuR0tRYUNJSXppMGZWOGVFaU9PTXFwVTRMZ2pOZQpPMEdiQXVFTTEwNkNzcHZoZkR6WVlEano5UXlwaGdnUFpGSU1wYkEydy9teW11SE03cjBNL1FmREdSYkp3MjZHTTNFUFZCd0Z3emtSCnErMEtldlVTaDZDV3c4dk5jTVliYXpXR0djN1U1YW42MVF4blBGK1ZJOThNWjFTbmtlZ1ZDR2VVYWdtWDdnTHI1UVkvTDRBejFHWEIKbDZmSER6ZWFRMGZ3bS9HZWNIMXk4NXNaNE9Gd0hmeG1CbmpFSmZCb1FVdHpEZWlwbHFMVnJYMnA0K1N4V0NRZC9HYitaSlp3WitPYgpHYWlNWnZRcU9Yc2VSUUUzdm5uTllHd2ZlalBLYVlSWE5yeDVEcTEyTjd1WjVUVTg4d3Zkakc0d0FrR2IzQXpwSkN2MUE5dzhvdkx2CjVqYVA3dUV4c00wamlwZUQyanppNDdtb3pWallMQ09hR1JRWkp0c0dzaG5rUE03N043RjV0Q0JJR05nOGhzdWlqV3NHSW94Qm1rTnIKUnRzWURzMUJhNmFzZ2lYL2hqVjNCeDlmckdaUXVoZzNDMVJ6TDI2OVkxQXpzVjVENWRDYjA4eE9SNDl3enJ3c0hJYXZZRkNhMlgxKwpLSm04MDNJOUtvQ2p0SnBpUDBNWVdCZUpxNmlQR0FrYjBjd3U3MVdmTlFOUVNOVHhXd3BBTTZocjlFQnZQak95ZHdRakI1NFpFQUhHCnhJTE9YS1A4OUlZelF6WTFTcWp4SVBNTHJ6RFF6TVF3ckZCM1dqUU12UTlMNHdQTXpGWmZ1Und1TS9qQlZCZmRXR1pVNEdxTllDcHoKYTk0cW9NeFlGN0hFOEdZeXc4Z0ZTRENaSVYxcTVpaHoxUXh4azBpSkY1SVowd1RCOUVGa2J0V0Z0ZGR1cW1pOWVjeGNpaEhnWUc3TApYamNFanhuS0VzN1NONDRaVjhCZkN4cHptNmU3TnljVDFGV0pvSDNCbU52d2x4WXM1aGF6VjZDWWNUN0ZqTWFkQk1lc3dnS1RJREZqCktocVhxTE5OZDd1NE1jeHczclg4TjRVWnB5WkloQ0hNRURuTnRGNE01aFdMdEdBd3J4YTk5NHhnWHQycDQ0dkFEQzJ4Q21rTllGN2QKUHg3OFpVRWJ3ekMzVGxqTm5BeGZYczRGYlBZeURQRmJHNzNNUkFmWEJvRmVqbVRFSmk5RDVFWHF4dzFlbmlNNktwaTd2QUt3R2RqbApGWUh3aTdxTVJJdmVtNzRqOHNFY0NEVXoxeitVdzkvVVpWcEZFN2NNTHBHRGE4V2R2Y2RxanNsTlhZWjFzZUEvcU10a1JQbTlrQ0JpCk4wRzVvY3ZYNFF4ZGhrWG9wb0F1cCtSQ3R4ZDBXU3VmdFE1MG1mbG15azREdWl5UWdaVmxoMDhQUDVEQ3pvQXVNdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJemNzNUxhRExYejNJQ09wOVAranljck9wRjNONUxRRVdObklaVmZPc2p3bmlNcHlIWkFUejFob2hIY09VVWZDV1lWQnBzbkhMMkkwSgpxcHUyek1MWWVsakxLNERKZ1ZCV1FQRmlMK3Q5aGtpVEphK3hHYmlQNUFZSGFmbEtuRjJrWlM0TnFJc0kwaklYWkV6aEIybVpZVTZYCmtHNWNNa09kQWs4YnRNd3pVNWU4Y2FLYVJ0dDkyck1ieXF2KzhUQ282R2RFaVVkMjZjbkZXV1k5aCtxdHpGbm1aUS9XVjVtenZDMDMKWnhrN2ltd1NuR1Y4a2FUN2I4NHl2S3FxcXBXTHN3eXIydmtHWnhrV1NuazNhSmtPT0IvUkRWcW1sNWExR1JPRW9EU296RTJZWlc3QQpSM1pqbG5saWpDUUhaam50bmlTQldXWXBDQWZkQzdOTVkzVVhCdEhVWU5Gc0pjd3lCejBXbzl5WVpUcVkyVUw5b2hWRlVzbjJ4aXpECm9qS0ZHN1BNSmJEbURHT1dFd3ZoaW5TOU9nbU1IU3hkdURITFhCUlREeDJjWmF4a1dRTVNtR1VsZFV0OVk1WVpOeUdwSXpETFhDS3AKVzRReHkyU2pWY3MrVDhROWgxWTZNTXRrbzAxdnhrZWJnd0oyWTVhcEptRjB6SmhsR29xaHlnemdjVWVobmkvTU1qS1d2di9HTEVNTwpvczVOZ1ZuR05ycGhOMmFaYU1VZVF6eFRuY3ZoOGhWc3B1VVl6QTFaSmsyTGxUVjd1OVlzdEEvS010YU5lbmx1eWpMankyUTlCbVVaClBxWWNqYUFzSTNhZ09OaE5XUmJYYUk1RFdhYjJUNStnS2N1MFVFcC9VNWFscE96elVKYkZ1Q0pNeEpSbDdxa3lxNHV5ekJCNXdMWVgKcGU3SnE1MmdMSE1oS1hqNFJWbVdmSExOUTFubTZVZlJLaW5MQ0dBSmYzRkJsbUgwTHdxeXpEQ1hUc3lRWlZvWUVMb2h5N0NLOVdmSQpNamZUdlRCa21jZE9iaXV4SWN0YzNZak5Fb3pMc295R00yVDVHRzdJOG1VMVpCay9vQ2hMd0pNWkxsSUMvNElzWTZrbzcyNXZsNzIwCkNzYnlNVnlJNVcwTXdqTFhjOHJWbTdDODM5Y1hZWm1wWnhJR2dyRE1rbmVxQm9Ld3pPUmh0TTdZZWtsYWwzMUJmZlhJSG5LMUpNSXkKYzREeFp4VFBTS251cDJHdVkzT1dMUURMM0lZcjNodXdMRUh5VElldzdDREhQSVJsUnFybUo4QXlzWjFQam5ZRnlYa2hJaDhDc015dgpMekw2VnplYmFzY2pBTXV3OUdKMWdFaW9yY3FkZWdHV0dSc2ljU0FBeTdSb0hoTmdtUVlKRFM3Q01tOC9NOWFCV0dhcW00SzFRQ3dqCkVLQkt6aHV4VExTVnV6T1FhZ3VWV1ZlM1FCT1dNZGFwdmRsTldLYXVJMGZ6Qkk0Q2NIMlVYVGRobVRHVGt2SWJzUXdybWVBYnNVd0wKSDFJd2xtbWhRUEZtTFBONFZPVUVZNW1SRTVWWHI3aE1GL2E4R010MGFMTjdTVGc0WnU3T2hpd3prZEJHOUdhSW9XZGJBN0xNR1c3MQplaURMdkdmc0xYOVRsbUhWaXhhVVpWaWtsQXJLTXJlaEJPcW1MTlBLUnhXVVpSSDJSaitVWmNvSTFjdmpLbm1qTkpMMTFFRlpobktICnc4cW1MRE03UTRmMnBpd3phczJLKzZBc3M0Q1hDc1NnSjhPZFlJdXpGMldaSzZkMEdWZW9NUUxLdVEwM1l2a1lUYUpDYnh6eGNneFkKL3VMVmY5ZUZBMi8zMHc1R0RXdUd3cHVidm0yOE1wNXdtWHJFb2l0M2R4dDd3Wlc3bWF1YnJkd2RNTjVvNVdsVXc0dXNQQjBaM0lCawoxNmtmc3ZLTWQrNEdLMDlHNHU2OXhNVGRWT1hwOHBJWFZCbEZZMVErbWFuTU42VGxRQ3BETmNKSTlVMVVEdER0QmlwRHU4VWhMVURGCjJmV3ZOMDhadG1uR3Nwb3VkUEYzQXFiTVBOSXFiNVp5ZHVYTVppbkR3SFphZ1ZLbXB0NGg4UTFESTUwYXF4aWhsTkVSWTZ4MG5lQ0sKdGU4RlVrYmhBc0d3d1ZFT1BOTEdLSmRvOUh4VGxDR2NZb2c0SU1yVUI5ZDVHTXJBSjYwWFFMbTBjQ0xOVHk3UmxEZnd5VXd3T1FHNgo2Y2xJUXlzN1pYZ3lLZ0thR2NzTTZ4WFRPbTUwTW15azhRVTV1WVRRTDhESnlFa2htdkxpSnFNVUp2cm1jbnBGcWtFWlI3OUJLRG9SCklmdUNKdGRnT1FZem1WRzlOUTR5R1hvUFpvbHZZaklTT1BTNkE1Z01DVXEzSTA5SlViZDI3b1ZMN2srUUVFMUx4bTZNakFjc0dRZG0KYU81bUpUZEwxallxdVVYUHpTQWxOODlTTDFJeVd0eEZZb0drWkdoWW1Pb3pKeG41NTZGLzM3TXBWMW1QdmlHc2ZvZEpUTUZJUmxmMQpyckQ0cnBqQXNpK0hiQXNmeXpBRmEvT1JzUmY3b2R4NFpBUmNsRUUwSFJtT0FSbnNBVWVHdms0bExSY2JHZGZhWFF0QlNDb0ZLazBCCmRRYXFJRDFnZ1BrR0k2dGlySDdiWEdScUJwem1ZZWF6QzF6eGdpTDNhQWtTVE9SZC9oNUk1RzRveG91SXpBWXFQSmFCeUtkWTJUemsKNGdMWUZ3NjVCaDR5YU1nZzlETFZHRERrVmc3b05WaklCSzF3eGFLSy9CWk56NEtFM0VLdGVvT1FZU3pFR1p1RFRQWUsxeS9HSU9PMwoySmJpeGlCWEYyTnNDaks4TkhXR2RDS1N1ZXVscGRkbUlDT0x3Ynh3SUpCQnRlRjNGZ1RrRW0zWGJ3QnkyYzM3ekQ5R2hZWkltc1lmCmsyWm1odkdtSDI4WVVjQ1B5NGlwejZrNUdBaHF2ZEhIZk8wc0RlTzhBclljNWRzQlB0Njg3NXQ3akpveTFSdTZLS2RrVDB1aUhtY2sKcEl4c3Zwb0xPVTRWekdQa1padTNVaSsvTGhibkRUek9YYXIrelR1R2dSQjk0WTV6Tk1hOGFjY2YwenlyQ3cvc3VKb01HYXpqeGdGVgpOWDRiZGN6V0NtSEVYSWo1Z1VXdVFUckdPNTJOSzk2ZzQ0Wkt0NmVlc2tJTW00T2ZrREhIaUM0OTVpTnZ5dkZpTWpSOTI1RGo2azdlCm0zRThWQUw2Umh4L1RKakxnamNoanBPbjVTQWNXMmY2NGh0UExxTnN4TFFsR1o0b3lNeVNUWUo5bmJTTGRURmdJbWxKVVUyNDhmUkMKTHVER0VTZC9vNDJsK3pwazR4R3RDZ3cyenRIaTlzVTE3cXF5T0ZoakN4TTMxWmhKQUpVcEhxZ3hreDVSbFlqRnI2R2ptMmlNdHlJWgo5TENCeGlnSlcrWTZrR2VNOTlrTEVYMGxIUHUwcHRrMDQyS3ZLV0RHT1h5QVlCbXpSdDBqYnFDTVVlL1dWVzFKVHdtTEdyNlNtMk9NCmdqT2psQytNc1NYZFFURnVEQktrQXpIbXFvcGxxamZFV0FxU1VRN0VHQkhVajNWYVB4Ump5am1mc0lUc2lWclIySTQxQkxEVTZuSXgKUHJpdi92ZjM5TzR4K281WVNKdGlYS2NiVGdiRU9GaGxtMkhjY2tocEw0UXhBZ2pGMUVsNjFjQmRVTTBUQUdNU09Lb05JWlVIOGtKTgpndXRtWUFpcUd2VGlscDNKdTlqRkxiUUZSaGNqM1VxOVo1Q0xrYU9VQnZ3Q0Y3ZG1mSTlqNTFDTDBzTXhrUmo5aHlPeEY5amltU0s1CkxCc1JzWFVjYVBGS0NpQzhtTVV3c21vaWtNVXIrbmNFc1JnZ1YyK3dYZlNWUEtjR3JoakZXQXJlZVN2OEE5TnhONng0VHJkRURsYngKcHZNR2doaG9DcnFYTjZsNFBQWm93Z2loTUhOeHdTbmVoaHRUSE1aTktSNmV3VGQ5R0NKZXJuNXZTREhFdHdyazJEaVQ0YVJDRko4LwpMMEp4R0RlZ21IRGxWUStmZUFSVzVNWVRRNHdzTXBEcHhLTTVZeDEwWWhpbWVickhLNDFlMzhFbUhxRk9DaER4YU01aDNtUmljS2NDCmFZelhld2IyUDdqRStHdzJlamV3eExQWm1RNHNNUTNsd2hJemZwM2VVT0laSkNjemlhZmJnUVdTT0ZxSDMwQmljQmlWblRhUEdKcE0KSmhxTkk0YjZrdmZ3cGhGdllGYkFpSWxjWkRyTUxPTHBEL1dGSWthcFVqSWhORXJuMU1RMFNNUXdaRWZQTjRpWVJzeEV3U0VHMDRrSwpFbU9JVjdFRGVGT0kxOTBXRVI0TFVjOGpIUWd4Uys3eUcwRU1QQmREWEVFZ1J2cGVsUm9HRUVlejlSZC9lQVpITmZERHk4dXFUUjltCmxTQnh4QWMrYk5iMFJnL2poRlkvNE9GVkpObDljWWZ4dWJGWUxyRERLMHBoZ2pwOEhXWXpoMmNrWkFNNVBKMmEybnpoR0FaZXdHR28KWFVVME5tOFk1TEErTG83d3FCNUxiOXh3RC9adkdKRzFacXc3WU1QVW5NLzZaZzBqZ2ZTNDZUQkNIZmc3R1VnOEpjQncyZlFGR2taaQpLa3FuUlVOOGxIVFltR0drdUpwNzFXMHRUM2VnZTBPR2V4U1dCV040RzI3RThER2FNTndOTjlwOFd5eHBrMm0yR3pBTUtEN3h1VjZRCm9LQXAwSXYwVktxTDhsNXdZWkNqVk5SdXRqQldQQUpXR2kyTXRWQk9iN0F3VmxPcDlNTVZ4cG9yOE1QOHlxckZCQytxY0xNb1kwT0YKZ1JscTdTQ0ZSOUN0RDFFWWdpWWlKUU1vekxXWlM5dFkxa3h5YVpsdm5EQzlzZFFPVFZncjJYNWd3bHpyanZ4bUNXTlZ2SXdtNXEyRwpRUVg5UmdsWEt6TmZKR0VBcE9LOCtYMUVIbXh6aEQ4N09qOStSeWZxLzM4WTRTOTQ0RDl5NVBydDcvMmozLy8xZldBYzZBOS94Zi81CnMvL3JMMy9SRC96MGg1Ly85SC81NWYvVnNkdno3ZS85czEvKzdDOS9ZNi8vNFM5Ky9kTi8rc3RmL2Z6TDcvLzYydjZQL2NZLy9hdGYKL3ArLytPVnYvdlNmL2VGdi9yM3B4MUczOE1kKzRILzdpNDlUK3A5KytZdC84Mi8vK28veWttUFRQL3k3UC8yNFFmL2pYLzNoOS8vUgpiWC82NVYvLzlYL3l4cmpJajd2eUY3LzgrLytNYS96eEQzKzVyeEZWM1IvRDR0OTZqZi83WC96NVgvL2IzM3lXLy9DSC8rYnYvNlB5CnAvL3c5My91L2ZCM3c5OS8ray8rOFB0Lyt2R1MvZlhIZS9hNzM4bjhEMzc1TngvWGRmM0RELy9rMytGZnB2N2xIL3pWZi9qMy96YU8KODkvK2sxLys1cHYvK0piK3V4K2ViMy8vNC8vKzVkLzg4QjkrZUlHaG4yLy84OGQvL044ZnByLzVWci85NDIvL3gvLzVmUHR6YlBuUApmdmpkQktPUS8rL1gvUWZxZ3JDUS93a1cvRUZ4N2g4emYrenkwMzJjbjM3NC9jZXgvOWNmNEZ3endmVkFmNWIxSDFoK1Fwby9vTndGCkRPaGp5ZmV4OHNKL2ZJekRuUmJHNXY3bG4rR1lrTkpYMUgweGlKVSt4aG1lSmNaM2xHb2ZNNHhWMkt1SkFNTEhEOVpQeHE1MmNELy8KOERZREZmSHhDKytqb3BqbFkreDVuNEdOT3NDUU9QNjlyWU5QNzZNZTQrc01qdms2MjNQVTY3cSszSU9mZi9qWFB3Q3N0T0JrZ2lySwpmQmpVUFFWVEsybmhINjcyUkluRXgvSVhtWEFVSUMwVWNYN2MxL1I4KzhmN0VjS1BUY1FuUDM0Rk9EdTAyd3dqWk1YUUlLcHIyY2RNCjlEWW1wVDk0YVpmNUVTWGlkZFNQNldqaEpYaWRRUmgvL3UwVCs4dVBLNDUvWVAwVEpybE1rRTRjdTl4bW53V1dySk5GRkwyblQwYnIKaC9ZWjIweVFWLy8yT21yRGVxR1ViNjh6Q09QUHYzMWlQdVAvK2dMLzhSZTR6cHBOU3B1TXBIeXN1NEd3UVRGQnhidjdNUTRRQnRpZgpnZGc2NFFFWUxEUTJBSE9ITFA2blcwdEJSV3J2VTRBb2dVdWkrMlF2NDMxaGwvbmNoT3VvNTNaZFozRGYydWpmOE41MmtxdjI2YWpICitEcURZNzdPOWh6MXVxNHY5K0R2T0RiOGpxY3lRTHo3ZEY5eDJ0QnJ2SDRmRjRnby9ldE1MK045VlpmNTNJSHJxT2RlWFdkdzMxZjgKQkZ6bjk3YkladVpQcit4bGZKM0JNVjluZTQ1NlhkZVhlL0JkWGxsMjlYcmE1L0VMZ3c0cTFsN2pWMlBZcXJ6SHI4dDRqMStYK1l4Zgo1NmpYK0hYTzREVis5U3hGOW50YmxuWitQdW94M21kd21jL1pucU5lMS9YMUh2eXNvUkp6Q0pRK24yNE81cENuZkRvSXBvdktMK1FlCjNJL3hOYmdmODdtTWM5VHJnczhadkc0T1pyeUJRT0pyVy9MKzE2ZWpIdVByOFJ6ejlTajNVZStIL3VVZStPWmN6KzJlcTY5bmZPYnEKOHpaY2MvVmx2T2ZxeTN6bTZuUFVhNjQrWi9DYXE4OHp2cmZkYjhOOTFHTzh6K0F5bjdPOTNzZHpYVi92d1pjMzUzVnpybWQ4T1RMNwpiYmdkbVdOOE9UTEhmQzdqSFBXNjRITUdyNXR6bnZHOTdYNGI3cU1lNCt2eEhQUDFLTS83ZUQzMEwvZmc1ODhlU0dNZmkvYlpBd256Cnk2dG9UTEYvY2tzdzIwaVA4VFpia1BjK0trdVgxbnYrRCtNbkQrVGVkbnNWOTFHUDhYVUd4M3lkN1RucWRWMWY3c0hmZlpvOFUrL3IKdmg1SDRmcjk0MUpjWjNvWjc2dTZ6T2NPWEVjOTkrbzZnL3UrSGtmaDNuYTdGUGRSai9GMUJzZDhuZTA1Nm5WZFgrN0JkNWtteit6Nwp1clhIVjdoTzRYZ1YxOGxleHZ2Q0x2TzVDZGRSeisyNnp1Qyt0Y2RYdUxmZFhzVjkxR044bmNFeFgyZDdqbnBkMTVkNzhIZC9aYzluCmdFOW5sQzlEUVpoZm4zZEhxWW85Z21Qc2dvRjhHZ3B3cVBxTTkxREFaaGFwdmovRU1INGFDdTV0OStkOUgvVVlYdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJWjNETTE5bWVvMTdYOWVVZWZPZkZ5T3ZXbnUvMk9vWHpoVjhuZXhudkM3dk01eVpjUnoyMzZ6cUQrOWFlNy9iZWRuL2g5MUdQOFhVRwp4M3lkN1RucWRWMWY3c0gzWEl5ODd1djVhSy9mUDUvM2RhYVg4YjZxeTN6dXdIWFVjNit1TTdqdjYvbG83MjMzNTMwZjlSaGZaM0RNCjE5bWVvMTdYOWVVZWVHb0hXUWdKbkU5K3p4QSsvNVB6WklYNzI4MDZ4cGRMZHN6SFF6bEh2WHlaY3dZdnYrZnJpVGtjTXI2NDl6eHMKK2JUMjRRbG8yMnMxY1l5dmxjY3hIMGY4SFBWeTJjY1h6LzUxT2pqRmY2NVE2ei84L1orL0FxMy9LZkhYOG5lTHYvcU9mUXJDbmxncgozckEvWW94OWYvcHl0Qk9LL1RzSEMvSHVkcTNlcVh3cForN0lqUFdGMmZNQmlKVmVaNmYyeVlnMWVXMW43ckFaNi9kUnY3MlAycFQrCmY1K0JqWHZ1V0dOODJuWkk2ZjArNmpHK3p1Q1lyN005UjcydTY4czkrRzV6Qi83OTA2MmxOMUUrblFMOURyN1kxOGxleHZ2Q0x2TzUKQ2RkUnorMjZ6dUMrdGMwNjIvZTJVMEsxOTFHUDhYVUd4M3lkN1RucWRWMWY3c0YzbVR0WXRmSHB2dkswODZkWGxoZFlQcjJ5bC9HKwpxc3Q4N3NCMTFIT3Zyak80N3l0K292YithZHRwS2NQcnFNZjRPb05qdnM3MkhQVzZyaS8zNExzRnNsQVo1ZEd6ckJPT1lJdkFiZjZkClJ0dzhhZ3ptWlh3eW1oYTh3eEUyUHlvWWVSMlZnM2VhMzE1bkVNWWRqb0JvOGIxdGtScjJmZFJqdk0vZ01wK3pQVWU5cnV2clBiakMKRVUyZTczMXpPSmUyVHdmaHROblQrK2N1NDMxcWwvbGN4am5xZGNIbkRGNDNCelAvbk92VHRrVWxZZStqSHVQcjhSeno5U2ozVWUrSAovdVVlZkljVjkzNDVJbHQ1V1R6aHYxOUN1d2J2aDJYanA5ZmwzbmEvQXZkUmp6RjlmbGZIU1ZEdFJ4U25lRm5Pd2E1WDRmenNkY3Z1ClU3eHU3N1h0ZmhEM1VZOHhmWDVqZklyZjhjT1BYL3YwNFlmNWRZTjREYXQrTXZwNlA5M011RGV2bzM2S1Erb012c1FoOVNRL3hTSDEKME82akh1TjlCcGY1bk8wMW5KenIrbm9Qdm56NHI1dHpmYUxuSU9mUlhEOTNHZTlUdTh6bk1zNVJQOFVoZFFaZjRwQjZoejdGSWV2bgptM01aWDQvbm1LOUhlWWFUNjZGL3VRZmZZU0pQMGkxK3VxL1YzVHZmOTlYZDY5NzM5UmhmOS9XWXp4MDRSLzJVcU5ZWmZFbFV2MC9zClNsU1B2bGNYTVFYZzJDbmZacDlGbiszVEZIQ01yeW5nbU05Z2ZZNTZEZXZuREY1VHdOY1QrejdEd3ZhTXcrWDd0RG9JODh2anB5Zm8KNU1BeDJoUDh0RHFRMzdxRHpENnFQZHozR2RqNGFYVndiN3M5L3Z1b3gvZzZnMk8renZZYzlicXVML2ZnK3dTWjVSYS83dXR4NHEvZgpQKzcrZGFhWDhiNnF5M3p1d0hYVWM2K3VNN2p2NjNIaTcyMjN1MzhmOVJoZlozRE0xOW1lbzE3WDllVWVmSzhnc3ozajE2MDlmdngxCkNzZmp2MDcyTXQ0WGRwblBUYmlPZW03WGRRYjNyVDErL0wzdDl2anZveDdqNnd5TytUcmJjOVRydXI3Y2crOFRaTzRSaFpzajljOUQKUVpoZm56ZGpZUG5UVU1CNFdadWZod0ljQ28yRTNrZEZGTzc5R2NyMGFSZzQyKzBQK3o3ZU1iNSsrNWl2OHp6SHZLN295OVYvNXhEQgo2NmFlTC9ZNmhmTnRYeWQ3R2U4THU4em5KbHhIalp0MS9mNjVxZWRyUGR2dHIvbyszakcrZnZ1WXIvTTh4N3l1Nk12VmY4L2d3T3VPCm5nLzErdjN6U1Y5bmVobnZxN3JNNXc1Y1I0MDdkZjMrdWFQbkl6M2I3WS81UHQ0eHZuNzdtSy96UE1lOHJ1akwxZi84bngvOS9PZS8KLy8yZi9mckxuMzhicjhqbmYwYnNzK1lGYVMyazV2Z1BNR2wraFJXNE45U3pIL05Qbjh6dFk5SFRxOHpuR0w5dDNZZjRQYy90ZXdoVApYK2N5MUlKN256bmNRSnJseThrNGJIdjZyTGExNTJOaFFXTjZxRytYbWJXR05MTkYrK2NyOTYvOUJEK3pFdVVHTGdCNmxINmNlcDgrCkRkUzNmTHpxTkpQQUxDUDlRUDBrcWdwa0pMSkJQemhMbk1kZ1AwQnQybVAzanlGcCtkSlFSaVBqeHdyVXY4OWF2OWo5K2ZnUS9mc2YKYjVvdmVlMkRLdEl2bzI4TldSQnhGOWpTeDNjc04yL0ptbTM5UHFveGZMOHdubXJMUkxxbHpPUWk2cmJnZWZxazBKRlZScFRmK2FxZQpNSDQ0OXVmeTBSalo1Lzh4SHNlbWJYai9jd00rUFlBZjlXVHl3dzVpdEdmMGF2N1ZWcmFTcHJVcGxDL3JTUDQ1ZmVNeXJoWGI1dDYvCi9kWlI0OWZtbjlUMCtCK2VqNFdCZjI3dTE3R3JlNnFOV1FjQjdHcHVtMTREZzBGL2pQM0hpQzJmN0UzWnhVZkhaSmp4dDM0L1Rnek4KWVBTRTBXYWtGcDhZY0p5NnVLWWlVaHRSKzJmamFtRjhZc1BGK3h1YkxwOXY3M3QzRkJqS0JvVDJiLzcrZit6NXNORUt6ZXhuRUErSQp3RlZ2WGVOWlZML1BiTGd3LzdZSDlBQTNuUDJkZmJ4YU1kS2gyVW4zUzQxMXFXMTdhR0R2WEJqQjBXditKTmd5N01mWVArVnNNMG9DCjQ2RHhwZGFoczMzWURPTExkNzZFRHRQdkkxTm8yOXpuMVBmdTcvUDNoU1hVdHlYZmRiYUEvelhNVCt1WCtTZWJpYXlSK1dNMStzM0cKN2tmTTFoTzJvUkJkeGhUajQ5ZGY4MEFJTGdES1RmVVBZTjM5YW5NQ25rU0h3WXRnWTA3K0tqaDgyUWpJc0o3YzhnY0FhNHJ4TFkweAp2T25UWTNRaGM4REc5SGgwWUdvNURoQVBzK3RSeDdZamJnNGV4bTlld1hsMXh0TThtTEtUWGJ3NnJGV1Z1UTNQZXl6STJXYmdER3ljCmNjVWx4dU12eDQxSE9sV0FyWnUya3VlMlpCcTB6TlgzY3FvUzA4K3B0REEyRHpDRFk4RW40OHc5NzcxekdOdGEzMzd6NTMxZTZBUFMKdTZiMDUxRk14ZGJxTDRQUm1EQjZXbGdqNVczci9nUldxejR2ZHV2TVBmYlhKNlFXbmkxKzY5ci8rdms0cmUxcGdEQ2FQQVV2QUJwawpiQ3ZHRVJobjgzTm9WWGVMeHNldkNFSDhYNHhsZVdiODhsdCsvUWtnS2I1bkJYbWlYOFA4ekI3bXdXdWpjYVRmTU9ZUnhuai9VWFpaCnVzZlpqS1lETm83d3VQQ3AvT1lKK082d0VWb002dXlTK0t2Tk9SZWZCRWtZTXNhOGp6ZXNaaHViUHhaOGJUNHhTYTFHekVJbE52MVkKVmVUM3JQTDFCTTUzeFQ0akdoTFgzSjhWdTk3RWlOajhxYkFOaDQwbHZwK1AxN1Nlc1ROR1ZLNUlQWHBxZW53SVMyMnhxZWJjTDc5Lwo3dGo3Z24vOURXdjlqVnZ6TVhyOXE3amxvNGNaczhwUFlVWnJKcG5yRTNlSHpXTmtMSG4ra1Z1dXQyeXFiU2x2SlNlUlg4T2N3azFnCnRiMk1wTHZLT0hRZldQd2JiZ1lCS2ovK0VPWmNZdHVSWXR2Wi9HTk43OExYRTRneks1TEllSnpQZnBqczlWNUx2RkRObjJFQmd6S0YKZVNUOVhoRml6a2FOUlYrUDZ4OUV4ZmFZNjlyNlY1dkRKMmppSmRyWTloQ3A3K1hEMXNyK3RSYnpHOHg1blRQcnNTMGJHK2drMGd4agppZy9XbzZSL0MyT2dqeHUvVld1TGcyclErWHIrY1dHZ2J6emorckZmd3h4dUdLdWlaUHVZWDFaTTVuT0ZjV3lmc1V3UFhEQzNlQklzCkU3Y3hMbUZsVGE2d1BUR1FrTXo3NDIrZmxrZStpYTQyc1lDaDkvQ3J6ZWxKSHRXSEozNFlTN0ZuUmVLSmpSNDB3TGZ0OXF5bWNVSTYKYnRJUzRzTlllNDhmKzFqU2Yvdk5NN2g5dnZnNStORXh3SEM5ZHp3NUcvTzR2TFBmSGg5c0JZN0wxaGJ6ZTdncDJIL0ZvUE5IUEw0eAp0eU9adHNjNFJoaWY0NGUrVHYrOCtuUXFOUkd1dUs1b2R5TnppMitOMkM5TjhaT1VjZG02YjRHUDhKdUg5ZStoajBiekJYOThnZlpHCjBPOWlMMGNuOENRL2hmbXA0M29ZUHNLb05ZeHkrTDRjTmk0dmlZYjErZkt5ZUFOeUV6U0N3N2E5WjFJeFpVdzlKaEIrS3ZFQ2svUW0KTXhhQk5xNjhEMURpQVBtSjUwNmN3WSsvZlY3bkN5QSswUzl3S2VjTHVONXJyV0cvdnV6LzZtL2Y5blhjZi9IeGcvLzlmNkFmZ2llNAovQVRwcVB4cU0yTWtOc3Y1WEJoK2l1OStEQk5zNFJhL09CNnZ1OUVldWxhL2NzUjdhZE0wVXR5a3NjSklKaFYvS2NXeWNMSi9RYnlECm5uUUFYdW5KSHdJYlBNaEl1SitNTlc3eVhBcXY2SzE0dFBZaG1pVU93RmZGUm9TRS9aanJPWVB6SlgxNGFIRW5XdzczWWE0bkJxUDgKSkwrcDlrdDgxejErRHF2SlpRelBGWlRPMzN3NnNUdFYxL3FTUGFiU3VIek1qdzh0NzkvM2htbFB4YS9CN0ZrZU40ZldhdlFIZ0JtUwpMVUlzUThRLzdUKzBMS3M3cm1WanhNU2VHbGZQNXVNeWdtd1J1N01wbDNZSE52QW5tL3Z4bjNLT084QndudzVCTWY0bkk1c094WEZqCm1UTGtUc3Y0NGR2NldwTlgzOU5YbzZPMnZUdkRVSDRBK3ZweFVpc21BNzVNY2N6WVhjVE4rUGxZVVFONEdWZkZodHArVzNNY2dDdEMKais5eFRoOXJtSFZ0R0VjbHprbmZ3SGoyK2RkNFYrWlNGQVN0SWVIdzdjRkwrL2Y3dFh6OHJOSERjUHBPalRTbmphM0h3MmE4VUFkbwplOGdmNnM0dTQxbysxK0xRR1VoSkk4V1lXTUpabWVnc0VZZGx1RURHUEZNOGdPR0p0d3FPcnhONHdpdEF4OXhTWXJUSGZLd2JXLytrCjFVOURMWmxLeGMrZ3lBa0NRNzV1WDMrVnVDOVZuZjg4TmloSUFVNVRibkd1Y0VYOFF5M09kWnpIRFZ6TW5INWVYZE14anByaWpXOTEKeGxrOS9VbVhNUTdBVm1lK3J1bTVsQTJSNHoyeUl6ZEpieDZmWHMxOFhRR2ZzUTZicnhlK1o0M0UwKzNpUER3cUxEdXprTXIrcFlqcgpUaEQvWW5BaWNROUdFRnppVko4d3hWZUlTZDhmNFRDNU4zd3l4NFRHQ2Z1TlAzRlllcHlBaGRsUDNyRHVlU0E4eXc5ckhmc3I4ZzM0Clk4ZTBaem5VV0dIdlgrTXI2SzBYYjNzQzdsdzRlTXZWWTJJdXBlOERuQmhjckRySFdSTVp6Z3NqSnJWOUExTHlYUjJhQVgydTAyTWUKZXNpbEo4SVZjdnJIRUxIVkg1eEdZclNUV1BHdytabnBxSWlzeDB6UWNuRjhpQTN0NG8wamtSTkd0SnlJRXl0ZVlZeXFySnVudmVvNQorc05jZWpoTzRTdU84aWZka2VLNWwrTURYWGhqd3h4ZjEyQy90ZmhtS0xxaGtSQXgvNWFtVGRLQlp6eFpMRWgxZ0x5RDgwQnZhdHdICjRLbUhCeDNCWDlBQjkvRFFQbFk1K3dEaE8yQ0k3RzI3amdNZ2MyMDk4dHhtemlQMjBWSTlqdVp2KzUrRXV2ckYwZlNOUTZTMXg0N1MKdy9qRTlORkxPQkFmWmc3bEh2ODFKckt0eTlxdjR6ckdKKzc1TTN3QXRFR2Y4ZWFSOHZhVHpXY0VqVFV2eElNbEZnUGtVOGxJRXBzbgpDM1lvMEFIR2RpSStwb2djQjlnZmVzU1MwTW5RVXdpQXFSRkx3Z0hLZnFFMXJtUFRGZ3VYK002Nm1VSWVKMHJlKzNPNXBQMzdpbTE1CjZSNFVGRHpyVTExdy9JQ3pYeHkwTTZ3eFVueDhXbjd1NkNMZFl1RkNud3JHRGE5U0FGQm4yMVZsWm1PTUlLd3pDLzl3UFRNTzhPekoKVllNcWRpOWxSNEdxWGE3dUZKWEgyaWNlR0ZDdjhTTEVZTjNWZTZxRzEremR0eDlaKzdQMlVjTzUwT3BSTmhMci9FdDZCL0E3MitGYwpaZXpkQ1dDTGp6L3ZreW85bmxlTXk5MWtQRCtESEtmRmhoYTZWNGlBN3VQbUZ0UEZxaHdYZTFPSGFXN0xrVUxHbUxCdnB3Zm0wajIzCnNsdk5UemFIM3oyMVhJQVJoT1BoUmNLSHQ5bHRqRWtmdzBmeE5BSnozdDlvejluYlB2dkQ1UkFJSXpwaHJIQXh0VkNWdWZad01MencKak5LaTk1c0JldWJhazN0NHpwMkl1bmkyOWpyWStpL2M2VjZWaWUxWjVWa2U4Q00yakFPTVdJM0dSQTR1K2Q1MkpFM1BhTnkraC91NQo5MDg3YkFqZlh1NEZhKzduL2tBMW52VUh6YzlqS0NnUk1rRnZ6QkYrVjNPMjhjTTQrZ2x0K0t4Y1Z1YlpjZFo5Z0RialN5Z2Erc2oyCm0vdWo4YkJ4d216K05tSi9FcmM5dHpXUHlSQkE5cGdnbVdpRkVWVGZ4eTlNVEdQTmlRRVA2dUc0d0h4bVFyeTBQOWxjOGhPclZTeW0Kdy96c1lFN3ZXbTAxbjd3TzhXZ04yWEE2TVVhc0h1Tko2MmoyR1c2cElyMTlSMzA4cFA1T1lkcDZ1NmtSR1g5bThvWHBVb3VwOFR3aAp1K21rd2JjZUgwek16czNOVlR6NE55OVZBSUhmdHpEbVp4anovc0sxMUFTMTd3blhONVY5QjgrSE1HUFhlV0ljTTg3ejJkUHlUSEZHCllHK2YyNmxmZVhaQXg3RHREeU1BaWc1cFd2TEJlUXN3YzZUQlpQYmNTU1IrZklQaDhLQzliTjNSdlNlOGVZTEY0dz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJdUI5UElRSmJRK2hoMzM0Tnh1RHg1NUNkSkh0WDdEVVdRL0ZVYnNUbXNTTlFqZ3JVZHNVUGxpTjUwU1hBeHNqT1YxTmcrV001NnliVwphZ1MwN3pUL3J2dWlZbndIZUQ5dkI5ZnBPR3hiOTFRdzlhSVEwYi9kNjVUMi9vOUZMZmh0amZuc2JyeUhNRHdnR2JzanNYWU45VmkyCmN6alZhTnViOXIwcFdtVDVvRSs0T1FsQnB4OWoveDNWSVJCWXhxZEZzREdWRmNZMFkrVkdUeTBDY3ZQWmQzcHB2QVdyY2p2TlZCajgKN285SDlNRDhDbGVQcTBjWlc4cWZyd3NBOXUwNjdWaEpQUU91b3hhL1U3eDA3a1dHbzEwSTltK1p3RmxuSW80YVg4WU95ajlxa1BpYQpjcGlXeU8vWXFzeHhZZWQrbDdVWGxIWnliSXdCM3owVFphMGVnYVlXdDc5amp1WjhSVHdWR2J0ajJjQzlacDhBRUxKN2Vvc29QUkcrCjRmNVovRU1lYkd6WVl1SEVCdUF4T2JHM3ZIZmZBWXltbTFxc0x2TFB4MHFpM0Q3U2JCcEdQb3lNWHR1ZlV2UUFMZE42eExDSUs5Y0IKMEY0Z1hoZjY4RExXczU1VHhoOHQ5cmJNNm1PSkdQdlhLOXdWVThXSE1hMklBRVdTb1h5ODdqdHNUKzlZQjhCWHRGZHpVdzU4S1hJVgpkQUpacnhBeVdjOStnMklZNFA1N1JWb2o1MFVKNXZGSGJhekhHMjFuOTdiMnp6OG52M2FrV21VcXFTaVNmOGpnMm9yRHhzM3VFRDJzCmZkd1B6Mk03RFR2RmZQei94eTR0K3JLUGU2RWZhZXUrWXNBY3JVU0t1NjBZYjJPaHo3NkFFUkk1TDFaV2FrWFdPRmY0WXR2cDhPQlMKM0wzTXYxL1BBYzRhYWorWExOMmMzeXl0Zk5GUDU0bnh1WTRucmlEZEFTK0hrR0RjOFI5R0VuVFU0Mk1PYUpQaUFCeldYODRZT3Y3RQp1cWdVWi80VGN2ZzdZcHpxM2o4UyttN3I0VzFQeWp2dVMySkhLTnYydC9WZ3RvbmZ6d3BWb012ZEUyL1JJMmVTc3ExSXp1UWMzbWhlClhDTyt2b3g4Ui9LTDE3QXc3dFg4Y1lQUW4zUkZSS0dYV00xL21NdStMWFhya3ZLU1BNN20wTVNGbnN5OU9XUnNPdzFFYlVVSTVVYUoKUVkvaHRKOXNQbTRPeTNYQ2ZBSkp1WjF0VnppRFQ1UFVBai9uaSt0YXkzakwwbXc4amxLZWV3SEJsbFo4T3pJKzRkQWZ6YWw1SHUweQpaZ3dRSi9aUDg3ak5YNDBmRC9wZmVOc1dHWUZsalJyYlVLVklFL1FTUnJiVDFaYW9Zb3ZmWWxkVVhTM2NJQmtqYnNvK05TTU9zRU9CClIvbVd4M1pBaG54akdQc1ZzaXJkZWtkMG00Nmg4NFFqY3Q5KzRjbFU1SHVlS1UrSm81WTlTN2tkZ013blpzWEE0MDgyaC9CaDdLZzgKRy9SVW41anl6dG1kOVh5dU1TV3dCWEI0S3pVcFVZNmZ5aUUxWkVCRFc0WUdjbHdyYkpqM29pSWxUUjh3bnNCaGt5NkFYWU4zc21WRgpoamkzVzhNY0F0R0szNDJiK1AreDk3WHRiZHpHb3VmemZSNzlCL2EyYnB3bXBCZFlBTHNiSjIwc3lYYWR5ckZyNWNVOWJhcERrU3ViCk1VV3FKT1hFK2VQMzQ3a3pBd3dBdmk5bFN5SnA5c1VpaDhBQU13QUdnNW5Cd01WNFNHVTl5QTVyeGlRb0gzV0Vvc2N4VVpIRjJpSlYKTHJaVDJjY2xuWkR6ODFCRlpqc241L0VWbVpTM2VwbzVDTVJuQWgzS2hBV2ZsRDZPSTdNTzlDTUh6aFJIcUJvWDZDTFJsTWhIZWVVOApCUkpQeDF3L1k3c2NQdDBvZUxwUUxua0g5R0plT1pNVUFuM2tBRVhGV2dUQ1Iwc0V3eDRBcFdMaklybkI2amJhMUZ0SWhYZnR5Y1JtClhROHM1TmhVSmJKSm9aaFlvNVVGdXBnVGZDYlFtemhTTHpkRWlCak03TE1rRmtpaGFCWm9NZ2JxbkoxcjVOZndrWDNldWNaR1BIcUUKbEtNTEtiV01CZEliaTJGcVdRU1pmZi9hclRwN0doUE9VZWZZYVBWSWtVVnVZM3AxeVllRmVzcG9OK05vMHl6M3prempnaE9OalZOMAprOVk2cU9oVnk4eUoxQ0xqdVlSbGplRTRlcmRoUmpHc3h2dVRoWWtGZFNwQ3ZHcnVLQXVCNUZTV3lSWE95dzFBZXFMWmtoQWp3QVhCCnM5bnVnOEk5VGVFa2o0Y1Y3T0tqc0d5dW4yamVyNVQwbldXL0c0WWhXaE9EMFA3NGpJOWY4ekZKdUhnZnl4bkZiZ1NCd29mRk9zY2sKNFpPZ0diTUx4S2gwd05SSkRtZm9aTHpCSFVablprYkE0ZFBzVEVKZzdqY2dIMWlySXc5VllzKysrTTZKYngvV3RXMGZYN3VRdkZ1aQo4ZExXVjk1UmpmY1NiQndOdm5YcHdob1FhQmdyekh3NXhWazhmZk5oTjVXK01jRGx4WnppMEdDWVVTS2FuWXlBM2x0eGE1OE45ZlNHCnJRL1F3ZGRlR0J5V1E2cFVBUE0raWo1ZTYyY1NvSDhIRjZxd1J6aDhwOTQ1YS9FeFNNb0U0c29heGt1dk5GcWdOOEJ6aUQvQ0ZKK3IKM1B1d0RxMzNnN0NqUzZUV05PdGtuWnNJcWUyTGxmWVo3MWY4T3E5VFNtMVJhZk5jV1ozT0JVMUxlc1dROTBXT0twWTJ1TkFpZFpHVgpJdlp6K2ttUFQwejZRemdmb1FWS2NGYUoyWDJLUlROdnN5eHNGQWdDdGRjdGZFQzZqRHdvaVJ0dllSVm0yL3ZNS2tjaXNZNWNOMTBFCno2SWtzck56L0NXKzVaSDdaWkM0VzBTRnRSdTZrZVoxUVBIZU9WOUFLUXpIYzhFMFk2VUw5NXAvY0ZtdlNyRjVKSEZQUjduZFJuSnMKS3MxZVMxWWMyK29Wamx6N0tGaS9nMUVRVWQyRnJ1WFI1bUdyNTlZNzRCYUg1S0tzeDZIV2FsV2JKSThGdHpZQkFia2luRERVcmlnSgpDamQ5N0RZeDc3WkVjQUNoZmRuZHhNcDlzQ3Z1OTRhdlc4Z3NrTW9HYWdRTDlyOUk3YTltQkpkZnFxeHFnbGk5QjEvNWUwWDRzQXlqCjlYSDRXYlFoc2M2WlpKR3pqTjdIc1FqUXBzUENyQWozdzlDMHg5SFFIUEdReE1ZVjRaejFpRUJ5VUIvczNLbnZtSDErMHdzZDExdk4KeDAwaG1kM1NCR1U2Qy9YcHdVWGJBY054TzhSRzZUYWF0SmczdUc3R1NDOXlaS3FpS1ZNNEJCUXp5SmNjS0FHY2JjNmY0bkFxdTdPMAo4YzRLQkdxdmlBamg1N2V6c2hucmplRUpydDB4MEZnaDY0QStSTm80cDN0UzJIZDRDYWo4aFNrRU8rK1VzU1kzQjVRY2o4MHEvYXpiCkYyN2xLaVpCUzA5WFhyRDZIMkV0Y3U0QjN3L0RrcWxoWU02bkxSUW9obnRBandOWklNY2FHL3NNa0FVYWQydzJWZ2d4QXZLbldMRE8KM1BnS3diWmhaNG16UlRsWXlkaGJVN1lnV3hxTjlSc2V1UHJrc1NRd1Nnekd5dTV5ekNpWm1nRE8rWGpKZDUwQVNJRzh5dCtUc0VDVApGVzQ1cE9IeUVOcFU4b3g1YXhnQmgwWVpLK0FkMXN6ZnMvRDNFbEhZRytZWTM2MmhmWWxQMkh4RXArZkFEZk9yQ0pzVis4S01EY2x3Cm14VnJuc3JaTUxGNjdxZDk2alYxTkhaeCsvVE1tZHMvL1UwSXIzU2hHNGVCdEJueFhpdWRwZzdkY3Q1QWZBZzdaeDAxMVlwM2NPbWMKMGlZNmc1QmlrUHZCTFZnem9CeWxLcjZMc2VBK2xPU3JqdVF2dFVBT2hhRFhibGx0eTNtdzBpd29YWEFBWVFLODBtWVM3aE41c3B6YQphdGdZa3JENFJLZ3pXMmovbG8xVmtpVVB0MDBrTTZaUUc3c1pXS0RSR2ZkS2E1NFlicGJZTGpnN01LcjV6a0dFWGNnWnFFSVBOQjhPCjUxK1hZeFhSK0VBeVBGTW8xc2hGNms5TGlXZGhjT2NKcDdNcmUwdWdZSUtENHpHNmhrZE9UT2F0YyttSTNGOVE5QmM3SFRnVGZuNHIKUHB3RmtlWk1PaUlmVy9nY3VJZmdqT1ZrbGl0dWl3M2Z4bDdENUpiNGdpNnBraTFHSUpnSlh1L0w3ZHV3YnJkd0N6eW5KeE1kVWhOMQp3Ri9zby90S1J3NmNKaXdvS1pDVzBYcUpsdVRjRm5zRWpGV2dHRy9xVDR3eTk1ZmtWRmhoeXQ5OVU4YmZ2UEZlZUJHMGllaHlZdTZ0CmxzWjdzTEZiWHFnSDh3MGlVTXhGVnNnQWFEU1BMYXVwTSs3Wk9iQ0xJRGIybnR0NFdXTXRQUmFZdXhCb1krMmNiRThRZmd2aElEV1IKMitnY08rT1Vab09FczZXNjYxNWNuM0wvaDBWcWdieFRPS3NWQS8ya1Q5bXZobWFLY0QrVGRlcWk0YStHRmU3YUJGbytKTjhPTFRnQwpHODBrTEdRVGR6aEdJNHZNK2FxS2xteGtrZjQybnZSSENnQUxMN3pEdVE3QlJlYVhqTC9qelRKU0ZuYXJSSmdMUXpPUmpZVEFPZ2JQCkxEdXpaRUF3VnBhN2xlWGFuNW10OUpUQ3FpUmpITVRIRlhsSGtKcERWUW1hOHc2ZVNHOXRDOWZpNmJLZ0JXWUpLMTFTMm10ZUFHUjMKWVh6UlVlSWpodHdhNytzU1BibWVYenBueTZCSWVhTVEzak9HQnNQQzMrZDFZWWI0ckxTL3V3NHJLbk5BY3R3NEVyd0RJWTF1YUJYdQpEQXZBUEdmMWpQWTNMcGt3MEhzWHNhenhWNTU0enFUK1pJWjNZKzNxd2pjaEN6WWVKWkVabEk0amRzbzd1NTd5c1VQYTV6REFoOXo1CmJsYnVUNVpvbk0zODN1RUhCaDl5bHJ3dnBnVmpEVWZMeE4zNGxtamY4SHNFcmhoR1MrWWVaVy9lZXdlSzltdE9Xd1d4VG1icklLUlQKTGRqdWJkd2xMTHlSbndack9vVkcyT1lTdzZaNzZXK0lzZjBOamZ4K0VFTkFnRVM3VzhSRU8yUFE3dWN2ZithR2ZTSjhZMWpiZ0NQMgpLR2gvWTVFamdoQm9XSFJ6akw3RVFBYkRVd05uTHlNb25LVnFyQWVGUDVOd3BBbTZhaFJQWkZXd2xvM2VIczFya1I0VnQ4QndTWTdOCnhua3NqaEsyYVdHNkJwMTZpWjV3MlZUd0ZVYStaVGMvM3dNN1lMUS9SOHFjNzVGcGVvaVR5MFdUMEZmV25IK0JacjUzZGlVOGpUT1YKTWxIc2V0QStRUWMveG03SHhYdUt3bG5lWlhCWVVKK0RET0tjQWVqYmN6R3FtQmRDYzFxSmNNL1NuVzNucHBvd3prS2tmV0FnT2gxegpuNGNnRVp4cmdyWEFlRlR3eFhxdGZWOVRMbHV3R2t3M2QyMUJ0dnk1WkFOY1h4dSsvbGs0YXhRaVZTb2VBd3MwN2s2UXRpZEdSaEN1ClZYTllUaHFPYWJyaHRBU3NML2dlTG1rc3ZyN3pxbWtNOEdGWE1Qa1ZDT2p1VXdDTVVrTW92aGp1UGNrcDAwOWI0SkVEODdrY0pZYkgKQ2dzZ1k2QU51MFd2dGVadVNSMDg1TnJuUzZBWUFVYkxKMVh0cjFjQ01OTktNVEJMUGRCMWxwUis3emYzYzlCcFA0alRlQWE0S1l3RgppMEt4ZU9mcGl1NTQ3Zk1jT0w1STlwQWJObFZqTUlGa2ZZVGN6Tjd0SCs0UDI3V0tSWFBKbmRlS2d4RVNrekhReHlSUjNBSFhWKzVHCklyK2RiSUZ1TDhVK0dXWnFHdWFLOUs0RjkrcTdBL29iek01RU8rdkN2d1ZuT1NlWFlUOGhCa240MVdhY1RvdWhIMTZJMHJwbEJPR0kKeHZHaStFQzE1T1dldW1nMURCTGg1VXAzcmpoMGhHOWphT3NyY3ZVRmI4VSt6aWIxT29xMmxsTkdRRWNIVzFaN0JHSFQ0bHRWc3k2SAp1N0x1YUlHN1F5NTlVQXp0ZHVOTEhpK2Q4eW1DWFVHcGlzNWNwTUZidk1ydlpYaGU1ZXFxOE9mRGxIRVdMbjdIYnZ4Y20wM3k3c0JqCmdXem8xdmFoYVF1a3kyQ09yTUo0QlBSeXRwT0RCUmVWL3BLL3RwNC9Lc2pYd3BYM3BXRUlWUkRaN2hvZ0FqUFd3S1h6cGFYYVBtZHUKRVlTSUZPMVZsMmdRdFhYbVdtQWlHQ3NsUkhWck1OU1hJZWNRWDhKREJCbXJqMlM4WUREYjhJTktoQmdNVDI0T2NNQVlNSmM0UnR0bgp0VDI1eWllb2NOWTFCRW8rekxMMmhWajVXT0FOSGRnK0wwUDdxcUhqQ3lkd1VPNE1oZUZxR2VzTU1tSHRGY0ZlOGFFSXB5TUgxczYxCnJuMHdiR3E4ZVJFWngwRjRmUCtCUm9NSEVTM1VmbTVrZkZjaGpTTS82R2FGQmRKdEtHWk02b0JCZmZSbkU0UTZodzJnVFZ3Z0lzYWcKZXNXQnc5am1aNUF3UEk4eTNqZlFzczl5RC9iRm5JRWVRZUhQN1FET0ZmY3JrM3hvU3d0TzU2VHhxR2haVTNoUGJUamlBekQzaHp2cAo0eHNMNnd0MlN6SHpzWlFoSFFOTEtEeUsrbk9CaUNJc3M1eVhRdWJTZmlBQ3IvMFo1N0ZBWU1vSDdOeTc1MVRpVFZzaHA1WUtsNjl4Cjl0aHBPRCtoaE00SzFuVmRwRFpkNEdmYm1NZzFJK0RBRTJObERTTmdLV21zRk9leTNxeUVscVIvN00xRVVhY3cyVVR6dEpmT2VJSFoKQmdyMjFKS0gzRFltZkxTejl2ZTM4VUs5NWdPZU1vYXYzcy9NVTVGRzlza2s4U0hNS3RWZXNiZUdLWXhMVnB6anp0OXhSS2czbExCYgptNHI2ODRKTFVVVEpwN080Sll0QVJjbFVjdWxqb0lPeldtYzJya21GNkJzVEJSQUJtT05NUXNZcHhPb1RRSkd0eUFMWmRVdG5tOXdqClVJblhvS1JrQkR6bmpMMEtVS2U0ZE9sOHN0cWFnQzBDN1NOd3RZM0lPM0pndmlha3ZmVmJhVGEyaEF4ekNvZFordz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJNHhYTGI0VlRUZmw5eVlTeVh0U2prdktESzZ1OGM0UXNqWFVic1MrOGNRK2RJeGFvbkhLTWRtYjI5S25NTG0wM2E1VXJLbjNNQXp2MwpWZWFqeTdTMW8zUDlZUEpMM0kxMVJPQ042aXBKR0t2eGxramFqUmxCSmpsVlZPb1ViT1hDOGxWc25sUzV2MTZnYmRBQ0krRHJnZHE2ClhQamFBbnNGM1pIZG91Q0R1clkzV3kxUTVrSFdpM0FkUXBvZ2tyU3pJNm5jK3lhMERWRjNRTzltNDZ0MUNtV3FGd2dwWDFoVGhRMkEKY3R4MUlUeXFpSncrSnMwWmcwNjl3eUcxOFFrS1hWK1M5UnMrZkdDNmRpbjk2WmNka3pxSlVzQzVHenA0K0dHaG1EclJBY0RDRzFISQpZWHZncW1mZXI1bmtWaUFBa0ROQ09JbGlnZXdZMWRhV3p3aGtFYlpYd2JkYWd0NlRPWE1nQUhQRG94RHVmbUJacGtvSEFncldPL24rCmxvNlBkR1RwNStxNW5reG9xTVBWVTdyOTUyQWg4eUdwYXJhKzhMbWtjQnUyR3o0bDNPY3pyY3VWQjdEUWZlMTduM3FzMmtaWUlWRFoKNkRNcmQ0eFBjY1hDSDg5amZNa1Y4eGFiekNzY2ZCMHF6RmN0RmRlWFB1eFArS3RxbUF0TDhtQlRrSjhGY3U4TjV5UFRYbUNReW00cgpHNS8yUmR0SW1pTUhscEkzVUhkdXdJeG1pYzlJNXBSK0JFcldwRlVZVXVQRnNmYVplYlNKNW85MFNoQ1d6SVNiS0ltUG0wU3dZSjFQCjV0WUJnNWZKQkV2TjFLVzEwb1p2MHVNNVBhclBWKzIwdlczQWROSDFHTmJqY29laEVJWjc0QzZwWWJDTVR5eVhzLzFDWjlGSlVSVCsKVnA3TGoySkw4NDI0M01iMnVMS09Cem1lRi9pa21QTjFYZ1Jyemh2SmpuMmQrN0IzWktLMUZ1RmR2OEx2YU40d28xR1J5L2lvNkt6QgpKdkZpeU9XZnNzQ2N4U09wZ1ZRZmJ6RjZrVWNYNzQ4Y09KdytpUGQxdWtmSjdsRE52akVqdkJQTW5WMHNXc0hCTTdyaEwzRUdzNHd6CkpDUE03NGJLYjVKR2VGMUgrL1JRQmswbG5HK1M4MndZNFNNWXRKVjhqQ0FzVGZLSFc2S2t0ZXJhS2VPc05VYmF5NWRPNHRpNVpWTHIKV2JZTU5LeVpFWmpYcHQwT1Rlb3ZQbXViamF4dXI5eEtOa0dDdXNCTUNUZHh0UlVUUnc2Y3kzeGl2aGh0WTAwY1pRbGZVaGFLWjJ4MApxZHhFcDMxSzcxdW51OXVaNEFYcW9ueE1jTmRwdTh4cy9aQmhGMXZWWERRWEV4WUV2SlB1VFJBVXNzRDFNejhHOW9pRVY5cUQzOWdkCkdoQ1lDWC91WVhNTFhYL1A0elhBbC8yRkMyclEzdmxoQ3NwUzZHYTc0TGJZZGE5dHVnbEdtOHZDSDZCenpubVFSRVorVHErRWFSTzAKOFhZTmUwYktaSlNKa1NKV0NDK21idkNtUUZZK01NMkRadXNTQjR3QU1DUWJwY1hMQ0RJdlkwbFMySTZsTmlUYmtwRVduRlBDeXowWApRNWNwbTREYnpUaGVjVkNTZzI1MGRLY2NTa3QvK0JMYUpTRlJVVXBrWjU3S1VPVk8vVEdQRTNBb20rVEVpZFBDVGRtTVpLUGt5V1ZOCjE1bTJkeGpkZ05uOUtBUFJ6WjJsK0J5TEZrOEFpdXVuVms5Qm9HWlhxbklPL2N3RUJuZ0RYMmFpaEsycDA2S3pMSElyQ1plMUtzdDgKWWhSdGc0SXNnaXlLWUVoZHh0Y3M5eWx4dFUzMFo0RjhGZFVkWlN5Q1BOcm5OQWV5Wm5sa05jdGRMQkVCL2VHVGsySHdpYVZRSWJFTQpweFF4L3VvTUF2M0IxU2U4eU5tSGlTY0xsazFRTkZpR09JWXlLNkpvQk1xelpJRmFlMCtadit5RW1XRWttMmdwbTJMSWJPTXo1cnA0ClF3UjZ0ZHhaY3pPMEh2aTAwNFl2MldJYW5jemJocHdYRllBcVJMYTRTNXM1SHQ1OWVzU1FyeWZ4dVV1MFRlVmhnWm5rSUNCUldQRUUKd09DbUNxb09ndjJ4anpYdFBMSFhhQzFXbDNNRGdWNWtCTmJtd2tjZEI4TU1wUkZpTGtwM1ZzaEZISnRUOERrSXdkNmFXTGd6VXg0dQp3bW1iaHF4T09Zc1NyK21RRXNBSVFrTEozSXJZWFBpNFJEdzE1dHlCTkFuV3ZUeDBJSUJaelVDa0tXc1UybDNkeFpKZUxaTSt2UStWCjVXVkFKMnZYMmNJYmxKMUZHMU14OGRLa2JkcldsLzd5cnJaSE9nZFVYckYwbHhrcGxSTjNsT09yRVNpOVBvRm5sU01IOXJ1QmRyZHMKRWViRkk0c21BSEllRWxSKzJOMmFvNEJXdnF6aHNsbkJDNG50d1FBTWpwSW9KWnVNWEIwc3MvTTAwcjRveFlNRmh2eWxSSXRGZ0ZZWgp2Nk1uWEoram9aMVRZYksrRDdSQmFPWXpWNGVXQk0vQjNOMGZBeUEvRWVEeVhuTjk2YlUvc2gwNm9KOXFMdmxkNnFORVlpbElZSi8xCm5KTUtwdDR2UEk3QXUyOXlIMHVjcHo0bFJGUldScm82WjNqQkFmREdWUm5OaThLa1hrK3pkNWNRcVRmc2NUSXRHaFJtUU1oN2hYd3gKcktjSVRocVorbXhpSVNJRmdHeUlOWGJ6WXdSaEsrS1luRnpGeHFQY09wc3dvWnBQOTA5UG4xc0V5c2R6NHc1bHpRdDViR1ppZDIrTwpoaWpXVVh6TUFlYXY4MWRUcEJKY256SWhxZGh5ZzhBUURPR2pWQkJCTURlNnpSVGJ5dmtjeXlsdXFBTitaQVdibVhMalUxR0YzUUN6CjdSVXNYM25ud3J4OFJ2aStzcEtSWjFIb1lwSTVkcG1RY05pTFRBeVU5bFlpbnlZb056NWJGRTZ1akRQTm9VR2VsUlFPZE1mc3R6NWsKcitBc21GRjRoTC9YbnhmK0htWXdNQ05RcC83TW5qQ0M2QkVGdzJweFFVK3orRGxyVjBjaHJBRkVXVXVaMVFhS2NLNElrUmhGR3FsRAp1Wk10Q0N5OFI4YWR3UUNZaDRBL3pWWllCQWMzaFkvSExKVDN1cU9OS01rOU9OTWNXc1ZpRHpVcDd6TFVMdmtReldudkFHTDloZVFYCnN5c2NibmkxT1EzRVlxVm9LTGJSR0VlRThkZXFYVVNvUld2c25VWVZXOU9KZGN4d3VzeHFnU0Q0T1RiTU82SEkyR3ppWWJUOXdtd0sKYkh0M3I5RlljT0N2ZFBtSDZQcUVkOHk0b05JaTg5ZjF0RFZXSHpnRVJaWk02QXFZbmNjYnJsMk9Uc3cySVRsckFCMUxiWDJYQmNXcApGVzUrNUQ2aGl1R2NRcHlWMFZJbzJDZzNMMlYvbW5LR0JYNkxoakxyV0lxZEU2L0lRbUt1M0R1ajZVNlJ6OE9ZUlp4U0lSY1FaMHFtCnkwS2M1SVB5aEFlMityektxWTAvUVF3NVh3dmttdzUwcWNXbjB4UjhjNVd2cDlteTdzMkJ6TDg0RStYa3hRdGdmSW1kOWdhZUJibFAKMmVXenlaTVE0T1JIV1NKNElvSVU1cWJjL1JZc3FUZ1RRT0ZqMFFzWFFPNEl0eFlGUkJDeVdXWitkcHB3b1paVFY1QVAxRi93VnpuWApWNFZQNE9RT3VXVHQ5d2thL2MwcG1qdDhiNGZNZUE3b2N6VFFWUW9MVEhOT29oVTg0cVErZXdRdUJvYzJBbjRveFVzdTdZTXMzWXpnCmRhLzlGWEM2cE9qa2hyK09xMTAwZlRILzdRcWZTNXoxMkVJMWZBSlpUaElCc0pBQ2k2NHJIRGpCVldTY0Y0WHZpaGNxem1mcER2UUkKZEJsZzNMTnRYazRhbndEVk9TUlFKQ3UrVWxpd25FWWxKRXhPUGg4Z1dETUZWZ2tycEw5eEdsSVRJVEF0L0pwaEpiSUlJYVdaVjhJSwoxRmo1cWgyY0U1UURxcHdUUmxORU9TTlF2RzdKdEdoaDRRWS8rNDBMWVUrbGJwbjVJUlRldmg1eXJTQ0N6TThCdTMvVDVzWEpta1RtCkpRU0FDNTlvMWFXcktVU2M1MVZuRFBUWk5LbFRYRDljZGN5ZERST0JCVjlMejl6UkZZRDhva2h1azEwd2duQi96eWtnQUl1U1VMa1kKcWdJOXJueTFOZHlKS1pJb01RM2QySEJsQmFmbzVFd1NtQWZjTUsvOVUxdEZlT1lxOTJrWXB0T0wvMlB2YkUvVURwM2lHaVN5d2czeQpmQWJZOElrbUJ1YXpnRjZaazlFTmJBNnZHTXVPUzIrcTFlT3prOHZnM09MNm5yNm9xQXJKS3p6T0NRSmM2bms2S2ZLVllweEdqakswCjFQSUZaT1VQb0J4NWt6VmNBalE4RmFjc0pCUnJBWFNBOWhja25VaWtvdjd1c2JzMGhEaDk3bXE2VWVZUkpEeWJwZFBsaEErMnhUdVAKR2RlZjZEN1RsZHBKUUFLTFRLTThZa1hCYm5GMmVDQlFlL3UxTXczSXlENUhPZEVQcHVwek5wbzg5UmZldFQzTjF2bXM1RjB6bkFpVwp3TjVqVlBnekdDZlFEdFpqQXZJWmxqYWpDSUdjYnN5N2dVUkFPczRCWk0yZnZ0OUwzSnllT21PZU05aUg2ZWFhVWFYQk51dkNSeENvCnh1SnkvQkV0dkdsUzhCbVhuN0h6MFQ3elQzalN2NmpHbmg4NjR2cUQ2N0lqcWpUZUlzT3pKQ1FlZENlT21mU0haOW9tN2xnc2VVY3YKOWZmSTNEVVpCRXAyNFpJZVVGOTh5V0xtSFltUWZvVURCOGFCbkpwbnhwV1FNMmU0RHVsZ0tkWGp1UWZQU0VVc295ZllDbmF4VCtNNAo4bSt3VGVTTzREZlkwb0szWE9tQ3BNZHlSMUNpZFFmVUxLYkkyblhBQ0xSUDJzSzN0RXg0R3BMdllNeEtYc0hQc2sya1B1Qm4yYlJYCk1WS2ZVQlBBSVJrWDU2ZENvRTlBUkM2S21YaTV3ZFRlR0ozWUhCRHNjM2R4Vm5vQyt1eE1ibnJPVDNNUVV2aWxMbUNjRVBpVUFESFEKNXpOZ1BXRzZYMGZoNWFLeHZHejhjQkZmR1VhdzVyeHVRWkhtQ0V6MG9mbnNWeG1JbUphckh4SW9zQjBvRFJkZFFyNy9HWG5oN01LYgp5dnQwN3NEK1lqMWZMcE9adjdxUk5WekVrc3lpYS9uQlhJSFZNMVpPcFl0N3dLYUt4QVBkdmFDcDlxUG5aOXlwT0xjaHMrSGxKZW5CCkNiK2NGTXJ5YXhiemt5R3l1eVAzQVpzSWpFdldaNzlUTTdOYlIvNXB6cEE2bFk3Ri9EUW5CemI0WFZWbTNpU1grU3VuOHpsWkdNNlYKeFR1NHpDUEZrNU41VEhlQTN5Y2lOWXdQc2tiNHQyUHp3ajgyNHRPZ0U5Z1hkdStTRUpCbk5SK0ZreXpLZEJFZUg1aHFMVHhoTzFIYwpkOE1uMTZVem5lK0dUMnFnWE5aT0JHWWgzWWd4ODdyQkRZYUUxM1NUYUVtRG1UOHArL2VXTXA5NHlyOEdONFUxdkFMRjkwZHc1WXZ3CjhpZm5PblZKc3Z6empab2xxUmFDVTM4WTVWOEZkamxCcC9HeUNFeHNXaVA3QTZwKzV3NmNwUDZwME55L1laZjdqSytjMUIweGUxSkMKdXRMNVBRN1puL2o1QXhFbmx1ZUhnS1k3eGoyV0RjbUdaSm53VzZ4Q2VEZVQyN2c1RFVBUkxJWjgzUnZUc0hDZ1dlS3lEU0lDeFc4bwpKb2tJdC9qVGNJT04zL1FVM2lRVll2dW0raFUyR1JPaXgvaE5XN3h6WDdEN2g1MXRWSlNOLzduMk1CL1BRUWxOZUl2SWZEUWxSNTRnCnNQQldlbmNVbTJxZlpYWnExN2RpNitJNVF3VjcwQ2djNzhpQjB4RGVKMU8rM3loOVVBajNkd290TjZkdDFLamQ2WXgvMnhkVHhiR0cKRVI2ZVFMRGdrNzcwcjM5TUkyRzVhYUlRQXUySk1UNjd0YlladFRucG5uZXhrU0ovTkJQRmtYL2pMbWliZEgyQW4vZ0tGOWpDeFExTQovNXNHejdUZ21HS0tjN2VvMDR5QkUzaDV6eXA4dm1wbjVqOTM0RlJ6bUFiN25URzRVZm43SjRYbTRFWmp2SldlRFZCWU5IaDkrYlhBCndsc0JkY2hyUE5VQjFrdVR5TjFDRjRiT0hUZzhSb3ZCcHh6L0VSNEpwY2pnbzlrNGp1Z3grYUoyOTlQYXl4L0hQczE3WUY0ajhPVGIKZnUvNW9OTWJkWHF2Nm5VTHBuZm40eC8ydnIzQVgwUmlmenIrNGZHalRoZlE3TjN6SDJ0ZjdOMTcrZlRvMjM2N3hJK0huZGFvMCs4MQpCKzhXL1hDL2R2Zlg4MjRQZnFwRHR3YWQwOHRST2Z5MDl2bmV2UWVEUVhPaVJPdDFwOXNlbEQzOFhkYnVQZW1Od20vNHoramRSWW0vCjNRVk41TTZudFh2Zjl6b3RBQjhEM3Q2cjhhSnZtOTFMVy9hWFRudjBlbkhoWHZPY3lrSlhYT25QMTVtaTEyWG4xZXRSWlpLNCtJM1QKMUQvOXVXeU45dnVYdlRiMGI3Ly9hMVVDejJpK1FkSFJzREtWWTNWdW5OUUhUMDRlZEM5ZU4wOUVWUm83YlNpNWhDWXNjK09rVkorSAo3eW9QenJ1MXBtUEp2SXpvK0pYL0x1N3V1b2pKMGVYZzlMSmI5bHBsVlZiWXFoVzV3ZTNjOU1EQ0VhOHFQYWZOWWZsb1VQN25FcGhRCmZicE8xTHB4Q21WVjhucVg1ODlhbytiYnNycWNqS3ZjT0dHOS92R29NMm90Mlk0RGZVTXEvVjJudXdLQlkzVnVuRUpjY2xXcEc1VEQKeTI3MWZaeUxWNUZBYzdvdUZuUjk5bTRVYmNybGR4WEZTZWp6QXZhdjhiaDBla3NXWUx4Rlk5a2JuMldkWGxWYStoZmxvRG5xRHlvVApGQ3JjT0ZYSC9jdEJxM3c4YUY2ODdyU3FEOVlLWTNXTGkrZWdmMzdSSDNaR0s2eWQ2K2dIYWNsVnUzRHZzRHlyM2Q4ZEFkZVBvdDBSCmNBYVZhM0lFVkxzajRBeENka2ZBV3hHVFo0TW1hUHZkYi91ZDRaWWRBaXRiV2piekRGaFppdXpPZ0xzejRPNE11QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJT3dQdXpvQzdNK0RIZGdaVVczY0dYSUdpVFRrRHdzRm92M3hiZG85Zk45djlYN2JBUTFhWDIzSkFXb1dTclQwaVZkYTBoNlAyWWZtMgowOFFPcmFDS3hwVnVmSVJQdTVkTFJQMEgwRVZ2UlVjZ1k4dTJhUWlQbTVmRFlhZloyMTg2Yk91b1lGZGVTZTNxWXJHOTFvZnZkbldwCjJQNzFGZ2pwbjUwTnk5SHkyYlI1UW1BVndiWXBxLzhaamRibXJmc3VhcFlZWGRqcWQvdURMMzU1dmZTSUUyK3E3N3JWclkydTlJM1AKdHNvQko4UEx3Vm16VlI2M21xdFFOVmJweG9rYlhwU3RaNWRMNXQxT1FveEppQnYzRFZhZWdEQ1lsOTNtNE9HdkYvMWUyYXMrVHRNVgpiNTdLVllrODZQZUdvK1lWaUF3Vk4rbWtBc2MxK0U5Vkp2MVdtU3UvM2NiUlU2eEN5NW9mby9VS3BIendjL1MxcUNMUCs1M2U2R2dWCkE5UDEyQ3JMWTdkaWo1eU9zWG5hMFpXT3F6dnZ3MjE0SDdaVUUxcVJyRTA1TGwzQm5iSXVNcUh5YnZGbWlVNFVqUVVXdmZrNGpNcUUKTExHcHhJU29kZFk5MzZUVkNVblhtcERxZTh5YjI5aGlWcFphNjc1bk5nZWQwZXZ6Y2xUZHNiMUplMmUzTTNyZTdDdzdpMjNlNXJtTApTS2k0aFc3T09YcDFxL2ltak9mVGN2Q3FSRTV1bmtxMHF2elk0aUc1dm43c0FvOCtqSTRsZG9GSDZ4OTQ5SEZkUGpubzk3djdnN0w4CnJiTHJiWDBEckZhWWpPdHVHYTVNeU5iR1Y3VTczV1oxZi9BbUhYa3EyM00zNjZ4enZaRlY2enBHSkEwckVuSWJRbEUwS3FlRkdEVGIKbmN2cVd4Y1h2ejBWdVQrNGVOM3Y5bDlWRnVicmMyelpYdWwyL1hlWTFsWVVyTGxNcTM2TGFTZlRkakx0S3ZyM3RnVHlubGIyaG15SwpFRnZoQnVPYUM3SFZMZ0t0SXNWdWFjbHZhdmp1OXVZSXFMeTdiR2FPZ01wUnlic2NBZE1FM202T2dOUHFpcyttYkV6VjVmbTY3MHlWCngyWlRkcVpOenRxd0pOd21FZ0tyM2JtNHBjc1dLMHl1dFE5b09hMDhOanNodHI1anMrNUdnZ2VWWFVFSHI1dTlYdGs5THJ0bGF4VWoKMjNURkd5ZnlSV1UzMFZXSm5LNTRhOXZSWVdkNDBXMjJ5dk95TjNyYXZOaThQZW04Q2FncXU1TTM0cXhVNC8vV3BqNktzWTlWcWFaUAoxZFZ4TG43emdyS3lzV3RqTnJIcW9uL2RON0hWY21sdWdDWitnRGVrbjFZUUgrc285cXJmejl6RVRDbVZyU2tiSXdlcXI1NTFsd09WCngrWWE1TUM2ckw2emxZSzd6anJkN2lyQmE5M2JVRHFXcUFlUmZSWWZwYXB1bDdXbGIvN0dTbVd4RnlqenpYOUwvYTlJNFVTdFd6RFEKOWlyUHhHYXJkWGwrdVR4S0lpWXZxbkx6VnZYS3M3SmRQVW1UTFh2anRBeEtPbWhWSHFwMnV6UHF2RjFob0h5RjliM25kamJvbjFlWApoRlI0ZlQwNW8zNzFrMlQvRmdocGRuOXB2cXU4Z0VBMUdqVUhLNmxTdHZ3dDNHN3JsYzNLMTRWYXpXN3JhYi82bFkrb3dpMmRUSnE5Cnp2a0tFdnFhN3Foc2R2cTdlcjR0WVRPdFhkak11aDZGcWcvTnBwaEVkbUV6OHpidzJ3cWIyZmIzRmF0blU5c0Z6c3l5MDkxbTRFeHIKNndKblZwRG82NzQzN1FKbjFtaC9xcXlOYmtiZ3pBcVRhKzBEWjFwYkZ6aXpSVUpzRnppekM1elpCYzdzQW1ldUdEZ2pQcGJBbWRiVwpCYzZzSVByWGZSUGJCYzZzazlqYjZzQ1oxdFlGenF5d2V0WmREdHhtNE13bXVJZzJKL3huaGFGY2RWTGUwbEJ1Y0xMQ0ZRTFNkb094CnVYazlObWNzcnE4ZnQ5dUhyVWtaK2VESnlTR2xDanBaemI2MFpVR3MyNXN1NldieVJLL3I1ZHVQSVQzUFRyNVZrbTltSjk5MjhtMUQKNUZ2bHVicVRienY1OW5BQWdJOWJmU3VSQlR2cHRpSFNiYWU5N2FUYml0THRvMWJlZHRKdGs2VGJUbmZiU2JmSzBpMTJHNTJzNWh6ZgpNaUZYbWZnUDRvdmVLQy9oYmhHdHNJaXlqM2tSVlNaK3Q0aDJpeWkrNTUzVWRPVkFRRXYyaXhWaUFhTWFONjZPZlZ5dmJUM3YvRnAyCm4zZWI3MDVXdTQrNVpYSndVSjczbDZXTDJPV2t3WTdjVms2YWlrSmtsNUJtTVhtM21aQkdWSitUdTR3MHQ1aVJabHR6bnd3dk1QdEoKVmJyZUsvZkpEVlBXNmJYTHMwNXY2ZnZYOGFoZGxNM1I0UXJMTEtweDg1S2pKdTdMcENZMC9KdlU0UC8zNFRQOHZROC8xSzc5UHNxdApIRnRXVG1TekxxclV6UjRwYnpwZWRvVzMxamZsbHNBV1BwYTV5akI5cEJjR05zTnpzKzRYNEpjdGhNMTBzN1g2NXhmOUlXZ1R6eTZYCnlLL05rM1lyaVlZTmliTS80UEhhUExsUTJZajRab2w5S2hvTExIcno5cGJLaEN4eFhNV0VxTnZRdFNzVHNpUXNKeVlrWFd0Q3F1OHkKYjI1ams3bVNncmJ1TzJkejBCbTlQaTlIMWJXQlRkMUJ0eTRINVZYVWc0OXhLOTBjOThlVnB1dW1ET251RnVMTy83enpQeThpZEMzOAp6NnZsWE56NW4zZis1NTMvK2NPVHVmTS9VOUdkLzNubmYvN2dkTjNnMnhzNy8vT0hWemZSQXkyVCt5dXBuanVmODg3bi9MN0U3WHpPClZ6TTNyUEV3N1h6T2ErVUFhSGZPemk2SDVVRy9CNnBCci9yeW1hcDM0NVB1WGRudDluK3BTbWUzOCtyMUNINnZ0ekFKYVdVeUo2dmQKL1BaYldieGZEczVBS1Q1ZTdTR0FzVXJyNjZheXdubzEyc2JxM0RocGJuMXMyK1oxclNFRTZ6MUVXL3dzOGM0RXQrNG11RlcycjUwZApibzN0Y0x1WGlYZDJ1SjBkYm1lSHUrSng1LzZyUVZuMjdvTWFWdDRIaWp1dit2ZmZkdnJkY25SL1VMYnY5d2ZOM2pJLys4NUFkOU01CmJpcGJUTXN1ZkZuSlBCZlZ1UG10TEs5TVdQTzN6dm5sYU1tTGxySGc1L0szWnYwNTdKQlo0d2pWcmx1T25UbTB4NVFqcHdGdTNnSUEKeWJUdFZocXgxV2FhNFVYWkFvVjVzTHNTc2RiMmpCVW1vUnZRaDc5ZXdGbHJCYXZ2ZE1WYmlHUllsY3FWYmR2VEZYZkduSjB4WjJmTQoyUmx6ZHNhY25URm5aOHpaR1hNK0FIMW91ckhHSEdmWkladk96cGl6M21mWm5USG5mWXc1dDZGbmJWdGMwaHBacG83ZE9XbHpUVk5iCmViMTRPeE56YkxFUjZncWtiY29GMUExT3oxRTloOEl1UGNlNkViTG02VG1xRTdMbTZUbFdEYUZiKzcxenUxTnpkRHVqNTgzT01rdjQKNW0yZ04vTTJ6bTRMdlQ0NXQ5dEMxMDJwV2ZNdGRHc3lYRjFKK2Q5dG8rdXdqVzVkZHF0VjlZT1BjUXZkbkVDQWxhZnBwZ3puTHF2Vgo5bVcxK3JoU1B4Mi9icmI3djN6Yzd3NVZUbnExUzF5d0h0ckJUU1F1dUtVZFpiTXYrMWQrRHJSZCtUVmFLbnJqTTZ3NklVdTJoNWlRClgyK0JrUDdaMmJBYzRXd2FsTzJWVnN5bUNJTnR6Q1gvakVidG96b2pYSDJpYnNxZ1h1R3dzQzZEczlWbTdkMGhidnNPY1VJbGQ2ck8KMDE4NjdSV0N5RnpwbXpjenA5VXBlbDJ1RXBQbGk5Kzhjdkl4SHJXdkljWHlEZE5TRjdyeVZLeXU1OStHbXI4S0pkVVYvVjgzeS94aApkdWFQelRyeDdNd2YvZlZVay9OdE1YOVVKMlJuL3RpWlAzYm1qNTM1WTJmKytJakdaV2YrV0hQengwZDJzQjQxVjRqdjJrWVA5dG1nCjJSbzF1OS8yTzlWRDRHM2xpbVBNTGQxMHRHdWpjaWFaMCthd2ZEUW8vM05aOWxyVnRldUpXamR2MWFzY3o5dTdQSDhHWS94MmhhdlYKY1pVYnA2elhQeDUxUnEwbGh0WFl1SUNsdit0MFZ5QndyTTZOVTlpcWJNbmJsTE5FNi9vQzlOWjJiSGJKdERjby85SUtRbjZYcm1neAplYmVacm1pWHJXaUZnYnE5YkVVcmFGOW5nLzU1ZGVGQmhXK0JuTW92VkkzNjFUWGovaTJRc3NzalJadjhMby9VL0R4U3QySk5Xam1iCjByVllrcjY3SEp4ZWRrRkYyRmhUNHk0UHpBWmN2bHZoakxFaHB1QXIzRTdibVdFWFduZTJMZ3B0QllwMlVXZ3pxTHgxWTNuWUhFK1cKWEt6ZmdFaTA2cE54dmVQUXF0T3h0VkZvbzRwSzI2WTVNSkl0OTJCVURoWGFPVENtQ2J4ZEJ3WXV1V3QzWWR5U0tyczdBKzdPZ0d1MgpoSGFud0pYNnNUc0Y3azZCTjBqVFIzc0tyS3lmN2s2QmEwUEgxcDRDdHplUXJYSkdpYzA4QmxZbWIzY00zQjBEZDhmQTNURndLUzI3ClkrRHVHTGhWeDBDOWRjZkFGU2phSFFOblVIbnJ4OEFmKy8zMnEwR3p1bEJlMnpOZ1hXekxLWEFWU3JiMkhGajVPTEhMU2JFZVYwZHUKNW9yc0dnL1VwcnphdDlrWk5uWUpSaGNSc3N1d2NldFNZTTBsV3I5Q1pvM05rMmtmTEYvSVRWdTd1NkIvMTF2OWJuL3d4V20zMlhwegp2MlpCL1l0bXF6TjY5OFVLWnVQaDZGMjN1aG5jbGI3NW1HbWtkZHNFeEVwRWJjcWFlb1FUY2ZPVzFQdmswZG5aVG0vRGRycjlDc1JxCjhtSE5OWWdoWlRFOTJFYVJ0OEh2RzFaTzNPRGVTVDNvOStqeDl1cG5pOGw2Tno3eGZubTl3dVhKcm5zSXZsNWg3VVZVVGxhN2NTSXIKQitNTUx3ZG56Vlo1M0dxdW92V05WYnA1ZjhGcWduMDEyc2JxM0RocEt6NC92Q2s3MXpZZGZWZDlJWHA3ODhLWXlrbW55aTU4V2NtMApIdFc0ZWZtU1ZoYWZ6ZDg2NTVjcnVGaDkrUnNuaXJhazI4eG1kQzJxMW1HSDFJaWpWWnpDMTVRdDROREtoU08zOVcrZTdyZFRqRFpkCk1ickN5OHM3RGVJVzlwZksreVlQNk1OZkwvcTljb1ZqMW5URjlkWFN1YThybnlXbksrNjBwNTMyZEgzYTAwNTV1amJsNmRndDVjM1YKbm5aUjFodmpLZGhpTmVrS3BHMXhIUG02eUliS3F0Q2JKU1dqc2NDaU4zLzlyREloUytJTllrTFVXaE95SkxsUlRFaTYxb1JVMzJ2ZQozTVpXczZwWmRlMzN6dWFnTTNwOVhxN3dvc1FtN2FIZHp1aDVzN1Bzc0xaNUcraFdQOUd6d1Z0b2RUbTMyMExYVGFsWjh5MjBPaUZyCnZvVmVTZm5mYmFPN2JmVDI2Zm9ZZDlETk1WWHZIcFZjWTgxb1c1ZmFocjRudVM3VFlsc3pJRzE5SXR6ZFUzNmJtd0twYXBxZ3pWUG8KcnVUZTJveU5acE56TzUwM0FWWGwzQ0tiSU45RkxYSC9uZlhKUTZxU1RKK3Fpdzh1ZnVOa1A0YXF3K1d4WnBzbk9GWVhpWnNpTitqdQowdE1LQzNBZEJjZFdKMGJaNWt1QVc3d1JiM1pLa1hybGM4bTY1eFNwYjAxU2tXZGJmeWQ0bTQxeW01cU80K3F6YnYzZE1kc1pFWWhtCmZSeXY3MjRpaGZHNm55dzJSVHhzY0RTRHFQNGk5aWJxMy9GeXFuemxjRlBXMDFWa3hhWXNxYzNXd0hGa1hwNlZnMGVkd2RhWlVkWkIKaXEvTE9JK2FwOVg1c0FrMlQxbXI3UE1oMm45WXphZzVWdWYyRW9GZDlsb3ZOaytvYk4xa2EyUzFwUFp4VExmSHUrbDIrOU5OZkN6QwpiZitXQTFYb1BJU1h2YjhiTkh2RHMrcXZYYXpQN0w5aTlQM09hSEpiUmhNN1lOdW9jRi9sTUxFcHg3d050cHhRTk42RGJ2ZmFwOXZtCkhJZXV0ZzQzWmE1dWFCam9kZlRoS2s5WTNYbndSQ1FuRDN0dC81UVZnalJDVHI3dDk1NERDc3JIVkxmZy9mSlZweGYvc1BmdEJlRlEKOXFmamQrZW4vZTdlM1FmdGR1MVI4MjEvZ0VKa0w2azlnUCsvL0dYdkV2NmIxSjd0SlExVFpIQ3FiUWlWcTh6RzdEU0VTYkpjd1FlVApKVHJQNFVPZUc1bnAyc3ZtWG9qeGVma092bndESDM0RzBDODFrZFNlMXY3NVUxSnJZd3N2OXVwSlF5a2o4NkltUlNQWFN0Zk85K3JDCk5FU1JLQ2pjRUZxb1dsMnFoaTdTdklhbHBjaWhqYnJVV0RHdDFZdUdFYmt3dFlPOUFCT3lZZklrcXgzdFlkVk1GMUJWSm8wa1VRVjkKa0Zyamg3U1I1QWJRaTZ5Ukdwa1NKRFdGcUxXb0R6cHpNSWRVTjNKcHBJVkFWd2tpbE5JQmd2V1NScEZMRlpVcUdsS1pCTnVURFNscQpkVUNUNU5pK3lCdENxQlI3N3JsUUY2SUJ6UnJvdW1vVXd1aFE3R2d2YjZTSTBPS0JocElpU1VORFFnRmRjY3V0UFFBVktiYnB5MmdZCnJWd0dxb0JNWlFvWmt5NEsrSVRNWnY3QTM5eGtXV0FoRG9kT1plRHp3WjRIOFhBY0VVZ1ZORUxhQ0MycFdxb05BUklGTXdZQkVzZW0KZ000ZzB3aFBrZVRZVmlOTnRDRThSYU1vbElsQktjNjFGRkRqNE9aWlVVdEZJODBLb0QwRHBoaVRJNEQ3azBvcHNZc2VCTDB1OGxSWgpQREI1TGNzSWhHeVJCQ2pzTU1EVUVCb0hENHFtS1l3YThBZG1weWdNZ1ZRS0k0VFRRSnZNQXNaR2dnR3RQZWhYWWxJZFFDbndRbVRZClVvYWpxbXZSSElBQk5pS2xpYUdnUHlyblVraGZrU1JwRWZDRVNSZ2F3OGxMREk1S1FRZUV5RUtuY1ZvbE1Lc2l3Zz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJY0sya1F1cEFmUjE1WnFRT0RLcW5NcXd4Z2tBblBZeVpEZXNPYWhwZ2dXakl4Q1FXZ1lHeFF0NklBbm5qeWVVK3d1QkRZYTJ6bXN5aApycW1waGxFNVRDQnBZTVVBd3cwc0NLVjFEWlo1a2lvSkZUd0VhRWhTYkJmNkM0c2lqU0N3SGtWUlNJbWdYQUE2WFA0UzBjS2NTZU9PCnNBUTYyRHZiKzM2UGhGZDd6OVR1ZmxwNytlUGVuWk5ab2dxZ1Z4UldVSE9HdUVMbzFRU1c3Y2xWUkJiV3ZJclFpamtTaWEwN0o5T0MKNjg3SnlxTHJ6c21WaEJkVXU0cjR1bk15UTRCWjRNb2lqS3BOQ2pFQVRvdXhPeWRYRW1SUWJWcVVFYTdWaFJudzZ5cmk3TTdKRlFVYQpUSm9yaVRRN3ZhOGcxT3lLdW9wWWc1b3pCQnRDcnlEYVlQeFhGVzUzVHFiRkd3elhsSUM3YzNJVkVYZm5wQWZhNjkwSHZYNnZWa2hECk1zNHBlMUM5S05JQ1dDMThzRGJvZElRTW1BYnp4ZVFGU2orR3dKQVdLcVhWRDNJQVZwU1lCZUo2UjZST3dtUkpaNEZ3a1Jja05MamUKTklSNGxwRnU0SG93RFFtMWFCQnhlS1lnb2ZsSjJvNW1id0hUTEFpd2lHSVlwV2syQkdCb0JJZHVpaFVSTUhRNTFKNEZDK1NIL3N5Qwp4WFduMlJKZ2NXZW1XUk5OSGVMTDl3Q0JRK05vN0d4TWdnWFdURkZUTU9FTlNFT2xZZlZSZTFKSmU0aTQ5NkpzZG0zSU5WUUFsRTlFCitoeE9vK1dnVnh4M096YnpLcHhhSGc4NjdiK1ZGRHQ1NTBTN00xZFUrQVdjWllhakFjVkhmT2VPWDhERzJyMzlmcjg3VnZKaEQrM0wKank4N2JYdllCZnFtMFdHV3pjRW9JSUpqMThsZXdiUEFuOERzMlduR2FXci9jalRxOTA3NmIrRjRGeCttL25RSmZEdDBpMnpPQVVtTgpuNCtTMnFzOWtCaEpJbkNQeFRXWDB3YzgyZmhQSUdhay9iMXVkd3FaNUxnbjRaZk1LbWcxcTVUSkd2MkkyR3dsM1BrTGxOQXdNQUpWCk1QcDd4RzNTWnl3SnV3Wjg1dnE2UmhoQnA2WVdqdmE0MlFKT2g2NDRkaWZxT1NwVkNSQ2ZDcWg0am45Z1dtall6VUVvRzQyYmVjTEYKNFpQdFNPTElkQit3WUlZOWdCNG5FcVU0NFRDNDZSQmFwRlRZRHRFSC9GWExyT2FyZ3FKVHMzeHpUZFFKdGU5bVlvOGIxQi84eGtpdwpDWXY1d0JKd3RMZC9pbXZnK3g2ZTBOdTFWNE5tdTFQQ05Fby9wVUd0RnpqQUlycnRJbXI3ci9DY2wrQi9VS21CM2hnOE5CTUFtc3NGClNQTmNBRWRlbm84VjFETUxTdEJiOWxzVk1lNVh3UWpuZWNTSXc3Uy92L2VuNzJIR3czYWl3elNOMkhRZU04OTlxTS84RkhOK2JFeVkKbjNYSDBMSGhuQnByT3dzT3duU1kvc3R6cDdzWFRha3d6OXdNNFFrU0QyMDg1QkdSclhtRExDc1BNaFFDVFcrTTB6a09pWmdjNUhSbQpRZFRlSmdaNVBzYjlLaGlGRWRFZ3o1SGNxZ1pUUVlEdWVRTkNXdHlXa0Q0WWxPM09xSGJRSExUbkN1bHJNM3RKUStzVlJzeDlza3RGCkZuVHdrMVowQ3diUUYrTUVPUjYxVWxMNTdUZjRBcnFhKzBybkZ2cmdrYmtQaUJUYWtxaFoycjhrNnZpM3FJcEZZMlY3d0Q3V3N1dVEKKzhCWW92NDdxbGpvZ3hZQXhjL3Bid1pyRGRRTjZmNktBZ3ZEdndmRUMvaUFyQWcvMXFNNmRZc0hTeFp4MzZhK1VkL09YREhiNlhQMwp6VmhXMCtIQkllVVAxSnFodjhTak9uVW0vam11NTdBZDdFV05ISTAxaVYwQU1UcFhQUUxOcUFhYXZCRGJyQXNkTmtmbG8wN1piVStyClEzYUphV0VVTFRLVkNnWDZaZlFoeWJRQzdSYktKSEJDbmZXQjFoeXN3R3FyTGlQVm8yN3NmZ01EakpNaDR6OFpEUmdneTNScWNJRnIKYVpUMmQxVkJNMDV4bjB3YVdacEpQYjNlNFF5SDJMTWFUYkhNYmpPRy85Z1pDZHJkSHU2K3RodlVNUDVGclZyN1AyYStlcUVYN2p6dwpBKzVjdWhhMkFSRDRDcVIrbHVHR2srQjVSTTh1a2NQQkVuZUdoVGoyRitPQTAwYllXNGllYzA4ZS9sV1dQaFdvdlpJV3RhQ0xaaW1aCnlWSXl6Vkl5ZFVUbUpWR0dtbmtkTFJKSUthcWpqbUwrSytiVGFvcEFySnBKYkk1VEF2K0tMTVhtbFNNU1ZhcjRoMXc1eXFZcjdNK3MKWU9MeGdsK2twVUphSWhMYmQvZEhMcWFnanROblpTSWlmVVdrRThSa2k0aFpVSEdTS0cySjBwWW9OeUR1ejRJcFNFU2w3MGVTR1M5UQpKRlZKTW90SVN0MTBFMjY2Q1RmTjB2RDNRMDIzSko1dTJUZzhGOVBVSlBGc215Zy9TWVMwTkVoTFFtSjc3djU4d01tV3pGc3h5WndWCms4eGJNYk9Jc081S083bEV6YkhmL2ZsZ2t5dFp0bDZTT2VzbFdiWmVwa2hLN055U2RncEpPNk1TLytjRHpTdVR4WU9pSnVENUZDRmMKZm45VytZbitTK28rYWJjMG14TDM3NGViVXVPOXo4YmhNMWJGZU8remhiMG5xeXJOSEZtelBMZi9mcWk1Tk43M2FIYmJ6azh2aC9ITwpUMVlZNnozSm4vTTlKMzYwLzBNV1Yvdm5ROHdkTllmN2FnNzMxUnp1cStuKzQ5elJORk0welpyVS9mc0I1NDZhTS9QVm5KbXY1c3o4CkdiM1gxSHVyUTFxZTIzOC8yTnk1TnM1Lzd3OFUvdkNkTkFvcGhmQXVDUFNzQ0kxbmNGQzdCVVdPS0s5MnhTdkZxMkRDcXZPQWpYYVoKYzk1WGVKY1IvRWZ5UVUzVUhseFEwNnJtbFhvOFFyaElsWXoxKzFpeGQrcitIUDVtaS9YMUNha3NzbkZkTTdWellsS3BJTFYwUnRGQwpXZFcyR3RaSmpXTWVWcU9YMjR0U3FDd1MvaWR0V0p2aHRoNW9CLzJMZHYrWEdlWjlzaDBsT0lsV3NQSUx0dktUcVZPamQwaVRsL3A4CkNuTGtJWFhUVVBRaEF1WGt0VlZrN3RRWnVhaVZxKzVLTU9CZ0Q3M0xOcmFnOElpOE5kVERNQ3dBaXVtQU8wQk13TVd3ME0xRklJK0sKbXl0Y0dkOG5CbEI0QnpWU2VEUk1IRU9ZZXNZNnlUSTBRTTJjc25kUmFHZEpWcGhQUTV6ZS92NkRWdXZ5L0VWLzVHL2FRdVc0WnUzZQp0LzNSaTdMVkg3UmhuZHQ1U0hvNC9ERXBuS0ZOYW5BUnBVVmlwaGJBd1lNbmo1MWsrTzZzUHpqblhFTTBDMkdPdHZ1bjVjbURKOFVKCmRQZDQ5SzVibm9TbW83bUtMYjVzbzhpUlZ6ZzZ3eXBtZnliSlJ1WjY3cWNkam5haUMrTkJNQ0ZzbWF4aDZBY1BDR3oyb0docUJoaFcKcENHM2lPR0RtMkYrSHVaK1Bwa3dvUmtSMXBOMkhpbzMzQVhYUjhUNTVMSTQyTXVuMWc1RG1BaEd5bFFhUDVVOFRaTzhxV2F2V0RBagpyTlFYTkV1RHFQVWZKSm5walNBUFJDNjBYWWkwQVdDRUM0Yk16S3VVQWxraXlhTmF1Qk9zMnRKK2haWnlNZDZJMnhwMnEyek9LdnZUCm5FMXp4NXNmcHp5TWs2djJmRzlxYVllRjdCZi9oSENZRWlEeGZoZUV5a3pZdElTYWxHRlRjbTZKN0l1MndBVWdMMW1uWk8ra0RKb3AKbGlabFZ4Q1pESm1XZnBNYlpSVmY1M0xSbHMwVE9GYWpsRTdnbUNRU2JXS3V3S0ZLS21IUnhyVkl0SzNZMG42Rmx2Smt2SkdQVXJRdApkbTZQTGQ5d2JrTlBxY3JSaTJOU2dUNVJBNmMxc3AzclBEVUNmd2ovbjNhVTBuR09GNUZ3aStoOEwrV1ZMUHk2U3ZCNFFlVzZNNm9jCnpWZjMzRkFueTBhTE9EVFBMOTdJc3d6RC9OeWZCUDFCN3M4V2U4b2ZkYnJuRXdjZGY5aFpjTWFaOUw3aElVZWtHUHdLekVNbGcxekMKY0VadHlCeGozUnpvS0lEd0EwWERIdm1LTTBDaDRoa2R2RENFTXlseVVsT2xrZVR5WXhDS1BTV290bWprR0VJOURlRnFjN1U5NVZhSQptcmxDWk43QStBQ01PaFUyK01nMHNqU25HQ1ZvQUlPSDRRQU8vUkVKbXRBSzNBSmtnWkpRWVNjeFVEblZqVlFxT2JPcVRGRFlwN0tXClM0bEIxWVpzZGhnSW5hTXpYamVVelBTY1ZnM00zRUpyYkRWdEpLbWt3S0Nza1JsUjBPYWxSWnJrczZ2cUhCRkxNalRqRm9JMUsvVlgKYUJBR1Jsc1BZMUlBZjZHN2ozeU1VUkFoYzliY3ZhZk40UnY2NUUvOFQzcHc4aDZWN1FsRHdFRzNjM0hSd2JkbXg4Q0huU0d1RVZmNgo1VmZ3enlYOG42NUh3Y3d1ditBdk5PZGZOSWQwcCtvRU9nVlM4akhKNy9KdGgyNHh2NnU5L0JZQS8vVERYU2U3Ty8zekU4Wk5wR2h6CmZ2bDZmaGtFMlhMMmYzazBmMVNON0U3WW5UdlVsOFBtcVBrRkxDT1o3YjE4OG4vKzY3My84Ly8rZCs1Ly9oLytQdi9uLy8zZm0vbDkKVHNkM3YrOSsvNjkxbUorTGYxKzJ2dDd2UHlnV1lKdEdvWUJ5N0s4c3RnRG1oZGEzYzBLTmd1WlExQjVkL3ZiYnV4cEsxVWdidUhPQwo0dGZyQkNjdlA3TUt6R0Ewb1hzY2RYcHZXSmJlSjRRbkU2aXNNSk1vUFpmcEEyUFI5ZDlQYWhJVHNmY290UDkwU1gxNWNFRUMvaG45Cit3cEJVMm9GM2hlWlVpd2lZS1JIaE9vemdYSDFNMEl4cFY1RXdLQk8yT2o4Y1JVandJS1NjZWNFMUF5a2FsVkZBM1M5SzZzYW9NdGUKWGRuQWl5bFhWamZ3NXRCVkZZNkt2WjZwY3R3NWVVVFRoYzV6WkpPWnAzRHc5WGZRQVI0OHFUMjRIUFZyZG9GMWZpdkQ2V0hxelBYcwpkRmdPM3BidEU5RHNUMnloWWJRc3dsMmJ3dDIxQ2U2Q3hNZWJKbW1HQnhyNElIV1NtK2dEZXNRVWhrSlAvbDNwdHJYQUF4cmVUSU1QClVoWTJmQ0dDSlJnRENYL3p4RTd3WE9VVUZ5M3NMd3c0c0JwMWtxb0FPeUtZRkVyRkZXVURCaWVQY0VjQTZvQkY1V0N5SVhEZ2pzWmgKYVVhdUIwWU9IN1RLTEM3YkJZWWdMdUhiSVpEMVBGaHlRa1ZQc1VjZVFhZ0xCek40WlE4WXpyMVR6ekJPMGFoUTVYd2NaaEhqM0JVNgpianhyNUhRWkxlbzBMT1BDNVBsWXIzR3RtandtdDJpSUxNdlNDSGtNNFY0SG1PLzFHTXlObzBQdUI4cDNJUnBpN21rMHdwNGNYekdRCjdIREhBQjdoS1Y1UmRLNkMzNVVSWXh5TVlaWklCZUpYNlRSaWhFSjVvTEl4RnVxR3pvdVlYVWQ3ZEdjMXlTSzJBcVRJa25qY0l3QXoKMElNQy95SVFrZWdSZXk3NDVpUDIrVzVHL1BQRStKcUJZSWM4QmpEL3BqaEYvTU9wanZjT1kvN0ZNRGUxR3lMbmxlU21QM1FpVitQcgpCcGNiYkl4ai9KTjRqem1McGlwQU1ySlBCZXd4aERrWVlJR0ZNWXpJOU1nOUozd1hZaW5EWFkybERCTVVwSXdubXFWTUJQQlNacEpiCnlFTVpNY2V4TUFZUmpiaC81anBpZy9CM29UMy9RTVRBYmpRdWVOQnNtWTd4RkdPSVpacEhTM2dNNHZnWHdUei94bUJJWWtET1hBaGQKQ1B6elBRM3M4OVF3S05Cck1jZmZIZSttdUlTc2d3MjRNT09zaTBGRW5nWU1PdWFVaGlhVUdaTitDamE5UkdZeDUxSWdKVWtqeHFVTgpvMENGQ29oamdHTmJBSG11eFNBa3plTmwybjNiZ1dXK2g0RmxuZ29HQlRvdDN2aTdZOWtVZDVCbE9VZ0VxY2UyakJoRWxPV1JxQ1RhCmMwQXBUQjZ6TEd2SU5FdGpqbVdnSjJUeFZtZ2FPV2hyT3VDTkFZNWpBZVE1Rm9PUU1vK1hTZWVtQThOOC93TERQQTBNQ2xSYXRQRjMKeDdBcDN0QnVLK3psNkloaE1ZZ0lFeUpzM1haNUN0QWM4N0h0UWVENlVXTWN3NWJUV0FoaTEraEN1MGNjQVJ6SEFzaHpMQVloYVI0dgowKzdianBZbDl6Q3d6RlBocTNrNkhkN291MlBaRkhmc3J1RFVGc3BIa1dleGhsZUF5cGc3UFlCVW9xSUJla0VlRkR6K0h1bDNESXJVCnUxRExLV2tCcndOdzI1RnlSd2NrazhXNm5aQjg3SEtJNGEvSzNJWkRqVE1nS0hZTWlmUzZVSXNwOTNnRGdObyttT1lPc1l6Vms0aGwKRFBLa3NlYmppWGZhVWNReTFxRWlsckdpNVd1eEt1YnhNaUJpbVFjRmxrVWdTeG9qOXNSejR4SExYQThqbGpFUnZwYW5uUEZHQUdiWgpKSGZHZExlSVpRenlwTEd5NDRsbmpTamlHU3RPRWM5WXUvTFZuUHJsOGJydkVjY1lFaGdXSUpZdVJ1b3A1NFlqZm5IM0lvWXhDYjZhCnA1c1JSd0JtMkNSdnhwUzFlRms2VUZnK2JwOE5DOHlwUHhIRFdFdUtHTWFxbEsvR3lwWkh6SUNJWlI0VWVCYUJMRzJNMkZQUGpjZnIKMG5VeFhwaU9qTEF3bVhhL01BUEFMOHdKL3NUYVdlQ1o5Qnl5bExFMnc2U3p3aE1ZNXRXaXdEQ3ZPekhJYTFlTTFnTUN3d0xJTXl3RwpFVjBlTVZQdUd3OE00eDRHZmpFTkRKR0JmWVExK3U2WU5jbVhXQjBMdkdJSUU4VnFERlBObWs3Z0ZhdERnVldzTVRHRU5Tckd5ZDhECm56ekVzeW1DRUQyTWsrbmxWZ09QdUdlQlI5eDNobmhxSGM3b3UrUFJKRDlpL1N2d2lDRk1UKzdGdnFXWGxadkFJdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJcHdBRkZyR0t4QkJXb1JnbGZ3OHM4aERQb2doQzVEQk9KdGMxR2pqRS9Rb2N5b1BnSm9pbjFhR012anNPVFhJalZyZ0NoeGpDNUxDaQo0bGVjMDJVQ2gxamhDU3hpbmNqWGNUcVR4K20rQnhaNWlHZFJCTEZtV1llVDZlVldvNVhtZWhaNHhIMzNkWmhheGhtK094NU44bVB4CmxkN3I4bFVtMXVMOXdWeVdwa2IvL0lSM21OTmt0c3ZTbDBHUUxXZi9yZUN5aERGOVg0K2w4NnJ3Ly80M2ZIL2ZILzlyL0gvOGFmZWYKM1gvOGYyYk1vZi82TUxOdi9vOVgvYy9IN2hja24rQXN4OFlFdExKcnczbnpKcHdiRm5vRjk0YXRPT25nbUlDdTRPTEFtbE5PRGt2cgpWZHdjczNoblUzemh2c00rcTl3eDIvbGUwUUVDRldlNFFDYWcxWjBnVUhHR0d3U2dWM1NFVU0wcFY4Z0V0TG96aE9pYWRJY1E4Q29PCmtWbThtOC8wV1k2U0NlZ0tyaEtvT2NOWlF0QXJ1RXVvM3FURFpCeFkzV1ZDUkUwNVRRaDZGYmZKTE00dDRQSU1kOG9FZEFXSENxYWQKbkhhcEVQUktUaFdxT2VWV21ZQldkNndRWVZPdUZZSmV4Ymt5aTN2ek9UM0Q2VElPck94MndWU0owNDRYU3FCNEpkY0wxcHgydmt4QQpxN3RmTUZ2bmxBTUdTVjNkQlRPRGEvTVpQTU0xTXc2czdKekJtT2NwOXd4ZStMeUNnd2FyVGJsb3hvRlZuVFJJelpTYkJvR3JPMnBtCmNHcytZMmM0Y01hQmxWMDRHQVl6NmNTaHBMcXJ1M0V3SEdmS2tUTU9yT2pLUVZxbW5Ea0lYTjJkTTROWEM3U0thVGZQT0xDeW93ZXEKVGJ0NkNMaTZzNGVxVGJwN3hvRlZIVDVFemFUTGg0QXJPMzFtY0d2Um5qYmxESXFBSzdpRElwMDRtSFVpbFhnVmwxQ2srZ2J6emppdwpzbHNvS01QQnloUHB3bUlGMTlBTWJpMWc3TFRMS0FLdTREU0sxTjR4eGw3RmNSUXB0Mk9NdllyektPaTdZNHk5aWdOcEJyY3E2THBqCmpMMktheW5TYzhjNHU3cDdLYWl6WTJ5OWdvc3BVbkRIMkhvVk45TU1YbFZRYnNjRndSVWNVSkZpTzhiV3F6aWhJdlYxakxOWGNVUkYKR3UyNEtMaUNNMm9HdjVacnN6Rm5WM2RUUlpwc3pOWXJ1YW9pZlRWbTY1WGNWVUdGamJtNnVzdHFtay9MMWRlWW82czdzNExxR2pOMApkWWRXMEZCalpxN3UxQW82YTh6SjFSMWIwL3hacnEvR25GemQ1ZVYxMVppUnE3dTlna29hTTNKbDExZFFVbU0rcnU3K211Yk9jZ1UxCjV1UHFqckdnbk1hTVhOMDVGblRRbUpHck84aUNWaHB6Y25VbjJUUi81bk55WGphRWE0KzZ6eGRkTWx6MVJ1eGYrK2ZsWk5Mb2lVaisKNjhvY25hcEdsdEtEUEtrb0tLK3hCTW1hNGhzeTlHQ09wcEFDQnVIN01pckZyTWdpblEvQ1YwRVNROG14NkpxMHZXRUJ3RFNsZ0E3YgpKdG4vVWlta0RRNHVHaExJcUZFcG0zOWFnc0lqcmRhUW9HSVN3d2diWG9FaFFKRlBBNmhXUXBlNENYZUVlWkptaWcxSmJEVjg1b0xZCndLa1VIT0JvTCtSVzhEM01YVHI1R1NCZnJVNlk4M1FHQkJXdVJORTFkTThtQVdlM3JLQkUwYTVIb2RSRUg1ZmtnOFkzblVBYWFWcFgKb3FheVJxWXhzWUxHNTVTS2JVNnA5YnpaSzdzbkI5MytzTFJQWnp5YlRxMjE2dXNaUHErV29hRkNrd1pNRWpUVTEyeEszc0lGeE5rbgpzd3I2SDM2bGQ0SHdkaEtGNHRsa3pwU2d3LzdDTmFnRUphbXEyUXdjdGhVYmpHdkxnblpTQzU4UlgyR1RPMGN0UlMxR0hlVzg2VG1sCm5NdWhsS0JEQS81Vm1NMEQ0RG4yRC84UUdReXZoOEwxbk5xMEdmbU82Qy8rSk8yYlM3YUMvYkdlRXgzMW5EcnZmNGtxNUpZZithSmsKZDVXZnZoQTJSL3hZcWpsS1lacE12b29nWmhhVWlaak1jemNmNDM0VmpBS0UzOVRURjFtWVlzUWJtOHQ2ak45MVluaGdxMk5UM2ZJcAovUEZERWczVTJBakcvNFl5b2FJZFNvdlBqV2ZVYnRRZE41anYrM0FGWmlDV3lUaWZNSnRLVmt5bUl5eG1GeXp5eVNHYWozRy9Fa2FUCnpzd1lhWk0ydm5mNkVkbkk2VjRveUc1VUpGMDhxNUpvQytYZktFUXlsNFdvMmQvb2VRRCtCTCtrTUZZVXp6ZU9hbUZTa2l6WHNCRlYKU2twU1o0VGN3TGx2YWtaL1p2UTZGSnBDdGFDUEV1OTlpa0s5WCtJVWpmZG8zVC9xZlJKRWl0dmR6YTZmd0EzWXJ2c1gzMThzZU9OcQoxUlNZUGp0TVN0bW8wRVpEMlg5c1RsSlNwTkx3VWZxUDlhaEVQYzBibVgxcHFxNHdDMm5kUDNSbHY5ckliUHhJc2M3MEtUeVVSWlhwCi9TeEVTYzlWOGFjajN5MzdCWXJpQTFqd1pReUhRMzJ3eDgwZDdVWDlRSVhYVmNRdXhvVHlYbzhNcUtjRllUbDNuOXhUVnZReFBKeUUKeVM3OWswcVdCZlNjbFhRZkhaUHNBMHlXak1TeGlDcFNQY1Nacy9MaG1zV3UrQjc0RXZoMkV1WFh0QThxTVRNU3o2T0VSeWg4c3QzdwpuVHVLaGpheFRCVCtqUzFQSFhhRnlUN2dqbnlZbDdaeS80d0Q3dEpDNWcwOTc2MnRtVVZudjdZMUYrdjBlMXV6aTg1NmNTdFNPMkttCm5jZmNqSGdjR0I4R0l4cWp3R3RtTlE4cEQzbVlhQk1qRVk5UjFKSDNWeTd3RGF1SkhWNFdsblZqNzJKaCtubDZoR05tWWRqaHAvSWQKTDhTOFh4WHorQnRaWVltZDcwMnN2WWwxNmFkdTNjL2R5WFVXcjBBM1hBZlJhbzJXY0QwYTdqa01GKy94REpreU14Z3U3TXVvY3dwTApkSjR1ZjQ0c1lONnZpbm1jNGUrbHpOSENxbU82YnpmQU9LK0ZuYjBTbjRiTEdYcm04MzA3bnVGLzNYdENNa0tvL09qUFhIWDBlL2hrCmZ6NExJMG12cFBwcVlteWtKOGY4Ykg2QzdTSlRwZ2FuRkdDSTJ1WmNjODlCd3h3dFZpaXV6N1NHWXFHUmFIeWMrWHpQcGpjeEF0OHQKQnJtUUpvSk9YRm1DRDdQaTYyRDhtUjZ0TnlZTGtDTVBRYU1wZWxnaUNLcmVNSWt4elM2KzMwdHZkS09keDAwVFkrM2RCenh0UUd2SQpETnFPOGtaU2FHdVhLMHhtRFc1VVpBckFPSTVzTXQreFZ1cVQvYWhQZHZWZ3J6NU5UejBtMkZyL3hobFNqOWxWanpuWnN1L1V3VWxECjB4RVluNWZUalRSVHRYL1lsK3B5KzNxeXg0bFpPaWtLenZESEEwZVorOHFFQnNKbmZmV0ZBeDZ5TE1adFJNMkhidG1YNzdpL01TbHYKbmFvR0RNNDB4Zk9BY3BlYWxDNFNKWXBpcVJ6a3lFTmtabTNqUjlQVjdMMHRYNHg2Zis0aE5JejJjbkRtaHpYNkhnM0hIQURqUEpwcQpoY1FmbGduTjFzZStNdzZCV1U2RmIzVGlhNHdPSCs4enhFQW44dHczTnh3WlZuU200MW5mZmVsNlFFUmZHbHFsQlVQcWFCZEdneWk5CktwNkZJYU12RFMyVkVpamxKNzlvN2txb1BvRTV0SHBRNGRrK0JZUnJZWkhsNlZZYloxOGNINC9KWTdkclhxY2d4cWZYWUwyUllhdEkKYzVjWXhvSmd1U3JjQzBIWVpLa21QMWxPUGdtMGhoV0NYTGtXMEtJbkRaUXdvVWpodkxRZUNRTzRvZGFlQndGKysvYTdRNElkeUlVSQo3VENndGVmNzRzdHdiejJTU1lwYTh3d3U5MTQrUGZyK3lXSHRpOXJkVm1mUTZwWW42Y21uTmJwU0FTTUY1ZUhIc1ZzVk1Cb2duM0pCCkxsMlRxWlRlT2trYUtlaGdxZkV3OHUwb1NiSXV3NmZvRTNLNXFBUjFWMHpVSlZFR3B6Q1k2RnBPYVZBVjBvYS9KWGgrZ0xKSjZ2aU0KVDVvRE9sRW9HMUZvTlA2VTRQclJRdHBMN0JhR3dqTXp4anFEb0M4aUo0dGFnWkVHTmZ5YlpXZzhNN1E3VFJKeU1FVWFTcG9DSDduUApaVVF1TEZ3WVVCMlZBbGxwaWdRblltNW90T3FZYWR3R1JzTnZtVWtwRHNvb2RKalZjZUVMbmJ0K1d4ak9BMGtaMmdRSVQ1UFM5TWs0CjZNRHVuZkJMU205aWozZm9ZS3FMQzNRN2dWbU8wNXFDM1N0REk1MUFucEFocVNoMHZzMlM1YmhzRGxxdloyUVd2bWJwQWxzWExuRmsKc1JJdWJWSU9lMnRCenZGQ3A0YjBMbkxpWVF3aUJUckQ1cXFFOVg0TG9hMXdFVW9sR09xY0ZETExNQ0YxQnZNWW94QndvdU1Mc0RDeApDcE1VQ0xDMkg5eHpNUGNkckMvWVJrbEd3VWNCNnhMVDFtTzRHS0tCNnRBTGxFcEt1dldTcFFtNkFWeVRXS2xBeHoyY1ptQm1rcElGClBjMEtQUFJubU9HUXVvUEpEclY5UHpkTGhNMXZXR1JBSHI1aGF5alNHeVBQSkFHQUl4YlBCSGU2TkhXbkxtVVYwZldzR1prYTdiWFYKWnphRWFiV0J4T2lycVJGQzRPcGpSTkdWazZOa3d4aFhIU2VvTlQxU0ZLdTIrbGpaWU5lSjBYTEpLVmNkcnhuY1FseTR1M3hQWTBDRApjK2NrRE05N0RBdVFBRUlON1FDWjhqR3ZlTUFRTlR3OUZOcGZja20xZFV6WmtFaE92V25TcEVDTkc1UlI1WURqS09mQnp1aE15aFI4Ckg4VjFaQzZiNHArdVcyem9oaUJIUDdJYlJqcWxiVWZyUkVZZzBBcFRlaVZDWU41TWVybElGclIxNEFOYm9JL2lsWEk4aVNsN0FOTVkKZlFSSGtqU2g0MVZTb09NZmtHRXdCbXhZV2ttVjJ5clN3SGFwOE9WcEc3Mk9FeW1qd0FDODFRQVRML3ArUUdrYmNNOWxpR3lBcGx2ZwplQmlhaXJCdlpUaFkwRzBwaFV1aGd0RStDdHJBeFVXdlp4VGFuaGxncWtsQmk4THUwaGd1ckFHUHpYVUNyQ1NER0V4VmpWT1VJdGNUCmlzQjNYSm5pM01IZUl6ck9oeDlTRzJ0OERuc3Q5TThFQ0xRTzJBci8rRGllZHh2S0dEcDZHbVZjdmhVWVdMcGtadDhBQjRnUXVhSGEKN2hZVExIK0Z2OEFjVURtdUlFbzVVdVM0VXVHb29QSFpYL2lScWtsWTlpUllwRlBXOEoyQnRDQ25BTXdscmRHM2x5clkrdUd2SUFFQwo2cDBRTXZWRHdkOVJFMGh5bUJRZWdyUGFHQnlTSkpYb2RFZ3hISWVDWnV4N1dERGNDblVRTkpuaDZjbytOYUFLVkZkTlErblVwclFGClFXUjFVNHBNZ1Vya3A3T3gvTnFHaTlrNjJHQkNsemFBOVlJZWhiT0JYSmdCUW9CaTdKTGgyZ0FnSENHaExNaFlZWWVDUm9RUm1ScTAKZytseFhCenBnbjVQR0NpQm1WQXIrQlFWdmNBM3NmM01WcVZBM1VhdEMwNW5hUUVEcXpCRVc5dUR2ZFJiL2N6NjhlcytKWlNvSFRRSApNK3huMTI0NkV3MGJZb2ltWG1kTFNJUjlqaTJSYkUxSVJIVHNsNWtOS2hObzFrM0l0WVlkS3hCaXp4VVlJb1lQU0tLYlBLRkllb1RrClpBUWpPenJPZXcvQ2JjWG1yQUZJUnRFRzBCYU12aXpjZDl4UFFCZUhobE9xZ1FDWDdNeDJqaUZIRWNUWVorc2NTRkNXNVFJUEJOYlkKVTJocGJkdnVxbVhhOE1adXJJYStBR0tOaDZCbEg1WldqZ1kxaG1FMlk0bnhHNEM1U0FraEEraVZHMUkzUFFoNmhBSWtvRUhEczBWagptK0x2MXBKbnlWQytkUWRDUzQ3N2FxOGVLYjZPQ3BLSk5obURCNUdVcUVTYWFFc3JMTWN6elYrQjNhNGJEdUM2Q1VzT3pqM0dmMDJwCjBkWWVmNGZXOFFhS3IyeG56dGcwT3JBWm9BcVprdHhPckNxQlVUaHdFc1ZBMWdiTVYyM0R1U3lFaGlpbnQzKzUzalRFWTBJaFpkeFoKbHN1ZG8vRE44a0pFTlFNRTFNczhzV2tTWFRWNm1naDBuUmptSzZKTnJHSHZiSUo4VmJpM0EvN2NZWU50TmNzb0t0Q0RRbWU1M2pTRQpNWEd1UDlxR1F2YzlDSmNWWUkzbXNxUWd4bmd4QnZSVG1Kd0VyK2R1ZFpJR3lrK3AyQVl5WnpmVytQaE9EVlpiWm1pL2NkOFZMU1U4ClVEaEF6aTA0QkRUN1NkR3dUYmp2WkhMSU1EYzZGeENvL0dLSXBzZkFnTkFHUTdnWERnVjNjb0lNdEw1QTVVeEhoRUhWSWsxOEZWU3EKWVhRWUlYL2xGdm03NnhKWGRsMTJ1RDFGNkhWQ3M2a0RwSUthNE1yOGxYSHpkOWMwVjNZZEcrOTNhNEZoQVVwSVVKZzBLRUVaR3FkZwpiOWNKMlN3em5jaHQzZzIvYTU3dU53ZjFVZk4wT2tCbGxhQVVjdDJqaS9MY2ZpU1hPR21sS1lXQm9rbEkyMWdBL0VCT0c1TFg5SlY4CmU3Ujc4RmVzcFhQN0ZjYlJGbVdrSG1Bc0t2Y1ZWcVlUM1ZMUGcxQ1Y2R3R1TjB4RUtXM01DWWFpK043UXQ2aXo5QjMzQWhsOWhxckMKZlNYdkQrT2tMN2FMZFN1NS9jNmlKNzY1YnMxeFgrdnFFUnpDZFZ3N0FvTWJQd2RsMVQwc2k5bis5V1JBQnowUmxpK3BLUk5ONjNMQwp0NzFDcS90WGFIWEdTM01UOFI5ak0rSjhiM3JHak0ybmVLNU56VVEvUjYxVE1KNjhZL05haDdFZG0yalRrMUdOVGIzM0QxRmdacWN6CldLWThzNVBwSVNaK1prdHF3aUZtMWhDdjBPcitGVnFkTWNRdVhoVWxzQ0NsdXpCMHJRKzBiMG1SeVVXQ2xpazNCdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJYkRoQ1VrelBDUjZKOHhuckxyeVh6S1duSWFIR21XMGpuVzZEYTUxUFlNVnYrUlRHYVVpb3NTQ3lBWFJ6MnB2b0w5bys4RFU5dWZXUAo2bjFYL2pwNk1DaWJKMmY5MXVWd1lvY2lEOXNMUEsvbHhnZzZwT1Y0b2NhZTJDZzBCclFiUlRjMmM1bnF0UGJ5d2V4TkRlWlRJVktRCkVWTjdXNFlPWEtYdDVoYStITGt2ZGZkdCtvdjdQS1JwWTBLVEtDNXptTHEvN0dVWVpLUGN2aG0rSExrdmRmZHQrb3Y3UEp5cjBxRHIKRmhRWWN1SFdDano2SlpRWUprOXV3Z2Q3WTVPRnNyZWRmTnZ2VVRnTTlMZGUzd3NKSCtNZjlyNjl3Rjl5Kzh2ejdpWDgrK3owNTdJMQoyck8zNUdyN2c4dmg2OXJUWnEvNXFoelVuZzNhcUE4dC9LMW1menhvZHJzZGtPUVhyenN0Vi9JN29QNWVMYTFkakJxMUYvM0xYdnZlCmRObFBhL1c5dStNVlJMS3d4bmhoWGJzZ0ZGRGhVYmM1NHZJd0daNzFnSjJ2eHdvZnZHNE9XdjFtdDFhdlBTOTdyVTZYaXhPS3RpMDYKVnFFNSttUUluM3V2TGtzdTZ3WnBFajJod0Nya2hoM2UrN1RXc0t5R3NSbGo5QWNlc0tsZXc1REUzWWF2bUhrVDl5VDcveFQzRHp3MwpZeEJNN2NHVGsvMEJUTjV1U1JpT09xZXdlazRPanFHa09VR09uaEJoei9zWWFIVkRKTTBaYktBa25ocjRGZWNLL2MvK1B5Z015YUsrClhxbnBkS0psT0lpTnRadGNVN3VhMnNXUm9HYmhnRVlORmZTL0NvMSt5SUdadGFwd3VrMHVLNENCV0t1eGZwZmRxL0YvY1h6dTFWejQKWk5pQ2hQK1VvQko0TTlUTVdjaEVrVjNFam81dnkxKzRjRTJNZjAybnZ1Si9jWm1wRkZRU1dqdTQzalI4a1JnRUFkcGhXa2pMZzJRdQpEejdzaUJiMkYzN21lYmgzNzIrOS9pODkrZ0liNWQwSDNYZkRZZlBrOGZHbnRYdmZ3b2pCcG5QdkFleWtiMHN1Y3UrZ2YzNkJVLzlSCnB3dUVZaVVZOUU2dlpndFlxRlhlNzdraW40UHVldStIenJBRCt4MGluTVp3UEdxMjNxeUFZYjg1N0xUaTZvUCttN0o2ZlVrL2RKOE4KWEVYQXVPaXA3WHUybU9OQXJiSnQyL2tlN2gyV1o3WDd0YjNhM1FnUGJ1ZjNhOVJzN2Y1ZTdkN3o1bUEwZzdLRGZxOTkyUmxWSVdvQgpGaVIyQmU0dTVBWGlDcHg0eGxQbTArbUpXL3VuUUR1VS9ZRSttU1RQUWVYQ3hGVmE2NElTTnZ4VXUxamxKV2d4emxIZkcrU250eHA5ClB5d2Z2aTE3ejlydGlteStUZ2JoTnB2a2lzTFg0Y1JXME9QeE9oUDJhVDZqOGVZdWFPTndqcVpuKy9KQ0NWQlJWL0doZkNpdUxHRFEKZnJmc3RUOFVod2paeXFzcGtCZnF6eVZrNzk3RFg4dldKZmFCZnFDNlU4S3VoKzdDZFpaejc5K0hpWEcwMjUwVGU4L096b2JsNkZNYQpnRG4xWFlVbjNlNGxuV3I2ZzBiekF0VHNlM1lud3B6eWpuMTN4NURXam9DVnRZZG5aN0JSUWVudk9xT3JDTjY3enk1SFF6Z2ZSZDdlCnc4N3dvdHQ4Wjc5K2VvM0MyUzhiQzdka1Blblo3bFFTS3B1MlpqNzBKdlRCSisrMVNta3llS1JGbmtlYTJHMEk0YTJaUlZ0RVUrWGQKcEphYWRMMTNsSjNtdkRhYTgwcTIvQThpaGNTSFVBV3RSbkE0NkYvVWpsODMyLzFmRmlzUVdOQ1dhelE3c3pXSE1WeGVWMWpJVEUvSgpSYk16Y0tTaEJiZDJGMS9OK1hTT2hQZG5GUEYrVEIyMnV0Um9sbkNyN2ViZ2paUHpGdkM2UC9pTkFHaGZjN0QrUmJNMU5neVh3L0w1CjhkRis5M0l3VnZjMEFNZ2UzQm9PV3ZIMzAyNlB4ZzJPRU01Z1RFTml0YTNhdzE4dm1pQmQ5OHV6L3FDcy9WQU9oaTRxN3BZM216RUgKNVMySTVrS2E5UmJOTzJWL3ArenZsUDJiMlhtdks1eDFkd3JZblFMYzVaTHIyMnBtaW5seVI5VU8rb01lN1BnZlNzeFBJSzJvbXpVRQpCclk2WlFZRGVpNkg4NmI1N2tDek5RZWFxM0ppWjZ4ZVJiRGs2NjNEN2xiam1xeEdWSEtTTk1NZ092Z2dkVUxPSmY2QUZnYUY5MnNtCi82NloyOG51VlBFRGs0djJOU3BuanlGemJRMlB5dWJvTmZLNTJsNkdVWmc2NTczc3hjSzk3Q09TUXNWT0N1MmswRWJwQkdzZ1NYSzgKZUx1VEpFNlM3SGN2eTlxMzVicDc0RzlabEdBb2R5b1QrOGFPeUdSV3VHajdFTWVkYVludnlZVElrWW1BYmdIREtpaWcyK2pwWUc3eAova0xvTm5paUU1TmhtSDlEWmpJM05pKzdTQXFLNWNicjY4TG1mNlRJTzJSTldraGg1ckpHYkJOcmpESDRTZ2ZNRzYwemtidnBrZ0pMCk1sUUJOWnU1c2dJL3plVUpKcGZjRnBaa3VhRzUwVkNTbmg1eEJqKzZBWUVzUVhzZnpxSE1vTVZ2TGtzd3ljclc4Q1RQMGpRWEZJK2EKRkJuZkV3SVd1WUEwV0Y1UzY3bThVQitHRVIvY0dIWXJLeTQxT3FWd2VwM1NnNzU0d2NzSzZrWnFweFJtRkRBcUl6R05VYjl5TG1PdgpaNFpkcjJNdnVnRjJEUTZLclpnajJxUjVnZk1nVFZKTWp1MFdtOTJYTUJtQXdGdHNxQ1NtbU1ocDN1d3dHemc3cE41TmoyWFRRNms4Cnh3MUs0bzBBT3pjMDc5Z0dVeVBpMU5EV1JETm5hbVNiT0RXdWRXYnNEc3M3QTNvNGNCNjhIdlRobVBuWHpxdlhYZmovYUtQT25ldmkKbFY5OFJXMmhUY1ZXb3RKWWVLNWRaUnI1MVdOSzdqMStkdnJ6QzVnTlg5VGkyM08xWlhUY2l5OWFZUTVkMTQ4UWcvV2c5NnBidmlnQgpHOHljNy9yNGs0L3pPdXdBS2NUWmlmS0g1UVhNNWVHejNsaTRGemxaZStXUXpFR0ZCMU9Oc1lJRSthRTU2UGhFWjJORTNmdSsxMm4xCjIyWDE2SmtYMVdNUTU5NFNUNlFTQmEzZzFmYWVaSkpiWTRReDJ6eHZsckJ1Wm1YR1BGYjMxdmM4bDVyM2hqYTkyOUYxdFV6b3VKMFYKQlQwWHJXQ1dpWlFDYnREbWdQcU9zOHhNZnBnLzBUQXIxZXJUN0VZT25WYWF1R0E0dkVMNm9lSXZ4bEJXc3pNclhodm4zYzQ1Y2dCegpKbUtxYmc1Q1BSdFNmQ3duRy9pNU43cW91QzUyd24rKzhKZWJLUHpkTW5NUjBYTlhYbXBrYm5ZaXZwcUlsMlNBM3F3VDcvV2RhUlprClRKc1RUckIvQ210cFJqNm9KRm1ZRVlwU0pHMVEyS1c4cG5qNGozMld1TGZrdG1lUzZCdU4vdDZBTVU3ejZ4L2lqODAyTW40RGEzUE0KSXJ2SW50dGF6dXRqckZ6UCs0alo4dnVJTjNIOWsyOHE2cW1iaXRsNzNGVFVremNWeGNSTlJiSFJOeFZ2VFF4L0ErSjJsM3RwSjRJcgo1MTdDQ1RNejh4Sm1YTUkzTStuZnBKYnFOR3VrR0JZa2lpSTFqVlFrK2lOSXZBUlN0S0JRcUtTUU5rU2pLQXkrdTBCME4zSmpNQlA2CjdlVDUrTmhrMjdOTDdQcmpidjhYVE5TNVdkNjNuWXpicVpuT3h1OW44WHRybVRHcWFrcm03YXFRNzZNZnlwMCtlQldaK1UrQU5pKzcKbzU4aWFYbmNPYi9vZW1rNUo3SEorenQyWnhFbzNOUjREdUo0RlBXYThvbys3TFZEVnRHbHFVbWZON3ZsYUZSUzM1K2ZWdTd0M1gvRworYlYvK3BTb2Z2bmIzaVI4NzNscm1pMTNmM3pkR1pYMnQrb0xCd1lUOWc3R09ETkgyTjBYai9kckw4cTJRNTBZZXNHVlNoc3RWTzdWCk15NzdqN0tMeTk0V056SXo1REFJdGl3dTkzaFFsajFYVEl1c3NJbnRHMExxMUlhNmU5S3c5TUc3SmhmTzg5UlFPR0ZtQ21HaWhMcSsKTUY2L2NJV2xLZXdWUUh6WjBtWHpGMk9GbnpaZmxiMVIwNVVIcFFvb1JPcXl2TWhJcTVLWnBMc0lpY21VdTVSZ2NncUZGWHc3UWRqNApWMEw1bFNqUzJ1T3YwcUsyLzVYU3pMWUVxaHFiZDE1SlJmaFRTYzhGSjBsU1VBTE5BcEZSNG9ZRVgrQWpoekpGeVZtMEVoajArQ3VaCkE5clUrQ0hMb0doS0kydnl6TjZIVEJKaHg1cWpuVlBmelRGOEFIcjhWWkZFK0xBdThKYWl4aE44bHhtUTVOcG9kNmx5S3RwWEVOMGUKSC9aUHdMK0FNQWtJcFZBVW9vOVBEdUk0WkNLMVVlcUFXNlgwbzRGcFdSaUtFQlFwTU4waDFOaEI3UEQrVjdwZ2hFcUwxUFVuRlhtdQpIQ1lYN1Y2aytCK2FSc1JNeGlTUmRTbnhMdVdSeGljSmM4dXdsS0pYWVdLbk5yQTU1OFNsR1haeENwMmdrWUJoak5CcHZLSWg3RjJOCjFFNmNJa2x6TzZtMXU0ZWFNZWVBV1lrdWVNS29CQWt0c0h1RzhXWEtDR3NlQjBRWlRRZDhTUU1qS0J2U3h0SGlBM0J1cGtqTFFZdFAKMDBEa0F0QmxpaGVOU2ZGVk1KeXFHcTlJVUU5VElOamVLdEdaMURSN3BNMFBZaEZSdHhUeTN6RC9nUTVhSG1tcThCVTVaQnFsd1lXRgpsaGh0eHhYRElCUnlRTnE4cnhHeUJIbW1lVlZrc05TMDdRRE0zU3kzekJjOGhwNDZPNUV0bWxSNTRvVHdpSEtsNko1TWtlVFVLNlV6ClRjRVpPQUV6MnkxL3FjaE1kY3ZnWWhVNlk2bTFXZ0lWd0tMc1ZNVmVTY21yS2M5MFNyelIwaWp2Nm9qQ1F2Z2FRdWlJU0xFamVjN2MKTG1DeDJOV3RGVFdmcEtwUU5neWZIaXJ4bWJZVGZNbE42Q3dNcHV1WkFieUs2Rk8yWXlTdVlieGdmZEdhVTFvU1JzRTNSUktlOWFuRgo2R1k5VFhvVUYraXU1RW1xSlhVQ3hJUndpNm13VTFWS2l2bFZRVHBpN0l5OWdtSm5mWUtMRWdZRWU4WURxUXF0cVE5QWVVRkJOYmlhCkVrdXd2UU1WaVIrV2ErN2FENittak1XdlVMeWFRUHdnT2lJcWt3bE5BNEZ2cU52NDlNSWtGTGhFRDZZblBEWHc3ZlBIWHlIRmhSY2EKQW1hYVphQXFwSDNmSnM4a3pZZlVyZnZBUHRzL0ZocVMrVmNrWWNmTjZPR2NCRjlXNWFVUTlnRXJYakhDQ0tkUHZBMmtOQTVTOEM0bgpjMXg3c0hxVkpQbU43OXJhWFRyajZXRndwMEQrZWZLQW16aHBjNXI3bmxNZ2xSVXRPc0NaMnRrTGROQzhNTG05YVc4c2xBU0d3a25qCmVhOXg2eE9wb3RXWmVkR1kyb0VERHRIR0RkeTJLd3prV0VGeTIyOVZMTWpUZUt2Q1o2dGhxOEloelQzU1RKTWlBc2lVSUtUQS9aeHcKd1Fhc0NKbVhhVzVBcE9ZOEFJQTB4NjdTaWpYYXM5RmtWcnJsOUZJcTNYNnhHbFFpQkYwbzhoTGNYMnBRTWhvZEZPTEFBRzFvbWJEUQpUSVV1eUVLakNwRmJ3WjNDN2tYVHA4Z0xDaWZqWE5uS2loWHNQYUR4VzRUQlpTeG95OGtsb3pVeXRmTS9Vd21oelZVQ24ybUhNSUlHCm0zZWVsUGRhdDNmRU93OXRQRjc0cGZaeFpMeGdLQkppQXJBVEh4Q25TM2ZFQkRmbXVPMjRPU1hHaHd1bktPM2JYck9BTWJJM3NnQzMKWlMxTWZhdFhBVlB3eFdkY21idzd1Z1VKU3ltd3RrQU9XTVl5WDFXV1dXR1l3VzVrN0NMTUJDMUxBMnViMkNpNXI0S1hWZUtDOFFncgo4VFVscVdzWGszWE1ramI5ZWMycXg1R3VQY3NoTzE0NDREaCs4MjVwVlN3VGFqd2J0RjUzMmtzcnVXS3VIcXUvKzYrcDBjdnpjejRlCkxtclhGcHVKNG5HLzJ5NTd0UmNVVzdVRVQxd1drYzAzMmtZSTBEaHJDMUtWUlRuMkp5cTVvbllYdS90NDBIeEgyYUNldjFycDBHUDMKV3BTZ2ZoK1QyaTVtZkMrVGtHallmbWk5dzduQkJuZWlnaVZtZkhCaUdlZVJ4Tm5wdDM5VEtDdWdVbnRmRjlZekxYa041eGVhaU9ILwpUbTlESlVLalJOSXMySTFPTTlwVU5DajZ0S0hDSGtwQnBpQ1liTWRTN3Mva0I0czBvN1dJU25ubVJTY0lYMUltdEVCaGdCK1NMQ05rCkVyWmIyczJVLzMrOFcrTy9LTmhZQXNHbXIwaVFvM0FwZFB3aHliVGI5TGxia3g4Y1lra1NrODQxOEMrdmJBbVNsOGhVV1c3Rklld2UKMm02NFJVNXFqdkgvSDl0OGREcStuOEd4alFTcmhIT1hzUW9QakxVOU4yVGNwY2tQRG1ObWQwalNKVEtXT3JDOUdPcWJRQTBzb3c4NgpkY2ZYM1AvZnpZdEUwYmFQZ2h2KzVWTk1yblJoSDAwUUtjMHpVSjR6NDg0MTNKZkpENndBSkhTWXdma3J3MEhyU3VsdzZOaEdlb25DCmdZVi9lVzM5V0o3V0R2cmQvZ0RPNmYzTEM3L0szR1FHQ2EzNDZoc2ZaaUlOdTRnVk1wTjZGVnQ2UlE4a2ZwS3hHWUhXQmVrNWJxUE8KV0EyUUZpTlBGYXRDMFo2ZGVSMEt5RXhwL3dBZW1kUVpHK1lkVXJXZU9xVGFQdGlSTEhCRXBVTWg4REViMGhUakE0aEZJWkdjTkhRQwpGbU5tdlRHcHpQQm1tOVVSN1ROMGZNMXRyQStTNW1uR1MwbkNTdGMwcTJTR3pNTG1UV2FjRXNmWDVTSkYwL0VrTDhMOEVoYlo4MzF2Cm8ySlQxQ3J2NWh4MWhxUFlQRGNlTXpEdDdJalRYY3k0aVJROHYvRUxQRk4yTldyMUtxLytpQ1IrUWhEUi9CZjA2QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJY2pUcTk5d3p0OU1QMzA2OU0zajNlZi9pKzR2eFdrZzFVT3kvUDIvMnl1N0pRYmMvTEczQlo2NWNjMVErNnBUZE5oZDgxT21ldzU4WAp4MGp5Y2RtRTdSb1pNeWpiblJHK1JJOFBhMDI4VEgvM3I4QTBlb0N1WFh2VWZOc2ZrREh2THBINjZlUmJlSmJHK2J4eTQza0lwSjJYCnZSSDByNGtQQi9MMzJoZjBMYklSMjBlSnJWVjd2MXVXN2FQeWJQUkRFNjFvdGNrWC9wTGFXUmRmZ2VyQkhMZ1lsTU55OExhc0llRVgKMklmaDRncXRidWVpMXVxamtmZlgyZ0E2MmUrNUdsbjAzR0JjWTlBY3dteXJ2eTFiSTVCRnA4MXVzOWR5dmJyN3o2ZkEwY3Z6Mm90eQoyTzllT3FPcHo2OExpRVROMDN4Y2ppNHZLSnpjNG4yT1hSL1YwUERzdWh5aVNJQ0R0YWZsOEhYdEJUWGUrWTBNcjFFenRrYWFqTldBClpYRnhPVnBTSndsVVRuWHVxTmw3ZGRsOFZkWmdMbDVlMlBMZTJRRExEWWgvVVY1Y2RvY3h0bWpRWHVCeWkwWnQvTmZ2K2hmUmIvZGUKUGozNnR0OHVaODZGKzdXN3Y1NTNlL0J6SGRnMTZKekNnbmZEZE8vQkFKUXVXK3VhVVh3QS9GRXAwSmk3N1VIcEdNY3VHLzRWL3huNQpkeWp2L3JFM1BIbmJIQXp2UjlNcEx2bzJNSkxnd3pubGVuNTJ1WjRNeDc1dEtIZDYvVjVaZ1RIZGZ1dE4yYTdDR1M3NWdTYm1WZWs2CjdmVGEwRkZSZ1RhWUhMQm1yZkJZVGw5YytnTU4vM3R5UWl6a1JDWDZPL2pBYTVXSnYzUlVOMm1oZi9HMjhsTEhvcmM4bzVFOFVHOUcKL2ZQYmxXVFhOdysvR0RaUm1VQVZCNVpZMWVsNDdldmlHQjhqV0p1dWJNTXFIWjc5c3NhNzhTMHZneUcrNGIzaG8xeUhjN014ckxMTwpvL1NYVHB0dUN5OGRYMWZ3ZGdWd05acGVseTVqeDFLaXVPVHRVaVhSNDdHTXFIZFY2SGwzMjZUa3VwRExLUG0xa2ppNWJVcjhpWHNlCkdhZjlFZWdCZUxCL051aTg2dlNxVURWZFp3MzJmQkoyeC8zTFFhdmN4MERZVzkvMFlXdTY3UzZjbDZObUczU2c5KzFIOFo3OStIM2IKbVRTcXpLNm84T2V6dHFLeHVYUmNkdi9hSEIzMlcwZjlWck9MWjZraC9UNXIzdm15UUVzNWVISVlsNHgvL2c3MUkyelY5VjZvUnRKSQpvcTYvZWZEazBXVzN5M1lhRjdRSnY5b0t5bHRubnNNdkZ5V0ZlajhlZE5vbnVHUWVOVnVsejNTQVEreGVjWHZlNy9SR3lNMnBXc2RBCldiRGQwRUJNRnZtKzEzRzkxWGt5cjNVeUJEMzhkZVJadTZBczlqUXVxblNPd24xbTQ0KzYvZjdBaHUxUldkemRza1ZsOS8zTVdGcjAKQlJzQUZwVWt3cUlPNkxsa0VjNW5GODFXWi9SdU1VY0paK2lvTkJpdk5yc284aXB1UFM5eXNhQm9RS3JtOC8rSFR2a0x6TFhEem5BVQpMSnRHNjNRQllzK3JISk1UVVVES3NwazFJbk1rRlZqR09oTDNFNXhieEdUMzlCck44YmtMNHFEc2RnOUFXcnVDNlZ5Y1dQQzQ4eHVQCnh2eHUvclUvNlB6VzcvMDFVb21RYlhyUk1Idkd5VG1sdnZPeWJuN0RoR21TUWQ3YWJTTGJkYk0zNnRTYTNVNXpPRjB1dG5IM0wwZmQKVHErc2pjcGZlUlY2TTNIQk5tc1VTSCsvQkd5amQ3V2o4bTNaSGQ4NUFLVThPYjdvajhocDk3VGZYbUs2NXphSGRLdGl1RXlnRWRFVApFaTJwMVRXYndPZFBQYzRrUTVQbGgyYXZNM3dOcEVRemtWeCtlU3JNVWt6WWgrZmRacS9FU1JJTHJZVnJtMnBRY0h3SG1ZZExvWXlXClQxWXNYejRCejNmOWk3anJWZGRmUUxCUEtsV013MlNBQXhGVndUR0xnVm1ocXpFUVYvWnEvTHZzbGdPcitqM3B0Y3Rmajh0V3Y5ZGUKcmM2anptQzRwQm1hR3ZPSGFWNDFUODc3RGE1SGM4V3g5ZlduaGpiTFJMV2h0ZTYyNlpGbHlnOEcvUXYwVnRyTFpOT21pUW5OS1JjMApwYktwZHFPeEdXL0FKVlI2NnE1UGd5NzBZREE2N1RjSDdacVlUcjhVT2MyOHZIand3b2tRa0FvcUZncXcvci9ydjdDTld1TDd3NDdmCmpDVDNvM29WTVNIWW5neTVyODVqL2UyMHRzc2xZcFZ4Z21tcFA2ZGZOTnZ0Q1lGOVRvOXFqSUdHSUdzblFDQ2MyWnZKRzB6N290TVkKRittdGZuZmdWZEVIVDJvUExrZDk3elFzSnpDU201RFY1TnFiWHIvMUJnUjM3WlVOeVZoUXREUHNnOWd0YTZkNFdjY2x5Um9yWE5RdQptaGV3RHd3NzU1ZmRabkJReW1qbkdRMmF2ZUZGRTA0SHJYZlFacWNOcGJtTFdpcVpSMldiUEY5YUZEUWlvZVhJZXp5bldFVlVyeUtkCmExblpBVy94c1RJd282U0lPcmkwYU5TQnBXVjlCNFJKODlTWDVEUEVRYlAzdGprTUdvNFlHNy9uN0ZESCtJVGF3M1puMUxTQ2JVSVQKSTQrdWxUZVJVL2MrL3V3dmVrMU04Y2w3WUJNZWJ5RnJNQmtmY3g0YXZLcG1YZUNMbk42MjBoSHFFYkRDcUJKMWZMTFNlRXVpOXZENQo4Y3BOMlZyTDIxclZ3ODZ6OC9pSHg0LzZ2VkhRQU5Qd0F3eExxelBtZG5jUDZ2N3dHUHZ3ckdkekdFNys5ckk1dVVpcHd2bEYxKzlTCkU2M2o0VFppVzFUdCthdXpjZm9BZHZqZDRYUkJsQ2QvS3djVHl4bCtlTmdER2U1RlFkVHd3L1BUc20wbDBMaW9ndDhvTk9lN2FTdlQKMUFHak4wWHJWSkhYL1YvKzJtbFBFSDRFN2JKMGZ1TElXUjdZUWZOdVFUREh1RWFPVWhaVjhRZW9pc2NjOEdVSTN3RUdweHk0NEpRWApjWERLVk5GblRucytqclhuWkY2cDc3eGVIMGU1VUJITDlucy8yUENXL1RpOFJVd1VmVFlSWTFNbC9BV1hUR1UyWWVFbGZMSVlxekhLCmxsM0txZkZpczFsbHkxVGpsY00zUHlDcHFQWDZJV0NwMXVsUlFCSnFHS3haTFJHYnJxMTd3Zmg1NytmK2FZUFFOYnRkM2hHR2swYXoKcVFvZ2lXQ0hmVFZCd3p5OGkwc04zM1F1VG9FamI4YWx4R1N4QVp3Y0I4TVNxUmtzTGduN1dSQlRkNmVWd01ueVRIWkUwWDIvcXlHagp2K21mUHVtZDlXdkI0TGFFMGZONmR0b1puVGN4OUd4Uzd0dTlJaTUrOGVyOFRlTVVOOHYrMlZuRG1yUGRQajYzK0Rrb3djUEo0clBZClBvNzhjbGpDYmtNYnMxK2dUaUd0L1ZpZTN2c0JSRi8vM3RNKzdPZmxUNHZaaWF3dmlUTmptdlpVQjRhamJxTnRtNkJKd2tPNlpMU3cKbWlzZjdMRlY2bHkweitIbmJxOXlweTdhbFpIYk1BVmZZOWJZWDF3TVhMRUZZd0psWE90dW5JV2NPZEpRTG5JUlpzWGNVckhQVGVUegpTblhPWVRFM3VuQ09xMVp5MU9jQXYwSXRMamtJeldkNmJpOXQyWGpHM29YSkJ4SzFYVHQ5VnpzY2RON1NZMzRMQmdHeDlPS2RZYnFoCjFnVFg1aGVLbWJZQVZUK3lIUzVBTmxGc2F0Q3BGQjFXRm91MGRqbnN2T3JOT096TUZMbW56cm0wQ0NNVjdKOTFKczMyczJYNDBFcXUKeWlKMWJEaW1xZTRPR3VmZXpqZXZSS3Zmd3lSdGVGcGRRQXVXOUZ2aXFiMzBaTSt4TTBzUDJvMytBSlgzNXJUZVBWbndESlFGenNKRwo4YXd6UzEyNEUvNml1VUN0dm1vc25IeXVqQXU5RXNuY1VrUDB0VEN1cGVYZUxxWngyTHJvdHQ3TmwwcTJUS3MzYVFpYkxET0NzMTUwClZwOURINHhUdDNteG5BK3UzSUsrMHc1Vzl0QU50a2p1WXFraEoveFlPbk9wdUpYVFlXRlVxUU5UZm9TWllseFA4R21sZVhzMGlIaFUKRjhkbDBZSU5la21aMXFCL3NhUUlLbXNkVUYrV0ZCdEVtVHFXTllvR2c5UG1ZTGhnSE1kVmpMQzlWQ2c4aWtoYVZqYmFZeXJvUmFFYgpGUXI3YmxRb0czVmoxaW82NjQwYTdlNWlrV2ZMWEF6TytyMUY4ZzZMRFM5UGVUMm1zOFpvQ0lSNk44dk1VUnlDS29ySzY4SWl2ZkpWCk0xaHQ1eFRDRXdnb3RNUEZzd2JMd1hiVFc0eXJLeEJiMDN2YVpvLy9zREY4M1lSRFFMbUFTMWlvSEtIUGlIUDRSeGJmaVlManBiSloKY3Y3WGk4YlkvUTNxMnF4U2cwbmRudXhIczBxK21uRUttRlhPN1lMQndUWnJmb1Z5MWltMnVHUzNzMEJrUUFGMC9qWEhEdEp6Q3ZZdgpXZ3VrQ2hVWUxoaHhLdEMrWEdnVFdDQjVvZnBpTlFOT2RNUGxld1NWT3J2c3RSYk1FbHZHV1NONHBpelpHS2hPczlkalcvdnMwelNWClduWTBhSjFINnRMZDd4dkhqWnE5NUFpbjNIYnRYM2VQZjN6Mi9GK2YxdDdLSlllemM5RG1JcFZ2bGc0SlpmQjQ1ZjA0YzdyRDE2ZGEKNSs4V0hOdWpnbjM3SnZmMDJmb0JGNDlPMTdFdFJnZEw2UFBPcjJYM2VUbkFwR1JUMXBqajV0dnlLWnlkT2hmZDhzRzRIZU1LaC9WTwo3MDEzT0lKRjVmMyszT3NudlRjMXZNVTIzbDF2Vko4dzIxN2d4VHMzYmphbjJ2UERSODZhaFZwRC8ySmtUVkRqSnNKditxZTFaL2FuCnlPYVZaZU5HdUxoVU1NdmYyKzh3cFErT0Q1NDh5ZlZoaVRNQ2YxUi9lZmJIZjM3MjVZOWZmWEsvK2ZMemI5SS9QcXZ2ZnoxNGZQNzYKaTFlOTMzM3o2SGVmMy8za29OTnNEUDlndnYvclEvUDdMNzcrL3ZHZm42cS9mSEgwcjArZWZqMjRiR1dQSHNxbitSMmgxTytUWkhqNAo4K0dyejVNL2ZIMy8zNDAvZmYzbDV4ZkRyNGQvay9mMjdueDkvK2gzQXk3MHpXai8xVi8vZnZUMWw2bzhQdWg4OWVmV1lhUHh5YXVwCnBvN2EvNEQyc3NOSGQ3N0kvdnZ4NlBEbm4vYlZmOWMvZjNEZVB4ckM0STVlZi9abjgvdkxSNGZxRHovdS85ejk1TWU5TzRkbnlUZW4KTTVIOUlTdk9zaC8rL3M5L1BmanVvUEhEL0ViamNsLzg5UFdYYng3OTlQVVh3OGI1WjRlZjM3bDhkUGR4KzJ6dkRqSHIwZitjUExzOApQUHZweDJ5LyszWDM1UmRuKzY5SEI2K3oveFpqN1BpZlB4NjJ4TkYvdnY3eUw1LzhhUEZBbDRjSC8zNzE3ejU4K3VOL0RwKzBuL3h1CnY1Ny8vSWNIeC9YZjkyd2ZYamJibDN0M2lwL3ZmdFo2Mk5KL3YzdndXcDNjLy9MQm5mU1BuKzEvKy9uL2ZQYjF3U2ZmUHpvb0wvLzAKNXgrKytmM3IrNjFXOHcxKzZuejI4T3pvdFcxWkpQZWEyYUR6aC8vNW92UHZiOXI3M1R0LythUSsrT3hmbHcrT2p2LzRIK3ovcDEvZgovK1oxdW5mSDNQL2hwNjhmOUZxZm5ILzIxZFA3OTdMemYzM1Z5Yko3dzdQMHdhRDFSSHoyNWd2aE1iWU92eG4rQUd6TFBpbXpIOU9rCi9VWG40RjRUeGxjOC9lcHUvZk55djVzOVA3Y1UvT1BvenRjSFQ3NzgvWThQUHkvMEVNYmx5VC9ONy8rY0hmVC8vZG1YUDdULytZVTgKL2YxUGhQYlB2VHRBMEovTm4zNlBRL0pQODZQNWV3LzU5T2Y5TjUrYXVwdWFQN1NQRXZIVDc1OGUzbXQrK2NkSHYvdnN2d2ZZaXNFZgovazFZcU1qZW5lVDAvejVSOVBtelB6LzYwbjM2OHNlSGY3UEZEejUvK0Q4V21meUhmQUpUOTJYeTJaLy8vUEJ6ZWZpWFYxODVQRDkrCjllWDk5cy9mL3B0RzBuY1k4RDNiMTY0VktMVC9qZS9BVDZFRDR1NVhMN0JRcVFpbWY3ZC9lRUtzUGl5SGYxSG12ODNQclFmZkhmNzgKMmVIWnZiLzk1Mkd6K2NrZjlzM3A5Mzh2bnQ5NStmMkRad2Y3encvUGpqdi8rZm8vUDMzeGF1L08vMi92eTdmVFozSUZuNEIzQ1BzTwp0dG1Yc0dNZ1FCSUlFQ0FKTzRFRXdrNzM5UHh4bjMycXlydnhDbngzenAwejV6djlhNEtOVktXU1ZKSktLdVdDdmRhUUltWS9QT3NYCmg3aTdrd3Qyc3k5azRmZDltUC81RGZzVDMzL1dCWm4vZHVHQWdLbFJKTktjYlRsODBiZjlYelg3VW5OVnlZSnpWcVZvd3hDYTRuMncKK3FlZHIrRk9kOFo3YWtLcGNIU2NTYlJPcG16cjZYUytuSnFJc2p3Nk1BdlJQUmdaVUc5QWNsN3lKNE8xMko5WkY4UW9tUzVnNUdjbQpnRmdnT1VxU0JjQWRMbzg3dDQwTnhHc2xwQ3gvWVptRm9EZ252VHllRVpYQVhQaDBlcXFWc3NNbkhIRk0wcjFMakVqSGQ5V1h4Wkt0ClB1RzBESkxVUUlUa0NKK2JzVG5wc08yYytXVzR1U3E2YXo2UzQxUWdBTDB0MURCdnhSbmswQXdRcWo4Ym1KclptVjhzaThkSVl0cHUKWmlOOTRsMjhCcS9sZFVjQTIxUXFlajJUbU5TU3hGYnphdDVnemJicU16ZlFNS2xZSVZmcnJhUkdpOTdrdlZmcVJiNkIwQlFKakNnRgo2NWVjYzNvbG5hL3JCRmtJOVFsM3FqVHlHcXpjdk1Dc3B0OWtzUkNLNU1MZWx3NVNPRDY4M1BFZ3BBWC9hT2ZLL1o1bWY3bjFwclBOCnRwWmRDd0JSZGJNQWRrWFA5cGtnYmQ3SVI3YjV2YlNEbjMzWmNtRjNiVWxwUzJmaDIxNE9nOUZ1bDVRV0xIYTZaUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJUm9VREJOV3ZWb0RNTEI2N1VNR1BDcFBnOGozYnRrNlB3dmRzMldicll4MzlYWHVUU0tOeEd3SEF3ajNmUG1ISjNNcXgreUdUSmR6QgowKzM5cG12TXB3bllTM2pLR3NjbTU2TGpjZi9PN1RTaXA0Q1RIYWZJQWd4di9uYnhQRHB5SnlySGI2Q3hwK1pRRGordlA3SnZvNmM4Ci9UU1dIV1dTNWJ3UHZETHFBQzFRcytYdy9ubVlmVHUzZ3R4VDlETFFZK0NMdjh4aEdyZFJxOFdYVDM4dm1YN0pieUxONzRVRG53emEKMllETmFDbENuczdqcFh3dEF6K2xzS2NTL29qTkovRTA3bkhrMCt4M0tlNFhCaXYzSnZvVy9wbURxakNQZm9qK0RML1ZpQVo4K2tqOQpta0dRaDkvbEtHRFpwSmVNaEx5RkpqSHM3NHJ3bFNSNkdmNVpNRmpaNGVYZ1M4OGNIQW9MeENjRWtXRUhuMkova1VDdndORzhvaUd4CjA4MmlnUmlzYUpyVWhPR2dJcS9sZWd0K2wwREFPQ3dJaEpoRXpKREZTTkdmTEx3M0dndjdhL1NiQkh5T3BwSG1TSWxlUjhPanFMaFoKSkJvc0NkNFFQVmtzU2RIU2dkVVhMcFRFMGw2eEVLSmxvTEZRdjRIRTRtQ2phU0E2Q2NueGlHYkYvWW1Bc1poTEVtUElTTTRscGI0awoxSkRSSnhZaWhWVDRKOFVXUVBQTE1ZWXNXOENYYSt5c09GYVJKQlo2QURqNWtsaVAxRnlSNUREa2VPVG1ERjkra1NLcVNGSlpBajVTCkZCTk5FOUVrTGdTUkZvNG16MkttZUZxRUZMM01TUjNnWkc2MUJLdWE0cmdXdlE0cGtaVVFsUVE3d2xkV2VWQk1paDdRc28vQTZpZTEKTXI4Z2tpTXFJc2cwajBrcFFEUTFWalQxc1NHMUpLd01VZG9TamJFWmp1TE9GL1NKSWorY0JobzgvS2N2TlAxYzJWYW51aUV6OW5rTApXUHJmQkgvRGlHVTNZSzljMU1oUnZSY25qUzRmMk1YZ3ZLTE1idSsxQU11bHNNcThtOXVML005Z21DbE9WM3NidFpYeHpJblE2VlhlCm5lR2JIZTUzNU00QVgwem8wS0NCRmhaZVo1b3kvVjRyems5dWp4TjRXNWc1MDdFN1l2bmx1ZGt2Vkt2N0hIOUN1ZUU4Mjl3VVhqSnYKZzhNRVdMRHJ6Qjh1eE9KR3ZrUDhHVnNQazk0UnVSVS85WnVjSDhBSjdleUtVMC9Mbnd0N0NDL1BiOFJ6azBWaDdpcVdPZHNLV2twUAo1eGhIR05vSys0eSs4RnczdmhFQlhGUG8yOGJXNVBhYk1zOHVBSFNENEdmZXJiL2UvTXpDY1FGTENWanJvZjR0em9rRzF3UmFTamM2Ckp4cGNFOXJxWXpuVUM2ZEd1Y3dDMzNldzRqeVU2TnAzS05OcjBMYXVhUHVvKzVSRFppeEhKdzdVLzF1ZUJYS2tHWCtxL0ZtbzVzSjIKZ01BNXlUVXlINjVjdy9wMVF1WXdWQlVSQ1RyeGZSSEU5cWx3MVZlby9FYkdITm1BWndFSlI1TS91eWxIT3V0YUsvdlNyZ0oyQjlKSgpNU2MzRURtbmdxSm5LaHgyc1FKUXlxM0RpdzlrL1J1c25QMS9PZEQ1UzZHMHNzNkJlRFdTTUtneEJaODhwOUxPTkluRjNJbmdzeEJzClRjWkpTZG9wRFZQS3ZxMHpidkRyeFI2Zk50TXZSS1p0ak5HZWFzczFCOFJhQlZXY2ZxSy9NdWVYbjhZNEdQQnd5S3orbHc5TTF3ZGsKUDdlcXU0RWo4dm9kWkFVa0RoMkRRVzVGUEJxNUJ5eXpZL0haM3hxRHkvUWs4SkhET1RKWi9QU3hVQ0xrNE10bEpvdWJNNUJLd2hyNwppMUtjNWJINFA2S1JhZTBwMTNqTmdOMmk5L2RNRC9UY3MyWWJ6MjhkNkdzekQ5NS9BelNOdHpZc3NqcFBYckhhenJjdUhWL21CeEZtCldpcEZ1TytOMldCbFdaTE1IQTdMZGpCZWYwOGpCQWtzblJoQjd5NlBmY2Z5RlI3c2wxMnVuQXVlY3hqdWFSK05nalg0R0dSamlhcVgKZmRBSzduMC9XZVNMRlQyWmcrbXBUTHFjbmlCUVYrL0F2L0hNTm1CM2FwTGswR2xjd3BrR01zbkpZSk41YjdodDhhWDc3UWRzZnJGZgp4T2M4N1h3UndDaDdDMDhIMTRqaXNVdU9NUlpUMUp1cy9BcUFhWk5lSXB5MW9SMFF4bUhVNURmQUJSMlZwWmMzRUNpOXdCWGNmdWQvCmpqOWhHRlh3ZmpTeHArSStMNEtvd2N2bmdXMFl3YzdOU0c4QW1DL1ZOWG9samtlTndPWW5uYjNYVTdiYXcyZlVNajVXbjJlRjJWL00Kd3pDZnd3VDg5RFJXeUpmTjFHYmszUnBUUGlvUVFFWFAzaDlEOGZuSU5xZnBWSDcxNTlhK0pnNkF2bTJRMldHd1VoaWYyOUd2NG5CZwovUUNEWHhneis5ekF3ZTVZUzVidmdOWU5XNnlBRXJFSzNITVd4WW0vL3lPMFlaREcva0MrTzcxZjF4YkFVb3E4MTNkdndyMmJlak9TCkRCVG54Y0hMWkFoc2t3UlVPTi9PNHRTTmZXYURqbGdEcUwvM0tHVUwwT2dENWt3eTNiWVZLbjgvSDdsUXArdkxObHl2aTJ5ejVRYWUKUmNsYStvcmtWdmpzd0RkVnFBM2wwVitvZk5SYzBOaG9vbGVBZGs2K1NRMCsyckpaM3NpaDJkWXJmQU42NWRaUmk2Znc1SEE2a0hIRAp5ajZ5SkJiV0ZlQ0ptQ254YlhsYlNpQU5nazIwZVN5NlhlRnYvdllHMTJvM3pBMHlIY3ZweEdLdWdTVmVHTU9uR3RrRW5CeHErYnlDClIzWWpWdmtvSldrUTdQNktJclQxMysvditJKzlVUWNtblNkTEZucGxsOVRVQk8rRjNBWnI0bXY3OGFuMFVzY1ZlWjRtWGtTdkpPWUQKNXdyRjBlTFBpOFJQMGJQdDQwQXpodkRzVzRqOEt2MmRYSGI0M2krallTNjR5SHdFZTBsOVNSa3k2WEMzbEgvT2Q5SWkzcUJQTHc3RwpEMkEyNzV0Z2tUTjdublZJZzhKOGdMenZPNE1WSFlCSXJJRVB5R2MxSEg0azkrVmtZVjBMY1VZd3ZZZ0RzN0h3L1RiYTVuOU1saEJnCjdPQkxkcE9xYktWNENLNExaTHFYN1hRWHEzLzc4ZXhMdkZqTkpISTd2dVZOanl6cHlCeThzVFBVeVpsczVHdjJYUGlPamZ6Ri92eGsKRTlFejludXd0OEMrUCtobHQ4c1hGNkNZa0ZsWWN3bjkrY2tOSGd3cVhlRnhTZW94SEpCaWtOZ3FXMnhsSTdFbU1odUhoZS9HRWV6SQpsS3FnUjFzMmsvbnMxNExNWnhiTnN1VVJyMlJqL2xWVytwV3M2emZUYVZYR1pMSnc0bzBHYUdLektSTi9ueTh5MGQxaGlPS1NsMWlBClErZENhd1c0NkhXcGRhYVVtU2VFa2l5dDYzL3VWS1JVQnZ2THZwL29zUXNWQUlxeWVJUmgrZ2Jnamw5YnB2UGRPdk5ncDhKUDU0S3YKT2ZObTRzKy9LNTV4RHY1cGhVM2tKazhmdmJEaXVzOUM3elgzQjNZL0FmbnRhLzl5UGhneHBKNEgrZVFvdjV3TDVjSHhXUEJNeUdMUwphYkcyQVMvMjlybS9sMVRva2w4YUpyQjlyZnJRVWtyZ0RxRG5nbFpncXJYOGhlL1dBVGg3MlBjZlR3SXJ4NjlSeVVvYXE1bURlWEFxCmZHOFBQZ21HallGZGMrR0VaenRkTXYrZERuRGlRL3N2MERpSXdFQXNaV0tSbHU3dkQwYUVWc3RDS1dXZEF4TWpGcVppc05OTy84aUMKVFpDT3l1d2RPcGVmVUVkMEMvUGtBTG9LWnpmbkFES25QQUdYd3hrTkhSTHZ3Q29xL1daZjhGd0F1Tm5wVlNhWjJwbjVzc2lZUWVEVAp6TStqSW5iMDlNT3BkckNZRFhtckRhZ284RXNzNkNVMDBBRkp0Q1QzSkJOWjJ4U25vUTNBN1BVNUpZaGx6MGJlNmlSWWc5NXJkcHY5CmRraGpBWlN2UnVWQU9JRDFoQzNpZFhjQTdLUXRtMUdUcEFyWW5sb1hPY1puZysvWUNRaHhhNVBGaURUWkFFdzF3b3JUM2lGVXlKUjMKZStabHp4WWFkR0dLa1VxOXpCb2RITkxXaGZ2eHFmL0VvdzdZZGI1eTYwakdnbHdKK2lBekRBOFhJcTR6MUJmTnVQYzdlV0JueWc5QgoxTXRPTExkZTcwWWlCNTdqTWQ2MlBTbE9zS1NkYjhIVEVNUFVnK3g2UEllbkVtWjRXSU5sbTl2YXFlQjUyYzhZUzJsMVprZk4zMThRCkZsdHhhZ3AvQVUvR2VDQ0wwV1paYkd6c3k4MGFjcFFUMzM4MkczRGJmOE9jTFNSaEFkU0J4aTc2MEdJRExBbzJSZUs5Nkg2eHV3RUIKQjE2bDkxSjFJSVpWQzhCTStxUXdHNndzN3ZkTWNrMDYrVGE0R05pYnZOeEJFZDdubjR1eEVkcFEzS2xqUDhZcFI2QXQ0WlFlSFExbgpEM29vei80ZmN6eEpHN1RNUytSdzdROERIUmxlWnlMZFJURWJMUjFQOE9qYlN6cWV2SjA4M3Y0N0p1WngyeCtZYzlQSng1emEveUVyCkV1cms5SFF1MUpibmJIU3lXL0MyQktSdys0MXhHZGg2V3l6eGZaNGZ4S3AzNnlyNGViOWdENFlSMHhpczRUMGVld1AyOWh0SlpoYUEKeWQvT3JaazYvNGFSMDR2b0FQMkFPbUNmZHdMWUk4bDY5czJUQWV1eWNHMzRXQkJ6RnFkbjB6QWI5ZnBNMENBTWk5Z0xiRWViZVM2NAptczNDbmZaWEp4cEo1OHY1NWNmTUJEMHNVeWJaQ0F3SzFXclN4QjRXaTM4RzdERnliQ3RtRWw5dFlIWkdHbTZNOE95blFNdjNWMkRQCi9kNWxtK3ZRdTBBSmo3dVpvN05yS2xTZkFvRHR6Ym1kbEVKbFR1MWYrNUhXOEx3eFdNR2IrY2ZDSWhRMkpUM256NTl3YXU4cUFpL0kKdFNlVDVKVG1SbFkvc2FxSjBVbTBIanZTVHNXcnpmMllpWmdLS0hjQURPUXJIM21iYlpQQUd0OVpCbDR1dUJtZnphYXRPREYydmViVwpYcnhWNnZhN0c3QXVweHdYemFOZWVSNU16dVRvNjd5RTJSWjI1QnQ1TjU1V0VDMEVmN0V4ZUxNMHRScmZmdTg3V1BpMkk3dVpMSTZzCmJoTkFIQkIvYUEvazVWZ0l3SGFBOFRvNEF3TDJyRUN0TmM3Y1U0ckgzck90ZHFURjBTNjJ5dnpXd016LzNnVWhTMGpsMFR2WW9uYlkKTVlzbG4zZThtQ2dpVnM2ZWJCVmNQLzVwMHRPcjVySlJUd1hDcy8yQXVTQlpaUTBpT2NvemkwTmJlRVZnVE9XbTJaZHFHUjZYTG5xUQpEb1JnU0EwVDJCem1ING54Ky9ZWGVLLys0cStWTE1hMlA4VkJkOWtHQ3NmYmszaDlGRzYvZlB6U0dxWkdmc3JDSnAybnhMWTREVHRECnViclQrUlBaVkJwdTZJbUxvOUVOc08vWFNUdGdaMHUvNk8xRkY3bmdlOERMVy8yZmdXZVJiUldPcnZDK09rNC9BdC9ZQVp5ckpDN0UKeDBKeFBRSjVtY1JYajRXdm41Nlp4MmdzSE9UV2d6M25UdzVFb0pGZlptYmVRbVdkZnhkdCtSalIrRFNUam1vdUN0Ymx0ZS9aOHVZdgppSU9IV2Mzd0EvM1BVSEhTS29ZNHpTakEzSWVHUTNtR0F0Wk1oS1FmUXpFVjZDTUhzSmt3NWhJdmprZS9udXdtYlh3bFI0NHZBZ3JEClorSEorSTF4dzJOZ0R3ZUp5a3U1R1k1MzJ4TXdsemxKbTRpQTFXaHQ4WVF0d09vRE04OEpFSHp5WS9YaHVQbExVMnBSS0RaMEYrdnUKR0pBNnR3ZklVT3RZbktiS0FGVGJ0clBFMnNVUFMyenhEbnhrTUxJeWpNdjdCdG5XY25xQ1kveXZGSnVDSjh4N0s2Q3J3elJrK1RrKwpLdXYxR1NXNGJ3OFB2QWFlT3F2WlpMS1NOVitqTHAwUURGTUxYd3ZrRUYyQlU5aitlME5kRGl2K3NXUnlzdlpyNTZXU09Sbk1UUDArCmowcXdpQi9RSkQvZVVhWDhQL09qSWh5Q2dvTXlUQ3ViS1lDRExyNVkveWdWbUdpNTNFY3lBWjhaT0hXTEUzblkvbVVQcDM5dkQ2dWMKU3ZFajgwUFlneWZQWmEvVE54VEpaN015djJzZGZ2N2dkU01LNmVjc1VjZUxlWVZmZWlFL0RlYW1lNjJ2OG1lcE5JVG1mTUVickJJOQpHRm9BTW1vZFJKTXJlM0MwbG9DQkhzYUgrY05wT1grZ0t4a2Z3TkpBSGpvKy9IczUzendjeC8rQ1FqYmVQUENGRWZMTHcvZ0l2K1p5ClpKbjdRSHdQN1NNQ0NmNFZBdnZQOXZ5d0E5ejlBS1JzVHJFcVFrMkJXOERlNUQ4Q1JKNEhnSXo5NlFhTS8rRzBoU0NtODRjZlZFNDkKZmxpUC93T3ZLUm52ZG9CdEtRaytucWRMT0x6S3BvQ3E4RGd3RkxZTklORVpqRzc3emFIL09UNmNOeXZZTk5pbnJHSVlzUUdncDRlZgpuWEk1QUVON0VvajQrM3dDTDJCVFgxYXFLOFlQVTE2dDlDcGJlcTQrQktTb2N2d1NJRm1OMERvQWFySlhpMGkvR0VRMG9JdVF0WEpmCmphdFpWVUQvZGhwdlpyQnppVUxsQmdPMnZ0MXNwNmdMakx3T1ZzSkY3UURnTVdCY1doSENuVU9ERGhUbzRPejBzSjJNVDdYeGYrWU0KZ1lPYVJzMVRaOVVmNXJvcmdwRFpOVmd0eUUyMkFvdHhzNVB0dnpUc0dJZ0Y1QlNvUHBYTjF5UGE1SVdpZEg2N21hSGl5OG9NVVB6bgorNGVwTWRDdzA4ZzNkRkhlb29VRUUzTkhXQWZCdUNYU1gvekNxZ0wyaWoycXFFQ3lLNHpZVU5IUUlVWjE0VGtTY05NSUtoSU9zcWs4CnA4a1ZUWXAzM2ZmNXJieWlMc1pBR1lQZGhMNTNraE5kamVoNHYzN1dla2tCODF1NlhmcC91Qi9xRXlSdEtwRm1SQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJV0RBbU50RVVyUm5xNWdXNEN0eTlPakkvVUxwTVVrbEdSRVlaeDF1S2xoeEVNejdOVzh2ejMyUXovbGxyTU0xb3dXbnhMZ3BUMzhxQQpLWUtJME9KVk94TWh0Zm1BdCtlOGE3TVVkNkMzOHdTdTZIWnpha0lPMG1iRlNzbWlWR0VvMzlJRDBFWDNjMmsxemJsU1JPV3BJeTRUCnpWM24zc3ZUa0hwRS9XSUQxcklSaXJTYVdEL3BrMFBXa0FjK0szaUIwczE1MXAwVVZhL0J1NitnNFl2dWh0Nk54ZTRhZmNNV3hSb24KbHZFU2wwNXVndTFOSit5Z0JzZEpkVmFEdHhReHp3eG8vUHh2Skl2RzNLblFLT0pPZHlaK3pPK3VlOTNwNVNrQVB4SEJaQ01lWUI4MAoyRS9vUVNLUWJwMXloZTlZYVZVMk54L0g4T3dxeFQ0bDNJL044TkxvREpRZmpWNi92V213R3QycFZkTG9mTzdIako3bEQzZzArdllaCjNlZjRtOUZUN3hhTVhxeE9ZUDdIbmdPaER4bnp6a2J3U0J6cllIQ0ZWVEQ5TWtvRmN0RkFOTndQLy9WUjRnWUtpSEJQc2ZKd25qZFkKRDRmVTR5VHIyVDAvWmFxeFl5cGFUcjc3eUcwLzJDa2VQdnRZb1UvMld1Umo5bkdLdTdLUkRZMGxZR200ODE1WEUrQ3JoZVdtUzAzSQpGNmpGTElCaUZ5L1Zqb2RENHRnQ1NEd1Z6Qjk4bzZiQmpld1lKVThkWXJCZDJiQ1pEVWVZWHppd2h5L3NtQVN3bzJkM3FtUzBvWW1qCmRTbXNmUDVqdEJTTTdoTy80TS9TR3Z5NlZ4QWkvVHg4MVQ4YjBraExrVUVvWGhuNEpKRU9MTTgxZzFXRWxrTWEvcW1Xck5KSWswYkgKNFloYkQ5SklYL0hQb0ltSXV6aWtCaXVIOW1qMzFMMHlTRU5MeDlqZUswb2pEVG8vM1VsaUlUMVRFemtJR3F6bTltNWRrNW9yUnVhcQpHUm1rWWJObGMzQSt5aUR0RFREeSsvbU5RNHFLTEZtMEpXUFNoajhOVzVKSVMyV2lKVXRlb3A5cWpSQlN3SXVUb25CTjN3RW5mNTVUCk5ZaldlYm1xamw3Z1k0MDdBZExnOW9LVmFsaU9SdnBxdDR1UWhrSi93eDJIbE9Oa0N1M3c4TFhjdEdTUVpzYmhDR25CSlpFTzBxT20KSE5LeXdXb0pPQktmMG5OTkdyK081dVc4S1kyMGtYZW05cGEvbWhSU2QySWRUM0ZJd2JvSVdjbVY3bWRlcEpFR2V6Mk1qR0hQa2toTgo1Q0ppYWY0UkwxSklEVmFNL1BvaVplWWFObHRYbTNwZUR1a1lLM2xHSFdta0pTeHJuenNpUFlUVVlCVVQrR1QycEdta1BhOURST0QwCmMvQ1JKbS94YzBVS2tQYVRXQzNpeFNGU2x3aXB3WG8wbGVmYmNIUHNKUURheUU3TXY3V1AvbGdHYWRnY1djM0lnUnpTQWxaM2ZjVVEKVXNoam9ybFc5dkhNNytHNUtZbjBMV0VQeUNLdHp0OENtQlJTcVBtREgxN3NiZWcwU2MzMWFLcVc1ODhmZmFkREVtbkh2bG5JSW4xYgpOa1lUaE5SZ3ZaenJSd25yVkhkSmFhUzFnTFZOWnBLUDBraDNUeVlwcEVBblE3U2RZY2wwa2lId3h3djJucTRXcEpIV1U4WGhvUEgxCkpZbjA2MlZWUVVqaC9uSTUxOTllYUViS0lQMk1ZbC9IdFZjYTZmUHY3dThsRmcySWtNSlVBb2gyV1BGdVpBbDhzTDY1alRKSWUyMnMKK1BQM0pJazArdXcxR1ROZlhxREhBTnI0WGl3MDUyRmtTQ09kQkp3aW9YSDJhMk1YUWtyWVU0NnljS1kxYk9TS1p5RlNENGNVWUlGbwpBZGpmUGFQMEh3OWlwTWV0N1pGR2VrcTdSVE0xZm80L25CVFNYQSt2Q0JXaDUzQnNwNHdBQzBEcnU5UktGUythSzBDYVAxMm93cklwClRDRk40MVd2U0JGNmRzRm5hcWNKV09MNUtrSUtzZEJvTFlmRGVMS0JTREVSMHNNaE85OHkvUHRrRkNFOWhuN2o5RTZUampkOEl2S2EKdHZOUnkwRGJEL1B4TUN3Y1ZMbHRHMnpqc2s5N0RmeXZJL2QwaVpWSDFqUDM5RUx6QTlWYnNNbjhHcXlCeloxbnh2VTdqNGllaHFQNApzRVUvUGE2aUYxSVozaXhOWGFubmxGSjhyY1EvWlo5R0NWZHpKUDkwT1I3WVdZcGRQczhTdHY1VTltbk52VWtUOGs4bkw5OEo3cW1JClltSHppMms2S2N2OE9scTJsWlB0SS9YMDI3NlBpWDdiZHY4d3h1azNib3BmVUt3OWVYcmJTRDJudEZ6QnZUcklQbjIzVHZ4RythZWYKaGZnalF6R0o1eVBySUdLUmZmcDdldDJWWlordU9rU3V3VDI5b05qZmlrd041SDROaHRSSWhHU2ZQaEhCVkZlZVl0YnBadkpXay91MQp6V2lyZkxwa254YXo5Y2xjOXVrVGtUYmg4aFRMR2dtTE15N3pORlRHaW84dVpzNXhSMEwwMU4xcUhOUDAwN3d2S1piS2NtdFVjbVc1CjU4RmowTk1VZW1CNWJHYi95TlA2WjJSZHc2YzcyaDBsaHlGSzllUzJ4MmZxazBDUEVTY0w5RER6UnU5VHJBYzh6TjhXL01jSHZ5T04KbmtJekQvOTVSLzRiNjcxUk9vTEdOMjdtR00xM01CSDJ4MWN2cmMrQm55T3d4MUxtZ0IzODhPa1B5UWIwZEhnUzRhOUhOM2JneDNiUApRTFdhYkFEZmQ1TEZaL2IvUEU2Y1FEdVppb2Z6eU9jVnFOdUR5V0RsMENKUFJ3WnAyQXo5bkE5cHBNRmVYeFlwMkVSK2NaRTl4cDhyCjhuUmtrY0l0YnlxSGRNWkhHbndEUGpJUGJmUTU5OFpET3JQWnpCeFNaUDJ6U0FNaThrTHJuNTFwYVMxQTZ1d2g3NVdQVmtEZ1IwSVcKS2JMK1paQUNmeEJZL3dNT0taaUxZSzVmc2tnQmdZOUJlYVRRK3BkRmFyQkMrMzhwUGRlazBhZUV0R2FYUllwc0NnNHBsSDBCV21oVAp0QVNyT284eDZORW5laUdjK2Y3c1Q4dDdnL1BmaGkvN01tK0d6ZnRCc2Z1aStsNW9TZk1kclMxeVlNNmZXVnBiWG9qdXlQRUhxZFBrCkJXaFM1UGxBS3hmYlcwWWs4VEMxMGNQOWs5bzVaaTNhV1ljNmlmTDNVenRuY3NkQ2RDQVFxVmpaOG90R2tZcVZQZ3BBY1kyTEVIT0EKVTAwMCtsVFJTdi9qcVc5cEJNZ0VaaEN3dGlVWUQ1amM0NDU2U1JSOUFtb3Y1MS9PQzFiMm55YmZZcVpqWmkvc3l3V0lwY1NmN3VncApUY2VVd0pEYnIrQUxHelJvenk2R09wVGRUcXRqM2d4ZWJVSUNzaEUzTUdEc0tXUzFvbjhnUTc0THZTU3BRYTFpRmRHZytFTWFudTJBCmRlc2V3cDdHZUhFMFVUZ1FrUnhveTY5enJxcEdkUGdQUFhqS21aZVluOTBvT3orRGxac2gra2QyQlpuMWV6T3ByNStablorTDVqR3AKR1VManRhMUFMTzNydDBYOFNYa1dHb21sQUF4MzVYNUpXVkFHTGV6T0VDdmgxY1ZaSEY4SmRtU0tzMHFmZS8yVWw2UTdNRzc2TkNmZgpUSGtpMTQ4OUtkUGRJRThzb2VweFhxcWVRVkdvZWdLeXFzZWd4cnJGejhxQlQwQjJ5QUlDMmlqVkkwMjdBYnlLaGlHd3pIZzhSUS8xCkQwMDdmQ05OdTU3WEtLdTI1YVFTeGVNa3A5WXo2WjhhZnhkRGt3dWtPNjI2R3FsTFZSdDltaUE1a0lKYk5DditMc2FiMWZ6Vlo2TlgKLzBLTkZnR1d6bGJYaEtRMERPQWQ0TTUxZWJSbHhaRFA1eU9uRFF5dVc1QlpKczhPSDF2c1pUUUdLczUvSldFdytWMTZ1WFUvTXB6RAo0MlFVMUpFR2htc0ZKZ1VLMFoxM3l1TzZsTHN4cVZYdWxLVU83SlZqVS9lc3VKWm0zTlBHUGZDZkR6ZnZrT0tDTFlCbWRCU3JVc3NKCktNWmZVUGdQV0ZBdUVIM0pHMkIrckJhODVJMlhCanNrM3JqUVhFNGx5WkdsU3BPajNDUXoyUHpVOWw5WVlaZEx3bmw4ZGZmbGtzeEsKYWxhWVZ0V3ppaDROVnRtTlNZUE55TDBNckptUGsreTJaTERxV2Q4U3BFbFp2L1VrSmZ1emtsQlBTeENydnVVMlhvVWhuZEpQc252bApTNU1lanhhVERneEozcUJqbHM1ZzFiYUN3TXRYTkN6VWJIN0JDbTZzaW9hRmp2VXJ2ZjV4b0NoT3ZnSFkyMGJEdU9CVloxcUFDVGNVCnZlTmlUbmhwWUQxbEowYlBKUGxXM2MwVUd4N3VTREdoUnRNNXJwMHdEak9LSEM0YzExUHFlS1YxTERoL0FlTXBTem1EY2dhdDVBWk4KNUxwTG80b2U0eG5ZMGxKNVNwdnVKcFc1N3Q2aXoxR216bU12VnJJTWoweHFIRzJnSjY2Zk9qMlRUYXZ6d2RxV1l1cWtqdXkyckJwRwprRFlNeXlLbElDa3Y2c3VVT2lxN2VLS0IwSng4T1JRVkxhQnBJQ0xiOGpxYXFJZzlieUNVait5VzJhSVdaUmk2L3REaGsxT0hrc0lrCkl6YTNoL2c2VG55OGdEYjRWSUU4WDlTQlFDYW9BU3hCbzRJTkk2aytaQVNrb214MkdLeDZCbVcrVWdFSXRTVVV1YStUVlhsYjFxb0EKS3B3QzBPcnZ5OC9Qcm9Ia0JtMUVGOWdLNnZFTXNTWFB4ZnArSy9CUTcvMGVURlU0NGNXdlk0blRESUpjT0VuSFI4WW5CN3kvREdqbApUL3JFU29sWTJrVmMxdTFCWGhJZ2xrNFJGeENMRlhIMGk0QWx0dklMQmZ3SnprVW80cEpldDNwMENYQ3RTVnVFUkNtVzhDUU95WXBICm94U1NGVVZJL3A2RUZyeU1VNndla2dWVDR3a1N2ZnE2d3lSUE1DK2hyalc4d1hwSjRxRThuWVhiOGhYaERjQUhld0pOQ0dXcVhLeVcKOXJVUzdha3ljUitEVlNsSzkvY0VEM2Q3TjhWOUlGblVZMzBpVlNBVHI0SFVDV3ZpWko3ZUZFUWFkZ0pUT25NV205S0FEK1NEaWJSTwoxbUJNUXlwWHhhYTBIdHBSOWhnYWoxVjVQRnJqQzRGME8ySVhjUVRQRjlPMUVWWkZsdkIxOGhKdk9KV25wczduVlc3elkvZVhLNkxSCnU2cDQzNU9ia01HcXdPbUFkNFNiM2pVS0lOMjJoZ3dxYTY2Tk1FT1ZJTDFCdE5YSjJiS0FPcUtOVG0wZjR0dXkxRng0V3gwOHJMTHoKOHpmZ3JNQjNXcGhCVnVwNG5Kd0g0L0hwaTNsZnpybjdKclhiQ1U5Rk5SOUJBbUJ5OFZhcGFDdmxXY2pGV3lFd0hjSW43UzhCb1RGWQpiejZrUUt1bXZPVVpOTU1ST3BMNlJrT2ZpVk53YnBWQUNncnJUWEpRR0oyc0I0NytmWS8xOXlXQUNVNEk5VzJpd3ZOQk83SXVQQTZoCnhabEhhYXAzT1dISW8rUlRnMVZkRERWc054QVk0ZE45eGlkalJNQmNUcGNtVXZMTXovaGVzSXVKTmRweDVielFhTWVWK0FCUGcwYVQKakpEa0FXRXkrMXMxV3B2VGFJejNxc2VDRndOVDEyZ0dqU2RJRU5qMUdvMlZ5bEpuZXdlTkJsWk5TcVBwbG4wQVI3OUd1NGhkVUhCdQoxMmdReXUxbnJ3aU93bW1RSitkZ1QzSDhCcXVVTlNEWWhEcGJKUSthZjNRb2JhTUVQVTFodmlYd2VTNWk0L0M3V3c5Z21mM2wyNzZYClYwTWFMYk04a1BPWGs1UXdVeEY0ZldvV0FPc1lkU2xaZzFWV3pWNlovU0FVNWc3eXBRV2UrRFVHQ2xnMVVWS1RuSVpSaDZQTnRKZUYKZ3VJd0FNN3RLUkFJaW94RExUcDVWNGNqUEhUWEdGNldPRTFBd080UnE2YjJRakEvTjdRdWhMc2grTlo3aTMzUFk5S3hxWG04MmVQcgp2bXVOWnZGaUY3Szc0YnN1KzE0NUJndUIzVzdmZis2bDlrSzl1eGhjTmYwaHJjdGRETUs1eGI3blFXSDN3dXQzTVFSSHdyNlhnc0o2CnJ6Snd0TzZHeW5zaDBqQ2YrNXQzUThGZU9CU2ZFeU1zNE51N3BDTkIvU09aaDBYdmxZTGtLUzROUTlZV0dCNFVsb1JQU28rRzA3ZHUKOTVaWXRTak9ENERkS3QyOGNVbkl0bkt1dFFMRk5KbTd6RXBDTEhJZUVWaExueVk1VnpnOXpRTjZkdndLa1NzTjZYU2lJY2x5Qk1ydApVUlV2OGNhVTkza3Z0cVc4ejYvSnI5U3dNUkc1N2t3MlBVOCtjMDNHM3djakk3U1JVb053VFk3M3k3WUZ3R1RQYnRob2o5YUVlZ0FzCllFbFVhL2VJa0FDS1JmU1pHREk1aUhBbGh6NU5NVmdLbUl5dzl4U1RieW1PTUREeGUwMkQwc2dSRjhKRjc4aVU2SEw3V1NwVTMwaDYKRnZRYW9HcTU0OExvM1RTR1JrOW5VRFI2czRFQnJKc3JTbFhRVVRlMzNGNUR4OS9GTGl2b1JCVkRWOWZRS1ZmUUlaMThoeG82V2FTbwpnazYyV2xCbkRaMXlCUjIvV3ZDV0dqcmxDanFCMVhkRERaMXlCWjJnV3ZDR0dqcmxDanFGYWtGZE5YVEtGWFNvV3ZBT05YVEs3OUcxCjFUZlgwRjBJcnFDQ2p2VXNicXloVTY2Z1EvYVllZzJkSUNGWm9jTHMxVTVLV2R2eU9mRHlsVUNpWkJjTlE1S005QmJVRTdkZDJ1cWwKU0pHUGZIVXliRUZzL1VvRUI3UkdlajhLd3QxZTM5THh6dmdLNG9TTnErbVVjQW5ZVlZncnl1N3hEaTNGWVBQZmVVY3RpQ0k4NDFNQwpwcHlIcFcxK0tOYW5Wam1uZVg2aXlOV2x2R2dudWwvL2tHUXFIMVVpVjBwRGtpcVpnM1BSVlRTblNkY1VSYWtnWEc2UHZnS3FrNjVVCkVDcC9URElaUkgvWVdDNW9qRzRHdXpsZTFmT2FsYWRtMEZqc0pzeUUxQnNZUkp3TTF2eldpREZWN0NaM2JDUDBrZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJMUlyZDVQMVQ1UU1IbnJZc0tpYURDRnhUTlRla0tLcG1FRlFLYXdNbVRNSENMMDlzSnNSZXJmSlJtODRhazdxY1hpU1ZjbTd2SkNDZgpRcW1yeEJUVnZ0VTFWaDJxKy9hQVdGSm4yYXc5ZGhrNlV3c2NycUk3VVpnRS9MWXRtVFI3eFlsVlNkYnNrcTBDNDFsSzRqb3dWYk5MCmN4M2ZXUzBIWGtjZDMwU3Qvc1VzQ0ZySmw2YkpGOEVvbTlLWE9mRDJ4NlZaYmxBWnFSSk4rZlZUellIWG5FVXdLd2tqbUpMcnA3V08KTDNwUXE0bFJZZ1poZGpvRWRyY0swUU4zOGlGWG1hSUhtRHJIYTZlWU1NQjZJOFZVeTBTMVQ1TFRhRmRSVEJqNEpYTGRubGVZNkZRVwpKZFpMVkhKcHMyVXZZcjZYYmhZcjZrM3B1S1Z5dlp3SWhBeUFsVW00STB1QUdCRURIUDR6VXBUdXNnWm5qL1g0Vkp5OVJWbXpzeWNIClFKeWplQVVJdGF0UndEcXp0MnBvSzVXN2FvV0dtUHIrd3BnMDBtSUJTOXpVZ3d3R3haQTByRXFUY2VJdTJGNnBSczZnVXVhczRjZ1QKVFVqNXloUERoWHVsWUVmR2p4ZXAvSTdDU1FQSmVTY2pjcHo4VzlFWDNwRndsU2hMU2FWQTdrTHJ5RmRFblNSMzh5dnNzWXBXaWVmawpYZFllKzYzb0MrL0lsOW1KTTRpdXB0TlNKZEpnRUxrUzhpeWdNeUlqR0pLZ0hoa01pdEFUL2xBWWtsQ1kxWGN4QlRvRnRRNUpPVHRkCnZTaE9hVWppdXp0OG92Z3ZWWkowajRqTUU0ckkzSmlsQml4aGk0YUlESDNHcDFLZVk0bjdiTGRFWkhqKy90UHRFUmtBd0tHUTNhR2oKRE8yYWlNeEZ0ZUR0RVJsWWhpYUt5TWhWcEtyVjV3VjFSV1FrNC94UEdzcHp0Qlhud0JJOUlIRHFuS3d0ZlErMjZzQ0V4bktWTTVibAo4OGExR011QmROdHQxc0FNeWpXSnUrcDlNaG5ndXNRYjl2c0VkY0RVNGc2Vm5GNHRaV2hYSnJEejl4ZFlRQ1lmWGRKUlBuYVJ1aUJaCkxhaFdWNmM3YWZZeVF4WFYxV25NMTFPc3ErT1ZqaXBVQ3FzSFFhdUtsMVR4cEpkbld5cW02cjFlM2tVS3Y5TzQwVEUxNzNLSlNmZXAKaDROWTdwRlRwMXdQcC8vK3NXdnE0YVN5b0YvLzdsMFBkME9kaFk1Nk9LVU0xZnZWdzhHbzlZMFNxS0VlVHVKR1VOa2lydXZyNFFUWgpVTXh2N1BldWh4UGZPMHBWeE4yN0hrNzFsb0M3MU1NSlRxdzBwRnBlVnc4bjlzWGtqblZnSmR2dGxmVndnN3RiVGlRQUpjeUpsTE10CnRlUkVkcmFhY2lMVlpQKzRDdHhxQnVSUmdzVHQxZWdJamtkdDlUWEMwVkpISWd1RnNzY1FuRHRVY2wxa01pamt3S3RyTkZoY0p4OFEKdTh4MzV2V3lrY2w0dHU5ZEZ4blA5cjNLUW9pRVVEYmEwKzNjSW9aYzhSRXZxbkNyR0FKZ2l0ZktTT2t4V1RIczdiU0tvWUkxRHVtdAp6MStVWkxUNzNBYU00T2dUSDVsNlpBRG5Mb1dRQmIrMlhVd1ZqdnlWd0RLM2FjbWxXVjllQ2F4Nkc1b3dLaTI2cmRIcHVZeGh3ZUl6CjVZdWRWQjFxdGlJVk4xMmJJTUticzl6RndsZFZwSTVOUXcxRnBCb3JVc2VtaVphUWdVcXAzMTBxVWovMzk2bEloWER1VVpFSzY4VnUKcjBpRlVPNVJrUXJoYUxzR1d1UVNTK1gxSVFHUnZ6UlZkNUtSMDB1dnZsQU11emVMb2FnVVRscVAzYnNVRHVYeksyYjAzS01VVG5KZAo3bDRLZDMzY1VrZ3haZDlkaDE5NVF5a2MvdzRpVkF6M2o1VENTVVFWL29GU09PbjRtRWIvcktka0dQSlZBZi8rWktYQ3A2VnNycXFXCkcrR0Y5bGplcCtJV2FVMzBncUJDbWlLS0dnTElFSmo4elhZNmJaaUxTNGIxSGk3d3F0RjdHbzl3bEc3bkJhcGNhc3Zqc0tnWE40dnIKNmo1bHI4TVJidzVNZEZSaWUrRGtGM2FOODBqaG85Y0F0YmhNdlN4TDY4NTRXRERQemtVeVpza015RmJxdFpqeG4reEE4NU90ZEtTSAoyb1lYK3NWREpsc090NTd5T2Q4MG44LzVxN0FKd2R1TzJZNnNhK0dRNllpVHNCWkxxdW9NZWtsMGpkS0hmTjFadEJGLzViT1hzTmd0Ck1YMnA4NFBQUEtTaHBjdWFORzdsS3V5Q3ZhNVNzZHZNTDRzVUkxczVwUW83Njh0UGZTeUhkS1NBdE9TTjhaQ0thN0hpN2lNdkNpY3UKZGd0Mmx6VzJNNkdvQk16a1VDcDJ3MzBpcE1KK2ZJay91UXE3c05tOEQ1OC81WXJkUHBTcXp2NlVLK3kyclpZc1VsdHR2cHpKSVowcgo5K05yZE9XUkZwOC9TckxrdFd3Q2lhRWMwb2F3d2c2dEtoQllldGJvRTgzbmNZM3ZKYVRlbzZJS2dqZURuelZORUlQT1YrbzlldXVzCmhTVU0wV2ZHUzBxUjU3VjRRMVdLSFd0SXVSVmFzTzROTlJmQkdkR3JiWHVmMGg3MURGVngxRVMrajlWZXc1QjQ1MklLZzFKTFRsWEwKODZDODEzdDJrcE5xT3lKeHA0cUc2SkpTSnpsZFViaVBndVlVU1pWcVNIUW5wSTY4UHJVbWNvcDVmZHI1U2FXSm5PejhwUHErcVRVYgowVG8vOVY0RG1vbXUxbWRFZEpmYURmM2p0TXRMYVM3ZmlFZzIzVlZyQXpybFNPODExWFRYeFdIMFZ0TkorUUZNTDg3N1ZkTnB2Qi9tCnhtbzZxWmlnV0Y1dXI2YVRxcVc3dHZKUnZwcE9LaFl2bldsL1N6V2RnQ3kwekVyZVAzWlROWjBVS0pVYlFxNm9wcnR5UjlaWlRTZDEKVHNQdWxYZXJwcE9xcGVQNysvZXBwcE9xcGRPWTI2T2ptazRxMXM1MFlMOWZOWjNVNnFKSTcxMnI2YVNNRzM3dTZIMnE2YVJxNldSdQptNytobXU1eVNFdXp2S1YwYlRXZGxIRnFzTjY3bWs1cS9TU3lvVzZzcGhPRFV1MHBmRlUxblp4dGVkOXFPdTBVdTZXYVRnUktmQ1orCnAycTZxeWltdTVwT3NjYnFidFYwMHJYVjk2Nm1rd0lBc055NW1rN3F0RVNVQTMrSGFqb3A5U0QwWHU5UlRhZHlNbktuYWpyMS9lVWUKMVhSU3hPQ3M4WHRWMDZsVmN0Mm5tazZxbGs2Mkg5L3REcUNYY3dBRi9jVjBYZDBrMzhYcnNrbWx1RGVIeHNLbnZZcXdDNGdmM01yMQpzcm0rWDkzRmtFN3dsT2ZlL2Vya3JRdHRkRHE1N2Jyb3hGRkprQWtKYXpKVkRRdU5MQ0FvVUpDcGVwWWJsR2hJV2xXQmh1NXl3b09wCnE0WUVLUVlHcGF2dHN0S1FwQk1wWkRXTUFwMFUyaTdMcUV5NGl3azlvalQrZEJSNVJBRkxiS2ZTMkZ3NU1zZDJ5MUpxZEhkem16dmUKUFZjYVRmSnIydHpKZHBlcmFxcFYwdGptVHE2U1Mxc2huYVlFQ2VYOFpLN1IzVzFyVmVydHRIU1pVWXhTYVdwenB4cFJoSVM1dWMwZApiY01vTjdxN3VjMGRWZnVtMHVoTzIrSFJybnFIZTY0QzZUYXV2SWphNnl5cWQwdFIybFU1ay92cVdoNHd0VWVuVnY2VVBlV0JEZXBVCmN3L1YrQk9XMFVIbldURUNyNm1RVGt0R3MwRzl3bEEraVVOemZTSEFvcEIycUNPSkRGSkhOdlFuNUdSdEhiWUFack5kWEU4RUwwMlYKbmJQVTNWQnk1ejJsMTc4ckM3c0UyVkNBcVZUeXdUVm5Rd0ZRcXZsam1yT2hBREJ0R2QzS2ljMUk5OTJsOHZIMm94RFlVVkRoT25CNgo5VFhDMGRUYlZRb0tMN1ByN1I0U2lLQmNWTEpMVmdxcjE3SWpZSm9LYStWNlFJZ0xhOTgybDRXMWI1djczUW9JZ2QybGtUSGlNVEJhCkxjcU12M2ZKa3JJbFJVclZmcTlLT2RTdXl5TmRXSWwzbVVHdDZJbkw1VkRQajZ1N1ZLYXdOeC9ydHlRdVFkWE85K3BnQ0I2OHloOFIKYTViOXRxNUcxWEtuYjdEeDJzM21CQVZGS2F0VEI1dzczQkpBd2JtMVd6VUZoUkZDcVJzTzllV3F0alVVTXVnNjRYVzZKY1N3bzZHUQpRVk1FL3VZT2QweDlwVnlQdXl2RVVDSzU0dHErMWZvNjNDbFZQdDRnaGd5ajBSM3U3dElwVDdXZVNGdW52RnZyaWRoT2ViZUxvVUtICk8yRmRrcGI2a0dzNjNDbjFlNFU5N3ZSM3VOTjZxem1zZnJxOXNQWnp6NWs1Y3Q2cjVzSmFBRXpkekRGb01YU28zblRYRmRhS0t4OUQKdDhhUFlIMWhYYkljV3Q4OVZ3ak9GWHJ6NG80SUNPY3U5WngxVEpzdnBncEh2aFpXVk1Sa1VMdG1BclhMMDFQZkxsWEV4RDhWaFFyQwpjeUdHY1lmS1FtaUlhekY5M3pTV01Xa3BZckkvRHNTZUtHOFgwMUxHSkp5a1N1eVVBOFd1aTJ3WlU5eWhxVUpkMFcxbnBUTHUwQ0tWCldvcVk3SThic2ZGOXJWL1oxVlhFSkpkQkJIc25LdXkwK2d6RExsM0RlOE90L0NMRFVPS3l4RzZQNmdGeGp4clh2RS8rVmpIb3YranQKU0tlcjNTTWlwYnc5MXJ2ZjFWUTlkUHAycHhyWG51elZWUHB0bU1sUlY3dEhsVTU1L2l0clhIbnl5YVpoYUtoNlZxOXhCVVBTWFBXcwpWT05LUjREZ1F0UWkwdmdZMHc5V3ZKVWZXNFVWbnMvNW45NEw1dm5UbThGYVNMdmZXby9ia1RzTVBwVmVVWFVmMmYwa1o0UTlaU3BRCkd3OEs3ZkppeC9RblFSSGVjN3JKUnlxb2h6TllqK1pPNzVVZnFoTDJZWXZuUDNveTlYQk8rU0s4dzNrVXg0VTZXVlNHaDdua2F2L0MKWmt1azZmeVNLOEw3bEVVSzVtSWlkd0hadVdJbGM3OHRpOVJlbWZnV2NuM1luQnhTdHBLTEkvQnJpT0FoRlphbUhlMFJHOWRITUNDcQpjblE2MGg5ckthUUdLeVN3dU9lY29BeHZMSzc5NDVPM21ueVZRUm8yVzRQUGhSRVhneFZYeEEwVmtKWXNZWG1rcFlhNUw0VVU5WDJMCmxnV2xsV0trVGFVK2d0V09QTkppc1UwS01yc0FXZ3Q4N21FLzBVV1laOWVqWDdqNk11OEY4cGpzZS96NlNtemtpbWMxUUhUSHQ2Y2kKdDAyQ09mZUNZcU9UUGF5aG96M0N6VE92RUNkbU56cU5hWk9BcUNFbk9nMFNkREZUVDV6VXNEY0QySS9pd2liVkNJbDhTZEpsYXBYcwprQ0FueXc4cXI2VzBTYjJ3Nlhpdnppd29vS3ZTbVVWckpLbWduRm9sdTNRWG5Wa0FnamM5S1doS1ZYZWlteWR2cUVwVHlkQ2txR1RRCnhrK2lReSs5ODJPajFyRHVUbmVYUlpraFhXUnBpZVZGTTlGMVpXa1pyRXFEa284VDZ4c1MwSmJ5ZVZyMGVDNXlZMFhxcXZpWmNna1AKcjR1WFBWT3VjeVVBN0lxR3E2OVZZckNENHIwdWIreDVqZHB1T05SUWphUVlYdFo2eWpNbzNuSVRMVmVUZUhGbDNGWEZidEpIMXJydQp0UjRVcjR3c0MyL1JoRldBdDE1Q0szVlhuR3k5bUpyWGNubFhuSUlESkIwZkV5YU5TQnl4amtsZC9RN2tOUXg1Tng5NVRJbzF6TFduCjNsVEJuWndjb3hNcjlmWjFncEdKNC96cUlUdlVqMDgycWhMY1h5UVFyS0lIL2ZhSVRPOG4rMk5YL25CUVh5SFpSVCtMRzlxeUtWY3kKNmFxeGl1bTY1NEEzSkZIOXk2eWtGRHRXdGNZRlErS2w2dE9uMVR5cDFWa0t1TEpvS09YazMzT2xVQXFvMXRKWVpmMjRrL2RaU2IxUQpSek16aVBvYVMzYVowUUZNcll1T1hWeGRxd0JNdEt2Y1JqSFZXaDd0a3hTZVhONUlNZFYrT3Jvb1ZndCt5Z0M3S0JlV3NnNXBpbDFaCkJhaTFCbER6UFNSeUJXS2FhZ0FWc3RNMVZBRnFyUUc4akNmcnFRTFVXZ1BJditGUWZ4V2cxaHBBRkxXK3VncFF3Q29LSHFZNEQxWmYKRmFEV0drQklzZXVyQURsNkt1c05ZWTJWM2lwQXJUV0FySTk4VlJXZ3pKQXVhZ0Q1NTVYVWVDNW5kWHRUUHUwZDJXNXB5c2VieXovWQpsTzhpcXZDUE5PVlQ2OGgybjZaOFZNMklzb0Z5ZTFNK2cxWENLcng3VTc3TC9zai9SRk0rK2Y3STkyektwNmwvNVMxTitmaFJCVGlvCnNPeWdhQktwbFFiTGQvVzcvVzZvcDN2Y0RhV3hyNSttdTZGdTd1dkhtOW9kN29hUzYrdW5MMC9wMnI1K3lsMzlycm9iU3FLdm4zSlUKU05vVDE5L1hUNXI1Rk8rR3VxS3Zuem9uMzZPdm4zSm1DQnU1dXJHdm4xb2wxNTBDdW9wZC9ReFdYUUZkMmI1K3lsTVR4UzZ1N3VzbgpHTWhGVjc4ck9vQkk5dlZUbnBCVWh1bzFmZjBreXhHVmJqWFhUaGpObGJLU2QwRmYwZGRQK2VZdjlrejh4cjUraWh0ZEh1MWlkK2pyCnB4d1cxblVEbFVKZlAyVlhWeklMK29xK2ZsSmxrcHpvM2RhUDd3NDE3N3I2K2lsRGdYSCtlL1QxVXo1UU1XaUdjMHZodTdnaTlkcSsKZmhLbUpxK3JINzg3QTNaRFh6K1JHR0xDcm42Q083dDBsNmRnYkY4LzFiclh1L1QxVSs3cXgzTHlqWDM5bEJPdWVSV3BOL1gxNCtxMwpwSGhSZE0vVjFYMzlsQW1JTE5nNzlQVlRrTFhqS25DbmZud3VaU2lhKy9HcHRKUFQzSS92cHI1K0xCUko4ZEZielhIUjEwK2g3a0UxCjIzYXV0Nitmc2lVUGJ6eTRSMTgvdVQyOGMzbVNlRjM5bGdaem5qbEpWQk5EdGI1K3l1Zk53aXlDNi92NkNha3Q5Zz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJRnEvdHg2Y3ZTVU8rSDk4ZHhJZnQ2bmQ3UHo0dFJVeHF0emRjNW1yb2E4VW5ya2k5cmErZklMQjkwZFdQcWhpNnZhOGZXeXFsMUZmMAo1cjUreW1hT0RJL3A3dXVuM05YdjVsdWI2TDUrTjhiNk5QYjEwMUQzZW9lK2ZzcGQvWFQzNDd1cUNsZWtMUy83K2wxZkRNL3I2c2ZECmNsTmZ2OHRRTXIrcm45d3RaM3I3K2ltbmQ0bDJzYXY3K2lrbk9vbGlTbGYzOVpOWUYxNVhQK1Y3NGJUMzlicytiaW1rbVA2YUp4bS8KOG9hK2ZwemlrdXJxZDNYMm9LaXZueUpIOERxQTNOYlhUOWt3cEx6WDIvdjZLUmZFMGp2eXpYMzloSk1VZC9XN3NNYzAzMlFsN09zbgpid1JSTm96S1RWWWErL3Bwc21GdTd1dkhYOG5MQXh5RjZsb1orWlR1NjZlOE9TaFdjZDZ0SUpiYTkvMFMyME5meVVaN2FVdG5mSWp2CmxWcFNOeXFLOWtyd3JYeG9Wem54WGxTMktPQW1oc2U0MDV2VTQ0NWZCMC9GcG1oVURzRU82ZHR5aE1IOEwvTXdTODluZ1NkYU84TGEKTitLNE5JSnQ1Y25vL25pMllQN3VLa0s5Qk91cGpKWjZxdUxESEJ1amYvcXhDd1lPeXljeXRmNktOZG91aC9mUGFjL3RjMWg1OFp3MQo3OCs1c1BGelBBdUFUNk9NTlJSTmxHMzFsMzB6dEYvMVBneldTTWdYbkViclpOZFg5UjJNb1ZvcE9NbzFWKzMwN0swZWZsKzI1cytoCmZjY3gvN2E4WjUzQndxK3AxYXl1NHV0a2R6dFBPemI3WVdSdlBXUTI0V2ZqKzNQYWJnazRTbUhyOTBlbDRqd3Z6Ui9CN2VjOFRzcysKcXUxTXRWdHZIYVBQUGNnWWljVys0MDRHN0JtTXpGVnpHUGs5ZmNKS1lWdnpjQmpGSElkajlMMXlOQS9DazJObzh2SEtWbHEyM0k5Kwo3N3N2VUl1Wm1MSzNYLy9oK0xtRnplWmlacXEyK2xLSENPcExFLzNhTUphZE5uYlFvV1piUU1KK2t1Y1JiblZsTTdVbktXSWhZb0RwCm5teHdYUUlXbyt4Y1VVV2pZMnlmdjVvNy9WYktzam40U1JzUlhKek42NWx4Qml0Sm41amlVT1Bac3dzK3czeTErZ2JWSkJxelpLdGwKeFN6ekdmTDNYN2RDazMwbkVoOHd0ZGM4cjJpT2k3ZnlwZ2JVbWhRZFVtRnIvbXl3RnZya3ZJc2FhT2EvU3MxdStEay9NMlg4cCtSVAp4bitjSmNpWWVmVmFmTThFQm9Cc20xUnAzZWwrWnN0aDR3VEE2ZXdac0ZUN1RBZnVYa1ZnS1dOdmtFblVqQWMwcSt6ZkZuSnl0dnIrClBuUVhPOTB5L0FRbS9McjJ3YUpkRCtYV3AwSzlBL0tjTVAvSkFiTVJoaWRLRS90RFBqdnpDWGVnMkRHZ1NHUUQvb3k0VU5VdlVEaVYKSGZqejBZTTBqTmtPZHJHUEEvZ2k3Mk4rU1BySklsR1BBckJsekYzd1dNK2tvMXlwNEI3NzhxODRYZTFqbUQ4VmNhS0J3c0Y5NGE0OApuc2ovalAwNGVQRG81ajBZVy9LUEJpdnpLTy9sSGhHNWZqdk5QS2l3K0twOGZGNUxaY2tRNXRrSlZNWjJoWmRxcGpIN25adDcyV0RGClN3UGZsSDNrNWNFcDdlSVkvTTVQMjBlaFp3eFdHZjNoNVhDTmdIOFNGT3pKd01yQ2JyaXBWeVk3SEZyb0RTOHZCbXNoN0NrSFRMZHEKK0tpWHB1RThoTlBBWUhMWUFaK1dYOUNmTk5ocC93T24xNnBIdXYzMXQxVUFQRzE1MEZQQ0dZN1BHS1F0SDRNRmMxcWlHTEYrc3hZOQpNU2ZnRHF4ajRmdjdJd2Q5TEVjeHcwWDhpQTc1QUloK2l0a2w0QW56eHJWRHhIZ1FjYi81bUhTM0U0ZHdxaDE4emthK1pnNG9kVG5DCjJYOHpJbGFCRk90OUVPekNqd0tXWkhKRURwMGZWY0o1bnEyWXFiOTd1QVVqQ3VWSHlOUHZQb3BFaFg0Rmh4dTVoU2hNWDBMMHAzV2IKb0QrZFB3YTBiVWtVbmVNaC9ZbFloQ0NJRUFWaTJNOUFpSDBmck5mWUVzTjFEYU4rUFR3M2FkZ2paNWZsdGo3Qkc4MG9NZnRGRHhERgora0ZXS2llOHVZemVqWG00MHlSZ21rSXp0L1l0WE5uWDZYZXRVSzBZM3poRndoN201Tm5nZ0kwWGMrQk9Fbk1CNjdreVo4Yno1VWZUCkNOaUlkaENOTm1CTGZJVG9UNFh4RC90ZWdINnY4NWNWaitZbDMvb2lDMnZUTk50c2Zkb04xdUxFbTNtSG0zVVM1YlBSc24vYWhTbFoKRkpvT3drTmdtMEJ2c21ydFVtOHl1eGpVbkNLOUdmOTYyVHFLNzduNlU4NjVQc0JMQ3NMbFhCSHp0UzcxcHJqdHNCMU5IS2kxS0xxaQoxc21lOFFIMVQwK2p1M0pUcTVyckRvNllmMlh5K1g5TXI3YUFKZlozd2pDSDcwanJNYUF0VVNJNGlyZUNQNE5PVk9hTUZ6OHo4TSs0Ckd3YzdSd29xUXVnak13di9DWDdUZ1NxbDdFTjJIVXk5OGFGSUJGUkNNTkpROXN2RWxNcVl4T3JEQjFVSHpIM2R3em9MYkROaUZyVHEKb25TSUoyK2RzTjk1Nk8vYU9PVHBLdUNOU0tlY0g2MnlNNEZXcldGWWFGS0ZDMUhGK2Rvd3R3OGpPM254QW5VZlFORGJvcTBGVHYwegpDNy9ER2ZPc0ZxRXBVU0s5NkJYZ3lUWDM0TSthbjRFTmRTa2NEZENsbkxLbU5CK1lDMUNwWHMyc1JGbDRGeWNNZEhSRjNLQVdOYlIrCjlQL1NjWDdFYU5qY0ZQSnpaaVg2RHQ1YTBNQm0xazBCdkg1dzg4MGNCQ0taZnVNQnFIeDZmRUlBeTFSNzZLTHkrcG9uYUdDMkJSZEoKMUk3d096UDRMbnFtckV4Ym4zamltZHFVMlpWOEtiSUFHcGNBemhRQU1CY0tSTmxXNWx1OWdPZmQ4RVlFdEFiQUVIOG1ZSGtyMkpnOApaVGY4NUdPLzg3UGZnWFh4dk8yaGZYQ2dtQjJ3ZlorM2k5azQyd3YyekI0eEp0WWp3VmhYd0NpYldKcWZ3R0FJbHNROW8ra05BMDZJCnVtNGladVI2UjhOZTVFYnFKb29lc2pQcHZ0M3I5alBmQndGYko3MHVPV2ZWemR4dFVmN3ltWDdiWUFadUVpRDFlWkZZWDE1NlFWZjQKTWhRTFJGNVd0TlZMbkhITzRFWE53cUhiWUdKR3c3c0R4TVVqd2NjaE1PRmRRY0tTd0pudnp3YW93ZzRSd2VjVkVBRVYxMUZFR1BDSgpRQ3dhaUFqd1FaOVBBbEhyY2lEeEhBbTRmdUpDSW95VHp4d1JBaDlyUE1wclp2VjFuUGo0U0duRC8wdVdCT0srMVQ2Tys3dkdyYjlJCkVlR1E2MzFvNHdOME5UOWk3TE9SSTRIQmFnd2VQMndzRWJvS2ZBQXZMR1dvK0NuRlNySUF1RHlsM2s2Wkc5VjRFVWFKNWNZQTVVWEwKTklhSEs2ZkJSRWhRT09LMmFTd2xWNE5iQzBvcWxhYngrcm03amFkZmgzdFdXNHBBYUtNRUFERS9LazhEQUhCWkVDY3pJTkw1L1ZZQQpZbXRVSDRPaWRqcVlFQUJFc2Q0ZkJ3SXIxM3RUL3B1OVQ1Wi9lN3lGeDhpdnNqRG04dnAzTTQraDY4QnY0N0g1NlJZUUFNRGFlRE9QCmRUWTM4bGh2Szhkam1rRk1EdW9NMGhmdzJNVTBsamVTOG5WMTVuanNPaEM5b1FaeDdUTFJIbWtRRTNuZHAyME1jeDRwS1lycFhZM2UKVWwzaStXTUFjN2tZeGVyRzFlaHR6aUpTTWhUVFBvMkRpbXhJalVGUW01RHFuVTIzTVhiZmJGYmZrWW5qSndmQ2FPOHMzL2dnSnBOcgo5d0IyUjU3TTkycVVVQm5EVWtZK3dSaDQybEtKRXBQVjhWWnRPZG1jTk94RUN2dlFaSDlXSG9PNnRweWNqZncvcDJhVDRFK2JtWWwwCmxpa2ZFaDdMeFhoaGI4ZUhLd2hXM3pPY2RZMmUvYTVtOU5TN0w1UVJDSDdEUmNxNjBPTUw4MXd6bEU4eFAyV2l5QzVsWXpnRG5qYzUKdHZ4OVVoRVErMk12Uk5XOVFxOTc2SUcraXBlSlZuNGU0WjlzQUs1c1p6ODVLTWR1Zmx4QmE3eE0rYnZ3NE4rRHZHNzZ6N3pQUjduYgpURTR2OUxCWmR6eVE3dXh5ak5zYmRMREJSQ2MvZUJrN3NjRzlxcHYvb09abXc0WlZyeUNpNkJsRTJCQk1sY1AzRmJBa0Zsa0czd3ZPCkVZWU9VWlFlWGR4My9PaG9LZS9oUFJCRVIwc1ZId3dPdVFEdFB0MlVyLzExL0FXOFUycmk2TTlBdW0wRWY3NW1PTmhET216eFNpSnEKdTRDL01NOGh0d0NlMDBBdm9SWUZWdnZMQWNyTDY0c2Z4alk4QU1IZUF2NXNJN0F1S2lUaWYvMElzSkZKdHp0bFRwcmhVemRBNEFORwpTNi9HaFc1SERKWVJvSEc0N3kzNHgwbGJmTEd4dHcxV01sa00vdkxDNjFUd3ZkUnQ4SS9mbVRONDlyUW9Cc2E0eVV0QmxJSkg1U21wClFHUnV1a1FRblUvUlJpeGFJalAyZWF0UW1UMGFhYSs2MThVWlZtbnhBMzdPOVJEc2xYU0VxRGNPc2xNZkF5eW5HTDFna3hjVUV2SFEKNGZWSjIwOEhlU2RkREovVUtrN3c2UU9uNDFHVEFaR0tWUWl3VnBOeGdQazBDMUlSZUErOXRLc21ndWhGUitUZ3p5NFRsRnQ5WU15bgpBY2R0RThLZXJxWG8wYXhtQWQ2RGdURXdwT09TOWIyVm5jdnFMNHk4dGtBdUdvZ201Z1BuZDM0WkpsOXk2Nmc1S2hWcG9TYkUvVU5sCmJIT2htbFBYeHlLZG9vdzd5Q3luQVlhWDhJd0RmQnJqektjWkZ3S2Uwa0drMDIvd1lqU2hVNGQwT1ZPSlNNZHJxcE9qdWpWR0JVTnQKdzJNRWV5cTVRMGoydjhLMExIWXhNM0pTbGVPRCtxT0RMTVYweEFmMVJ3ZWw3dXRUaXcvcWp3NUNpdW1ORCtxUERsS2NyQzgreUk4TwpadjhyWllqaUVmd0IvZU52bnRmenc4dmhaL0d6ZWZBWUVnWi90b0xqN2Mxc1N4N204OWI4ZjUwSzIrbjViNzQ1UGNRZi9ObTNmS1VTCkRSWG0wKzFzL29DU21VS2pDS3MydkRTMzB2ek5QOUlXaEJoUnNEeFgrSTZWVm1WejgzRmMrTVo2S1o1WVVGYktyclUzZXBhL1piQ2gKdXFjK3RLdCtHRDBFK1daMGxJOGUrR2VQMnVVcElra2VyQ0t0NURJWDVvZmN1ZWl1MTk1RnB3UW9HQk1idFVwZ2V5aSs1K2JOalArNApTUHJMMlg2MTBDYzdieG4vQ2RzeUFVRjRuaW5JSHVDZGVrc2NrZ05ENW1Rek9wUFBRYVBYYisvQXcvSUNtSXVsRVBVYlBjNU1Cbjc3ClpIUTNUTTl3ZnMvd1Fkcm96UVptMEdvb0cxMTdNekRMeHZzb1gxWFlDRGN0Y3R4V1J3Nkh6SEsvYnBHYU5WRG54N2huc1VpaFl3TmEKWDBMeFF5Y1pqUGo1MFo4d3BkRkJmL3FkSStQQVNWc0Q5ajFzSVZOMjAzL0dIVjdLa0tHQ3p2Q0dHQnJFZHp0K1lpUzVnbkduajN3OQpydU1va3p2SU5GaGxqeks1QnplYkNkUXg4SUNQK3g4d0UxQmFIbTBvL0hObWdzR3F2SzNmeDB5Z1F0dWFJVjVwSmdCRGh6VVUvamt6CkFSbzZqS0h3ejVrSllDNnNvZkRQbVFrOGVabitjMmFDd2NvWkNtSXpRVGtqaE01Q3JNWGxOZ2RhL2J1K3lETjBwWmEvd0pYcURJcEEKS2I1M2pjN252b1BXbStmNEsxU3BaYUJMMHkyajgyZWRNbm8zalUrb1MyTndYN0NJM1N0cXdSNTdsS29EUXBOMUlJSGpEalhmZHZSTAo0NzJYU2Z3SU9yakVEelpYdzA1NWYwQmJ1bWx0Q1U5WWVOcVMzc3J0aEQxai9FTExEclZsM3VkQnQwOFRYK2RreGYvVFBma293K1BICkUzZWp0QzJneDRwUFVrWG53Tzk2cm9wV0h6NW9BeXlSQTZkYUtUMzJSWXVBU0sraWJCU2dVdUhJSFBBNFk1VmJtemFrMFBuQ09CdUcKNyt5VjRrN0lHM1ZrakNBRE5FcWQ1dU9sdGlQS1dqRzBTVlJhQkNIRm5uMjBSV0xKK0F0UHlTMEc0THhnbFBMa2FleFNtMEFMQWY1eAo4NnA2MkRSVzdpUVNLSE51OTBXTWVGR2d3WjcvaTFxcVVtbHB4VUZJZERqSXBlVlI1NHRlL3ZuaU5Gb1ZuUzhhalNjSEd6ODd2bDZjCkx3WmRKVit3bkdXTzJ4NjNUT3Ntd1VHb3Q4NGRCUkdPV0M4Z09BZ05tNDNXbktYQWdKamFMazVTYzM0ZUFKenNsbkIwNEVzbk5OQmkKRHpnZG1leituMVM3aUl3RHlHZ3B4T2ZNZDUwOTgxM3Y0UDk1MmJpNVJBdkVjZ0p6bnc2dENNT09Xa04rU0lYQkNkSG5udlQxK3E3TQp1MnZNSEVFaU81bytmVE5ZeFllUTZGYjA2NDhnblZLbmJ6QWtwUG44RGI4NVZMZUs3aGdpWkFJOElxQlRZWm9JUVQ5SEJEaWFGZThJCkV0MmtKMGNDSm9TYWpxODJEQkZjb2lOSTc0MUgwWThuN25oZWU5aVZ4d2ZwK090SncxRTBuV0lvZFJoTkZ4WlRWRVRueDFLc3BIQ2EKVFpkRUFnQmc5VFZ5NHdVSTFOUk4yeGlvMUp4TEVLZ2gxUzNUUUFuOGpFanhqclIxVEtNZDkrdEtETGlVU2svczVMcUZwNkZMN1JZQgpvQ21tbFJMUUEvZXFUZVB5YUo5ZkpJTjdkbmxNY2hvYVNRbFRLSEVFNEdncWxYTnV0cFdId1FvVEh2YThONEhiNzZUZkpIOXh0MFRUCkQ1clB4MFA3alR3R0RCVEhiVHhXQy9vNEFMSThwZ2hpa01GdTVUSDcwbkViajJFYnB3eVBhUVpSYzN0VUdZUVBBQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJVFVMSVk0T0k3NWJWQVA3OG8xOEtBT0F4clNCS05aTzZ1RW9Eb05OWW9jR25XZmRKajJIZ2t5WWxIQU82bEZ4MU5ZQ0JxU3J4U21PQQpTY3k3K0cyckFhMWFaVktpL1VWcEdtVXZxVTgyTHNZUXJ1SFFHcjlCTnNycEpxRXloa1BLai9OMjVITHc1R3NuZVNBbUErdHRlOEJrCjRYWXpPN0xpS0JUR3NNUGxtVW8wQmxyMnhhT1lXaUxlbXpoaTZuMzAzWlprQmhQY0pVVmNkZ3lzdGtRSm55SGNnWXhFcnY4WVFoLzEKR3FmQlF0bzk3QmJPNDFJdC8vVVVNOU1oZzFDR2lTUlJJZjZuUDJHZU9sVTZZYkJLRlUvY3UzUUNZcmtzbnRCZE9zR0dRNldQSmRHNgphRHFZRkI5TDhoN3M4Z3YyZ1NpbUR3T296ekNxd1B1MjdXQ1BEWjQ5L0FlTElGdVRBTDFsNENWQnZVS2x6RVAxQURrWm5RTnNrYVRDClB4c3V3ZEVwa0IxSTJ3YnRlZ01tanRQZWhxZU96c2R6a0M4aEt6WDhkQkZGdWdMSjFxREJUaHR0QkRiQWl6S1dod2Y2Z05ucERWTFcKZU12TFA3aExaeEs2ay9BdkRtRllMNTV3bHNrazVTWGREV0tqOXNpZE5ZUk9yNVo1NmFzZlhSaXMyYmV6NWFmWW43M0NrNk1XenZFdgo4WFVlWk9pWVJHOFFZRU9SUVg3QlJEckNzc3E3bDY2YWFPU2hYbm4zTTJ6L2pxR0VoaS9vY3I3alRIVHBIWjBTd05PRTl3RDdLVWlCCktDYit3dURQUGcxeE9FVUwzMmVQOGZzWSt3bm5yejY4VTV5dFNlZ0grTFVVaFpXRmlUTCtocGk1OU1PeVZTcHV1Um9WQTMzQkNWZXYKd3E5UytmSnhTQU0yNXdzazZoZjRwL2NPb3c5Zk9QdUo0TDlYWHdUaGQwRnVORUQybWZFMHlGR25seSs0bzA2U0xOWTdVU2E0K1JmQwo1cE40R0hLb2o0MVQ5S2txeVA4ZjYvc2ZHK3ZiL2xmS2tBQ1RxZUQ0c0xpWjhjOGNEVllyK09adGZqcnY0QXVoWVc2KytOblV4ditaCkh3ejRBL1VmQnY2RC8wWmlEemdSZlNCQ0lmQkhDSDVibXhnYzZOMEgzUGxRQTd2TDBKODluQW8vMDlQUGRqTSsvT2NoRHIvcTFtdnQKU3VFaC9rQzlPd1R2Smg0Y1lEVFlFTHdOSGpuaFFlY1FqSEJvd0I2eTRIL2RmeHZPNEQvczRjV0FQV0QwQU9CLzNiRUJvMGNFM3ZvUAorT01KZlBnRlgvMzdBY2NlNmc4Zlg5akRESXk4MnpRRVlnOWVISC80b3o1Z0QydjBJZW9MRVRFd2t3RDRnTWRDNEl1SFFBVCtPelVFCjRQK3REYmd2R01FSUhQNkJVKzlqR0FFL0FoaFRBNDZBcnRIL0U3NVFNQWJlb2wveDRvR0hBUG9Yd0lxZ0R3QW5BRUE5aVZHL0lCN28KZ1UwTjM0WTJuSjh2QWdrS1VhQVpnYUdqMmMwTTRRZUg4Nkg3emxBQ3ZBZkhoZm5Da1ZnNEdrQWZNSUlnd0ljWWhvZURERmxFTk9LSQpnZEhFaU5HMGlJaHBFVUcwaUZDMGlQQnBFWUVFaUhDMGlOR2t3R2hTNEdKU0VJZ1VCRU1LZ2lNRlF3Q1dGQmhOaWhnOTNiWTBIOUg4CkFjakFYLzlMYWxtSDdHU3BqM0M2MUNlRkNZTVhxQ2xiaDRxVEJvL3BhVk9mRkNZT1FESlRCeDhWSm04ZHlvbE85bkFZVXgrQnZEeGsKejZmdFEzTjhQTTBQUC85Nzduend2NTBPUDVzRkpUMUFvbWJieVh5WXJjU0dMNVBqL1BDditXeFluZjluU0wxMDVBa1pEdDdkYkRjUApnWENBNWk4dHNzYnlFZUE0aW84SW5HWWtQQVlKRytYb2lzY1FZZkVZeFVwNGpNOUw0QytjL2czOFFPQVVMeEVFeFV0RVFFUlNJZ2hKCkN2NmxlQWw4WUhnSlBvbFJ2NEJvNmNIOXR3c1d3V2daZ3RFeWVGUk1FRXJONExTZXdRV0tCa2VhQnYwR0VZVFdNd1N0WndpeG5pR1EKbmlFWVBVTndlb1lJMEVUZ0VRVC9KOFFMVFpuK2lMSHlwVGh0SkdGbzRqd1JrNW82RWl3MGVlcVR3dlFwRVVNRVlFUk1qZ1QvdzRRcwpFS0I1S2tEUVBCWEFJSEVESEhFREdDSnVBS040S29EeGVTb0F3YUxmd0hkeEJBZHhWU0JBY1ZVZ0tDSnJJQVRKQ3Y2bHVBcDhZTGdxClFKRVIvb0loYVNEdzN5OW1BVWJ2QkJpOVE4UkVKQ0VvdlVQUWVvY1E2QjBDNlIzNEc0WWt0T1lKMEpvbklOWThBYVI1QW96bUNYQ2EKSnhDa3ljQWpDZkZQQ0JxYU5QMFJad1ZOY2VKSTBJaVlVTkNrSjQ4RUxFQXdvcVpFQUVyVUVBa1lVWk1qd3Y5dFVhdmxLRnNXV0xiSQo0dlFDLzlyNk9sN01XNGZ4enhwWXRvdmorRi96aC9GbXN6Mk5UL01kZVBLd09NeVBwKzFoL25CY2J2OE52d0UvWVY0SE52SUxhZmcvCndrbmVyZz09DQoJXV0+DQo8L2k6cGdmPg0KPC9zdmc+DQo=); + -webkit-background-size: cover; + -moz-background-size: cover; + background-size: cover; + position: relative; + display: inline-block; + vertical-align: top; + overflow: hidden; + vertical-align: middle; + width: 1.3rem; + height: 1.3rem; +} +#download-btn { + display: none; +} +/* Content */ +#content { + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 20px; +} +/* Code */ +#content section.code { + display: none; + background: #FFF; + border: 1px solid #E0E0E0; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 15px; + font-size: 12px; + -moz-border-radius: 1px; + -webkit-border-radius: 1px; + border-radius: 1px; + font-weight: 400; +} +article.component { + padding: 0 0 10px; +} +#content section.code h3 { + margin: 0; + font-size: 12px; + color: #000; + font-weight: 400; +} +#content header h2 { + font-weight: 300; + margin: 10px 0 25px; + font-size: 20px; + position: relative; + display: inline-block; + padding-right: 10px; +} +body.light #content header h2 { + background: #F4F4F4; +} +body.dark #content header h2 { + background: #4A4D4E; +} +#content header{ + position: relative; +} +#content header:before { + content: ''; + width: 100%; + display: block; + position: absolute; + left: 0; + top: 23px; +} +body.light #content header:before { + border-bottom: 1px solid #E0E0E0; +} +body.dark #content header:before { + border-bottom: 1px solid #58595A; +} +#content pre { + padding: 0; + margin: 2px 0 10px; +} +.showcode { + margin: 10px 0; +} +.showcode a, section.examples a { + color: #288edf; + text-decoration: none; +} +.showcode a:hover, section.examples a:hover { + text-decoration: underline; +} +section.examples ul { + margin: 0 0 20px; + padding: 0 0 0 20px; +} +section.examples h4 { + margin-bottom: 5px; +} +section.examples li { + color: #58595A; +} +/* Side Nav */ +#sideNav { + background: #4A4D4E; + position: absolute; + width: 100%; + z-index: 1; + height: 100%; + left: 0; +} +#sideNav ul { + list-style: none; + margin: 0; + padding: 0; +} +#sideNav li a { + color: #F0F1F1; + display: block; + height: 46px; + font-size: 16px; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 12px 0 0 20px; + text-decoration: none; +} +#sideNav nav.site, #sideNav .combo { + border-bottom: 1px solid #58595A; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px; + display: block; +} +#pageNav li { + border-bottom: 1px solid #58595A; +} + +select.docNav { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: #595B5B; + background-image: none; + box-shadow: 0 0 0 1px #303233; + border: none; + border-top: 2px solid #666767; + color: #FFF; + text-shadow: 0 -1px 0 #000; + overflow: hidden; + font-size: 14px; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 20px; + -webkit-appearance: none; + -moz-appearance: button; +} +@media screen and (min-width: 650px) { + #site.open { + transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + } + #main-header nav { + display: inline-block; + position: absolute; + right: 0; + top: 40px; + } + #main-header ul { + list-style: none; + } + #main-header nav li { + display: inline-block; + margin: 0 18px; + } + #main-header nav li#download-btn { + display: none; + } + #main-header nav li a { + text-decoration: none; + font-size: 20px; + color: #7F7F7F; + } + #main-header nav li.selected a { + color: #373435; + } + #slide-menu-button{ + display: none; + } + #main-header hgroup { + text-align: left; + position: absolute; + display: inline-block; + top: 24px; + } + #main-header hgroup h1 { + font-size: 60px; + } + #main-header hgroup p { + font-size: 15px; + } + #main-header { + color: #373435; + background: #fff; + height: 148px; + } + #content { + padding-left: 240px; + } + /* Side Nav */ + #sideNav { + background: transparent; + width: 220px; + z-index: 20; + left: 10px; + top: 150px; + height: auto; + } + #sideNav nav.site { + display: none; + } + #sideNav .combo { + border-bottom: none; + padding: 36px 0; + } + #sideNav li a { + padding: 12px 0 0 10px; + } + body.light #sideNav li a { + color: #797B7B; + } + body.light #pageNav li { + border-bottom: 1px solid #E0E0E0; + } + select.docNav { + background: #595B5B; + box-shadow: 0 0 0 1px #303233; + border: none; + border-top: 2px solid #666767; + color: #FFF; + text-shadow: 0 -1px 0 #000; + padding: 3px 20px 4px 8px; + -webkit-appearance: none; + } + body.light select.docNav { + box-shadow: 0 0 0 1px #949696; + background: #DDE1E1; + border-top: 1px solid #FFF; + color: #454545; + text-shadow: 0 -1px 0 #FFF; + width: 192px; + } +} +@media screen and (min-width: 880px) { + #content { + padding-left: 300px; + } + #sideNav li a { + display: block; + height: 60px; + padding: 22px 0 0 10px; + text-decoration: none; + } + #content header h2 { + font-size: 28px; + } + #content header:before { + top: 30px; + } + section.code div { + display: inline-block; + width: 48%; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + section.code div:first-child { + padding-right: 5px; + } + section.code div:last-child { + padding-left: 5px; + } + .max-width { + max-width: 1180px; + position: relative; + margin: 0 auto; + } + header#main-header .max-width { + top: -10px; + } + #main-header nav li a { + font-size: 22px; + } + #main-header nav { + display: inline-block; + } + + #main-header nav li { + margin: 0 25px; + } + #main-header nav li:last-child { + margin-right: 0; + } +} +@media screen and (min-width: 940px) { + #main-header nav li#download-btn { + display: inline-block; + } + #main-header nav li a#download-btn{ + position:relative; + top: -15px; + display:inline-block; + box-sizing:border-box; + -moz-box-sizing:border-box; + background-clip:padding-box; + font:inherit; + background:transparent; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + text-overflow:ellipsis; + white-space:nowrap; + overflow:hidden; + font-size:16px; + line-height:3rem; + letter-spacing:1px; + color:#454545; + text-shadow:0 1px #fff; + vertical-align:top; + background-color:#e5e9e8; + box-shadow:inset 0 1px #fff; + border:1px solid #a5a8a8; + border-radius:6px; + margin:0; + padding:0 1.25rem; + } + #main-header nav li a#download-btn, #main-header nav li a#download-btn:hover { + border:1px solid #143250; + background-color:#288edf; + box-shadow:inset 0 1px rgba(255,255,255,0.36); + color:#fff; + font-weight:500; + text-shadow:0 -1px rgba(0,0,0,0.36); + } + #main-header nav li a#download-btn:hover { + background-color:#2f9cf3; + } + #main-header nav li a#download-btn:active, #main-header nav li a#download-btn.is-active { + background-color:#0380e8; + box-shadow:inset 0 1px rgba(0,0,0,0.12); + } + #main-header nav li a#download-btn:disabled, #main-header nav li a#download-btn.is-disabled { + opacity:.3; + cursor:default; + pointer-events:none; + } +} + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css new file mode 100644 index 0000000..b508b61 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/prism.css @@ -0,0 +1,168 @@ +/** + * prism.js Twilight theme + * Based (more or less) on the Twilight theme originally of Textmate fame. + * @author Remy Bach + */ +code[class*="language-"], +pre[class*="language-"] { + color: white; + direction: ltr; + font-family: source-code-pro, Consolas, Monaco, 'Andale Mono', monospace; + text-align: left; + text-shadow: 0 -.1em .2em black; + white-space: pre; + word-spacing: normal; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"], +:not(pre) > code[class*="language-"] { + background:#181818; +} + +/* Code blocks */ +pre[class*="language-"] { + margin: .5em 0; + overflow: auto; +} +pre[class*="language-"]::selection { /* Safari */ + background:hsl(200, 4%, 16%); /* #282A2B */ +} +pre[class*="language-"]::selection { /* Firefox */ + background:hsl(200, 4%, 16%); /* #282A2B */ +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + border-radius: .3em; + border: .13em solid hsl(0,0%,33%); /* #545454 */ + box-shadow: 1px 1px .3em -.1em black inset; + padding: .15em .2em .05em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: hsl(0, 0%, 47%); /* #777777 */ +} + +.token.punctuation { + opacity: .7; +} + +.namespace { + opacity: .7; +} + +.token.tag, +.token.boolean, +.token.number { + color: hsl(14, 58%, 55%); /* #CF6A4C */ +} + +.token.keyword, +.token.property, +.token.selector { + color:hsl(53, 89%, 79%); /* #F9EE98 */ +} +.token.attr-name, +.token.attr-value, +.token.string, +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color:hsl(76, 21%, 52%); /* #8F9D6A */ +} + +.token.atrule { + color:hsl(218, 22%, 55%); /* #7587A6 */ +} + +.token.regex, +.token.important { + color: hsl(42, 75%, 65%); /* #E9C062 */ +} + +.token.important { + font-weight: bold; +} + +.token.entity { + cursor: help; +} +pre[data-line] { + padding: 1em 0 1em 3em; + position: relative; +} + +/* Markup */ +.language-markup .token.tag, +.language-markup .token.attr-name, +.language-markup .token.punctuation { + color: hsl(33, 33%, 52%); /* #AC885B */ +} + +/* Text Selection colour */ +::selection { + background: hsla(0,0%,93%,0.15); /* #EDEDED */ +} +::-moz-selection { + background: hsla(0,0%,93%,0.15); /* #EDEDED */ +} + +/* Make the tokens sit above the line highlight so the colours don't look faded. */ +.token { + position:relative; + z-index:1; +} +.line-highlight { + background: -moz-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + background: -o-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + background: -webkit-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + background: hsla(0, 0%, 33%, 0.25); /* #545454 */ + background: linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */ + border-bottom:1px dashed hsl(0, 0%, 33%); /* #545454 */ + border-top:1px dashed hsl(0, 0%, 33%); /* #545454 */ + left: 0; + line-height: inherit; + margin-top: 0.75em; /* Same as .prism’s padding-top */ + padding: inherit 0; + pointer-events: none; + position: absolute; + right: 0; + white-space: pre; + z-index:0; +} +.line-highlight:before, +.line-highlight[data-end]:after { + background-color: hsl(215, 15%, 59%); /* #8794A6 */ + border-radius: 999px; + box-shadow: 0 1px white; + color: hsl(24, 20%, 95%); /* #F5F2F0 */ + content: attr(data-start); + font: bold 65%/1.5 sans-serif; + left: .6em; + min-width: 1em; + padding: 0 .5em; + position: absolute; + text-align: center; + text-shadow: none; + top: .4em; + vertical-align: .3em; +} +.line-highlight[data-end]:after { + bottom: .4em; + content: attr(data-end); + top: auto; +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css new file mode 100644 index 0000000..6735055 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/css/topcoat-desktop-light.css @@ -0,0 +1,3700 @@ +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button-bar { + display: table; + table-layout: fixed; + white-space: nowrap; + margin: 0; + padding: 0; +} + +.button-bar__item { + display: table-cell; + width: auto; + border-radius: 0; +} + +.button-bar__item > input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.button-bar__button { + border-radius: inherit; +} + +.button-bar__item:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta, +.topcoat-button-bar__button, +.topcoat-button-bar__button--large { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-button:disabled, +.topcoat-button--quiet:disabled, +.topcoat-button--large:disabled, +.topcoat-button--large--quiet:disabled, +.topcoat-button--cta:disabled, +.topcoat-button--large--cta:disabled, +.topcoat-button-bar__button:disabled, +.topcoat-button-bar__button--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta, +.topcoat-button-bar__button, +.topcoat-button-bar__button--large { + padding: 0 1.25rem; + font-size: 16px; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: top; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border: 1px solid #a5a8a8; + border-radius: 6px; +} + +.topcoat-button:hover, +.topcoat-button--quiet:hover, +.topcoat-button--large:hover, +.topcoat-button--large--quiet:hover, +.topcoat-button-bar__button:hover, +.topcoat-button-bar__button--large:hover { + background-color: #edf1f1; +} + +.topcoat-button:active, +.topcoat-button--large:active, +.topcoat-button-bar__button:active, +.topcoat-button-bar__button--large:active, +:checked + .topcoat-button-bar__button { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button:focus, +.topcoat-button--quiet:focus, +.topcoat-button--large:focus, +.topcoat-button--large--quiet:focus, +.topcoat-button--cta:focus, +.topcoat-button--large--cta:focus, +.topcoat-button-bar__button:focus, +.topcoat-button-bar__button--large:focus { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; + outline: 0; +} + +.topcoat-button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-button--quiet:hover, +.topcoat-button--large--quiet:hover { + text-shadow: 0 1px #fff; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-button--quiet:active, +.topcoat-button--large--quiet:active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button-bar__button--large { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +.topcoat-button--large--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-button--cta, +.topcoat-button--large--cta { + border: 1px solid #143250; + background-color: #288edf; + box-shadow: inset 0 1px rgba(255,255,255,0.36); + color: #fff; + font-weight: 500; + text-shadow: 0 -1px rgba(0,0,0,0.36); +} + +.topcoat-button--cta:hover, +.topcoat-button--large--cta:hover { + background-color: #509bef; +} + +.topcoat-button--cta:active, +.topcoat-button--large--cta:active { + background-color: #0380e8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button--large--cta { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +.button-bar, +.topcoat-button-bar { + display: table; + table-layout: fixed; + white-space: nowrap; + margin: 0; + padding: 0; +} + +.button-bar__item, +.topcoat-button-bar__item { + display: table-cell; + width: auto; + border-radius: 0; +} + +.button-bar__item > input, +.topcoat-button-bar__item > input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.button-bar__button { + border-radius: inherit; +} + +.button-bar__item:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Button Bar + description: Component of grouped buttons + modifiers: + :disabled: Disabled state + markup: +
    +
    + +
    +
    + +
    +
    + +
    +
    + examples: + mobile button bar: http://codepen.io/Topcoat/pen/kdKyg + tags: + - desktop + - light + - dark + - mobile + - button + - group + - bar +*/ + +.topcoat-button-bar > .topcoat-button-bar__item:first-child { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.topcoat-button-bar > .topcoat-button-bar__item:last-child { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.topcoat-button-bar__item:first-child > .topcoat-button-bar__button, +.topcoat-button-bar__item:first-child > .topcoat-button-bar__button--large { + border-right: none; +} + +.topcoat-button-bar__item:last-child > .topcoat-button-bar__button, +.topcoat-button-bar__item:last-child > .topcoat-button-bar__button--large { + border-left: none; +} + +.topcoat-button-bar__button { + border-radius: inherit; +} + +.topcoat-button-bar__button:focus, +.topcoat-button-bar__button--large:focus { + z-index: 1; +} + +/* topdoc + name: Large Button Bar + description: A button bar, only larger + modifiers: + :disabled: Disabled state + markup: +
    +
    + +
    +
    + +
    +
    + +
    +
    + tags: + - desktop + - light + - dark + - mobile + - button + - group + - bar + - large +*/ + +.topcoat-button-bar__button--large { + border-radius: inherit; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-button:disabled, +.topcoat-button--quiet:disabled, +.topcoat-button--large:disabled, +.topcoat-button--large--quiet:disabled, +.topcoat-button--cta:disabled, +.topcoat-button--large--cta:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Button + description: A simple button + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + examples: + mobile button: http://codepen.io/Topcoat/pen/DpKtf + tags: + - desktop + - light + - mobile + - button +*/ + +.topcoat-button, +.topcoat-button--quiet, +.topcoat-button--large, +.topcoat-button--large--quiet, +.topcoat-button--cta, +.topcoat-button--large--cta { + padding: 0 1.25rem; + font-size: 16px; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: top; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border: 1px solid #a5a8a8; + border-radius: 6px; +} + +.topcoat-button:hover, +.topcoat-button--quiet:hover, +.topcoat-button--large:hover, +.topcoat-button--large--quiet:hover { + background-color: #edf1f1; +} + +.topcoat-button:active, +.topcoat-button--large:active { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-button:focus, +.topcoat-button--quiet:focus, +.topcoat-button--large:focus, +.topcoat-button--large--quiet:focus, +.topcoat-button--cta:focus, +.topcoat-button--large--cta:focus { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; + outline: 0; +} + +/* topdoc + name: Quiet Button + description: A simple, yet quiet button + modifiers: + :active: Quiet button active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - quiet +*/ + +.topcoat-button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-button--quiet:hover, +.topcoat-button--large--quiet:hover { + text-shadow: 0 1px #fff; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-button--quiet:active, +.topcoat-button--large--quiet:active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Button + description: A big ol button + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - large +*/ + +.topcoat-button--large, +.topcoat-button--large--quiet { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +/* topdoc + name: Large Quiet Button + description: A large, yet quiet button + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - large + - quiet +*/ + +.topcoat-button--large--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +/* topdoc + name: Call To Action Button + description: A CALL TO ARMS, er, ACTION! + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - call to action +*/ + +.topcoat-button--cta, +.topcoat-button--large--cta { + border: 1px solid #143250; + background-color: #288edf; + box-shadow: inset 0 1px rgba(255,255,255,0.36); + color: #fff; + font-weight: 500; + text-shadow: 0 -1px rgba(0,0,0,0.36); +} + +.topcoat-button--cta:hover, +.topcoat-button--large--cta:hover { + background-color: #509bef; +} + +.topcoat-button--cta:active, +.topcoat-button--large--cta:active { + background-color: #0380e8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Call To Action Button + description: Like call to action, but bigger + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - large + - call to action +*/ + +.topcoat-button--large--cta { + font-size: 1.3rem; + font-weight: 400; + line-height: 4.375rem; + padding: 0 1.25rem; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="checkbox"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.checkbox { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox__label { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.checkbox:before, +.checkbox:after { + content: ''; + position: absolute; +} + +.checkbox:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="checkbox"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.checkbox, +.topcoat-checkbox__checkmark { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox__label, +.topcoat-checkbox { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.checkbox--disabled, +input[type="checkbox"]:disabled + .topcoat-checkbox__checkmark { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.checkbox:before, +.checkbox:after, +.topcoat-checkbox__checkmark:before, +.topcoat-checkbox__checkmark:after { + content: ''; + position: absolute; +} + +.checkbox:before, +.topcoat-checkbox__checkmark:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +/* topdoc + name: Checkbox + description: Default skin for Topcoat checkbox + modifiers: + :focus: Focus state + :disabled: Disabled state + markup: + +
    +
    + + examples: + mobile checkbox: http://codepen.io/Topcoat/pen/piHcs + tags: + - desktop + - light + - mobile + - checkbox +*/ + +.topcoat-checkbox__checkmark { + height: 2rem; +} + +input[type="checkbox"] { + height: 2rem; + width: 2rem; + margin-top: 0; + margin-right: -2rem; + margin-bottom: -2rem; + margin-left: 0; +} + +input[type="checkbox"]:checked + .topcoat-checkbox__checkmark:after { + opacity: 1; +} + +.topcoat-checkbox { + line-height: 2rem; +} + +.topcoat-checkbox__checkmark:before { + width: 2rem; + height: 2rem; + background: #e5e9e8; + border: 1px solid #a5a8a8; + border-radius: 3px; + box-shadow: inset 0 1px #fff; +} + +.topcoat-checkbox__checkmark { + width: 2rem; + height: 2rem; +} + +.topcoat-checkbox__checkmark:after { + top: 1px; + left: 2px; + opacity: 0; + width: 28px; + height: 11px; + background: transparent; + border: 7px solid #666; + border-width: 7px; + border-top: none; + border-right: none; + border-radius: 2px; + -webkit-transform: rotate(-50deg); + -ms-transform: rotate(-50deg); + transform: rotate(-50deg); +} + +input[type="checkbox"]:focus + .topcoat-checkbox__checkmark:before { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-icon-button, +.topcoat-icon-button--quiet, +.topcoat-icon-button--large, +.topcoat-icon-button--large--quiet { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-icon-button:disabled, +.topcoat-icon-button--quiet:disabled, +.topcoat-icon-button--large:disabled, +.topcoat-icon-button--large--quiet:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Icon Button + description: Like button, but it has an icon. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon +*/ + +.topcoat-icon-button, +.topcoat-icon-button--quiet, +.topcoat-icon-button--large, +.topcoat-icon-button--large--quiet { + padding: 0 0.75rem; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: baseline; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border: 1px solid #a5a8a8; + border-radius: 6px; +} + +.topcoat-icon-button:hover, +.topcoat-icon-button--quiet:hover, +.topcoat-icon-button--large:hover, +.topcoat-icon-button--large--quiet:hover { + background-color: #edf1f1; +} + +.topcoat-icon-button:active { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +.topcoat-icon-button:focus, +.topcoat-icon-button--quiet:focus, +.topcoat-icon-button--quiet:hover:focus, +.topcoat-icon-button--large:focus, +.topcoat-icon-button--large--quiet:focus, +.topcoat-icon-button--large--quiet:hover:focus { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; + outline: 0; +} + +/* topdoc + name: Quiet Icon Button + description: Like quiet button, but it has an icon. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon + - quiet +*/ + +.topcoat-icon-button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-icon-button--quiet:hover, +.topcoat-icon-button--large--quiet:hover { + text-shadow: 0 1px #fff; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-icon-button--quiet:active, +.topcoat-icon-button--large--quiet:active { + color: #454545; + text-shadow: 0 1px #fff; + background-color: #d3d7d7; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Icon Button + description: Like large button, but it has an icon. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon + - large +*/ + +.topcoat-icon-button--large, +.topcoat-icon-button--large--quiet { + width: 4.375rem; + height: 4.375rem; + line-height: 4.375rem; +} + +.topcoat-icon-button--large:active { + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); +} + +/* topdoc + name: Large Quiet Icon Button + description: Like large button, but it has an icon and this one is quiet. + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + markup: + + + tags: + - desktop + - light + - mobile + - button + - icon + - large + - quiet +*/ + +.topcoat-icon-button--large--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.topcoat-icon, +.topcoat-icon--large { + position: relative; + display: inline-block; + vertical-align: top; + overflow: hidden; + width: 1.62rem; + height: 1.62rem; + vertical-align: middle; + top: -1px; +} + +.topcoat-icon--large { + width: 2.499999998125rem; + height: 2.499999998125rem; + top: -2px; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.input { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; +} + +.input:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.list { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +.list__header { + margin: 0; +} + +.list__container { + padding: 0; + margin: 0; + list-style-type: none; +} + +.list__item { + margin: 0; + padding: 0; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.list, +.topcoat-list { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +.list__header, +.topcoat-list__header { + margin: 0; +} + +.list__container, +.topcoat-list__container { + padding: 0; + margin: 0; + list-style-type: none; +} + +.list__item, +.topcoat-list__item { + margin: 0; + padding: 0; +} + +/* topdoc + name: List + description: Topcoat default list skin + markup: +
    +

    Category

    +
      +
    • + Item +
    • +
    • + Item +
    • +
    • + Item +
    • +
    +
    + tags: + - mobile + - list +*/ + +.topcoat-list { + border-top: 1px solid #bcbfbf; + border-bottom: 1px solid #eff1f1; + background-color: #dfe2e2; +} + +.topcoat-list__header { + padding: 4px 20px; + font-size: 0.9em; + font-weight: 400; + background-color: #cccfcf; + color: #656565; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + border-top: 1px solid rgba(255,255,255,0.5); + border-bottom: 1px solid rgba(255,255,255,0.23); +} + +.topcoat-list__container { + border-top: 1px solid #bcbfbf; + color: #454545; +} + +.topcoat-list__item { + padding: 1.25rem; + border-top: 1px solid #eff1f1; + border-bottom: 1px solid #bcbfbf; +} + +.topcoat-list__item:first-child { + border-top: 1px solid rgba(0,0,0,0.05); +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.navigation-bar { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + white-space: nowrap; + overflow: hidden; + word-spacing: 0; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.navigation-bar__item { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; +} + +.navigation-bar__title { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.navigation-bar, +.topcoat-navigation-bar { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + white-space: nowrap; + overflow: hidden; + word-spacing: 0; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.navigation-bar__item, +.topcoat-navigation-bar__item { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; +} + +.navigation-bar__title, +.topcoat-navigation-bar__title { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* topdoc + name: Navigation Bar + description: A place where navigation goes to drink + markup: +
    +
    +

    Header

    +
    +
    + tags: + - desktop + - light + - mobile + - navigation + - bar +*/ + +.topcoat-navigation-bar { + height: 4.375rem; + padding-left: 1rem; + padding-right: 1rem; + background: #e5e9e8; + color: #000; + box-shadow: inset 0 -1px #b9bcbc, 0 1px #d4d6d6; +} + +.topcoat-navigation-bar__item { + margin: 0; + line-height: 4.375rem; + vertical-align: top; +} + +.topcoat-navigation-bar__title { + font-size: 1.3rem; + font-weight: 400; + color: #000; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.notification { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.notification, +.topcoat-notification { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +/* topdoc + name: Notification + description: Notification badge + markup: + 1 + tags: + - desktop + - light + - mobile + - notification +*/ + +.topcoat-notification { + padding: 0.15em 0.5em 0.2em; + border-radius: 2px; + background-color: #ec514e; + color: #fff; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="radio"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.radio-button { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button__label { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button:before, +.radio-button:after { + content: ''; + position: absolute; + border-radius: 100%; +} + +.radio-button:after { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.radio-button:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.radio-button--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +input[type="radio"] { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.radio-button, +.topcoat-radio-button__checkmark { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button__label, +.topcoat-radio-button { + position: relative; + display: inline-block; + vertical-align: top; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.radio-button:before, +.radio-button:after, +.topcoat-radio-button__checkmark:before, +.topcoat-radio-button__checkmark:after { + content: ''; + position: absolute; + border-radius: 100%; +} + +.radio-button:after, +.topcoat-radio-button__checkmark:after { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.radio-button:before, +.topcoat-radio-button__checkmark:before { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.radio-button--disabled, +input[type="radio"]:disabled + .topcoat-radio-button__checkmark { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Radio Button + description: A button that can play music, but usually just plays ads. + modifiers: + markup: + + +
    +
    + + +
    +
    + + +
    +
    + + + examples: + Mobile Radio Button: http://codepen.io/Topcoat/pen/HDcJj + tags: + - desktop + - light + - mobile + - Radio +*/ + +input[type="radio"] { + height: 1.875rem; + width: 1.875rem; + margin-top: 0; + margin-right: -1.875rem; + margin-bottom: -1.875rem; + margin-left: 0; +} + +input[type="radio"]:checked + .topcoat-radio-button__checkmark:after { + opacity: 1; +} + +.topcoat-radio-button { + color: #454545; + line-height: 1.875rem; +} + +.topcoat-radio-button__checkmark:before { + width: 1.875rem; + height: 1.875rem; + background: #e5e9e8; + border: 1px solid #a5a8a8; + box-shadow: inset 0 1px #fff; +} + +.topcoat-radio-button__checkmark { + position: relative; + width: 1.875rem; + height: 1.875rem; +} + +.topcoat-radio-button__checkmark:after { + opacity: 0; + width: 0.875rem; + height: 0.875rem; + background: #666; + border: 1px solid rgba(0,0,0,0.1); + box-shadow: 0 1px rgba(255,255,255,0.5); + -webkit-transform: none; + -ms-transform: none; + transform: none; + top: 7px; + left: 7px; +} + +input[type="radio"]:focus + .topcoat-radio-button__checkmark:before { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.range { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +.range__thumb { + cursor: pointer; +} + +.range__thumb--webkit { + cursor: pointer; + -webkit-appearance: none; +} + +.range:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +Copyright 2012 Adobe Systems Inc.; +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.range, +.topcoat-range { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +.range__thumb, +.topcoat-range::-moz-range-thumb { + cursor: pointer; +} + +.range__thumb--webkit, +.topcoat-range::-webkit-slider-thumb { + cursor: pointer; + -webkit-appearance: none; +} + +.range:disabled, +.topcoat-range:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Range + description: Range input + modifiers: + :active: Active state + :disabled: Disabled state + :hover: Hover state + :focus: Focused + markup: + + + examples: + mobile range: http://codepen.io/Topcoat/pen/BskEn + tags: + - desktop + - mobile + - range +*/ + +.topcoat-range { + border-radius: 6px; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + height: 1rem; + border-radius: 30px; +} + +.topcoat-range::-moz-range-track { + border-radius: 6px; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + height: 1rem; + border-radius: 30px; +} + +.topcoat-range::-webkit-slider-thumb { + height: 3rem; + width: 2rem; + background-color: #e5e9e8; + border: 1px solid #a5a8a8; + border-radius: 6px; + box-shadow: inset 0 1px #fff; +} + +.topcoat-range::-moz-range-thumb { + height: 3rem; + width: 2rem; + background-color: #e5e9e8; + border: 1px solid #a5a8a8; + border-radius: 6px; + box-shadow: inset 0 1px #fff; +} + +.topcoat-range:focus::-webkit-slider-thumb { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-range:focus::-moz-range-thumb { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.search-input { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.search-input:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.search-input, +.topcoat-search-input, +.topcoat-search-input--large { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; + -webkit-appearance: none; +} + +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.search-input:disabled, +.topcoat-search-input:disabled, +.topcoat-search-input--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Search Input + description: A text input designed for searching. + modifiers: + :disabled: Disabled state + markup: + + + tags: + - desktop + - light + - mobile + - text + - input + - search + - form +*/ + +.topcoat-search-input, +.topcoat-search-input--large { + line-height: 3rem; + font-size: 16px; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); + color: #454545; + padding: 0 0 0 2rem; + border-radius: 30px; + background-image: url("../img/search.svg"); + background-position: 1em center; + background-repeat: no-repeat; + background-size: 16px; +} + +.topcoat-search-input:focus, +.topcoat-search-input--large:focus { + background-image: url("../img/search_dark.svg"); + background-color: #edf1f1; + color: #000; + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-search-input::-webkit-search-cancel-button, +.topcoat-search-input::-webkit-search-decoration, +.topcoat-search-input--large::-webkit-search-cancel-button, +.topcoat-search-input--large::-webkit-search-decoration { + margin-right: 5px; +} + +.topcoat-search-input:focus::-webkit-input-placeholder, +.topcoat-search-input:focus::-webkit-input-placeholder { + color: #c6c8c8; +} + +.topcoat-search-input:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-search-input:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-search-input:disabled:-ms-input-placeholder { + color: #000; +} + +/* topdoc + name: Large Search Input + description: A large text input designed for searching. + modifiers: + :disabled: Disabled state + markup: + + + tags: + - desktop + - light + - mobile + - text + - input + - search + - form + - large +*/ + +.topcoat-search-input--large { + line-height: 4.375rem; + font-size: 1.3rem; + font-weight: 200; + padding: 0 0 0 2.9rem; + border-radius: 40px; + background-position: 1.2em center; + background-size: 1.3rem; +} + +.topcoat-search-input--large:disabled { + color: #000; +} + +.topcoat-search-input--large:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-search-input--large:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-search-input--large:disabled:-ms-input-placeholder { + color: #000; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.switch { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch__input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.switch__toggle { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.switch__toggle:before, +.switch__toggle:after { + content: ''; + position: absolute; + z-index: -1; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch--disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.switch, +.topcoat-switch { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch__input, +.topcoat-switch__input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.switch__toggle, +.topcoat-switch__toggle { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.switch__toggle:before, +.switch__toggle:after, +.topcoat-switch__toggle:before, +.topcoat-switch__toggle:after { + content: ''; + position: absolute; + z-index: -1; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; +} + +.switch--disabled, +.topcoat-switch__input:disabled + .topcoat-switch__toggle { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Switch + description: Default skin for Topcoat switch + modifiers: + :focus: Focus state + :disabled: Disabled state + markup: + +
    +
    + +
    +
    + + examples: + mobile switch: http://codepen.io/Topcoat/pen/upxds + tags: + - desktop + - light + - mobile + - switch +*/ + +.topcoat-switch { + font-size: 16px; + padding: 0 1.25rem; + border-radius: 6px; + border: 1px solid #a5a8a8; + overflow: hidden; + width: 6rem; +} + +.topcoat-switch__toggle:before, +.topcoat-switch__toggle:after { + top: -1px; + width: 5rem; +} + +.topcoat-switch__toggle:before { + content: 'ON'; + color: #0083e8; + background-color: #e0f0fa; + right: 1rem; + padding-left: 1.5rem; +} + +.topcoat-switch__toggle { + line-height: 3rem; + height: 3rem; + width: 2rem; + border-radius: 6px; + color: #454545; + text-shadow: 0 1px #fff; + background-color: #e5e9e8; + border: 1px solid #a5a8a8; + margin-left: -1.3rem; + margin-bottom: -1px; + margin-top: -1px; + box-shadow: inset 0 1px #fff; + -webkit-transition: margin-left 0.05s ease-in-out; + transition: margin-left 0.05s ease-in-out; +} + +.topcoat-switch__toggle:after { + content: 'OFF'; + background-color: #d3d7d7; + left: 1rem; + padding-left: 2rem; +} + +.topcoat-switch__input:checked + .topcoat-switch__toggle { + margin-left: 2.7rem; +} + +.topcoat-switch__input:focus + .topcoat-switch__toggle { + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-switch__input:disabled + .topcoat-switch__toggle:after, +.topcoat-switch__input:disabled + .topcoat-switch__toggle:before { + background: transparent; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.button, +.topcoat-tab-bar__button { + position: relative; + display: inline-block; + vertical-align: top; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-decoration: none; +} + +.button--quiet { + background: transparent; + border: 1px solid transparent; + box-shadow: none; +} + +.button--disabled, +.topcoat-tab-bar__button:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +.button-bar, +.topcoat-tab-bar { + display: table; + table-layout: fixed; + white-space: nowrap; + margin: 0; + padding: 0; +} + +.button-bar__item, +.topcoat-tab-bar__item { + display: table-cell; + width: auto; + border-radius: 0; +} + +.button-bar__item > input, +.topcoat-tab-bar__item > input { + position: absolute; + overflow: hidden; + padding: 0; + border: 0; + opacity: 0.001; + z-index: 1; + vertical-align: top; + outline: none; +} + +.button-bar__button { + border-radius: inherit; +} + +.button-bar__item:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Tab Bar + description: Component of tab buttons + modifiers: + :disabled: Disabled state + markup: +
    + + + +
    + examples: + mobile tab bar: http://codepen.io/Topcoat/pen/rJICF + tags: + - desktop + - light + - dark + - mobile + - tab + - group + - bar +*/ + +.topcoat-tab-bar__button { + padding: 0 1.25rem; + height: 3rem; + line-height: 3rem; + letter-spacing: 1px; + color: #454545; + text-shadow: 0 1px #fff; + vertical-align: top; + background-color: #e5e9e8; + box-shadow: inset 0 1px #fff; + border-top: 1px solid #a5a8a8; +} + +.topcoat-tab-bar__button:active, +.topcoat-tab-bar__button--large:active, +:checked + .topcoat-tab-bar__button { + color: #0083e8; + background-color: #e0f0fa; + box-shadow: inset 0 0 2px #c0ced8; +} + +.topcoat-tab-bar__button:focus, +.topcoat-tab-bar__button--large:focus { + z-index: 1; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.input, +.topcoat-text-input, +.topcoat-text-input--large { + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + vertical-align: top; + outline: none; +} + +.input:disabled, +.topcoat-text-input:disabled, +.topcoat-text-input--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Text input + description: Topdoc text input + modifiers: + :disabled: Disabled state + :focus: Focused + :invalid: Hover state + markup: + +
    +
    + +
    +
    + + tags: + - desktop + - mobile + - text + - input +*/ + +.topcoat-text-input, +.topcoat-text-input--large { + line-height: 3rem; + font-size: 16px; + letter-spacing: 1px; + padding: 0 1.25rem; + border: 1px solid #a5a8a8; + border-radius: 6px; + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); + color: #454545; + vertical-align: top; +} + +.topcoat-text-input:focus, +.topcoat-text-input--large:focus { + background-color: #edf1f1; + color: #000; + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-text-input:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-text-input:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-text-input:disabled:-ms-input-placeholder { + color: #000; +} + +.topcoat-text-input:invalid { + border: 1px solid #d83b75; +} + +/* topdoc + name: Large Text Input + description: A bigger input, still for text. + modifiers: + :disabled: Disabled state + :focus: Focused + :invalid: Hover state + markup: + +
    +
    + +
    +
    + + tags: + - desktop + - light + - mobile + - form + - input + - large +*/ + +.topcoat-text-input--large { + line-height: 4.375rem; + font-size: 1.3rem; +} + +.topcoat-text-input--large:disabled { + color: #000; +} + +.topcoat-text-input--large:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-text-input--large:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-text-input--large:disabled:-ms-input-placeholder { + color: #000; +} + +.topcoat-text-input--large:invalid { + border: 1px solid #d83b75; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.textarea { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + vertical-align: top; + resize: none; + outline: none; +} + +.textarea:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +/** +* +* Copyright 2012 Adobe Systems Inc.; +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +.textarea, +.topcoat-textarea, +.topcoat-textarea--large { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + vertical-align: top; + resize: none; + outline: none; +} + +.textarea:disabled, +.topcoat-textarea:disabled, +.topcoat-textarea--large:disabled { + opacity: 0.3; + cursor: default; + pointer-events: none; +} + +/* topdoc + name: Textarea + description: A whole area, just for text. + modifiers: + :disabled: Disabled state + markup: + +
    +
    + + tags: + - desktop + - light + - mobile + - form + - input + - textarea +*/ + +.topcoat-textarea, +.topcoat-textarea--large { + padding: 2rem; + font-size: 2.5rem; + font-weight: 200; + border-radius: 6px; + line-height: 3rem; + border: 1px solid #a5a8a8; + background-color: #d3d7d7; + box-shadow: inset 0 1px rgba(0,0,0,0.12); + color: #454545; + letter-spacing: 1px; +} + +.topcoat-textarea:focus, +.topcoat-textarea--large:focus { + background-color: #edf1f1; + color: #000; + border: 1px solid #0940fd; + box-shadow: 0 0 0 2px #6fb5f1; +} + +.topcoat-textarea:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-textarea:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-textarea:disabled:-ms-input-placeholder { + color: #000; +} + +/* topdoc + name: Large Textarea + description: A whole area, just for text; now available in large. + modifiers: + :disabled: Disabled state + markup: + +
    +
    + + tags: + - desktop + - light + - mobile + - form + - input + - textarea +*/ + +.topcoat-textarea--large { + font-size: 3rem; + line-height: 4.375rem; +} + +.topcoat-textarea--large:disabled { + color: #000; +} + +.topcoat-textarea--large:disabled::-webkit-input-placeholder { + color: #000; +} + +.topcoat-textarea--large:disabled::-moz-placeholder { + color: #000; +} + +.topcoat-textarea--large:disabled:-ms-input-placeholder { + color: #000; +} + +@font-face { + font-family: "Source Sans"; + src: url("../font/SourceSansPro-Regular.otf"); +} + +@font-face { + font-family: "Source Sans"; + src: url("../font/SourceSansPro-Light.otf"); + font-weight: 200; +} + +@font-face { + font-family: "Source Sans"; + src: url("../font/SourceSansPro-Semibold.otf"); + font-weight: 600; +} + +body { + margin: 0; + padding: 0; + background: #dfe2e2; + color: #000; + font: 16px "Source Sans", helvetica, arial, sans-serif; + font-weight: 200; +} + +:focus { + outline-color: transparent; + outline-style: none; +} + +.topcoat-icon--menu-stack { + background: url("../img/hamburger_dark.svg") no-repeat; + background-size: cover; +} + +.quarter { + width: 25%; +} + +.half { + width: 50%; +} + +.three-quarters { + width: 75%; +} + +.third { + width: 33.333%; +} + +.two-thirds { + width: 66.666%; +} + +.full { + width: 100%; +} + +.left { + text-align: left; +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +.reset-ui { + -moz-box-sizing: border-box; + box-sizing: border-box; + background-clip: padding-box; + position: relative; + display: inline-block; + vertical-align: top; + padding: 0; + margin: 0; + font: inherit; + color: inherit; + background: transparent; + border: none; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* This file should include color and image variables corresponding to the dark theme */ + +/* Call To Action */ + +/* Icons */ + +/* Navigation Bar */ + +/* Text Input */ + +/* Search Input */ + +/* List */ + +/* Checkbox */ + +/* Overlay */ + +/* Progress bar */ + +/* Checkbox */ + +/* Radio Button */ + +/* Tab bar */ + +/* Switch */ + +/* Icon Button */ + +/* Navigation bar */ + +/* List */ + +/* Search Input */ + +/* Textarea */ + +/* Checkbox */ + +/* Radio */ + +/* Range input */ + +/* Search Input */ + +/* Switch */ + +/* This file should include color and image variables corresponding to the light theme */ + +/* Call To Action */ + +/* Icons */ + +/* Navigation Bar */ + +/* Text Input */ + +/* List */ + +/* Overlay */ + +/* Progress bar */ + +/* Checkbox */ + +/* Range input */ + +/* Radio Button */ + +/* Tab bar */ + +/* Switch */ + +/* Containers */ + +/* Icon Button */ + +/* Navigation bar */ + +/* List */ + +/* Search Input */ + +/* Text Area */ + +/* Checkbox */ + +/* Radio */ + +/* Range input */ + +/* Search Input */ + +/* Switch */ + +/* Text Input */ + +/* Radio input */ + +/* Overlay */ + +/* Textarea */ + +/* Progress bar container */ + +/* Progress bar progress */ + +/* Search input */ + +/* Switch */ + +/* Notification */ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot new file mode 100644 index 0000000..9e9e4de Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.svg new file mode 100644 index 0000000..f4a1739 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf new file mode 100644 index 0000000..6eb48e7 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff new file mode 100644 index 0000000..2383f47 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot new file mode 100644 index 0000000..bda2005 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg new file mode 100644 index 0000000..e031390 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf new file mode 100644 index 0000000..0959ece Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.woff new file mode 100644 index 0000000..522d5ab Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-light-webfont.woff differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.eot new file mode 100644 index 0000000..2b75abb Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.eot differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.svg new file mode 100644 index 0000000..581a849 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf new file mode 100644 index 0000000..e166286 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.woff new file mode 100644 index 0000000..315c98a Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.woff differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot new file mode 100644 index 0000000..ddf5d11 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg new file mode 100644 index 0000000..317e536 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf new file mode 100644 index 0000000..6d97e7b Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff new file mode 100644 index 0000000..d844315 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/stylesheet.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/stylesheet.css new file mode 100644 index 0000000..2d66502 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/fonts/stylesheet.css @@ -0,0 +1,57 @@ + +@font-face { + font-family: 'source-sans-pro'; + src: url('sourcesanspro-light-webfont.eot'); + src: url('sourcesanspro-light-webfont.eot?#iefix') format('embedded-opentype'), + url('sourcesanspro-light-webfont.woff') format('woff'), + url('sourcesanspro-light-webfont.ttf') format('truetype'), + url('sourcesanspro-light-webfont.svg#source_sans_prolight') format('svg'); + font-weight: 300; + font-style: normal; + +} + + + + +@font-face { + font-family: 'source-sans-pro'; + src: url('sourcesanspro-regular-webfont.eot'); + src: url('sourcesanspro-regular-webfont.eot?#iefix') format('embedded-opentype'), + url('sourcesanspro-regular-webfont.woff') format('woff'), + url('sourcesanspro-regular-webfont.ttf') format('truetype'), + url('sourcesanspro-regular-webfont.svg#source_sans_proregular') format('svg'); + font-weight: 400; + font-style: normal; + +} + + + + +@font-face { + font-family: 'source-sans-pro'; + src: url('sourcesanspro-semibold-webfont.eot'); + src: url('sourcesanspro-semibold-webfont.eot?#iefix') format('embedded-opentype'), + url('sourcesanspro-semibold-webfont.woff') format('woff'), + url('sourcesanspro-semibold-webfont.ttf') format('truetype'), + url('sourcesanspro-semibold-webfont.svg#source_sans_prosemibold') format('svg'); + font-weight: 600; + font-style: normal; + +} + + + + +@font-face { + font-family: 'source-code-pro'; + src: url('sourcecodepro-regular-webfont.eot'); + src: url('sourcecodepro-regular-webfont.eot?#iefix') format('embedded-opentype'), + url('sourcecodepro-regular-webfont.woff') format('woff'), + url('sourcecodepro-regular-webfont.ttf') format('truetype'), + url('sourcecodepro-regular-webfont.svg#source_code_proregular') format('svg'); + font-weight: normal; + font-style: normal; + +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search.svg new file mode 100644 index 0000000..d18a4fa --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search.svg @@ -0,0 +1,11 @@ + + + Slice 1 + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg new file mode 100644 index 0000000..cbfae91 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/img/search_dark.svg @@ -0,0 +1,16 @@ + + + + + + +]> + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js new file mode 100644 index 0000000..8f1a555 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/js/prism.js @@ -0,0 +1,9 @@ +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * MIT license http://www.opensource.org/licenses/mit-license.php/ + * @author Lea Verou http://lea.verou.me + */(function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=t.util.clone(e[i]));return r;case"Array":return e.slice()}return e}},languages:{extend:function(e,n){var r=t.util.clone(t.languages[e]);for(var i in n)r[i]=n[i];return r},insertBefore:function(e,n,r,i){i=i||t.languages;var s=i[e],o={};for(var u in s)if(s.hasOwnProperty(u)){if(u==n)for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);o[u]=s[u]}return i[e]=o},DFS:function(e,n){for(var r in e){n.call(e,r,e[r]);t.util.type(e)==="Object"&&t.languages.DFS(e[r],n)}}},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,""])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,"").replace(/\s+/g," ")+" language-"+o;a=r.parentNode;/pre/i.test(a.nodeName)&&(a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+o);var f=r.textContent;if(!f)return;f=f.replace(/&/g,"&").replace(/e.length)break e;if(p instanceof i)continue;a.lastIndex=0;var d=a.exec(p);if(d){l&&(c=d[1].length);var v=d.index-1+c,d=d[0].slice(c),m=d.length,g=v+m,y=p.slice(0,v+1),b=p.slice(g+1),w=[h,1];y&&w.push(y);var E=new i(u,f?t.tokenize(d,f):d);w.push(E);b&&w.push(b);Array.prototype.splice.apply(s,w)}}}return s},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e,r,i){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]")return e.map(function(t){return n.stringify(t,r,e)}).join("");var s={type:e.type,content:n.stringify(e.content,r,i),tag:"span",classes:["token",e.type],attributes:{},language:r,parent:i};s.type=="comment"&&(s.attributes.spellcheck="true");t.hooks.run("wrap",s);var o="";for(var u in s.attributes)o+=u+'="'+(s.attributes[u]||"")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'" '+o+">"+s.content+""};if(!self.document){self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.tokenize(i,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}})();; +Prism.languages.clike={comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|(^|[^:])\/\/.*?(\r?\n|$))/g,lookbehind:!0},string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/ig,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/ig,inside:{punctuation:/\(/}}, number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|(&){1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g}; +; +Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof|try|throw|catch|finally|null|break|continue)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g});Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}});Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/(<|<)script[\w\W]*?(>|>)[\w\W]*?(<|<)\/script(>|>)/ig,inside:{tag:{pattern:/(<|<)script[\w\W]*?(>|>)|(<|<)\/script(>|>)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}}); +; \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html new file mode 100644 index 0000000..eed4bdd --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/doc/reference.html @@ -0,0 +1,14816 @@ + + + + + + + Snap.svg API Reference + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +

    Snap(…)

    +
    +
    +
    +
    + + + + +

    Creates a drawing surface or wraps existing SVG element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. width + number string + width of surface
    2. +
    3. height + number string + height of surface
    4. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. DOM + SVGElement + element to be wrapped into Snap structure
    2. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. array + array + array of elements (will return set of elements)
    2. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. query + string + CSS query selector
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.format(token, json)

    +
    +
    +
    +
    + + + + +

    Replaces construction of type {<name>} to the corresponding argument +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. token + string + string to format
    2. +
    3. json + object + object which properties are used as a replacement
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + formatted string +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    // this draws a rectangular shape equivalent to "M10,20h40v50h-40z"
    +paper.path(Snap.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", {
    +    x: 10,
    +    y: 20,
    +    dim: {
    +        width: 40,
    +        height: 50,
    +        "negative width": -40
    +    }
    +}));
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.rad(deg)

    +
    +
    +
    +
    + + + + +

    Transform angle to radians +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. deg + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + angle in radians +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.deg(rad)

    +
    +
    +
    +
    + + + + +

    Transform angle to degrees +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. rad + number + angle in radians
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + angle in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.sin(angle)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.sin() only works with degrees, not radians. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. angle + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + sin +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.tan(angle)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.tan() only works with degrees, not radians. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. angle + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + tan +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.cos(angle)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.cos() only works with degrees, not radians. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. angle + number + angle in degrees
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + cos +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.asin(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.asin() only works with degrees, not radians. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + asin in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.acos(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.acos() only works with degrees, not radians. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + acos in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.atan(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.atan() only works with degrees, not radians. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + atan in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.atan2(num)

    +
    +
    +
    +
    + + + + +

    Equivalent to Math.atan2() only works with degrees, not radians. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. num + number + value
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + atan2 in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.angle(x1, y1, x2, y2, [x3], [y3])

    +
    +
    +
    +
    + + + + +

    Returns an angle between two or three points +

    + + + + + + + + + + + + +

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. x1 + number + x coord of first point
    2. +
    3. y1 + number + y coord of first point
    4. +
    5. x2 + number + x coord of second point
    6. +
    7. y2 + number + y coord of second point
    8. +
    9. x3 + number + x coord of third point
    10. +
    11. y3 + number + y coord of third point
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + angle in degrees +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.len(x1, y1, x2, y2)

    +
    +
    +
    +
    + + + + +

    Returns distance between two points +

    + + + + + + + + + + + + +

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. x1 + number + x coord of first point
    2. +
    3. y1 + number + y coord of first point
    4. +
    5. x2 + number + x coord of second point
    6. +
    7. y2 + number + y coord of second point
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + distance +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.len2(x1, y1, x2, y2)

    +
    +
    +
    +
    + + + + +

    Returns squared distance between two points +

    + + + + + + + + + + + + +

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. x1 + number + x coord of first point
    2. +
    3. y1 + number + y coord of first point
    4. +
    5. x2 + number + x coord of second point
    6. +
    7. y2 + number + y coord of second point
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + distance +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.closestPoint(path, x, y)

    +
    +
    +
    +
    + + + + +

    Returns closest point to a given one on a given path. +

    + + + + + + + + + + + + +

    Parameters

    + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + Element + path element
    2. +
    3. x + number + x coord of a point
    4. +
    5. y + number + y coord of a point
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + in format +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.is(o, type)

    +
    +
    +
    +
    + + + + +

    Handy replacement for the typeof operator +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. o + … + any object or primitive
    2. +
    3. type + string + name of the type, e.g., string, function, number, etc.
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if given value is of given type +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.snapTo(values, value, [tolerance])

    +
    +
    +
    +
    + + + + +

    Snaps given value to given grid +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. values + array number + given array of values or step of the grid
    2. +
    3. value + number + value to adjust
    4. +
    5. tolerance + number + maximum distance to the target value that would trigger the snap. Default is 10.
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + adjusted value +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.getRGB(color)

    +
    +
    +
    +
    + + + + +

    Parses color string as RGB object +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. color + string + color string in one of the following formats:
    2. + +
    +
    + + + + + + + + + + +
      + + + + + + + + + + + +
    • Color name (red, green, cornflowerblue, etc)
    • + + + + + + + + + + + +
    • #••• — shortened HTML color: (#000, #fc0, etc.)
    • + + + + + + + + + + + +
    • #•••••• — full length HTML color: (#000000, #bd2300)
    • + + + + + + + + + + + +
    • rgb(•••, •••, •••) — red, green and blue channels values: (rgb(200, 100, 0))
    • + + + + + + + + + + + +
    • rgba(•••, •••, •••, •••) — also with opacity
    • + + + + + + + + + + + +
    • rgb(•••%, •••%, •••%) — same as above, but in %: (rgb(100%, 175%, 0%))
    • + + + + + + + + + + + +
    • rgba(•••%, •••%, •••%, •••%) — also with opacity
    • + + + + + + + + + + + +
    • hsb(•••, •••, •••) — hue, saturation and brightness values: (hsb(0.5, 0.25, 1))
    • + + + + + + + + + + + +
    • hsba(•••, •••, •••, •••) — also with opacity
    • + + + + + + + + + + + +
    • hsb(•••%, •••%, •••%) — same as above, but in %
    • + + + + + + + + + + + +
    • hsba(•••%, •••%, •••%, •••%) — also with opacity
    • + + + + + + + + + + + +
    • hsl(•••, •••, •••) — hue, saturation and luminosity values: (hsb(0.5, 0.25, 0.5))
    • + + + + + + + + + + + +
    • hsla(•••, •••, •••, •••) — also with opacity
    • + + + + + + + + + + + +
    • hsl(•••%, •••%, •••%) — same as above, but in %
    • + + + + + + + + + + + +
    • hsla(•••%, •••%, •••%, •••%) — also with opacity
    • + + + + + + + + + + + +
    + + + + + + + + + +

    Note that % can be used any time: rgb(20%, 255, 50%). +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + RGB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #••••••, +
      8. + + + +
      9. + error + boolean + true if string can't be parsed +
      10. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.hsb(h, s, b)

    +
    +
    +
    +
    + + + + +

    Converts HSB values to a hex representation of the color +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. b + number + value or brightness
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + hex representation of the color +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.hsl(h, s, l)

    +
    +
    +
    +
    + + + + +

    Converts HSL values to a hex representation of the color +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. l + number + luminosity
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + hex representation of the color +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.rgb(r, g, b)

    +
    +
    +
    +
    + + + + +

    Converts RGB values to a hex representation of the color +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. r + number + red
    2. +
    3. g + number + green
    4. +
    5. b + number + blue
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + hex representation of the color +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.color(clr)

    +
    +
    +
    +
    + + + + +

    Parses the color string and returns an object featuring the color's component values +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. clr + string + color string in one of the supported formats (see Snap.getRGB)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Combined RGB/HSB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #••••••, +
      8. + + + +
      9. + error + boolean + true if string can't be parsed, +
      10. + + + +
      11. + h + number + hue, +
      12. + + + +
      13. + s + number + saturation, +
      14. + + + +
      15. + v + number + value (brightness), +
      16. + + + +
      17. + l + number + lightness +
      18. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.hsb2rgb(h, s, v)

    +
    +
    +
    +
    + + + + +

    Converts HSB values to an RGB object +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. v + number + value or brightness
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + RGB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #•••••• +
      8. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.hsl2rgb(h, s, l)

    +
    +
    +
    +
    + + + + +

    Converts HSL values to an RGB object +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. h + number + hue
    2. +
    3. s + number + saturation
    4. +
    5. l + number + luminosity
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + RGB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + r + number + red, +
      2. + + + +
      3. + g + number + green, +
      4. + + + +
      5. + b + number + blue, +
      6. + + + +
      7. + hex + string + color in HTML/CSS format: #•••••• +
      8. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.rgb2hsb(r, g, b)

    +
    +
    +
    +
    + + + + +

    Converts RGB values to an HSB object +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. r + number + red
    2. +
    3. g + number + green
    4. +
    5. b + number + blue
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + HSB object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + h + number + hue, +
      2. + + + +
      3. + s + number + saturation, +
      4. + + + +
      5. + b + number + brightness +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.rgb2hsl(r, g, b)

    +
    +
    +
    +
    + + + + +

    Converts RGB values to an HSL object +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. r + number + red
    2. +
    3. g + number + green
    4. +
    5. b + number + blue
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + HSL object in the following format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + h + number + hue, +
      2. + + + +
      3. + s + number + saturation, +
      4. + + + +
      5. + l + number + luminosity +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.parsePathString(pathString)

    +
    +
    +
    +
    + + + + +

    Utility method +Parses given path string into an array of arrays of path segments +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. pathString + string array + path string or array of segments (in the last case it is returned straight away)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + array of segments +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.parseTransformString(TString)

    +
    +
    +
    +
    + + + + +

    Utility method +Parses given transform string into an array of transformations +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. TString + string array + transform string or array of transformations (in the last case it is returned straight away)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + array of transformations +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.select(query)

    +
    +
    +
    +
    + + + + +

    Wraps a DOM element specified by CSS selector as Element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. query + string + CSS selector of the element
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.selectAll(query)

    +
    +
    +
    +
    + + + + +

    Wraps DOM elements specified by CSS selector as set or array of Element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. query + string + CSS selector of the element
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.node()

    +
    +
    +
    +
    + + + + +

    Gives you a reference to the DOM object, so you can assign event handlers or just mess around. +

    + + + + + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    // draw a circle at coordinate 10,10 with radius of 10
    +var c = paper.circle(10, 10, 10);
    +c.node.onclick = function () {
    +    c.attr("fill", "red");
    +};
    + + + + + +
    +
    +
    + +
    +
    +

    Element.type()

    +
    +
    +
    +
    + + + + +

    SVG tag name of the given element. +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Element.attr(…)

    +
    +
    +
    +
    + + + + +

    Gets or sets given attributes of the element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. params + object + contains key-value pairs of attributes you want to set
    2. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. param + string + name of the attribute
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + + +

    or +

    + + + + + + + + + + + + + + +

    + Returns: + + string + + value of attribute +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    el.attr({
    +    fill: "#fc0",
    +    stroke: "#000",
    +    strokeWidth: 2, // CamelCase...
    +    "fill-opacity": 0.5, // or dash-separated names
    +    width: "*=2" // prefixed values
    +});
    +console.log(el.attr("fill")); // #fc0
    + + + + + + +

    Prefixed values in format "+=10" supported. All four operations +(+, -, * and /) could be used. Optionally you can use units for + +and -: "+=2em". +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Snap.parse(svg)

    +
    +
    +
    +
    + + + + +

    Parses SVG fragment and converts it into a Fragment +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. svg + string + SVG string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Fragment + + the Fragment +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.fragment(varargs)

    +
    +
    +
    +
    + + + + +

    Creates a DOM fragment from a given list of elements or strings +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. varargs + … + SVG string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Fragment + + the Fragment +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.el(name, attr)

    +
    +
    +
    +
    + + + + +

    Creates an element on paper with a given name and no attributes +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. name + string + tag name
    2. +
    3. attr + object + attributes
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.circle(10, 10, 10); // is the same as...
    +var c = paper.el("circle").attr({
    +    cx: 10,
    +    cy: 10,
    +    r: 10
    +});
    +// and the same as
    +var c = paper.el("circle", {
    +    cx: 10,
    +    cy: 10,
    +    r: 10
    +});
    + + + + + +
    +
    +
    + +
    +
    +

    Element.children()

    +
    +
    +
    +
    + + + + +

    Returns array of all the children of the element. +

    + + + + + + + + + + + + + + +

    + Returns: + + array + + array of Elements +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toJSON()

    +
    +
    +
    +
    + + + + +

    Returns object representation of the given element and all its children. +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + in format +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + type + string + this.type, +
      2. + + + +
      3. + attr + object + attributes map, +
      4. + + + +
      5. + childNodes + array + optional array of children in the same format +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.ajax(…)

    +
    +
    +
    +
    + + + + +

    Simple implementation of Ajax +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. url + string + URL
    2. +
    3. postData + object string + data for post request
    4. +
    5. callback + function + callback
    6. +
    7. scope + object + scope of callback
    8. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. url + string + URL
    2. +
    3. callback + function + callback
    4. +
    5. scope + object + scope of callback
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + XMLHttpRequest + + the XMLHttpRequest object, just in case +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.load(url, callback, [scope])

    +
    +
    +
    +
    + + + + +

    Loads external SVG file as a Fragment (see Snap.ajax for more advanced AJAX) +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. url + string + URL
    2. +
    3. callback + function + callback
    4. +
    5. scope + object + scope of callback
    6. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Snap.getElementByPoint(x, y)

    +
    +
    +
    +
    + + + + +

    Returns you topmost element under given point. +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + Snap element object +

    + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + x coordinate from the top left corner of the window
    2. +
    3. y + number + y coordinate from the top left corner of the window
    4. + +
    +
    + + + + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    Snap.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"});
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.plugin(f)

    +
    +
    +
    +
    + + + + +

    Let you write plugins. You pass in a function with five arguments, like this: +

    + + + + + + + + + + + + + +
    Snap.plugin(function (Snap, Element, Paper, global, Fragment) {
    +    Snap.newmethod = function () {};
    +    Element.prototype.newmethod = function () {};
    +    Paper.prototype.newmethod = function () {};
    +});
    + + + + + + +

    Inside the function you have access to all main objects (and their +prototypes). This allow you to extend anything you want. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. f + function + your plugin body
    2. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Element.getBBox()

    +
    +
    +
    +
    + + + + +

    Returns the bounding box descriptor for the given element +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + bounding box descriptor: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + cx: + number + x of the center, +
      2. + + + +
      3. + cy: + number + x of the center, +
      4. + + + +
      5. + h: + number + height, +
      6. + + + +
      7. + height: + number + height, +
      8. + + + +
      9. + path: + string + path command for the box, +
      10. + + + +
      11. + r0: + number + radius of a circle that fully encloses the box, +
      12. + + + +
      13. + r1: + number + radius of the smallest circle that can be enclosed, +
      14. + + + +
      15. + r2: + number + radius of the largest circle that can be enclosed, +
      16. + + + +
      17. + vb: + string + box as a viewbox command, +
      18. + + + +
      19. + w: + number + width, +
      20. + + + +
      21. + width: + number + width, +
      22. + + + +
      23. + x2: + number + x of the right side, +
      24. + + + +
      25. + x: + number + x of the left side, +
      26. + + + +
      27. + y2: + number + y of the bottom edge, +
      28. + + + +
      29. + y: + number + y of the top edge +
      30. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Element.transform(tstr)

    +
    +
    +
    +
    + + + + +

    Gets or sets transformation of the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. tstr + string + transform string in Snap or SVG format
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + + +

    or +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + transformation descriptor: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + string + string + transform string, +
      2. + + + +
      3. + globalMatrix + Matrix + matrix of all transformations applied to element or its parents, +
      4. + + + +
      5. + localMatrix + Matrix + matrix of transformations applied only to the element, +
      6. + + + +
      7. + diffMatrix + Matrix + matrix of difference between global and local transformations, +
      8. + + + +
      9. + global + string + global transformation as string, +
      10. + + + +
      11. + local + string + local transformation as string, +
      12. + + + +
      13. + toString + function + returns string property +
      14. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Element.parent()

    +
    +
    +
    +
    + + + + +

    Returns the element's parent +

    + + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.append(el)

    +
    +
    +
    +
    + + + + +

    Appends the given element to current one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element Set + element to append
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + + + +
    +
    +

    Element.appendTo(el)

    +
    +
    +
    +
    + + + + +

    Appends the current element to the given one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element + parent element to append to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the child element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.prepend(el)

    +
    +
    +
    +
    + + + + +

    Prepends the given element to the current one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element + element to prepend
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.prependTo(el)

    +
    +
    +
    +
    + + + + +

    Prepends the current element to the given one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element + parent element to prepend to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the child element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.before(el)

    +
    +
    +
    +
    + + + + +

    Inserts given element before the current one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element + element to insert
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.after(el)

    +
    +
    +
    +
    + + + + +

    Inserts given element after the current one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element + element to insert
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.insertBefore(el)

    +
    +
    +
    +
    + + + + +

    Inserts the element after the given one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element + element next to whom insert to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.insertAfter(el)

    +
    +
    +
    +
    + + + + +

    Inserts the element after the given one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. el + Element + element next to whom insert to
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the parent element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.remove()

    +
    +
    +
    +
    + + + + +

    Removes element from the DOM +

    + + + + + + + + + + + + + + +

    + Returns: + + Element + + the detached element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.select(query)

    +
    +
    +
    +
    + + + + +

    Gathers the nested Element matching the given set of CSS selectors +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. query + string + CSS selector
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + result of query selection +

    + + + + +
    +
    +
    + +
    +
    +

    Element.selectAll(query)

    +
    +
    +
    +
    + + + + +

    Gathers nested Element objects matching the given set of CSS selectors +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. query + string + CSS selector
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Set + + array + + result of query selection +

    + + + + +
    +
    +
    + +
    +
    +

    Element.asPX(attr, [value])

    +
    +
    +
    +
    + + + + +

    Returns given attribute of the element as a px value (not %, em, etc.) +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. value + string + attribute value
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + result of query selection +

    + + + + +
    +
    +
    + +
    +
    +

    Element.use()

    +
    +
    +
    +
    + + + + +

    Creates a <use> element linked to the current element +

    + + + + + + + + + + + + + + +

    + Returns: + + Element + + the <use> element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.clone()

    +
    +
    +
    +
    + + + + +

    Creates a clone of the element and inserts it after the element +

    + + + + + + + + + + + + + + +

    + Returns: + + Element + + the clone +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toDefs()

    +
    +
    +
    +
    + + + + +

    Moves element to the shared <defs> area +

    + + + + + + + + + + + + + + +

    + Returns: + + Element + + the element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toPattern(x, y, width, height)

    +
    +
    +
    +
    + + + + +

    Creates a <pattern> element from the current element +To create a pattern you have to specify the pattern rect: +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + string number +
    2. +
    3. y + string number +
    4. +
    5. width + string number +
    6. +
    7. height + string number +
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the <pattern> element +

    + + + + + +

    You can use pattern later on as an argument for fill attribute: +

    + + + + + + + + + + + + + +
    var p = paper.path("M10-5-10,15M15,0,0,15M0-5-20,15").attr({
    +        fill: "none",
    +        stroke: "#bada55",
    +        strokeWidth: 5
    +    }).pattern(0, 0, 10, 10),
    +    c = paper.circle(200, 200, 100);
    +c.attr({
    +    fill: p
    +});
    + + + + + +
    +
    +
    + +
    +
    +

    Element.marker(x, y, width, height, refX, refY)

    +
    +
    +
    +
    + + + + +

    Creates a <marker> element from the current element +To create a marker you have to specify the bounding rect and reference point: +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number +
    2. +
    3. y + number +
    4. +
    5. width + number +
    6. +
    7. height + number +
    8. +
    9. refX + number +
    10. +
    11. refY + number +
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the <marker> element +

    + + + + + +

    You can specify the marker later as an argument for marker-start, marker-end, marker-mid, and marker attributes. The marker attribute places the marker at every point along the path, and marker-mid places them at every point except the start and end. +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Snap.animation(attr, duration, [easing], [callback])

    +
    +
    +
    +
    + + + + +

    Creates an animation object +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. attr + object + attributes of final destination
    2. +
    3. duration + number + duration of the animation, in milliseconds
    4. +
    5. easing + function + one of easing functions of mina or custom one
    6. +
    7. callback + function + callback function that fires when animation ends
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + animation object +

    + + + + +
    +
    +
    + +
    +
    +

    Element.inAnim()

    +
    +
    +
    +
    + + + + +

    Returns a set of animations that may be able to manipulate the current element +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + in format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + anim + object + animation object, +
      2. + + + +
      3. + mina + object + mina object, +
      4. + + + +
      5. + curStatus + number + 0..1 — status of the animation: 0 — just started, 1 — just finished, +
      6. + + + +
      7. + status + function + gets or sets the status of the animation, +
      8. + + + +
      9. + stop + function + stops the animation +
      10. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.animate(from, to, setter, duration, [easing], [callback])

    +
    +
    +
    +
    + + + + +

    Runs generic animation of one number into another with a caring function +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. from + number array + number or array of numbers
    2. +
    3. to + number array + number or array of numbers
    4. +
    5. setter + function + caring function that accepts one number argument
    6. +
    7. duration + number + duration, in milliseconds
    8. +
    9. easing + function + easing function from mina or custom
    10. +
    11. callback + function + callback function to execute when animation ends
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + animation object in mina format +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + id + string + animation id, consider it read-only, +
      2. + + + +
      3. + duration + function + gets or sets the duration of the animation, +
      4. + + + +
      5. + easing + function + easing, +
      6. + + + +
      7. + speed + function + gets or sets the speed of the animation, +
      8. + + + +
      9. + status + function + gets or sets the status of the animation, +
      10. + + + +
      11. + stop + function + stops the animation +
      12. + + + +
    2. }
    3. + + +
    + + + + + + + +
    var rect = Snap().rect(0, 0, 10, 10);
    +Snap.animate(0, 10, function (val) {
    +    rect.attr({
    +        x: val
    +    });
    +}, 1000);
    +// in given context is equivalent to
    +rect.animate({x: 10}, 1000);
    + + + + + +
    +
    +
    + +
    +
    +

    Element.stop()

    +
    +
    +
    +
    + + + + +

    Stops all the animations for the current element +

    + + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.animate(attrs, duration, [easing], [callback])

    +
    +
    +
    +
    + + + + +

    Animates the given attributes of the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. attrs + object + key-value pairs of destination attributes
    2. +
    3. duration + number + duration of the animation in milliseconds
    4. +
    5. easing + function + easing function from mina or custom
    6. +
    7. callback + function + callback function that executes when the animation ends
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.data(key, [value])

    +
    +
    +
    +
    + + + + +

    Adds or retrieves given value associated with given key. (Don’t confuse +with data- attributes) +

    See also Element.removeData +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. key + string + key to store data
    2. +
    3. value + any + value to store
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + + +

    or, if value is not specified: +

    + + + + + + + + + + + + + + +

    + Returns: + + any + + value +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    for (var i = 0, i < 5, i++) {
    +    paper.circle(10 + 15 * i, 10, 10)
    +         .attr({fill: "#000"})
    +         .data("i", i)
    +         .click(function () {
    +            alert(this.data("i"));
    +         });
    +}
    + + + + + +
    +
    +
    + +
    +
    +

    Element.removeData([key])

    +
    +
    +
    +
    + + + + +

    Removes value associated with an element by given key. +If key is not provided, removes all the data of the element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. key + string + key
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.outerSVG()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the element, equivalent to HTML's outerHTML. +

    See also Element.innerSVG +

    + + + + + + + + + + + + + + +

    + Returns: + + string + + SVG code for the element +

    + + + + +
    +
    +
    + + + +
    +
    +

    Element.innerSVG()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the element's contents, equivalent to HTML's innerHTML +

    + + + + + + + + + + + + + + +

    + Returns: + + string + + SVG code for the element +

    + + + + +
    +
    +
    + + + + + +
    +
    +

    Matrix.add(…)

    +
    +
    +
    +
    + + + + +

    Adds the given matrix to existing one +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. a + number +
    2. +
    3. b + number +
    4. +
    5. c + number +
    6. +
    7. d + number +
    8. +
    9. e + number +
    10. +
    11. f + number +
    12. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. matrix + object + Matrix
    2. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Matrix.invert()

    +
    +
    +
    +
    + + + + +

    Returns an inverted version of the matrix +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + Matrix +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.clone()

    +
    +
    +
    +
    + + + + +

    Returns a copy of the matrix +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + Matrix +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.translate(x, y)

    +
    +
    +
    +
    + + + + +

    Translate the matrix +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + horizontal offset distance
    2. +
    3. y + number + vertical offset distance
    4. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Matrix.scale(x, [y], [cx], [cy])

    +
    +
    +
    +
    + + + + +

    Scales the matrix +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + amount to be scaled, with 1 resulting in no change
    2. +
    3. y + number + amount to scale along the vertical axis. (Otherwise x applies to both axes.)
    4. +
    5. cx + number + horizontal origin point from which to scale
    6. +
    7. cy + number + vertical origin point from which to scale
    8. + +
    +
    + + + + + + + + +

    Default cx, cy is the middle point of the element. +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Matrix.rotate(a, x, y)

    +
    +
    +
    +
    + + + + +

    Rotates the matrix +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. a + number + angle of rotation, in degrees
    2. +
    3. x + number + horizontal origin point from which to rotate
    4. +
    5. y + number + vertical origin point from which to rotate
    6. + +
    +
    + + + + + + + +
    +
    +
    + +
    +
    +

    Matrix.x(x, y)

    +
    +
    +
    +
    + + + + +

    Returns x coordinate for given point after transformation described by the matrix. See also Matrix.y +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number +
    2. +
    3. y + number +
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + x +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.y(x, y)

    +
    +
    +
    +
    + + + + +

    Returns y coordinate for given point after transformation described by the matrix. See also Matrix.x +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number +
    2. +
    3. y + number +
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + y +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.determinant()

    +
    +
    +
    +
    + + + + +

    Finds determinant of the given matrix. +

    + + + + + + + + + + + + + + +

    + Returns: + + number + + determinant +

    + + + + +
    +
    +
    + +
    +
    +

    Matrix.split()

    +
    +
    +
    +
    + + + + +

    Splits matrix into primitive transformations +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + in format: +

    + + + + + + + + + + + +
      + + +
    1. + dx + number + translation by x +
    2. + + + +
    3. + dy + number + translation by y +
    4. + + + +
    5. + scalex + number + scale by x +
    6. + + + +
    7. + scaley + number + scale by y +
    8. + + + +
    9. + shear + number + shear +
    10. + + + +
    11. + rotate + number + rotation in deg +
    12. + + + +
    13. + isSimple + boolean + could it be represented via simple transformations +
    14. + + +
    + + +
    +
    +
    + +
    +
    +

    Matrix.toTransformString()

    +
    +
    +
    +
    + + + + +

    Returns transform string that represents given matrix +

    + + + + + + + + + + + + + + +

    + Returns: + + string + + transform string +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.Matrix()

    +
    +
    +
    +
    + + + + +

    Matrix constructor, extend on your own risk. +To create matrices use Snap.matrix. +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Snap.matrix(…)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns a matrix based on the given parameters +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. a + number +
    2. +
    3. b + number +
    4. +
    5. c + number +
    6. +
    7. d + number +
    8. +
    9. e + number +
    10. +
    11. f + number +
    12. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. svgMatrix + SVGMatrix +
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Matrix +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.rect(x, y, width, height, [rx], [ry])

    +
    +
    +
    +
    + + + + +

    Draws a rectangle +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + x coordinate of the top left corner
    2. +
    3. y + number + y coordinate of the top left corner
    4. +
    5. width + number + width
    6. +
    7. height + number + height
    8. +
    9. rx + number + horizontal radius for rounded corners, default is 0
    10. +
    11. ry + number + vertical radius for rounded corners, default is rx or 0
    12. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the rect element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    // regular rectangle
    +var c = paper.rect(10, 10, 50, 50);
    +// rectangle with rounded corners
    +var c = paper.rect(40, 40, 50, 50, 10);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.circle(x, y, r)

    +
    +
    +
    +
    + + + + +

    Draws a circle +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + x coordinate of the centre
    2. +
    3. y + number + y coordinate of the centre
    4. +
    5. r + number + radius
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the circle element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.circle(50, 50, 40);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.image(src, x, y, width, height)

    +
    +
    +
    +
    + + + + +

    Places an image on the surface +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. src + string + URI of the source image
    2. +
    3. x + number + x offset position
    4. +
    5. y + number + y offset position
    6. +
    7. width + number + width of the image
    8. +
    9. height + number + height of the image
    10. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the image element +

    + + + + + +

    or +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + Snap element object with type image +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.image("apple.png", 10, 10, 80, 80);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.ellipse(x, y, rx, ry)

    +
    +
    +
    +
    + + + + +

    Draws an ellipse +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + x coordinate of the centre
    2. +
    3. y + number + y coordinate of the centre
    4. +
    5. rx + number + horizontal radius
    6. +
    7. ry + number + vertical radius
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the ellipse element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.ellipse(50, 50, 40, 20);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.path([pathString])

    +
    +
    +
    +
    + + + + +

    Creates a <path> element using the given string as the path's definition +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. pathString + string + path string in SVG format
    2. + +
    +
    + + + + + + + + +

    Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example: +

    + + + + + + + + + + + + + +
    "M10,20L30,40"
    + + + + + + +

    This example features two commands: M, with arguments (10, 20) and L with arguments (30, 40). Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates. +

    + + + + + + + + + + + +

    Here is short list of commands available, for more details see SVG path string format or article about path strings at MDN.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandNameParameters
    Mmoveto(x y)+
    Zclosepath(none)
    Llineto(x y)+
    Hhorizontal linetox+
    Vvertical linetoy+
    Ccurveto(x1 y1 x2 y2 x y)+
    Ssmooth curveto(x2 y2 x y)+
    Qquadratic Bézier curveto(x1 y1 x y)+
    Tsmooth quadratic Bézier curveto(x y)+
    Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
    RCatmull-Rom curveto*x1 y1 (x y)+
    + + + + + + + + + +

  • Catmull-Rom curveto is a not standard SVG command and added to make life easier.
  • +Note: there is a special case when a path consists of only three commands: M10,10R…z. In this case the path connects back to its starting point. +

    + + + + + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c = paper.path("M10 10L90 90");
    +// draw a diagonal line:
    +// move to 10,10, line to 90,90
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.g([varargs])

    +
    +
    +
    +
    + + + + +

    Creates a group element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. varargs + … + elements to nest within the group
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the g element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var c1 = paper.circle(),
    +    c2 = paper.rect(),
    +    g = paper.g(c2, c1); // note that the order of elements is different
    + + + + + + +

    or +

    + + + + + + + + + + + + + +
    var c1 = paper.circle(),
    +    c2 = paper.rect(),
    +    g = paper.g();
    +g.add(c2, c1);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.group()

    +
    +
    +
    +
    + + + + +

    See Paper.g +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Paper.svg(x, y, width, height, vbx, vby, vbw, vbh)

    +
    +
    +
    +
    + + + + +

    Creates a nested SVG element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + optional X of the element
    2. +
    3. y + number + optional Y of the element
    4. +
    5. width + number + optional width of the element
    6. +
    7. height + number + optional height of the element
    8. +
    9. vbx + number + optional viewbox X
    10. +
    11. vby + number + optional viewbox Y
    12. +
    13. vbw + number + optional viewbox width
    14. +
    15. vbh + number + optional viewbox height
    16. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the svg element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.mask()

    +
    +
    +
    +
    + + + + +

    Equivalent in behaviour to Paper.g, except it’s a mask. +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + the mask element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.ptrn(x, y, width, height, vbx, vby, vbw, vbh)

    +
    +
    +
    +
    + + + + +

    Equivalent in behaviour to Paper.g, except it’s a pattern. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + optional X of the element
    2. +
    3. y + number + optional Y of the element
    4. +
    5. width + number + optional width of the element
    6. +
    7. height + number + optional height of the element
    8. +
    9. vbx + number + optional viewbox X
    10. +
    11. vby + number + optional viewbox Y
    12. +
    13. vbw + number + optional viewbox width
    14. +
    15. vbh + number + optional viewbox height
    16. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the pattern element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.use(…)

    +
    +
    +
    +
    + + + + +

    Creates a <use> element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. id + string + optional id of element to link
    2. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. id + Element + optional element to link
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the use element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.symbol(vbx, vby, vbw, vbh)

    +
    +
    +
    +
    + + + + +

    Creates a <symbol> element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. vbx + number + optional viewbox X
    2. +
    3. vby + number + optional viewbox Y
    4. +
    5. vbw + number + optional viewbox width
    6. +
    7. vbh + number + optional viewbox height
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the symbol element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.text(x, y, text)

    +
    +
    +
    +
    + + + + +

    Draws a text string +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + x coordinate position
    2. +
    3. y + number + y coordinate position
    4. +
    5. text + string array + The text string to draw or array of strings to nest within separate <tspan> elements
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the text element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var t1 = paper.text(50, 50, "Snap");
    +var t2 = paper.text(50, 50, ["S","n","a","p"]);
    +// Text path usage
    +t1.attr({textpath: "M10,10L100,100"});
    +// or
    +var pth = paper.path("M10,10L100,100");
    +t1.attr({textpath: pth});
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.line(x1, y1, x2, y2)

    +
    +
    +
    +
    + + + + +

    Draws a line +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x1 + number + x coordinate position of the start
    2. +
    3. y1 + number + y coordinate position of the start
    4. +
    5. x2 + number + x coordinate position of the end
    6. +
    7. y2 + number + y coordinate position of the end
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the line element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var t1 = paper.line(50, 50, 100, 100);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.polyline(…)

    +
    +
    +
    +
    + + + + +

    Draws a polyline +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. points + array + array of points
    2. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. varargs + … + points
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + the polyline element +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var p1 = paper.polyline([10, 10, 100, 100]);
    +var p2 = paper.polyline(10, 10, 100, 100);
    + + + + + +
    +
    +
    + +
    +
    +

    Paper.polygon()

    +
    +
    +
    +
    + + + + +

    Draws a polygon. See Paper.polyline +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Paper.gradient(gradient)

    +
    +
    +
    +
    + + + + +

    Creates a gradient element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. gradient + string + gradient descriptor
    2. + +
    +
    + + + + + + + + + + + +

    Gradient Descriptor

    + + + + + + + +

    The gradient descriptor is an expression formatted as +follows: <type>(<coords>)<colors>. The <type> can be +either linear or radial. The uppercase L or R letters +indicate absolute coordinates offset from the SVG surface. +Lowercase l or r letters indicate coordinates +calculated relative to the element to which the gradient is +applied. Coordinates specify a linear gradient vector as +x1, y1, x2, y2, or a radial gradient as cx, cy, +r and optional fx, fy specifying a focal point away +from the center of the circle. Specify <colors> as a list +of dash-separated CSS color values. Each color may be +followed by a custom offset value, separated with a colon +character. +

    + + + + + + + + + + + + +

    Examples

    + + + + + + + +

    Linear gradient, relative from top-left corner to bottom-right +corner, from black through red to white: +

    + + + + + + + + + + + + + +
    var g = paper.gradient("l(0, 0, 1, 1)#000-#f00-#fff");
    + + + + + + +

    Linear gradient, absolute from (0, 0) to (100, 100), from black +through red at 25% to white: +

    + + + + + + + + + + + + + +
    var g = paper.gradient("L(0, 0, 100, 100)#000-#f00:25-#fff");
    + + + + + + +

    Radial gradient, relative from the center of the element with radius +half the width, from black to white: +

    + + + + + + + + + + + + + +
    var g = paper.gradient("r(0.5, 0.5, 0.5)#000-#fff");
    + + + + + + +

    To apply the gradient: +

    + + + + + + + + + + + + + +
    paper.circle(50, 50, 40).attr({
    +    fill: g
    +});
    + + + + + + + + + + + +

    + Returns: + + object + + the gradient element +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.toString()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the Paper +

    + + + + + + + + + + + + + + +

    + Returns: + + string + + SVG code for the Paper +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.toDataURL()

    +
    +
    +
    +
    + + + + +

    Returns SVG code for the Paper as Data URI string. +

    + + + + + + + + + + + + + + +

    + Returns: + + string + + Data URI string +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.clear()

    +
    +
    +
    +
    + + + + +

    Removes all child nodes of the paper, except <defs>. +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Element.addClass(value)

    +
    +
    +
    +
    + + + + +

    Adds given class name or list of class names to the element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. value + string + class name or space separated list of class names
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + original element. +

    + + + + +
    +
    +
    + +
    +
    +

    Element.removeClass(value)

    +
    +
    +
    +
    + + + + +

    Removes given class name or list of class names from the element. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. value + string + class name or space separated list of class names
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + original element. +

    + + + + +
    +
    +
    + +
    +
    +

    Element.hasClass(value)

    +
    +
    +
    +
    + + + + +

    Checks if the element has a given class name in the list of class names applied to it. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. value + string + class name
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if the element has given class +

    + + + + +
    +
    +
    + +
    +
    +

    Element.toggleClass(value, flag)

    +
    +
    +
    +
    + + + + +

    Add or remove one or more classes from the element, depending on either +the class’s presence or the value of the flag argument. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. value + string + class name or space separated list of class names
    2. +
    3. flag + boolean + value to determine whether the class should be added or removed
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + Element + + original element. +

    + + + + +
    +
    +
    + +
    +
    +

    mina(a, A, b, B, get, set, [easing])

    +
    +
    +
    +
    + + + + +

    Generic animation of numbers +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. a + number + start slave number
    2. +
    3. A + number + end slave number
    4. +
    5. b + number + start master number (start time in general case)
    6. +
    7. B + number + end master number (end time in gereal case)
    8. +
    9. get + function + getter of master number (see mina.time)
    10. +
    11. set + function + setter of slave number
    12. +
    13. easing + function + easing function, default is mina.linear
    14. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + animation descriptor +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + id + string + animation id, +
      2. + + + +
      3. + start + number + start slave number, +
      4. + + + +
      5. + end + number + end slave number, +
      6. + + + +
      7. + b + number + start master number, +
      8. + + + +
      9. + s + number + animation status (0..1), +
      10. + + + +
      11. + dur + number + animation duration, +
      12. + + + +
      13. + spd + number + animation speed, +
      14. + + + +
      15. + get + function + getter of master number (see mina.time), +
      16. + + + +
      17. + set + function + setter of slave number, +
      18. + + + +
      19. + easing + function + easing function, default is mina.linear, +
      20. + + + +
      21. + status + function + status getter/setter, +
      22. + + + +
      23. + speed + function + speed getter/setter, +
      24. + + + +
      25. + duration + function + duration getter/setter, +
      26. + + + +
      27. + stop + function + animation stopper +
      28. + + + +
      29. + pause + function + pauses the animation +
      30. + + + +
      31. + resume + function + resumes the animation +
      32. + + + +
      33. + update + function + calles setter with the right value of the animation +
      34. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    mina.time()

    +
    +
    +
    +
    + + + + +

    Returns the current time. Equivalent to: +

    + + + + + + + + + + + + + +
    function () {
    +    return (new Date).getTime();
    +}
    + + + + + +
    +
    +
    + +
    +
    +

    mina.getById(id)

    +
    +
    +
    +
    + + + + +

    Returns an animation by its id +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. id + string + animation's id
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + See mina +

    + + + + +
    +
    +
    + +
    +
    +

    mina.linear(n)

    +
    +
    +
    +
    + + + + +

    Default linear easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.easeout(n)

    +
    +
    +
    +
    + + + + +

    Easeout easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.easein(n)

    +
    +
    +
    +
    + + + + +

    Easein easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.easeinout(n)

    +
    +
    +
    +
    + + + + +

    Easeinout easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.backin(n)

    +
    +
    +
    +
    + + + + +

    Backin easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.backout(n)

    +
    +
    +
    +
    + + + + +

    Backout easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.elastic(n)

    +
    +
    +
    +
    + + + + +

    Elastic easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    mina.bounce(n)

    +
    +
    +
    +
    + + + + +

    Bounce easing +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. n + number + input 0..1
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + output 0..1 +

    + + + + +
    +
    +
    + +
    +
    +

    Paper.filter(filstr)

    +
    +
    +
    +
    + + + + +

    Creates a <filter> element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. filstr + string + SVG fragment of filter provided as a string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + + +

    Note: It is recommended to use filters embedded into the page inside an empty SVG element. +

    + + + + + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var f = paper.filter(''),
    +    c = paper.circle(10, 10, 10).attr({
    +        filter: f
    +    });
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.blur(x, [y])

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the blur filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. x + number + amount of horizontal blur, in pixels
    2. +
    3. y + number + amount of vertical blur, in pixels
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var f = paper.filter(Snap.filter.blur(5, 10)),
    +    c = paper.circle(10, 10, 10).attr({
    +        filter: f
    +    });
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.shadow(…)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the shadow filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. dx + number + horizontal shift of the shadow, in pixels
    2. +
    3. dy + number + vertical shift of the shadow, in pixels
    4. +
    5. blur + number + amount of blur
    6. +
    7. color + string + color of the shadow
    8. +
    9. opacity + number + 0..1 opacity of the shadow
    10. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. dx + number + horizontal shift of the shadow, in pixels
    2. +
    3. dy + number + vertical shift of the shadow, in pixels
    4. +
    5. color + string + color of the shadow
    6. +
    7. opacity + number + 0..1 opacity of the shadow
    8. + +
    +
    + + + + + + + + +

    which makes blur default to 4. Or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. dx + number + horizontal shift of the shadow, in pixels
    2. +
    3. dy + number + vertical shift of the shadow, in pixels
    4. +
    5. opacity + number + 0..1 opacity of the shadow
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    var f = paper.filter(Snap.filter.shadow(0, 2, 3)),
    +    c = paper.circle(10, 10, 10).attr({
    +        filter: f
    +    });
    + + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.grayscale(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the grayscale filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.sepia(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the sepia filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.saturate(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the saturate filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.hueRotate(angle)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the hue-rotate filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. angle + number + angle of rotation
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.invert(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the invert filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.brightness(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the brightness filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.filter.contrast(amount)

    +
    +
    +
    +
    + + + + +

    Returns an SVG markup string for the contrast filter +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. amount + number + amount of filter (0..1)
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + filter representation +

    + + + + +
    +
    +
    + +
    +
    +

    Element.click(handler)

    +
    +
    +
    +
    + + + + +

    Adds a click event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unclick(handler)

    +
    +
    +
    +
    + + + + +

    Removes a click event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.dblclick(handler)

    +
    +
    +
    +
    + + + + +

    Adds a double click event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.undblclick(handler)

    +
    +
    +
    +
    + + + + +

    Removes a double click event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mousedown(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mousedown event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmousedown(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mousedown event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mousemove(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mousemove event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmousemove(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mousemove event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mouseout(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mouseout event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmouseout(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mouseout event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mouseover(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mouseover event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmouseover(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mouseover event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.mouseup(handler)

    +
    +
    +
    +
    + + + + +

    Adds a mouseup event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unmouseup(handler)

    +
    +
    +
    +
    + + + + +

    Removes a mouseup event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchstart(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchstart event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchstart(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchstart event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchmove(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchmove event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchmove(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchmove event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchend(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchend event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchend(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchend event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.touchcancel(handler)

    +
    +
    +
    +
    + + + + +

    Adds a touchcancel event handler to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.untouchcancel(handler)

    +
    +
    +
    +
    + + + + +

    Removes a touchcancel event handler from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. handler + function + handler for the event
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.hover(f_in, f_out, [icontext], [ocontext])

    +
    +
    +
    +
    + + + + +

    Adds hover event handlers to the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. f_in + function + handler for hover in
    2. +
    3. f_out + function + handler for hover out
    4. +
    5. icontext + object + context for hover in handler
    6. +
    7. ocontext + object + context for hover out handler
    8. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.unhover(f_in, f_out)

    +
    +
    +
    +
    + + + + +

    Removes hover event handlers from the element +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. f_in + function + handler for hover in
    2. +
    3. f_out + function + handler for hover out
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.drag(onmove, onstart, onend, [mcontext], [scontext], [econtext])

    +
    +
    +
    +
    + + + + +

    Adds event handlers for an element's drag gesture +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. onmove + function + handler for moving
    2. +
    3. onstart + function + handler for drag start
    4. +
    5. onend + function + handler for drag end
    6. +
    7. mcontext + object + context for moving handler
    8. +
    9. scontext + object + context for drag start handler
    10. +
    11. econtext + object + context for drag end handler
    12. + +
    +
    + + + + + + + + +

    Additionaly following drag events are triggered: drag.start.<id> on start, +drag.end.<id> on end and drag.move.<id> on every move. When element is dragged over another element +drag.over.<id> fires as well. +

    Start event and start handler are called in specified context or in context of the element with following parameters: +

    + + + + + + + + + + + + + + + +
      + + +
    1. + x + number + x position of the mouse +
    2. + + + +
    3. + y + number + y position of the mouse +
    4. + + + +
    5. + event + object + DOM event object +
    6. + + +
    + + + +

    Move event and move handler are called in specified context or in context of the element with following parameters: +

    + + + + + + + + + + + + + + + +
      + + +
    1. + dx + number + shift by x from the start point +
    2. + + + +
    3. + dy + number + shift by y from the start point +
    4. + + + +
    5. + x + number + x position of the mouse +
    6. + + + +
    7. + y + number + y position of the mouse +
    8. + + + +
    9. + event + object + DOM event object +
    10. + + +
    + + + +

    End event and end handler are called in specified context or in context of the element with following parameters: +

    + + + + + + + + + + + + + + + +
      + + +
    1. + event + object + DOM event object +
    2. + + +
    + + + + + + + + +

    + Returns: + + object + + Element +

    + + + + +
    +
    +
    + +
    +
    +

    Element.undrag()

    +
    +
    +
    +
    + + + + +

    Removes all drag event handlers from the given element +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Snap.path.getTotalLength(path)

    +
    +
    +
    +
    + + + + +

    Returns the length of the given path in pixels +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + SVG path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + number + + length +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.getPointAtLength(path, length)

    +
    +
    +
    +
    + + + + +

    Returns the coordinates of the point located at the given length along the given path +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + SVG path string
    2. +
    3. length + number + length, in pixels, from the start of the path, excluding non-rendering jumps
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + representation of the point: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate, +
      2. + + + +
      3. + y: + number + y coordinate, +
      4. + + + +
      5. + alpha: + number + angle of derivative +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.getSubpath(path, from, to)

    +
    +
    +
    +
    + + + + +

    Returns the subpath of a given path between given start and end lengths +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + SVG path string
    2. +
    3. from + number + length, in pixels, from the start of the path to the start of the segment
    4. +
    5. to + number + length, in pixels, from the start of the path to the end of the segment
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + path string definition for the segment +

    + + + + +
    +
    +
    + +
    +
    +

    Element.getTotalLength()

    +
    +
    +
    +
    + + + + +

    Returns the length of the path in pixels (only works for path elements) +

    + + + + + + + + + + + + + + +

    + Returns: + + number + + length +

    + + + + +
    +
    +
    + +
    +
    +

    Element.getPointAtLength(length)

    +
    +
    +
    +
    + + + + +

    Returns coordinates of the point located at the given length on the given path (only works for path elements) +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. length + number + length, in pixels, from the start of the path, excluding non-rendering jumps
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + representation of the point: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate, +
      2. + + + +
      3. + y: + number + y coordinate, +
      4. + + + +
      5. + alpha: + number + angle of derivative +
      6. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Element.getSubpath(from, to)

    +
    +
    +
    +
    + + + + +

    Returns subpath of a given element from given start and end lengths (only works for path elements) +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. from + number + length, in pixels, from the start of the path to the start of the segment
    2. +
    3. to + number + length, in pixels, from the start of the path to the end of the segment
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + path string definition for the segment +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t)

    +
    +
    +
    +
    + + + + +

    Utility method +Finds dot coordinates on the given cubic beziér curve at the given t +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. p1x + number + x of the first point of the curve
    2. +
    3. p1y + number + y of the first point of the curve
    4. +
    5. c1x + number + x of the first anchor of the curve
    6. +
    7. c1y + number + y of the first anchor of the curve
    8. +
    9. c2x + number + x of the second anchor of the curve
    10. +
    11. c2y + number + y of the second anchor of the curve
    12. +
    13. p2x + number + x of the second point of the curve
    14. +
    15. p2y + number + y of the second point of the curve
    16. +
    17. t + number + position on the curve (0..1)
    18. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + point information in format: +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate of the point, +
      2. + + + +
      3. + y: + number + y coordinate of the point, +
      4. + + + +
      5. m: {
          + + + +
        1. + x: + number + x coordinate of the left anchor, +
        2. + + + +
        3. + y: + number + y coordinate of the left anchor +
        4. + + + +
      6. },
      7. + + + +
      8. n: {
          + + + +
        1. + x: + number + x coordinate of the right anchor, +
        2. + + + +
        3. + y: + number + y coordinate of the right anchor +
        4. + + + +
      9. },
      10. + + + +
      11. start: {
          + + + +
        1. + x: + number + x coordinate of the start of the curve, +
        2. + + + +
        3. + y: + number + y coordinate of the start of the curve +
        4. + + + +
      12. },
      13. + + + +
      14. end: {
          + + + +
        1. + x: + number + x coordinate of the end of the curve, +
        2. + + + +
        3. + y: + number + y coordinate of the end of the curve +
        4. + + + +
      15. },
      16. + + + +
      17. + alpha: + number + angle of the curve derivative at the point +
      18. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.bezierBBox(…)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns the bounding box of a given cubic beziér curve +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. p1x + number + x of the first point of the curve
    2. +
    3. p1y + number + y of the first point of the curve
    4. +
    5. c1x + number + x of the first anchor of the curve
    6. +
    7. c1y + number + y of the first anchor of the curve
    8. +
    9. c2x + number + x of the second anchor of the curve
    10. +
    11. c2y + number + y of the second anchor of the curve
    12. +
    13. p2x + number + x of the second point of the curve
    14. +
    15. p2y + number + y of the second point of the curve
    16. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. bez + array + array of six points for beziér curve
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + bounding box +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate of the left top point of the box, +
      2. + + + +
      3. + y: + number + y coordinate of the left top point of the box, +
      4. + + + +
      5. + x2: + number + x coordinate of the right bottom point of the box, +
      6. + + + +
      7. + y2: + number + y coordinate of the right bottom point of the box, +
      8. + + + +
      9. + width: + number + width of the box, +
      10. + + + +
      11. + height: + number + height of the box +
      12. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.isPointInsideBBox(bbox, x, y)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns true if given point is inside bounding box +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. bbox + string + bounding box
    2. +
    3. x + string + x coordinate of the point
    4. +
    5. y + string + y coordinate of the point
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if point is inside +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.isBBoxIntersect(bbox1, bbox2)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns true if two bounding boxes intersect +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. bbox1 + string + first bounding box
    2. +
    3. bbox2 + string + second bounding box
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if bounding boxes intersect +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.intersection(path1, path2)

    +
    +
    +
    +
    + + + + +

    Utility method +Finds intersections of two paths +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path1 + string + path string
    2. +
    3. path2 + string + path string
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + dots of intersection +

    + + + + + + + + + + + +
      + + +
    1. [
    2. + + + +
    3. {
        + + + +
      1. + x: + number + x coordinate of the point, +
      2. + + + +
      3. + y: + number + y coordinate of the point, +
      4. + + + +
      5. + t1: + number + t value for segment of path1, +
      6. + + + +
      7. + t2: + number + t value for segment of path2, +
      8. + + + +
      9. + segment1: + number + order number for segment of path1, +
      10. + + + +
      11. + segment2: + number + order number for segment of path2, +
      12. + + + +
      13. + bez1: + array + eight coordinates representing beziér curve for the segment of path1, +
      14. + + + +
      15. + bez2: + array + eight coordinates representing beziér curve for the segment of path2 +
      16. + + + +
    4. }
    5. + + + +
    6. ]
    7. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.isPointInside(path, x, y)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns true if given point is inside a given closed path. +

    Note: fill mode doesn’t affect the result of this method. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + path string
    2. +
    3. x + number + x of the point
    4. +
    5. y + number + y of the point
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if point is inside the path +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.getBBox(path)

    +
    +
    +
    +
    + + + + +

    Utility method +Returns the bounding box of a given path +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + bounding box +

    + + + + + + + + + + + +
      + + +
    1. {
        + + + +
      1. + x: + number + x coordinate of the left top point of the box, +
      2. + + + +
      3. + y: + number + y coordinate of the left top point of the box, +
      4. + + + +
      5. + x2: + number + x coordinate of the right bottom point of the box, +
      6. + + + +
      7. + y2: + number + y coordinate of the right bottom point of the box, +
      8. + + + +
      9. + width: + number + width of the box, +
      10. + + + +
      11. + height: + number + height of the box +
      12. + + + +
    2. }
    3. + + +
    + + +
    +
    +
    + +
    +
    +

    Snap.path.toRelative(path)

    +
    +
    +
    +
    + + + + +

    Utility method +Converts path coordinates into relative values +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + path string +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.toAbsolute(path)

    +
    +
    +
    +
    + + + + +

    Utility method +Converts path coordinates into absolute values +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + path string
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + path string +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.toCubic(pathString)

    +
    +
    +
    +
    + + + + +

    Utility method +Converts path to a new path where all segments are cubic beziér curves +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. pathString + string array + path string or array of segments
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + array + + array of segments +

    + + + + +
    +
    +
    + +
    +
    +

    Snap.path.map(path, matrix)

    +
    +
    +
    +
    + + + + +

    Transform the path string with the given matrix +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. path + string + path string
    2. +
    3. matrix + object + see Matrix
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + string + + transformed path string +

    + + + + +
    +
    +
    + +
    +
    +

    Set.push()

    +
    +
    +
    +
    + + + + +

    Adds each argument to the current set +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + original element +

    + + + + +
    +
    +
    + +
    +
    +

    Set.pop()

    +
    +
    +
    +
    + + + + +

    Removes last element and returns it +

    + + + + + + + + + + + + + + +

    + Returns: + + object + + element +

    + + + + +
    +
    +
    + +
    +
    +

    Set.forEach(callback, thisArg)

    +
    +
    +
    +
    + + + + +

    Executes given function for each element in the set +

    If the function returns false, the loop stops running. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. callback + function + function to run
    2. +
    3. thisArg + object + context object for the callback
    4. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Set object +

    + + + + +
    +
    +
    + +
    +
    +

    Set.animate(…)

    +
    +
    +
    +
    + + + + +

    Animates each element in set in sync. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. attrs + object + key-value pairs of destination attributes
    2. +
    3. duration + number + duration of the animation in milliseconds
    4. +
    5. easing + function + easing function from mina or custom
    6. +
    7. callback + function + callback function that executes when the animation ends
    8. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. animation + array + array of animation parameter for each element in set in format [attrs, duration, easing, callback]
    2. + +
    +
    + + + + + + + + + + + +

    Usage

    + + + + + + + + + + + +
    // animate all elements in set to radius 10
    +set.animate({r: 10}, 500, mina.easein);
    +// or
    +// animate first element to radius 10, but second to radius 20 and in different time
    +set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]);
    + + + + + + + + + + + +

    + Returns: + + Element + + the current element +

    + + + + +
    +
    +
    + +
    +
    +

    Set.bind(…)

    +
    +
    +
    +
    + + + + +

    Specifies how to handle a specific attribute when applied +to a set. +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. callback + function + function to run
    4. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. element + Element + specific element in the set to apply the attribute to
    4. + +
    +
    + + + + + + + + +

    or +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. attr + string + attribute name
    2. +
    3. element + Element + specific element in the set to apply the attribute to
    4. +
    5. eattr + string + attribute on the element to bind the attribute to
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + Set object +

    + + + + +
    +
    +
    + +
    +
    +

    Set.clear()

    +
    +
    +
    +
    + + + + +

    Removes all elements from the set +

    + + + + + + + + +
    +
    +
    + +
    +
    +

    Set.splice(index, count, [insertion…])

    +
    +
    +
    +
    + + + + +

    Removes range of elements from the set +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. index + number + position of the deletion
    2. +
    3. count + number + number of element to remove
    4. +
    5. insertion… + object + elements to insert
    6. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + object + + set elements that were deleted +

    + + + + +
    +
    +
    + +
    +
    +

    Set.exclude(element)

    +
    +
    +
    +
    + + + + +

    Removes given element from the set +

    + + + + + + + + + + +
    +

    Parameters

    +
      +
    1. element + object + element to remove
    2. + +
    +
    + + + + + + + + + + + + + +

    + Returns: + + boolean + + true if object was found and removed from the set +

    + + + + +
    +
    +
    + +
    +
    +
    +
    + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json new file mode 100644 index 0000000..da75abb --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/dr.json @@ -0,0 +1,39 @@ +{ + "title": "Snap.svg", + "output": "doc/reference.html", + "template": "template.dot", + "files": [{ + "url": "src/svg.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js" + }, { + "url": "src/element.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/element.js" + }, { + "url": "src/matrix.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/matrix.js" + }, { + "url": "src/paper.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/paper.js" + }, { + "url": "src/class.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/class.js" + }, { + "url": "src/equal.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/equal.js" + }, { + "url": "src/mina.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/mina.js" + }, { + "url": "src/filter.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/filter.js" + }, { + "url": "src/mouse.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/mouse.js" + }, { + "url": "src/path.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/path.js" + }, { + "url": "src/set.js", + "link": "https://github.com/adobe-webplatform/Snap.svg/blob/master/src/set.js" + }] +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md new file mode 100644 index 0000000..51c18ea --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/history.md @@ -0,0 +1,49 @@ +#0.4.1 + +* Bug fixes. + +#0.4.0 + +* Moved class and element related code into separate plugins +* Added `Element.align()` and `Element.getAlign()` methods +* Added animation support for `viewBox` +* Added support for `` +* Added method `Paper.toDataURL()` +* Added method `Snap.closest()` +* Added methods to work with degrees instead of radians: `Snap.sin()`, `Snap.cos()`, `Snap.tan()`, `Snap.asin()`, `Snap.acos()`, `Snap.atan()` and `Snap.atan2()` +* Added methods `Snap.len()`, `Snap.len2()` and `Snap.closestPoint()` +* Added methods `Element.children()` and `Element.toJSON()` +* Various bug fixes + +#0.3.0 + +* Added `.addClass()`, `.removeClass()`, `.toggleClass()` and `.hasClass()` APIs +* Added `Paper.mask()`, `Paper.ptrn()`, `Paper.use()`, `Paper.svg()` +* Mask & pattern elements are sharing paper methods (just like group) +* Added `Set.bind()` method +* Added syncronisation for `Set.animate()` +* Added opacity to the shadow filter +* Added ability to specify attributes as `"+=10"` or `"-=1em"` or `"*=2"` +* Fix negative scale +* Fix for `path2curve` +* Fixed shared `` issue +* Various bug fixes + +#0.2.0 + +* Added support for text path +* Added `getBBox` method to the paper object +* Added `Element.appendTo()` and `Element.prependTo()` +* Added `getElementByPoint()` +* Added `Set.remove()` method +* Get rid of internal SVG parser in favor of the browser +* Fix for `xlink:href` setting for images +* Fix `Element.animate()` +* Fix for animate and stroke-dashoffset +* Absolute transforms fix +* Fix for animation of SVG transformations, matrices and polygon points +* Various bug fixes + +#0.1.0 + +* Initial release \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json new file mode 100644 index 0000000..d3794c4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/package.json @@ -0,0 +1,24 @@ +{ + "name": "snapsvg", + "version": "0.4.1", + "description": "JavaScript Vector Library", + "main": "./dist/snap.svg.js", + "repository": { + "type": "git", + "url": "git@github.com:adobe-webplatform/Snap.svg.git" + }, + "author": "Dmitry Baranovskiy", + "license": "Apache License v2", + "dependencies": { + "eve": "~0.4.2" + }, + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-uglify": "~0.2.0", + "grunt-contrib-concat": "~0.3.0", + "grunt-exec": "~0.4.2", + "mocha": "*", + "expect.js": "*", + "dr.js": "~0.1.0" + } +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot new file mode 100644 index 0000000..f92c011 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/template.dot @@ -0,0 +1,157 @@ + + + + + + + Snap.svg API Reference + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + {{~it.out :item:index}} +
    +
    +

    {{=item[0].name}}

    +
    +
    +
    +
    + {{~item :line:i}} + {{ if (i > 0) { }} + {{ if (line.text) { }}

    {{=line.text.join("

    ")}}

    {{ } }} + {{ if (line.attr) { }}
    +

    Parameters

    +
      + {{~line.attr :attr:j}}
    1. {{=attr.name}} + {{~attr.type :type:k}}{{=type}} {{~}} + {{=attr.desc}}
    2. + {{~}} +
    +
    {{ } }} + {{ if (line.html) { }}{{=line.html}} + {{ } }} + {{ if (line.head) { }}

    {{=line.head}}

    + {{ } }} + {{ if (line.code) { }}
    {{=line.code.join("\n")}}
    + {{ } }} + {{ if (line.rtrn) { }}

    + Returns: + {{~line.rtrn.type :type:k}} + {{=type}} + {{~}} + {{=line.rtrn.desc}} +

    + {{ } }} + {{ if (line.json) { }}
      + {{~line.json :a:j}} + {{ if (a.key) { }} +
    1. + {{=a.key}} + {{~a.type :type:k}}{{=type}} {{~}} + {{=a.desc}} +
    2. + {{ } else if (a.start) { }} +
    3. {{=a.start}}
        + {{ } else if (a.end) { }} +
    4. {{=a.end}}
    5. + {{ } else { }} +
    6. {{=a}}
    7. + {{ } }} + {{~}} +
    {{ } }} + {{ } }} + {{~}} +
    +
    +
    + {{~}} +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html new file mode 100644 index 0000000..a7a5f21 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/Snap.svg/test.html @@ -0,0 +1,17 @@ + + + + + Test + + + + + + + diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json new file mode 100644 index 0000000..d9fc38c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.bower.json @@ -0,0 +1,30 @@ +{ + "name": "bpmn-js", + "version": "0.10.3", + "authors": [ + "bpmn.io" + ], + "description": "A BPMN 2.0 renderer and web modeler", + "main": "dist/bpmn-viewer.js", + "keywords": [ + "models", + "diagram", + "renderer", + "modeler", + "bpmn" + ], + "ignore": [ + "test/*" + ], + "homepage": "http://bpmn.io", + "_release": "0.10.3", + "_resolution": { + "type": "version", + "tag": "v0.10.3", + "commit": "8417ce12aa78ada7577338b33a9364fd35a126b2" + }, + "_source": "git://github.com/bpmn-io/bower-bpmn-js.git", + "_target": "~0.10.3", + "_originalSource": "bpmn-js", + "_direct": true +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore new file mode 100644 index 0000000..7559d42 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/.gitignore @@ -0,0 +1 @@ +bower_components/ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE new file mode 100644 index 0000000..38500c2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 camunda services GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The source code responsible for displaying the bpmn.io logo (two green cogwheels in +a box) that links back to http://bpmn.io as part of rendered diagrams MUST NOT be +removed or changed. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md new file mode 100644 index 0000000..a767a20 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/README.md @@ -0,0 +1,46 @@ +# bpmn-js Bower Package + +This is a packaged version of [bpmn-js](https://github.com/bpmn-io/bpmn-js) for usage via [bower](http://bower.io). + + +## Usage + +Install the dependency via + +``` +bower install bpmn-js +``` + +Include the file into your project + +```html + + + + + + +``` + + +Checkout the [examples repository](https://github.com/bpmn-io/bpmn-js-examples) for a complete example of [how to use bpmn-js with bower](https://github.com/bpmn-io/bpmn-js-examples/tree/master/simple-bower). + + +## License + +Use under the terms of the [bpmn-js license](http://bpmn.io/license). \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json new file mode 100644 index 0000000..bccfc96 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/bower.json @@ -0,0 +1,20 @@ +{ + "name": "bpmn-js", + "version": "0.10.3", + "authors": [ + "bpmn.io" + ], + "description": "A BPMN 2.0 renderer and web modeler", + "main": "dist/bpmn-viewer.js", + "keywords": [ + "models", + "diagram", + "renderer", + "modeler", + "bpmn" + ], + "ignore": [ + "test/*" + ], + "homepage": "http://bpmn.io" +} diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css new file mode 100644 index 0000000..11e91f4 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css @@ -0,0 +1,150 @@ +@font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.eot?5069274'); + src: url('../font/bpmn.eot?5069274#iefix') format('embedded-opentype'), + url('../font/bpmn.svg?5069274#bpmn') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'bpmn'; + src: url('data:application/octet-stream;base64,d09GRgABAAAAADXYAAoAAAAAnngAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAEQAAABWPgtJqmNtYXAAAAE4AAAARQAAAVq5NgKZZ2x5ZgAAAYAAAC5lAACNnHbOYsRoZWFkAAAv6AAAADEAAAA2BeU9I2hoZWEAADAcAAAAHgAAACQHggO0aG10eAAAMDwAAAARAAABhHroAABsb2NhAAAwUAAAAMQAAADEEJsyAG1heHAAADEUAAAAHwAAACABfwRubmFtZQAAMTQAAAFSAAACPXo4dZVwb3N0AAAyiAAAA08AAAl47YJ7bXicY2BkfsE4gYGVgYOpimkPAwNDD4RmfMBgyMjEwMDEwMrMgBUEpLmmMDi8YHiRxBz0P4shilmZoRIozAiSAwAREQwzeJxjYGBgZoBgGQZGBhAIAfIYwXwWBgsgzcXAwcAEhAwvYl4kvEj6/x+k6AXDi3gIW4JR/L/4P6heKGBkYxjxAACHqQ6BAAAAeJzsfAucHFWVd517693V766qeXX3dFc/5j3T3dPdM3nMEBLIY/KAhIQQQYEE5ZkECAGBhNeQfCAIouIuRBNBBBXYFdhdl5eAigjBdXF9rKKwqDxEWViz3+dqprPn3uqemTxIJ0z287e/X6amqm5V3b733HPPPed/zz1VAhGEPbvpo+QpISQ0CQIkfSQSI4UhKCvZYegBDWTLxjPZ1TEyvbV1+kjH8edan90w9PnY4sovKgWtkIFvNafIU/jkJMwAS45tW3RlR6tT+W3l28kRCUr2kCBhHU/RQfIm1uEIbUJZmMNqkqOgyBE7UervhWIp0wlSUjbDMSgk8qVyuJRxElI70EQ46fjAxvtDkKU9kE7KCpVjwLPAAx3R+/1+st7nu48098ytvObx5sGrw/d0LzkGvEbltcoYUKDTK2eOADH8pIsEGww8esGnsyuvHcSjn7yhdmkDkk2gQSrrXepOv2fsR5rX0EmH4c9VFPhbCBmVpwwvDRkwrHvB66k8bYSo14BjjJAgCBTbeAf9Bk0KASEiHMvapwC2Dqx8GUr9WcgoGkn3OX5qsj1OC2wfpkW291IHd9jlMypn6Dps98Q8ePBUzvD4YUvl8srlcAUhIoVnRDwAFcVn2MES97tFk+xHMc/kYoZ4AVt+M57JlA5SFDZFkLEtN9MXsS0+ISp0CdOFE4TTsUWyqKAwWKlSiGSyGaWEaVmRU9lMqDwENvYLe1oqlzLZHlBiYPuwfzFjCZ8qsmLLimWX7VI5k2W7rGSy7FqxFUzzW/CHr+4RrMCWa66E4PfnrvrR1qD9+beCxq3XXlPZvWSRsnJw+xm3vqSI26++7BcDxa5Tc5fPvurvCfz1xnVPOvGRD6dOPL6za/1AqaNr7YWd3YMDLFUuDwwODqztX3dh8cLSQP8AXtIk+bev3DI2a0byG6ACuUcnOfjBnTf+tq97yboLIXDOnMWdz9163T9F7bMvuODdEzv7+uCRqzY+7Dc2nnf2i2XTWtfdiSV1daxd39U5OFAud3WUBgasgcF1/WuxjjLWURocQB4GkYd3c3mgyE+PsFj4srAbhuEz8B6ZQTaTZ6hET6Vfof8pDiNng4mgVFDKZqJoB3OOgpuJu18x42KhPL7Z49uwVOyVnKxTxD1rO34p3jgsMjHKFnFzegH/8ZwtVlOYZpcsjXfcLJLjJyZWAiY74+aH6gVPsLR7j5hxqTDcWOwVEznHlV5xH3riMieJOL0ao4hRhiUTXgYrC4vnrcICqWPyWvA2KzaK8t9LJWyBxYrFViDRKjuITrUBrE1I+HiTCDYUiZdMh5PNjrZZwJ1tcY2VgXmy41t5fOsVJUa+YvMf8jarfBjK+HBYwUOB58u6NdBqmVgqqyJO3DGLxXvGC+dFSqwkP7JpmBSHoYi8KQ6TwrBeLONjbBphhTA2kUIcqpSyFN5j5QIWzUpnLGzB4lRHGd/8IuN+TQKGPewAvJIiI4QVzzJgGbwCLAqLZZwc7xQr4fjxDl6ojHZeUJGXwZsiQhbuqDz964u2VZ7b5pE9kiFJckbWVZGggiCyqImdkibhny7FcGcJsUFDHSKKAHhUMpIs4Q/lXZIo4U1CVGIoqoKPcMOB7ycaoUG80DTUMCIQStw9BJooo/pB/ayyA26qiKWKKoj62HuSqEp4IYoG7ioFXp6ogZ/9nEoEK6cspYqapEhSQCYy8WN9bj4Fi1IwJ6GsuJBXlxQZL1RVxEoyWB4WquCpiaqKQrE9nDYkGChLi9jujMhuS94HRFXG20iCiVRQtIkGaBrlzcDaAZvME5KoYSZU1KS6Ub7zP5k6hDMHWwWjErYXC5LpeFbFAiwI76CiR0IkzaUHSwa+4RlQX2GPELyr1FgoU6SDimPfwmKxMJaV/xFQWYqyVmJZlBUl0fGHjHCNvIM/kt172Ge8ZIt1qYG/kLGDdaK6VSs8D9Kj7r5XQg6y3yCzsTqkmOhYOJVrJBMI1ShWeNlIrETeReawh3gPr5gMGPgz4kqQqKmSQrFbZYm1UK79XnN7bwz5jzxF1smGjKzHHma9gL2GO5MafMxlRGQUoFygzFCTirrSiE2o8h85xRmtwjakBBS9xaOERA+KAJMCMcBrAM56Q/IitZIqZXiBXCK5dKIU4h3C2S5KlTmYSyauMGIWrwZeECWWZGOlEXkTkXG0eHRNqso9SmVYYlnwPx1DqjWDekmIjRuIMDZYXfwh7s2iLPJuYs2iOMDwrhwBPgKZoIhSi5cdaU3E/1R5DgZyq4YefXQT/Afju8IgA2eKhG3Xan0vwbisUso7dhnreUXTdNAmjR4lInpFsZUJFZduDUf5pJpVPjJVcBnjjk4GEHCsie6QNiaPaLZ7bbcADdtgiFWeSIoRY1yNTNIYuEu8M/kAkJg40pqcogARSlyuq5KmMj1QExeWJVuVLz9jjGZowISfiQv1KNjGmtYyqCiPj04yMQxFarG2asiG6Zz7XskzkUt3qEIV0efBExtuOMCIqKJIVAVFcrkBNMB1GgUdqpUz3mjAyvgKFzLW99gFXrFZ8mqsrSAmRYk9qnUoPp4knzHceVJ0R1k3sCJEsaqRNSmLMqPpYh75qjKplNXJIijXdLQlI8uoGMDnqiYH8S5q/ATuki77MXujpIMo1xqmQrsrrZqUrNkAW0K1SgY5/xUkqIl6PLzLIn4UJ5UNHFdmcGiayHVQAtXRyVWqhKoP6d/BlDcaBI0PaEOWWLuZcKB+5KpO5IqgqqtQHLh+wx6WaYDK490lu32jLMB8VDZwIHIdx8t2NSIXGq2mRqGqSFnpqOAYsaiw0QIyBcZtAGpJ7ChZqylYOqEGXWODvcZ0t1gVOwig3aGSRnVWtB+TshGpPkIVKWsityy0VjcqZpS9yRaQmxtXRyNuZHOlrfSbiBv9QkzICB1CL+JDHwlZIsLoKrbOjyNvwpA3YmvEjUo2YmbTERNx9K4bXjun71Egm6/5kqrccFnvR/u3/iSTPOmc9ZX3zv3YcKHve+eec/Y/P/98wy1wytx5NAm3/1fl/z4z1NXz8g1b35xpN+TuvvaK90aWeFasAHrF+i17Fiz4zC23QNstp685C7ePFvJIp4Z03oX4thWxrS0sFR6DOfBFeJPkyReQXgRlBbOAaApxICbwEqFqsRDuhCoK5KBlmO4FbBG5sLmQWEW1ftmM6whiGDKKezlWYQCwV3Y4GPRwlKs4LlSUGFAVTfyvgUwGOd3rKqglDNAx9Gf6dZMh62EON4czbOqFBE2Awr03jsKHkVpwkRfHTzWkOHnLVuFYFd65oIxvLswTWRO8NdyIddouDXQC4hfdHcFjuVDkzOD4jjJUx9hAeMIFeYUqomQgshBXWB3IatsFdVUU3qs7mMapAjy4adNNmzZd8uFNm/C/oHhlr1fJen0uMsCRJTLjaqOGwL92dpClOJpCNpRlquMMTfYqbzGdTZkYMyTFEIKKkqniFdPTTKIpg4VUR4OjufqbIMCr4iHEGCCxO6jSmRYH174rtIoHEUhIY3+QFCAT2phlIMx8sEr58CHs92z4MivAxxxTGlUTwPSnj4EF9ngCO/FSqhAH8xAOWlizUJMwhSHKqkQeQu1dNTJc7eATiQ1UmQ172cWuXC8ydhGQAO3beHZmVtTdX+b4l+fh2kx3m85pYQbWZQjeUUQX5DC0A6iCyNe5mdZFP+pqPzP2qJIRkkjchHs1WY5IEJIVCdytBTx4wn8P09lcdTICxn7JVA3vCdFb01/UgyoHFWONFawD2YYmlXpplFCvSL0aoh23EGbLIySIgDhIUCujyicIuCXCnwYZvEowQbppk42CtPk0+DRqOWCN4harCllFlzESGj0sCNsnMlW+ZAKPstYjhiKqD62k7PYzt/3MroZ0lXUy6lod8Z2hurZDREtCGcTHbmEygxqaSRFxFSvqbYPjcFdGeDfzQl2jUpMxppIZeqOEwQaOEVjv1kA6oA1Q+RkJxdZzsFSF8vgLSowaSmDcQ/FBCZQJ099oyESoPItVcnILSJ5MquXKHGxjSwHBhCTrCueAC6vwKY40kBR/BsvDhlGx+q9QH+1CgMPkJexitmZZCSvesIyjN+6tyQLbGL7ixWmaisXJAQ8z7bLUi2kc1gqb+lQeYpM5kc3n0FyxNhjAWa4xRMCkRq5iZOqXOWYRFYNBOYZLOfxmmEDk9gyBTXU8IsqU2Dxj3L6C2/8acMaLaLl5EwBhHeMESxGGRl1z7wWCtoQ7nWiO7BCyzNaBEkH7Zit2uWhmi4rNTF4RbZ/rUULLgukegF1bH6b5zvbyE+S5tJ7MZzv66APXXfcAxaMk4TP6MNlBH7r+2As72xsSiNzgOYk8amc61g5fcz+l91+DRx2fX/8Qt7k/pP9C3kKbGxemCx8SNgpCGOsKYpUJrC3YA1kpgRdBvJnAiyBaXccHpksS/puJIt7G/yHAhFKyY1C2zAhiKpvnSWbwyTDPgU3B1uFdZhNx709GwSmypzHIl36ydB0h65aSacvWErJ22dizZNq0hQALp409y8/foW29YHqV1pCVIHAqOHYkoXqD0HeM12jpkyGEoJ02+En/CUUSbMT+9VkgJW/TNCsBg9JPpTKJmx46sLRM3iJrl1bWLmXVLIXb8DwDRqZV1k4bATzDbdNG1kBfOtxqEK9uxM2rrgrFDY+fGvFwui+PbfagYIRaPdiPqpro7kyq2OXUaA2pcuQyNBwx/+WrVq0iZNXloZhHdrq6XWyD/Xw1GRVEQRUM7ikVwo3AnF+mU06YCaV6Pps27P79E088QxaOPfJM9UxGKz+r/JyMPDM6Oir9+c9/5j5XPJTI45hSEIcI4WBhfHvo2qtwI4+PzZnYx3HL49wvpwqWkBR6hBnCAmGFsJp5OJUEtexEiXW+VbJLll3KKBmb+TVtq8R6T+L9zaDYEAJUCydMEebfxEeSzHvVymSZwALPZ3PIlnCfIHbL9KLcnn46XP3UyMLKSwuXpJaHAsfHYjOi8Xlx4532otUdb/VajUNtY+9l+u2I3Wm3t4Sz5La4rnhai6Idlol395cSBlUts7vJgzNtgzyYntse7UgMfqxLN8Z+mC40JxdkE50tC2fIJH//A5DZunUr3EdpIm4xE5hsILAk0B/OTw+VzPZ5jXpwVsJaILUeFw10V35sHB+dNSOpx/IXlFQ15Jnb4syJ0QUtM4dVT+XhcK8B2YheSBvNoX5vuEUOZ4hVoJN9nV6hSWgXzheegVY4Dx5EbbuM3E7eoXPoFvqCaItn8BUGiCFs5S7kfAxZLvdUUSzyyypNR3DHnMGdcMiuRr94yI5G53A9jRyAHb6jUZIO6hR0DtMrGJUO4BQsvq9T0KEu0D4cJ/IH8SET6bBdyA4cqgMWeSQekgPWCbv8OIgP1JYO6gJ1YNes83P2yiumDy2WZw925WZ8JNqV67/sZG+icfGaaNQnGqpfOeWU5qg+W/RNxZX4dQSZR9KVKMEon14eQV+iNvbdw/cliuTmD+7gk8YedIHrkfHw+eCeOh6+4CE5+MR7ET1NwR/+70fSHa6O7Tpi7nCR/M1hO35FnN2IH8DzK37miDhJvaTpCDhJRdI//9IrPxQzrXOvvaDFzM6/6PxY3HfyFf3pzlyxRJsUSWssFOR/P3yvIw6PI+R2nMFH2hF3O5KvHRG/I1w6RcffF5l+O3KOP7poap4/8v2/nKscJ49H1Fde+c4UncLI+Kl5hXGOOXU/quthmqondf8YhnnC8inGMEQmuzXzk/yaUw1cCG/ffvn27Wek0tu3z9+xY4oRCqctXnzltm1Xbmv4/ILPf34BmyIp+/FitjBXWDg1buzvdZ4iE5r28klPiQV37++x3js+Z/aB43PKfQit4yh7cXGYxMmw2EuGSa/oJwg0DxKdswuVgp9F09xwAzv6UQjFG25g4nqAuwcJ0Xmg3m8n7tb8JnteobeQ32O/8r60eIwN4Ky1TG/xVv71ip6uX/wyGIDHuruPWUB+r3x2WmfPq68G/PBUV89Vn+Q8uZnupA5fayi4vpeqPLC5bqa20HCwIB54+yt/jvhvvPZyMHYu6Oz62SfC2qaHZXrThWu/256dtzp1wgGjcmhS+vW9t4wNT3MeAema0a9q8MkHNl30d1b43HPO/ek001p7oDAbJss60vxZ+l3sx6CQEPLYk/NQkk8QThJWCqeyXnVYG9zVkmobCmxWzsTaXS1xc0yS6/EMtWaaPBwn6IRxrCuTdvgDkG3/kYmd9iqEN154Ydj6h+tLMyXp1l80W+svvqyy6/HY8eVH1kvS9c+GfNdsXP+befPVpYWbT6B04wNe/arzz32hv9C7qv3MNdBT+W2l0vS8+0eT9Onbr6/suUufP/8PW7Y+n/TlyGOfvObt4eH274L/kpUf6xAfGr3yx11tc04/688fmXZsL/3iJesfi0dXnHHWL49rTXzcqNwKVzZUHoFsY+OChoblDQ2LGhpQymtzcrY+s0p4CMfRCOyAMTKP3Ei+T4P0bPp3aGFGDrJaczQS6Wgk0v/XSKS9Fql6jwYjHQ1GOhqM9L8xGGmfNcLPHg1HOhqOdDQc6X9jOJKgjs+bGI5sEVqFlNCGc8g+d7YQ40tc45NDvgBqvy9+3vXUHkna85R7vP9Xovir+/nR3BcRj2d6ak9XLRMe//nAWFcfj0Vy15/WCC/CCngY/kTmkL895BUnejQ46S8VnHTIqy/DRwOXjgYufdDApUPy/cOCowFNRwOaphbQ5MalLCU7xuNSzEQRqvvtE+EoZMe111b2uDv7CeG/W0dGheXC17iHchAQBsl48oE5CBHLHoBcDApWeRDypWKOvTRZLOSZIwttTWII+jNKoljIDUFxENPMoCWzTrKvXykNkyHI5jJZJW9b9iBYMi+bcA9vwUKNnstbEbkTKWRnJ2Em8AavGNOFvGXypJwdZKFMg9ADxVw/1ssCYXIl2OnxdJ60sTOkojD7F097+echC+zQE7vDjVRubKpAT4NpW5WXXrMaGqw1F3047PHgYNJ7Ah6q6T4UbI+uovLVG2ydCajXE/7BmogZMd+AghkOWZUXgTaYEjVDlT3PhIIQDP785cERP/ahGmp37u3wkFG1ZdqJ8YHoUNRMm8PDAKZlh0xfsDkKYWjstdmxwW5i6lHWe4KBlC/AQJfPSPhl3bY9iLywo60uOxrutKMNjQFP3G9GQgAzZ5opMzrUXI7ZG1oUoda3l2EfhQRTaMa+7UvmZDMYKSTyxWB/FjsoISWktFRIBxMXA592k0q88gZ5r7K1cg1sJrB5jJBRIGOPomAdjwr516+98cbY09V3SH9BLyGv8PgoFhvFkVQimIAgdkiwEEwUE8GLKRlTyTtjIVhdeRMa2qCh8iZ5RRrDivSxELm78mZb9T4jVRyPJw8gdusSBvaLJnfsmn/UDScvKO/jD4R3t766T1i5ev1L6clx5ZcfP9mDQ5Pk9j/uHVlO77raDS1fDuIV67f8YPI8cRKtbux7d73Id0lWsrRUtqlll5WsUj/uHbKFwtUbZs3acsPMmbHolfm6se8vnX3OlytfXXbSHSAvXjh7w6cWHfj92GH+RvPUVlPcyLOprqJ0TESXTXERZXU1eOxA7Z0tjEy5vZN6Tlam2uyf7NWvTQ1TbPvGfbo9kxWq43NivSRTd72ktkRWd4nEXfqqtyZyV21Vqzau36VfIzuRFkfICv0HiVh1UIs4btRqGJVJOQoTA/ynx55MyMnHksFZ7Dxr7LtksHsGwIzuDZUHL+6ZDjD9KYhUfnfxokU9ixaRnZilstLNCvfhuQ9zVlayX/RXdmIa7uueUbmj8rvf26Ue9pP96Ow8DDqRxJ+4dZFpVfKeJdPGydvQPU5e+oVDJu3te3t7XVs7Tle8frTv+9Ix9iyn4mDVu1V/MPnhg6Su/NSkv54EXVIT6wON6TnCoimOaUwj+2z2Xn/Wx0K2p6zMkgPJ1hmtm4ZnJpNzgrlQbKov769+fnXiuMTW5y65YO2C4DSleB5fG997PXGpcLqw7sisJNo+UnM8oJUlNcdDYR/PwxFaV+w95ty+SbNocfqpE9Po7vJe8+gprjmeAfMmT6Vg/oUHnEvtjT+YzGddv9FB32bbX4rqmvXL95eTOnb9hf0lYV9ak+7bCHXevKta7fokTrbLdYj75rjldWM3Jt5NqPneDqbta+8nRA8QV1/v7QIL/lhJ3HTTPZCovHJP9Vz/RYG5Tz4JV47Onj278brrrnPxESo7CTFyA46oacKxwgIcVQILiI+JOKFhJJd6xNIwSAlkJt5T3Fs0y062HLELpf6s8j5nuIacNA96ZvapAyNh2JrtD8S0/MwumLMsVLkKVs5tTRP2sLSwcl9rly/uyc/oAvAHkwlZflGW/1GSHpekTbL8A1m+V5LwiGC8sGLhrBnThuZ363ZHJDt35oyZs08seIyubCe/P687kg7y28lA2mwvAs4GNbgYdMD/DXtdTczj2ByBsP4L42yA4fj1MAqju/9I1cqVZPTHPz6nEoVfPV3NP6mP6/bsG6dcRshlp5Am9zz2OmnqGgAY6Bp7nZ+xwzaurNy4ciPBM2zE81ood1Ru7CgDnmFjR7n6numEXzeDEjX7IB7dQ9Rj7+ffve9wNNP7+H7/8dB1zt7v0DpCR32to0RwfiXlC9jiTDnCvsNSf0gvY9/NuOii2MxY8aeV57bVHdb/b9s2GMhFpimdvtNOe3STq29cG8zo7BZmHAARTBiUUFU5RvYywMokAwzvfqUybm27u1+63vJu+7VPv/26q/YsXqSunHbPklt2SndfvfFfy8Wu0wpXFa9+COhfb+DG9iOZZWgT/u2+mm29dvOXPSRHfnTnjW92t59wwYUQPOf4Rd3SC7deu7PJPPv8te+e2N2TE//h6g0PVo2rZf3PzBPcmLsyGgPlSETanfraa/fcUCh89JVXpgglNuTzT6751uUzZn68dP3+c4NsfWxXM3N1wd04CKobM1WzabUxcD/9e9o8/qZVA4v0CSaKTrBQBMUu+2FiJ/dA8NVXK18YmTHyQ9xfWsj3hbS5cffXc1TKVzbPGJnRNWNketf0hfzM23s/fRDL9whzhWVYoY+hJNayGEDOVrJlOYsHtOP8WMaDWSonmG6zmTvKdvjXn7JWnChFnCixj34F5ezkUkbLtw2WaGkAjwBPm8vbaXdf2/IIZJoWObOJosxxFgXMynENceiHbJdnlUG72mYe0wNN2iKyCDU5nI2PItB64/x5Ay3sOGgVaf/AbQNlUizfBh9a5MwBTcNSoDkdWd5GunvblodFKwytDZVPZlgxsFBr6B1G/Nepr/Ji6cXWRngispkVdwMv9P/UMM5EbOG5Lno8wNe/cn5q9hIWYVj9BJgbaFj9EJgbb1gYJix6yQ07xJTSNwh9B/sy2CZRJLCaeTW9bHFy9U3c20+oeNNqdvYyz/pqIKIY2j8jWzjcJ9snDhKf+OwhFrtv/eKZmLFp/9r79uNdE7N/B+QdSmminLUV52CBmLBF+cFS0Jf+5LF5r887SENelT43NrZ568svu7bXrd8vhNH27lVxUtHo9L1rwvI+A1tYdXDZPoV7KnNdMvaXCeZ5O3C73sfiHrSRp1xKyKWnuMcl5xJy7hJ+PEiDXxrPf8qlZi0/HvfVWx2HorfYu618SlRfdW3Y2pr66RkfUVfFFtTTXifCN9avHTlm9m/mNzTtp0+ThzJXTtSnh4HweoScef8DVUx2O58Xsvrd2kO2JdbmgntP9ODdbbvS0TPXrwP/by4OW0/emG/f8DW/cck5Z39/YLDjtI6z0Lh++6+27BFOWKzdsmvLJ74f93yS3HnR2sdTiYUfOev1ea2JyTaEvUfZglh/cpsJc93v511KMNTltvqaK1irT/7ZJ1pYm29e77bZObHjvPNxSHS0ncfafd8tu7HdD4MM4te0mx/YdPEj481esXjx2FWbF9dkd4L3jtBePzKYhRxLDEPVd3ZtWrH8pBWV6+GO79XriTuOw7/Wm26C0N2H7zupAoe65DBEUI+Qi7mxP0Ac/TFo+6boNTkA8pwixrl7X1w6JaBz576o1cUW++K8I/IuwZF5heBIvTxw+OsRtSHJ0KqTPRSvQG1wnn/ah9FkfbjuHOJhd5T2zZ7z8stzhNo79eQd8iXUGWHBQjrTbN0oksMZZ1+umMxli1LCLAQTYDtZ1/HLzCjD0n+CXfDlyjdg9r0VC+Z94QufW79+5bKFC9evJ18iMHYpvE7uItLdlQTZfEdRLpw8uGblypNzi6r6YWK+epbwjUPwRuSqi5k5WXH4YqZs97GlzEQuXy4Vc/3ZTLaAqXKuxFMl5K2DD9xlTJx6umuXuRJfu2RronIckPc5d93SUUw7z763wD4PkcvbbOVSdthyZiEGfOlSSeT2XrjMsT7M13OIvObRWsqL4wYL/lL0wXZo9Xs0nVLba3ioZFBJC5lgBaKKbgb/xRMME1VlkZAiBakhqLEwMpG8oauqvuMlQ5aNlx7ysoVtKnq+vtWD+fTKq6lOnYXZehqtdS34rK6zZY4cShXMTKQt1NDS1q15/EEdK1O9phepSkZANoJByxOwWgyDRECR/AoSokgsgkG1VEiCrBsKOBLxqjQFVEcykinD9obSgdaAf36Q8ncs0BhFyRacvW0WPie8J/yn8Ee4kxRImUzHMRDlS9KykmWvgziMxexjHWaZfSXBZEk8FYql8iCUynY5WyoXik6GdWA5i4KXYRFSfTlMZ7J8fdGKA/sMrGP28E8m5CxM4pwhy37SCyioxdIw4PSBS8cwYEfb5mQCWD72yJ4OplJAGnJYYt4tlF2wkHw/kz2cbWAFfmDLmVgy1lHoZbqq38n2Iy1YYbEPx4tSLJQn1VgulC3Tsc2sknRyfYMkmXPMJJt25/oiDJznTPwfAKTHzA1QN2mZuT4zx46YIYL7IETsHObDI3seQTGO5Gw3g2XafZEcW9uP5FxohS3CijJOrj+X7eP/LN0JmUFI4qOc05d1cGT3dbKC8Q6S1JdTcoW+6ZDH8nAEYLqQ67N5wi7kc7Z7n9VWMHGAYCE4/vAJXiChTInlUBsj/dkByLA6e7BlGRwrfXhARcKozswEvBgATlWxP4vJmTBAcYyWWckDBLORQeAhAYVcf0HJmVnsgSzcFAj4fZliJqQUi6JXy5bSCcNDJF+qlIkmRoJ+vy/LHvYXqSLr6VKq1dCVYKqUirbOPZYko8TpTUGxYSTTnQx5m5Lp3gxoLOC6v18JQ7o3RXyBYIC0RvOBoD/gzRTTIUWL+4KJDvOyQY2F3epBLwvkSGExuiKL/QXE4ZDpyRBvIkhmEScKmd4U5dGVPMSThT8V+1mmdE/aLf14QgYD7GVTKRSKpsSJ2HWg1gkdXclgMMlCk9yQLlp9gYBFLInVuCV+wXYZ3Ggsfr81gGS2LTJptTgek5VsCQbhq1JYlHWyheZEWdHSxXS0daG/FVuX8oNEdSOBIwN5Viqxx5lSGhkZwNani6mASK04/iAs90sF5FCqJwWJVssfOak7Hiql3Bb5CeMstg9ZwmLYj2lu1Dn3i+mWRDDZeUJY9TU3IEdkjXGuJ0W8QT8yCwhq9nRvGjQfhWJRDWERDiGyLPN3AYDFcgCWx/st5ZYuosL0aloeVG9fjLGFBd1WucdZovCwOBbYnm4JRJZ3ZUI1bhAedVVjDR6DKSQt0JxSWIiOSKuF8HLwSsH5ZUuvocKnCWnXNKjFa3jIKM4h5qCt4l7oGvzgX+4pWOVEsd/9akv18z35fT/f407K3O/39JdrH/Cx3E/44K+TCqZ4MEypzKdz8DvpGFTZSdubjznNRgDORBK/F/C2pFpLXrMZFn0sEulZqEMLDjwp00RXzDpmBW1uR7Nmp1BRl9/y+4MJowlWqZW7FTiZNBrxoKaLp8w69hQyCrBoZrQQESPBUJM3GtgJsNPXbDSFQ7YUyUdnLj5Rt0OKrEbzIYkQv1GaB3B8yesnRArno6qitn5T0XTL02h/+9Zbb5WkW7/d0mBYmiyW5wLMr+K7CfteEMrC0CFY+GQuyeJgLPb59mKwP4MqSZqOSta2hiFYd+UhBZKiSrBLUhSpMv3F555/5w1FfqOSrm8Qj8Uf3Cmp+OOzJKVxw3mjlI5WnhBqsTocG/lwDm7vi4sSdg0YuUgIoWQNCu2PgGp++olYmrpxNIcSL3OwEBkX8R0Qb0812mTc+XikFmiP1MLsAX3IC6Y+u5iMyqfa5v0w+5SafvLeiJ69t7mDPobtV4UgonnGgfnCSuGjwiXCqPBp4S7hb4QnhZ3Cz90Z8N4rpWE+Jy6X7DyiaGQKl0j+2aqM+90q9pTLa5lzrFzin7XKKHs/lPb+ZY25zDHbzx9aspuXffVqUt4yvzTHS8JL7i3idUwiwf0qVvVZ1aGyD32wa98l3WB8ZjTkN89YHVFC+RciejA70/Q6UsP8Hjq2K2Abrbmg6HgjQ22a578CCVVq8GcWOhF/4Lg3gnFfU7dfQpA7lPJ44ONh3d+S8Xgd0dublMe+EzQYfPakiRdP5K2AQaHRlhxvtFkk3t13B7x43ehNSrbNvrb1u4ChJiycw0QzMnjH7guqRmxBZ8QbWFKWYXuwNdhUagqpkd5VbYZeKYdUf8fqYkQN5z6UlUlDoNHXOi8d9JqlNR26QTL7LULDKM4yjJTYaGU0Y1laj450+oORwooE0Yntic1rwwb1LGk1moH6AxGRev1iyohnxYge6WsxAwGnHDFapiWN6PGZYMDsPrFV/Gqzr31ZNmhE2pa1677uRl9hdXck4C99fEjVkZz+Nd3+UKT7zLzqGWj0pWZFI5FAekWv5ttBWj1Ov5+kPPFZ8iIxJGkK1dIAjQ1GLEOSerJXh4zq6WqllFqK2awhAz19KaP5f8Q/UHPmHIHVnyOy7iPgbLv2zok4aYVlmfA4HAd3wVs4V9rurrcc8E2Yo++a/MXeNTlt73eNzjj6RsnRN0o+6BslLQd8H410H32F5OgrJFP8Jq64j183+v5eXdc27uvN/dTFFy/ffxqTL59UPqP2XufEHK8kLBROEk4V1gjnH4ov1weRGMXJcWEIeBiXUqiGcTklHthlJyPTId/vKO9zrjcZ/FR/e3O6RU52e97qcaRYqgnac57XX+wIW9CSikqJ7hfTgbAcSzdCW5jSK0RxrSiuE8UFonilKK7GI/Zd3XnjqnihO5tyUl3NcktPZyqVbuuLyUqz1cTvdjY3RGx+tzemKMfV/vfxffMYwXr8ikOZxX8p9VrtvP12pQN+/HZ90k+99tqRysuQuqT2Td1BcofgCP/d3rXFxnGV4XOZM7Mzs97duc+svffs7MaO7Zm9+FKrdlDSNKFxiLAqlcZ2JUIacquhIhSUooqKp1IVHloVUJo0dQUSgjyAWqnq5SUvRDxweQBkIlReKkV5AKQKIYRHnHNmbW/sNClysVTL65nd2XPOnMvvMzvn+893vhkHnwMnwIX4KW6SxT2TWh43JtEo6zXxNoSlRh45KVweQjUuYzs6Qmwnjxrce2HFEdbdQrQ4BH44sTA7LorjswtfX5i9j7CDiYmFYyOEjByjQY+OEjI6mHugWotuymaOp8qZMh7rRH7cMPQjxcxZnz0UvWPlTVk28xbcf+gQtHKmQmiMpucMRTFyupZTRHoRPZJW0iyAfty/EpW8e1h0Xe+zZNnq07k+8Kv4XVzi+KsABsFeatV5cA48c0fEVe5AIYZj1kMueoVwVGN3Fkq1fPjR4GlVM3gVA5VigJTv+BdYgg2oyCp+Jq+lzeBLgSUZw9dNWatPOJliwjuwhyz/I520ewf0hJh1hVKoeqgH/ZzCG+x6FN4UshLTEqbwBvU6FEjF8OYqgygPVvW0OXK8n+kJUwSza2ZPT0GWtFT/0TK5I2p5loKWqpBEDBIkj1LYMj2Qso3w4SJWsWplJ0vJXiOTmmqpekZORb/q5SBES49emEok9GyqSUGIZg4ebzCVYWwnrD5FreJkSNEERRr53UlC0ikHKpU+krjz+pu94MAmZ2G7JrA3CTK657c3N/PaNf3d5RcQaat7wW4wRtv8MDgOngTfBt8Hl8HPwNvgOvgTtYNf4w4PkXk7Rm28bZwC6Ndnzv6R+V6Su3Z9cHB+bm5u2/kE4GtHjlxcfub8wrkb+/fto1hyG7gDuvou01y36J2qwX9V5+ho4wJ4DvwQ/Bi8Aa6B369TYN8evbZb8P2hbddh1zTmf7ot+ur/hdvCaVqbdTufPbPC4/ok/M0rWorxWEcA6h1GOxuYSVs82qndTmQStnysA/99O/kJ/n1LBzrxc1HOIJs/mZnNVTJL2TH/crTN7cdMBQ/cd8r3Z5rjp5v9jw63H6vqQ+6umfqDz08jG35ldnH/N1OJmeHaHlGYfehqfcwbymZHvqGux4AnwQ/AVQpAX0VDH2t1kRRuYIAw8oXV7BBAat0UkCnYZis7YwIII1pUVvkfTsz/WKF/jMM1/sc4XEcA6bA/1oqOuR8jTtMqoKBhhk5gMt9fO+Z+0LyYymFFup38UeuQP2ptv9aqjKNWpeYzXUoasFZQAZY5b6MchBXGahClkHE+xiDne4Sc88EPaZqGxcM7zA+WOnDoB62NHZj2ODQbZhA6LHyN3xHW6Ik+L8IPK60Ky6FGy2oHlbBD8qAbjazEhA/2HvM8GrTAsBmwzeHvzTFO+wibDU74sFkA/c6SOXRrOkFzjeLBqzcEKRYst8PAH4OtIGT1aTGSB2L0DxrVovViKdkh435w5Mgy5fgvDBq8zPBeiPZxPSE7viOTUhklBNc3nSTEguF7GT0kiizLkud7Ki6VYII4NcMhIsSiWXMy+p6yYOqC5RrlzKCTc5JSMm26DnPWIFgs0ivQdm0hobialpN1WXJ9V8VYSyiGlzxSllMq86WIhmfTMwiEhQIUVOS4jpAwFaEsWJrguIZERMy1t4q+uJqjhXUEcVI13RWPJkq3emkNFKfjR+todnH3DoIdz1oXXYG/DFkxXXewZ9WJamqqzNxB98T2LdJH60wblDZGZC1BjUYEkbiG7zLVszzzK9PIjA7bsi45vkEwFEXb4FZWWDux7RppTZF7RvJptUKthmVZleNW0zZSi0i7Mym0UohqeIFK5ELsj4SCYLg2PUNhdjJ1TI2GSQLBUhFSGzGrQSnB/KBIKGO4mqVIPEgzMZFISOxwjlkbtOJqz2jOS64Ygq2S6xxY2UCVMxbu0Ddi2zJBP6T1SQL8n9fF3as33tv2q/oeE2gaSPT+2EN/d4lD2kQjNW0QalX4r+hNQofl+6J3leh36Mnot2j6b8KtmzfhX27+ITp44wbdu3wIDKv1gX5wPzgMjoHT4OmN6GxLb6kbENQXtv6eejvC2beFd9SNY7upzat2fCKCHZuX6mDd1lzVfO6ekzwGfglleBhegRE6hL6LfoN1fAq/KSDh8N1mKHfEn3fEn7dU/HndxOyJHfnnHfnnHfnnT6X880fMiw+zf8GODvSODvSODjTvNJ8mHegYF72FXlh71mpJk5hgFx08DuPnwuUvPj8/j15Y/h76arB8C1nLt/hc+UV8DRf5OSlg0fFm5+msUHKY/FiVjlgYr+8J/5ofHX399bk5NDM/v4iL/3kaf4ft0V8XFxdOPXEWnl5Y5PN+l/CLOE+PZIrNNJqjxxEapH9V4tTWyRrgF6PH90ZZD34wCXF04uWXpryplye9yUvs0/d8nD/3WPSWDw/OknPvPzJQ7R/u9wfaA9WBIFvNxs+K/Qn+BS0vbnNcXgFU+YpYOkgmTESN7g6XUyOdnesn8qMKi2nD4ZPRlaUrf372Qn35Wyfhh/X6U5eXL11+6v3P4/zS0j9P0le+fv6VLy8tXZ6efu9r9Yvwlfr58/X6fwEAfP1sAAAAeJxjYGRgYADio9r3f8Tz23xl4GZ+ARRhuFjx5xSC/t/OfIVZGcjlYGACiQIAmCUOCgAAAHicY2BkYGAO+p/FEMX8ggEImK8wMDKggkQAZVcEPgAAeJxjfsHAwDyKBxQDANn1WQwAAAAAAAAAADIApAEKAawGyAccCkIKggs2C14LeAwiEWwR8hJ0Et4S/hNYE+wZEBliHKocxh2YHcYd8B5GHpofEh+WH9wgMCB8ILYg/CGAIjAihiLQIyojqiPCI/wkaiS+JSYlpCXsJhwmoidAJ4AnrCgAKEwojCjGKQopVCmWKhoqjirgKxosCi5wLwovbi+WL9IwSDDIMioynDXMNfw2mDbgN4g4WjjUOjI7iDv+PM48/j9OP4g/qkB2QOZGFEYuRlZGjkbOeJxjYGRgYEhkSWIQYQABJiDmAkIGhv9gPgMAHksB8gB4nF2PvU7DMBSFT9q0QCsxgEBi84AQAin9YUD0AZrOrdQ9P07aKrGjxK3Up2HkCRgZeQokFl6Ek9R0IJbj7373XEcBcIFvODg8V9wHduCyOnALJ7ix3KYXll2uW8sd9HFvuUv/ZLmHRzxb7uMSIW9w3DNWD9hadnCKV8stnOPNcpv+3bJL/rDcwTU+LXfpvyz3sMSP5T7unJcoyLcqDsRClrt1JCvh5+EsLHI1l+k2C8oa672UZbXWSoy8YV36UskyMDIW4V5Uu3RsTCKSUudiqpWRWaZFUeqNjIy3MqaYDAaJ9V6kc0QIkPPnFGKSwAISJXZYsyNR0fjsh5hxFySFOX3KiYz58mj/zmUzX3FesxIYwcPw2PXZVU0igOEZMxFiz3fFb6YY0xokrBNmNGcEps1NdTrj0jRF09vQRPQeVs1UgQkGXMm/vMcUb/oFZv1ifgAAeJyVVfl7EzcQ9aMhaWyHGDsEShuOhEChXe6e9D44erdA70tezxerkaWtpE3Cf1+tJHs3xOvP9Q/7eTWamTdv3sw2jjXCr9mY/mONBo7hBSzgOBaxhBexjCZaaGMFJ7CKDk6iix7WcArrOI0zeAln8TJewQbO4Twu4CI2sYVL2MZlXMGruIpreA2vI8F13MBN3MJt3MFdvIE38Rbexjt4F/fwHt7HB/gQH+FjfIJP8Rk+x308wEM8whf4El/ha3yDb/EdvscPeIwneIof8RN+xi/4Fb/hd/yBP/EX/gZrm1TTfrKvSabD41YzM+zsMEv77FmSMc2EIHGeS0t6RAPuDAntkbRJymw6dE+ZkrhVa5dKJt6o88xyuZOMyBi2Q2eMZdqOr6pRRtIwy5W8XjUc8R4DSka5sDwT1BJKZcmI6V3Sy7khnVhmdlf6ueHSZUp0LqhbevF4dWtmFsN3JBM35i/K8hHpa7X3j6DeruezQkVr3IYDpZupkpLS4rhDcjDxKdjfnBFNDnjhc2/+Wo6APXW4VTHi5kwGPSFnDf2bOzNnFeaTXZVxWhwxmTOxpCklvkddk/eTTKu0aFm4t1GNfwTTyarVpVW6XqKhm+dq7d59vUJqpQVrDtgYV6qEYJmhQa9ySAcZkwMaLBSyWy2D+KBb9TlNyoTPUI/Lc7h+qNCJV7d6HArsHtK8H4NFN9o8swvG4VpxriJhTkF73D47xJ9P1KuexCE9PQWbazVt1GIWXO6uVViYAF61dGATJqWy/n2pn42cZtTqWOMF64IOuuN3H6DPHN3t8VGRujl+UbpX5inQcOksldkIrJwoDwr3bvk6kVLlKJRd8SnquVBbbbw/bZrtUKv956RUJTgmbw6YZW50sty2wkj4xi25RbbHU1ooNlo7Dom3tLyD6v/jdkHnuRGkaXoLQMpGXKyvJmK6O/+uKMNOk0RIXVB4eeaymOyUWFxuCzqCdn3Ry4WA/b/Al7FK05WZMUtk09oXkMX23f4fH69I0c35XYIMp7EeQcSQl2aWE6GusEEyVGlcke2oksBR8fAq6FVVF69uz44eMUzboQFlqOLO/GWXPXW72/KUuzVpmyZjBVylRKf8noX0TcGMUd7WaPwHzaxe+gA=') format('woff'), + url('data:application/octet-stream;base64,AAEAAAAKAIAAAwAgT1MvMj4LSaoAAAEoAAAAVmNtYXC5NgKZAAADBAAAAVpnbHlmds5ixAAABSQAAI2caGVhZAXlPSMAAADQAAAANmhoZWEHggO0AAAArAAAACRobXR4eugAAAAAAYAAAAGEbG9jYRCbMgAAAARgAAAAxG1heHABfwRuAAABCAAAACBuYW1lejh1lQAAksAAAAI9cG9zdO2Ce20AAJUAAAAJeAABAAADUv9qAFoD6AAAAAAD1AABAAAAAAAAAAAAAAAAAAAAYQABAAAAAQAAxSvf+F8PPPUACwPoAAAAANF4/MoAAAAA0Xj8ygAA/4cD1AMjAAAACAACAAAAAAAAAAEAAABhBGIAFAAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQPoAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6ADoYgNS/2oAWgMjAHkAAAABAAAAAAAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAAAAAMAAAADAAAAHAABAAAAAABUAAMAAQAAABwABAA4AAAACgAIAAIAAgAA6FzoYOhi//8AAAAA6ADoX+hi//8AABgBF/8X/gABAAAAAAAAAAAAAAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgCkAQoBrAbIBxwKQgqCCzYLXgt4DCIRbBHyEnQS3hL+E1gT7BkQGWIcqhzGHZgdxh3wHkYemh8SH5Yf3CAwIHwgtiD8IYAiMCKGItAjKiOqI8Ij/CRqJL4lJiWkJewmHCaiJ0AngCesKAAoTCiMKMYpCilUKZYqGiqOKuArGiwKLnAvCi9uL5Yv0jBIMMgyKjKcNcw1/DaYNuA3iDhaONQ6MjuIO/48zjz+P04/iD+qQHZA5kYURi5GVkaORs4AAgAA//wDugLAABIAGgAAASIOAhQeAjM+ATcHJz8BLgEJAQYWFwEuAQL0Kks7ICA7SypGahaVdD6dHk7+3f4zCTMmAcMbJALAIDtLVEs7IAFPQihNfCogI/7q/sQiSwUBNhc+AAUAAP/AAzkC6AASACMAKAA3AEQAAAEiBh0BBwYUFyE2NC8BNTYmKwEFIgYVEx4BMyEyNjcTNiYjIQUpAQMhEyIjDgEXEx4BPgEnAy4BJSIGBwMGHgE2NxM2JgGtKh2sDw8CcA4OqAIbLkf+4gsNMgENCgHJCg0CQAENDP7i/v0BAwEDO/5iSwECDA8CLAIRGAwCLAINAQ4KDwIsAg0XEQIsAg8C5wgsCTgFFwIBGAU3CiwIzA8L/dUJDQwKAioMDzH+BwGwARIM/sAMDQMSDAE/Cg0BDQv+wQwSAw0MAUAMEgAAAAMAAP+aA7gDIgAQABQAQgAAASIHAQYUFwEWMjcBNjQnASYHCQIlMCMPAxUjDwMVHwMzFR8DMz8DNTM/AzUvAyM1LwMB9A4M/mEKCgGfCx4LAZ8LC/5hCw8Bhv56/noBewICBAMBwgQEAwEBAwQEwgEDBAQWBAQDAcIEBAMBAQMEBMIBAwQEAyIL/mELHgv+YQoKAZ8LHgsBnws+/nr+egGG5QEDBATCAQMEBBUFBAMBwgQEAwEBAwQEwgEDBAQWBAQDAcIEBAMBAAAAAAYAAP+NA80DIgAOAB0ALAA7AFAAYAAAAQYEBwYWFxYkNhICJicmBzYWFxYGBwYkJyYSNz4BFyIGBwYWFxY2NzYmJy4BBx4BFw4BBwYmJyY2Nz4BBwYHFwYHFhc3FzY3Jic2NyYnBgcmJxYXNxcHFwcnBgcnNjcmJwHzqv8AFhCGgXwBEc5HWtWHERed6REMkIKB/vxPTQdYOZ9hkNIHBJ+AeN04NSxcMXpDf7YCAZl2b74jH0teJFFGKyxwODYqLG5xKy05ODg2Kiw3Nzg5OThuNG9xNXE2ODQ4Nzg5AyIC4amP/UE8IrgBCAECpQoCMQHQm4rqMC1Pb3EBEGlETivIkIPPHRdobW3wUSswMAG0f3azDwx2a2jNNxUWby0rcTY4LCpucCwrOTg3NywqNjg4Fjg5bzRucTVxNzg0ODY5OAAAABEAAP+jA7gDIgADAAYACwBOAKYA/AE/AZQB8QI8An4CwgMFA1wDqQP1BD8AAAERIREFMwc3FSE1FxExIwcjByMVIwcjDwcVHwQzNzM3MzczNzM3MxczFzMXMxczFzM/BTUvBSMnIzUjJyMnFyMPBR8ZPwQ1LwMjJzUnNScjLwEjLwE1JyMnNS8BIy8BNSc1JyM1JyMnIy8BNS8BIyc1JyMvAQUjDwIVByMPARUPAhUHFQcVDwEjDwEVDwIVDwEjDwEjDwEVBxUPASMPAhUfBTM/GTUvBCExIxUjDwMVHwQzNzM3MxczFzMXMxczFzMfBjM/BTUvAiMvCSMnIycjJyM1ByMPAiMPARUHIw8BIwcVByMHIwcjBxUPAyMVDwEVDwIjDwEfBTM/HTM/Ay8DBQ8FHxYVHwQzPwQ1JzUvCDUnNS8EIycjJzUvASMnNSc1LwE1Iy8BNScjJzUvAjUvAwUjDwUVIxUHFQcVIxUHFRcVMxUXFRcVFxUfCTM/BDUvAjUnNSc1JzUnNSc1NzU3NTc1NzU3NS8EBSMPAxUHFxUHFQcVBxUHFQ8IFR8DMz8GNTc1Pwc1NzUzNTc1NzUnNS8DBSMPAxUXFRcVFxUXFR8HFRcVHwIzFR8DMz8ENS8LNSc1JzUnNSc1LwQFIw8FFQcVDw8VHwU/AjU/ATU3Mzc1PwIzPwo1Ny8EBQ8FHwIVFxUXMxczHwIzHwEzFRcVFxUXMx8BMxczFxUXFR8BFR8CFR8CMz8FNS8cBSMPCCMHIwcjByMHIwcjDwQVHwUzNzM3MzczNzM/CzM3Mz8BNT8BNTc1PwQ1LwQFDwUVHwUzHwEVFzMXMx8BFR8BMxcVHwQzFzMfBjM/BTUvFiEjDxcVHwYzPwgzPwQ1NzM3Mzc1PwE1PwEzPwQ1LwQBJwGa/sHkcpz+yJwLBgsFDAUFBiYGCggEAgMBAQIGBAkEKwUJBQUFBQoFHgUKBQUFBQoEGAkFBAMEBAEBBAMEByYFBgULBgsG9AUEBQMEBAICCAIMBwgHBAMEAwQDBwYHDwIJAgMRBAMECQkEBAMEAQIDAgECAwIBAhIBCQQGAQMEAwEDCAQDAQMBAwEIBAQEAQQIAQQK/fEFBAgFBAEEBAQMBAQECAMBAwQDBAMECQEPAgECAwMFAgEEAwMBAgMDCAQJBQcFBRAGAgYCDwcGBwMEAwQDBAcIBAQHAgECAgMECAEEEg0KBQcGAgIDCAgEAQgEJgQIAwQEBAcECAMaAwgHBwMJBQQEBAMEAQQDBwEDBQQEBAQECQQmBAkFBAQFDa0ECAYHAQMIAwEVAwEDAwEJAQwBCQkDAwIBAgMDCAQBBAICAgMDCAQFBAkDCAMCBAMCAwIDAgMCAwMDAgMDAwMDAwMDBgMjAgMEBAICBQQIAYQFCAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBP3DBQQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJAu4FBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECPynBQgIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgB+v7IATgxWj66un0B8gEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAgMFAgQBAg8DAgECCQwJAQkEAwMBAwMBAwsHBwkJBAMEBAEBBAMMAwQGAwMCAwMDAwMDAgMDAgMCAwIDAgMEAxYDAwgJCQcDBDsBAgMDBA0FCwIDAwMDAwMCAwMKIwMHAwcEDgsDBwMIAwMCAQEDAgQICQQCBAkEBAQEBAUDAQMBAwQBAxAEAwEDCAMBCgEDAwEDAwEDAwEGBAkBAwIDA6kBBAQDBAgEBAkFBAkNBBsFDQkEBAkEAQQiBAUBBAQDAwIBAgIDBAgJBQQSBAsEBwQEBwQIBB4ECAQHBAQHBAQJBAQEAwQtAQQIBAQEBB4FCgUFBQUJBScFBAUJCgQyBAUECAQGAgIGCAoFGQEEARQGBQUFCwYmBQYFCwYLBhYGCQgDAwQQAgYICAkGEQUGBQYLBSEGCwUFCgYPAQQBGQUKAQQGAgEBAwIECAkIASkEBQUEBQUJBSIFCQUFBQUKBRcFBAcCAjkBAgMDCAcEBwQaAwsLBwYEAwcUDwMHAQgFBAUIAwMCAgICBwEDFQEDCwEHEAQEDAQEBAQEBAkEJgUFCAQEAwSgAQQDAwQJCQkGAQwBBgwGBQMDAgEEAQQBAgUEAgIBAQEEAQEBBgEBAQIBAQIDBwUEBQQIAwMJAgEGAxADBgMCAwIDAgMCAwYCAwMDAwMHSgECAQMGDAMDBQMCAQEBBAMDBAkFBAgDAwIBAQEBAgkCAgIBAgECAQEBAgICAQEBBAEBAQUEAwUEBQgIAwIBJwEBAwYECQUEBAQCBQMECQEGCQMCAQIDAgECAwQDCgIIAQIBAgIDAQIDAwgFBAkEAwMDBAIBAgECAQIBEBAGAgMFCQMKAQICAg8CAwUGDBQBAgECAQIBAgYCBgkEBQQEBAMDAgEBAQICAgECAQgMAwQDAgECAwIBAhIBCQQDBQQEBAUJBAMDBAAAAAUAAP+HA78DIgAPAB4AJgAqAC8AAAEOAhIWBDc+ATc2JicuAQcyFhcWBgcGJCcmAjc+ARcGBxc1FxEHJxQVJyUUFSYnAfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyWppaNHKyhiPAVlHSAMiAZb5/vbCPiwu3ImH6D0XGDGjgnvxS08LVlYBA3twhv9KSpSPjwEoj2BkZWRlZGYzMgAAAAkAAP+iA7gDIAALABcAUgC7AUQBoQHoAjICngAAARUjFTMVMzUzNSM1BzMVMxUjFSM1IzUzEysBByMHIwcVDwUVHwUzPwMzNzM3MzczFzMXMxczHwEzPwM1LwQjNSMnIycXDwYVHwozHwYVHwIzHw0zPwQ1LwE1JyMvBiMvATUjLwsjLwEjLwcjNSc1LwQjBQ8BIw8EFQ8EFQcjBxUPAyMVBxUHIxUPBBUHIw8BFQ8CFQ8CIw8DFQ8DFQcVDwoVBxUfBD8EMz8ENT8mNS8DAQ8FFRcVBxUHFQcVBxUHFQcVBxUHFQcVBxUHFQ8HFR8EPwUzPwEzPwE1PwEzNzM3NTc1MzU3NTc1NzU3NTc1NzU3NTc1JzUvBAUPBRUXFRcVFzMfBTMfARUXFRcVFxUzFxUXFR8EPwQ1Lw01JzUnNSc1LwMBDxcfBD8EMz8DMzczNzM3MzczNzU3Mzc1NzM/AjM3MzU/AzUvBAUPBRUfAxUfATMfAjMfAhUfATMfARUfATMXMxczFzMfAjMXMxcVMx8HMxcVFzMVMxczPwQ1LwQjJyMnIycjLwojLwQjLwUjAa59fYx9fXVefX1efX0zBw0GDQ0HJw0OBAMDBAECAwMJBAUGDAYXBgsGBgYGKQYGBgYGBR8EBQwDAwICBgMKJwYHBg0H6QUEBAMDAQICAgYCAgMGBQQDCAEOAggCBgIEAQICAQIDAgMFBAMEAwoFBgMJBAkEBAMEAgQGAQQDAgMCAwIBAggBBQMEAgQCAgUCBwICAQIJAQICAwcDAgMCAQIDAgYCCgX98wUHAQIDAgMCAwIDAgMEAQICAwIEAQQEAQICAgICAgECAgIEAgIEAQEBAgMCAgoBAgICAQQBAgECAQIBAgIBBAQDDgQIBAMBAQIDAQICAgECAQIBAgECAgMCAQIIAgECAgIBBAIEAQYCCgIGAwoDBgMFAwIBBAYIBQKyBAUDBgIBAQEBAQEBAQIBAwUDBQMEAwIGAwECAwYECQkEBAMCAQEDAgECAwMCAQUBDAMBAgEBAQEBAQEBBAMEBAj8pgQFAwQEAQEDAgEDAgEEAQoBBAMCAwIBAgMBAgQHCQkEBAMEAgQCAwIHBAEGAQIBAggBAQEBBQgIArEEBAkEBQoEDwUFCw8GBQsFIQYLEAgEBQICBAMEDQkGBhQFARIGBwUBBQEFAQUBHAELBQEFBQEFCw8BBAEDAwIBBAMEBAj93gQEBAMCAgECAwQNAgECAwIBAgMDCwIBCAMDBQECAQIBAgECAwMBAgECAQIEAwYDDQMdAgMNBAMNCQUIBQIBBAMEBAMECAMUAhEDCQURAgYFAwUFBQIBDwIFAgIBBAMEEQQEBQIhfYx9fYx9F31efX5dAZMBAgYBAgQCAwQICQUEBAMEAQICAgQCAQEBAQEFAQYEAwkFCAgCBAYBAQFPAQEDAwQEBAUJBAYBAgEGAwQCCA4DCAMGAwQBAgIDBAMEAwcHAwgDEgoIAgQCAgMDCAoHBwEMCAQEBAQEBAQLAQcDBgIGAgMFAwcDAgMJAwICBwICAgIBAQECAgQCBQwBBAICAgICAQICAgICAQQCAQICAwQBBAEEAQIDAgMCAQIDAgECBgIBAgYDAwIFAgECDwMCAQIBAgMGAwMDAwMDAwMBBAkFCAMDAwEEAwMEBgUDAgUBAgMCAwIDAgMDAgUCAwIMAgMCAwIDBAMEAwYDCgMGAgoBBgIFBAQECQkGBAH+xgECAggEBAQEMwMJAwYCBgMDAwMDAwYCAwMJAg4DCAENBQsFBgoHBAUJBAYCAgICAwMDAwYGBgUBBQcPJgMKAwMHAwMEAwMEAwMEAwcDDgMsBQkIBAIDAhMBAgMDCAQbBgcTBw0TBgcNBh8NBQEFAQUBBQEFAQUBAQQEBAICAgMDCQkIBgYFBhALBhEFBgYFLwYFBgYMBgcFBwYC/rIBAgYEBAYECQQDBQkCAwQDDAEEAwQDBwkJCAMDAwICAQYCBgMCAwIDAw8GAQMDAQMEBwwEAQMEBAQJCAQDAgICAQMCBAQJBAUEBAMBCgICAgICAgEBBwIFAQEBAwICAQIBAgEBAQEBAgICBAIJAQEEAQQBBAcFBAkIBAIDAQMHBgMDBgICAwEDAgMCCQIDAgEEAQQNAQIAAAABAAAAAAMxAqAAJwAAAQ4BBxQWFxYXBxc3NRUnNQcXJicuATU+ATceARcOAQcjFTM+ATcuAQH0h7MDMispN70CyCUKIjInKjADrYODrQMDrYMFBYezAwOzAqADsoVCcSspGCEKIwMByAUCuhcmKm4/gawDA6yBgawDCgOyhYWyAAUAAP/TA9QC6QAPAB8AOwBbAHYAABMOAQcRHgEXIT4BNxEuAScFIR4BFxEOAQchLgEnET4BFyMOARUeARcOAQcOAQcVITUuAScuASc+ATUuAQc2Fx4BNxYVFAYPARceARcOASImJz4BPwEnLgEnNT4BFxYXHgEXFSM1IxUjNTQiHQEjNT4BPwEeATI211JvAgJvUgI6U24CAm5T/cYCOjpMAQFMOv3GOkwBAUzFAygvARUNByASFiECAVwBIxcUIQgNEQEwQA0MHDAGARINBAQDGA8CNFA1AhEZAwQDDhYBBSKSCQkWIQE5BdgFNwIfFQsDOFI3AukCblL+blJuAgJuUgGSUm4CPAFLOv5uOksBAUs6AZI6S2QBMCUTIAwCDQoMHxV/fxIfDAsPAwwfEyUwMgEHDgsEBAQSIAsDAgEICCEtKyIICQEBAwwgEggGFHgEBQweD3paWloCAlp6Eh4LBiMsLQAAAAUAAAAAA4AChAAEAAgADAAQABQAABMZASERBTMVIzchFSEHMxUjNyEVIWgDGPztvb3CAkz9tMK9vcICTP20AoT+2v7bAkvChISEBfv7+wAAAwAAAAADNgK8AAMABwALAAATETMRMxEzETMRMxGygn+Cf4ICvP1EArz9RAK8/UQCvAAAAAkAAP+iA7wDIgADAAgAFgAiAC4APABKAFYAYwAAAQYHIQMWFyE2Ew4BBxY2FzYWFzYmByYXBhYXFhcWNicuAScFDgEHDgE3PgE3PgEBBhYHBgcUNjc+AScuAQUGFhceARcWJicmJy4BAQ4BBw4BFz4BNzYmIQYWFx4BFzYmJyYvAQH0YGABgMBLTP7STE8kVRIQRh4ePB0fSB8M7ik1Fi0fIA0WGT4o/fEmNBcUFysXKRwTJwKSHwoHCyA1BBcTBgIN/KQhDAMIFhUtGgsSAQIMAq4lRykdKiE5ZywKDP3TJTMbIkonISscTDwGAjKsrQEmh4eHAagDAyEfFgECCAIiGAIBTxA0EzI7EjYVKUgZChFBIRZKBSBFHRAt/tYMRh1BPCIKHjJtNggIEgtHHCNEHgNKHD0/CAv+sxMvDAEnFAozJQwbEjQNExwGEyYCFjMDAAARAAD/owO4AyIADQAaACkAbADCASABawGuAgYCUwKWAu4DRAOGA8sEFwRhAAABIg4BHgI3PgImJyYHMh4BBgcGLgI3PgEXBgcOARcWNjsBNSM2NyYnKwEVIw8DFR8EMzczNzMXMxczFzMXMxczHwYzPwU1LwIjLwkjJyMnIycjNQ8EIw8BFQcjDwEjBxUHIwcjByMHFQ8DIxUPARUPAiMPAR8FMz8dMz8DLwMjBQ8FHxYVHwQzPwQ1JzUvCDUnNS8EIycjJzUvASMnNSc1LwE1Iy8BNScjJzUvAjUvBAUPBRUjFQcVBxUjFQcVFxUzFRcVFxUXFR8JMz8ENS8CNSc1JzUnNSc1JzU3NTc1NzU3NTc1LwUFDwUVBxUPDxUfBT8CNT8BNTczNzU/AjM/CjU3LwQjBQ8FHwIVFxUXMxczHwIzHwEzFRcVFxUXMx8BMxczFxUXFR8BFR8CFR8CMz8FNS8dBQ8IIwcjByMHIwcjByMPBBUfBTM1MzczNzM3Mz8LMzczPwE1PwE1NzU/BDUvBCMDKwEHIwcjFSMHIw8HFR8EMzczNzM3MzczNzMXMxczFzMXMxczPwU1LwUjJyM1IycjJxcPBR8ZPwQ1LwMjJzUnNScjLwEjLwE1JyMnNS8BIy8BNSc1JyM1JyMnIy8BNS8BIyc1JyMvAgUPAhUHIw8BFQ8CFQcVBxUPASMPARUPAhUPASMPASMPARUHFQ8BIw8CFR8FMz8ZNS8EIwEPAxUHFxUHFQcVBxUHFQ8IFR8DMz8GNTc1Pwc1NzUzNTc1NzUnNS8DIwUPBBUXFRcVFxUXFR8HFRcVHwIzFR8DMz8ENS8LNSc1JzUnNSc1LwQjEw8EFR8FMx8BFRczFzMfARUfATMXFR8EMxczHwYzPwU1LxcFDxcVHwYzPwgzPwQ1NzM3Mzc1PwE1PwEzPwQ1LwQjAfRBbDEXWHs7Pk4GQzksMTxfHSwxNHhXDSEZTmQdHQ4EDAgPB1lZGx0KQwQODQoFBwYCAgMICAQBCAQmBAgDBAQEBwQIAxoDCAcHAwkFBAQEAwQBBAMHAQMFBAQEBAQJBCYECQUEBAUNsQUDBgcBAwgDARUDAQMDAQkBDAEJCQMDAgECAwMIBAEEAgICAwMIBAUECQMIAwIEAwIDAgMCAwIDAwMCAwMDAwMDAwMGAyMCAwQEAgIFBAgFAYQEBAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBAn9xwQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJBAKNBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECAX9rgQEBAMCAgIFBgwGAQwBBgcDAQMDAQcHAwEHBwEDAQMECAQEDAQEBAQJBAQEBQIBAQQEAxUDBAoHGQMKAgMDAwMDAwMCBgMCAwIDAggOAaUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFEQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAUEpwUGBgsFDAUFBiYGCggEAgMBAQIGBAkEKwUJBQUFBQoFHgUKBQUFBQoEGAkFBAMEBAEBBAMEByYFBgULBgsG7wQFAwQEAgIIAgwHCAcEAwQDBAMHBgcPAgkCAxEEAwQJCQQEAwQBAgMCAQIDAgECEgEJBAYBAwQDAQMIBAMBAwEDAQgEBAQBBAgBBAoI/fQECAUEAQQEBAwEBAQIAwEDBAMEAwQJAQ8CAQIDAwUCAQQDAwECAwMIBAkFBwUFEAYCBgIPBwYHAwQDBAMEBwgEBAcCAQICAwQIBAKvBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECAT8pgQECAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFBJQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0NAhoEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIBAI0SXd8Wx4VFmqCbRwVJ0lybB4fDld7NCUrMTU2AxoHBQkZMzMG7wECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAQEDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ8AQEDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwMCqwEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBAF3AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoQICAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDBwNNAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgECzgEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHAgoBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwT+xQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAEBBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoFFwUEBwIC/rIBAwYECQUEBAQCBQMECQEGCQMCAQIDAgECAwQDCgIIAQIBAgIDAQIDAwgFBAkEAwMDBAIBAgECAQIBEBAGAgMFCQMKAwMBAgICDwIDBQYMFAECAQIBAgECBgIGCQQFBAQEAwMCAQEBAgICAQIBCAwDBAMCAQIDAgECEgEJBAMFBAQEBQkEAwMEAAYAAP+NA80DIgAOAB0ALAA7AEgAVQAAAQYEBwYWFxYkNhICJicmBzYWFxYGBwYkJyYSNz4BFyIGBwYWFxY2NzYmJy4BBx4BFw4BBwYmJyY2Nz4BBxQVIxUzFTM1MzUjNQcyMxUzFSMVIzUjNTMB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRE5+fep+fYSQln59JoKADIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZdTk58nJx8nBidSp2dSgAAAAAHAAD/jQPNAyIADgAdACwAOwBDAEcATAAAAQYEBwYWFxYkNhICJicmBzYWFxYGBwYkJyYSNz4BFyIGBwYWFxY2NzYmJy4BBx4BFw4BBwYmJyY2Nz4BFwYHFzUXEQcnFBUnJRQVJicB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRGmlo0crKGI8BWUdIAyIC4amP/UE8IrgBCAECpQoCMQHQm4rqMC1Pb3EBEGlETivIkIPPHRdobW3wUSswMAG0f3azDwx2a2jNNxUWo0pKlI+PASiPYGRlZGVkZjMyAAMAAP+aA7gDIgAQABQAQwAAASIHAQYUFwEWMjcBNjQnASYHCQI3MCMPBB8CDwIfBD8CHwI/BC8CPwIvBA8CJzUnAfQODP5hCgoBnwseCwGfCwv+YQsPAYb+ev569AICBA8DAQEDiYkDAQEDDwQEBQSJiQQFBAQPAwEBA4mJAwEBAw8EBAUEiYkEAyIL/mELHgv+YQoKAZ8LHgsBnws+/nr+egGGrQEDDwQEBQSJiQQFBAQPAwEBA4mJAwEBAw8EBAUEiYkEBQQEDwMBAQOJiQECAAAAAQAA/98DjwLtAA4AAAEGBAcWFwYHFhcBFhc2NwOPDf7Zey4s3d4REAG7LS1ASgLtB5U6Ky7g4BAPAcAsLn+OAAMAAP+NA8wDIwAPAB4AMwAAAQ4BBwYWFxYkNhInLgEnJgcyFhcWBgcGJicmNjc+AQcGBxcGBxYXNxc2NyYnNjcmJwYHJgHrqfsUD4qCegEMzEorLNqLEwl9swYDjHFuxyknSGMkUEYrLHA4NiosbnErLTk4ODYqLDc3OAMiBeSnj/0/OiO0AQWBhKoJAY6tfXK1FhNqaWrYOhUWbi0rcTY4LCpucCwrOTg3NywqNjg4AAAAAAoAAP+VA8cDIgARACEAMgBDAEgATABQAFQAWABcAAABIiMOAQcGEhYENz4BJy4BJyYHMjMeARcWBgcGJCYCNz4BFyIjDgEHBhYXFjY3NiYnLgEHMjMeARcWBgcGJicmNjc+AQcVESERBTMRIxMVMzUHFTM1BxUzNQcVMzUB8wECnPImHl3gARN2cXETFreFNj0FBZDdGxZwc3j+9LweRje0cAUFhcYSDoF2cOVISQhSM41QAwN2rQ0Kf2xqyzQzL1opYmQBLv7q/v4aysrKysrKygMiA8GWhf7/ogpJSfOGh8oiDjECu46B6z8/KccBD3VYZyoEsoR81iwoRGBl+186Qi8DoXVwux8dVmFl3kUgIXkM/pABfBj+tAEnGRlKGBhVGBhNGBgAEAAA/6MDuAMiAAsAFwBaALIBCAFLAaAB/QJIAooCzgMRA2gDtQQBBEsAAAEVIxUzFTM1MzUjNQczFTMVIxUjNSM1MxMxIwcjByMVIwcjDwcVHwQzNzM3MzczNzM3MxczFzMXMxczFzM/BTUvBSMnIzUjJyMnFyMPBR8ZPwQ1LwMjJzUnNScjLwEjLwE1JyMnNS8BIy8BNSc1JyM1JyMnIy8BNS8BIyc1JyMvAQUjDwIVByMPARUPAhUHFQcVDwEjDwEVDwIVDwEjDwEjDwEVBxUPASMPAhUfBTM/GTUvBCExIxUjDwMVHwQzNzM3MxczFzMXMxczFzMfBjM/BTUvAiMvCSMnIycjJyM1ByMPAiMPARUHIw8BIwcVByMHIwcjBxUPAyMVDwEVDwIjDwEfBTM/HTM/Ay8DBQ8FHxYVHwQzPwQ1JzUvCDUnNS8EIycjJzUvASMnNSc1LwE1Iy8BNScjJzUvAjUvAwUjDwUVIxUHFQcVIxUHFRcVMxUXFRcVFxUfCTM/BDUvAjUnNSc1JzUnNSc1NzU3NTc1NzU3NS8EBSMPAxUHFxUHFQcVBxUHFQ8IFR8DMz8GNTc1Pwc1NzUzNTc1NzUnNS8DBSMPAxUXFRcVFxUXFR8HFRcVHwIzFR8DMz8ENS8LNSc1JzUnNSc1LwQFIw8FFQcVDw8VHwU/AjU/ATU3Mzc1PwIzPwo1Ny8EBQ8FHwIVFxUXMxczHwIzHwEzFRcVFxUXMx8BMxczFxUXFR8BFR8CFR8CMz8FNS8cBSMPCCMHIwcjByMHIwcjDwQVHwUzNzM3MzczNzM/CzM3Mz8BNT8BNTc1PwQ1LwQFDwUVHwUzHwEVFzMXMx8BFR8BMxcVHwQzFzMfBjM/BTUvFiEjDxcVHwYzPwgzPwQ1NzM3Mzc1PwE1PwEzPwQ1LwQBrn19jH19dV59fV59fS8LBgsFDAUFBiYGCggEAgMBAQIGBAkEKwUJBQUFBQoFHgUKBQUFBQoEGAkFBAMEBAEBBAMEByYFBgULBgsG9AUEBQMEBAICCAIMBwgHBAMEAwQDBwYHDwIJAgMRBAMECQkEBAMEAQIDAgECAwIBAhIBCQQGAQMEAwEDCAQDAQMBAwEIBAQEAQQIAQQK/fEFBAgFBAEEBAQMBAQECAMBAwQDBAMECQEPAgECAwMFAgEEAwMBAgMDCAQJBQcFBRAGAgYCDwcGBwMEAwQDBAcIBAQHAgECAgMECAEEEg0KBQcGAgIDCAgEAQgEJgQIAwQEBAcECAMaAwgHBwMJBQQEBAMEAQQDBwEDBQQEBAQECQQmBAkFBAQFDa0ECAYHAQMIAwEVAwEDAwEJAQwBCQkDAwIBAgMDCAQBBAICAgMDCAQFBAkDCAMCBAMCAwIDAgMCAwMDAgMDAwMDAwMDBgMjAgMEBAICBQQIAYQFCAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBP3DBQQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJAu4FBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECPynBQgIBAIBAQECBgICAgEEAQYCCgMEAQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCIX2MfX2MfRd9Xn1+XQGVAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBC0BBAgEBAQEHgUKBQUFBQkFJwUEBQkKBDIEBQQIBAYCAgYICgUZAQQBFAYFBQULBiYFBgULBgsGFgYJCAMDBBACBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoFFwUEBwICOQECAwMIBwQHBBoDCwsHBgQDBxQPAwcBCAUEBQgDAwICAgIHAQMVAQMLAQcQBAQMBAQEBAQECQQmBQUIBAQDBKABBAMDBAkJCQYBDAEGDAYFAwMCAQQBBAECBQQCAgEBAQQBAQEGAQEBAgEBAgMHBQQFBAgDAwkCAQYDEAMGAwIDAgMCAwIDBgIDAwMDAwdKAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgEnAQEDBgQJBQQEBAIFAwQJAQYJAwIBAgMCAQIDBAMKAggBAgECAgMBAgMDCAUECQQDAwMEAgECAQIBAgEQEAYCAwUJAwoBAgICDwIDBQYMFAECAQIBAgECBgIGCQQFBAQEAwMCAQEBAgICAQIBCAwDBAMCAQIDAgECEgEJBAMFBAQEBQkEAwMEAAAAAAgAAP+aA7gDIgALABcAHAAgACQAKAAsADAAAAEOAQceARc+ATcuAQceARcOAQcuASc+ARcVESERBTMRIxMVMzUHFTM1BxUzNQcVMzUB9MD/BQX/wMD/BQX/wKzjBATjrKzjBATjFQEu/ur+/hrKysrKysrKAyIF/8DA/wUF/8DA/ywE46ys4wQE46ys49EM/pABfBj+tAEnGRlKGBhVGBhNGBgACgAA/6IDuAMgAA0AGgApAGQAzQFWAbMB+gJEArAAAAEiDgEeAjc+AiYnJgcyHgEGBwYuAjc+ARcGBw4BFxY2OwE1IzY3JgMrAQcjByMHFQ8FFR8FMz8DMzczNzM3MxczFzMXMx8BMz8DNS8EIzUjJyMnFw8GFR8KMx8GFR8CMx8NMz8ENS8BNScjLwYjLwE1Iy8LIy8BIy8HIzUnNS8EIwUPASMPBBUPBBUHIwcVDwMjFQcVByMVDwQVByMPARUPAhUPAiMPAxUPAxUHFQ8KFQcVHwQ/BDM/BDU/JjUvAwEPBRUXFQcVBxUHFQcVBxUHFQcVBxUHFQcVBxUPBxUfBD8FMz8BMz8BNT8BMzczNzU3NTM1NzU3NTc1NzU3NTc1NzU3NSc1LwQFDwUVFxUXFRczHwUzHwEVFxUXFRcVMxcVFxUfBD8ENS8NNSc1JzUnNS8DAQ8XHwQ/BDM/AzM3MzczNzM3Mzc1NzM3NTczPwIzNzM1PwM1LwQFDwUVHwMVHwEzHwIzHwIVHwEzHwEVHwEzFzMXMxczHwIzFzMXFTMfBzMXFRczFTMXMz8ENS8EIycjJyMnIy8KIy8EIy8FIwH0QWwxF1h7Oz5OBkM5LDE8Xx0sMTR4Vw0hGU5kHR0OBAwIDwdZWRsdCj8HDQYNDQcnDQ4EAwMEAQIDAwkEBQYMBhcGCwYGBgYpBgYGBgYFHwQFDAMDAgIGAwonBgcGDQfpBQQEAwMBAgICBgICAwYFBAMIAQ4CCAIGAgQBAgIBAgMCAwUEAwQDCgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAjRJd3xbHhUWaoJtHBUnSXJsHh8OV3s0JSsxNTYDGgcFCRkzMwYBSgECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJCQgGBgUGEAsGEQUGBgUvBgUGBgwGBwUHBgL+sgECBgQEBgQJBAMFCQIDBAMMAQQDBAMHCQkIAwMDAgIBBgIGAwIDAgMDDwYBAwMBAwQHDAQBAwQEBAkIBAMCAgIBAwIEBAkEBQQEAwEKAgICAgICAQEHAgUBAQEDAgIBAgECAQEBAQECAgIEAgkBAQQBBAEEBwUECQgEAgMBAwcGAwMGAgIDAQMCAwIJAgMCAQQBBA0BAgAAAwAAAAADUgKgAAMABwALAAATFSE1ARUhNQEVITWWArz9RAK8/UQCvAKggoL+/4KC/v+CggAAAAACAAAAAANvAoQAVQCrAAABIgc5AQYPAQYHOQEOARU5ARQWFzgBMR4BMxY3OQEyNjUxNiYrATUzMjY3NiYHIzUhPgE0JgchNTMxPgE1OQE0JisBByMiJyMiMDQHNj8CPgEnMSYnBzIXFhc5ARYGBzkBBg8CBgcGFhczFjM3MzEyFhQGKwEVITIWFAYjIRUhMTIWBzkBDgEjIRUzMhYVOQEOASMGJzkBIiYnOQEuATUxNDY3Njc+ATcxNgHMCwsrVHYrEggCAwUPTjrc2xIWARcSvfwTGQMGGRr+AS4YFRcW/tLiFhgYFmRyXhMLCwEBBQouEAsDCQoOBAIBCwoIAwoFChgXCgUBAgMNCxPQZBQVFBXnATMVExIW/s0BAxgVBQMVEv7/whIRARER29w5Sw8EAwIIEikjpyoLAoQIHDpRHzgdPh0VJRU/PwEBFRYXEhUOERsdARMBGS8XARMBGRgXGgEBAgEGCi4RECQOEAEEAQEODCEPBgoXFwsFBAUBAQEWLBcdEysXHRgZEAsfDxUUEgEBPT0VJBUdPhs3Hhd0HAcAAAADAAAAAAN4AoQAEgAVABsAABMwIjEGFREUMyEyNRE0JzgBMSEFIQUlBTMlESFzAQIDAwMCAv4f/ucC8f6H/oEBfgIBfv0CAoQBAv26AgICRgIBBeTi5+f9wQAAAAMAAP/dA3UC3wAEAAgAFAAAExURIREFIREhAREhFSERMxEhNSERcwMC/QgC7v0SAWP+6AEYKAEY/ugC3wX9AwMCCv0SAqP+6Cj+6AEYKAEYAAAAAAQAAP+HA78DIgAQACAALAA4AAABDgISFgQ3PgE3NiYnLgEjFx4BFxYGBwYkJyYCNz4BMwcVIxUzFTM1MzUjNQczFTMVIxUjNSM1MwHwh+BpMLoBAn6BpAgHiXgvZjQIhdIlIlRpcP7xamc/MzDJekZ9fYx9fXVefX1efX0DIgKW+P72wj4sLtyJh+g9FxgxA6KAe/FLTwtWVQEEe3CG0H2MfX2MfRd9Xn1+XQAEAAD/hwO/AyIADwAeACYALQAAAQ4CEhYENz4BNzYmJy4BBzIWFxYGBwYkJyYCNz4BBQYHJwM2NxcDFhc3BycHAfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyQEnMzOAdEFBhok9PR4dfDIDIgGW+f72wj4sLtyJh+g9Fxgxo4J78UtPC1ZWAQN7cIbSaGmm/qpTVJoBBk5MQ3SRTQAAAAAGAAD/jQPNAyIADgAdACwAOwA/AEQAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcGByEDFhchNgHzqv8AFhCGgXwBEc5HWtWHERed6REMkIKB/vxPTQdYOZ9hkNIHBJ+AeN04NSxcMXpDf7YCAZl2b74jH0teJFEqYGABgMBLTP7STAMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFmOsrQEmh4eHAAAGAAD/jQPNAyIADgAdACwAOwBDAEsAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcGBycDNjcXAxYXNwcnBgcB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRR1zMzgHRBQYaJPT0eHXwaGAMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFnZoaab+qlNUmgEGTkxDdJEmJwAAAAADAAD/jQPMAyMADwAeACYAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEXBgcXNRcRBwHrqfsUD4qCegEMzEorLNqLEwl9swYDjHFuxyknSGMkUBppaNHKygMiBeSnj/0/OiO0AQWBhKoJAY6tfXK1FhNqaWrYOhUWokpKlI+PASiPAAAAAAQAAP/wA6sCzAAPACMAJwA0AAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIxEhESMuAScRPgETIREhNx0BIxUzFTM1MzUjNdhCVwICV0ICOUFXAgJXQf3HAjktPAEBPC10/q5zLjsBATvAART+7HNNTS5NTQLMAldB/lhBVwICV0EBqEFXAjABPC3+WC08AQE0/swBPC0BqC08/pr+7O0XNi5NTS5NAAQAAP/wA6sCzAAPACMAJwArAAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIxEhESMuAScRPgETIREhNxUzNddBVwICV0ECOkFXAgJXQf3GAjotPAEBPC10/q50LTsBATvAART+7CXLAswCV0H+WEFXAgJXQQGoQVcCMAE8Lf5YLTwBATT+zAE8LQGoLTz+mv7rpy8vAAAAAgAA//ADqwLMAA8AHwAAEw4BBxEeARchPgE3ES4BJwUhHgEXEQ4BByEuAScRPgHXQVcCAldBAjpBVwICV0H9xgI6LTwBATwt/cYtOwEBOwLMAldB/lhBVwICV0EBqEFXAjABPC3+WC08AQE8LQGoLTwAAAADAAD/jQPMAyMADwAeACYAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEXBgcnAzY3FwHrqfsUD4qCegEMzEorLNqLEwl9swYDjHFuxyknSGMkUNczM4B0QUGGAyIF5KeP/T86I7QBBYGEqgkBjq19crUWE2ppatg6FRZ1aGmm/qpTVJoAAAYAAP+NA80DIgAOAB0ALAA7AEQATQAAAQYEBwYWFxYkNhICJicmBzYWFxYGBwYkJyYSNz4BFyIGBwYWFxY2NzYmJy4BBx4BFw4BBwYmJyY2Nz4BFw4BBz4BNxcmJxYXJw4BNT4BAfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kUSoiOCIgPCB9Pz0iIkQRMRIeAyIC4amP/UE8IrgBCAECpQoCMQHQm4rqMC1Pb3EBEGlETivIkIPPHRdobW3wUSswMAG0f3azDwx2a2jNNxUWb2PKYyFFIYfIdW1uShE6BzVrAAcAAP+VA8cDIgARACEAMgBDAFIAYABvAAABIiMOAQcGEhYENz4BJy4BJyYHMjMeARcWBgcGJCYCNz4BFyIjDgEHBhYXFjY3NiYnLgEHMjMeARcWBgcGJicmNjc+ARcOAh4CNz4CJicmIxceAgYHBi4CNz4BMxcGBw4BFxY2OwE1IzY3JgHzAQKc8iYeXeABE3ZxcRMWt4U2PQUFkN0bFnBzeP70vB5GN7RwBQWFxhIOgXZw5UhJCFIzjVADA3atDQp/bGrLNDMvWiliL0BqMBdYezs+TgZDOSwxBDtcHSwxNHhXDSEZTi03HR0OBAwIDwdZWRsdCgMiA8GWhf7/ogpJSfOGh8oiDjECu46B6z8/KccBD3VYZyoEsoR81iwoRGBl+186Qi8DoXVwux8dVmFl3kUgIWEBSHd8Wx4VFmqCbRwVJwFJcWweHw5XezQlKzE1NgMaBwUJGTMzBgAAAAAEAAD/hwO/AyIADwAeACcAMAAAAQ4CEhYENz4BNzYmJy4BBzIWFxYGBwYkJyYCNz4BFw4BBz4BNxcmJxYXJw4BNT4BAfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyXoiOCIgPCB9Pz0iIkQRMRIeAyIBlvn+9sI+LC7ciYfoPRcYMaOCe/FLTwtWVgEDe3CGy2PKYyFFIYfIdW1uShE6BzVrAAAABAAA/4cDvwMiAA8AHgAiACcAAAEOAhIWBDc+ATc2JicuAQcyFhcWBgcGJCcmAjc+ARcGByEDFhchNgH0ieJpMLoBAn6BpAgHiXgvZjSH1yYiVGlw/vFqZz8zMMl6YGABgMBLTP7STAMiAZb5/vbCPiwu3ImH6D0XGDGjgnvxS08LVlYBA3twhr+srQEmh4eHAAAAAAcAAP/TA9QC6QAPAB8AJAAoACwAMAA0AAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIS4BJxE+ARcdASERBTMVIzchFSEHMxUjNyEVIddSbwICb1ICOlNuAgJuU/3GAjo6TAEBTDr9xjpMAQFMFgH4/iGMjKUBIf7fpYyMpQEh/t8C6QJuUv5uUm4CAm5SAZJSbgI8AUs6/m46SwEBSzoBkjpLR76+AXyEQ0NDGYODgwAAAAYAAAAAAwUChAAYADIAOgBCAEoAUgAAAQcOAR4EBg8BIT4BNzYuBDY/AQUhBgcGHgQGByE+ATc2LgMnPgE3NhcGFBczNjQnBwYUFzM2NCcHBhQXMzY0JwcGFBczNjQnAYECVEgBLj0wCDhLEwGHJzQQHgkyPSwBRFMS/n8BWEcgJQIuPTAINkz+qCAsDh8LMjwsAQEPESIhBgbNBga5BQW8BQV9BgbQBganBQXQBgYChAEzVkxBPDo+SS0KFyoUJ0c9PD1DUTMLDCwnK0xBPDo+SC0UJREnRz08PSIQJRUpNQEJAQEJAXMBCgEBCgF0AQkBAQkBcwEKAQEKAQAAAAACAAAAAAN4AoQAAgAHAAATBSUFESERBXABhAGE/PgDCP58AoTW1mn+HQHjwQAAAAACAAD/0wPUAukADwAfAAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIS4BJxE+AedZeAICeFkCGll4AgJ4Wf3mAhosOAEBOCz95iw4AQE4AukCdlj+ilh2AgJ2WAF2WHYCbgE3Kv6KKjcBATcqAXYqNwAAAAUAAP+aA7gDIgALABcAJgA0AEMAAAEOAQceARc+ATcuAQceARcOAQcuASc+ARcOAh4CNz4CJicmIxceAgYHBi4CNz4BMxcGBw4BFxY2OwE1IzY3JgH0wP8FBf/AwP8FBf/ArOMEBOOsrOMEBOOoQGowF1h7Oz5OBkM5LDEEO1wdLDE0eFcNIRlOLTcdHQ4EDAgPB1lZGx0KAyIF/8DA/wUF/8DA/ywE46ys4wQE46ys47kBSHd8Wx4VFmqCbRwVJwFJcWweHw5XezQlKzE1NgMaBwUJGTMzBgAAAAAFAAD/hwO/AyIADwAeACMAKgAwAAABDgISFgQ3PgE3NiYnLgEHMhYXFgYHBiQnJgI3PgEHFBUhEQUyMw4BByY3FBUhNRcB9IniaTC6AQJ+gaQIB4l4L2Y0h9cmIlRpcP7xamc/MzDJUwGa/sFych49HjXY/sicAyIBlvn+9sI+LC7ciYfoPRcYMaOCe/FLTwtWVgEDe3CG95ycATgxFDoHKw5dXbp9AAAEAAD/jQPNAyIADwAeAC0APAAAAQ4BBwYWFxYkNhInLgEnJgceARcWBgcGJicmEjc+ARcOAQcUFhcWNjc2JicuAQceAQcOAQcGJicmNjc+AQHwqf4WEIaBfAERzkctLdKFFg2c5A4KloN//05NCFg6pU+PzAWjgHbZNzUsXTN/NYCyAQOZdG++Ix9LXyZTAyID4aiP/UE8IrgBCIJ+pgsCMQLVm4roLSlQbXEBEWlGTS0Fy5CCzBoVaGxu8FEtLjEEt4B0rg8MdmtozTcWFgAABgAA/40DzQMiAA4AHQAsADsAQwBLAAABBgQHBhYXFiQ2EgImJyYHNhYXFgYHBiQnJhI3PgEXIgYHBhYXFjY3NiYnLgEHHgEXDgEHBiYnJjY3PgEXFBUjFTMVNycWFwc1IzUzAfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kUVzi4qWJMzNm398DIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZ0MjK+ZMN6PD15NoUAAAAAAwAA/40DzAMjAA8AHgAnAAABDgEHBhYXFiQ2EicuAScmBzIWFxYGBwYmJyY2Nz4BFw4BBz4BNxcmAeup+xQPioJ6AQzMSiss2osTCX2zBgOMcW7HKSdIYyRQKiI4IiA8IH0/AyIF5KeP/T86I7QBBYGEqgkBjq19crUWE2ppatg6FRZuY8pjIUUhh8gAAAAABQAA/6wDtgMbAAgADAAQABQAGAAAARURITUjETM1AQcXNw8BFzcPARc3DwEXNwKlARHg4P6eSzxL00s8S9JMPEvSTDxMAxsZ/LExAwUy/n48SzwsPEs7LDtMPCw8SzsAAwAA/6wDrgMbAAsARwBTAAAFDgEnLgE3PgEXHgEBMRcHJzcGJwcnNxcmJwcnNxcmNyc3FxU2NyEOAQcRFwc2PwIXIxYXNxcHJxYfAgc1BgcXITI2NxEGJw4BJy4BNz4BFx4BAYQ3kjk2AzY4kjk2AQHBFVUpAy0wKFUUASYaTSNDAgcHRCNNEBX+RRgfATQBJywLWgwDLCg9QC4BGglNAk0KFyoBaBgfARQBIIpJSDgcIIpJSDkWNQM0OJI4NwI1N5IBW00jRAEJCUQjTQEbJRRVKAItLyhVEwQWEwEgGP6OJgEaCU0BTAkYLz8+AScrCloNAywoNSAZAb0Ufkg4HCCJSUg4HCCIAAAAAAQAAP+aA7gDIgAQABQAagBvAAABIgcBBhQXARYyNwE2NCcBJgcJAiUxDwMVLwIPBB8CIw8DFR8DMw8CHwQ/AhUfAzM/AzUfAj8ELwIzPwI1LwIjPwIvBA8CNS8CBzA5ATAB9A4M/mEKCgGfCx4LAZ8LC/5hCw8Bhv56/noBfQQEAgFjAwQEBA0CAQECY4wEAwIBAQIDBIxjAgEBAg0EBAQDYwECBAQSBAQCAWMDBAQEDQIBAQJjjAQDAwMDBIxjAgEBAg0EBAQDYwECBIsDIgv+YQseC/5hCgoBnwseCwGfCz7+ev56AYbGAQIDBIxjAgEBAg0EBAQDYwECBAQSBAQCAWMDBAQEDQIBAQJjjAQDAgEBAgMEjGMCAQECDQQEBARiAQIEGgQCAWMDBAQEDQIBAQJjjAQDAzAAAAAEAAD/mgO4AyIAEAAUABoAHwAAASIHAQYUFwEWMjcBNjQnASYHCQIlDwEXITcnFwcjJwH0Dgz+YQoKAZ8LHgsBnwsL/mELDwGG/nr+egGGB9BSAQpS17tI5kgDIgv+YQseC/5hCgoBnwseCwGfCz7+ev56AYbgBZf9/X6H3NwAAAIAAP+aA7gDIgAPABMAABMGFBcBFjI3ATY0JwEmIgcJAzsKCgGfCx4LAZ8LC/5hCx4L/pQBhgGG/noBeAseC/5hCgoBnwseCwGfCwv+RwGG/nr+egAAAAAEAAD/mgO4AyIAEAAUACAALAAAASIHAQYUFwEWMjcBNjQnASYHCQIlDgEHHgEXPgE3LgEHHgEXDgEHLgEnPgEB9A4M/mEKCgGfCx4LAZ8LC/5hCw8Bhv56/noBhll3AgJ3WVl3AgJ3WU9qAgJqT09qAgJqAyIL/mELHgv+YQoKAZ8LHgsBnws+/nr+egGG0gJ3WVl3AgJ3WVl3FQJqT09qAgJqT09qAAADAAD/jQPMAyMADwAeACoAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEXDgEXHgE3PgEnLgEB66n7FA+KgnoBDMxKKyzaixMJfbMGA4xxbscpJ0hjJFAqdIcgJNhhXwhaHkoDIgXkp4/9PzojtAEFgYSqCQGOrX1ytRYTamlq2DoVFlEBuHBuS0BD5UkYGgAAAAMAAP+NA8wDIwAPAB4AIgAAAQ4BBwYWFxYkNhInLgEnJgcyFhcWBgcGJicmNjc+ARcGByEB66n7FA+KgnoBDMxKKyzaixMJfbMGA4xxbscpJ0hjJFAqYGABgAMiBeSnj/0/OiO0AQWBhKoJAY6tfXK1FhNqaWrYOhUWYqytAAAAAgAA/5YDxwMiAA8AHgAAAQ4BBwYSFxYEPgEnLgEnJgceARcWBgcGJicmNjc+AQHwnPQlHWJwbwEP5XMTFr6KMil0qw8MdWlozjg5Kl0qZQMiA8SYhv8AUE4Jj/SGi84fC44Cm3JuvCQhTF9l5kggIQAAAAADAAD/jQPMAyIADQAcACQAAAEOAQcGFhcWJDYSAiYnBzIWFxYGBwYmJyY2Nz4BFwYHFyE2NyYB66n7FA+KgXsBDMxKV9qLHH2zBgONcG7HKSdIYyNRKmtsUgEKKihrAyIF5KiP/D86I7MBBgEEqwmNrX1ztBYTamlq2DoVFlZOTv1/fk4AAAAABAAA/40DzAMjAA8AHgAjACkAAAEOAQcGFhcWJDYSJy4BJyYHMhYXFgYHBiYnJjY3PgEHFhc2NwUUFSERBwHrqfsUD4qCegEMzEorLNqLEwl9swYDjHFuxyknSGMkUH1WVVRW/oUBmskDIgXkp4/9PzojtAEFgYSqCQGOrX1ytRYTamlq2DoVFppFRUVFIIyMARKjAAMAAP+NA8wDIwAPAB4AJgAAAQ4BBwYWFxYkNhInLgEnJgcyFhcWBgcGJicmNjc+ARcUFSMVMxU3Aeup+xQPioJ6AQzMSiss2osTCX2zBgOMcW7HKSdIYyRQXOLipQMiBeSnj/0/OiO0AQWBhKoJAY6tfXK1FhNqaWrYOhUWczIyvmTDAAcAAP+NA80DIgAOAB0ALAA7AEAARwBNAAABBgQHBhYXFiQ2EgImJyYHNhYXFgYHBiQnJhI3PgEXIgYHBhYXFjY3NiYnLgEHHgEXDgEHBiYnJjY3PgEHFBUhEQUyMw4BByY3FBUhNRcB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRowGa/sFych49HjXY/sicAyIC4amP/UE8IrgBCAECpQoCMQHQm4rqMC1Pb3EBEGlETivIkIPPHRdobW3wUSswMAG0f3azDwx2a2jNNxUWm5ycATgxFDoHKw5dXbp9AAAAAAUAAP+NA80DIgAOAB0ALAA7AEMAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcGBxc1FxEHAfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kURppaNHKygMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFqNKSpSPjwEojwAEAAD/hwO/AyIADwAeACYALQAAAQ4CEhYENz4BNzYmJy4BBzIWFxYGBwYkJyYCNz4BFwYHFyE2NyYnFhcHIyc2AfSJ4mkwugECfoGkCAeJeC9mNIfXJiJUaXD+8WpnPzMwyXprbFIBCiooa2xdXkjmSF4DIgGW+f72wj4sLtyJh+g9Fxgxo4J78UtPC1ZWAQN7cIazTk79f35OMENE3NxEAAAAAAUAAAAAAu4CpAANABMAFgAeACUAABMVFDERIREwMTUiMSc1BSEVMxEhARcjJx0BIxUzFTcnFwc1IzUz+gH0Aab+uAFDp/4WAUienpdwcFhTTExwcAKkAgH9dwHmAqICBaP+IQJ+mjUGM1c5ZFhYVzFNAAAABAAA/9MD1ALpAA8AHwBlALgAABMOAQcRHgEXIT4BNxEuAScFIR4BFxEOAQchLgEnET4BFzEiBzkBBg8BMQYHIw4BFTkBBhcwMR4BMyExMjc2NTE0JyYnMzI3NjcxNicmJzMyNi4BByM3NjU5ATQmKwE3PgInMSYnBzIxNhc5ARYGDwEGBwYfARYXFjEzMTIWFAYjBxUXMhYVFAYHIxUzMTIXFgc5AQYjBisBFTMeARU5AQ4BByExIiYnOQEuATUxNDY3NjcxPgE3NjLXUm8CAm9SAjpTbgICblP9xgI6OkwBAUw6/cY6TAEBTOILCRw3Th8MAQYBAQcKOSkBIA8LCQoDAxcNDAsDBQwDBQkSFQEWEB0HChUR1AsREwIICA0EAQQEAwEFGBEJBQMDAgQC5woICAqg0gwGBgzSsg0EBAICAwQLsYcLBAEECv7gJCsKAwICBAsZFm8cBAQC6QJuUv5uUm4CAm5SAZJSbgI8AUs6/m46SwEBSzoBkjpLRAYSJDMVJhQoEhgcKC0JCw8RCgMBBQgNFQ0DAxciFAEGDBERFgsQFhwMDAIUAQcFDwcYEQkHBQQCAQEIFggBIgEGCgwHASMFAg0IAyQBAwoLBAEiJAwXDRIlECAQD0kRAwAACgAAAAADHQKGAEsAfgCXAPEA9QD4AZsCMwI3AjsAAAEdAQYHOQEGBycHFwYHIxUzHgEXBxc3FTcWFxYXFRcHFzcWFxUzNTY3OQE2Nxc3JzY3MzUjJicxJic3Jwc1IyYvATUjMDE3JwcmJzUHMxUzFh8BNxcHFyMVLgEHDgEXMRYXIxUHJzcnJicxJi8BIzUzNTY/ASc3Fzc2NzE2PwEXMhYXFQYHOQEGBycHFwYHIyYnMSY2NzE2FzsBFQczFxYXMRYfATIfATcXBxcWFzEWFxUzFQ8BBg8BFwcnBw4BDwEVIzUjJi8BByc3My8CJicmNCMnNCYnNScmJzUwMSc1BzUzNzY/ASc3Fzc2NzE2NzM3FhUjFxUnByIjMTA5AiIxIxUiBw4BBzEwFDA5ATAxFTAxFTgBOQEGFTE4AzEVOAE5ARYVMTAVMRYVMTA5ATAUOQEwOQEUFzEwMRUUFzE4ATkBFBc5ARQxFxYVMTA5ARYVFzAUMRYXOAEUMR4BNz4BJyYnMTA5AiYjMTQxJzAxJzAxJyYjMTQrASY5ASInMTAxIzAnIyIxJzArATA5ASInMSIxIzAxBzEzMDsBMjkBFjMxMjEzMDMxMBcxMjEzMBczMjEXMjkBFjMxMDkBFjMVMTIXMTAxFzAxFzMyFTEyFTEWFxYGBzEGJic4AzEnOAEmMDEnMC4BMDEmNTE0MCY1MTAxNTgBOQEmPQEmNTE4ATQxJzAxNTQnMTgBPQE4AzkBNDcxMDkBOAIxNTgCOQE+ATcxNjMxNDMHMRUnFxYXJwGMEBAPDiY1JhIHNTUEDQknNiUhDAsCBQ4kNiYdIUsRDw8OJzUmEgc0NQMHBgolNiQgDAoHESQ2JB0gR0ICIh0CIy8kATUYSyYtIhINGiIlLyYBCQcHAwE0NAcTASUvJAIOEBEQAiAdMhARDxANJjUlEgcJHw4RISoVeDkJAQIJDAoRDQEBAQEkLyQBCgcGBDQzAQYUASYuJgINIRECQQIjHQEmLyQDAQIDBAMBAQIBAQEEAwI1NAEGFAElLiUCDhAREAJGAgI5EE0BAgEFEhIdJAQBAQEBAQECAQECAQMWUCosIhERIgECBAMEAQIBAgEDBAMBAwEDAQMBAgEEAwMBAgECAQEDAQIBAwECAQYBAgEBAwIBAwMBAgEgEBEhKihNFQMBAQEBAgEBAQEBAQQiHBERAaoFEwQGCgKGAzEEBgcJJTUlHSBMDyANJjUkDwEFAwoMIQEjNSYSBzY2BAYHCSY2JR0hSxAPEA0lNSQQBAMWHyU1JRMGNAUzBxMBJC4kASEgFg8UVC0fEjYkLiUCDhARDwJCAiIdASUuJAEKBgcDAUAbGQoDBwYKJTUlHCERIitQEwgOGxgCAwQGCQEBASQuJAINEQ8RAkEBAiEeASUvJQEJDgMBNTUIEgElLiMCAgYGBgICBAECAQIBCwoBBwMBQgIiHQIkLiQBCgYHBAoDAw0JCTIBCA0wHgEDAQMFCAQEAQECAQECAQEDAQIBBwEBAQIDAQQDASUcEBRVLCYSAQEBAgEBAQECAQEBBQEBAQIBAQEBAQIBAREkK1ATEBskBwEDAgIEAwECAQECAQECAQEDAQQDAQcEBAQcLwwIAZMCAikJCQEAAAMAAAAAAwsChAAiAEQAZQAAAQcOAQceARcOAQcGBw4BBxUzFjchNTQmJyYnLgEnPgE1LgEHMhceATcWFRQGDwEXHgEXDgEHLgEnPgE/AScuASc0Nz4BFxYXHgEXFhcVIzUjFSE1NCIHFSM1Njc+ATc2Nx4BFz4BAewFQEsBASIXDTIeIxsMEAFiAgEByRANHCQgNg0VGwFNZxQULkwKARwWBgcFJhoDVkFAVgMbKQYHBhckAQEIN+kPDxEhDBoBWgj+owcBVwIZDB8RCQoEWUFCWQKEAQFNPR0zFAQUERIaDR0QzAEBzA4bDBoTEhcFFDIdPU5RChcSBwYIHTISBQICDww2SAEBRjYNDwICBRMyHQgHCCC/BwkKFgsZF8SQkJAFBZDEHBgMFgkGBDdHAQFJAAAABQAA/9MD1ALpAA8AHwAzADcAPgAAEw4BBxEeARchPgE3ES4BJwUhHgEXEQ4BByEuAScRPgEXIjEiBhURFBYzITI2NRE0JiMwMQU7AQcnFxY/AREh11JvAgJvUgI6U24CAm5T/cYCOjpMAQFMOv3GOkwBAUwkAQUHCAUB9AUHBwX+O83Iyu7nBwbn/iUC6QJuUv5uUm4CAm5SAZJSbgI8AUs6/m46SwEBSzoBkjpLQgcF/psFCAgFAWUFBxl0a4QDA4T+vQAAAAADAAAAAALuAqQADgAUABcAABMVFDERIREwMTUiMSc1IRchFTMRIQEXI/oB9AGm/rYCAUOn/hYBSJ6eAqQCAf13AeYCogIFo/4hAn6aAAAAAAIAAP+HA78DIgAQACAAAAEOAhIWBDc+ATc2JicuASMXHgEXFgYHBiQnJgI3PgEzAfCH4GkwugECfoGkCAeJeC9mNAiF0iUiVGlw/vFqZz8zMMl6AyIClvj+9sI+LC7ciYfoPRcYMQOigHvxS08LVlYBA3twhgAAAAUAAP+NA80DIgAOAB0ALAA7AEQAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcOAQc+ATcXJgHzqv8AFhCGgXwBEc5HWtWHERed6REMkIKB/vxPTQdYOZ9hkNIHBJ+AeN04NSxcMXpDf7YCAZl2b74jH0teJFEqIjgiIDwgfT8DIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZvY8pjIUUhh8gABgAA/40DzQMiAA4AHQAsADsAQwBKAAABBgQHBhYXFiQ2EgImJyYHNhYXFgYHBiQnJhI3PgEXIgYHBhYXFjY3NiYnLgEHHgEXDgEHBiYnJjY3PgEXBgcXITY3JicWFwcjJzYB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRKmtsUgEKKihrbF1eSOZIXgMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFldOTv1/fk4wQ0Tc3EQAABAAAP+gA7sDIgAIABEAHgAsADsASQBYAGYAdQCEAJMAogCvAL4AzADbAAABDgEHPgE3FyYnFhcnDgE1PgETDgEHBhY3NhcyNicmFyIGFx4BFxY2Jy4BJyYFDgEHDgEHBhY3PgE3NiY3IgYHBhY3NhYXFjYnJgcOAQcOAQcGFjc+ATc2JgUiBhceARcWNicuAScmBSIGBwYWFxY2Jy4BNzQmBSIGFxYGBwYWNz4BJy4BBSIGFx4BFxY2Jy4BNy4BBSIGFQ4BBwYWNz4BNy4BBQ4BFx4BFxY2JyYnJgUOAQcOAQcGFhc+ATc2JgUOARceARc+AScuAScmBQ4BBw4BBwYWNz4BNzYmAfQiOCIgPCB9Pz0iIkQRMRIeER89HRIPFWFjFAcSMssUChEnPRUNIwUYSS4D/fQQFwwgMREEIw0UPigJC/kQIQgFGA8mTCMUDxBF5xEfDhotDwUkDBc+JAsLAXkTCg8cJgsNIwQNLyIG/cURDAEFCA0LJQINBQgNAukQDAMBGRcFIw0dGwQCDfyjEA0DARkZDSIFFxcBAgwC7BAMCCEWByMOHSYGAQ39qBEIDB5KKxQNEE83BgGfESARGjYaEggUL1ooDAr+NxIIDypjNRQIEzFbJwYCGBAZDiBIJRENFTZkKgoMAiZjymMhRSGHyHVtbkoROgc1awGEAQcKDCQEGRYmCQxTJQodSysPERQzViECCgIXCx5IKBQPEC5PIAwbAQMPEBQEAw0PBCQMHycEFAoUMBwVEBAjNxQMHDoiDB1GJhEQFS1RIASqGw4pUycRDBQoUykKDi0ZDjNjLRQQDzZ5PggKEBkONGQtDxIULWIyCAs4GQ4kQR0UFBAlVi8JDqACIAsjNA8CJAsfQQZNBBIFCQcDCSUBARkYDB4mAiIKIi8KASYICywgAwMDFgcVGwkLJQILMCQMGwAAAAUAAP+NA80DIgAOAB0ALAA7AEMAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcUFSMVMxU3AfOq/wAWEIaBfAERzkda1YcRF53pEQyQgoH+/E9NB1g5n2GQ0gcEn4B43Tg1LFwxekN/tgIBmXZvviMfS14kUVzi4qUDIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZ0MjK+ZMMAAA0AAP+iA7gDIAAEAAgADAAQABQAGABTALwBRQGiAekCMwKfAAABFREhEQUzESMTFTM1BxUzNQcVMzUHFTM1AysBByMHIwcVDwUVHwUzPwMzNzM3MzczFzMXMxczHwEzPwM1LwQjNSMnIycXDwYVHwozHwYVHwIzHw0zPwQ1LwE1JyMvBiMvATUjLwsjLwEjLwcjNSc1LwQjBQ8BIw8EFQ8EFQcjBxUPAyMVBxUHIxUPBBUHIw8BFQ8CFQ8CIw8DFQ8DFQcVDwoVBxUfBD8EMz8ENT8mNS8DAQ8FFRcVBxUHFQcVBxUHFQcVBxUHFQcVBxUHFQ8HFR8EPwUzPwEzPwE1PwEzNzM3NTc1MzU3NTc1NzU3NTc1NzU3NTc1JzUvBAUPBRUXFRcVFzMfBTMfARUXFRcVFxUzFxUXFR8EPwQ1Lw01JzUnNSc1LwMBDxcfBD8EMz8DMzczNzM3MzczNzU3Mzc1NzM/AjM3MzU/AzUvBAUPBRUfAxUfATMfAjMfAhUfATMfARUfATMXMxczFzMfAjMXMxcVMx8HMxcVFzMVMxczPwQ1LwQjJyMnIycjLwojLwQjLwUjAV0BLv7q/v4aysrKysrKymEHDQYNDQcnDQ4EAwMEAQIDAwkEBQYMBhcGCwYGBgYpBgYGBgYFHwQFDAMDAgIGAwonBgcGDQfpBQQEAwMBAgICBgICAwYFBAMIAQ4CCAIGAgQBAgIBAgMCAwUEAwQDCgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLQECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJCQgGBgUGEAsGEQUGBgUvBgUGBgwGBwUHBgL+sgECBgQEBgQJBAMFCQIDBAMMAQQDBAMHCQkIAwMDAgIBBgIGAwIDAgMDDwYBAwMBAwQHDAQBAwQEBAkIBAMCAgIBAwIEBAkEBQQEAwEKAgICAgICAQEHAgUBAQEDAgIBAgECAQEBAQECAgIEAgkBAQQBBAEEBwUECQgEAgMBAwcGAwMGAgIDAQMCAwIJAgMCAQQBBA0BAgAAAAQAAAAAAu4CpAANABMAFgAdAAATFRQxESERMDE1IjEnNQUhFTMRIQEXIycVIxUzFTf6AfQBpv64AUOn/hYBSJ6ekXNzVQKkAgH9dwHmAqICBaP+IQJ+mjI3VDdhAAAAAAgAAP/TA9QC6QAPAB8ANgBMAFQAXABkAGwAABMOAQcRHgEXIT4BNxEuAScFIR4BFxEOAQchLgEnET4BFzEOARQeAwYPATM+AS4ENj8BBzMGBwYeBAYHIzY3Ni4ENhciFDsBMjQjByIUOwEyNCMHIhQ7ATI0IwciFDsBMjQj11JvAgJvUgI6U24CAm5T/cYCOjpMAQFMOv3GOkwBAUyRNCkbJRwGIi0L6S4jBR4kGgEpMQvmzSoTFgEcJB0FIS3NJRATBh4lGQEoEwMDewQEbgQEbwQESgQEfAQEYwQEfAMDAukCblL+blJuAgJuUgGSUm4CPAFLOv5uOksBAUs6AZI6S1ofMy0nJCMkLBsGHC4rJCQlKDAeBgcbFhotJyQjJCsbGBQXKyQkJSgvHgcHRQcHRQcHRQcHAAQAAP/TA9QC6QAPAB8AIgAnAAATDgEHER4BFyE+ATcRLgEnBSEeARcRDgEHIS4BJxE+AR8BNwURIREH11JvAgJvUgI6U24CAm5T/cYCOjpMAQFMOv3GOkwBAUwj6+v+KgHW6wLpAm5S/m5SbgICblIBklJuAjwBSzr+bjpLAQFLOgGSOktcgoJL/twBJHUAAAUAAAAAAzkCmgAjADkATwBlAHsAAAEiDgIHFTAxFTAxER4DMj4CNxEwMTUwMTUwMTUuAwcyHgIXDgMiLgInPgE3PgE3NgUWFx4CMj4BNzY3FQ4DIi4CJxUWFx4CMj4BNzY3FQ4DIi4CJxUWFx4CMj4BNzY3EQ4DIi4CJwH0O29cOQYGOVxvdm9cOgUGOVxvOztvWzYFBTZbb3ZvWjcFBTctHUUlJ/7pCRQdXG92b1wdFAkDOFtvdm9aNwUJFB1cb3ZvXB0UCQM4W292b1o3BQkUHVxvdm9cHRQJAzhbb3ZvWjcFApoKFB0VSkn+vBUeFAkJFB4VAURJSQEVHRQKBQoUHRESHRMKChMdEhEdCgYJAgNYDwoPEwoKEw8KDz0SHRMKChMdEgwPCg8TCgoTDwoPPRIdEwoKEx0SDA8KDxMKChMPCg/+yRIcFQkJFRwSAAkAAP+gA70DIQAIABEAHwAtAEAATwBeAG0AfwAAAQ4BBz4BNxcmJxYXJw4BNT4BEyIGBwYWNz4BFz4BJyYXIgYXHgEXFjYnLgEnJgUGDwEOAQcOARY2NzY3PgE3NCYBIgYXFgYHBhY3PgEnLgEFIgYXHgEXFjYnLgEnLgEBDgEHDgEHBhY3PgE3NiYhDgEXHgEXHgE3NiYnLgEnLgEB9CI4IiA8IH0/PSIiRBExEh4VIEEeEQ8UMGQwFQcTL8kUCREoOxcQIAgZRiwF/fEPDBYbKxIIBhoYBCExCxkCDQKtEAwDAxgZBSMNHxoHAg38pBANAwIbFw0jBRcXAQIMAq4QGQ4gRyUSDxQ2YyoKDP3TEggPJFMsDR8JBxEOKlAiBQwCJmPKYyFFIYfIdW1uShE6BzVrAYIHCgwlBAwCCgEmCAxQJQodTSsOFhMxVSADCwMLFRo+IQwbExAOPzQLEhAJDv7IGw4zYy0UEQ83ez8ICBIaDjNkLQ8RFC1jMggL/rMDFggVHAoLJQMMMSQMGwIiCh4pDAUFDw4XAQojHAUIAAAAAAYAAP+NA80DIgAOAB0ALAA7AEAARgAAAQYEBwYWFxYkNhICJicmBzYWFxYGBwYkJyYSNz4BFyIGBwYWFxY2NzYmJy4BBx4BFw4BBwYmJyY2Nz4BBxYXNjcFFBUhEQcB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRfVZVVFb+hQGayQMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFptFRUVFIIyMARKjAAAQAAD/oAO7AyIABgAOABsAKQA4AEYAVQBjAHIAgQCQAJ8ArAC7AMkA2AAAASYnBxchNjcGByMnNjcWAw4BBwYWNzYXMjYnJhciBhceARcWNicuAScmBQ4BBw4BBwYWNz4BNzYmNyIGBwYWNzYWFxY2JyYHDgEHDgEHBhY3PgE3NiYFIgYXHgEXFjYnLgEnJgUiBgcGFhcWNicuATc0JgUiBhcWBgcGFjc+AScuAQUiBhceARcWNicuATcuAQUiBhUOAQcGFjc+ATcuAQUOARceARcWNicmJyYFDgEHDgEHBhYXPgE3NiYFDgEXHgEXPgEnLgEnJgUOAQcOAQcGFjc+ATc2JgLLa2zXUgEKKgwkJOZIXl1dXR89HRIPFWFjFAcSMssUChEnPRUNIwUYSS4D/fQQFwwgMREEIw0UPigJC/kQIQgFGA8mTCMUDxBF5xEfDhotDwUkDBc+JAsLAXkTCg8cJgsNIwQNLyIG/cURDAEFCA0LJQINBQgNAukQDAMBGRcFIw0dGwQCDfyjEA0DARkZDSIFFxcBAgwC7BAMCCEWByMOHSYGAQ39qBEIDB5KKxQNEE83BgGfESARGjYaEggUL1ooDAr+NxIIDypjNRQIEzFbJwYCGBAZDiBIJRENFTZkKgoMAaJOTpz9f3VvbdxEQ0MBRQEHCgwkBBkWJgkMUyUKHUsrDxEUM1YhAgoCFwseSCgUDxAuTyAMGwEDDxAUBAMNDwQkDB8nBBQKFDAcFRAQIzcUDBw6IgwdRiYREBUtUSAEqhsOKVMnEQwUKFMpCg4tGQ4zYy0UEA82eT4IChAZDjRkLQ8SFC1iMggLOBkOJEEdFBQQJVYvCQ6gAiALIzQPAiQLH0EGTQQSBQkHAwklAQEZGAweJgIiCiIvCgEmCAssIAMDAxYHFRsJCyUCCzAkDBsAAAAAEAAA/6ADuwMiAAMACAAVACMAMgBAAE8AXQBsAHsAigCZAKYAtQDDANIAAAEGByEDFhchNhMOAQcGFjc2FzI2JyYXIgYXHgEXFjYnLgEnJgUOAQcOAQcGFjc+ATc2JjciBgcGFjc2FhcWNicmBw4BBw4BBwYWNz4BNzYmBSIGFx4BFxY2Jy4BJyYFIgYHBhYXFjYnLgE3NCYFIgYXFgYHBhY3PgEnLgEFIgYXHgEXFjYnLgE3LgEFIgYVDgEHBhY3PgE3LgEFDgEXHgEXFjYnJicmBQ4BBw4BBwYWFz4BNzYmBQ4BFx4BFz4BJy4BJyYFDgEHDgEHBhY3PgE3NiYB9GBgAYDAS0z+0kxLHz0dEg8VYWMUBxIyyxQKESc9FQ0jBRhJLgP99BAXDCAxEQQjDRQ+KAkL+RAhCAUYDyZMIxQPEEXnER8OGi0PBSQMFz4kCwsBeRMKDxwmCw0jBA0vIgb9xREMAQUIDQslAg0FCA0C6RAMAwEZFwUjDR0bBAIN/KMQDQMBGRkNIgUXFwECDALsEAwIIRYHIw4dJgYBDf2oEQgMHkorFA0QTzcGAZ8RIBEaNhoSCBQvWigMCv43EggPKmM1FAgTMVsnBgIYEBkOIEglEQ0VNmQqCgwCMqytASaHh4cBqgEHCgwkBBkWJgkMUyUKHUsrDxEUM1YhAgoCFwseSCgUDxAuTyAMGwEDDxAUBAMNDwQkDB8nBBQKFDAcFRAQIzcUDBw6IgwdRiYREBUtUSAEqhsOKVMnEQwUKFMpCg4tGQ4zYy0UEA82eT4IChAZDjRkLQ8SFC1iMggLOBkOJEEdFBQQJVYvCQ6gAiALIzQPAiQLH0EGTQQSBQkHAwklAQEZGAweJgIiCiIvCgEmCAssIAMDAxYHFRsJCyUCCzAkDBsAAAAABQAA/40DzQMiAA4AHQAsADsAQwAAAQYEBwYWFxYkNhICJicmBzYWFxYGBwYkJyYSNz4BFyIGBwYWFxY2NzYmJy4BBx4BFw4BBwYmJyY2Nz4BFwYHFyE2NyYB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRKmxrUgEKKihrAyIC4amP/UE8IrgBCAECpQoCMQHQm4rqMC1Pb3EBEGlETivIkIPPHRdobW3wUSswMAG0f3azDwx2a2jNNxUWV05O/X9+TgAAAAAKAAD/oAO9AyEABAALABEAHwAtAEAATwBeAG0AfwAAARQVIREFMjMOAQcmNxQVITUXEyIGBwYWNz4BFz4BJyYXIgYXHgEXFjYnLgEnJgUGDwEOAQcOARY2NzY3PgE3NCYBIgYXFgYHBhY3PgEnLgEFIgYXHgEXFjYnLgEnLgEBDgEHDgEHBhY3PgE3NiYhDgEXHgEXHgE3NiYnLgEnLgEBJwGa/sFych49HjXY/sicBCBBHhEPFDBkMBUHEy/JFAkRKDsXECAIGUYsBf3xDwwWGysSCAYaGAQhMQsZAg0CrRAMAwMYGQUjDR8aBwIN/KQQDQMCGxcNIwUXFwECDAKuEBkOIEclEg8UNmMqCgz90xIIDyRTLA0fCQcRDipQIgUMAfqcnAE4MRQ6BysOXV26fQHwBwoMJQQMAgoBJggMUCUKHU0rDhYTMVUgAwsDCxUaPiEMGxMQDj80CxIQCQ7+yBsOM2MtFBEPN3s/CAgSGg4zZC0PERQtYzIIC/6zAxYIFRwKCyUDDDEkDBsCIgoeKQwFBQ8OFwEKIxwFCAAAAAEAAAAAA2sCFgAaAAABDgEHFT4BNzYWFx4BNz4BNzUOAQcOAScuAScBRjppJiZTMzlqMypaLzVfJRIuGCRTKEeMTQIWAXBco0R5DghTLycsBgRcS64oOBkuGho2eAsAAAgAAP/TA9QC6QAPAB8AZwCYAK4BBAGgAi4AABMOAQcRHgEXIT4BNxEuAScFIR4BFxEOAQchLgEnET4BFx0BBzEGBycHFwYHIxUzHgEXBxc3FTMXFhcVMwcXNxYXFTMnMzU2NzkBNjcXNyc2PwE1Iy4BJzcnBzUjJicmJzUjNycHJic1BzMVFxYfATcXByMVLgEHDgEXOQEWFyMVByc3JyYnOQEmLwEjNTM1Nj8BJzcXNzY/ARcyFhcVBzEGBycHFwYHIyYnMSY2NzYXMxUfAjAyFDEXMBQzFTMXNTcXBxcWFzkBFh8BMxUjBwYPARcHJwcOAQ8BFSM1JyYvAQcnNzMnNSYnNCM5AjQjJyY1JyM1Myc1Nj8BJzcXNzY/AR8BIjkBMDkBIjAxIzgCOQEGBzEOAQcxOAExFTAxFTEwMRU4ATEVMDEVMDkBMhUxOAExFTgBOQEWFTE4AjkBMBcxOAIxFzAWMBQWOQEUMhQwMRc4AjkBHgE3PgEnJicxMDEnMDkBJjkBMDkBJjEjNCMxOAExJzAxIzUwIzEiJzEwMSMwMSMwOQEmIzEwMSMwJzEwMSMiMSMwMQcyOQEyMTMwMTMwMRcwMTMwMTM4ATI5ARYxMzIXMTIxMxYxMzgBOQEWOQEyMRcyMRczFzAzMRYXFgYHMQYmJzE4AjkBLgExNTAiNTEwJjgBNDAxJicxMDQwMTU4AjEnOAExNTA0OQEwJzE4AjE1MDQxNTgBMTUwMTU4ATkBPgE3NjcxMDIxMzgBMjHXUm8CAm9SAjpTbgICblP9xgI6OkwBAUw6/cY6TAEBTGYSCAkXJhcJBSEiAggEGCYUFwwBAwQTJhkQEjEFCgkJCQcZJhkLAyEhAQgFFycTFwUGAQMGFCcXEBIsIgQUEgQVGBMiEC0XHRcMBwwPFBgXAgYEBAIBICAEDAIWGBYECAoYEREdCRIJBxgmGAsDAxEIChMZDE4iCQ4LAgMCAQYTGRYCBgQFAQEfHwEECwIXGBcECBQKBCIEFREEFxgTBwUGAwEBBAEBICYGBAwCFhgWBAgKFQMSAgEDDAsUGAIBAQEBAQEBAg80Gx0XDAoXAgICAQICAgECAgIBAQEDAgIBAgIBAQICAgICAQEBAgEBAQECAQEBAQEBAQETCQoUGBgtDQEBAQEBAQEBAhQRCwkBAgEC6QJuUv5uUm4CAm5SAZJSbgI8AUs6/m46SwEBSzoBkjpLNAUcBgQFGCYYDxM2CREIGCYUBQQGBRgTJhgJBSIFHgIDBQQYJhgQEgE1CRIHFyYTBQMBBgYWEyYXCQUhCh8BBAsDFhgTDxEKCQ02Hg8LIxQYFwMJCQsJBCIEFREEFhgWAgYEBykQDgIGBAUYJhgPEwsTGTALBQkfAgQGAQEBAQQEExgWAwkJCgoEIgQUEgMXGBcDBQgCASEgAQQMAhcYEwcBBwgCAQ8CAgQiAwEVEQQWGBYCBgQGBRkBBQkfFAIGBQUBAgMBAgIFAQEBAgEFGBMLDTcdGQwBAQEBAQEBAQEKAQEBAQEBAQEKFRowCwkQFQMBAQIBAQMBAQICAgECBAEEBQIRHAcEAQAAAgAA/9MD1ALpAA8AHwAAEw4BBxEeARchPgE3ES4BJwUhHgEXEQ4BByEuAScRPgHXUm8CAm9SAjpTbgICblP9xgI6OkwBAUw6/cY6TAEBTALpAm5S/m5SbgICblIBklJuAjwBSzr+bjpLAQFLOgGSOksAAAADAAAAAAM7Ak0ABwAKAA0AAAEFFwU1BREFJxEtARElAfj+tgUBRQFD/r0K/tECcv7QAk3vBOvp6QHe6db+SNzc/kjcAAkAAP+gA70DIQAGAA4AHAAqAD0ATABbAGoAfAAAASYnBxchNjcGByMnNjcWAyIGBwYWNz4BFz4BJyYXIgYXHgEXFjYnLgEnJgUGDwEOAQcOARY2NzY3PgE3NCYBIgYXFgYHBhY3PgEnLgEFIgYXHgEXFjYnLgEnLgEBDgEHDgEHBhY3PgE3NiYhDgEXHgEXHgE3NiYnLgEnLgECy2ts11IBCioMJCTmSF5dXVkgQR4RDxQwZDAVBxMvyRQJESg7FxAgCBlGLAX98Q8MFhsrEggGGhgEITELGQINAq0QDAMDGBkFIw0fGgcCDfykEA0DAhsXDSMFFxcBAgwCrhAZDiBHJRIPFDZjKgoM/dMSCA8kUywNHwkHEQ4qUCIFDAGiTk6c/X91b23cRENDAUMHCgwlBAwCCgEmCAxQJQodTSsOFhMxVSADCwMLFRo+IQwbExAOPzQLEhAJDv7IGw4zYy0UEQ83ez8ICBIaDjNkLQ8RFC1jMggL/rMDFggVHAoLJQMMMSQMGwIiCh4pDAUFDw4XAQojHAUIAAUAAP+NA80DIgAOAB0ALAA7AD8AAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+ARcGByEB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRKmBgAYADIgLhqY/9QTwiuAEIAQKlCgIxAdCbiuowLU9vcQEQaUROK8iQg88dF2htbfBRKzAwAbR/drMPDHZraM03FRZjrK0AAAAAFAAA/6MDuAMiAAQACAAMABAAFAAYAFsAswEJAUwBoQH+AkkCiwLPAxIDaQO2BAIETAAAARURIREFMxEjExUzNQcVMzUHFTM1BxUzNQMxIwcjByMVIwcjDwcVHwQzNzM3MzczNzM3MxczFzMXMxczFzM/BTUvBSMnIzUjJyMnFyMPBR8ZPwQ1LwMjJzUnNScjLwEjLwE1JyMnNS8BIy8BNSc1JyM1JyMnIy8BNS8BIyc1JyMvAQUjDwIVByMPARUPAhUHFQcVDwEjDwEVDwIVDwEjDwEjDwEVBxUPASMPAhUfBTM/GTUvBCExIxUjDwMVHwQzNzM3MxczFzMXMxczFzMfBjM/BTUvAiMvCSMnIycjJyM1ByMPAiMPARUHIw8BIwcVByMHIwcjBxUPAyMVDwEVDwIjDwEfBTM/HTM/Ay8DBQ8FHxYVHwQzPwQ1JzUvCDUnNS8EIycjJzUvASMnNSc1LwE1Iy8BNScjJzUvAjUvAwUjDwUVIxUHFQcVIxUHFRcVMxUXFRcVFxUfCTM/BDUvAjUnNSc1JzUnNSc1NzU3NTc1NzU3NS8EBSMPAxUHFxUHFQcVBxUHFQ8IFR8DMz8GNTc1Pwc1NzUzNTc1NzUnNS8DBSMPAxUXFRcVFxUXFR8HFRcVHwIzFR8DMz8ENS8LNSc1JzUnNSc1LwQFIw8FFQcVDw8VHwU/AjU/ATU3Mzc1PwIzPwo1Ny8EBQ8FHwIVFxUXMxczHwIzHwEzFRcVFxUXMx8BMxczFxUXFR8BFR8CFR8CMz8FNS8cBSMPCCMHIwcjByMHIwcjDwQVHwUzNzM3MzczNzM/CzM3Mz8BNT8BNTc1PwQ1LwQFDwUVHwUzHwEVFzMXMx8BFR8BMxcVHwQzFzMfBjM/BTUvFiEjDxcVHwYzPwgzPwQ1NzM3Mzc1PwE1PwEzPwQ1LwQBXQEu/ur+/hrKysrKysrKZQsGCwUMBQUGJgYKCAQCAwEBAgYECQQrBQkFBQUFCgUeBQoFBQUFCgQYCQUEAwQEAQEEAwQHJgUGBQsGCwb0BQQFAwQEAgIIAgwHCAcEAwQDBAMHBgcPAgkCAxEEAwQJCQQEAwQBAgMCAQIDAgECEgEJBAYBAwQDAQMIBAMBAwEDAQgEBAQBBAgBBAr98QUECAUEAQQEBAwEBAQIAwEDBAMEAwQJAQ8CAQIDAwUCAQQDAwECAwMIBAkFBwUFEAYCBgIPBwYHAwQDBAMEBwgEBAcCAQICAwQIAQQSDQoFBwYCAgMICAQBCAQmBAgDBAQEBwQIAxoDCAcHAwkFBAQEAwQBBAMHAQMFBAQEBAQJBCYECQUEBAUNrQQIBgcBAwgDARUDAQMDAQkBDAEJCQMDAgECAwMIBAEEAgICAwMIBAUECQMIAwIEAwIDAgMCAwIDAwMCAwMDAwMDAwMGAyMCAwQEAgIFBAgBhAUIBAMDAwEGAwMCAwIDAgMCAwcWAQQBBAEGAwICBAQDBAUJBAQEAwQBAgICAQIBAgECAgIBAQEIAQEBAgIEAQIHAwIBAgMCAQIGAwkDAwME/cMFBAgDAwICAQIBAQEBAQECAQgCAQEBAwMEBAQFCQQDAwQBAgUDAgEBAQEBAQIBAQIDAwkC7gUECAYCAQEBAQECCAIBAgIEARYBAQQDDAUJBAYFBAMKAggBAgECAgIHAQEBAQEEAwQI/KcFCAgEAgEBAQIGAgICAQQBBgIKAwQBAwYEBQkEBAQDBAIBEgECAQIBAgICBwIBAQEBAgcDBQLwBAUEBAMEAgIHAgMFAgQBAgMMCgMEAgQBAQQDBAQJCAUHAw8CAQYFCAEBAQYBAgECAQICAgkBAgIDBAj9rQQIBAMCAgIFBgwGAQwBBgcDAQMDAQcHAwEHBwEDAQMECAQEDAQEBAQJBAQEBQIBAQQEAxUDBAoHGQMKAgMDAwMDAwMCBgMCAwIDAggBnAUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFDAUNBAUEBQgFJgQJBAQEBAQEAQQDAQMBAwQECAQJBAICAQIGAwQF/kQEBQQGAgIBAgMDBQQBBA0JAQ0BBAUFBAEEBQUKBRkBBAEUBgUFBQsKCQUEBAMEAQIDAwQHEwUEBQUEBQUEJR4IBAQJDAMNAhIFBAUDARQEBAkIFiwFBQQFBQUEBRsEBgQBAQIDAwQEBAkDBgULBQUFBhQBHgUKBQUEAQQBBAUcDQQBBAUDAgECAgMECAIcDP6QAXwY/rQBJxkZShgYVRgYTRgYAi8BAQEBBwICBAMEBAQJBAUGAwIJAgEBAQEBAQIFAQIDAwgEBQQJAwMDBwEBAQFTAQICBAcJCQoBCQcGBwMEAwQDBAcIBxQEDQQEIAMDAgICAgMDCAkFBgUFBAEEAQQFHA0EAQgEAQQEBAgBAwEDAQMECAMBAwQDAQYEBwgBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwQBAgIFDAUJBAMGAgEBAQEBAgIHAgIDAgICAQIDAwgFCQgDBQIBAgECAQICAgkCAQEBJwIDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ7AQIDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwOpAQQEAwQIBAQJBQQJDQQbBQ0JBAQJBAEEIgQFAQQEAwMCAQICAwQICQUEEgQLBAcEBAcECAQeBAgEBwQEBwQECQQEBAMELQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAIGCAgJBhEFBgUGCwUhBgsFBQoGDwEEARkFCgEEBgIBAQMCBAgJCAEpBAUFBAUFCQUiBQkFBQUFCgUXBQQHAgI5AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoAEEAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDB0oBAgEDBgwDAwUDAgEBAQQDAwQJBQQIAwMCAQEBAQIJAgICAQIBAgEBAQICAgEBAQQBAQEFBAMFBAUICAMCAScBAQMGBAkFBAQEAgUDBAkBBgkDAgECAwIBAgMEAwoCCAECAQICAwECAwMIBQQJBAMDAwQCAQIBAgECARAQBgIDBQkDCgECAgIPAgMFBgwUAQIBAgECAQIGAgYJBAUEBAQDAwIBAQECAgIBAgEIDAMEAwIBAgMCAQISAQkEAwUEBAQFCQQDAwQAAAAAAwAAAAADuQKOAAMABwALAAATESERBxEhESMzESMvA4ox/WKMXl4Cjv2PAnEw/esCFf3rAAQAAP+cA8MDIAADAAcADgAVAAABETMRMxEzEQEHFzUzNSMlFQcVMxU3AW4mwyb+UKSkXV0CU15eowMg/HwDhPx8A4T+4aOjb2lubAFqb6MABgAA/54DlAMeAAYACQANABEAFQAZAAABBRcBFwEXJQUXJwcXNw8BFzcPARc3DwEXNwOU/mZA/hoZAeY+AQP+ZZeVPxk/lz4ZPp4/GT+XJhkmAx5tX/65JgFIXAVt4FgrJSovKiYrNSslKzAaJRoAAAkAAP+nA7IDHgADAAcACwARABUAGQAfACUAKQAAARUzNQUVMzUzFTM1FxUzFTM1BRUzNQUVMzUHFSMVMzUFFTM1IzUXFTM1AS9n/qHaoduCeyj9fWcB9Cgod5/9np934FIDHtra9mdnZ2ceKHWdaNran01NvnQonAGdKHV1KCgAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQAEABUAAQAAAAAAAgAHABkAAQAAAAAAAwAEACAAAQAAAAAABAAEACQAAQAAAAAABQALACgAAQAAAAAABgAEADMAAQAAAAAACgArADcAAQAAAAAACwATAGIAAwABBAkAAAAqAHUAAwABBAkAAQAIAJ8AAwABBAkAAgAOAKcAAwABBAkAAwAIALUAAwABBAkABAAIAL0AAwABBAkABQAWAMUAAwABBAkABgAIANsAAwABBAkACgBWAOMAAwABBAkACwAmATljYW11bmRhIFNlcnZpY2VzIEdtYkhicG1uUmVndWxhcmJwbW5icG1uVmVyc2lvbiAxLjBicG1uR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AYwBhAG0AdQBuAGQAYQAgAFMAZQByAHYAaQBjAGUAcwAgAEcAbQBiAEgAYgBwAG0AbgBSAGUAZwB1AGwAYQByAGIAcABtAG4AYgBwAG0AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAYgBwAG0AbgBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhAAABAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEMc2NyZXctd3JlbmNoBXRyYXNoEGdhdGV3YXktcGFyYWxsZWwfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNhbmNlbDFpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1tZXNzYWdlGHN0YXJ0LWV2ZW50LWNvbXBlbnNhdGlvbi5zdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXBhcmFsbGVsLW11bHRpcGxlC2xvb3AtbWFya2VyCXVzZXItdGFzaw1idXNpbmVzcy1ydWxlEnBhcmFsbGVsLW1pLW1hcmtlciNzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLXNpZ25hbC9pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy10aW1lcippbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtcGFyYWxsZWwtbXVsdGlwbGUlaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbXBlbnNhdGlvbgtnYXRld2F5LXhvcgpjb25uZWN0aW9uEGVuZC1ldmVudC1jYW5jZWwiaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWNvbmRpdGlvbjtpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1wYXJhbGxlbC1tdWx0aXBsZRVzdGFydC1ldmVudC1jb25kaXRpb24ic3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy10aW1lchpzZXF1ZW50aWFsLW1pLW1hcmtlci1rb3BpZQZtYW51YWwHcmVjZWl2ZRJzdWItcHJvY2Vzcy1tYXJrZXIdc3RhcnQtZXZlbnQtcGFyYWxsZWwtbXVsdGlwbGURc3RhcnQtZXZlbnQtZXJyb3IfaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLXNpZ25hbB5pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtZXJyb3IWZW5kLWV2ZW50LWNvbXBlbnNhdGlvbhRzdWJwcm9jZXNzLWNvbGxhcHNlZBNzdWJwcm9jZXNzLWV4cGFuZGVkBHRhc2sPZW5kLWV2ZW50LWVycm9yI2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1lc2NhbGF0aW9uHmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC10aW1lchZzdGFydC1ldmVudC1lc2NhbGF0aW9uEnN0YXJ0LWV2ZW50LXNpZ25hbBJidXNpbmVzcy1ydWxlLXRhc2sGc2NyaXB0BHNlbmQNY2FsbC1hY3Rpdml0eRFzdGFydC1ldmVudC10aW1lchNzdGFydC1ldmVudC1tZXNzYWdlF2ludGVybWVkaWF0ZS1ldmVudC1ub25lHWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1saW5rFGVuZC1ldmVudC1lc2NhbGF0aW9uD3RleHQtYW5ub3RhdGlvbgdicG1uLWlvD2dhdGV3YXktY29tcGxleBJnYXRld2F5LWV2ZW50YmFzZWQMZ2F0ZXdheS1ub25lCmdhdGV3YXktb3ITZW5kLWV2ZW50LXRlcm1pbmF0ZRBlbmQtZXZlbnQtc2lnbmFsDmVuZC1ldmVudC1ub25lEmVuZC1ldmVudC1tdWx0aXBsZRFlbmQtZXZlbnQtbWVzc2FnZQ5lbmQtZXZlbnQtbGluayBpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbWVzc2FnZSVpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctY29tcGVuc2F0aW9uFHN0YXJ0LWV2ZW50LW11bHRpcGxlCmRhdGEtaW5wdXQLbWFudWFsLXRhc2sHc2VydmljZQR1c2VyDHJlY2VpdmUtdGFzawtkYXRhLW9iamVjdBBzdGFydC1ldmVudC1ub25lI2ludGVybWVkaWF0ZS1ldmVudC10aHJvdy1lc2NhbGF0aW9uIWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1tdWx0aXBsZTRpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1lc2NhbGF0aW9uHWludGVybWVkaWF0ZS1ldmVudC10aHJvdy1saW5rJnN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctY29uZGl0aW9uC2RhdGEtb3V0cHV0C3NjcmlwdC10YXNrCXNlbmQtdGFzawpkYXRhLXN0b3JlJ3N0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctZXNjYWxhdGlvbiBpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbWVzc2FnZTJpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1tdWx0aXBsZTBpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1zaWduYWwhaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LW11bHRpcGxlJHN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctbWVzc2FnZQ1hZC1ob2MtbWFya2VyDHNlcnZpY2UtdGFzawl0YXNrLW5vbmUTY29tcGVuc2F0aW9uLW1hcmtlciVzdGFydC1ldmVudC1ub24taW50ZXJydXB0aW5nLW11bHRpcGxlH2ludGVybWVkaWF0ZS1ldmVudC10aHJvdy1zaWduYWwzaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctY29uZGl0aW9uC3BhcnRpY2lwYW50CnNwYWNlLXRvb2wQY29ubmVjdGlvbi1tdWx0aQpsYXNzby10b29sAAA=') format('truetype'); +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.svg?5069274#bpmn') format('svg'); + } +} +*/ + + [class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "bpmn"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} +.icon-screw-wrench:before { content: '\e800'; } /* 'î €' */ +.icon-trash:before { content: '\e801'; } /* 'î ' */ +.icon-gateway-parallel:before { content: '\e802'; } /* 'î ‚' */ +.icon-intermediate-event-catch-cancel:before { content: '\e803'; } /* 'î ƒ' */ +.icon-intermediate-event-catch-non-interrupting-message:before { content: '\e804'; } /* 'î „' */ +.icon-start-event-compensation:before { content: '\e805'; } /* 'î …' */ +.icon-start-event-non-interrupting-parallel-multiple:before { content: '\e806'; } /* 'î †' */ +.icon-loop-marker:before { content: '\e807'; } /* 'î ‡' */ +.icon-user-task:before { content: '\e808'; } /* 'î ˆ' */ +.icon-business-rule:before { content: '\e809'; } /* 'î ‰' */ +.icon-parallel-mi-marker:before { content: '\e80a'; } /* 'î Š' */ +.icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* 'î ‹' */ +.icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* 'î Œ' */ +.icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* 'î ' */ +.icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* 'î Ž' */ +.icon-gateway-xor:before { content: '\e80f'; } /* 'î ' */ +.icon-connection:before { content: '\e810'; } /* 'î ' */ +.icon-end-event-cancel:before { content: '\e811'; } /* 'î ‘' */ +.icon-intermediate-event-catch-condition:before { content: '\e812'; } /* 'î ’' */ +.icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* 'î “' */ +.icon-start-event-condition:before { content: '\e814'; } /* 'î ”' */ +.icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* 'î •' */ +.icon-sequential-mi-marker-kopie:before { content: '\e816'; } /* 'î –' */ +.icon-manual:before { content: '\e817'; } /* 'î —' */ +.icon-receive:before { content: '\e818'; } /* 'î ˜' */ +.icon-sub-process-marker:before { content: '\e819'; } /* 'î ™' */ +.icon-start-event-parallel-multiple:before { content: '\e81a'; } /* 'î š' */ +.icon-start-event-error:before { content: '\e81b'; } /* 'î ›' */ +.icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* 'î œ' */ +.icon-intermediate-event-catch-error:before { content: '\e81d'; } /* 'î ' */ +.icon-end-event-compensation:before { content: '\e81e'; } /* 'î ž' */ +.icon-subprocess-collapsed:before { content: '\e81f'; } /* 'î Ÿ' */ +.icon-subprocess-expanded:before { content: '\e820'; } /* 'î  ' */ +.icon-task:before { content: '\e821'; } /* 'î ¡' */ +.icon-end-event-error:before { content: '\e822'; } /* 'î ¢' */ +.icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* 'î £' */ +.icon-intermediate-event-catch-timer:before { content: '\e824'; } /* 'î ¤' */ +.icon-start-event-escalation:before { content: '\e825'; } /* 'î ¥' */ +.icon-start-event-signal:before { content: '\e826'; } /* 'î ¦' */ +.icon-business-rule-task:before { content: '\e827'; } /* 'î §' */ +.icon-script:before { content: '\e828'; } /* 'î ¨' */ +.icon-send:before { content: '\e829'; } /* 'î ©' */ +.icon-call-activity:before { content: '\e82a'; } /* 'î ª' */ +.icon-start-event-timer:before { content: '\e82b'; } /* 'î «' */ +.icon-start-event-message:before { content: '\e82c'; } /* 'î ¬' */ +.icon-intermediate-event-none:before { content: '\e82d'; } /* 'î ­' */ +.icon-intermediate-event-catch-link:before { content: '\e82e'; } /* 'î ®' */ +.icon-end-event-escalation:before { content: '\e82f'; } /* 'î ¯' */ +.icon-text-annotation:before { content: '\e830'; } /* 'î °' */ +.icon-bpmn-io:before { content: '\e831'; } /* 'î ±' */ +.icon-gateway-complex:before { content: '\e832'; } /* 'î ²' */ +.icon-gateway-eventbased:before { content: '\e833'; } /* 'î ³' */ +.icon-gateway-none:before { content: '\e834'; } /* 'î ´' */ +.icon-gateway-or:before { content: '\e835'; } /* 'î µ' */ +.icon-end-event-terminate:before { content: '\e836'; } /* 'î ¶' */ +.icon-end-event-signal:before { content: '\e837'; } /* 'î ·' */ +.icon-end-event-none:before { content: '\e838'; } /* 'î ¸' */ +.icon-end-event-multiple:before { content: '\e839'; } /* 'î ¹' */ +.icon-end-event-message:before { content: '\e83a'; } /* 'î º' */ +.icon-end-event-link:before { content: '\e83b'; } /* 'î »' */ +.icon-intermediate-event-catch-message:before { content: '\e83c'; } /* 'î ¼' */ +.icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* 'î ½' */ +.icon-start-event-multiple:before { content: '\e83e'; } /* 'î ¾' */ +.icon-data-input:before { content: '\e83f'; } /* 'î ¿' */ +.icon-manual-task:before { content: '\e840'; } /* 'î¡€' */ +.icon-service:before { content: '\e841'; } /* 'î¡' */ +.icon-user:before { content: '\e842'; } /* 'î¡‚' */ +.icon-receive-task:before { content: '\e843'; } /* '' */ +.icon-data-object:before { content: '\e844'; } /* 'î¡„' */ +.icon-start-event-none:before { content: '\e845'; } /* 'î¡…' */ +.icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ +.icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ +.icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ +.icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* 'î¡Š' */ +.icon-data-output:before { content: '\e84b'; } /* 'î¡‹' */ +.icon-script-task:before { content: '\e84c'; } /* 'î¡Œ' */ +.icon-send-task:before { content: '\e84d'; } /* 'î¡' */ +.icon-data-store:before { content: '\e84e'; } /* 'î¡Ž' */ +.icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* 'î¡' */ +.icon-intermediate-event-throw-message:before { content: '\e850'; } /* 'î¡' */ +.icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* 'î¡‘' */ +.icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* 'î¡’' */ +.icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* 'î¡“' */ +.icon-start-event-non-interrupting-message:before { content: '\e854'; } /* 'î¡”' */ +.icon-ad-hoc-marker:before { content: '\e855'; } /* 'î¡•' */ +.icon-service-task:before { content: '\e856'; } /* 'î¡–' */ +.icon-task-none:before { content: '\e857'; } /* 'î¡—' */ +.icon-compensation-marker:before { content: '\e858'; } /* '' */ +.icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* 'î¡™' */ +.icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* 'î¡š' */ +.icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* 'î¡›' */ +.icon-participant:before { content: '\e85c'; } /* 'î¡œ' */ +.icon-space-tool:before { content: '\e85f'; } /* 'î¡Ÿ' */ +.icon-connection-multi:before { content: '\e860'; } /* 'î¡ ' */ +.icon-lasso-tool:before { content: '\e862'; } /* 'î¡¢' */ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css new file mode 100644 index 0000000..bbce9f2 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css @@ -0,0 +1,152 @@ +@font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.eot?8685581'); + src: url('../font/bpmn.eot?8685581#iefix') format('embedded-opentype'), + url('../font/bpmn.woff?8685581') format('woff'), + url('../font/bpmn.ttf?8685581') format('truetype'), + url('../font/bpmn.svg?8685581#bpmn') format('svg'); + font-weight: normal; + font-style: normal; +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.svg?8685581#bpmn') format('svg'); + } +} +*/ + + [class^="icon-"]:before, [class*=" icon-"]:before { + font-family: "bpmn"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Font smoothing. That was taken from TWBS */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.icon-screw-wrench:before { content: '\e800'; } /* 'î €' */ +.icon-trash:before { content: '\e801'; } /* 'î ' */ +.icon-gateway-parallel:before { content: '\e802'; } /* 'î ‚' */ +.icon-intermediate-event-catch-cancel:before { content: '\e803'; } /* 'î ƒ' */ +.icon-intermediate-event-catch-non-interrupting-message:before { content: '\e804'; } /* 'î „' */ +.icon-start-event-compensation:before { content: '\e805'; } /* 'î …' */ +.icon-start-event-non-interrupting-parallel-multiple:before { content: '\e806'; } /* 'î †' */ +.icon-loop-marker:before { content: '\e807'; } /* 'î ‡' */ +.icon-user-task:before { content: '\e808'; } /* 'î ˆ' */ +.icon-business-rule:before { content: '\e809'; } /* 'î ‰' */ +.icon-parallel-mi-marker:before { content: '\e80a'; } /* 'î Š' */ +.icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* 'î ‹' */ +.icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* 'î Œ' */ +.icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* 'î ' */ +.icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* 'î Ž' */ +.icon-gateway-xor:before { content: '\e80f'; } /* 'î ' */ +.icon-connection:before { content: '\e810'; } /* 'î ' */ +.icon-end-event-cancel:before { content: '\e811'; } /* 'î ‘' */ +.icon-intermediate-event-catch-condition:before { content: '\e812'; } /* 'î ’' */ +.icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* 'î “' */ +.icon-start-event-condition:before { content: '\e814'; } /* 'î ”' */ +.icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* 'î •' */ +.icon-sequential-mi-marker-kopie:before { content: '\e816'; } /* 'î –' */ +.icon-manual:before { content: '\e817'; } /* 'î —' */ +.icon-receive:before { content: '\e818'; } /* 'î ˜' */ +.icon-sub-process-marker:before { content: '\e819'; } /* 'î ™' */ +.icon-start-event-parallel-multiple:before { content: '\e81a'; } /* 'î š' */ +.icon-start-event-error:before { content: '\e81b'; } /* 'î ›' */ +.icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* 'î œ' */ +.icon-intermediate-event-catch-error:before { content: '\e81d'; } /* 'î ' */ +.icon-end-event-compensation:before { content: '\e81e'; } /* 'î ž' */ +.icon-subprocess-collapsed:before { content: '\e81f'; } /* 'î Ÿ' */ +.icon-subprocess-expanded:before { content: '\e820'; } /* 'î  ' */ +.icon-task:before { content: '\e821'; } /* 'î ¡' */ +.icon-end-event-error:before { content: '\e822'; } /* 'î ¢' */ +.icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* 'î £' */ +.icon-intermediate-event-catch-timer:before { content: '\e824'; } /* 'î ¤' */ +.icon-start-event-escalation:before { content: '\e825'; } /* 'î ¥' */ +.icon-start-event-signal:before { content: '\e826'; } /* 'î ¦' */ +.icon-business-rule-task:before { content: '\e827'; } /* 'î §' */ +.icon-script:before { content: '\e828'; } /* 'î ¨' */ +.icon-send:before { content: '\e829'; } /* 'î ©' */ +.icon-call-activity:before { content: '\e82a'; } /* 'î ª' */ +.icon-start-event-timer:before { content: '\e82b'; } /* 'î «' */ +.icon-start-event-message:before { content: '\e82c'; } /* 'î ¬' */ +.icon-intermediate-event-none:before { content: '\e82d'; } /* 'î ­' */ +.icon-intermediate-event-catch-link:before { content: '\e82e'; } /* 'î ®' */ +.icon-end-event-escalation:before { content: '\e82f'; } /* 'î ¯' */ +.icon-text-annotation:before { content: '\e830'; } /* 'î °' */ +.icon-bpmn-io:before { content: '\e831'; } /* 'î ±' */ +.icon-gateway-complex:before { content: '\e832'; } /* 'î ²' */ +.icon-gateway-eventbased:before { content: '\e833'; } /* 'î ³' */ +.icon-gateway-none:before { content: '\e834'; } /* 'î ´' */ +.icon-gateway-or:before { content: '\e835'; } /* 'î µ' */ +.icon-end-event-terminate:before { content: '\e836'; } /* 'î ¶' */ +.icon-end-event-signal:before { content: '\e837'; } /* 'î ·' */ +.icon-end-event-none:before { content: '\e838'; } /* 'î ¸' */ +.icon-end-event-multiple:before { content: '\e839'; } /* 'î ¹' */ +.icon-end-event-message:before { content: '\e83a'; } /* 'î º' */ +.icon-end-event-link:before { content: '\e83b'; } /* 'î »' */ +.icon-intermediate-event-catch-message:before { content: '\e83c'; } /* 'î ¼' */ +.icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* 'î ½' */ +.icon-start-event-multiple:before { content: '\e83e'; } /* 'î ¾' */ +.icon-data-input:before { content: '\e83f'; } /* 'î ¿' */ +.icon-manual-task:before { content: '\e840'; } /* 'î¡€' */ +.icon-service:before { content: '\e841'; } /* 'î¡' */ +.icon-user:before { content: '\e842'; } /* 'î¡‚' */ +.icon-receive-task:before { content: '\e843'; } /* '' */ +.icon-data-object:before { content: '\e844'; } /* 'î¡„' */ +.icon-start-event-none:before { content: '\e845'; } /* 'î¡…' */ +.icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ +.icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ +.icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ +.icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ +.icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* 'î¡Š' */ +.icon-data-output:before { content: '\e84b'; } /* 'î¡‹' */ +.icon-script-task:before { content: '\e84c'; } /* 'î¡Œ' */ +.icon-send-task:before { content: '\e84d'; } /* 'î¡' */ +.icon-data-store:before { content: '\e84e'; } /* 'î¡Ž' */ +.icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* 'î¡' */ +.icon-intermediate-event-throw-message:before { content: '\e850'; } /* 'î¡' */ +.icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* 'î¡‘' */ +.icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* 'î¡’' */ +.icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* 'î¡“' */ +.icon-start-event-non-interrupting-message:before { content: '\e854'; } /* 'î¡”' */ +.icon-ad-hoc-marker:before { content: '\e855'; } /* 'î¡•' */ +.icon-service-task:before { content: '\e856'; } /* 'î¡–' */ +.icon-task-none:before { content: '\e857'; } /* 'î¡—' */ +.icon-compensation-marker:before { content: '\e858'; } /* '' */ +.icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* 'î¡™' */ +.icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* 'î¡š' */ +.icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* 'î¡›' */ +.icon-participant:before { content: '\e85c'; } /* 'î¡œ' */ +.icon-space-tool:before { content: '\e85f'; } /* 'î¡Ÿ' */ +.icon-connection-multi:before { content: '\e860'; } /* 'î¡ ' */ +.icon-lasso-tool:before { content: '\e862'; } /* 'î¡¢' */ \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot new file mode 100644 index 0000000..4339c7f Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg new file mode 100644 index 0000000..367205c --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg @@ -0,0 +1,107 @@ + + + +camunda Services GmbH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf new file mode 100644 index 0000000..f940656 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff new file mode 100644 index 0000000..e438756 Binary files /dev/null and b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff differ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css new file mode 100644 index 0000000..e251216 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/assets/diagram-js.css @@ -0,0 +1,457 @@ +/** + * outline styles + */ + +.djs-outline { + fill: none; + visibility: hidden; +} + +.djs-element.hover .djs-outline, +.djs-element.selected .djs-outline { + visibility: visible; + shape-rendering: crispEdges; + stroke-dasharray: 3,3; +} + +.djs-element.selected .djs-outline { + stroke: #8888FF; + stroke-width: 1px; +} + +.djs-element.hover .djs-outline { + stroke: #FF8888; + stroke-width: 1px; +} + +.djs-shape.connect-ok .djs-visual > :nth-child(1) { + fill: #54FF00 /* light-green */ !important; + fill-opacity: 0.2; +} + +.djs-shape.connect-not-ok .djs-visual > :nth-child(1), +.djs-shape.drop-not-ok .djs-visual > :nth-child(1) { + fill: #E56283 /* light-red */ !important; + fill-opacity: 0.2; +} + +svg.drop-not-ok { + background: rgba(229, 98, 131, 0.2) /* light-red */ !important; +} + +.djs-connection.connect-ok .djs-visual > :nth-child(1), +.djs-connection.drop-ok .djs-visual > :nth-child(1) { + stroke: #90DD5F /* light-green */ !important; +} + +.djs-connection.connect-not-ok .djs-visual > :nth-child(1), +.djs-connection.drop-not-ok .djs-visual > :nth-child(1) { + stroke: #E56283 /* light-red */ !important; +} + +.drop-not-ok, +.connect-not-ok { + cursor: not-allowed; +} + + +/** +* Selection box style +* +*/ +.djs-lasso-overlay { + fill: rgb(255, 116, 0); + fill-opacity: 0.1; + + stroke-dasharray: 5 1 3 1; + stroke: rgb(255, 116, 0); + + shape-rendering: crispEdges; + pointer-events: none; +} + +/** + * Resize styles + */ +.djs-resize-overlay { + fill: white; + fill-opacity: 0.8; + + stroke-dasharray: 5 1 3 1; + stroke: rgb(255, 116, 0); + + pointer-events: none; +} + +.djs-resizer-hit { + fill: none; + pointer-events: all; +} + +.djs-resizer-visual { + fill: white; + stroke-width: 1px; + stroke: black; + shape-rendering: crispEdges; + stroke-opacity: 0.2; +} + +.djs-cursor-resize-nwse, +.djs-resizer-nw, +.djs-resizer-se { + cursor: nwse-resize; +} + +.djs-cursor-resize-nesw, +.djs-resizer-ne, +.djs-resizer-sw { + cursor: nesw-resize; +} + +.djs-shape.djs-resizing > .djs-outline { + visibility: hidden !important; +} + +.djs-shape.djs-resizing > .djs-resizer { + visibility: hidden; +} + +.djs-dragger > .djs-resizer { + visibility: hidden; +} + +/** + * drag styles + */ +.djs-dragger { + fill: white; + fill-opacity: 0.6; + stroke: #333; +} + +.djs-dragger .djs-visual > :first-child { + stroke: rgb(255, 116, 0) !important; +} + +.djs-dragging { + opacity: 0.3; +} + +.djs-dragging, +.djs-dragging > * { + pointer-events: none !important; +} + +.djs-dragging .djs-context-pad, +.djs-dragging .djs-outline { + display: none !important; +} + +/** + * no pointer events for visual + */ +.djs-visual, +.djs-outline { + pointer-events: none; +} + +/** + * all pointer events for hit shape + */ +.djs-shape .djs-hit { + pointer-events: all; +} + +.djs-connection .djs-hit { + pointer-events: stroke; +} + +/** + * shape / connection basic styles + */ +.djs-connection .djs-visual { + stroke-width: 2px; + fill: none; +} + +.djs-cursor-grabbing { + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +.djs-cursor-crosshair { + cursor: crosshair; +} + +.djs-cursor-move { + cursor: move; +} + +.djs-cursor-resize-ns { + cursor: ns-resize; +} + +.djs-cursor-resize-ew { + cursor: ew-resize; +} + + +/** + * snapping + */ +.djs-snap-line { + stroke: rgb(255, 195, 66); + stroke: rgba(255, 195, 66, 0.50); + stroke-linecap: round; + stroke-width: 2px; + pointer-events: none; +} + +/** + * snapping + */ +.djs-crosshair { + stroke: #555; + stroke-linecap: round; + stroke-width: 1px; + pointer-events: none; + shape-rendering: crispEdges; + stroke-dasharray: 5, 5; +} + +/** + * palette + */ + +.djs-palette { + position: absolute; + left: 20px; + top: 20px; +} + +.djs-palette:not(.open) { + overflow: hidden; +} + +.djs-palette .entry, +.djs-palette .djs-palette-toggle { + width: 46px; + height: 46px; + line-height: 46px; +} + +.djs-palette .separator { + margin: 3px 5px 5px 5px; + border: solid 1px #DDD; + border-radius: 1px; +}; + +.djs-palette .entry:before { + vertical-align: middle; +} + +.djs-palette .djs-palette-toggle { + cursor: pointer; +} + +.djs-palette .entry, +.djs-palette .djs-palette-toggle { + color: #333; + font-size: 30px; + + text-align: center; +} + +.djs-palette.open .djs-palette-toggle { + height: 10px; +} + +.djs-palette:not(.open) .djs-palette-entries { + display: none; +} + +.djs-palette .djs-palette-toggle:hover { + background: #666; +} + +.djs-palette .entry:hover { + color: rgb(255, 116, 0); +} + +/** + * context-pad + */ +.djs-overlay-context-pad { + width: 72px; +} + +.djs-context-pad { + position: absolute; + display: none; + pointer-events: none; +} + +.djs-context-pad .entry { + width: 22px; + height: 22px; + text-align: center; + display: inline-block; + font-size: 22px; + margin: 0 2px 2px 0; + + border-radius: 3px; + + cursor: default; + + background-color: rgba(255,255,255, 0.85); + box-shadow: 0 0 2px 1px rgba(255,255,255, 0.85); + + pointer-events: all; +} + +.djs-context-pad .entry:before { + vertical-align: top; +} + +.djs-context-pad .entry:hover { + background: rgb(255, 252, 176); +} + +.djs-context-pad.open { + display: block; +} + +.djs-popup-entry { + font-size: 20px; + line-height: 20px; + padding: 2px 10px 2px 5px; + background-color: rgba(255,255,255, 0.85); + white-space: nowrap; +} + +.djs-popup-entry:hover { + background: rgb(255, 252, 176); +} + +.djs-popup-entry > span { + font-size: 14px; + margin-left: 5px; + + vertical-align: middle; +} + +.djs-popup-entry:before { + vertical-align: middle; +} + +/** + * popup / palette styles + */ +.djs-popup, .djs-palette { + background: #FAFAFA; + border: solid 1px #CCC; + border-radius: 2px; + box-shadow: 0 1px 4px rgba(0,0,0,0.3); +} + +/** + * touch + */ + +.djs-shape, +.djs-connection { + touch-action: none; +} + +.djs-bendpoint { + display: none; +} + +/** + * bendpoints + */ +.djs-bendpoint .djs-visual { + pointer-events: none; + fill: rgba(255, 255, 121, 0.8); + stroke-width: 1px; + stroke-opacity: 0.5; + stroke: black; +} + +.djs-bendpoint:hover, +.djs-bendpoints.hover .djs-bendpoint, +.djs-bendpoints.selected .djs-bendpoint { + display: block; +} + +.djs-bendpoints:not(.hover) .floating { + display: none; +} + +.djs-bendpoint:hover .djs-visual, +.djs-bendpoint.floating .djs-visual { + fill: yellow; +} + +.djs-bendpoint.floating .djs-hit { + pointer-events: none; +} + +.djs-bendpoint .djs-hit { + pointer-events: all; + fill: none; +} + +.djs-updating, +.djs-updating > * { + pointer-events: none !important; +} + +.djs-updating .djs-context-pad, +.djs-updating .djs-outline, +.djs-updating .djs-bendpoint, +.connect-ok .djs-bendpoint, +.connect-not-ok .djs-bendpoint, +.drop-ok .djs-bendpoint, +.drop-not-ok .djs-bendpoint { + display: none !important; +} + +.djs-bendpoint.djs-dragging { + display: block; + opacity: 1.0; +} + +.djs-bendpoint.djs-dragging .djs-visual { + fill: yellow; +} + + +/** + * tooltips + */ +.djs-tooltip-error { + font-size: 11px; + line-height: 18px; + text-align: left; + + padding: 5px; + + opacity: 0.7; +} + +.djs-tooltip-error > * { + width: 160px; + + background: rgb(252, 236, 240); + color: rgb(158, 76, 76); + padding: 3px 7px; + box-shadow: 0 1px 3px rgba(0,0,0, 0.2); + border-radius: 5px; + border-left: solid 5px rgb(174, 73, 73); +} + +.djs-tooltip-error:hover { + opacity: 1; +} \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js new file mode 100644 index 0000000..85e7f04 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/bower_components/bpmn-js/dist/bpmn-modeler.js @@ -0,0 +1,43358 @@ +/*! + * bpmn-js - bpmn-modeler v0.10.3 + + * Copyright 2014, 2015 camunda Services GmbH and other contributors + * + * Released under the bpmn.io license + * http://bpmn.io/license + * + * Source Code: https://github.com/bpmn-io/bpmn-js + * + * Date: 2015-05-18 + */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.BpmnJS=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + +/** + * A modeler for BPMN 2.0 diagrams. + * + * + * ## Extending the Modeler + * + * In order to extend the viewer pass extension modules to bootstrap via the + * `additionalModules` option. An extension module is an object that exposes + * named services. + * + * The following example depicts the integration of a simple + * logging component that integrates with interaction events: + * + * + * ```javascript + * + * // logging component + * function InteractionLogger(eventBus) { + * eventBus.on('element.hover', function(event) { + * console.log() + * }) + * } + * + * InteractionLogger.$inject = [ 'eventBus' ]; // minification save + * + * // extension module + * var extensionModule = { + * __init__: [ 'interactionLogger' ], + * interactionLogger: [ 'type', InteractionLogger ] + * }; + * + * // extend the viewer + * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] }); + * bpmnModeler.importXML(...); + * ``` + * + * + * ## Customizing / Replacing Components + * + * You can replace individual diagram components by redefining them in override modules. + * This works for all components, including those defined in the core. + * + * Pass in override modules via the `options.additionalModules` flag like this: + * + * ```javascript + * function CustomContextPadProvider(contextPad) { + * + * contextPad.registerProvider(this); + * + * this.getContextPadEntries = function(element) { + * // no entries, effectively disable the context pad + * return {}; + * }; + * } + * + * CustomContextPadProvider.$inject = [ 'contextPad' ]; + * + * var overrideModule = { + * contextPadProvider: [ 'type', CustomContextPadProvider ] + * }; + * + * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]}); + * ``` + * + * @param {Object} [options] configuration options to pass to the viewer + * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body. + * @param {String|Number} [options.width] the width of the viewer + * @param {String|Number} [options.height] the height of the viewer + * @param {Object} [options.moddleExtensions] extension packages to provide + * @param {Array} [options.modules] a list of modules to override the default modules + * @param {Array} [options.additionalModules] a list of modules to use with the default modules + */ +function Modeler(options) { + Viewer.call(this, options); +} + +inherits(Modeler, Viewer); + +Modeler.prototype.createDiagram = function(done) { + return this.importXML(initialDiagram, done); +}; + +Modeler.prototype.createModdle = function() { + var moddle = Viewer.prototype.createModdle.call(this); + + IdSupport.extend(moddle, new Ids([ 32, 36, 1 ])); + + return moddle; +}; + + +Modeler.prototype._interactionModules = [ + // non-modeling components + _dereq_(14), + _dereq_(173), + _dereq_(170), + _dereq_(171) +]; + +Modeler.prototype._modelingModules = [ + // modeling components + _dereq_(131), + _dereq_(91), + _dereq_(144), + _dereq_(158), + _dereq_(107), + _dereq_(10), + _dereq_(39), + _dereq_(30), + _dereq_(8), + _dereq_(34) +]; + + +// modules the modeler is composed of +// +// - viewer modules +// - interaction modules +// - modeling modules + +Modeler.prototype._modules = [].concat( + Modeler.prototype._modules, + Modeler.prototype._interactionModules, + Modeler.prototype._modelingModules); + + +module.exports = Modeler; + +},{"10":10,"107":107,"131":131,"14":14,"144":144,"158":158,"170":170,"171":171,"173":173,"193":193,"195":195,"2":2,"30":30,"34":34,"39":39,"50":50,"8":8,"91":91}],2:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + omit = _dereq_(329), + isString = _dereq_(322), + isNumber = _dereq_(319); + +var domify = _dereq_(343), + domQuery = _dereq_(346), + domRemove = _dereq_(347); + +var Diagram = _dereq_(73), + BpmnModdle = _dereq_(48); + +var Importer = _dereq_(42); + + +function initListeners(diagram, listeners) { + var events = diagram.get('eventBus'); + + listeners.forEach(function(l) { + events.on(l.event, l.handler); + }); +} + +function checkValidationError(err) { + + // check if we can help the user by indicating wrong BPMN 2.0 xml + // (in case he or the exporting tool did not get that right) + + var pattern = /unparsable content <([^>]+)> detected([\s\S]*)$/; + var match = pattern.exec(err.message); + + if (match) { + err.message = + 'unparsable content <' + match[1] + '> detected; ' + + 'this may indicate an invalid BPMN 2.0 diagram file' + match[2]; + } + + return err; +} + +var DEFAULT_OPTIONS = { + width: '100%', + height: '100%', + position: 'relative', + container: 'body' +}; + + +/** + * Ensure the passed argument is a proper unit (defaulting to px) + */ +function ensureUnit(val) { + return val + (isNumber(val) ? 'px' : ''); +} + +/** + * A viewer for BPMN 2.0 diagrams. + * + * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include + * additional features. + * + * + * ## Extending the Viewer + * + * In order to extend the viewer pass extension modules to bootstrap via the + * `additionalModules` option. An extension module is an object that exposes + * named services. + * + * The following example depicts the integration of a simple + * logging component that integrates with interaction events: + * + * + * ```javascript + * + * // logging component + * function InteractionLogger(eventBus) { + * eventBus.on('element.hover', function(event) { + * console.log() + * }) + * } + * + * InteractionLogger.$inject = [ 'eventBus' ]; // minification save + * + * // extension module + * var extensionModule = { + * __init__: [ 'interactionLogger' ], + * interactionLogger: [ 'type', InteractionLogger ] + * }; + * + * // extend the viewer + * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] }); + * bpmnViewer.importXML(...); + * ``` + * + * @param {Object} [options] configuration options to pass to the viewer + * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body. + * @param {String|Number} [options.width] the width of the viewer + * @param {String|Number} [options.height] the height of the viewer + * @param {Object} [options.moddleExtensions] extension packages to provide + * @param {Array} [options.modules] a list of modules to override the default modules + * @param {Array} [options.additionalModules] a list of modules to use with the default modules + */ +function Viewer(options) { + + this.options = options = assign({}, DEFAULT_OPTIONS, options || {}); + + var parent = options.container; + + // support jquery element + // unwrap it if passed + if (parent.get) { + parent = parent.get(0); + } + + // support selector + if (isString(parent)) { + parent = domQuery(parent); + } + + var container = this.container = domify('
    '); + parent.appendChild(container); + + assign(container.style, { + width: ensureUnit(options.width), + height: ensureUnit(options.height), + position: options.position + }); + + /** + * The code in the area + * must not be changed, see http://bpmn.io/license for more information + * + * + */ + + /* jshint -W101 */ + + // inlined ../resources/bpmnjs.png + var logoData = 'iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAMAAADypuvZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFiMte9PrwldFwfcZPqtqN0+zEyOe1XLgjvuKncsJAZ70y6fXh3vDT////UrQV////G2zN+AAAABB0Uk5T////////////////////AOAjXRkAAAHDSURBVHjavJZJkoUgDEBJmAX8979tM8u3E6x20VlYJfFFMoL4vBDxATxZcakIOJTWSmxvKWVIkJ8jHvlRv1F2LFrVISCZI+tCtQx+XfewgVTfyY3plPiQEAzI3zWy+kR6NBhFBYeBuscJLOUuA2WVLpCjVIaFzrNQZArxAZKUQm6gsj37L9Cb7dnIBUKxENaaMJQqMpDXvSL+ktxdGRm2IsKgJGGPg7atwUG5CcFUEuSv+CwQqizTrvDTNXdMU2bMiDWZd8d7QIySWVRsb2vBBioxOFt4OinPBapL+neAb5KL5IJ8szOza2/DYoipUCx+CjO0Bpsv0V6mktNZ+k8rlABlWG0FrOpKYVo8DT3dBeLEjUBAj7moDogVii7nSS9QzZnFcOVBp1g2PyBQ3Vr5aIapN91VJy33HTJLC1iX2FY6F8gRdaAeIEfVONgtFCzZTmoLEdOjBDfsIOA6128gw3eu1shAajdZNAORxuQDJN5A5PbEG6gNIu24QJD5iNyRMZIr6bsHbCtCU/OaOaSvgkUyDMdDa1BXGf5HJ1To+/Ym6mCKT02Y+/Sa126ZKyd3jxhzpc1r8zVL6YM1Qy/kR4ABAFJ6iQUnivhAAAAAAElFTkSuQmCC'; + + /* jshint +W101 */ + + var linkMarkup = + '' + + '' + + ''; + + container.appendChild(domify(linkMarkup)); + + /* */ +} + +Viewer.prototype.importXML = function(xml, done) { + + var self = this; + + this.moddle = this.createModdle(); + + this.moddle.fromXML(xml, 'bpmn:Definitions', function(err, definitions, context) { + + if (err) { + err = checkValidationError(err); + return done(err); + } + + var parseWarnings = context.warnings; + + self.importDefinitions(definitions, function(err, importWarnings) { + if (err) { + return done(err); + } + + done(null, parseWarnings.concat(importWarnings || [])); + }); + }); +}; + +Viewer.prototype.saveXML = function(options, done) { + + if (!done) { + done = options; + options = {}; + } + + var definitions = this.definitions; + + if (!definitions) { + return done(new Error('no definitions loaded')); + } + + this.moddle.toXML(definitions, options, done); +}; + +Viewer.prototype.createModdle = function() { + return new BpmnModdle(this.options.moddleExtensions); +}; + +Viewer.prototype.saveSVG = function(options, done) { + + if (!done) { + done = options; + options = {}; + } + + var canvas = this.get('canvas'); + + var contentNode = canvas.getDefaultLayer(), + defsNode = canvas._svg.select('defs'); + + var contents = contentNode.innerSVG(), + defs = (defsNode && defsNode.outerSVG()) || ''; + + var bbox = contentNode.getBBox(); + + var svg = + '\n' + + '\n' + + '\n' + + '' + + defs + contents + + ''; + + done(null, svg); +}; + +Viewer.prototype.get = function(name) { + + if (!this.diagram) { + throw new Error('no diagram loaded'); + } + + return this.diagram.get(name); +}; + +Viewer.prototype.invoke = function(fn) { + + if (!this.diagram) { + throw new Error('no diagram loaded'); + } + + return this.diagram.invoke(fn); +}; + +Viewer.prototype.importDefinitions = function(definitions, done) { + + // use try/catch to not swallow synchronous exceptions + // that may be raised during model parsing + try { + if (this.diagram) { + this.clear(); + } + + this.definitions = definitions; + + var diagram = this.diagram = this._createDiagram(this.options); + + this._init(diagram); + + Importer.importBpmnDiagram(diagram, definitions, done); + } catch (e) { + done(e); + } +}; + +Viewer.prototype._init = function(diagram) { + initListeners(diagram, this.__listeners || []); +}; + +Viewer.prototype._createDiagram = function(options) { + + var modules = [].concat(options.modules || this.getModules(), options.additionalModules || []); + + // add self as an available service + modules.unshift({ + bpmnjs: [ 'value', this ], + moddle: [ 'value', this.moddle ] + }); + + options = omit(options, 'additionalModules'); + + options = assign(options, { + canvas: { container: this.container }, + modules: modules + }); + + return new Diagram(options); +}; + + +Viewer.prototype.getModules = function() { + return this._modules; +}; + +/** + * Remove all drawn elements from the viewer. + * + * After calling this method the viewer can still + * be reused for opening another diagram. + */ +Viewer.prototype.clear = function() { + var diagram = this.diagram; + + if (diagram) { + diagram.destroy(); + } +}; + +/** + * Destroy the viewer instance and remove all its remainders + * from the document tree. + */ +Viewer.prototype.destroy = function() { + // clear underlying diagram + this.clear(); + + // remove container + domRemove(this.container); +}; + +/** + * Register an event listener on the viewer + * + * @param {String} event + * @param {Function} handler + */ +Viewer.prototype.on = function(event, handler) { + var diagram = this.diagram, + listeners = this.__listeners = this.__listeners || []; + + listeners.push({ event: event, handler: handler }); + + if (diagram) { + diagram.get('eventBus').on(event, handler); + } +}; + +// modules the viewer is composed of +Viewer.prototype._modules = [ + _dereq_(3), + _dereq_(151), + _dereq_(135) +]; + +module.exports = Viewer; + +},{"135":135,"151":151,"3":3,"319":319,"322":322,"325":325,"329":329,"343":343,"346":346,"347":347,"42":42,"48":48,"73":73}],3:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(6), + _dereq_(44) + ] +}; +},{"44":44,"6":6}],4:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195), + isArray = _dereq_(316), + isObject = _dereq_(320), + assign = _dereq_(325), + forEach = _dereq_(204), + every = _dereq_(201), + includes = _dereq_(206), + some = _dereq_(210); + +var DefaultRenderer = _dereq_(84), + TextUtil = _dereq_(184), + DiUtil = _dereq_(45); + +var createLine = DefaultRenderer.createLine; + + +function BpmnRenderer(events, styles, pathMap) { + + DefaultRenderer.call(this, styles); + + var TASK_BORDER_RADIUS = 10; + var INNER_OUTER_DIST = 3; + + var LABEL_STYLE = { + fontFamily: 'Arial, sans-serif', + fontSize: '12px' + }; + + var textUtil = new TextUtil({ + style: LABEL_STYLE, + size: { width: 100 } + }); + + var markers = {}; + + function addMarker(id, element) { + markers[id] = element; + } + + function marker(id) { + return markers[id]; + } + + function initMarkers(svg) { + + function createMarker(id, options) { + var attrs = assign({ + fill: 'black', + strokeWidth: 1, + strokeLinecap: 'round', + strokeDasharray: 'none' + }, options.attrs); + + var ref = options.ref || { x: 0, y: 0 }; + + var scale = options.scale || 1; + + // fix for safari / chrome / firefox bug not correctly + // resetting stroke dash array + if (attrs.strokeDasharray === 'none') { + attrs.strokeDasharray = [10000, 1]; + } + + var marker = options.element + .attr(attrs) + .marker(0, 0, 20, 20, ref.x, ref.y) + .attr({ + markerWidth: 20 * scale, + markerHeight: 20 * scale + }); + + return addMarker(id, marker); + } + + + createMarker('sequenceflow-end', { + element: svg.path('M 1 5 L 11 10 L 1 15 Z'), + ref: { x: 11, y: 10 }, + scale: 0.5 + }); + + createMarker('messageflow-start', { + element: svg.circle(6, 6, 3.5), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: 6, y: 6 } + }); + + createMarker('messageflow-end', { + element: svg.path('m 1 5 l 0 -3 l 7 3 l -7 3 z'), + attrs: { + fill: 'white', + stroke: 'black', + strokeLinecap: 'butt' + }, + ref: { x: 8.5, y: 5 } + }); + + createMarker('data-association-end', { + element: svg.path('M 1 5 L 11 10 L 1 15'), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: 11, y: 10 }, + scale: 0.5 + }); + + createMarker('conditional-flow-marker', { + element: svg.path('M 0 10 L 8 6 L 16 10 L 8 14 Z'), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: -1, y: 10 }, + scale: 0.5 + }); + + createMarker('conditional-default-flow-marker', { + element: svg.path('M 1 4 L 5 16'), + attrs: { + stroke: 'black' + }, + ref: { x: -5, y: 10 }, + scale: 0.5 + }); + } + + function computeStyle(custom, traits, defaultStyles) { + if (!isArray(traits)) { + defaultStyles = traits; + traits = []; + } + + return styles.style(traits || [], assign(defaultStyles, custom || {})); + } + + function drawCircle(p, width, height, offset, attrs) { + + if (isObject(offset)) { + attrs = offset; + offset = 0; + } + + offset = offset || 0; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + var cx = width / 2, + cy = height / 2; + + return p.circle(cx, cy, Math.round((width + height) / 4 - offset)).attr(attrs); + } + + function drawRect(p, width, height, r, offset, attrs) { + + if (isObject(offset)) { + attrs = offset; + offset = 0; + } + + offset = offset || 0; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + return p.rect(offset, offset, width - offset * 2, height - offset * 2, r).attr(attrs); + } + + function drawDiamond(p, width, height, attrs) { + + var x_2 = width / 2; + var y_2 = height / 2; + + var points = [x_2, 0, width, y_2, x_2, height, 0, y_2 ]; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + return p.polygon(points).attr(attrs); + } + + function drawLine(p, waypoints, attrs) { + attrs = computeStyle(attrs, [ 'no-fill' ], { + stroke: 'black', + strokeWidth: 2, + fill: 'none' + }); + + return createLine(waypoints, attrs).appendTo(p); + } + + function drawPath(p, d, attrs) { + + attrs = computeStyle(attrs, [ 'no-fill' ], { + strokeWidth: 2, + stroke: 'black' + }); + + return p.path(d).attr(attrs); + } + + function as(type) { + return function(p, element) { + return handlers[type](p, element); + }; + } + + function renderer(type) { + return handlers[type]; + } + + function renderEventContent(element, p) { + + var event = getSemantic(element); + var isThrowing = isThrowEvent(event); + + if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) { + return renderer('bpmn:MessageEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) { + return renderer('bpmn:TimerEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) { + return renderer('bpmn:ConditionalEventDefinition')(p, element); + } + + if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) { + return renderer('bpmn:SignalEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition') && + isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: false })) { + return renderer('bpmn:MultipleEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition') && + isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: true })) { + return renderer('bpmn:ParallelMultipleEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) { + return renderer('bpmn:EscalationEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) { + return renderer('bpmn:LinkEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) { + return renderer('bpmn:ErrorEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) { + return renderer('bpmn:CancelEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) { + return renderer('bpmn:CompensateEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) { + return renderer('bpmn:TerminateEventDefinition')(p, element, isThrowing); + } + + return null; + } + + function renderLabel(p, label, options) { + return textUtil.createText(p, label || '', options).addClass('djs-label'); + } + + function renderEmbeddedLabel(p, element, align) { + var semantic = getSemantic(element); + return renderLabel(p, semantic.name, { box: element, align: align, padding: 5 }); + } + + function renderExternalLabel(p, element, align) { + var semantic = getSemantic(element); + + if (!semantic.name) { + element.hidden = true; + } + + return renderLabel(p, semantic.name, { box: element, align: align, style: { fontSize: '11px' } }); + } + + function renderLaneLabel(p, text, element) { + var textBox = renderLabel(p, text, { + box: { height: 30, width: element.height }, + align: 'center-middle' + }); + + var top = -1 * element.height; + textBox.transform( + 'rotate(270) ' + + 'translate(' + top + ',' + 0 + ')' + ); + } + + function createPathFromConnection(connection) { + var waypoints = connection.waypoints; + + var pathData = 'm ' + waypoints[0].x + ',' + waypoints[0].y; + for (var i = 1; i < waypoints.length; i++) { + pathData += 'L' + waypoints[i].x + ',' + waypoints[i].y + ' '; + } + return pathData; + } + + var handlers = { + 'bpmn:Event': function(p, element, attrs) { + return drawCircle(p, element.width, element.height, attrs); + }, + 'bpmn:StartEvent': function(p, element) { + var attrs = {}; + var semantic = getSemantic(element); + + if (!semantic.isInterrupting) { + attrs = { + strokeDasharray: '6', + strokeLinecap: 'round' + }; + } + + var circle = renderer('bpmn:Event')(p, element, attrs); + + renderEventContent(element, p); + + return circle; + }, + 'bpmn:MessageEventDefinition': function(p, element, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_MESSAGE', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.235, + my: 0.315 + } + }); + + var fill = isThrowing ? 'black' : 'white'; + var stroke = isThrowing ? 'white' : 'black'; + + var messagePath = drawPath(p, pathData, { + strokeWidth: 1, + fill: fill, + stroke: stroke + }); + + return messagePath; + }, + 'bpmn:TimerEventDefinition': function(p, element) { + + var circle = drawCircle(p, element.width, element.height, 0.2 * element.height, { + strokeWidth: 2 + }); + + var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', { + xScaleFactor: 0.75, + yScaleFactor: 0.75, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.5, + my: 0.5 + } + }); + + drawPath(p, pathData, { + strokeWidth: 2, + strokeLinecap: 'square' + }); + + for(var i = 0;i < 12;i++) { + + var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', { + xScaleFactor: 0.75, + yScaleFactor: 0.75, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.5, + my: 0.5 + } + }); + + var width = element.width / 2; + var height = element.height / 2; + + drawPath(p, linePathData, { + strokeWidth: 1, + strokeLinecap: 'square', + transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')' + }); + } + + return circle; + }, + 'bpmn:EscalationEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_ESCALATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.555 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ConditionalEventDefinition': function(p, event) { + var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.222 + } + }); + + return drawPath(p, pathData, { + strokeWidth: 1 + }); + }, + 'bpmn:LinkEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_LINK', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.57, + my: 0.263 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ErrorEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_ERROR', { + xScaleFactor: 1.1, + yScaleFactor: 1.1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.2, + my: 0.722 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:CancelEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', { + xScaleFactor: 1.0, + yScaleFactor: 1.0, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.638, + my: -0.055 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }).transform('rotate(45)'); + }, + 'bpmn:CompensateEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.201, + my: 0.472 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:SignalEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_SIGNAL', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.2 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:MultipleEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', { + xScaleFactor: 1.1, + yScaleFactor: 1.1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.222, + my: 0.36 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ParallelMultipleEventDefinition': function(p, event) { + var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', { + xScaleFactor: 1.2, + yScaleFactor: 1.2, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.458, + my: 0.194 + } + }); + + return drawPath(p, pathData, { + strokeWidth: 1 + }); + }, + 'bpmn:EndEvent': function(p, element) { + var circle = renderer('bpmn:Event')(p, element, { + strokeWidth: 4 + }); + + renderEventContent(element, p, true); + + return circle; + }, + 'bpmn:TerminateEventDefinition': function(p, element) { + var circle = drawCircle(p, element.width, element.height, 8, { + strokeWidth: 4, + fill: 'black' + }); + + return circle; + }, + 'bpmn:IntermediateEvent': function(p, element) { + var outer = renderer('bpmn:Event')(p, element, { strokeWidth: 1 }); + /* inner */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, { strokeWidth: 1, fill: 'none' }); + + renderEventContent(element, p); + + return outer; + }, + 'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'), + 'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'), + + 'bpmn:Activity': function(p, element, attrs) { + return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, attrs); + }, + + 'bpmn:Task': function(p, element, attrs) { + var rect = renderer('bpmn:Activity')(p, element, attrs); + renderEmbeddedLabel(p, element, 'center-middle'); + attachTaskMarkers(p, element); + return rect; + }, + 'bpmn:ServiceTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', { + abspos: { + x: 12, + y: 18 + } + }); + + /* service bg */ drawPath(p, pathDataBG, { + strokeWidth: 1, + fill: 'none' + }); + + var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', { + abspos: { + x: 17.2, + y: 18 + } + }); + + /* service fill */ drawPath(p, fillPathData, { + strokeWidth: 0, + stroke: 'none', + fill: 'white' + }); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', { + abspos: { + x: 17, + y: 22 + } + }); + + /* service */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'white' + }); + + return task; + }, + 'bpmn:UserTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var x = 15; + var y = 12; + + var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', { + abspos: { + x: x, + y: y + } + }); + + /* user path */ drawPath(p, pathData, { + strokeWidth: 0.5, + fill: 'none' + }); + + var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', { + abspos: { + x: x, + y: y + } + }); + + /* user2 path */ drawPath(p, pathData2, { + strokeWidth: 0.5, + fill: 'none' + }); + + var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', { + abspos: { + x: x, + y: y + } + }); + + /* user3 path */ drawPath(p, pathData3, { + strokeWidth: 0.5, + fill: 'black' + }); + + return task; + }, + 'bpmn:ManualTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', { + abspos: { + x: 17, + y: 15 + } + }); + + /* manual path */ drawPath(p, pathData, { + strokeWidth: 0.25, + fill: 'white', + stroke: 'black' + }); + + return task; + }, + 'bpmn:SendTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: 21, + containerHeight: 14, + position: { + mx: 0.285, + my: 0.357 + } + }); + + /* send path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black', + stroke: 'white' + }); + + return task; + }, + 'bpmn:ReceiveTask' : function(p, element) { + var semantic = getSemantic(element); + + var task = renderer('bpmn:Task')(p, element); + var pathData; + + if (semantic.instantiate) { + drawCircle(p, 28, 28, 20 * 0.22, { strokeWidth: 1 }); + + pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', { + abspos: { + x: 7.77, + y: 9.52 + } + }); + } else { + + pathData = pathMap.getScaledPath('TASK_TYPE_SEND', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: 21, + containerHeight: 14, + position: { + mx: 0.3, + my: 0.4 + } + }); + } + + /* receive path */ drawPath(p, pathData, { + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:ScriptTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', { + abspos: { + x: 15, + y: 20 + } + }); + + /* script path */ drawPath(p, pathData, { + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:BusinessRuleTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', { + abspos: { + x: 8, + y: 8 + } + }); + + var businessHeaderPath = drawPath(p, headerPathData); + businessHeaderPath.attr({ + strokeWidth: 1, + fill: 'AAA' + }); + + var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', { + abspos: { + x: 8, + y: 8 + } + }); + + var businessPath = drawPath(p, headerData); + businessPath.attr({ + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:SubProcess': function(p, element, attrs) { + var rect = renderer('bpmn:Activity')(p, element, attrs); + + var semantic = getSemantic(element); + + var expanded = DiUtil.isExpanded(semantic); + + var isEventSubProcess = !!semantic.triggeredByEvent; + if (isEventSubProcess) { + rect.attr({ + strokeDasharray: '1,2' + }); + } + + renderEmbeddedLabel(p, element, expanded ? 'center-top' : 'center-middle'); + + if (expanded) { + attachTaskMarkers(p, element); + } else { + attachTaskMarkers(p, element, ['SubProcessMarker']); + } + + return rect; + }, + 'bpmn:AdHocSubProcess': function(p, element) { + return renderer('bpmn:SubProcess')(p, element); + }, + 'bpmn:Transaction': function(p, element) { + var outer = renderer('bpmn:SubProcess')(p, element); + + var innerAttrs = styles.style([ 'no-fill', 'no-events' ]); + + /* inner path */ drawRect(p, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, innerAttrs); + + return outer; + }, + 'bpmn:CallActivity': function(p, element) { + return renderer('bpmn:Task')(p, element, { + strokeWidth: 5 + }); + }, + 'bpmn:Participant': function(p, element) { + + var lane = renderer('bpmn:Lane')(p, element, { + fill: 'White' + }); + + var expandedPool = DiUtil.isExpanded(element); + + if (expandedPool) { + drawLine(p, [ + { x: 30, y: 0 }, + { x: 30, y: element.height } + ]); + var text = getSemantic(element).name; + renderLaneLabel(p, text, element); + } else { + // Collapsed pool draw text inline + var text2 = getSemantic(element).name; + renderLabel(p, text2, { box: element, align: 'center-middle' }); + } + + var participantMultiplicity = !!(getSemantic(element).participantMultiplicity); + + if(participantMultiplicity) { + renderer('ParticipantMultiplicityMarker')(p, element); + } + + return lane; + }, + 'bpmn:Lane': function(p, element, attrs) { + var rect = drawRect(p, element.width, element.height, 0, attrs || { + fill: 'none' + }); + + var semantic = getSemantic(element); + + if (semantic.$type === 'bpmn:Lane') { + var text = semantic.name; + renderLaneLabel(p, text, element); + } + + return rect; + }, + 'bpmn:InclusiveGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + /* circle path */ + drawCircle(p, element.width, element.height, element.height * 0.24, { + strokeWidth: 2.5, + fill: 'none' + }); + + return diamond; + }, + 'bpmn:ExclusiveGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', { + xScaleFactor: 0.4, + yScaleFactor: 0.4, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.32, + my: 0.3 + } + }); + + if (!!(getDi(element).isMarkerVisible)) { + drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + } + + return diamond; + }, + 'bpmn:ComplexGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', { + xScaleFactor: 0.5, + yScaleFactor:0.5, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.46, + my: 0.26 + } + }); + + /* complex path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + + return diamond; + }, + 'bpmn:ParallelGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', { + xScaleFactor: 0.6, + yScaleFactor:0.6, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.46, + my: 0.2 + } + }); + + /* parallel path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + + return diamond; + }, + 'bpmn:EventBasedGateway': function(p, element) { + + var semantic = getSemantic(element); + + var diamond = drawDiamond(p, element.width, element.height); + + /* outer circle path */ drawCircle(p, element.width, element.height, element.height * 0.20, { + strokeWidth: 1, + fill: 'none' + }); + + var type = semantic.eventGatewayType; + var instantiate = !!semantic.instantiate; + + function drawEvent() { + + var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', { + xScaleFactor: 0.18, + yScaleFactor: 0.18, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.36, + my: 0.44 + } + }); + + /* event path */ drawPath(p, pathData, { + strokeWidth: 2, + fill: 'none' + }); + } + + if (type === 'Parallel') { + + var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', { + xScaleFactor: 0.4, + yScaleFactor:0.4, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.474, + my: 0.296 + } + }); + + var parallelPath = drawPath(p, pathData); + parallelPath.attr({ + strokeWidth: 1, + fill: 'none' + }); + } else if (type === 'Exclusive') { + + if (!instantiate) { + var innerCircle = drawCircle(p, element.width, element.height, element.height * 0.26); + innerCircle.attr({ + strokeWidth: 1, + fill: 'none' + }); + } + + drawEvent(); + } + + + return diamond; + }, + 'bpmn:Gateway': function(p, element) { + return drawDiamond(p, element.width, element.height); + }, + 'bpmn:SequenceFlow': function(p, element) { + var pathData = createPathFromConnection(element); + var path = drawPath(p, pathData, { + strokeLinejoin: 'round', + markerEnd: marker('sequenceflow-end') + }); + + var sequenceFlow = getSemantic(element); + var source = element.source.businessObject; + + // conditional flow marker + if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Task')) { + path.attr({ + markerStart: marker('conditional-flow-marker') + }); + } + + // default marker + if (source.default && source.$instanceOf('bpmn:Gateway') && source.default === sequenceFlow) { + path.attr({ + markerStart: marker('conditional-default-flow-marker') + }); + } + + return path; + }, + 'bpmn:Association': function(p, element, attrs) { + + attrs = assign({ + strokeDasharray: '1,6', + strokeLinecap: 'round', + strokeLinejoin: 'round' + }, attrs || {}); + + // TODO(nre): style according to directed state + return drawLine(p, element.waypoints, attrs); + }, + 'bpmn:DataInputAssociation': function(p, element) { + return renderer('bpmn:Association')(p, element, { + markerEnd: marker('data-association-end') + }); + }, + 'bpmn:DataOutputAssociation': function(p, element) { + return renderer('bpmn:Association')(p, element, { + markerEnd: marker('data-association-end') + }); + }, + 'bpmn:MessageFlow': function(p, element) { + + var semantic = getSemantic(element), + di = getDi(element); + + var pathData = createPathFromConnection(element); + var path = drawPath(p, pathData, { + markerEnd: marker('messageflow-end'), + markerStart: marker('messageflow-start'), + strokeDasharray: '10, 12', + strokeLinecap: 'round', + strokeLinejoin: 'round', + strokeWidth: '1.5px' + }); + + if (semantic.messageRef) { + var midPoint = path.getPointAtLength(path.getTotalLength() / 2); + + var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', { + abspos: { + x: midPoint.x, + y: midPoint.y + } + }); + + var messageAttrs = { strokeWidth: 1 }; + + if (di.messageVisibleKind === 'initiating') { + messageAttrs.fill = 'white'; + messageAttrs.stroke = 'black'; + } else { + messageAttrs.fill = '#888'; + messageAttrs.stroke = 'white'; + } + + drawPath(p, markerPathData, messageAttrs); + } + + return path; + }, + 'bpmn:DataObject': function(p, element) { + var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.474, + my: 0.296 + } + }); + + var elementObject = drawPath(p, pathData, { fill: 'white' }); + + var semantic = getSemantic(element); + + if (isCollection(semantic)) { + renderDataItemCollection(p, element); + } + + return elementObject; + }, + 'bpmn:DataObjectReference': as('bpmn:DataObject'), + 'bpmn:DataInput': function(p, element) { + + var arrowPathData = pathMap.getRawPath('DATA_ARROW'); + + // page + var elementObject = renderer('bpmn:DataObject')(p, element); + + /* input arrow path */ drawPath(p, arrowPathData, { strokeWidth: 1 }); + + return elementObject; + }, + 'bpmn:DataOutput': function(p, element) { + var arrowPathData = pathMap.getRawPath('DATA_ARROW'); + + // page + var elementObject = renderer('bpmn:DataObject')(p, element); + + /* output arrow path */ drawPath(p, arrowPathData, { + strokeWidth: 1, + fill: 'black' + }); + + return elementObject; + }, + 'bpmn:DataStoreReference': function(p, element) { + var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0, + my: 0.133 + } + }); + + var elementStore = drawPath(p, DATA_STORE_PATH, { + strokeWidth: 2, + fill: 'white' + }); + + return elementStore; + }, + 'bpmn:BoundaryEvent': function(p, element) { + + var semantic = getSemantic(element), + cancel = semantic.cancelActivity; + + var attrs = { + strokeLinecap: 'round', + strokeWidth: 1 + }; + + if (!cancel) { + attrs.strokeDasharray = '6'; + } + + var outer = renderer('bpmn:Event')(p, element, attrs); + /* inner path */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, attrs); + + renderEventContent(element, p); + + return outer; + }, + 'bpmn:Group': function(p, element) { + return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, { + strokeWidth: 1, + strokeDasharray: '8,3,1,3', + fill: 'none', + pointerEvents: 'none' + }); + }, + 'label': function(p, element) { + return renderExternalLabel(p, element, ''); + }, + 'bpmn:TextAnnotation': function(p, element) { + var style = { + 'fill': 'none', + 'stroke': 'none' + }; + var textElement = drawRect(p, element.width, element.height, 0, 0, style); + var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.0, + my: 0.0 + } + }); + drawPath(p, textPathData); + + var text = getSemantic(element).text || ''; + renderLabel(p, text, { box: element, align: 'left-middle', padding: 5 }); + + return textElement; + }, + 'ParticipantMultiplicityMarker': function(p, element) { + var subProcessPath = pathMap.getScaledPath('MARKER_PARALLEL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2) / element.width), + my: (element.height - 15) / element.height + } + }); + + drawPath(p, subProcessPath); + }, + 'SubProcessMarker': function(p, element) { + var markerRect = drawRect(p, 14, 14, 0, { + strokeWidth: 1 + }); + + // Process marker is placed in the middle of the box + // therefore fixed values can be used here + markerRect.transform('translate(' + (element.width / 2 - 7.5) + ',' + (element.height - 20) + ')'); + + var subProcessPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', { + xScaleFactor: 1.5, + yScaleFactor: 1.5, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: (element.width / 2 - 7.5) / element.width, + my: (element.height - 20) / element.height + } + }); + + drawPath(p, subProcessPath); + }, + 'ParallelMarker': function(p, element, position) { + var subProcessPath = pathMap.getScaledPath('MARKER_PARALLEL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.parallel) / element.width), + my: (element.height - 20) / element.height + } + }); + drawPath(p, subProcessPath); + }, + 'SequentialMarker': function(p, element, position) { + var sequentialPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.seq) / element.width), + my: (element.height - 19) / element.height + } + }); + drawPath(p, sequentialPath); + }, + 'CompensationMarker': function(p, element, position) { + var compensationPath = pathMap.getScaledPath('MARKER_COMPENSATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.compensation) / element.width), + my: (element.height - 13) / element.height + } + }); + drawPath(p, compensationPath, { strokeWidth: 1 }); + }, + 'LoopMarker': function(p, element, position) { + var loopPath = pathMap.getScaledPath('MARKER_LOOP', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.loop) / element.width), + my: (element.height - 7) / element.height + } + }); + + drawPath(p, loopPath, { + strokeWidth: 1, + fill: 'none', + strokeLinecap: 'round', + strokeMiterlimit: 0.5 + }); + }, + 'AdhocMarker': function(p, element, position) { + var loopPath = pathMap.getScaledPath('MARKER_ADHOC', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.adhoc) / element.width), + my: (element.height - 15) / element.height + } + }); + + drawPath(p, loopPath, { + strokeWidth: 1, + fill: 'black' + }); + } + }; + + function attachTaskMarkers(p, element, taskMarkers) { + var obj = getSemantic(element); + + var subprocess = includes(taskMarkers, 'SubProcessMarker'); + var position; + + if (subprocess) { + position = { + seq: -21, + parallel: -22, + compensation: -42, + loop: -18, + adhoc: 10 + }; + } else { + position = { + seq: -3, + parallel: -6, + compensation: -27, + loop: 0, + adhoc: 10 + }; + } + + forEach(taskMarkers, function(marker) { + renderer(marker)(p, element, position); + }); + + if (obj.$type === 'bpmn:AdHocSubProcess') { + renderer('AdhocMarker')(p, element, position); + } + if (obj.loopCharacteristics && obj.loopCharacteristics.isSequential === undefined) { + renderer('LoopMarker')(p, element, position); + return; + } + if (obj.loopCharacteristics && + obj.loopCharacteristics.isSequential !== undefined && + !obj.loopCharacteristics.isSequential) { + renderer('ParallelMarker')(p, element, position); + } + if (obj.loopCharacteristics && !!obj.loopCharacteristics.isSequential) { + renderer('SequentialMarker')(p, element, position); + } + if (!!obj.isForCompensation) { + renderer('CompensationMarker')(p, element, position); + } + } + + function drawShape(parent, element) { + var type = element.type; + var h = handlers[type]; + + /* jshint -W040 */ + if (!h) { + return DefaultRenderer.prototype.drawShape.apply(this, [ parent, element ]); + } else { + return h(parent, element); + } + } + + function drawConnection(parent, element) { + var type = element.type; + var h = handlers[type]; + + /* jshint -W040 */ + if (!h) { + return DefaultRenderer.prototype.drawConnection.apply(this, [ parent, element ]); + } else { + return h(parent, element); + } + } + + function renderDataItemCollection(p, element) { + + var yPosition = (element.height - 16) / element.height; + + var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.451, + my: yPosition + } + }); + + /* collection path */ drawPath(p, pathData, { + strokeWidth: 2 + }); + } + + function isCollection(element, filter) { + return element.isCollection || + (element.elementObjectRef && element.elementObjectRef.isCollection); + } + + function getDi(element) { + return element.businessObject.di; + } + + function getSemantic(element) { + return element.businessObject; + } + + /** + * Checks if eventDefinition of the given element matches with semantic type. + * + * @return {boolean} true if element is of the given semantic type + */ + function isTypedEvent(event, eventDefinitionType, filter) { + + function matches(definition, filter) { + return every(filter, function(val, key) { + + // we want a == conversion here, to be able to catch + // undefined == false and friends + /* jshint -W116 */ + return definition[key] == val; + }); + } + + return some(event.eventDefinitions, function(definition) { + return definition.$type === eventDefinitionType && matches(event, filter); + }); + } + + function isThrowEvent(event) { + return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent'); + } + + + /////// cropping path customizations ///////////////////////// + + function componentsToPath(elements) { + return elements.join(',').replace(/,?([A-z]),?/g, '$1'); + } + + function getCirclePath(shape) { + + var cx = shape.x + shape.width / 2, + cy = shape.y + shape.height / 2, + radius = shape.width / 2; + + var circlePath = [ + ['M', cx, cy], + ['m', 0, -radius], + ['a', radius, radius, 0, 1, 1, 0, 2 * radius], + ['a', radius, radius, 0, 1, 1, 0, -2 * radius], + ['z'] + ]; + + return componentsToPath(circlePath); + } + + function getRoundRectPath(shape) { + + var radius = TASK_BORDER_RADIUS, + x = shape.x, + y = shape.y, + width = shape.width, + height = shape.height; + + var roundRectPath = [ + ['M', x + radius, y], + ['l', width - radius * 2, 0], + ['a', radius, radius, 0, 0, 1, radius, radius], + ['l', 0, height - radius * 2], + ['a', radius, radius, 0, 0, 1, -radius, radius], + ['l', radius * 2 - width, 0], + ['a', radius, radius, 0, 0, 1, -radius, -radius], + ['l', 0, radius * 2 - height], + ['a', radius, radius, 0, 0, 1, radius, -radius], + ['z'] + ]; + + return componentsToPath(roundRectPath); + } + + function getDiamondPath(shape) { + + var width = shape.width, + height = shape.height, + x = shape.x, + y = shape.y, + halfWidth = width / 2, + halfHeight = height / 2; + + var diamondPath = [ + ['M', x + halfWidth, y], + ['l', halfWidth, halfHeight], + ['l', -halfWidth, halfHeight], + ['l', -halfWidth, -halfHeight], + ['z'] + ]; + + return componentsToPath(diamondPath); + } + + function getRectPath(shape) { + var x = shape.x, + y = shape.y, + width = shape.width, + height = shape.height; + + var rectPath = [ + ['M', x, y], + ['l', width, 0], + ['l', 0, height], + ['l', -width, 0], + ['z'] + ]; + + return componentsToPath(rectPath); + } + + function getShapePath(element) { + var obj = getSemantic(element); + + if (obj.$instanceOf('bpmn:Event')) { + return getCirclePath(element); + } + + if (obj.$instanceOf('bpmn:Activity')) { + return getRoundRectPath(element); + } + + if (obj.$instanceOf('bpmn:Gateway')) { + return getDiamondPath(element); + } + + return getRectPath(element); + } + + + // hook onto canvas init event to initialize + // connection start/end markers on svg + events.on('canvas.init', function(event) { + initMarkers(event.svg); + }); + + this.drawShape = drawShape; + this.drawConnection = drawConnection; + + this.getShapePath = getShapePath; +} + +inherits(BpmnRenderer, DefaultRenderer); + + +BpmnRenderer.$inject = [ 'eventBus', 'styles', 'pathMap' ]; + +module.exports = BpmnRenderer; + +},{"184":184,"195":195,"201":201,"204":204,"206":206,"210":210,"316":316,"320":320,"325":325,"45":45,"84":84}],5:[function(_dereq_,module,exports){ +'use strict'; + +var Snap = _dereq_(188); + +/** + * Map containing SVG paths needed by BpmnRenderer. + */ + +function PathMap() { + + /** + * Contains a map of path elements + * + *

    Path definition

    + * A parameterized path is defined like this: + *
    +   * 'GATEWAY_PARALLEL': {
    +   *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +
    +          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',
    +   *   height: 17.5,
    +   *   width:  17.5,
    +   *   heightElements: [2.5, 7.5],
    +   *   widthElements: [2.5, 7.5]
    +   * }
    +   * 
    + *

    It's important to specify a correct height and width for the path as the scaling + * is based on the ratio between the specified height and width in this object and the + * height and width that is set as scale target (Note x,y coordinates will be scaled with + * individual ratios).

    + *

    The 'heightElements' and 'widthElements' array must contain the values that will be scaled. + * The scaling is based on the computed ratios. + * Coordinates on the y axis should be in the heightElement's array, they will be scaled using + * the computed ratio coefficient. + * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets. + *

      + *
    • The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....
    • + *
    • The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....
    • + *
    + * The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index. + *

    + */ + this.pathMap = { + 'EVENT_MESSAGE': { + d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}', + height: 36, + width: 36, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'EVENT_SIGNAL': { + d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z', + height: 36, + width: 36, + heightElements: [18], + widthElements: [10, 20] + }, + 'EVENT_ESCALATION': { + d: 'm {mx},{my} c -{e.x1},{e.y0} -{e.x3},{e.y1} -{e.x5},{e.y4} {e.x1},-{e.y3} {e.x3},-{e.y5} {e.x5},-{e.y6} ' + + '{e.x0},{e.y3} {e.x2},{e.y5} {e.x4},{e.y6} -{e.x0},-{e.y0} -{e.x2},-{e.y1} -{e.x4},-{e.y4} z', + height: 36, + width: 36, + heightElements: [2.382, 4.764, 4.926, 6.589333, 7.146, 13.178667, 19.768], + widthElements: [2.463, 2.808, 4.926, 5.616, 7.389, 8.424] + }, + 'EVENT_CONDITIONAL': { + d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' + + 'M {e.x2},{e.y3} l {e.x0},0 ' + + 'M {e.x2},{e.y4} l {e.x0},0 ' + + 'M {e.x2},{e.y5} l {e.x0},0 ' + + 'M {e.x2},{e.y6} l {e.x0},0 ' + + 'M {e.x2},{e.y7} l {e.x0},0 ' + + 'M {e.x2},{e.y8} l {e.x0},0 ', + height: 36, + width: 36, + heightElements: [8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5], + widthElements: [10.5, 14.5, 12.5] + }, + 'EVENT_LINK': { + d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z', + height: 36, + width: 36, + heightElements: [4.4375, 6.75, 7.8125], + widthElements: [9.84375, 13.5] + }, + 'EVENT_ERROR': { + d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z', + height: 36, + width: 36, + heightElements: [0.023, 8.737, 8.151, 16.564, 10.591, 8.714], + widthElements: [0.085, 6.672, 6.97, 4.273, 5.337, 6.636] + }, + 'EVENT_CANCEL_45': { + d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' + + '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z', + height: 36, + width: 36, + heightElements: [4.75, 8.5], + widthElements: [4.75, 8.5] + }, + 'EVENT_COMPENSATION': { + d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x0},0 {e.x0},-{e.y0} 0,{e.y1} z', + height: 36, + width: 36, + heightElements: [5, 10], + widthElements: [10] + }, + 'EVENT_TIMER_WH': { + d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ', + height: 36, + width: 36, + heightElements: [10, 2], + widthElements: [3, 7] + }, + 'EVENT_TIMER_LINE': { + d: 'M {mx},{my} ' + + 'm {e.x0},{e.y0} l -{e.x1},{e.y1} ', + height: 36, + width: 36, + heightElements: [10, 3], + widthElements: [0, 0] + }, + 'EVENT_MULTIPLE': { + d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z', + height: 36, + width: 36, + heightElements: [6.28099, 12.56199], + widthElements: [3.1405, 9.42149, 12.56198] + }, + 'EVENT_PARALLEL_MULTIPLE': { + d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' + + '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z', + height: 36, + width: 36, + heightElements: [2.56228, 7.68683], + widthElements: [2.56228, 7.68683] + }, + 'GATEWAY_EXCLUSIVE': { + d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' + + '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' + + '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z', + height: 17.5, + width: 17.5, + heightElements: [8.5, 6.5312, -6.5312, -8.5], + widthElements: [6.5, -6.5, 3, -3, 5, -5] + }, + 'GATEWAY_PARALLEL': { + d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' + + '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z', + height: 30, + width: 30, + heightElements: [5, 12.5], + widthElements: [5, 12.5] + }, + 'GATEWAY_EVENT_BASED': { + d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z', + height: 11, + width: 11, + heightElements: [-6, 6, 12, -12], + widthElements: [9, -3, -12] + }, + 'GATEWAY_COMPLEX': { + d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' + + '{e.x2},0 -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' + + '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' + + '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z', + height: 17.125, + width: 17.125, + heightElements: [4.875, 3.4375, 2.125, 3], + widthElements: [3.4375, 2.125, 4.875, 3] + }, + 'DATA_OBJECT_PATH': { + d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0', + height: 61, + width: 51, + heightElements: [10, 50, 60], + widthElements: [10, 40, 50, 60] + }, + 'DATA_OBJECT_COLLECTION_PATH': { + d:'m {mx}, {my} ' + + 'm 0 15 l 0 -15 ' + + 'm 4 15 l 0 -15 ' + + 'm 4 15 l 0 -15 ', + height: 61, + width: 51, + heightElements: [12], + widthElements: [1, 6, 12, 15] + }, + 'DATA_ARROW': { + d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z', + height: 61, + width: 51, + heightElements: [], + widthElements: [] + }, + 'DATA_STORE': { + d:'m {mx},{my} ' + + 'l 0,{e.y2} ' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' + + 'l 0,-{e.y2} ' + + 'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' + + 'm -{e.x2},{e.y0}' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' + + 'm -{e.x2},{e.y0}' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0', + height: 61, + width: 61, + heightElements: [7, 10, 45], + widthElements: [2, 58, 60] + }, + 'TEXT_ANNOTATION': { + d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0', + height: 30, + width: 10, + heightElements: [30], + widthElements: [10] + }, + 'MARKER_SUB_PROCESS': { + d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_PARALLEL': { + d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_SEQUENTIAL': { + d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_COMPENSATION': { + d: 'm {mx},{my} 8,-5 0,10 z m 9,0 8,-5 0,10 z', + height: 10, + width: 21, + heightElements: [], + widthElements: [] + }, + 'MARKER_LOOP': { + d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' + + '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' + + '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' + + 'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902', + height: 13.9, + width: 13.7, + heightElements: [], + widthElements: [] + }, + 'MARKER_ADHOC': { + d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' + + '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' + + '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' + + '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' + + '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z', + height: 4, + width: 15, + heightElements: [], + widthElements: [] + }, + 'TASK_TYPE_SEND': { + d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}', + height: 14, + width: 21, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'TASK_TYPE_SCRIPT': { + d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' + + 'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' + + 'm -7,-12 l 5,0 ' + + 'm -4.5,3 l 4.5,0 ' + + 'm -3,3 l 5,0' + + 'm -4,3 l 5,0', + height: 15, + width: 12.6, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'TASK_TYPE_USER_1': { + d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' + + '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' + + '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' + + 'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' + + 'm -8,6 l 0,5.5 m 11,0 l 0,-5' + }, + 'TASK_TYPE_USER_2': { + d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' + + '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 ' + }, + 'TASK_TYPE_USER_3': { + d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' + + '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' + + '-4.20799998,3.36699999 -4.20699998,4.34799999 z' + }, + 'TASK_TYPE_MANUAL': { + d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' + + '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' + + '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' + + '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' + + '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' + + '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' + + '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' + + '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' + + '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' + + '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' + + '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' + + '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z' + }, + 'TASK_TYPE_INSTANTIATING_SEND': { + d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6' + }, + 'TASK_TYPE_SERVICE': { + d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' + + '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' + + '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' + + 'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' + + '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' + + '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' + + 'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' + + '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' + + 'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' + + 'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' + + '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' + + 'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' + + 'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' + + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' + + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z' + }, + 'TASK_TYPE_SERVICE_FILL': { + d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' + + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' + + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z' + }, + 'TASK_TYPE_BUSINESS_RULE_HEADER': { + d: 'm {mx},{my} 0,4 20,0 0,-4 z' + }, + 'TASK_TYPE_BUSINESS_RULE_MAIN': { + d: 'm {mx},{my} 0,12 20,0 0,-12 z' + + 'm 0,8 l 20,0 ' + + 'm -13,-4 l 0,8' + }, + 'MESSAGE_FLOW_MARKER': { + d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6' + } + }; + + this.getRawPath = function getRawPath(pathId) { + return this.pathMap[pathId].d; + }; + + /** + * Scales the path to the given height and width. + *

    Use case

    + *

    Use case is to scale the content of elements (event, gateways) based + * on the element bounding box's size. + *

    + *

    Why not transform

    + *

    Scaling a path with transform() will also scale the stroke and IE does not support + * the option 'non-scaling-stroke' to prevent this. + * Also there are use cases where only some parts of a path should be + * scaled.

    + * + * @param {String} pathId The ID of the path. + * @param {Object} param

    + * Example param object scales the path to 60% size of the container (data.width, data.height). + *

    +   *   {
    +   *     xScaleFactor: 0.6,
    +   *     yScaleFactor:0.6,
    +   *     containerWidth: data.width,
    +   *     containerHeight: data.height,
    +   *     position: {
    +   *       mx: 0.46,
    +   *       my: 0.2,
    +   *     }
    +   *   }
    +   *   
    + *
      + *
    • targetpathwidth = xScaleFactor * containerWidth
    • + *
    • targetpathheight = yScaleFactor * containerHeight
    • + *
    • Position is used to set the starting coordinate of the path. M is computed: + *
        + *
      • position.x * containerWidth
      • + *
      • position.y * containerHeight
      • + *
      + * Center of the container
       position: {
      +   *       mx: 0.5,
      +   *       my: 0.5,
      +   *     }
      + * Upper left corner of the container + *
       position: {
      +   *       mx: 0.0,
      +   *       my: 0.0,
      +   *     }
      + *
    • + *
    + *

    + * + */ + this.getScaledPath = function getScaledPath(pathId, param) { + var rawPath = this.pathMap[pathId]; + + // positioning + // compute the start point of the path + var mx, my; + + if(!!param.abspos) { + mx = param.abspos.x; + my = param.abspos.y; + } else { + mx = param.containerWidth * param.position.mx; + my = param.containerHeight * param.position.my; + } + + var coordinates = {}; //map for the scaled coordinates + if(param.position) { + + // path + var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor; + var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor; + + + //Apply height ratio + for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) { + coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio; + } + + //Apply width ratio + for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) { + coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio; + } + } + + //Apply value to raw path + var path = Snap.format( + rawPath.d, { + mx: mx, + my: my, + e: coordinates + } + ); + return path; + }; +} + +module.exports = PathMap; + +},{"188":188}],6:[function(_dereq_,module,exports){ +module.exports = { + renderer: [ 'type', _dereq_(4) ], + pathMap: [ 'type', _dereq_(5) ] +}; +},{"4":4,"5":5}],7:[function(_dereq_,module,exports){ +'use strict'; + + +var assign = _dereq_(325), + forEach = _dereq_(204); + + +/** + * A provider for BPMN 2.0 elements context pad + */ +function ContextPadProvider(contextPad, modeling, elementFactory, + connect, create, bpmnReplace, + canvas) { + + contextPad.registerProvider(this); + + this._contextPad = contextPad; + + this._modeling = modeling; + + this._elementFactory = elementFactory; + this._connect = connect; + this._create = create; + this._bpmnReplace = bpmnReplace; + this._canvas = canvas; +} + +ContextPadProvider.$inject = [ + 'contextPad', + 'modeling', + 'elementFactory', + 'connect', + 'create', + 'bpmnReplace', + 'canvas' +]; + +ContextPadProvider.prototype.getContextPadEntries = function(element) { + + var contextPad = this._contextPad, + modeling = this._modeling, + + elementFactory = this._elementFactory, + connect = this._connect, + create = this._create, + bpmnReplace = this._bpmnReplace, + canvas = this._canvas; + + var actions = {}; + + if (element.type === 'label') { + return actions; + } + + var bpmnElement = element.businessObject; + + function startConnect(event, element, autoActivate) { + connect.start(event, element, autoActivate); + } + + function removeElement(e) { + if (element.waypoints) { + modeling.removeConnection(element); + } else { + modeling.removeShape(element); + } + } + + function getReplaceMenuPosition(element) { + + var Y_OFFSET = 5; + + var diagramContainer = canvas.getContainer(), + pad = contextPad.getPad(element).html; + + var diagramRect = diagramContainer.getBoundingClientRect(), + padRect = pad.getBoundingClientRect(); + + var top = padRect.top - diagramRect.top; + var left = padRect.left - diagramRect.left; + + var pos = { + x: left, + y: top + padRect.height + Y_OFFSET + }; + + return pos; + } + + + function appendAction(type, className, options) { + + function appendListener(event, element) { + + var shape = elementFactory.createShape(assign({ type: type }, options)); + create.start(event, shape, element); + } + + var shortType = type.replace(/^bpmn\:/, ''); + + return { + group: 'model', + className: className, + title: 'Append ' + shortType, + action: { + dragstart: appendListener, + click: appendListener + } + }; + } + + if (bpmnElement.$instanceOf('bpmn:FlowNode')) { + + if (!bpmnElement.$instanceOf('bpmn:EndEvent') && + !bpmnElement.$instanceOf('bpmn:EventBasedGateway') && + !isEventType(bpmnElement, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition')) { + + assign(actions, { + 'append.end-event': appendAction('bpmn:EndEvent', 'icon-end-event-none'), + 'append.gateway': appendAction('bpmn:ExclusiveGateway', 'icon-gateway-xor'), + 'append.append-task': appendAction('bpmn:Task', 'icon-task'), + 'append.intermediate-event': appendAction('bpmn:IntermediateThrowEvent', + 'icon-intermediate-event-none') + }); + } + + if (bpmnElement.$instanceOf('bpmn:EventBasedGateway')) { + + assign(actions, { + 'append.receive-task': appendAction('bpmn:ReceiveTask', 'icon-receive-task'), + 'append.message-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-message', + { _eventDefinitionType: 'bpmn:MessageEventDefinition'}), + 'append.timer-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-timer', + { _eventDefinitionType: 'bpmn:TimerEventDefinition'}), + 'append.condtion-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-condition', + { _eventDefinitionType: 'bpmn:ConditionalEventDefinition'}), + 'append.signal-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'icon-intermediate-event-catch-signal', + { _eventDefinitionType: 'bpmn:SignalEventDefinition'}) + }); + } + + + // Replace menu entry + if (!bpmnElement.$instanceOf('bpmn:SubProcess')) { + assign(actions, { + 'replace': { + group: 'edit', + className: 'icon-screw-wrench', + title: 'Change type', + action: { + click: function(event, element) { + bpmnReplace.openChooser(getReplaceMenuPosition(element), element); + } + } + } + }); + } + } + + if (bpmnElement.$instanceOf('bpmn:FlowNode') || + bpmnElement.$instanceOf('bpmn:InteractionNode')) { + + assign(actions, { + 'append.text-annotation': appendAction('bpmn:TextAnnotation', 'icon-text-annotation'), + + 'connect': { + group: 'connect', + className: 'icon-connection-multi', + title: 'Connect using Sequence/MessageFlow', + action: { + click: startConnect, + dragstart: startConnect + } + } + }); + } + + // Delete Element Entry + assign(actions, { + 'delete': { + group: 'edit', + className: 'icon-trash', + title: 'Remove', + action: { + click: removeElement, + dragstart: removeElement + } + } + }); + + return actions; +}; + +function isEventType(eventBo, type, definition) { + + var isType = eventBo.$instanceOf(type); + var isDefinition = false; + + var definitions = eventBo.eventDefinitions || []; + forEach(definitions, function(def) { + if (def.$type === definition) { + isDefinition = true; + } + }); + + return isType && isDefinition; +} + + +module.exports = ContextPadProvider; + +},{"204":204,"325":325}],8:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(70), + _dereq_(97), + _dereq_(151), + _dereq_(95), + _dereq_(99), + _dereq_(37) + ], + __init__: [ 'contextPadProvider' ], + contextPadProvider: [ 'type', _dereq_(7) ] +}; +},{"151":151,"37":37,"7":7,"70":70,"95":95,"97":97,"99":99}],9:[function(_dereq_,module,exports){ +'use strict'; + + +function BpmnKeyBindings(keyboard, spaceTool, lassoTool, directEditing, selection) { + + keyboard.addListener(function(key, modifiers) { + + if (keyboard.hasModifier(modifiers)) { + return; + } + + // S -> activate space tool + if (key === 83) { + spaceTool.activateSelection(); + + return true; + } + + // L -> activate lasso tool + if (key === 108) { + lassoTool.activateSelection(); + + return true; + } + + var currentSelection = selection.get(); + + // E -> activate direct editing + if (key === 69) { + if (currentSelection.length) { + directEditing.activate(currentSelection[0]); + } + + return true; + } + }); +} + +BpmnKeyBindings.$inject = [ 'keyboard', 'spaceTool', 'lassoTool', 'directEditing', 'selection' ]; + +module.exports = BpmnKeyBindings; +},{}],10:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(105) + ], + __init__: [ 'bpmnKeyBindings' ], + bpmnKeyBindings: [ 'type', _dereq_(9) ] +}; +},{"105":105,"9":9}],11:[function(_dereq_,module,exports){ +'use strict'; + +var UpdateLabelHandler = _dereq_(13); + +var LabelUtil = _dereq_(12); + +var is = _dereq_(47).is, + isExpanded = _dereq_(45).isExpanded; + + +var MIN_BOUNDS = { + width: 150, + height: 50 +}; + + +function LabelEditingProvider(eventBus, canvas, directEditing, commandStack, injector) { + + directEditing.registerProvider(this); + commandStack.registerHandler('element.updateLabel', UpdateLabelHandler); + + // listen to dblclick on non-root elements + eventBus.on('element.dblclick', function(event) { + directEditing.activate(event.element); + }); + + // complete on followup canvas operation + eventBus.on([ 'element.mousedown', 'drag.activate', 'canvas.viewbox.changed' ], function(event) { + directEditing.complete(); + }); + + // cancel on command stack changes + eventBus.on([ 'commandStack.changed' ], function() { + directEditing.cancel(); + }); + + + // activate direct editing for activities and text annotations + + + if ('ontouchstart' in document.documentElement) { + // we deactivate automatic label editing on mobile devices + // as it breaks the user interaction workflow + + // TODO(nre): we should temporarily focus the edited element here + // and release the focused viewport after the direct edit operation is finished + } else { + eventBus.on('create.end', 500, function(e) { + + var element = e.shape, + canExecute = e.context.canExecute; + + if (!canExecute) { + return; + } + + if (is(element, 'bpmn:Task') || is(element, 'bpmn:TextAnnotation') || + (is(element, 'bpmn:SubProcess') && !isExpanded(element))) { + + directEditing.activate(element); + } + }); + } + + this._canvas = canvas; + this._commandStack = commandStack; +} + +LabelEditingProvider.$inject = [ 'eventBus', 'canvas', 'directEditing', 'commandStack', 'injector' ]; + +module.exports = LabelEditingProvider; + + +LabelEditingProvider.prototype.activate = function(element) { + + var text = LabelUtil.getLabel(element); + + if (text === undefined) { + return; + } + + var bbox = this.getEditingBBox(element); + + // adjust for expanded pools AND lanes + if ((is(element, 'bpmn:Participant') && isExpanded(element)) || is(element, 'bpmn:Lane')) { + + bbox.width = MIN_BOUNDS.width; + bbox.height = MIN_BOUNDS.height; + + bbox.x = bbox.x + 10 - bbox.width / 2; + bbox.y = bbox.mid.y - bbox.height / 2; + } + + // adjust for expanded sub processes + if (is(element, 'bpmn:SubProcess') && isExpanded(element)) { + + bbox.height = MIN_BOUNDS.height; + + bbox.x = bbox.mid.x - bbox.width / 2; + bbox.y = bbox.y + 10 - bbox.height / 2; + } + + return { bounds: bbox, text: text }; +}; + + +LabelEditingProvider.prototype.getEditingBBox = function(element, maxBounds) { + + var target = element.label || element; + + var bbox = this._canvas.getAbsoluteBBox(target); + + var mid = { + x: bbox.x + bbox.width / 2, + y: bbox.y + bbox.height / 2 + }; + + // external label + if (target.labelTarget) { + bbox.width = Math.max(bbox.width, MIN_BOUNDS.width); + bbox.height = Math.max(bbox.height, MIN_BOUNDS.height); + + bbox.x = mid.x - bbox.width / 2; + } + + bbox.mid = mid; + + return bbox; +}; + + +LabelEditingProvider.prototype.update = function(element, newLabel) { + this._commandStack.execute('element.updateLabel', { + element: element, + newLabel: newLabel + }); +}; +},{"12":12,"13":13,"45":45,"47":47}],12:[function(_dereq_,module,exports){ +'use strict'; + +function getLabelAttr(semantic) { + if (semantic.$instanceOf('bpmn:FlowElement') || + semantic.$instanceOf('bpmn:Participant') || + semantic.$instanceOf('bpmn:Lane') || + semantic.$instanceOf('bpmn:SequenceFlow') || + semantic.$instanceOf('bpmn:MessageFlow')) { + return 'name'; + } + + if (semantic.$instanceOf('bpmn:TextAnnotation')) { + return 'text'; + } +} + +module.exports.getLabel = function(element) { + var semantic = element.businessObject, + attr = getLabelAttr(semantic); + + if (attr) { + return semantic[attr] || ''; + } +}; + + +module.exports.setLabel = function(element, text) { + var semantic = element.businessObject, + attr = getLabelAttr(semantic); + + if (attr) { + semantic[attr] = text; + } + + var label = element.label || element; + + // show label + label.hidden = false; + + return label; +}; +},{}],13:[function(_dereq_,module,exports){ +'use strict'; + +var LabelUtil = _dereq_(12); + + +/** + * A handler that updates the text of a BPMN element. + * + * @param {EventBus} eventBus + */ +function UpdateTextHandler(eventBus) { + + function setText(element, text) { + var label = LabelUtil.setLabel(element, text); + + eventBus.fire('element.changed', { element: label }); + } + + function execute(ctx) { + ctx.oldLabel = LabelUtil.getLabel(ctx.element); + return setText(ctx.element, ctx.newLabel); + } + + function revert(ctx) { + return setText(ctx.element, ctx.oldLabel); + } + + + function canExecute(ctx) { + return true; + } + + // API + + this.execute = execute; + this.revert = revert; + + this.canExecute = canExecute; +} + + +UpdateTextHandler.$inject = [ 'eventBus' ]; + +module.exports = UpdateTextHandler; +},{"12":12}],14:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(77), + _dereq_(93), + _dereq_(70) + ], + __init__: [ 'labelEditingProvider' ], + labelEditingProvider: [ 'type', _dereq_(11) ] +}; +},{"11":11,"70":70,"77":77,"93":93}],15:[function(_dereq_,module,exports){ +'use strict'; + +var map = _dereq_(207), + assign = _dereq_(325), + pick = _dereq_(330); + + +function BpmnFactory(moddle) { + this._model = moddle; +} + +BpmnFactory.$inject = [ 'moddle' ]; + + +BpmnFactory.prototype._needsId = function(element) { + return element.$instanceOf('bpmn:RootElement') || + element.$instanceOf('bpmn:FlowElement') || + element.$instanceOf('bpmn:MessageFlow') || + element.$instanceOf('bpmn:Artifact') || + element.$instanceOf('bpmn:Participant') || + element.$instanceOf('bpmn:Process') || + element.$instanceOf('bpmn:Collaboration') || + element.$instanceOf('bpmndi:BPMNShape') || + element.$instanceOf('bpmndi:BPMNEdge') || + element.$instanceOf('bpmndi:BPMNDiagram') || + element.$instanceOf('bpmndi:BPMNPlane'); +}; + +BpmnFactory.prototype._ensureId = function(element) { + + // generate semantic ids for elements + // bpmn:SequenceFlow -> SequenceFlow_ID + var prefix = (element.$type || '').replace(/^[^:]*:/g, '') + '_'; + + if (!element.id && this._needsId(element)) { + element.id = this._model.ids.nextPrefixed(prefix, element); + } +}; + + +BpmnFactory.prototype.create = function(type, attrs) { + var element = this._model.create(type, attrs || {}); + + this._ensureId(element); + + return element; +}; + + +BpmnFactory.prototype.createDiLabel = function() { + return this.create('bpmndi:BPMNLabel', { + bounds: this.createDiBounds() + }); +}; + + +BpmnFactory.prototype.createDiShape = function(semantic, bounds, attrs) { + + return this.create('bpmndi:BPMNShape', assign({ + bpmnElement: semantic, + bounds: this.createDiBounds(bounds) + }, attrs)); +}; + + +BpmnFactory.prototype.createDiBounds = function(bounds) { + return this.create('dc:Bounds', bounds); +}; + + +BpmnFactory.prototype.createDiWaypoints = function(waypoints) { + return map(waypoints, function(pos) { + return this.createDiWaypoint(pos); + }, this); +}; + +BpmnFactory.prototype.createDiWaypoint = function(point) { + return this.create('dc:Point', pick(point, [ 'x', 'y' ])); +}; + + +BpmnFactory.prototype.createDiEdge = function(semantic, waypoints, attrs) { + return this.create('bpmndi:BPMNEdge', assign({ + bpmnElement: semantic + }, attrs)); +}; + +BpmnFactory.prototype.createDiPlane = function(semantic) { + return this.create('bpmndi:BPMNPlane', { + bpmnElement: semantic + }); +}; + +module.exports = BpmnFactory; + +},{"207":207,"325":325,"330":330}],16:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var assign = _dereq_(325); + +var BaseLayouter = _dereq_(164), + LayoutUtil = _dereq_(166), + ManhattanLayout = _dereq_(167); + +var is = _dereq_(47).is; + + +function BpmnLayouter() {} + +inherits(BpmnLayouter, BaseLayouter); + +module.exports = BpmnLayouter; + + +function getAttachment(waypoints, idx, shape) { + var point = waypoints && waypoints[idx]; + + return point ? (point.original || point) : LayoutUtil.getMidPoint(shape); +} + + +BpmnLayouter.prototype.layoutConnection = function(connection, hints) { + var source = connection.source, + target = connection.target, + waypoints = connection.waypoints, + start, + end; + + var layoutManhattan, + updatedWaypoints; + + start = getAttachment(waypoints, 0, source); + end = getAttachment(waypoints, waypoints && waypoints.length - 1, target); + + // manhattan layout sequence / message flows + if (is(connection, 'bpmn:MessageFlow')) { + layoutManhattan = { + preferStraight: true, + preferVertical: true + }; + } + + if (is(connection, 'bpmn:SequenceFlow')) { + layoutManhattan = {}; + } + + if (layoutManhattan) { + + layoutManhattan = assign(layoutManhattan, hints); + + updatedWaypoints = + ManhattanLayout.repairConnection( + source, target, start, end, + waypoints, + layoutManhattan); + } + + return updatedWaypoints || [ start, end ]; +}; +},{"164":164,"166":166,"167":167,"195":195,"325":325,"47":47}],17:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + forEach = _dereq_(204), + inherits = _dereq_(195); + +var Collections = _dereq_(175), + Model = _dereq_(168); + +var CommandInterceptor = _dereq_(75); + + +/** + * A handler responsible for updating the underlying BPMN 2.0 XML + DI + * once changes on the diagram happen + */ +function BpmnUpdater(eventBus, bpmnFactory, connectionDocking) { + + CommandInterceptor.call(this, eventBus); + + this._bpmnFactory = bpmnFactory; + + var self = this; + + + + ////// connection cropping ///////////////////////// + + // crop connection ends during create/update + function cropConnection(e) { + var context = e.context, + connection; + + if (!context.cropped) { + connection = context.connection; + connection.waypoints = connectionDocking.getCroppedWaypoints(connection); + context.cropped = true; + } + } + + this.executed([ + 'connection.layout', + 'connection.create', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], cropConnection); + + this.reverted([ 'connection.layout' ], function(e) { + delete e.context.cropped; + }); + + + + ////// BPMN + DI update ///////////////////////// + + + // update parent + function updateParent(e) { + self.updateParent(e.context.shape || e.context.connection); + } + + this.executed([ 'shape.move', + 'shape.create', + 'shape.delete', + 'connection.create', + 'connection.move', + 'connection.delete' ], updateParent); + this.reverted([ 'shape.move', + 'shape.create', + 'shape.delete', + 'connection.create', + 'connection.move', + 'connection.delete' ], updateParent); + + /* + * ## Updating Parent + * + * When morphing a Process into a Collaboration or vice-versa, + * make sure that both the *semantic* and *di* parent of each element + * is updated. + * + */ + function updateRoot(event) { + var context = event.context, + oldRoot = context.oldRoot, + children = oldRoot.children; + + forEach(children, function(child) { + self.updateParent(child); + }); + } + + this.executed([ 'canvas.updateRoot' ], updateRoot); + this.reverted([ 'canvas.updateRoot' ], updateRoot); + + + // update bounds + function updateBounds(e) { + self.updateBounds(e.context.shape); + } + + this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], updateBounds); + this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], updateBounds); + + + // attach / detach connection + function updateConnection(e) { + self.updateConnection(e.context.connection); + } + + this.executed([ + 'connection.create', + 'connection.move', + 'connection.delete', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnection); + + this.reverted([ + 'connection.create', + 'connection.move', + 'connection.delete', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnection); + + + // update waypoints + function updateConnectionWaypoints(e) { + self.updateConnectionWaypoints(e.context.connection); + } + + this.executed([ + 'connection.layout', + 'connection.move', + 'connection.updateWaypoints', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnectionWaypoints); + + this.reverted([ + 'connection.layout', + 'connection.move', + 'connection.updateWaypoints', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], updateConnectionWaypoints); +} + +inherits(BpmnUpdater, CommandInterceptor); + +module.exports = BpmnUpdater; + +BpmnUpdater.$inject = [ 'eventBus', 'bpmnFactory', 'connectionDocking']; + + +/////// implementation ////////////////////////////////// + + +BpmnUpdater.prototype.updateParent = function(element) { + + // do not update BPMN 2.0 label parent + if (element instanceof Model.Label) { + return; + } + + var parentShape = element.parent; + + var businessObject = element.businessObject, + parentBusinessObject = parentShape && parentShape.businessObject, + parentDi = parentBusinessObject && parentBusinessObject.di; + + this.updateSemanticParent(businessObject, parentBusinessObject); + + this.updateDiParent(businessObject.di, parentDi); +}; + + +BpmnUpdater.prototype.updateBounds = function(shape) { + + var di = shape.businessObject.di; + + var bounds = (shape instanceof Model.Label) ? this._getLabel(di).bounds : di.bounds; + + assign(bounds, { + x: shape.x, + y: shape.y, + width: shape.width, + height: shape.height + }); +}; + + +BpmnUpdater.prototype.updateDiParent = function(di, parentDi) { + + if (parentDi && !parentDi.$instanceOf('bpmndi:BPMNPlane')) { + parentDi = parentDi.$parent; + } + + if (di.$parent === parentDi) { + return; + } + + var planeElements = (parentDi || di.$parent).get('planeElement'); + + if (parentDi) { + planeElements.push(di); + di.$parent = parentDi; + } else { + Collections.remove(planeElements, di); + di.$parent = null; + } +}; + +function getDefinitions(element) { + while (element && !element.$instanceOf('bpmn:Definitions')) { + element = element.$parent; + } + + return element; +} + +BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent) { + + var containment; + + if (businessObject.$parent === newParent) { + return; + } + + if (businessObject.$instanceOf('bpmn:FlowElement')) { + + if (newParent && newParent.$instanceOf('bpmn:Participant')) { + newParent = newParent.processRef; + } + + containment = 'flowElements'; + + } else + + if (businessObject.$instanceOf('bpmn:Artifact')) { + + while (newParent && + !newParent.$instanceOf('bpmn:Process') && + !newParent.$instanceOf('bpmn:SubProcess') && + !newParent.$instanceOf('bpmn:Collaboration')) { + + if (newParent.$instanceOf('bpmn:Participant')) { + newParent = newParent.processRef; + break; + } else { + newParent = newParent.$parent; + } + } + + containment = 'artifacts'; + } else + + if (businessObject.$instanceOf('bpmn:MessageFlow')) { + containment = 'messageFlows'; + + } else + + if (businessObject.$instanceOf('bpmn:Participant')) { + containment = 'participants'; + + // make sure the participants process is properly attached / detached + // from the XML document + + var process = businessObject.processRef, + definitions; + + if (process) { + definitions = getDefinitions(businessObject.$parent || newParent); + + if (businessObject.$parent) { + Collections.remove(definitions.get('rootElements'), process); + process.$parent = null; + } + + if (newParent) { + Collections.add(definitions.get('rootElements'), process); + process.$parent = definitions; + } + } + } + + if (!containment) { + throw new Error('no parent for ', businessObject, newParent); + } + + var children; + + if (businessObject.$parent) { + // remove from old parent + children = businessObject.$parent.get(containment); + Collections.remove(children, businessObject); + } + + if (!newParent) { + businessObject.$parent = null; + } else { + // add to new parent + children = newParent.get(containment); + children.push(businessObject); + businessObject.$parent = newParent; + } +}; + + +BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) { + + connection.businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints)); +}; + + +BpmnUpdater.prototype.updateConnection = function(connection) { + + var businessObject = connection.businessObject, + newSource = connection.source && connection.source.businessObject, + newTarget = connection.target && connection.target.businessObject; + + var inverseSet = businessObject.$instanceOf('bpmn:SequenceFlow'); + + if (businessObject.sourceRef !== newSource) { + if (inverseSet) { + Collections.remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject); + + if (newSource) { + newSource.get('outgoing').push(businessObject); + } + } + + businessObject.sourceRef = newSource; + } + if (businessObject.targetRef !== newTarget) { + if (inverseSet) { + Collections.remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject); + + if (newTarget) { + newTarget.get('incoming').push(businessObject); + } + } + + businessObject.targetRef = newTarget; + } + + businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints)); +}; + + +/////// helpers ///////////////////////////////////////// + +BpmnUpdater.prototype._getLabel = function(di) { + if (!di.label) { + di.label = this._bpmnFactory.createDiLabel(); + } + + return di.label; +}; +},{"168":168,"175":175,"195":195,"204":204,"325":325,"75":75}],18:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + inherits = _dereq_(195); + +var BaseElementFactory = _dereq_(79), + LabelUtil = _dereq_(46); + + +/** + * A bpmn-aware factory for diagram-js shapes + */ +function ElementFactory(bpmnFactory, moddle) { + BaseElementFactory.call(this); + + this._bpmnFactory = bpmnFactory; + this._moddle = moddle; +} + +inherits(ElementFactory, BaseElementFactory); + + +ElementFactory.$inject = [ 'bpmnFactory', 'moddle' ]; + +module.exports = ElementFactory; + +ElementFactory.prototype.baseCreate = BaseElementFactory.prototype.create; + +ElementFactory.prototype.create = function(elementType, attrs) { + + // no special magic for labels, + // we assume their businessObjects have already been created + // and wired via attrs + if (elementType === 'label') { + return this.baseCreate(elementType, assign({ type: 'label' }, LabelUtil.DEFAULT_LABEL_SIZE, attrs)); + } + + attrs = attrs || {}; + + var businessObject = attrs.businessObject, + size; + + if (!businessObject) { + if (!attrs.type) { + throw new Error('no shape type specified'); + } + + businessObject = this._bpmnFactory.create(attrs.type); + } + + if (!businessObject.di) { + if (elementType === 'root') { + businessObject.di = this._bpmnFactory.createDiPlane(businessObject, [], { + id: businessObject.id + '_di' + }); + } else + if (elementType === 'connection') { + businessObject.di = this._bpmnFactory.createDiEdge(businessObject, [], { + id: businessObject.id + '_di' + }); + } else { + businessObject.di = this._bpmnFactory.createDiShape(businessObject, {}, { + id: businessObject.id + '_di' + }); + } + } + + if (!!attrs.isExpanded) { + businessObject.di.isExpanded = attrs.isExpanded; + } + + if (businessObject.$instanceOf('bpmn:ExclusiveGateway')) { + businessObject.di.isMarkerVisible = true; + } + + if (attrs._eventDefinitionType) { + var eventDefinitions = businessObject.get('eventDefinitions') || [], + newEventDefinition = this._moddle.create(attrs._eventDefinitionType); + + eventDefinitions.push(newEventDefinition); + businessObject.eventDefinitions = eventDefinitions; + } + + size = this._getDefaultSize(businessObject); + + attrs = assign({ + businessObject: businessObject, + id: businessObject.id + }, size, attrs); + + return this.baseCreate(elementType, attrs); +}; + + +ElementFactory.prototype._getDefaultSize = function(semantic) { + + if (semantic.$instanceOf('bpmn:SubProcess')) { + var isExpanded = semantic.di.isExpanded === true; + + if (isExpanded) { + return { width: 350, height: 200 }; + } else { + return { width: 100, height: 80 }; + } + } + + if (semantic.$instanceOf('bpmn:Task')) { + return { width: 100, height: 80 }; + } + + if (semantic.$instanceOf('bpmn:Gateway')) { + return { width: 50, height: 50 }; + } + + if (semantic.$instanceOf('bpmn:Event')) { + return { width: 36, height: 36 }; + } + + if (semantic.$instanceOf('bpmn:Participant')) { + return { width: 600, height: 250 }; + } + + return { width: 100, height: 80 }; +}; + + +ElementFactory.prototype.createParticipantShape = function(collapsed) { + + var participantShape = this.createShape({ type: 'bpmn:Participant' }); + + if (!collapsed) { + participantShape.businessObject.processRef = this._bpmnFactory.create('bpmn:Process'); + } + + return participantShape; +}; +},{"195":195,"325":325,"46":46,"79":79}],19:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + forEach = _dereq_(204); + +var LabelUtil = _dereq_(46); + +var hasExternalLabel = LabelUtil.hasExternalLabel, + getExternalLabelMid = LabelUtil.getExternalLabelMid; + + +function LabelSupport(eventBus, modeling, bpmnFactory) { + + // create external labels on shape creation + + eventBus.on([ + 'commandStack.shape.create.postExecute', + 'commandStack.connection.create.postExecute' + ], function(e) { + var context = e.context; + + var element = context.shape || context.connection, + businessObject = element.businessObject; + + var position; + + if (hasExternalLabel(businessObject)) { + position = getExternalLabelMid(element); + modeling.createLabel(element, position, { + id: businessObject.id + '_label', + businessObject: businessObject + }); + } + }); + + + // indicate label is dragged during move + + // we need to add labels to the list of selected + // shapes before the visuals get drawn. + // + // Hence this awesome magic number. + // + eventBus.on('shape.move.start', function(e) { + + var context = e.context, + shapes = context.shapes; + + var labels = []; + + forEach(shapes, function(element) { + var label = element.label; + + if (label && !label.hidden && context.shapes.indexOf(label) === -1) { + labels.push(label); + } + }); + + forEach(labels, function(label) { + shapes.push(label); + }); + }); + + + // move labels with shapes + + eventBus.on([ + 'commandStack.shapes.move.postExecute' + ], function(e) { + + var context = e.context, + closure = context.closure, + enclosedElements = closure.enclosedElements; + + // ensure we move all labels with their respective elements + // if they have not been moved already + + forEach(enclosedElements, function(e) { + if (e.label && !enclosedElements[e.label.id]) { + modeling.moveShape(e.label, context.delta, e.parent); + } + }); + }); + + + // update di information on label movement and creation + + eventBus.on([ + 'commandStack.label.create.executed', + 'commandStack.shape.moved.executed' + ], function(e) { + + var element = e.context.shape, + businessObject = element.businessObject, + di = businessObject.di; + + // we want to trigger on real labels only + if (!element.labelTarget) { + return; + } + + if (!di.label) { + di.label = bpmnFactory.create('bpmndi:BPMNLabel', { + bounds: bpmnFactory.create('dc:Bounds') + }); + } + + assign(di.label.bounds, { + x: element.x, + y: element.y, + width: element.width, + height: element.height + }); + }); +} + +LabelSupport.$inject = [ 'eventBus', 'modeling', 'bpmnFactory' ]; + +module.exports = LabelSupport; + +},{"204":204,"325":325,"46":46}],20:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var BaseModeling = _dereq_(108); + +var UpdatePropertiesHandler = _dereq_(29), + UpdateCanvasRootHandler = _dereq_(28); + + +/** + * BPMN 2.0 modeling features activator + * + * @param {EventBus} eventBus + * @param {ElementFactory} elementFactory + * @param {CommandStack} commandStack + * @param {BpmnRules} bpmnRules + */ +function Modeling(eventBus, elementFactory, commandStack, bpmnRules) { + BaseModeling.call(this, eventBus, elementFactory, commandStack); + + this._bpmnRules = bpmnRules; +} + +inherits(Modeling, BaseModeling); + +Modeling.$inject = [ 'eventBus', 'elementFactory', 'commandStack', 'bpmnRules' ]; + +module.exports = Modeling; + + +Modeling.prototype.getHandlers = function() { + var handlers = BaseModeling.prototype.getHandlers.call(this); + + handlers['element.updateProperties'] = UpdatePropertiesHandler; + handlers['canvas.updateRoot'] = UpdateCanvasRootHandler; + + return handlers; +}; + + +Modeling.prototype.updateLabel = function(element, newLabel) { + this._commandStack.execute('element.updateLabel', { + element: element, + newLabel: newLabel + }); +}; + + +var getSharedParent = _dereq_(21).getSharedParent; + +Modeling.prototype.connect = function(source, target, attrs) { + + var bpmnRules = this._bpmnRules; + + if (!attrs) { + if (bpmnRules.canConnectMessageFlow(source, target)) { + attrs = { + type: 'bpmn:MessageFlow' + }; + } else + if (bpmnRules.canConnectSequenceFlow(source, target)) { + attrs = { + type: 'bpmn:SequenceFlow' + }; + } else { + attrs = { + type: 'bpmn:Association' + }; + } + } + + return this.createConnection(source, target, attrs, getSharedParent(source, target)); +}; + + +Modeling.prototype.updateProperties = function(element, properties) { + this._commandStack.execute('element.updateProperties', { + element: element, + properties: properties + }); +}; + + +/** + * Transform the current diagram into a collaboration. + * + * @return {djs.model.Root} the new root element + */ +Modeling.prototype.makeCollaboration = function() { + + var collaborationElement = this._create('root', { + type: 'bpmn:Collaboration' + }); + + var context = { + newRoot: collaborationElement + }; + + this._commandStack.execute('canvas.updateRoot', context); + + return collaborationElement; +}; + +/** + * Transform the current diagram into a process. + * + * @return {djs.model.Root} the new root element + */ +Modeling.prototype.makeProcess = function() { + + var processElement = this._create('root', { + type: 'bpmn:Process' + }); + + var context = { + newRoot: processElement + }; + + this._commandStack.execute('canvas.updateRoot', context); +}; +},{"108":108,"195":195,"21":21,"28":28,"29":29}],21:[function(_dereq_,module,exports){ +'use strict'; + +var find = _dereq_(203); + + +function getParents(element) { + + var parents = []; + + while (element) { + element = element.parent; + + if (element) { + parents.push(element); + } + } + + return parents; +} + +module.exports.getParents = getParents; + + +function getSharedParent(a, b) { + + var parentsA = getParents(a), + parentsB = getParents(b); + + return find(parentsA, function(parent) { + return parentsB.indexOf(parent) !== -1; + }); +} + +module.exports.getSharedParent = getSharedParent; +},{"203":203}],22:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var is = _dereq_(47).is; + +var CommandInterceptor = _dereq_(75); + + +function AppendBehavior(eventBus, elementFactory, bpmnRules) { + + CommandInterceptor.call(this, eventBus); + + // assign correct shape position unless already set + + this.preExecute('shape.append', function(context) { + + var source = context.source, + shape = context.shape; + + if (!context.position) { + + if (is(shape, 'bpmn:TextAnnotation')) { + context.position = { + x: source.x + source.width / 2 + 75, + y: source.y - (50) - shape.height / 2 + }; + } else { + context.position = { + x: source.x + source.width + 80 + shape.width / 2, + y: source.y + source.height / 2 + }; + } + } + }, true); +} + + +AppendBehavior.$inject = [ 'eventBus', 'elementFactory', 'bpmnRules' ]; + +inherits(AppendBehavior, CommandInterceptor); + +module.exports = AppendBehavior; +},{"195":195,"47":47,"75":75}],23:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var CommandInterceptor = _dereq_(75); + +var is = _dereq_(47).is; + +/** + * BPMN specific create behavior + */ +function CreateBehavior(eventBus, modeling) { + + CommandInterceptor.call(this, eventBus); + + + /** + * morph process into collaboration before adding + * participant onto collaboration + */ + + this.preExecute('shape.create', function(context) { + + var parent = context.parent, + shape = context.shape, + position = context.position; + + if (is(parent, 'bpmn:Process') && is(shape, 'bpmn:Participant')) { + + // this is going to detach the process root + // and set the returned collaboration element + // as the new root element + var collaborationElement = modeling.makeCollaboration(); + + // monkey patch the create context + // so that the participant is being dropped + // onto the new collaboration root instead + context.position = position; + context.parent = collaborationElement; + + context.processRoot = parent; + } + }, true); + + this.execute('shape.create', function(context) { + + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + context.oldProcessRef = shape.businessObject.processRef; + + // assign the participant processRef + shape.businessObject.processRef = processRoot.businessObject; + } + }, true); + + this.revert('shape.create', function(context) { + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + // assign the participant processRef + shape.businessObject.processRef = context.oldProcessRef; + } + }, true); + + this.postExecute('shape.create', function(context) { + + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + // process root is already detached at this point + var processChildren = processRoot.children.slice(); + modeling.moveShapes(processChildren, { x: 0, y: 0 }, shape); + } + }, true); + +} + +CreateBehavior.$inject = [ 'eventBus', 'modeling' ]; + +inherits(CreateBehavior, CommandInterceptor); + +module.exports = CreateBehavior; +},{"195":195,"47":47,"75":75}],24:[function(_dereq_,module,exports){ +'use strict'; + +var forEach = _dereq_(204), + inherits = _dereq_(195); + +var CommandInterceptor = _dereq_(75); + +var is = _dereq_(47).is, + getSharedParent = _dereq_(21).getSharedParent; + + +function DropBehavior(eventBus, modeling, bpmnRules) { + + CommandInterceptor.call(this, eventBus); + + // remove sequence flows that should not be allowed + // after a move operation + + this.postExecute('shapes.move', function(context) { + + var closure = context.closure, + allConnections = closure.allConnections; + + forEach(allConnections, function(c) { + + var source = c.source, + target = c.target; + + var replacementType, + remove; + + /** + * Check if incoming or outgoing connections + * can stay or could be substituted with an + * appropriate replacement. + * + * This holds true for SequenceFlow <> MessageFlow. + */ + + if (is(c, 'bpmn:SequenceFlow')) { + if (!bpmnRules.canConnectSequenceFlow(source, target)) { + remove = true; + } + + if (bpmnRules.canConnectMessageFlow(source, target)) { + replacementType = 'bpmn:MessageFlow'; + } + } + + // transform message flows into sequence flows, if possible + + if (is(c, 'bpmn:MessageFlow')) { + + if (!bpmnRules.canConnectMessageFlow(source, target)) { + remove = true; + } + + if (bpmnRules.canConnectSequenceFlow(source, target)) { + replacementType = 'bpmn:SequenceFlow'; + } + } + + if (is(c, 'bpmn:Association') && !bpmnRules.canConnectAssociation(source, target)) { + remove = true; + } + + + // remove invalid connection + if (remove) { + modeling.removeConnection(c); + } + + // replace SequenceFlow <> MessageFlow + + if (replacementType) { + modeling.createConnection(source, target, { + type: replacementType, + waypoints: c.waypoints.slice() + }, getSharedParent(source, target)); + } + }); + }, true); +} + +inherits(DropBehavior, CommandInterceptor); + +DropBehavior.$inject = [ 'eventBus', 'modeling', 'bpmnRules' ]; + +module.exports = DropBehavior; +},{"195":195,"204":204,"21":21,"47":47,"75":75}],25:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(47).is; + + +function ModelingFeedback(eventBus, tooltips) { + + function showError(position, message) { + tooltips.add({ + position: { + x: position.x + 5, + y: position.y + 5 + }, + type: 'error', + timeout: 2000, + html: '
    ' + message + '
    ' + }); + } + + eventBus.on([ 'shape.move.rejected', 'create.rejected' ], function(event) { + + var context = event.context, + shape = context.shape, + target = context.target; + + if (is(target, 'bpmn:Collaboration') && is(shape, 'bpmn:FlowNode')) { + showError(event, 'flow elements must be children of pools/participants'); + } + }); + +} + + +ModelingFeedback.$inject = [ 'eventBus', 'tooltips' ]; + +module.exports = ModelingFeedback; +},{"47":47}],26:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var CommandInterceptor = _dereq_(75); + +var is = _dereq_(47).is; + + +/** + * BPMN specific remove behavior + */ +function RemoveBehavior(eventBus, modeling) { + + CommandInterceptor.call(this, eventBus); + + + /** + * morph collaboration diagram into process diagram + * after the last participant has been removed + */ + + this.preExecute('shape.delete', function(context) { + + var shape = context.shape, + parent = shape.parent; + + // activate the behavior if the shape to be removed + // is a participant + if (is(shape, 'bpmn:Participant')) { + context.collaborationRoot = parent; + } + }, true); + + this.postExecute('shape.delete', function(context) { + + var collaborationRoot = context.collaborationRoot; + + if (collaborationRoot && !collaborationRoot.businessObject.participants.length) { + // replace empty collaboration with process diagram + modeling.makeProcess(); + } + }, true); + +} + +RemoveBehavior.$inject = [ 'eventBus', 'modeling' ]; + +inherits(RemoveBehavior, CommandInterceptor); + +module.exports = RemoveBehavior; +},{"195":195,"47":47,"75":75}],27:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ + 'appendBehavior', + 'createBehavior', + 'dropBehavior', + 'removeBehavior', + 'modelingFeedback' + ], + appendBehavior: [ 'type', _dereq_(22) ], + dropBehavior: [ 'type', _dereq_(24) ], + createBehavior: [ 'type', _dereq_(23) ], + removeBehavior: [ 'type', _dereq_(26) ], + modelingFeedback: [ 'type', _dereq_(25) ] +}; +},{"22":22,"23":23,"24":24,"25":25,"26":26}],28:[function(_dereq_,module,exports){ +'use strict'; + +var Collections = _dereq_(175); + + +function UpdateCanvasRootHandler(canvas, modeling) { + this._canvas = canvas; + this._modeling = modeling; +} + +UpdateCanvasRootHandler.$inject = [ 'canvas', 'modeling' ]; + +module.exports = UpdateCanvasRootHandler; + + +UpdateCanvasRootHandler.prototype.execute = function(context) { + + var canvas = this._canvas; + + var newRoot = context.newRoot, + newRootBusinessObject = newRoot.businessObject, + oldRoot = canvas.getRootElement(), + oldRootBusinessObject = oldRoot.businessObject, + bpmnDefinitions = oldRootBusinessObject.$parent, + diPlane = oldRootBusinessObject.di; + + // (1) replace process old <> new root + canvas.setRootElement(newRoot, true); + + // (2) update root elements + Collections.add(bpmnDefinitions.rootElements, newRootBusinessObject); + newRootBusinessObject.$parent = bpmnDefinitions; + + Collections.remove(bpmnDefinitions.rootElements, oldRootBusinessObject); + oldRootBusinessObject.$parent = null; + + // (3) wire di + oldRootBusinessObject.di = null; + + diPlane.bpmnElement = newRootBusinessObject; + newRootBusinessObject.di = diPlane; + + context.oldRoot = oldRoot; +}; + + +UpdateCanvasRootHandler.prototype.revert = function(context) { + + var canvas = this._canvas; + + var newRoot = context.newRoot, + newRootBusinessObject = newRoot.businessObject, + oldRoot = context.oldRoot, + oldRootBusinessObject = oldRoot.businessObject, + bpmnDefinitions = newRootBusinessObject.$parent, + diPlane = newRootBusinessObject.di; + + // (1) replace process old <> new root + canvas.setRootElement(oldRoot, true); + + // (2) update root elements + Collections.remove(bpmnDefinitions.rootElements, newRootBusinessObject); + newRootBusinessObject.$parent = null; + + Collections.add(bpmnDefinitions.rootElements, oldRootBusinessObject); + oldRootBusinessObject.$parent = bpmnDefinitions; + + // (3) wire di + newRootBusinessObject.di = null; + + diPlane.bpmnElement = oldRootBusinessObject; + oldRootBusinessObject.di = diPlane; +}; +},{"175":175}],29:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + pick = _dereq_(330), + keys = _dereq_(326); + +var DEFAULT_FLOW = 'default', + NAME = 'name', + ID = 'id'; + + +/** + * A handler that implements a BPMN 2.0 property update. + * + * This should be used to set simple properties on elements with + * an underlying BPMN business object. + * + * Use respective diagram-js provided handlers if you would + * like to perform automated modeling. + */ +function UpdatePropertiesHandler(elementRegistry) { + this._elementRegistry = elementRegistry; +} + +UpdatePropertiesHandler.$inject = [ 'elementRegistry' ]; + +module.exports = UpdatePropertiesHandler; + + +////// api ///////////////////////////////////////////// + +/** + * Updates a BPMN element with a list of new properties + * + * @param {Object} context + * @param {djs.model.Base} context.element the element to update + * @param {Object} context.properties a list of properties to set on the element's + * businessObject (the BPMN model element) + * + * @return {Array} the updated element + */ +UpdatePropertiesHandler.prototype.execute = function(context) { + + var element = context.element, + changed = [ element ]; + + if (!element) { + throw new Error('element required'); + } + + var elementRegistry = this._elementRegistry; + + var businessObject = element.businessObject, + properties = context.properties, + oldProperties = context.oldProperties || pick(businessObject, keys(properties)); + + if (ID in properties) { + elementRegistry.updateId(element, properties[ID]); + } + + // correctly indicate visual changes on default flow updates + if (DEFAULT_FLOW in properties) { + + if (properties[DEFAULT_FLOW]) { + changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id)); + } + + if (businessObject[DEFAULT_FLOW]) { + changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id)); + } + } + + if (NAME in properties && element.label) { + changed.push(element.label); + } + + // update properties + assign(businessObject, properties); + + + // store old values + context.oldProperties = oldProperties; + context.changed = changed; + + // indicate changed on objects affected by the update + return changed; +}; + +/** + * Reverts the update on a BPMN elements properties. + * + * @param {Object} context + * + * @return {djs.mode.Base} the updated element + */ +UpdatePropertiesHandler.prototype.revert = function(context) { + + var element = context.element, + oldProperties = context.oldProperties, + businessObject = element.businessObject, + elementRegistry = this._elementRegistry; + + assign(businessObject, context.oldProperties); + + if (ID in oldProperties) { + elementRegistry.updateId(element, oldProperties[ID]); + } + + return context.changed; +}; +},{"325":325,"326":326,"330":330}],30:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'modeling', 'bpmnUpdater', 'labelSupport' ], + __depends__: [ + _dereq_(14), + _dereq_(32), + _dereq_(27), + _dereq_(77), + _dereq_(160), + _dereq_(93) + ], + bpmnFactory: [ 'type', _dereq_(15) ], + bpmnUpdater: [ 'type', _dereq_(17) ], + elementFactory: [ 'type', _dereq_(18) ], + modeling: [ 'type', _dereq_(20) ], + labelSupport: [ 'type', _dereq_(19) ], + layouter: [ 'type', _dereq_(16) ], + connectionDocking: [ 'type', _dereq_(165) ] +}; + +},{"14":14,"15":15,"16":16,"160":160,"165":165,"17":17,"18":18,"19":19,"20":20,"27":27,"32":32,"77":77,"93":93}],31:[function(_dereq_,module,exports){ +'use strict'; + +var groupBy = _dereq_(205), + size = _dereq_(209), + find = _dereq_(203), + inherits = _dereq_(195); + +var getParents = _dereq_(21).getParents, + is = _dereq_(47).is, + getBusinessObject = _dereq_(47).getBusinessObject, + isExpanded = _dereq_(45).isExpanded; + + +var RuleProvider = _dereq_(145); + +/** + * BPMN specific modeling rule + */ +function BpmnRules(eventBus) { + RuleProvider.call(this, eventBus); +} + +inherits(BpmnRules, RuleProvider); + +BpmnRules.$inject = [ 'eventBus' ]; + +module.exports = BpmnRules; + +BpmnRules.prototype.init = function() { + + this.addRule('connection.create', function(context) { + var source = context.source, + target = context.target; + + return canConnect(source, target); + }); + + this.addRule('connection.reconnectStart', function(context) { + + var connection = context.connection, + source = context.hover || context.source, + target = connection.target; + + return canConnect(source, target, connection); + }); + + this.addRule('connection.reconnectEnd', function(context) { + + var connection = context.connection, + source = connection.source, + target = context.hover || context.target; + + return canConnect(source, target, connection); + }); + + this.addRule('connection.updateWaypoints', function(context) { + // OK! but visually ignore + return null; + }); + + this.addRule('shape.resize', function(context) { + + var shape = context.shape, + newBounds = context.newBounds; + + return canResize(shape, newBounds); + }); + + this.addRule('shapes.move', function(context) { + + var target = context.newParent, + shapes = context.shapes; + + return canMove(shapes, target); + }); + + this.addRule([ 'shape.create', 'shape.append' ], function(context) { + var target = context.parent, + shape = context.shape, + source = context.source; + + return canCreate(shape, target, source); + }); + +}; + +BpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow; + +BpmnRules.prototype.canConnectSequenceFlow = canConnectSequenceFlow; + +BpmnRules.prototype.canConnectAssociation = canConnectAssociation; + +BpmnRules.prototype.canMove = canMove; + +BpmnRules.prototype.canDrop = canDrop; + +BpmnRules.prototype.canCreate = canCreate; + +BpmnRules.prototype.canConnect = canConnect; + +BpmnRules.prototype.canResize = canResize; + +/** + * Utility functions for rule checking + */ + +function nonExistantOrLabel(element) { + return !element || isLabel(element); +} + +function isSame(a, b) { + return a === b; +} + +function getOrganizationalParent(element) { + + var bo = getBusinessObject(element); + + while (bo && !is(bo, 'bpmn:Process')) { + if (is(bo, 'bpmn:Participant')) { + return bo.processRef || bo; + } + + bo = bo.$parent; + } + + return bo; +} + +function isSameOrganization(a, b) { + var parentA = getOrganizationalParent(a), + parentB = getOrganizationalParent(b); + + return parentA === parentB; +} + +function isMessageFlowSource(element) { + return is(element, 'bpmn:InteractionNode') && ( + !is(element, 'bpmn:Event') || ( + is(element, 'bpmn:ThrowEvent') && + hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition') + ) + ); +} + +function isMessageFlowTarget(element) { + return is(element, 'bpmn:InteractionNode') && ( + !is(element, 'bpmn:Event') || ( + is(element, 'bpmn:CatchEvent') && + hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition') + ) + ); +} + +function getScopeParent(element) { + + var bo = getBusinessObject(element); + + if (is(bo, 'bpmn:Participant')) { + return null; + } + + while (bo) { + bo = bo.$parent; + + if (is(bo, 'bpmn:FlowElementsContainer')) { + return bo; + } + } + + return bo; +} + +function isSameScope(a, b) { + var scopeParentA = getScopeParent(a), + scopeParentB = getScopeParent(b); + + return scopeParentA && (scopeParentA === scopeParentB); +} + +function hasEventDefinition(element, eventDefinition) { + var bo = getBusinessObject(element); + + return !!find(bo.eventDefinitions || [], function(definition) { + return is(definition, eventDefinition); + }); +} + +function hasEventDefinitionOrNone(element, eventDefinition) { + var bo = getBusinessObject(element); + + return (bo.eventDefinitions || []).every(function(definition) { + return is(definition, eventDefinition); + }); +} + +function isSequenceFlowSource(element) { + return is(element, 'bpmn:FlowNode') && !is(element, 'bpmn:EndEvent') && !( + is(element, 'bpmn:IntermediateThrowEvent') && + hasEventDefinition(element, 'bpmn:LinkEventDefinition') + ); +} + +function isSequenceFlowTarget(element) { + return is(element, 'bpmn:FlowNode') && !is(element, 'bpmn:StartEvent') && !( + is(element, 'bpmn:IntermediateCatchEvent') && + hasEventDefinition(element, 'bpmn:LinkEventDefinition') + ); +} + +function isEventBasedTarget(element) { + return is(element, 'bpmn:ReceiveTask') || ( + is(element, 'bpmn:IntermediateCatchEvent') && ( + hasEventDefinition(element, 'bpmn:MessageEventDefinition') || + hasEventDefinition(element, 'bpmn:TimerEventDefinition') || + hasEventDefinition(element, 'bpmn:ConditionalEventDefinition') || + hasEventDefinition(element, 'bpmn:SignalEventDefinition') + ) + ); +} + +function isLabel(element) { + return element.labelTarget; +} + +function isConnection(element) { + return element.waypoints; +} + +function isParent(possibleParent, element) { + var allParents = getParents(element); + return allParents.indexOf(possibleParent) !== -1; +} + +function canConnect(source, target, connection) { + + if (nonExistantOrLabel(source) || nonExistantOrLabel(target)) { + return null; + } + + // See https://github.com/bpmn-io/bpmn-js/issues/178 + // as a workround we disallow connections with same + // target and source element. + // This rule must be removed if a auto layout for this + // connections is implemented. + if (isSame(source, target)) { + return false; + } + + if (canConnectMessageFlow(source, target) || + canConnectSequenceFlow(source, target)) { + + return true; + } + + if (is(connection, 'bpmn:Association')) { + return canConnectAssociation(source, target); + } + + return false; +} + +/** + * Can an element be dropped into the target element + * + * @return {Boolean} + */ +function canDrop(element, target) { + + // can move labels everywhere + if (isLabel(element) && !isConnection(target)) { + return true; + } + + // allow to create new participants on + // on existing collaboration and process diagrams + if (is(element, 'bpmn:Participant')) { + return is(target, 'bpmn:Process') || is(target, 'bpmn:Collaboration'); + } + + // drop flow elements onto flow element containers + // and participants + if (is(element, 'bpmn:FlowElement')) { + if (is(target, 'bpmn:FlowElementsContainer')) { + return isExpanded(target) !== false; + } + + return is(target, 'bpmn:Participant'); + } + + if (is(element, 'bpmn:Artifact')) { + return is(target, 'bpmn:Collaboration') || + is(target, 'bpmn:Participant') || + is(target, 'bpmn:Process'); + } + + if (is(element, 'bpmn:MessageFlow')) { + return is(target, 'bpmn:Collaboration'); + } + + return false; +} + +function canMove(elements, target) { + + // only move if they have the same parent + var sameParent = size(groupBy(elements, function(s) { return s.parent && s.parent.id; })) === 1; + + if (!sameParent) { + return false; + } + + if (!target) { + return true; + } + + return elements.every(function(element) { + return canDrop(element, target); + }); +} + +function canCreate(shape, target, source) { + + if (!target) { + return false; + } + + if (isLabel(target)) { + return null; + } + + if (isSame(source, target)) { + return false; + } + + // ensure we do not drop the element + // into source + if (source && isParent(source, target)) { + return false; + } + + return canDrop(shape, target); +} + +function canResize(shape, newBounds) { + if (is(shape, 'bpmn:SubProcess')) { + return isExpanded(shape) && ( + !newBounds || (newBounds.width >= 100 && newBounds.height >= 80) + ); + } + + if (is(shape, 'bpmn:Participant')) { + return !newBounds || (newBounds.width >= 100 && newBounds.height >= 80); + } + + if (is(shape, 'bpmn:TextAnnotation')) { + return true; + } + + return false; +} + +function canConnectAssociation(source, target) { + + // do not connect connections + if (isConnection(source) || isConnection(target)) { + return false; + } + + // connect if different parent + return !isParent(target, source) && + !isParent(source, target); +} + +function canConnectMessageFlow(source, target) { + + return isMessageFlowSource(source) && + isMessageFlowTarget(target) && + !isSameOrganization(source, target); +} + +function canConnectSequenceFlow(source, target) { + + return isSequenceFlowSource(source) && + isSequenceFlowTarget(target) && + isSameScope(source, target) && + !(is(source, 'bpmn:EventBasedGateway') && !isEventBasedTarget(target)); +} +},{"145":145,"195":195,"203":203,"205":205,"209":209,"21":21,"45":45,"47":47}],32:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(147) + ], + __init__: [ 'bpmnRules' ], + bpmnRules: [ 'type', _dereq_(31) ] +}; + +},{"147":147,"31":31}],33:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325); + +/** + * A palette provider for BPMN 2.0 elements. + */ +function PaletteProvider(palette, create, elementFactory, spaceTool, lassoTool) { + + this._create = create; + this._elementFactory = elementFactory; + this._spaceTool = spaceTool; + this._lassoTool = lassoTool; + + palette.registerProvider(this); +} + +module.exports = PaletteProvider; + +PaletteProvider.$inject = [ 'palette', 'create', 'elementFactory', 'spaceTool', 'lassoTool' ]; + + +PaletteProvider.prototype.getPaletteEntries = function(element) { + + var actions = {}, + create = this._create, + elementFactory = this._elementFactory, + spaceTool = this._spaceTool, + lassoTool = this._lassoTool; + + + function createAction(type, group, className, title, options) { + + function createListener(event) { + var shape = elementFactory.createShape(assign({ type: type }, options)); + + if (options) { + shape.businessObject.di.isExpanded = options.isExpanded; + } + + create.start(event, shape); + } + + var shortType = type.replace(/^bpmn\:/, ''); + + return { + group: group, + className: className, + title: title || 'Create ' + shortType, + action: { + dragstart: createListener, + click: createListener + } + }; + } + + function createParticipant(event, collapsed) { + create.start(event, elementFactory.createParticipantShape(collapsed)); + } + + assign(actions, { + 'lasso-tool': { + group: 'tools', + className: 'icon-lasso-tool', + title: 'Activate the lasso tool', + action: { + click: function(event) { + lassoTool.activateSelection(event); + } + } + }, + 'space-tool': { + group: 'tools', + className: 'icon-space-tool', + title: 'Activate the create/remove space tool', + action: { + click: function(event) { + spaceTool.activateSelection(event); + } + } + }, + 'tool-separator': { + group: 'tools', + separator: true + }, + 'create.start-event': createAction( + 'bpmn:StartEvent', 'event', 'icon-start-event-none' + ), + 'create.intermediate-event': createAction( + 'bpmn:IntermediateThrowEvent', 'event', 'icon-intermediate-event-none' + ), + 'create.end-event': createAction( + 'bpmn:EndEvent', 'event', 'icon-end-event-none' + ), + 'create.exclusive-gateway': createAction( + 'bpmn:ExclusiveGateway', 'gateway', 'icon-gateway-xor' + ), + 'create.task': createAction( + 'bpmn:Task', 'activity', 'icon-task' + ), + 'create.subprocess-collapsed': createAction( + 'bpmn:SubProcess', 'activity', 'icon-subprocess-collapsed', 'Create collapsed Sub Process', + { isExpanded: false } + ), + 'create.subprocess-expanded': createAction( + 'bpmn:SubProcess', 'activity', 'icon-subprocess-expanded', 'Create expanded SubProcess', + { isExpanded: true } + ), + 'create.participant-expanded': { + group: 'collaboration', + className: 'icon-participant', + title: 'Create Pool/Participant', + action: { + dragstart: createParticipant, + click: createParticipant + } + } + }); + + return actions; +}; + +},{"325":325}],34:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(137), + _dereq_(99) + ], + __init__: [ 'paletteProvider' ], + paletteProvider: [ 'type', _dereq_(33) ] +}; + +},{"137":137,"33":33,"99":99}],35:[function(_dereq_,module,exports){ +'use strict'; + +var forEach = _dereq_(204), + filter = _dereq_(202); + +var REPLACE_OPTIONS = _dereq_(36); + +var startEventReplace = REPLACE_OPTIONS.START_EVENT, + intermediateEventReplace = REPLACE_OPTIONS.INTERMEDIATE_EVENT, + endEventReplace = REPLACE_OPTIONS.END_EVENT, + gatewayReplace = REPLACE_OPTIONS.GATEWAY, + taskReplace = REPLACE_OPTIONS.TASK; + + +/** + * A replace menu provider that gives users the controls to choose + * and replace BPMN elements with each other. + * + * @param {BpmnFactory} bpmnFactory + * @param {Moddle} moddle + * @param {PopupMenu} popupMenu + * @param {Replace} replace + */ +function BpmnReplace(bpmnFactory, moddle, popupMenu, replace, selection) { + + /** + * Prepares a new business object for the replacement element + * and triggers the replace operation. + * + * @param {djs.model.Base} element + * @param {Object} target + * @return {djs.model.Base} the newly created element + */ + function replaceElement(element, target) { + + var type = target.type, + oldBusinessObject = element.businessObject, + businessObject = bpmnFactory.create(type); + + var newElement = { + type: type, + businessObject: businessObject + }; + + // initialize custom BPMN extensions + + if (target.eventDefinition) { + var eventDefinitions = businessObject.get('eventDefinitions'), + eventDefinition = moddle.create(target.eventDefinition); + + eventDefinitions.push(eventDefinition); + } + + if (target.instantiate !== undefined) { + businessObject.instantiate = target.instantiate; + } + + if (target.eventGatewayType !== undefined) { + businessObject.eventGatewayType = target.eventGatewayType; + } + + // copy size (for activities only) + if (oldBusinessObject.$instanceOf('bpmn:Activity')) { + + // TODO: need also to respect min/max Size + + newElement.width = element.width; + newElement.height = element.height; + } + + // TODO: copy other elligable properties from old business object + businessObject.name = oldBusinessObject.name; + + newElement = replace.replaceElement(element, newElement); + + selection.select(newElement); + + return newElement; + } + + + function getReplaceOptions(element) { + + var menuEntries = []; + var businessObject = element.businessObject; + + if (businessObject.$instanceOf('bpmn:StartEvent')) { + addEntries(startEventReplace, filterEvents); + } else + + if (businessObject.$instanceOf('bpmn:IntermediateCatchEvent') || + businessObject.$instanceOf('bpmn:IntermediateThrowEvent')) { + + addEntries(intermediateEventReplace, filterEvents); + } else + + if (businessObject.$instanceOf('bpmn:EndEvent')) { + + addEntries(endEventReplace, filterEvents); + } else + + if (businessObject.$instanceOf('bpmn:Gateway')) { + + addEntries(gatewayReplace, function(entry) { + + return entry.target.type !== businessObject.$type; + }); + } else + + if (businessObject.$instanceOf('bpmn:FlowNode')) { + addEntries(taskReplace, function(entry) { + return entry.target.type !== businessObject.$type; + }); + } + + function filterEvents(entry) { + + var target = entry.target; + + var eventDefinition = businessObject.eventDefinitions && businessObject.eventDefinitions[0].$type; + var isEventDefinitionEqual = target.eventDefinition == eventDefinition; + var isEventTypeEqual = businessObject.$type == target.type; + + return ((!isEventDefinitionEqual && isEventTypeEqual) || + !isEventTypeEqual) || + !(isEventDefinitionEqual && isEventTypeEqual); + } + + function addEntries(entries, filterFun) { + // Filter selected type from the array + var filteredEntries = filter(entries, filterFun); + + // Add entries to replace menu + forEach(filteredEntries, function(definition) { + + var entry = addMenuEntry(definition); + menuEntries.push(entry); + }); + } + + function addMenuEntry(definition) { + + return { + label: definition.label, + className: definition.className, + action: { + name: definition.actionName, + handler: function() { + replaceElement(element, definition.target); + } + } + }; + } + + return menuEntries; + } + + + // API + + this.openChooser = function(position, element) { + var entries = this.getReplaceOptions(element); + + popupMenu.open('replace-menu', position, entries); + }; + + this.getReplaceOptions = getReplaceOptions; + + this.replaceElement = replaceElement; +} + +BpmnReplace.$inject = [ 'bpmnFactory', 'moddle', 'popupMenu', 'replace', 'selection' ]; + +module.exports = BpmnReplace; +},{"202":202,"204":204,"36":36}],36:[function(_dereq_,module,exports){ +'use strict'; + +module.exports.START_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-intermediate-throwing', + className: 'icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-message-end', + className: 'icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message Start Event', + actionName: 'replace-with-message-start', + className: 'icon-start-event-message', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Start Event', + actionName: 'replace-with-timer-start', + className: 'icon-start-event-timer', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Conditional Start Event', + actionName: 'replace-with-conditional-start', + className: 'icon-start-event-condition', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Signal Start Event', + actionName: 'replace-with-signal-start', + className: 'icon-start-event-signal', + target: { + type: 'bpmn:StartEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + } +]; + +module.exports.INTERMEDIATE_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-message-intermediate-throw', + className: 'icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-message-end', + className: 'icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message Intermediate Catch Event', + actionName: 'replace-with-intermediate-catch', + className: 'icon-intermediate-event-catch-message', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Message Intermediate Throw Event', + actionName: 'replace-with-intermediate-throw', + className: 'icon-intermediate-event-throw-message', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Intermediate Catch Event', + actionName: 'replace-with-timer-intermediate-catch', + className: 'icon-intermediate-event-catch-timer', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Escalation Intermediate Catch Event', + actionName: 'replace-with-escalation-catch', + className: 'icon-intermediate-event-catch-escalation', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Conditional Intermediate Catch Event', + actionName: 'replace-with-conditional-intermediate-catch', + className: 'icon-intermediate-event-catch-condition', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Link Intermediate Catch Event', + actionName: 'replace-with-link-intermediate-catch', + className: 'icon-intermediate-event-catch-link', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:LinkEventDefinition' + } + }, + { + label: 'Link Intermediate Throw Event', + actionName: 'replace-with-link-intermediate-throw', + className: 'icon-intermediate-event-throw-link', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:LinkEventDefinition' + } + }, + { + label: 'Compensation Intermediate Throw Event', + actionName: 'replace-with-compensation-intermediate-throw', + className: 'icon-intermediate-event-throw-compensation', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Signal Throw Catch Event', + actionName: 'replace-with-throw-intermediate-catch', + className: 'icon-intermediate-event-catch-signal', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Signal Intermediate Throw Event', + actionName: 'replace-with-signal-intermediate-throw', + className: 'icon-intermediate-event-throw-signal', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + } +]; + +module.exports.END_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-message-intermediate-throw', + className: 'icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-none-end', + className: 'icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message End Event', + actionName: 'replace-with-message-end', + className: 'icon-end-event-message', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Escalation End Event', + actionName: 'replace-with-escalation-end', + className: 'icon-end-event-escalation', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Error End Event', + actionName: 'replace-with-error-end', + className: 'icon-end-event-error', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:ErrorEventDefinition' + } + }, + { + label: 'Cancel End Event', + actionName: 'replace-with-cancel-end', + className: 'icon-end-event-cancel', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:CancelEventDefinition' + } + }, + { + label: 'Compensation End Event', + actionName: 'replace-with-compensation-end', + className: 'icon-end-event-compensation', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Signal End Event', + actionName: 'replace-with-signal-end', + className: 'icon-end-event-signal', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Terminate End Event', + actionName: 'replace-with-terminate-end', + className: 'icon-end-event-terminate', + target: { + type: 'bpmn:EndEvent', + eventDefinition: 'bpmn:TerminateEventDefinition' + } + } +]; + +module.exports.GATEWAY = [ + { + label: 'Exclusive Gateway', + actionName: 'replace-with-exclusive-gateway', + className: 'icon-gateway-xor', + target: { + type: 'bpmn:ExclusiveGateway' + } + }, + { + label: 'Parallel Gateway', + actionName: 'replace-with-parallel-gateway', + className: 'icon-gateway-parallel', + target: { + type: 'bpmn:ParallelGateway' + } + }, + { + label: 'Inclusive Gateway', + actionName: 'replace-with-inclusive-gateway', + className: 'icon-gateway-or', + target: { + type: 'bpmn:InclusiveGateway' + } + }, + { + label: 'Complex Gateway', + actionName: 'replace-with-complex-gateway', + className: 'icon-gateway-complex', + target: { + type: 'bpmn:ComplexGateway' + } + }, + { + label: 'Event based Gateway', + actionName: 'replace-with-event-based-gateway', + className: 'icon-gateway-eventbased', + target: { + type: 'bpmn:EventBasedGateway', + instantiate: false, + eventGatewayType: 'Exclusive' + } + } + // Gateways deactivated until https://github.com/bpmn-io/bpmn-js/issues/194 + // { + // label: 'Event based instantiating Gateway', + // actionName: 'replace-with-exclusive-event-based-gateway', + // className: 'icon-exclusive-event-based', + // target: { + // type: 'bpmn:EventBasedGateway' + // }, + // options: { + // businessObject: { instantiate: true, eventGatewayType: 'Exclusive' } + // } + // }, + // { + // label: 'Parallel Event based instantiating Gateway', + // actionName: 'replace-with-parallel-event-based-instantiate-gateway', + // className: 'icon-parallel-event-based-instantiate-gateway', + // target: { + // type: 'bpmn:EventBasedGateway' + // }, + // options: { + // businessObject: { instantiate: true, eventGatewayType: 'Parallel' } + // } + // } +]; + + +module.exports.TASK = [ + { + label: 'Task', + actionName: 'replace-with-task', + className: 'icon-task', + target: { + type: 'bpmn:Task' + } + }, + { + label: 'Send Task', + actionName: 'replace-with-send-task', + className: 'icon-send', + target: { + type: 'bpmn:SendTask' + } + }, + { + label: 'Receive Task', + actionName: 'replace-with-receive-task', + className: 'icon-receive', + target: { + type: 'bpmn:ReceiveTask' + } + }, + { + label: 'User Task', + actionName: 'replace-with-user-task', + className: 'icon-user', + target: { + type: 'bpmn:UserTask' + } + }, + { + label: 'Manual Task', + actionName: 'replace-with-manual-task', + className: 'icon-manual', + target: { + type: 'bpmn:ManualTask' + } + }, + { + label: 'Business Rule Task', + actionName: 'replace-with-rule-task', + className: 'icon-business-rule', + target: { + type: 'bpmn:BusinessRuleTask' + } + }, + { + label: 'Service Task', + actionName: 'replace-with-service-task', + className: 'icon-service', + target: { + type: 'bpmn:ServiceTask' + } + }, + { + label: 'Script Task', + actionName: 'replace-with-script-task', + className: 'icon-script', + target: { + type: 'bpmn:ScriptTask' + } + } +]; +},{}],37:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(139), + _dereq_(141), + _dereq_(151) + ], + bpmnReplace: [ 'type', _dereq_(35) ] +}; +},{"139":139,"141":141,"151":151,"35":35}],38:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(195); + +var forEach = _dereq_(204); + +var getBoundingBox = _dereq_(177).getBBox; +var is = _dereq_(21).is; + +var Snapping = _dereq_(154), + SnapUtil = _dereq_(153); + +var is = _dereq_(47).is; + +var mid = SnapUtil.mid, + topLeft = SnapUtil.topLeft, + bottomRight = SnapUtil.bottomRight; + +var round = Math.round; + + +/** + * BPMN specific snapping functionality + * + * * snap on process elements if a pool is created inside a + * process diagram + * + * @param {EventBus} eventBus + * @param {Canvas} canvas + */ +function BpmnSnapping(eventBus, canvas) { + + // instantiate super + Snapping.call(this, eventBus, canvas); + + + /** + * Drop participant on process <> process elements snapping + */ + + function initParticipantSnapping(context, shape, elements) { + + if (!elements.length) { + return; + } + + var snapBox = getBoundingBox(elements.filter(function(e) { + return !e.labelTarget && !e.waypoints; + })); + + snapBox.x -= 50; + snapBox.y -= 20; + snapBox.width += 70; + snapBox.height += 40; + + // adjust shape height to include bounding box + shape.width = Math.max(shape.width, snapBox.width); + shape.height = Math.max(shape.height, snapBox.height); + + context.participantSnapBox = snapBox; + } + + function snapParticipant(snapBox, shape, event) { + + var shapeHalfWidth = shape.width / 2 - 30, + shapeHalfHeight = shape.height / 2; + + var currentTopLeft = { + x: event.x - shapeHalfWidth - 30, + y: event.y - shapeHalfHeight + }; + + var currentBottomRight = { + x: event.x + shapeHalfWidth + 30, + y: event.y + shapeHalfHeight + }; + + var snapTopLeft = snapBox, + snapBottomRight = bottomRight(snapBox); + + if (currentTopLeft.x >= snapTopLeft.x) { + event.x = snapTopLeft.x + 30 + shapeHalfWidth; + event.snapped = true; + } else + if (currentBottomRight.x <= snapBottomRight.x) { + event.x = snapBottomRight.x - 30 - shapeHalfWidth; + event.snapped = true; + } + + if (currentTopLeft.y >= snapTopLeft.y) { + event.y = snapTopLeft.y + shapeHalfHeight; + event.snapped = true; + } else + if (currentBottomRight.y <= snapBottomRight.y) { + event.y = snapBottomRight.y - shapeHalfHeight; + event.snapped = true; + } + } + + eventBus.on('create.start', function(event) { + + var context = event.context, + shape = context.shape, + rootElement = canvas.getRootElement(); + + // snap participant around existing elements (if any) + if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) { + + initParticipantSnapping(context, shape, rootElement.children); + } + }); + + eventBus.on([ 'create.move', 'create.end' ], 1500, function(event) { + + var context = event.context, + shape = context.shape, + participantSnapBox = context.participantSnapBox; + + if (!event.snapped && participantSnapBox) { + snapParticipant(participantSnapBox, shape, event); + } + }); + + eventBus.on('resize.start', 1500, function(event) { + var context = event.context, + shape = context.shape; + + if (is(shape, 'bpmn:SubProcess')) { + context.minDimensions = { width: 140, height: 120 }; + } + + if (is(shape, 'bpmn:Participant')) { + context.minDimensions = { width: 400, height: 200 }; + } + + if (is(shape, 'bpmn:TextAnnotation')) { + context.minDimensions = { width: 50, height: 50 }; + } + }); + +} + +inherits(BpmnSnapping, Snapping); + +BpmnSnapping.$inject = [ 'eventBus', 'canvas' ]; + +module.exports = BpmnSnapping; + + +BpmnSnapping.prototype.initSnap = function(event) { + + var context = event.context, + shape = context.shape, + shapeMid, + shapeBounds, + shapeTopLeft, + shapeBottomRight, + snapContext; + + + snapContext = Snapping.prototype.initSnap.call(this, event); + + if (is(shape, 'bpmn:Participant')) { + // assign higher priority for outer snaps on participants + snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]); + } + + + if (shape) { + + shapeMid = mid(shape, event); + + shapeBounds = { + width: shape.width, + height: shape.height, + x: isNaN(shape.x) ? round(shapeMid.x - shape.width / 2) : shape.x, + y: isNaN(shape.y) ? round(shapeMid.y - shape.height / 2) : shape.y, + }; + + shapeTopLeft = topLeft(shapeBounds); + shapeBottomRight = bottomRight(shapeBounds); + + snapContext.setSnapOrigin('top-left', { + x: shapeTopLeft.x - event.x, + y: shapeTopLeft.y - event.y + }); + + snapContext.setSnapOrigin('bottom-right', { + x: shapeBottomRight.x - event.x, + y: shapeBottomRight.y - event.y + }); + + + forEach(shape.outgoing, function(c) { + var docking = c.waypoints[0]; + + docking = docking.original || docking; + + snapContext.setSnapOrigin(c.id + '-docking', { + x: docking.x - event.x, + y: docking.y - event.y + }); + }); + + forEach(shape.incoming, function(c) { + var docking = c.waypoints[c.waypoints.length - 1]; + + docking = docking.original || docking; + + snapContext.setSnapOrigin(c.id + '-docking', { + x: docking.x - event.x, + y: docking.y - event.y + }); + }); + + } + + var source = context.source; + + if (source) { + snapContext.addDefaultSnap('mid', mid(source)); + } +}; + + +BpmnSnapping.prototype.addTargetSnaps = function(snapPoints, shape, target) { + + var siblings = this.getSiblings(shape, target); + + + forEach(siblings, function(s) { + snapPoints.add('mid', mid(s)); + + if (is(s, 'bpmn:Participant')) { + snapPoints.add('top-left', topLeft(s)); + snapPoints.add('bottom-right', bottomRight(s)); + } + }); + + forEach(shape.incoming, function(c) { + + if (siblings.indexOf(c.source) === -1) { + snapPoints.add('mid', mid(c.source)); + + var docking = c.waypoints[0]; + snapPoints.add(c.id + '-docking', docking.original || docking); + } + }); + + + forEach(shape.outgoing, function(c) { + + if (siblings.indexOf(c.target) === -1) { + snapPoints.add('mid', mid(c.target)); + + var docking = c.waypoints[c.waypoints.length - 1]; + snapPoints.add(c.id + '-docking', docking.original || docking); + } + }); + +}; +},{"153":153,"154":154,"177":177,"195":195,"204":204,"21":21,"47":47}],39:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'snapping' ], + snapping: [ 'type', _dereq_(38) ] +}; +},{"38":38}],40:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325), + map = _dereq_(207); + +var LabelUtil = _dereq_(46); + +var hasExternalLabel = LabelUtil.hasExternalLabel, + getExternalLabelBounds = LabelUtil.getExternalLabelBounds, + isExpanded = _dereq_(45).isExpanded, + elementToString = _dereq_(43).elementToString; + + +function elementData(semantic, attrs) { + return assign({ + id: semantic.id, + type: semantic.$type, + businessObject: semantic + }, attrs); +} + +function collectWaypoints(waypoints) { + return map(waypoints, function(p) { + return { x: p.x, y: p.y }; + }); +} + + +/** + * An importer that adds bpmn elements to the canvas + * + * @param {EventBus} eventBus + * @param {Canvas} canvas + * @param {ElementFactory} elementFactory + * @param {ElementRegistry} elementRegistry + */ +function BpmnImporter(eventBus, canvas, elementFactory, elementRegistry) { + this._eventBus = eventBus; + this._canvas = canvas; + + this._elementFactory = elementFactory; + this._elementRegistry = elementRegistry; +} + +BpmnImporter.$inject = [ 'eventBus', 'canvas', 'elementFactory', 'elementRegistry' ]; + +module.exports = BpmnImporter; + + +/** + * Add bpmn element (semantic) to the canvas onto the + * specified parent shape. + */ +BpmnImporter.prototype.add = function(semantic, parentElement) { + + var di = semantic.di, + element; + + // ROOT ELEMENT + // handle the special case that we deal with a + // invisible root element (process or collaboration) + if (di.$instanceOf('bpmndi:BPMNPlane')) { + + // add a virtual element (not being drawn) + element = this._elementFactory.createRoot(elementData(semantic)); + + this._canvas.setRootElement(element); + } + + // SHAPE + else if (di.$instanceOf('bpmndi:BPMNShape')) { + + var collapsed = !isExpanded(semantic); + var hidden = parentElement && (parentElement.hidden || parentElement.collapsed); + + var bounds = semantic.di.bounds; + + element = this._elementFactory.createShape(elementData(semantic, { + collapsed: collapsed, + hidden: hidden, + x: Math.round(bounds.x), + y: Math.round(bounds.y), + width: Math.round(bounds.width), + height: Math.round(bounds.height) + })); + + this._canvas.addShape(element, parentElement); + } + + // CONNECTION + else if (di.$instanceOf('bpmndi:BPMNEdge')) { + + var source = this._getSource(semantic), + target = this._getTarget(semantic); + + element = this._elementFactory.createConnection(elementData(semantic, { + source: source, + target: target, + waypoints: collectWaypoints(semantic.di.waypoint) + })); + + this._canvas.addConnection(element, parentElement); + } else { + throw new Error('unknown di ' + elementToString(di) + ' for element ' + elementToString(semantic)); + } + + // (optional) LABEL + if (hasExternalLabel(semantic)) { + this.addLabel(semantic, element); + } + + + this._eventBus.fire('bpmnElement.added', { element: element }); + + return element; +}; + + +/** + * add label for an element + */ +BpmnImporter.prototype.addLabel = function(semantic, element) { + var bounds = getExternalLabelBounds(semantic, element); + + var label = this._elementFactory.createLabel(elementData(semantic, { + id: semantic.id + '_label', + labelTarget: element, + type: 'label', + hidden: element.hidden, + x: Math.round(bounds.x), + y: Math.round(bounds.y), + width: Math.round(bounds.width), + height: Math.round(bounds.height) + })); + + return this._canvas.addShape(label, element.parent); +}; + +/** + * Return the drawn connection end based on the given side. + * + * @throws {Error} if the end is not yet drawn + */ +BpmnImporter.prototype._getEnd = function(semantic, side) { + + var element, + refSemantic, + type = semantic.$type; + + refSemantic = semantic[side + 'Ref']; + + // handle mysterious isMany DataAssociation#sourceRef + if (side === 'source' && type === 'bpmn:DataInputAssociation') { + refSemantic = refSemantic && refSemantic[0]; + } + + // fix source / target for DataInputAssociation / DataOutputAssociation + if (side === 'source' && type === 'bpmn:DataOutputAssociation' || + side === 'target' && type === 'bpmn:DataInputAssociation') { + + refSemantic = semantic.$parent; + } + + element = refSemantic && this._getElement(refSemantic); + + if (element) { + return element; + } + + if (refSemantic) { + throw new Error( + 'element ' + elementToString(refSemantic) + ' referenced by ' + + elementToString(semantic) + '#' + side + 'Ref not yet drawn'); + } else { + throw new Error(elementToString(semantic) + '#' + side + 'Ref not specified'); + } +}; + +BpmnImporter.prototype._getSource = function(semantic) { + return this._getEnd(semantic, 'source'); +}; + +BpmnImporter.prototype._getTarget = function(semantic) { + return this._getEnd(semantic, 'target'); +}; + + +BpmnImporter.prototype._getElement = function(semantic) { + return this._elementRegistry.get(semantic.id); +}; + +},{"207":207,"325":325,"43":43,"45":45,"46":46}],41:[function(_dereq_,module,exports){ +'use strict'; + +var filter = _dereq_(202), + find = _dereq_(203), + forEach = _dereq_(204); + +var Refs = _dereq_(356); + +var elementToString = _dereq_(43).elementToString; + +var diRefs = new Refs({ name: 'bpmnElement', enumerable: true }, { name: 'di' }); + +/** + * Returns true if an element has the given meta-model type + * + * @param {ModdleElement} element + * @param {String} type + * + * @return {Boolean} + */ +function is(element, type) { + return element.$instanceOf(type); +} + + +/** + * Find a suitable display candidate for definitions where the DI does not + * correctly specify one. + */ +function findDisplayCandidate(definitions) { + return find(definitions.rootElements, function(e) { + return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration'); + }); +} + + +function BpmnTreeWalker(handler) { + + // list of containers already walked + var handledProcesses = []; + + // list of elements to handle deferred to ensure + // prerequisites are drawn + var deferred = []; + + ///// Helpers ///////////////////////////////// + + function contextual(fn, ctx) { + return function(e) { + fn(e, ctx); + }; + } + + function visit(element, ctx) { + + var gfx = element.gfx; + + // avoid multiple rendering of elements + if (gfx) { + throw new Error('already rendered ' + elementToString(element)); + } + + // call handler + return handler.element(element, ctx); + } + + function visitRoot(element, diagram) { + return handler.root(element, diagram); + } + + function visitIfDi(element, ctx) { + try { + return element.di && visit(element, ctx); + } catch (e) { + logError(e.message, { element: element, error: e }); + + console.error('failed to import ' + elementToString(element)); + console.error(e); + } + } + + function logError(message, context) { + handler.error(message, context); + } + + ////// DI handling //////////////////////////// + + function registerDi(di) { + var bpmnElement = di.bpmnElement; + + if (bpmnElement) { + if (bpmnElement.di) { + logError('multiple DI elements defined for ' + elementToString(bpmnElement), { element: bpmnElement }); + } else { + diRefs.bind(bpmnElement, 'di'); + bpmnElement.di = di; + } + } else { + logError('no bpmnElement referenced in ' + elementToString(di), { element: di }); + } + } + + function handleDiagram(diagram) { + handlePlane(diagram.plane); + } + + function handlePlane(plane) { + registerDi(plane); + + forEach(plane.planeElement, handlePlaneElement); + } + + function handlePlaneElement(planeElement) { + registerDi(planeElement); + } + + + ////// Semantic handling ////////////////////// + + function handleDefinitions(definitions, diagram) { + // make sure we walk the correct bpmnElement + + var diagrams = definitions.diagrams; + + if (diagram && diagrams.indexOf(diagram) === -1) { + throw new Error('diagram not part of bpmn:Definitions'); + } + + if (!diagram && diagrams && diagrams.length) { + diagram = diagrams[0]; + } + + // no diagram -> nothing to import + if (!diagram) { + return; + } + + // load DI from selected diagram only + handleDiagram(diagram); + + + var plane = diagram.plane; + + if (!plane) { + throw new Error('no plane for ' + elementToString(diagram)); + } + + + var rootElement = plane.bpmnElement; + + // ensure we default to a suitable display candidate (process or collaboration), + // even if non is specified in DI + if (!rootElement) { + rootElement = findDisplayCandidate(definitions); + + if (!rootElement) { + return logError('no process or collaboration present to display'); + } else { + + logError('correcting missing bpmnElement on ' + elementToString(plane) + ' to ' + elementToString(rootElement)); + + // correct DI on the fly + plane.bpmnElement = rootElement; + registerDi(plane); + } + } + + + var ctx = visitRoot(rootElement, plane); + + if (is(rootElement, 'bpmn:Process')) { + handleProcess(rootElement, ctx); + } else if (is(rootElement, 'bpmn:Collaboration')) { + handleCollaboration(rootElement, ctx); + + // force drawing of everything not yet drawn that is part of the target DI + handleUnhandledProcesses(definitions.rootElements, ctx); + } else { + throw new Error('unsupported bpmnElement for ' + elementToString(plane) + ' : ' + elementToString(rootElement)); + } + + // handle all deferred elements + handleDeferred(deferred); + } + + function handleDeferred(deferred) { + forEach(deferred, function(d) { d(); }); + } + + function handleProcess(process, context) { + handleFlowElementsContainer(process, context); + handleIoSpecification(process.ioSpecification, context); + + handleArtifacts(process.artifacts, context); + + // log process handled + handledProcesses.push(process); + } + + function handleUnhandledProcesses(rootElements) { + + // walk through all processes that have not yet been drawn and draw them + // if they contain lanes with DI information. + // we do this to pass the free-floating lane test cases in the MIWG test suite + var processes = filter(rootElements, function(e) { + return is(e, 'bpmn:Process') && e.laneSets && handledProcesses.indexOf(e) === -1; + }); + + processes.forEach(contextual(handleProcess)); + } + + function handleMessageFlow(messageFlow, context) { + visitIfDi(messageFlow, context); + } + + function handleMessageFlows(messageFlows, context) { + forEach(messageFlows, contextual(handleMessageFlow, context)); + } + + function handleDataAssociation(association, context) { + visitIfDi(association, context); + } + + function handleDataInput(dataInput, context) { + visitIfDi(dataInput, context); + } + + function handleDataOutput(dataOutput, context) { + visitIfDi(dataOutput, context); + } + + function handleArtifact(artifact, context) { + + // bpmn:TextAnnotation + // bpmn:Group + // bpmn:Association + + visitIfDi(artifact, context); + } + + function handleArtifacts(artifacts, context) { + + forEach(artifacts, function(e) { + if (is(e, 'bpmn:Association')) { + deferred.push(function() { + handleArtifact(e, context); + }); + } else { + handleArtifact(e, context); + } + }); + } + + function handleIoSpecification(ioSpecification, context) { + + if (!ioSpecification) { + return; + } + + forEach(ioSpecification.dataInputs, contextual(handleDataInput, context)); + forEach(ioSpecification.dataOutputs, contextual(handleDataOutput, context)); + } + + function handleSubProcess(subProcess, context) { + handleFlowElementsContainer(subProcess, context); + handleArtifacts(subProcess.artifacts, context); + } + + function handleFlowNode(flowNode, context) { + var childCtx = visitIfDi(flowNode, context); + + if (is(flowNode, 'bpmn:SubProcess')) { + handleSubProcess(flowNode, childCtx || context); + } + } + + function handleSequenceFlow(sequenceFlow, context) { + visitIfDi(sequenceFlow, context); + } + + function handleDataElement(dataObject, context) { + visitIfDi(dataObject, context); + } + + function handleBoundaryEvent(dataObject, context) { + visitIfDi(dataObject, context); + } + + function handleLane(lane, context) { + var newContext = visitIfDi(lane, context); + + if (lane.childLaneSet) { + handleLaneSet(lane.childLaneSet, newContext || context); + } else { + var filterList = filter(lane.flowNodeRef, function(e) { + return e.$type !== 'bpmn:BoundaryEvent'; + }); + handleFlowElements(filterList, newContext || context); + } + } + + function handleLaneSet(laneSet, context) { + forEach(laneSet.lanes, contextual(handleLane, context)); + } + + function handleLaneSets(laneSets, context) { + forEach(laneSets, contextual(handleLaneSet, context)); + } + + function handleFlowElementsContainer(container, context) { + + if (container.laneSets) { + handleLaneSets(container.laneSets, context); + handleNonFlowNodes(container.flowElements); + } else { + handleFlowElements(container.flowElements, context); + } + } + + function handleNonFlowNodes(flowElements, context) { + forEach(flowElements, function(e) { + if (is(e, 'bpmn:SequenceFlow')) { + deferred.push(function() { + handleSequenceFlow(e, context); + }); + } else if (is(e, 'bpmn:BoundaryEvent')) { + deferred.unshift(function() { + handleBoundaryEvent(e, context); + }); + } else if (is(e, 'bpmn:DataObject')) { + // SKIP (assume correct referencing via DataObjectReference) + } else if (is(e, 'bpmn:DataStoreReference')) { + handleDataElement(e, context); + } else if (is(e, 'bpmn:DataObjectReference')) { + handleDataElement(e, context); + } + }); + } + + function handleFlowElements(flowElements, context) { + forEach(flowElements, function(e) { + if (is(e, 'bpmn:SequenceFlow')) { + deferred.push(function() { + handleSequenceFlow(e, context); + }); + } else if (is(e, 'bpmn:BoundaryEvent')) { + deferred.unshift(function() { + handleBoundaryEvent(e, context); + }); + } else if (is(e, 'bpmn:FlowNode')) { + handleFlowNode(e, context); + + if (is(e, 'bpmn:Activity')) { + + handleIoSpecification(e.ioSpecification, context); + + // defer handling of associations + deferred.push(function() { + forEach(e.dataInputAssociations, contextual(handleDataAssociation, context)); + forEach(e.dataOutputAssociations, contextual(handleDataAssociation, context)); + }); + } + } else if (is(e, 'bpmn:DataObject')) { + // SKIP (assume correct referencing via DataObjectReference) + } else if (is(e, 'bpmn:DataStoreReference')) { + handleDataElement(e, context); + } else if (is(e, 'bpmn:DataObjectReference')) { + handleDataElement(e, context); + } else { + logError( + 'unrecognized flowElement ' + elementToString(e) + ' in context ' + + (context ? elementToString(context.businessObject) : null), + { element: e, context: context }); + } + }); + } + + function handleParticipant(participant, context) { + var newCtx = visitIfDi(participant, context); + + var process = participant.processRef; + if (process) { + handleProcess(process, newCtx || context); + } + } + + function handleCollaboration(collaboration) { + + forEach(collaboration.participants, contextual(handleParticipant)); + + handleArtifacts(collaboration.artifacts); + + // handle message flows latest in the process + deferred.push(function() { + handleMessageFlows(collaboration.messageFlows); + }); + } + + + ///// API //////////////////////////////// + + return { + handleDefinitions: handleDefinitions + }; +} + +module.exports = BpmnTreeWalker; +},{"202":202,"203":203,"204":204,"356":356,"43":43}],42:[function(_dereq_,module,exports){ +'use strict'; + +var BpmnTreeWalker = _dereq_(41); + + +/** + * Import the definitions into a diagram. + * + * Errors and warnings are reported through the specified callback. + * + * @param {Diagram} diagram + * @param {ModdleElement} definitions + * @param {Function} done the callback, invoked with (err, [ warning ]) once the import is done + */ +function importBpmnDiagram(diagram, definitions, done) { + + var importer = diagram.get('bpmnImporter'), + eventBus = diagram.get('eventBus'); + + var error, + warnings = []; + + function parse(definitions) { + + var visitor = { + + root: function(element) { + return importer.add(element); + }, + + element: function(element, parentShape) { + return importer.add(element, parentShape); + }, + + error: function(message, context) { + warnings.push({ message: message, context: context }); + } + }; + + var walker = new BpmnTreeWalker(visitor); + + // import + walker.handleDefinitions(definitions); + } + + eventBus.fire('import.start'); + + try { + parse(definitions); + } catch (e) { + error = e; + } + + eventBus.fire(error ? 'import.error' : 'import.success', { error: error, warnings: warnings }); + done(error, warnings); +} + +module.exports.importBpmnDiagram = importBpmnDiagram; +},{"41":41}],43:[function(_dereq_,module,exports){ +'use strict'; + +module.exports.elementToString = function(e) { + if (!e) { + return ''; + } + + return '<' + e.$type + (e.id ? ' id="' + e.id : '') + '" />'; +}; +},{}],44:[function(_dereq_,module,exports){ +module.exports = { + bpmnImporter: [ 'type', _dereq_(40) ] +}; +},{"40":40}],45:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(47).is, + getBusinessObject = _dereq_(47).getBusinessObject; + +module.exports.isExpanded = function(element) { + + if (is(element, 'bpmn:CallActivity')) { + return false; + } + + if (is(element, 'bpmn:SubProcess')) { + return getBusinessObject(element).di.isExpanded; + } + + if (is(element, 'bpmn:Participant')) { + return !!getBusinessObject(element).processRef; + } + + return true; +}; + +},{"47":47}],46:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325); + + +var DEFAULT_LABEL_SIZE = module.exports.DEFAULT_LABEL_SIZE = { + width: 90, + height: 20 +}; + + +/** + * Returns true if the given semantic has an external label + * + * @param {BpmnElement} semantic + * @return {Boolean} true if has label + */ +module.exports.hasExternalLabel = function(semantic) { + + return semantic.$instanceOf('bpmn:Event') || + semantic.$instanceOf('bpmn:Gateway') || + semantic.$instanceOf('bpmn:DataStoreReference') || + semantic.$instanceOf('bpmn:DataObjectReference') || + semantic.$instanceOf('bpmn:SequenceFlow') || + semantic.$instanceOf('bpmn:MessageFlow'); +}; + + +/** + * Get the middle of a number of waypoints + * + * @param {Array} waypoints + * @return {Point} the mid point + */ +var getWaypointsMid = module.exports.getWaypointsMid = function(waypoints) { + + var mid = waypoints.length / 2 - 1; + + var first = waypoints[Math.floor(mid)]; + var second = waypoints[Math.ceil(mid + 0.01)]; + + return { + x: first.x + (second.x - first.x) / 2, + y: first.y + (second.y - first.y) / 2 + }; +}; + + +var getExternalLabelMid = module.exports.getExternalLabelMid = function(element) { + + if (element.waypoints) { + return getWaypointsMid(element.waypoints); + } else { + return { + x: element.x + element.width / 2, + y: element.y + element.height + DEFAULT_LABEL_SIZE.height / 2 + }; + } +}; + +/** + * Returns the bounds of an elements label, parsed from the elements DI or + * generated from its bounds. + * + * @param {BpmnElement} semantic + * @param {djs.model.Base} element + */ +module.exports.getExternalLabelBounds = function(semantic, element) { + + var mid, + size, + bounds, + di = semantic.di, + label = di.label; + + if (label && label.bounds) { + bounds = label.bounds; + + size = { + width: Math.max(DEFAULT_LABEL_SIZE.width, bounds.width), + height: bounds.height + }; + + mid = { + x: bounds.x + bounds.width / 2, + y: bounds.y + bounds.height / 2 + }; + } else { + + mid = getExternalLabelMid(element); + + size = DEFAULT_LABEL_SIZE; + } + + return assign({ + x: mid.x - size.width / 2, + y: mid.y - size.height / 2 + }, size); +}; +},{"325":325}],47:[function(_dereq_,module,exports){ +'use strict'; + +/** + * Is an element of the given BPMN type? + * + * @param {djs.model.Base|ModdleElement} element + * @param {String} type + * + * @return {Boolean} + */ +function is(element, type) { + var bo = getBusinessObject(element); + + return bo && bo.$instanceOf(type); +} + +module.exports.is = is; + + +/** + * Return the business object for a given element. + * + * @param {djs.model.Base|ModdleElement} element + * + * @return {ModdleElement} + */ +function getBusinessObject(element) { + return (element && element.businessObject) || element; +} + +module.exports.getBusinessObject = getBusinessObject; + +},{}],48:[function(_dereq_,module,exports){ +module.exports = _dereq_(51); +},{"51":51}],49:[function(_dereq_,module,exports){ +'use strict'; + +var isString = _dereq_(322), + isFunction = _dereq_(317), + assign = _dereq_(325); + +var Moddle = _dereq_(57), + XmlReader = _dereq_(53), + XmlWriter = _dereq_(54); + +/** + * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files. + * + * @class BpmnModdle + * @extends Moddle + * + * @param {Object|Array} packages to use for instantiating the model + * @param {Object} [options] additional options to pass over + */ +function BpmnModdle(packages, options) { + Moddle.call(this, packages, options); +} + +BpmnModdle.prototype = Object.create(Moddle.prototype); + +module.exports = BpmnModdle; + + +/** + * Instantiates a BPMN model tree from a given xml string. + * + * @param {String} xmlStr + * @param {String} [typeName='bpmn:Definitions'] name of the root element + * @param {Object} [options] options to pass to the underlying reader + * @param {Function} done callback that is invoked with (err, result, parseContext) + * once the import completes + */ +BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options, done) { + + if (!isString(typeName)) { + done = options; + options = typeName; + typeName = 'bpmn:Definitions'; + } + + if (isFunction(options)) { + done = options; + options = {}; + } + + var reader = new XmlReader(assign({ model: this, lax: true }, options)); + var rootHandler = reader.handler(typeName); + + reader.fromXML(xmlStr, rootHandler, done); +}; + + +/** + * Serializes a BPMN 2.0 object tree to XML. + * + * @param {String} element the root element, typically an instance of `bpmn:Definitions` + * @param {Object} [options] to pass to the underlying writer + * @param {Function} done callback invoked with (err, xmlStr) once the import completes + */ +BpmnModdle.prototype.toXML = function(element, options, done) { + + if (isFunction(options)) { + done = options; + options = {}; + } + + var writer = new XmlWriter(options); + try { + var result = writer.toXML(element); + done(null, result); + } catch (e) { + done(e); + } +}; + +},{"317":317,"322":322,"325":325,"53":53,"54":54,"57":57}],50:[function(_dereq_,module,exports){ +'use strict'; + +var ID_PATTERN = /^(.*:)?id$/; + +/** + * Extends the bpmn instance with id support. + * + * @example + * + * var moddle, ids; + * + * require('id-support').extend(moddle, ids); + * + * moddle.ids.next(); // create a next id + * moddle.ids; // ids instance + * + * // claims id as used + * moddle.create('foo:Bar', { id: 'fooobar1' }); + * + * + * @param {Moddle} model + * @param {Ids} ids + * + * @return {Moddle} the extended moddle instance + */ +module.exports.extend = function(model, ids) { + + var set = model.properties.set; + + // do not reinitialize setter + // unless it is already initialized + if (!model.ids) { + + model.properties.set = function(target, property, value) { + + // ensure we log used ids once they are assigned + // to model elements + if (ID_PATTERN.test(property)) { + + var assigned = model.ids.assigned(value); + if (assigned && assigned !== target) { + throw new Error('id <' + value + '> already used'); + } + + model.ids.claim(value, target); + } + + set.call(this, target, property, value); + }; + } + + model.ids = ids; + + return model; +}; +},{}],51:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(325); + +var BpmnModdle = _dereq_(49); + +var packages = { + bpmn: _dereq_(66), + bpmndi: _dereq_(67), + dc: _dereq_(68), + di: _dereq_(69) +}; + +module.exports = function(additionalPackages, options) { + return new BpmnModdle(assign({}, packages, additionalPackages), options); +}; +},{"325":325,"49":49,"66":66,"67":67,"68":68,"69":69}],52:[function(_dereq_,module,exports){ +'use strict'; + +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +function lower(string) { + return string.charAt(0).toLowerCase() + string.slice(1); +} + +function hasLowerCaseAlias(pkg) { + return pkg.xml && pkg.xml.tagAlias === 'lowerCase'; +} + + +module.exports.aliasToName = function(alias, pkg) { + if (hasLowerCaseAlias(pkg)) { + return capitalize(alias); + } else { + return alias; + } +}; + +module.exports.nameToAlias = function(name, pkg) { + if (hasLowerCaseAlias(pkg)) { + return lower(name); + } else { + return name; + } +}; + +module.exports.DEFAULT_NS_MAP = { + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance' +}; + +module.exports.XSI_TYPE = 'xsi:type'; +},{}],53:[function(_dereq_,module,exports){ +'use strict'; + +var reduce = _dereq_(208), + forEach = _dereq_(204), + find = _dereq_(203), + assign = _dereq_(325), + defer = _dereq_(215); + +var Stack = _dereq_(56), + SaxParser = _dereq_(55).parser, + Moddle = _dereq_(57), + parseNameNs = _dereq_(62).parseName, + Types = _dereq_(65), + coerceType = Types.coerceType, + isSimpleType = Types.isSimple, + common = _dereq_(52), + XSI_TYPE = common.XSI_TYPE, + XSI_URI = common.DEFAULT_NS_MAP.xsi, + aliasToName = common.aliasToName; + +function parseNodeAttributes(node) { + var nodeAttrs = node.attributes; + + return reduce(nodeAttrs, function(result, v, k) { + var name, ns; + + if (!v.local) { + name = v.prefix; + } else { + ns = parseNameNs(v.name, v.prefix); + name = ns.name; + } + + result[name] = v.value; + return result; + }, {}); +} + +function normalizeType(node, attr, model) { + var nameNs = parseNameNs(attr.value); + + var uri = node.ns[nameNs.prefix || ''], + localName = nameNs.localName, + pkg = uri && model.getPackage(uri), + typePrefix; + + if (pkg) { + typePrefix = pkg.xml && pkg.xml.typePrefix; + + if (typePrefix && localName.indexOf(typePrefix) === 0) { + localName = localName.slice(typePrefix.length); + } + + attr.value = pkg.prefix + ':' + localName; + } +} + +/** + * Normalizes namespaces for a node given an optional default namespace and a + * number of mappings from uris to default prefixes. + * + * @param {XmlNode} node + * @param {Model} model the model containing all registered namespaces + * @param {Uri} defaultNsUri + */ +function normalizeNamespaces(node, model, defaultNsUri) { + var uri, prefix; + + uri = node.uri || defaultNsUri; + + if (uri) { + var pkg = model.getPackage(uri); + + if (pkg) { + prefix = pkg.prefix; + } else { + prefix = node.prefix; + } + + node.prefix = prefix; + node.uri = uri; + } + + forEach(node.attributes, function(attr) { + + // normalize xsi:type attributes because the + // assigned type may or may not be namespace prefixed + if (attr.uri === XSI_URI && attr.local === 'type') { + normalizeType(node, attr, model); + } + + normalizeNamespaces(attr, model, null); + }); +} + + +/** + * A parse context. + * + * @class + * + * @param {Object} options + * @param {ElementHandler} options.parseRoot the root handler for parsing a document + * @param {boolean} [options.lax=false] whether or not to ignore invalid elements + */ +function Context(options) { + + /** + * @property {ElementHandler} parseRoot + */ + + /** + * @property {Boolean} lax + */ + + assign(this, options); + + var elementsById = this.elementsById = {}; + var references = this.references = []; + var warnings = this.warnings = []; + + this.addReference = function(reference) { + references.push(reference); + }; + + this.addElement = function(id, element) { + + if (!id || !element) { + throw new Error('[xml-reader] id or ctx must not be null'); + } + + elementsById[id] = element; + }; + + this.addWarning = function (w) { + warnings.push(w); + }; +} + +function BaseHandler() {} + +BaseHandler.prototype.handleEnd = function() {}; +BaseHandler.prototype.handleText = function() {}; +BaseHandler.prototype.handleNode = function() {}; + + +/** + * A simple pass through handler that does nothing except for + * ignoring all input it receives. + * + * This is used to ignore unknown elements and + * attributes. + */ +function NoopHandler() { } + +NoopHandler.prototype = new BaseHandler(); + +NoopHandler.prototype.handleNode = function() { + return this; +}; + +function BodyHandler() {} + +BodyHandler.prototype = new BaseHandler(); + +BodyHandler.prototype.handleText = function(text) { + this.body = (this.body || '') + text; +}; + +function ReferenceHandler(property, context) { + this.property = property; + this.context = context; +} + +ReferenceHandler.prototype = new BodyHandler(); + +ReferenceHandler.prototype.handleNode = function(node) { + + if (this.element) { + throw new Error('expected no sub nodes'); + } else { + this.element = this.createReference(node); + } + + return this; +}; + +ReferenceHandler.prototype.handleEnd = function() { + this.element.id = this.body; +}; + +ReferenceHandler.prototype.createReference = function() { + return { + property: this.property.ns.name, + id: '' + }; +}; + +function ValueHandler(propertyDesc, element) { + this.element = element; + this.propertyDesc = propertyDesc; +} + +ValueHandler.prototype = new BodyHandler(); + +ValueHandler.prototype.handleEnd = function() { + + var value = this.body, + element = this.element, + propertyDesc = this.propertyDesc; + + value = coerceType(propertyDesc.type, value); + + if (propertyDesc.isMany) { + element.get(propertyDesc.name).push(value); + } else { + element.set(propertyDesc.name, value); + } +}; + + +function BaseElementHandler() {} + +BaseElementHandler.prototype = Object.create(BodyHandler.prototype); + +BaseElementHandler.prototype.handleNode = function(node) { + var parser = this, + element = this.element, + id; + + if (!element) { + element = this.element = this.createElement(node); + id = element.id; + + if (id) { + this.context.addElement(id, element); + } + } else { + parser = this.handleChild(node); + } + + return parser; +}; + +/** + * @class XMLReader.ElementHandler + * + */ +function ElementHandler(model, type, context) { + this.model = model; + this.type = model.getType(type); + this.context = context; +} + +ElementHandler.prototype = new BaseElementHandler(); + +ElementHandler.prototype.addReference = function(reference) { + this.context.addReference(reference); +}; + +ElementHandler.prototype.handleEnd = function() { + + var value = this.body, + element = this.element, + descriptor = element.$descriptor, + bodyProperty = descriptor.bodyProperty; + + if (bodyProperty && value !== undefined) { + value = coerceType(bodyProperty.type, value); + element.set(bodyProperty.name, value); + } +}; + +/** + * Create an instance of the model from the given node. + * + * @param {Element} node the xml node + */ +ElementHandler.prototype.createElement = function(node) { + var attributes = parseNodeAttributes(node), + Type = this.type, + descriptor = Type.$descriptor, + context = this.context, + instance = new Type({}); + + forEach(attributes, function(value, name) { + + var prop = descriptor.propertiesByName[name]; + + if (prop && prop.isReference) { + context.addReference({ + element: instance, + property: prop.ns.name, + id: value + }); + } else { + if (prop) { + value = coerceType(prop.type, value); + } + + instance.set(name, value); + } + }); + + return instance; +}; + +ElementHandler.prototype.getPropertyForNode = function(node) { + + var nameNs = parseNameNs(node.local, node.prefix); + + var type = this.type, + model = this.model, + descriptor = type.$descriptor; + + var propertyName = nameNs.name, + property = descriptor.propertiesByName[propertyName], + elementTypeName, + elementType, + typeAnnotation; + + // search for properties by name first + + if (property) { + + if (property.serialize === XSI_TYPE) { + typeAnnotation = node.attributes[XSI_TYPE]; + + // xsi type is optional, if it does not exists the + // default type is assumed + if (typeAnnotation) { + + elementTypeName = typeAnnotation.value; + + // TODO: extract real name from attribute + elementType = model.getType(elementTypeName); + + return assign({}, property, { effectiveType: elementType.$descriptor.name }); + } + } + + // search for properties by name first + return property; + } + + + var pkg = model.getPackage(nameNs.prefix); + + if (pkg) { + elementTypeName = nameNs.prefix + ':' + aliasToName(nameNs.localName, descriptor.$pkg); + elementType = model.getType(elementTypeName); + + // search for collection members later + property = find(descriptor.properties, function(p) { + return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type); + }); + + if (property) { + return assign({}, property, { effectiveType: elementType.$descriptor.name }); + } + } else { + // parse unknown element (maybe extension) + property = find(descriptor.properties, function(p) { + return !p.isReference && !p.isAttribute && p.type === 'Element'; + }); + + if (property) { + return property; + } + } + + throw new Error('unrecognized element <' + nameNs.name + '>'); +}; + +ElementHandler.prototype.toString = function() { + return 'ElementDescriptor[' + this.type.$descriptor.name + ']'; +}; + +ElementHandler.prototype.valueHandler = function(propertyDesc, element) { + return new ValueHandler(propertyDesc, element); +}; + +ElementHandler.prototype.referenceHandler = function(propertyDesc) { + return new ReferenceHandler(propertyDesc, this.context); +}; + +ElementHandler.prototype.handler = function(type) { + if (type === 'Element') { + return new GenericElementHandler(this.model, type, this.context); + } else { + return new ElementHandler(this.model, type, this.context); + } +}; + +/** + * Handle the child element parsing + * + * @param {Element} node the xml node + */ +ElementHandler.prototype.handleChild = function(node) { + var propertyDesc, type, element, childHandler; + + propertyDesc = this.getPropertyForNode(node); + element = this.element; + + type = propertyDesc.effectiveType || propertyDesc.type; + + if (isSimpleType(type)) { + return this.valueHandler(propertyDesc, element); + } + + if (propertyDesc.isReference) { + childHandler = this.referenceHandler(propertyDesc).handleNode(node); + } else { + childHandler = this.handler(type).handleNode(node); + } + + var newElement = childHandler.element; + + // child handles may decide to skip elements + // by not returning anything + if (newElement !== undefined) { + + if (propertyDesc.isMany) { + element.get(propertyDesc.name).push(newElement); + } else { + element.set(propertyDesc.name, newElement); + } + + if (propertyDesc.isReference) { + assign(newElement, { + element: element + }); + + this.context.addReference(newElement); + } else { + // establish child -> parent relationship + newElement.$parent = element; + } + } + + return childHandler; +}; + + +function GenericElementHandler(model, type, context) { + this.model = model; + this.context = context; +} + +GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype); + +GenericElementHandler.prototype.createElement = function(node) { + + var name = node.name, + prefix = node.prefix, + uri = node.ns[prefix], + attributes = node.attributes; + + return this.model.createAny(name, uri, attributes); +}; + +GenericElementHandler.prototype.handleChild = function(node) { + + var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node), + element = this.element; + + var newElement = handler.element, + children; + + if (newElement !== undefined) { + children = element.$children = element.$children || []; + children.push(newElement); + + // establish child -> parent relationship + newElement.$parent = element; + } + + return handler; +}; + +GenericElementHandler.prototype.handleText = function(text) { + this.body = this.body || '' + text; +}; + +GenericElementHandler.prototype.handleEnd = function() { + if (this.body) { + this.element.$body = this.body; + } +}; + +/** + * A reader for a meta-model + * + * @param {Object} options + * @param {Model} options.model used to read xml files + * @param {Boolean} options.lax whether to make parse errors warnings + */ +function XMLReader(options) { + + if (options instanceof Moddle) { + options = { + model: options + }; + } + + assign(this, { lax: false }, options); +} + + +XMLReader.prototype.fromXML = function(xml, rootHandler, done) { + + var model = this.model, + lax = this.lax, + context = new Context({ + parseRoot: rootHandler + }); + + var parser = new SaxParser(true, { xmlns: true, trim: true }), + stack = new Stack(); + + rootHandler.context = context; + + // push root handler + stack.push(rootHandler); + + + function resolveReferences() { + + var elementsById = context.elementsById; + var references = context.references; + + var i, r; + + for (i = 0; !!(r = references[i]); i++) { + var element = r.element; + var reference = elementsById[r.id]; + var property = element.$descriptor.propertiesByName[r.property]; + + if (!reference) { + context.addWarning({ + message: 'unresolved reference <' + r.id + '>', + element: r.element, + property: r.property, + value: r.id + }); + } + + if (property.isMany) { + var collection = element.get(property.name), + idx = collection.indexOf(r); + + if (!reference) { + // remove unresolvable reference + collection.splice(idx, 1); + } else { + // update reference + collection[idx] = reference; + } + } else { + element.set(property.name, reference); + } + } + } + + function handleClose(tagName) { + stack.pop().handleEnd(); + } + + function handleOpen(node) { + var handler = stack.peek(); + + normalizeNamespaces(node, model); + + try { + stack.push(handler.handleNode(node)); + } catch (e) { + + var line = this.line, + column = this.column; + + var message = + 'unparsable content <' + node.name + '> detected\n\t' + + 'line: ' + line + '\n\t' + + 'column: ' + column + '\n\t' + + 'nested error: ' + e.message; + + if (lax) { + context.addWarning({ + message: message, + error: e + }); + + console.warn('could not parse node'); + console.warn(e); + + stack.push(new NoopHandler()); + } else { + console.error('could not parse document'); + console.error(e); + + throw new Error(message); + } + } + } + + function handleText(text) { + stack.peek().handleText(text); + } + + parser.onopentag = handleOpen; + parser.oncdata = parser.ontext = handleText; + parser.onclosetag = handleClose; + parser.onend = resolveReferences; + + // deferred parse XML to make loading really ascnchronous + // this ensures the execution environment (node or browser) + // is kept responsive and that certain optimization strategies + // can kick in + defer(function() { + var error; + + try { + parser.write(xml).close(); + } catch (e) { + error = e; + } + + done(error, error ? undefined : rootHandler.element, context); + }); +}; + +XMLReader.prototype.handler = function(name) { + return new ElementHandler(this.model, name); +}; + +module.exports = XMLReader; +module.exports.ElementHandler = ElementHandler; +},{"203":203,"204":204,"208":208,"215":215,"325":325,"52":52,"55":55,"56":56,"57":57,"62":62,"65":65}],54:[function(_dereq_,module,exports){ +'use strict'; + +var map = _dereq_(207), + forEach = _dereq_(204), + isString = _dereq_(322), + filter = _dereq_(202), + assign = _dereq_(325); + +var Types = _dereq_(65), + parseNameNs = _dereq_(62).parseName, + common = _dereq_(52), + nameToAlias = common.nameToAlias; + +var XML_PREAMBLE = '\n', + ESCAPE_CHARS = /(<|>|'|"|&|\n\r|\n)/g, + DEFAULT_NS_MAP = common.DEFAULT_NS_MAP, + XSI_TYPE = common.XSI_TYPE; + + +function nsName(ns) { + if (isString(ns)) { + return ns; + } else { + return (ns.prefix ? ns.prefix + ':' : '') + ns.localName; + } +} + +function getElementNs(ns, descriptor) { + if (descriptor.isGeneric) { + return descriptor.name; + } else { + return assign({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns); + } +} + +function getPropertyNs(ns, descriptor) { + return assign({ localName: descriptor.ns.localName }, ns); +} + +function getSerializableProperties(element) { + var descriptor = element.$descriptor; + + return filter(descriptor.properties, function(p) { + var name = p.name; + + // do not serialize defaults + if (!element.hasOwnProperty(name)) { + return false; + } + + var value = element[name]; + + // do not serialize default equals + if (value === p.default) { + return false; + } + + return p.isMany ? value.length : true; + }); +} + +var ESCAPE_MAP = { + '\n': '10', + '\n\r': '10', + '"': '34', + '\'': '39', + '<': '60', + '>': '62', + '&': '38' +}; + +/** + * Escape a string attribute to not contain any bad values (line breaks, '"', ...) + * + * @param {String} str the string to escape + * @return {String} the escaped string + */ +function escapeAttr(str) { + + // ensure we are handling strings here + str = isString(str) ? str : '' + str; + + return str.replace(ESCAPE_CHARS, function(str) { + return '&#' + ESCAPE_MAP[str] + ';'; + }); +} + +function filterAttributes(props) { + return filter(props, function(p) { return p.isAttr; }); +} + +function filterContained(props) { + return filter(props, function(p) { return !p.isAttr; }); +} + + +function ReferenceSerializer(parent, ns) { + this.ns = ns; +} + +ReferenceSerializer.prototype.build = function(element) { + this.element = element; + return this; +}; + +ReferenceSerializer.prototype.serializeTo = function(writer) { + writer + .appendIndent() + .append('<' + nsName(this.ns) + '>' + this.element.id + '') + .appendNewLine(); +}; + +function BodySerializer() {} + +BodySerializer.prototype.serializeValue = BodySerializer.prototype.serializeTo = function(writer) { + var escape = this.escape; + + if (escape) { + writer.append(''); + } +}; + +BodySerializer.prototype.build = function(prop, value) { + this.value = value; + + if (prop.type === 'String' && ESCAPE_CHARS.test(value)) { + this.escape = true; + } + + return this; +}; + +function ValueSerializer(ns) { + this.ns = ns; +} + +ValueSerializer.prototype = new BodySerializer(); + +ValueSerializer.prototype.serializeTo = function(writer) { + + writer + .appendIndent() + .append('<' + nsName(this.ns) + '>'); + + this.serializeValue(writer); + + writer + .append( '') + .appendNewLine(); +}; + +function ElementSerializer(parent, ns) { + this.body = []; + this.attrs = []; + + this.parent = parent; + this.ns = ns; +} + +ElementSerializer.prototype.build = function(element) { + this.element = element; + + var otherAttrs = this.parseNsAttributes(element); + + if (!this.ns) { + this.ns = this.nsTagName(element.$descriptor); + } + + if (element.$descriptor.isGeneric) { + this.parseGeneric(element); + } else { + var properties = getSerializableProperties(element); + + this.parseAttributes(filterAttributes(properties)); + this.parseContainments(filterContained(properties)); + + this.parseGenericAttributes(element, otherAttrs); + } + + return this; +}; + +ElementSerializer.prototype.nsTagName = function(descriptor) { + var effectiveNs = this.logNamespaceUsed(descriptor.ns); + return getElementNs(effectiveNs, descriptor); +}; + +ElementSerializer.prototype.nsPropertyTagName = function(descriptor) { + var effectiveNs = this.logNamespaceUsed(descriptor.ns); + return getPropertyNs(effectiveNs, descriptor); +}; + +ElementSerializer.prototype.isLocalNs = function(ns) { + return ns.uri === this.ns.uri; +}; + +ElementSerializer.prototype.nsAttributeName = function(element) { + + var ns; + + if (isString(element)) { + ns = parseNameNs(element); + } else + if (element.ns) { + ns = element.ns; + } + + var effectiveNs = this.logNamespaceUsed(ns); + + // strip prefix if same namespace like parent + if (this.isLocalNs(effectiveNs)) { + return { localName: ns.localName }; + } else { + return assign({ localName: ns.localName }, effectiveNs); + } +}; + +ElementSerializer.prototype.parseGeneric = function(element) { + + var self = this, + body = this.body, + attrs = this.attrs; + + forEach(element, function(val, key) { + + if (key === '$body') { + body.push(new BodySerializer().build({ type: 'String' }, val)); + } else + if (key === '$children') { + forEach(val, function(child) { + body.push(new ElementSerializer(self).build(child)); + }); + } else + if (key.indexOf('$') !== 0) { + attrs.push({ name: key, value: escapeAttr(val) }); + } + }); +}; + +/** + * Parse namespaces and return a list of left over generic attributes + * + * @param {Object} element + * @return {Array} + */ +ElementSerializer.prototype.parseNsAttributes = function(element) { + var self = this; + + var genericAttrs = element.$attrs; + + var attributes = []; + + // parse namespace attributes first + // and log them. push non namespace attributes to a list + // and process them later + forEach(genericAttrs, function(value, name) { + var nameNs = parseNameNs(name); + + if (nameNs.prefix === 'xmlns') { + self.logNamespace({ prefix: nameNs.localName, uri: value }); + } else + if (!nameNs.prefix && nameNs.localName === 'xmlns') { + self.logNamespace({ uri: value }); + } else { + attributes.push({ name: name, value: value }); + } + }); + + return attributes; +}; + +ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) { + + var self = this; + + forEach(attributes, function(attr) { + + // do not serialize xsi:type attribute + // it is set manually based on the actual implementation type + if (attr.name === XSI_TYPE) { + return; + } + + try { + self.addAttribute(self.nsAttributeName(attr.name), attr.value); + } catch (e) { + console.warn('[writer] missing namespace information for ', attr.name, '=', attr.value, 'on', element, e); + } + }); +}; + +ElementSerializer.prototype.parseContainments = function(properties) { + + var self = this, + body = this.body, + element = this.element; + + forEach(properties, function(p) { + var value = element.get(p.name), + isReference = p.isReference, + isMany = p.isMany; + + var ns = self.nsPropertyTagName(p); + + if (!isMany) { + value = [ value ]; + } + + if (p.isBody) { + body.push(new BodySerializer().build(p, value[0])); + } else + if (Types.isSimple(p.type)) { + forEach(value, function(v) { + body.push(new ValueSerializer(ns).build(p, v)); + }); + } else + if (isReference) { + forEach(value, function(v) { + body.push(new ReferenceSerializer(self, ns).build(v)); + }); + } else { + // allow serialization via type + // rather than element name + var asType = p.serialize === XSI_TYPE; + + forEach(value, function(v) { + var serializer; + + if (asType) { + serializer = new TypeSerializer(self, ns); + } else { + serializer = new ElementSerializer(self); + } + + body.push(serializer.build(v)); + }); + } + }); +}; + +ElementSerializer.prototype.getNamespaces = function() { + if (!this.parent) { + if (!this.namespaces) { + this.namespaces = { + prefixMap: {}, + uriMap: {}, + used: {} + }; + } + } else { + this.namespaces = this.parent.getNamespaces(); + } + + return this.namespaces; +}; + +ElementSerializer.prototype.logNamespace = function(ns) { + var namespaces = this.getNamespaces(); + + var existing = namespaces.uriMap[ns.uri]; + + if (!existing) { + namespaces.uriMap[ns.uri] = ns; + } + + namespaces.prefixMap[ns.prefix] = ns.uri; + + return ns; +}; + +ElementSerializer.prototype.logNamespaceUsed = function(ns) { + var element = this.element, + model = element.$model, + namespaces = this.getNamespaces(); + + // ns may be + // + // * prefix only + // * prefix:uri + + var prefix = ns.prefix; + var uri = ns.uri || DEFAULT_NS_MAP[prefix] || + namespaces.prefixMap[prefix] || (model ? (model.getPackage(prefix) || {}).uri : null); + + if (!uri) { + throw new Error('no namespace uri given for prefix <' + ns.prefix + '>'); + } + + ns = namespaces.uriMap[uri]; + + if (!ns) { + ns = this.logNamespace({ prefix: prefix, uri: uri }); + } + + if (!namespaces.used[ns.uri]) { + namespaces.used[ns.uri] = ns; + } + + return ns; +}; + +ElementSerializer.prototype.parseAttributes = function(properties) { + var self = this, + element = this.element; + + forEach(properties, function(p) { + self.logNamespaceUsed(p.ns); + + var value = element.get(p.name); + + if (p.isReference) { + value = value.id; + } + + self.addAttribute(self.nsAttributeName(p), value); + }); +}; + +ElementSerializer.prototype.addAttribute = function(name, value) { + var attrs = this.attrs; + + if (isString(value)) { + value = escapeAttr(value); + } + + attrs.push({ name: name, value: value }); +}; + +ElementSerializer.prototype.serializeAttributes = function(writer) { + var attrs = this.attrs, + root = !this.parent, + namespaces = this.namespaces; + + function collectNsAttrs() { + return map(namespaces.used, function(ns) { + var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : ''); + return { name: name, value: ns.uri }; + }); + } + + if (root) { + attrs = collectNsAttrs().concat(attrs); + } + + forEach(attrs, function(a) { + writer + .append(' ') + .append(nsName(a.name)).append('="').append(a.value).append('"'); + }); +}; + +ElementSerializer.prototype.serializeTo = function(writer) { + var hasBody = this.body.length, + indent = !(this.body.length === 1 && this.body[0] instanceof BodySerializer); + + writer + .appendIndent() + .append('<' + nsName(this.ns)); + + this.serializeAttributes(writer); + + writer.append(hasBody ? '>' : ' />'); + + if (hasBody) { + + if (indent) { + writer + .appendNewLine() + .indent(); + } + + forEach(this.body, function(b) { + b.serializeTo(writer); + }); + + if (indent) { + writer + .unindent() + .appendIndent(); + } + + writer.append(''); + } + + writer.appendNewLine(); +}; + +/** + * A serializer for types that handles serialization of data types + */ +function TypeSerializer(parent, ns) { + ElementSerializer.call(this, parent, ns); +} + +TypeSerializer.prototype = new ElementSerializer(); + +TypeSerializer.prototype.build = function(element) { + var descriptor = element.$descriptor; + + this.element = element; + + this.typeNs = this.nsTagName(descriptor); + + // add xsi:type attribute to represent the elements + // actual type + + var typeNs = this.typeNs, + pkg = element.$model.getPackage(typeNs.uri), + typePrefix = (pkg.xml && pkg.xml.typePrefix) || ''; + + this.addAttribute(this.nsAttributeName(XSI_TYPE), + (typeNs.prefix ? typeNs.prefix + ':' : '') + + typePrefix + descriptor.ns.localName); + + // do the usual stuff + return ElementSerializer.prototype.build.call(this, element); +}; + +TypeSerializer.prototype.isLocalNs = function(ns) { + return ns.uri === this.typeNs.uri; +}; + +function SavingWriter() { + this.value = ''; + + this.write = function(str) { + this.value += str; + }; +} + +function FormatingWriter(out, format) { + + var indent = ['']; + + this.append = function(str) { + out.write(str); + + return this; + }; + + this.appendNewLine = function() { + if (format) { + out.write('\n'); + } + + return this; + }; + + this.appendIndent = function() { + if (format) { + out.write(indent.join(' ')); + } + + return this; + }; + + this.indent = function() { + indent.push(''); + return this; + }; + + this.unindent = function() { + indent.pop(); + return this; + }; +} + +/** + * A writer for meta-model backed document trees + * + * @param {Object} options output options to pass into the writer + */ +function XMLWriter(options) { + + options = assign({ format: false, preamble: true }, options || {}); + + function toXML(tree, writer) { + var internalWriter = writer || new SavingWriter(); + var formatingWriter = new FormatingWriter(internalWriter, options.format); + + if (options.preamble) { + formatingWriter.append(XML_PREAMBLE); + } + + new ElementSerializer().build(tree).serializeTo(formatingWriter); + + if (!writer) { + return internalWriter.value; + } + } + + return { + toXML: toXML + }; +} + +module.exports = XMLWriter; +},{"202":202,"204":204,"207":207,"322":322,"325":325,"52":52,"62":62,"65":65}],55:[function(_dereq_,module,exports){ +(function (Buffer){ +// wrapper for non-node envs +;(function (sax) { + +sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } +sax.SAXParser = SAXParser +sax.SAXStream = SAXStream +sax.createStream = createStream + +// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. +// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), +// since that's the earliest that a buffer overrun could occur. This way, checks are +// as rare as required, but as often as necessary to ensure never crossing this bound. +// Furthermore, buffers are only tested at most once per write(), so passing a very +// large string into write() might have undesirable effects, but this is manageable by +// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme +// edge case, result in creating at most one complete copy of the string passed in. +// Set to Infinity to have unlimited buffers. +sax.MAX_BUFFER_LENGTH = 64 * 1024 + +var buffers = [ + "comment", "sgmlDecl", "textNode", "tagName", "doctype", + "procInstName", "procInstBody", "entity", "attribName", + "attribValue", "cdata", "script" +] + +sax.EVENTS = // for discoverability. + [ "text" + , "processinginstruction" + , "sgmldeclaration" + , "doctype" + , "comment" + , "attribute" + , "opentag" + , "closetag" + , "opencdata" + , "cdata" + , "closecdata" + , "error" + , "end" + , "ready" + , "script" + , "opennamespace" + , "closenamespace" + ] + +function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) return new SAXParser(strict, opt) + + var parser = this + clearBuffers(parser) + parser.q = parser.c = "" + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags + parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase" + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.ENTITIES = Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) parser.ns = Object.create(rootNS) + + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0 + } + emit(parser, "onready") +} + +if (!Object.create) Object.create = function (o) { + function f () { this.__proto__ = o } + f.prototype = o + return new f +} + +if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) { + return o.__proto__ +} + +if (!Object.keys) Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a +} + +function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + , maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i ++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case "textNode": + closeText(parser) + break + + case "cdata": + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + break + + case "script": + emitNode(parser, "onscript", parser.script) + parser.script = "" + break + + default: + error(parser, "Max buffer length exceeded: "+buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual) + + parser.position +} + +function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i ++) { + parser[buffers[i]] = "" + } +} + +function flushBuffers (parser) { + closeText(parser) + if (parser.cdata !== "") { + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + } + if (parser.script !== "") { + emitNode(parser, "onscript", parser.script) + parser.script = "" + } +} + +SAXParser.prototype = + { end: function () { end(this) } + , write: write + , resume: function () { this.error = null; return this } + , close: function () { return this.write(null) } + , flush: function () { flushBuffers(this) } + } + +try { + var Stream = _dereq_("stream").Stream +} catch (ex) { + var Stream = function () {} +} + + +var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== "error" && ev !== "end" +}) + +function createStream (strict, opt) { + return new SAXStream(strict, opt) +} + +function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) return new SAXStream(strict, opt) + + Stream.apply(this) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + + var me = this + + this._parser.onend = function () { + me.emit("end") + } + + this._parser.onerror = function (er) { + me.emit("error", er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + this._decoder = null; + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, "on" + ev, { + get: function () { return me._parser["on" + ev] }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + return me._parser["on"+ev] = h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) +} + +SAXStream.prototype = Object.create(Stream.prototype, + { constructor: { value: SAXStream } }) + +SAXStream.prototype.write = function (data) { + if (typeof Buffer === 'function' && + typeof Buffer.isBuffer === 'function' && + Buffer.isBuffer(data)) { + if (!this._decoder) { + var SD = _dereq_('string_decoder').StringDecoder + this._decoder = new SD('utf8') + } + data = this._decoder.write(data); + } + + this._parser.write(data.toString()) + this.emit("data", data) + return true +} + +SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) this.write(chunk) + this._parser.end() + return true +} + +SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) { + me._parser["on"+ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] + : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) +} + + + +// character classes and tokens +var whitespace = "\r\n\t " + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + , number = "0124356789" + , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + // (Letter | "_" | ":") + , quote = "'\"" + , entity = number+letter+"#" + , attribEnd = whitespace + ">" + , CDATA = "[CDATA[" + , DOCTYPE = "DOCTYPE" + , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/" + , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + +// turn all the string character sets into character class objects. +whitespace = charClass(whitespace) +number = charClass(number) +letter = charClass(letter) + +// http://www.w3.org/TR/REC-xml/#NT-NameStartChar +// This implementation works on strings, a single character at a time +// as such, it cannot ever support astral-plane characters (10000-EFFFF) +// without a significant breaking change to either this parser, or the +// JavaScript language. Implementation of an emoji-capable xml parser +// is left as an exercise for the reader. +var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + +var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ + +quote = charClass(quote) +entity = charClass(entity) +attribEnd = charClass(attribEnd) + +function charClass (str) { + return str.split("").reduce(function (s, c) { + s[c] = true + return s + }, {}) +} + +function isRegExp (c) { + return Object.prototype.toString.call(c) === '[object RegExp]' +} + +function is (charclass, c) { + return isRegExp(charclass) ? !!c.match(charclass) : charclass[c] +} + +function not (charclass, c) { + return !is(charclass, c) +} + +var S = 0 +sax.STATE = +{ BEGIN : S++ +, TEXT : S++ // general stuff +, TEXT_ENTITY : S++ // & and such. +, OPEN_WAKA : S++ // < +, SGML_DECL : S++ // +, SCRIPT : S++ // ' + + }); + }); + +function restoreElement(index, type) { + bootbox.hideAll(); + //Nodes + if (type == 0) { + $("#nodeZone").addClass('drop-target'); + $("#nodeZone").css('cursor', 'crosshair'); + document.getElementById("titleBar").innerHTML = + '
    Click where to append then press okay
    '; + + document.getElementById("appendSpot").style.visibility = 'visible'; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + 250 + 'px, ' + 22 + 'px)'; + document.getElementById("appendSpot").setAttribute("x", 250); + document.getElementById("appendSpot").setAttribute("y", 22); + + $("#nodeZone").on('click', function(event) { + alert(this.attr('taska_id')); + window.tapX = event.pageX; + window.tapY = event.pageY; + var transposeX = Math.round((tapX) / 160) * 160 - 70; + var transposeY = 22; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + }); + $(".nodeDraggable").on('click', function(event) { + alert(this.attr('taska_id')); + window.tapX = event.pageX; + window.tapY = event.pageY; + var transposeX = Math.round((tapX) / 160) * 160 - 70; + var transposeY = 22; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + }); + document.getElementById("appendBtn").addEventListener("click", function() { + $("#nodeZone").removeClass('drop-target'); + $("#nodeZone").css('cursor', 'auto'); + document.getElementById("appendSpot").style.visibility = 'hidden'; + var transposeX = document.getElementById("appendSpot").getAttribute("x"); + var transposeY = document.getElementById("appendSpot").getAttribute("y"); + resetTitleBar(); + storeArray("nodeArr", i, guid(), deletedNodes[index][2], transposeX, + transposeY, deletedNodes[index][5], null, null, deletedNodes[index][10]); + deletedNodes.splice(index, 1); + if (deletedNodes.length + deletedArrows.length + deletedNotes.length == 0) { + document.getElementById("trash").src = "../images/trashCan.gif"; + } + }); + } + + //Arrows + else if (type == 1) { + $("#lines").addClass('drop-target'); + $("#lines").css('cursor', 'crosshair'); + document.getElementById("titleBar").innerHTML = + '
    Click where to append then press okay
    '; + document.getElementById("appendSpot").style.visibility = 'visible'; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + 300 + 'px, ' + 75 + 'px)'; + document.getElementById("appendSpot").setAttribute("x", 300); + document.getElementById("appendSpot").setAttribute("y", 75); + + $("#lines").on('click', function(event) { + window.gridTapX = event.pageX; + window.gridTapY = event.pageY; + var transposeX = Math.round((gridTapX) / 160) * 160 - 20; + var transposeY = Math.floor((gridTapY) / 42) * 42 - 50; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + document.getElementById("appendSpot").setAttribute("y", parseInt( + transposeY) - 1); + }); + + document.getElementById("appendBtn").addEventListener("click", function() { + $("#lines").removeClass('drop-target'); + $("#lines").css('cursor', 'auto'); + document.getElementById("appendSpot").style.visibility = 'hidden'; + var transposeX = document.getElementById("appendSpot").getAttribute("x"); + var transposeY = parseInt(document.getElementById("appendSpot").getAttribute( + "y")) + 27; + resetTitleBar(); + storeArray("arrowArr", i, guid(), deletedArrows[index][2], transposeX, + transposeY, deletedArrows[index][5], deletedArrows[index][10], null); + warning(); + deletedArrows.splice(index, 1); + if (deletedNodes.length + deletedArrows.length + deletedNotes.length == 0) { + document.getElementById("trash").src = "../images/trashCan.gif"; + } + }); + } + + //Notes + else if (type == 2) { + $("#lines").addClass('drop-target'); + $("#lines").css('cursor', 'crosshair'); + document.getElementById("titleBar").innerHTML = + '
    Click where to append then press okay
    '; + document.getElementById("appendSpot").style.visibility = 'visible'; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + 300 + 'px, ' + 75 + 'px)'; + document.getElementById("appendSpot").setAttribute("x", 300); + document.getElementById("appendSpot").setAttribute("y", 75); + $("#lines").on('click', function(event) { + window.gridTapX = event.pageX; + window.gridTapY = event.pageY; + var transposeX = Math.round((gridTapX) / 160) * 160 - 20; + var transposeY = Math.floor((gridTapY) / 42) * 42 - 50; + document.getElementById("appendSpot").style.webkitTransform = + document.getElementById("appendSpot").style.transform = + 'translate(' + transposeX + 'px, ' + transposeY + 'px)'; + document.getElementById("appendSpot").setAttribute("x", transposeX); + document.getElementById("appendSpot").setAttribute("y", parseInt( + transposeY) - 1); + }); + document.getElementById("appendBtn").addEventListener("click", function() { + $("#lines").removeClass('drop-target'); + $("#lines").css('cursor', 'auto'); + document.getElementById("appendSpot").style.visibility = 'hidden'; + var transposeX = document.getElementById("appendSpot").getAttribute("x"); + var transposeY = parseInt(document.getElementById("appendSpot").getAttribute( + "y")) + 38; + resetTitleBar(); + storeArray("noteArr", i, guid(), deletedNotes[index][2], transposeX, + transposeY, deletedNotes[index][5], null, deletedNotes[index][7] - + deletedNotes[index][4]); + deletedNotes.splice(index, 1); + if (deletedNodes.length + deletedArrows.length + deletedNotes.length == 0) { + document.getElementById("trash").src = "../images/trashCan.gif"; + } + }); + } +} + + +/*DROPZONE TEMPLATE +interact('.dropzone').dropzone({ + // Require a 75% element overlap for a drop to be possible + overlap: 0.75, + + // listen for drop related events: + + ondropactivate: function (event) { + // add active dropzone feedback + event.target.classList.add('drop-active'); + }, + ondragenter: function (event) { + var draggableElement = event.relatedTarget, + dropzoneElement = event.target; + + // feedback the possibility of a drop + dropzoneElement.classList.add('drop-target'); + draggableElement.classList.add('can-drop'); + draggableElement.textContent = 'You can drop me anywhere!'; + + + var instruct = document.getElementById("instructions"); + instructions.textContent = ''; + + }, + ondragleave: function (event) { + // remove the drop feedback style + event.target.classList.remove('drop-target'); + event.relatedTarget.classList.remove('can-drop'); + event.relatedTarget.textContent = 'Dragged out'; + }, + ondrop: function (event) { + grabbedNode = event.relatedTarget + grabbedNode.textContent = 'Placed on diagram'; + var innerText = prompt("Please enter what you'd like displayed in this node", "<+->"); + if (innerText != null) { + grabbedNode.textContent = innerText; + } + }, + ondropdeactivate: function (event) { + // remove active dropzone feedback + event.target.classList.remove('drop-active'); + event.target.classList.remove('drop-target'); + } +}); +*/ diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js new file mode 100644 index 0000000..1236d75 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/elements_ase.js @@ -0,0 +1,76 @@ +var networkMap = [ + {'displayShortname': 'eNB', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.enodeb'}, + {'displayShortname': 'SIAD', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.siad'}, + {'displayShortname': 'NodeB', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.nb'}, + {'displayShortname': 'eMSC', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.emsc'}, + {'displayShortname': 'RNC', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.rnc'}, + {'displayShortname': 'MGW', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.mgw'}, + {'displayShortname': 'SS7 GPORT', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.ss7_gport'}, + {'displayShortname': 'MSN', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.msn'}, + {'displayShortname': 'E-SMLC', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ran.e_smlc'}, + {'displayShortname': 'SGSN-S4', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.sgsn_s4'}, + {'displayShortname': 'MME', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.mme'}, + {'displayShortname': 'P_LRF (RDF)', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.p_lrf'}, + {'displayShortname': 'GMLC', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.gmlc'}, + {'displayShortname': 'PCEF', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.pcef'}, + {'displayShortname': 'SDG', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.sdg'}, + {'displayShortname': 'P-GW', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.p_gw'}, + {'displayShortname': 'S-GW', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.s_gw'}, + {'displayShortname': 'PAS', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.pas'}, + {'displayShortname': 'PCRF', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.pcrf'}, + {'displayShortname': 'MIND', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.mind'}, + {'displayShortname': 'APN DNS', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.apn_dns'}, + {'displayShortname': 'DRA EPC', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.dra_epc'}, + {'displayShortname': 'HSS EPC', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.hss_epc'}, + {'displayShortname': 'HLR', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.hlr'}, + {'displayShortname': 'CPM', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.cpm'}, + {'displayShortname': 'P-LRF/RDF', 'enclosingDomain': 'EPC', 'tosca_id': 'com.openecomp.trinity.epc.p_lrf_sup'}, + {'displayShortname': 'SBC', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.sbc'}, + {'displayShortname': 'ATGW', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.atgw'}, + {'displayShortname': 'IWF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.iwf'}, + {'displayShortname': 'ATCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.atcf'}, + {'displayShortname': 'P-CSCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.p_cscf'}, + {'displayShortname': 'Transcoder', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.transcoder'}, + {'displayShortname': 'I-SBC', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.i_sbc'}, + {'displayShortname': 'SCC-AS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.scc_as'}, + {'displayShortname': 'EATF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.eatf'}, + {'displayShortname': 'TAS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.tas_cts'}, + {'displayShortname': 'S-CSCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.s_cscf'}, + {'displayShortname': 'E-CSCF (911)', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.e_cscf'}, + {'displayShortname': 'I-CSCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.i_cscf'}, + {'displayShortname': 'TF / BGCF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.tf_bgcf'}, + {'displayShortname': 'MGC-8', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.mgc8'}, + {'displayShortname': 'MRF', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.mrf'}, + {'displayShortname': 'USP DNS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.dns'}, + {'displayShortname': 'DRA IMS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.dra_ims'}, + {'displayShortname': 'ENUM', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.enum'}, + {'displayShortname': 'HSS IMS', 'enclosingDomain': 'USP', 'tosca_id': 'com.openecomp.trinity.usp.hss_ims'}, + {'displayShortname': 'CCF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.ccf'}, + {'displayShortname': 'BGF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.bgf'}, + {'displayShortname': 'vMS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.ms'}, + {'displayShortname': 'vNS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.ns'}, + {'displayShortname': 'vAS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.as'}, + {'displayShortname': 'vA-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.a_sbg'}, + {'displayShortname': 'vDBE', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.dbe'}, + {'displayShortname': 'vN-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc1.n_sbg'}, + {'displayShortname': 'CCF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.ccf'}, + {'displayShortname': 'BGF', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.bgf'}, + {'displayShortname': 'vMS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.ms'}, + {'displayShortname': 'vNS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.ns'}, + {'displayShortname': 'vAS', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.as'}, + {'displayShortname': 'vA-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.a_sbg'}, + {'displayShortname': 'vDBE', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.dbe'}, + {'displayShortname': 'vN-SBG', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.dc2.n_sbg'}, + {'displayShortname': 'PSX SIP', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.sip_psx'}, + {'displayShortname': 'PSX Policy', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.policy_psx'}, + {'displayShortname': 'IPBE', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.ipbe'}, + {'displayShortname': 'GSX', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.gsx'}, + {'displayShortname': 'BVoIP AS', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.bvoip_as'}, + {'displayShortname': 'NGBE', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.vni.ngbe'}, + {'displayShortname': 'VoLTE UE', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': '3G UE', 'enclosingDomain': 'RAN', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'Trinity UE-A', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'Trinity UE-B', 'enclosingDomain': 'Datacenter', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'VNI UE', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.ue'}, + {'displayShortname': 'PSTN', 'enclosingDomain': 'VNI', 'tosca_id': 'com.openecomp.trinity.ue'} + ]; \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js new file mode 100644 index 0000000..fe5b720 --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootbox.js @@ -0,0 +1,986 @@ +/** + * bootbox.js [v4.4.0] + * + * http://bootboxjs.com/license.txt + */ + +// @see https://github.com/makeusabrew/bootbox/issues/180 +// @see https://github.com/makeusabrew/bootbox/issues/186 +(function (root, factory) { + + "use strict"; + if (typeof define === "function" && define.amd) { + // AMD. Register as an anonymous module. + define(["jquery"], factory); + } else if (typeof exports === "object") { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(require("jquery")); + } else { + // Browser globals (root is window) + root.bootbox = factory(root.jQuery); + } + +}(this, function init($, undefined) { + + "use strict"; + + // the base DOM structure needed to create a modal + var templates = { + dialog: + "", + header: + "", + footer: + "", + closeButton: + "", + form: + "
    ", + //CUSTOM + inputs: { + text: + "", + textarea: + "", + email: + "", + select: + "", + checkbox: + "
    ", + date: + "", + time: + "", + number: + "", + password: + "" + } + }; + + var defaults = { + // default language + locale: "en", + // show backdrop or not. Default to static so user has to interact with dialog + backdrop: "static", + // animate the modal in/out + animate: true, + // additional class string applied to the top level dialog + className: null, + // whether or not to include a close button + closeButton: true, + // show the dialog immediately by default + show: true, + // dialog container + container: "body" + }; + + // our public object; augmented after our private API + var exports = {}; + + /** + * @private + */ + function _t(key) { + var locale = locales[defaults.locale]; + return locale ? locale[key] : locales.en[key]; + } + + function processCallback(e, dialog, callback) { + e.stopPropagation(); + e.preventDefault(); + + // by default we assume a callback will get rid of the dialog, + // although it is given the opportunity to override this + + // so, if the callback can be invoked and it *explicitly returns false* + // then we'll set a flag to keep the dialog active... + var preserveDialog = $.isFunction(callback) && callback.call(dialog, e) === false; + + // ... otherwise we'll bin it + if (!preserveDialog) { + dialog.modal("hide"); + } + } + + function getKeyLength(obj) { + // @TODO defer to Object.keys(x).length if available? + var k, t = 0; + for (k in obj) { + t ++; + } + return t; + } + + function each(collection, iterator) { + var index = 0; + $.each(collection, function(key, value) { + iterator(key, value, index++); + }); + } + + function sanitize(options) { + var buttons; + var total; + + if (typeof options !== "object") { + throw new Error("Please supply an object of options"); + } + + if (!options.message) { + throw new Error("Please specify a message"); + } + + // make sure any supplied options take precedence over defaults + options = $.extend({}, defaults, options); + + if (!options.buttons) { + options.buttons = {}; + } + + buttons = options.buttons; + + total = getKeyLength(buttons); + + each(buttons, function(key, button, index) { + + if ($.isFunction(button)) { + // short form, assume value is our callback. Since button + // isn't an object it isn't a reference either so re-assign it + button = buttons[key] = { + callback: button + }; + } + + // before any further checks make sure by now button is the correct type + if ($.type(button) !== "object") { + throw new Error("button with key " + key + " must be an object"); + } + + if (!button.label) { + // the lack of an explicit label means we'll assume the key is good enough + button.label = key; + } + + if (!button.className) { + if (total <= 2 && index === total-1) { + // always add a primary to the main option in a two-button dialog + button.className = "btn-primary"; + } else { + button.className = "btn-default"; + } + } + }); + + return options; + } + + /** + * map a flexible set of arguments into a single returned object + * if args.length is already one just return it, otherwise + * use the properties argument to map the unnamed args to + * object properties + * so in the latter case: + * mapArguments(["foo", $.noop], ["message", "callback"]) + * -> { message: "foo", callback: $.noop } + */ + function mapArguments(args, properties) { + var argn = args.length; + var options = {}; + + if (argn < 1 || argn > 2) { + throw new Error("Invalid argument length"); + } + + if (argn === 2 || typeof args[0] === "string") { + options[properties[0]] = args[0]; + options[properties[1]] = args[1]; + } else { + options = args[0]; + } + + return options; + } + + /** + * merge a set of default dialog options with user supplied arguments + */ + function mergeArguments(defaults, args, properties) { + return $.extend( + // deep merge + true, + // ensure the target is an empty, unreferenced object + {}, + // the base options object for this type of dialog (often just buttons) + defaults, + // args could be an object or array; if it's an array properties will + // map it to a proper options object + mapArguments( + args, + properties + ) + ); + } + + /** + * this entry-level method makes heavy use of composition to take a simple + * range of inputs and return valid options suitable for passing to bootbox.dialog + */ + function mergeDialogOptions(className, labels, properties, args) { + // build up a base set of dialog properties + var baseOptions = { + className: "bootbox-" + className, + buttons: createLabels.apply(null, labels) + }; + + // ensure the buttons properties generated, *after* merging + // with user args are still valid against the supplied labels + return validateButtons( + // merge the generated base properties with user supplied arguments + mergeArguments( + baseOptions, + args, + // if args.length > 1, properties specify how each arg maps to an object key + properties + ), + labels + ); + } + + /** + * from a given list of arguments return a suitable object of button labels + * all this does is normalise the given labels and translate them where possible + * e.g. "ok", "confirm" -> { ok: "OK, cancel: "Annuleren" } + */ + function createLabels() { + var buttons = {}; + + for (var i = 0, j = arguments.length; i < j; i++) { + var argument = arguments[i]; + var key = argument.toLowerCase(); + var value = argument.toUpperCase(); + + buttons[key] = { + label: _t(value) + }; + } + + return buttons; + } + + function validateButtons(options, buttons) { + var allowedButtons = {}; + each(buttons, function(key, value) { + allowedButtons[value] = true; + }); + + each(options.buttons, function(key) { + if (allowedButtons[key] === undefined) { + throw new Error("button key " + key + " is not allowed (options are " + buttons.join("\n") + ")"); + } + }); + + return options; + } + + exports.alert = function() { + var options; + + options = mergeDialogOptions("alert", ["ok"], ["message", "callback"], arguments); + + if (options.callback && !$.isFunction(options.callback)) { + throw new Error("alert requires callback property to be a function when provided"); + } + + /** + * overrides + */ + options.buttons.ok.callback = options.onEscape = function() { + if ($.isFunction(options.callback)) { + return options.callback.call(this); + } + return true; + }; + + return exports.dialog(options); + }; + + exports.confirm = function() { + var options; + + options = mergeDialogOptions("confirm", ["cancel", "confirm"], ["message", "callback"], arguments); + + /** + * overrides; undo anything the user tried to set they shouldn't have + */ + options.buttons.cancel.callback = options.onEscape = function() { + return options.callback.call(this, false); + }; + + options.buttons.confirm.callback = function() { + return options.callback.call(this, true); + }; + + // confirm specific validation + if (!$.isFunction(options.callback)) { + throw new Error("confirm requires a callback"); + } + + return exports.dialog(options); + }; + + exports.prompt = function() { + var options; + var defaults; + var dialog; + var form; + var input; + var shouldShow; + var inputOptions; + + // we have to create our form first otherwise + // its value is undefined when gearing up our options + // @TODO this could be solved by allowing message to + // be a function instead... + form = $(templates.form); + + // prompt defaults are more complex than others in that + // users can override more defaults + // @TODO I don't like that prompt has to do a lot of heavy + // lifting which mergeDialogOptions can *almost* support already + // just because of 'value' and 'inputType' - can we refactor? + defaults = { + className: "bootbox-prompt", + buttons: createLabels("cancel", "confirm"), + value: "", + inputType: "text" + }; + + options = validateButtons( + mergeArguments(defaults, arguments, ["title", "callback"]), + ["cancel", "confirm"] + ); + + // capture the user's show value; we always set this to false before + // spawning the dialog to give us a chance to attach some handlers to + // it, but we need to make sure we respect a preference not to show it + shouldShow = (options.show === undefined) ? true : options.show; + + /** + * overrides; undo anything the user tried to set they shouldn't have + */ + options.message = form; + + options.buttons.cancel.callback = options.onEscape = function() { + return options.callback.call(this, null); + }; + + options.buttons.confirm.callback = function() { + var value; + + switch (options.inputType) { + case "text": + case "textarea": + case "email": + case "select": + case "date": + case "time": + case "number": + case "password": + value = input.val(); + break; + + case "checkbox": + var checkedItems = input.find("input:checked"); + + // we assume that checkboxes are always multiple, + // hence we default to an empty array + value = []; + + each(checkedItems, function(_, item) { + value.push($(item).val()); + }); + break; + } + + return options.callback.call(this, value); + }; + + options.show = false; + + // prompt specific validation + if (!options.title) { + throw new Error("prompt requires a title"); + } + + if (!$.isFunction(options.callback)) { + throw new Error("prompt requires a callback"); + } + + if (!templates.inputs[options.inputType]) { + throw new Error("invalid prompt type"); + } + + // create the input based on the supplied type + input = $(templates.inputs[options.inputType]); + + switch (options.inputType) { + case "text": + case "textarea": + case "email": + case "date": + case "time": + case "number": + case "password": + input.val(options.value); + break; + + case "select": + var groups = {}; + inputOptions = options.inputOptions || []; + + if (!$.isArray(inputOptions)) { + throw new Error("Please pass an array of input options"); + } + + if (!inputOptions.length) { + throw new Error("prompt with select requires options"); + } + + each(inputOptions, function(_, option) { + + // assume the element to attach to is the input... + var elem = input; + + if (option.value === undefined || option.text === undefined) { + throw new Error("given options in wrong format"); + } + + // ... but override that element if this option sits in a group + + if (option.group) { + // initialise group if necessary + if (!groups[option.group]) { + groups[option.group] = $("").attr("label", option.group); + } + + elem = groups[option.group]; + } + + elem.append(""); + }); + + each(groups, function(_, group) { + input.append(group); + }); + + // safe to set a select's value as per a normal input + input.val(options.value); + break; + + case "checkbox": + var values = $.isArray(options.value) ? options.value : [options.value]; + inputOptions = options.inputOptions || []; + + if (!inputOptions.length) { + throw new Error("prompt with checkbox requires options"); + } + + if (!inputOptions[0].value || !inputOptions[0].text) { + throw new Error("given options in wrong format"); + } + + // checkboxes have to nest within a containing element, so + // they break the rules a bit and we end up re-assigning + // our 'input' element to this container instead + input = $("
    "); + + each(inputOptions, function(_, option) { + var checkbox = $(templates.inputs[options.inputType]); + + checkbox.find("input").attr("value", option.value); + checkbox.find("label").append(option.text); + + // we've ensured values is an array so we can always iterate over it + each(values, function(_, value) { + if (value === option.value) { + checkbox.find("input").prop("checked", true); + } + }); + + input.append(checkbox); + }); + break; + } + + // @TODO provide an attributes option instead + // and simply map that as keys: vals + if (options.placeholder) { + input.attr("placeholder", options.placeholder); + } + + if (options.pattern) { + input.attr("pattern", options.pattern); + } + + if (options.maxlength) { + input.attr("maxlength", options.maxlength); + } + + // now place it in our form + form.append(input); + + form.on("submit", function(e) { + e.preventDefault(); + // Fix for SammyJS (or similar JS routing library) hijacking the form post. + e.stopPropagation(); + // @TODO can we actually click *the* button object instead? + // e.g. buttons.confirm.click() or similar + dialog.find(".btn-primary").click(); + }); + + dialog = exports.dialog(options); + + // clear the existing handler focusing the submit button... + dialog.off("shown.bs.modal"); + + // ...and replace it with one focusing our input, if possible + dialog.on("shown.bs.modal", function() { + // need the closure here since input isn't + // an object otherwise + input.focus(); + }); + + if (shouldShow === true) { + dialog.modal("show"); + } + + return dialog; + }; + + exports.dialog = function(options) { + options = sanitize(options); + + var dialog = $(templates.dialog); + var innerDialog = dialog.find(".modal-dialog"); + var body = dialog.find(".modal-body"); + var buttons = options.buttons; + var buttonStr = ""; + var callbacks = { + onEscape: options.onEscape + }; + + if ($.fn.modal === undefined) { + throw new Error( + "$.fn.modal is not defined; please double check you have included " + + "the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ " + + "for more details." + ); + } + + each(buttons, function(key, button) { + + // @TODO I don't like this string appending to itself; bit dirty. Needs reworking + // can we just build up button elements instead? slower but neater. Then button + // can just become a template too + buttonStr += ""; + callbacks[key] = button.callback; + }); + + body.find(".bootbox-body").html(options.message); + + if (options.animate === true) { + dialog.addClass("fade"); + } + + if (options.className) { + dialog.addClass(options.className); + } + + if (options.size === "large") { + innerDialog.addClass("modal-lg"); + } else if (options.size === "small") { + innerDialog.addClass("modal-sm"); + } + + if (options.title) { + body.before(templates.header); + } + + if (options.closeButton) { + var closeButton = $(templates.closeButton); + + if (options.title) { + dialog.find(".modal-header").prepend(closeButton); + } else { + closeButton.css("margin-top", "-10px").prependTo(body); + } + } + + if (options.title) { + dialog.find(".modal-title").html(options.title); + } + + if (buttonStr.length) { + body.after(templates.footer); + dialog.find(".modal-footer").html(buttonStr); + } + + + /** + * Bootstrap event listeners; used handle extra + * setup & teardown required after the underlying + * modal has performed certain actions + */ + + dialog.on("hidden.bs.modal", function(e) { + // ensure we don't accidentally intercept hidden events triggered + // by children of the current dialog. We shouldn't anymore now BS + // namespaces its events; but still worth doing + if (e.target === this) { + dialog.remove(); + } + }); + + /* + dialog.on("show.bs.modal", function() { + // sadly this doesn't work; show is called *just* before + // the backdrop is added so we'd need a setTimeout hack or + // otherwise... leaving in as would be nice + if (options.backdrop) { + dialog.next(".modal-backdrop").addClass("bootbox-backdrop"); + } + }); + */ + + dialog.on("shown.bs.modal", function() { + dialog.find(".btn-primary:first").focus(); + }); + + /** + * Bootbox event listeners; experimental and may not last + * just an attempt to decouple some behaviours from their + * respective triggers + */ + + if (options.backdrop !== "static") { + // A boolean true/false according to the Bootstrap docs + // should show a dialog the user can dismiss by clicking on + // the background. + // We always only ever pass static/false to the actual + // $.modal function because with `true` we can't trap + // this event (the .modal-backdrop swallows it) + // However, we still want to sort of respect true + // and invoke the escape mechanism instead + dialog.on("click.dismiss.bs.modal", function(e) { + // @NOTE: the target varies in >= 3.3.x releases since the modal backdrop + // moved *inside* the outer dialog rather than *alongside* it + if (dialog.children(".modal-backdrop").length) { + e.currentTarget = dialog.children(".modal-backdrop").get(0); + } + + if (e.target !== e.currentTarget) { + return; + } + + dialog.trigger("escape.close.bb"); + }); + } + + dialog.on("escape.close.bb", function(e) { + if (callbacks.onEscape) { + processCallback(e, dialog, callbacks.onEscape); + } + }); + + /** + * Standard jQuery event listeners; used to handle user + * interaction with our dialog + */ + + dialog.on("click", ".modal-footer button", function(e) { + var callbackKey = $(this).data("bb-handler"); + + processCallback(e, dialog, callbacks[callbackKey]); + }); + + dialog.on("click", ".bootbox-close-button", function(e) { + // onEscape might be falsy but that's fine; the fact is + // if the user has managed to click the close button we + // have to close the dialog, callback or not + processCallback(e, dialog, callbacks.onEscape); + }); + + dialog.on("keyup", function(e) { + if (e.which === 27) { + dialog.trigger("escape.close.bb"); + } + }); + + // the remainder of this method simply deals with adding our + // dialogent to the DOM, augmenting it with Bootstrap's modal + // functionality and then giving the resulting object back + // to our caller + + $(options.container).append(dialog); + + dialog.modal({ + backdrop: options.backdrop ? "static": false, + keyboard: false, + show: false + }); + + if (options.show) { + dialog.modal("show"); + } + + // @TODO should we return the raw element here or should + // we wrap it in an object on which we can expose some neater + // methods, e.g. var d = bootbox.alert(); d.hide(); instead + // of d.modal("hide"); + + /* + function BBDialog(elem) { + this.elem = elem; + } + + BBDialog.prototype = { + hide: function() { + return this.elem.modal("hide"); + }, + show: function() { + return this.elem.modal("show"); + } + }; + */ + + return dialog; + + }; + + exports.setDefaults = function() { + var values = {}; + + if (arguments.length === 2) { + // allow passing of single key/value... + values[arguments[0]] = arguments[1]; + } else { + // ... and as an object too + values = arguments[0]; + } + + $.extend(defaults, values); + }; + + exports.hideAll = function() { + $(".bootbox").modal("hide"); + + return exports; + }; + + + /** + * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are + * unlikely to be required. If this gets too large it can be split out into separate JS files. + */ + var locales = { + bg_BG : { + OK : "Ок", + CANCEL : "Отказ", + CONFIRM : "Потвърждавам" + }, + br : { + OK : "OK", + CANCEL : "Cancelar", + CONFIRM : "Sim" + }, + cs : { + OK : "OK", + CANCEL : "ZruÅ¡it", + CONFIRM : "Potvrdit" + }, + da : { + OK : "OK", + CANCEL : "Annuller", + CONFIRM : "Accepter" + }, + de : { + OK : "OK", + CANCEL : "Abbrechen", + CONFIRM : "Akzeptieren" + }, + el : { + OK : "Εντάξει", + CANCEL : "ΑκÏÏωση", + CONFIRM : "Επιβεβαίωση" + }, + en : { + OK : "OK", + CANCEL : "Cancel", + CONFIRM : "OK" + }, + es : { + OK : "OK", + CANCEL : "Cancelar", + CONFIRM : "Aceptar" + }, + et : { + OK : "OK", + CANCEL : "Katkesta", + CONFIRM : "OK" + }, + fa : { + OK : "قبول", + CANCEL : "لغو", + CONFIRM : "تایید" + }, + fi : { + OK : "OK", + CANCEL : "Peruuta", + CONFIRM : "OK" + }, + fr : { + OK : "OK", + CANCEL : "Annuler", + CONFIRM : "D'accord" + }, + he : { + OK : "×ישור", + CANCEL : "ביטול", + CONFIRM : "×ישור" + }, + hu : { + OK : "OK", + CANCEL : "Mégsem", + CONFIRM : "MegerÅ‘sít" + }, + hr : { + OK : "OK", + CANCEL : "Odustani", + CONFIRM : "Potvrdi" + }, + id : { + OK : "OK", + CANCEL : "Batal", + CONFIRM : "OK" + }, + it : { + OK : "OK", + CANCEL : "Annulla", + CONFIRM : "Conferma" + }, + ja : { + OK : "OK", + CANCEL : "キャンセル", + CONFIRM : "確èª" + }, + lt : { + OK : "Gerai", + CANCEL : "AtÅ¡aukti", + CONFIRM : "Patvirtinti" + }, + lv : { + OK : "Labi", + CANCEL : "Atcelt", + CONFIRM : "ApstiprinÄt" + }, + nl : { + OK : "OK", + CANCEL : "Annuleren", + CONFIRM : "Accepteren" + }, + no : { + OK : "OK", + CANCEL : "Avbryt", + CONFIRM : "OK" + }, + pl : { + OK : "OK", + CANCEL : "Anuluj", + CONFIRM : "Potwierdź" + }, + pt : { + OK : "OK", + CANCEL : "Cancelar", + CONFIRM : "Confirmar" + }, + ru : { + OK : "OK", + CANCEL : "Отмена", + CONFIRM : "Применить" + }, + sq : { + OK : "OK", + CANCEL : "Anulo", + CONFIRM : "Prano" + }, + sv : { + OK : "OK", + CANCEL : "Avbryt", + CONFIRM : "OK" + }, + th : { + OK : "ตà¸à¸¥à¸‡", + CANCEL : "ยà¸à¹€à¸¥à¸´à¸", + CONFIRM : "ยืนยัน" + }, + tr : { + OK : "Tamam", + CANCEL : "Ä°ptal", + CONFIRM : "Onayla" + }, + zh_CN : { + OK : "OK", + CANCEL : "å–消", + CONFIRM : "确认" + }, + zh_TW : { + OK : "OK", + CANCEL : "å–消", + CONFIRM : "確èª" + } + }; + + exports.addLocale = function(name, values) { + $.each(["OK", "CANCEL", "CONFIRM"], function(_, v) { + if (!values[v]) { + throw new Error("Please supply a translation for '" + v + "'"); + } + }); + + locales[name] = { + OK: values.OK, + CANCEL: values.CANCEL, + CONFIRM: values.CONFIRM + }; + + return exports; + }; + + exports.removeLocale = function(name) { + delete locales[name]; + + return exports; + }; + + exports.setLocale = function(name) { + return exports.setDefaults("locale", name); + }; + + exports.init = function(_$) { + return init(_$ || $); + }; + + return exports; +})); diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js new file mode 100644 index 0000000..133aeec --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js new file mode 100644 index 0000000..0bb048b --- /dev/null +++ b/dcae_dmaapbc_webapp/src/main/webapp/app/fusion/ase/scripts/menus/contextMenu.js @@ -0,0 +1,1692 @@ +/*! + * jQuery contextMenu - Plugin for simple contextMenu handling + * + * Version: git-master + * + * Authors: Rodney Rehm, Addy Osmani (patches for FF) + * Web: http://medialize.github.com/jQuery-contextMenu/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * GPL v3 http://opensource.org/licenses/GPL-3.0 + * + */ + +(function($, undefined){ + + // TODO: - + // ARIA stuff: menuitem, menuitemcheckbox und menuitemradio + // create structure if $.support[htmlCommand || htmlMenuitem] and !opt.disableNative + +// determine html5 compatibility +$.support.htmlMenuitem = ('HTMLMenuItemElement' in window); +$.support.htmlCommand = ('HTMLCommandElement' in window); +$.support.eventSelectstart = ("onselectstart" in document.documentElement); +/* // should the need arise, test for css user-select +$.support.cssUserSelect = (function(){ + var t = false, + e = document.createElement('div'); + + $.each('Moz|Webkit|Khtml|O|ms|Icab|'.split('|'), function(i, prefix) { + var propCC = prefix + (prefix ? 'U' : 'u') + 'serSelect', + prop = (prefix ? ('-' + prefix.toLowerCase() + '-') : '') + 'user-select'; + + e.style.cssText = prop + ': text;'; + if (e.style[propCC] == 'text') { + t = true; + return false; + } + + return true; + }); + + return t; +})(); +*/ + +if (!$.ui || !$.ui.widget) { + // duck punch $.cleanData like jQueryUI does to get that remove event + // https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js#L16-24 + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + try { + $( elem ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + } + _cleanData( elems ); + }; +} + +var // currently active contextMenu trigger + $currentTrigger = null, + // is contextMenu initialized with at least one menu? + initialized = false, + // window handle + $win = $(window), + // number of registered menus + counter = 0, + // mapping selector to namespace + namespaces = {}, + // mapping namespace to options + menus = {}, + // custom command type handlers + types = {}, + // default values + defaults = { + // selector of contextMenu trigger + selector: null, + // where to append the menu to + appendTo: null, + // method to trigger context menu ["right", "left", "hover"] + trigger: "right", + // hide menu when mouse leaves trigger / menu elements + autoHide: false, + // ms to wait before showing a hover-triggered context menu + delay: 200, + // flag denoting if a second trigger should simply move (true) or rebuild (false) an open menu + // as long as the trigger happened on one of the trigger-element's child nodes + reposition: true, + // determine position to show menu at + determinePosition: function($menu) { + // position to the lower middle of the trigger element + if ($.ui && $.ui.position) { + // .position() is provided as a jQuery UI utility + // (...and it won't work on hidden elements) + $menu.css('display', 'block').position({ + my: "center top", + at: "center bottom", + of: this, + offset: "0 5", + collision: "fit" + }).css('display', 'none'); + } else { + // determine contextMenu position + var offset = this.offset(); + offset.top += this.outerHeight(); + offset.left += this.outerWidth() / 2 - $menu.outerWidth() / 2; + $menu.css(offset); + } + }, + // position menu + position: function(opt, x, y) { + var $this = this, + offset; + // determine contextMenu position + if (!x && !y) { + opt.determinePosition.call(this, opt.$menu); + return; + } else if (x === "maintain" && y === "maintain") { + // x and y must not be changed (after re-show on command click) + offset = opt.$menu.position(); + } else { + // x and y are given (by mouse event) + offset = {top: y, left: x}; + } + + // correct offset if viewport demands it + var bottom = $win.scrollTop() + $win.height(), + right = $win.scrollLeft() + $win.width(), + height = opt.$menu.height(), + width = opt.$menu.width(); + + if (offset.top + height > bottom) { + offset.top -= height; + } + + if (offset.top<0) { + offset.top = 0; + } + + if (offset.left + width > right) { + offset.left -= width; + } + + opt.$menu.css(offset); + }, + // position the sub-menu + positionSubmenu: function($menu) { + if ($.ui && $.ui.position) { + // .position() is provided as a jQuery UI utility + // (...and it won't work on hidden elements) + $menu.css('display', 'block').position({ + my: "left top", + at: "right top", + of: this, + collision: "flipfit fit" + }).css('display', ''); + } else { + // determine contextMenu position + var offset = { + top: 0, + left: this.outerWidth() + }; + $menu.css(offset); + } + }, + // offset to add to zIndex + zIndex: 1, + // show hide animation settings + animation: { + duration: 50, + show: 'slideDown', + hide: 'slideUp' + }, + // events + events: { + show: $.noop, + hide: $.noop + }, + // default callback + callback: null, + // list of contextMenu items + items: {} + }, + // mouse position for hover activation + hoveract = { + timer: null, + pageX: null, + pageY: null + }, + // determine zIndex + zindex = function($t) { + var zin = 0, + $tt = $t; + + while (true) { + zin = Math.max(zin, parseInt($tt.css('z-index'), 10) || 0); + $tt = $tt.parent(); + if (!$tt || !$tt.length || "html body".indexOf($tt.prop('nodeName').toLowerCase()) > -1 ) { + break; + } + } + + return zin; + }, + // event handlers + handle = { + // abort anything + abortevent: function(e){ + e.preventDefault(); + e.stopImmediatePropagation(); + }, + + // contextmenu show dispatcher + contextmenu: function(e) { + var $this = $(this); + + // disable actual context-menu if we are using the right mouse button as the trigger + if (e.data.trigger == 'right') { + e.preventDefault(); + e.stopImmediatePropagation(); + } + + // abort native-triggered events unless we're triggering on right click + if (e.data.trigger != 'right' && e.originalEvent) { + return; + } + + // abort event if menu is visible for this trigger + if ($this.hasClass('context-menu-active')) { + return; + } + + if (!$this.hasClass('context-menu-disabled')) { + // theoretically need to fire a show event at + // http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#context-menus + // var evt = jQuery.Event("show", { data: data, pageX: e.pageX, pageY: e.pageY, relatedTarget: this }); + // e.data.$menu.trigger(evt); + + $currentTrigger = $this; + if (e.data.build) { + var built = e.data.build($currentTrigger, e); + // abort if build() returned false + if (built === false) { + return; + } + + // dynamically build menu on invocation + e.data = $.extend(true, {}, defaults, e.data, built || {}); + + // abort if there are no items to display + if (!e.data.items || $.isEmptyObject(e.data.items)) { + // Note: jQuery captures and ignores errors from event handlers + if (window.console) { + (console.error || console.log).call(console, "No items specified to show in contextMenu"); + } + + throw new Error('No Items specified'); + } + + // backreference for custom command type creation + e.data.$trigger = $currentTrigger; + + op.create(e.data); + } + // show menu + op.show.call($this, e.data, e.pageX, e.pageY); + } + }, + // contextMenu left-click trigger + click: function(e) { + e.preventDefault(); + e.stopImmediatePropagation(); + $(this).trigger($.Event("contextmenu", { data: e.data, pageX: e.pageX, pageY: e.pageY })); + }, + // contextMenu right-click trigger + mousedown: function(e) { + // register mouse down + var $this = $(this); + + // hide any previous menus + if ($currentTrigger && $currentTrigger.length && !$currentTrigger.is($this)) { + $currentTrigger.data('contextMenu').$menu.trigger('contextmenu:hide'); + } + + // activate on right click + if (e.button == 2) { + $currentTrigger = $this.data('contextMenuActive', true); + } + }, + // contextMenu right-click trigger + mouseup: function(e) { + // show menu + var $this = $(this); + if ($this.data('contextMenuActive') && $currentTrigger && $currentTrigger.length && $currentTrigger.is($this) && !$this.hasClass('context-menu-disabled')) { + e.preventDefault(); + e.stopImmediatePropagation(); + $currentTrigger = $this; + $this.trigger($.Event("contextmenu", { data: e.data, pageX: e.pageX, pageY: e.pageY })); + } + + $this.removeData('contextMenuActive'); + }, + // contextMenu hover trigger + mouseenter: function(e) { + var $this = $(this), + $related = $(e.relatedTarget), + $document = $(document); + + // abort if we're coming from a menu + if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) { + return; + } + + // abort if a menu is shown + if ($currentTrigger && $currentTrigger.length) { + return; + } + + hoveract.pageX = e.pageX; + hoveract.pageY = e.pageY; + hoveract.data = e.data; + $document.on('mousemove.contextMenuShow', handle.mousemove); + hoveract.timer = setTimeout(function() { + hoveract.timer = null; + $document.off('mousemove.contextMenuShow'); + $currentTrigger = $this; + $this.trigger($.Event("contextmenu", { data: hoveract.data, pageX: hoveract.pageX, pageY: hoveract.pageY })); + }, e.data.delay ); + }, + // contextMenu hover trigger + mousemove: function(e) { + hoveract.pageX = e.pageX; + hoveract.pageY = e.pageY; + }, + // contextMenu hover trigger + mouseleave: function(e) { + // abort if we're leaving for a menu + var $related = $(e.relatedTarget); + if ($related.is('.context-menu-list') || $related.closest('.context-menu-list').length) { + return; + } + + try { + clearTimeout(hoveract.timer); + } catch(e) {} + + hoveract.timer = null; + }, + + // click on layer to hide contextMenu + layerClick: function(e) { + var $this = $(this), + root = $this.data('contextMenuRoot'), + button = e.button, + x = e.pageX, + y = e.pageY, + target, + offset; + + e.preventDefault(); + e.stopImmediatePropagation(); + + setTimeout(function() { + var $window; + var triggerAction = ((root.trigger == 'left' && button === 0) || (root.trigger == 'right' && button === 2)); + + // find the element that would've been clicked, wasn't the layer in the way + if (document.elementFromPoint) { + root.$layer.hide(); + target = document.elementFromPoint(x - $win.scrollLeft(), y - $win.scrollTop()); + root.$layer.show(); + } + + if (root.reposition && triggerAction) { + if (document.elementFromPoint) { + if (root.$trigger.is(target) || root.$trigger.has(target).length) { + root.position.call(root.$trigger, root, x, y); + return; + } + } else { + offset = root.$trigger.offset(); + $window = $(window); + // while this looks kinda awful, it's the best way to avoid + // unnecessarily calculating any positions + offset.top += $window.scrollTop(); + if (offset.top <= e.pageY) { + offset.left += $window.scrollLeft(); + if (offset.left <= e.pageX) { + offset.bottom = offset.top + root.$trigger.outerHeight(); + if (offset.bottom >= e.pageY) { + offset.right = offset.left + root.$trigger.outerWidth(); + if (offset.right >= e.pageX) { + // reposition + root.position.call(root.$trigger, root, x, y); + return; + } + } + } + } + } + } + + if (target && triggerAction) { + root.$trigger.one('contextmenu:hidden', function() { + $(target).contextMenu({x: x, y: y}); + }); + } + + root.$menu.trigger('contextmenu:hide'); + }, 50); + }, + // key handled :hover + keyStop: function(e, opt) { + if (!opt.isInput) { + e.preventDefault(); + } + + e.stopPropagation(); + }, + key: function(e) { + + var opt = {}; + + // Only get the data from $currentTrigger if it exists + if ($currentTrigger) { + opt = $currentTrigger.data('contextMenu') || {}; + } + + switch (e.keyCode) { + case 9: + case 38: // up + handle.keyStop(e, opt); + // if keyCode is [38 (up)] or [9 (tab) with shift] + if (opt.isInput) { + if (e.keyCode == 9 && e.shiftKey) { + e.preventDefault(); + opt.$selected && opt.$selected.find('input, textarea, select').blur(); + opt.$menu.trigger('prevcommand'); + return; + } else if (e.keyCode == 38 && opt.$selected.find('input, textarea, select').prop('type') == 'checkbox') { + // checkboxes don't capture this key + e.preventDefault(); + return; + } + } else if (e.keyCode != 9 || e.shiftKey) { + opt.$menu.trigger('prevcommand'); + return; + } + // omitting break; + + // case 9: // tab - reached through omitted break; + case 40: // down + handle.keyStop(e, opt); + if (opt.isInput) { + if (e.keyCode == 9) { + e.preventDefault(); + opt.$selected && opt.$selected.find('input, textarea, select').blur(); + opt.$menu.trigger('nextcommand'); + return; + } else if (e.keyCode == 40 && opt.$selected.find('input, textarea, select').prop('type') == 'checkbox') { + // checkboxes don't capture this key + e.preventDefault(); + return; + } + } else { + opt.$menu.trigger('nextcommand'); + return; + } + break; + + case 37: // left + handle.keyStop(e, opt); + if (opt.isInput || !opt.$selected || !opt.$selected.length) { + break; + } + + if (!opt.$selected.parent().hasClass('context-menu-root')) { + var $parent = opt.$selected.parent().parent(); + opt.$selected.trigger('contextmenu:blur'); + opt.$selected = $parent; + return; + } + break; + + case 39: // right + handle.keyStop(e, opt); + if (opt.isInput || !opt.$selected || !opt.$selected.length) { + break; + } + + var itemdata = opt.$selected.data('contextMenu') || {}; + if (itemdata.$menu && opt.$selected.hasClass('context-menu-submenu')) { + opt.$selected = null; + itemdata.$selected = null; + itemdata.$menu.trigger('nextcommand'); + return; + } + break; + + case 35: // end + case 36: // home + if (opt.$selected && opt.$selected.find('input, textarea, select').length) { + return; + } else { + (opt.$selected && opt.$selected.parent() || opt.$menu) + .children(':not(.disabled, .not-selectable)')[e.keyCode == 36 ? 'first' : 'last']() + .trigger('contextmenu:focus'); + e.preventDefault(); + return; + } + break; + + case 13: // enter + handle.keyStop(e, opt); + if (opt.isInput) { + if (opt.$selected && !opt.$selected.is('textarea, select')) { + e.preventDefault(); + return; + } + break; + } + opt.$selected && opt.$selected.trigger('mouseup'); + return; + + case 32: // space + case 33: // page up + case 34: // page down + // prevent browser from scrolling down while menu is visible + handle.keyStop(e, opt); + return; + + case 27: // esc + handle.keyStop(e, opt); + opt.$menu.trigger('contextmenu:hide'); + return; + + default: // 0-9, a-z + var k = (String.fromCharCode(e.keyCode)).toUpperCase(); + if (opt.accesskeys && opt.accesskeys[k]) { + // according to the specs accesskeys must be invoked immediately + opt.accesskeys[k].$node.trigger(opt.accesskeys[k].$menu + ? 'contextmenu:focus' + : 'mouseup' + ); + return; + } + break; + } + // pass event to selected item, + // stop propagation to avoid endless recursion + e.stopPropagation(); + opt.$selected && opt.$selected.trigger(e); + }, + + // select previous possible command in menu + prevItem: function(e) { + e.stopPropagation(); + var opt = $(this).data('contextMenu') || {}; + + // obtain currently selected menu + if (opt.$selected) { + var $s = opt.$selected; + opt = opt.$selected.parent().data('contextMenu') || {}; + opt.$selected = $s; + } + + var $children = opt.$menu.children(), + $prev = !opt.$selected || !opt.$selected.prev().length ? $children.last() : opt.$selected.prev(), + $round = $prev; + + // skip disabled + while ($prev.hasClass('disabled') || $prev.hasClass('not-selectable')) { + if ($prev.prev().length) { + $prev = $prev.prev(); + } else { + $prev = $children.last(); + } + if ($prev.is($round)) { + // break endless loop + return; + } + } + + // leave current + if (opt.$selected) { + handle.itemMouseleave.call(opt.$selected.get(0), e); + } + + // activate next + handle.itemMouseenter.call($prev.get(0), e); + + // focus input + var $input = $prev.find('input, textarea, select'); + if ($input.length) { + $input.focus(); + } + }, + // select next possible command in menu + nextItem: function(e) { + e.stopPropagation(); + var opt = $(this).data('contextMenu') || {}; + + // obtain currently selected menu + if (opt.$selected) { + var $s = opt.$selected; + opt = opt.$selected.parent().data('contextMenu') || {}; + opt.$selected = $s; + } + + var $children = opt.$menu.children(), + $next = !opt.$selected || !opt.$selected.next().length ? $children.first() : opt.$selected.next(), + $round = $next; + + // skip disabled + while ($next.hasClass('disabled') || $next.hasClass('not-selectable')) { + if ($next.next().length) { + $next = $next.next(); + } else { + $next = $children.first(); + } + if ($next.is($round)) { + // break endless loop + return; + } + } + + // leave current + if (opt.$selected) { + handle.itemMouseleave.call(opt.$selected.get(0), e); + } + + // activate next + handle.itemMouseenter.call($next.get(0), e); + + // focus input + var $input = $next.find('input, textarea, select'); + if ($input.length) { + $input.focus(); + } + }, + + // flag that we're inside an input so the key handler can act accordingly + focusInput: function(e) { + var $this = $(this).closest('.context-menu-item'), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + root.$selected = opt.$selected = $this; + root.isInput = opt.isInput = true; + }, + // flag that we're inside an input so the key handler can act accordingly + blurInput: function(e) { + var $this = $(this).closest('.context-menu-item'), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + root.isInput = opt.isInput = false; + }, + + // :hover on menu + menuMouseenter: function(e) { + var root = $(this).data().contextMenuRoot; + root.hovering = true; + }, + // :hover on menu + menuMouseleave: function(e) { + var root = $(this).data().contextMenuRoot; + if (root.$layer && root.$layer.is(e.relatedTarget)) { + root.hovering = false; + } + }, + + // :hover done manually so key handling is possible + itemMouseenter: function(e) { + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + root.hovering = true; + + // abort if we're re-entering + if (e && root.$layer && root.$layer.is(e.relatedTarget)) { + e.preventDefault(); + e.stopImmediatePropagation(); + } + + // make sure only one item is selected + (opt.$menu ? opt : root).$menu + .children('.hover').trigger('contextmenu:blur'); + + if ($this.hasClass('disabled') || $this.hasClass('not-selectable')) { + opt.$selected = null; + return; + } + + $this.trigger('contextmenu:focus'); + }, + // :hover done manually so key handling is possible + itemMouseleave: function(e) { + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + if (root !== opt && root.$layer && root.$layer.is(e.relatedTarget)) { + root.$selected && root.$selected.trigger('contextmenu:blur'); + e.preventDefault(); + e.stopImmediatePropagation(); + root.$selected = opt.$selected = opt.$node; + return; + } + + $this.trigger('contextmenu:blur'); + }, + // contextMenu item click + itemClick: function(e) { + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot, + key = data.contextMenuKey, + callback; + + // abort if the key is unknown or disabled or is a menu + if (!opt.items[key] || $this.is('.disabled, .context-menu-submenu, .context-menu-separator, .not-selectable')) { + return; + } + + e.preventDefault(); + e.stopImmediatePropagation(); + + if ($.isFunction(root.callbacks[key]) && Object.prototype.hasOwnProperty.call(root.callbacks, key)) { + // item-specific callback + callback = root.callbacks[key]; + } else if ($.isFunction(root.callback)) { + // default callback + callback = root.callback; + } else { + // no callback, no action + return; + } + + // hide menu if callback doesn't stop that + if (callback.call(root.$trigger, key, root) !== false) { + root.$menu.trigger('contextmenu:hide'); + } else if (root.$menu.parent().length) { + op.update.call(root.$trigger, root); + } + }, + // ignore click events on input elements + inputClick: function(e) { + e.stopImmediatePropagation(); + }, + + // hide + hideMenu: function(e, data) { + var root = $(this).data('contextMenuRoot'); + op.hide.call(root.$trigger, root, data && data.force); + }, + // focus + focusItem: function(e) { + e.stopPropagation(); + var $this = $(this), + data = $this.data(), + opt = data.contextMenu, + root = data.contextMenuRoot; + + $this.addClass('hover') + .siblings('.hover').trigger('contextmenu:blur'); + + // remember selected + opt.$selected = root.$selected = $this; + + // position sub-menu - do after show so dumb $.ui.position can keep up + if (opt.$node) { + root.positionSubmenu.call(opt.$node, opt.$menu); + } + }, + // blur + blurItem: function(e) { + e.stopPropagation(); + var $this = $(this), + data = $this.data(), + opt = data.contextMenu; + + $this.removeClass('hover'); + opt.$selected = null; + } + }, + // operations + op = { + show: function(opt, x, y) { + var $trigger = $(this), + css = {}; + + // hide any open menus + $('#context-menu-layer').trigger('mousedown'); + + // backreference for callbacks + opt.$trigger = $trigger; + + // show event + if (opt.events.show.call($trigger, opt) === false) { + $currentTrigger = null; + return; + } + + // create or update context menu + op.update.call($trigger, opt); + + // position menu + opt.position.call($trigger, opt, x, y); + + // make sure we're in front + if (opt.zIndex) { + css.zIndex = zindex($trigger) + opt.zIndex; + } + + // add layer + op.layer.call(opt.$menu, opt, css.zIndex); + + // adjust sub-menu zIndexes + opt.$menu.find('ul').css('zIndex', css.zIndex + 1); + + // position and show context menu + opt.$menu.css( css )[opt.animation.show](opt.animation.duration, function() { + $trigger.trigger('contextmenu:visible'); + }); + // make options available and set state + $trigger + .data('contextMenu', opt) + .addClass("context-menu-active"); + + // register key handler + $(document).off('keydown.contextMenu').on('keydown.contextMenu', handle.key); + // register autoHide handler + if (opt.autoHide) { + // mouse position handler + $(document).on('mousemove.contextMenuAutoHide', function(e) { + // need to capture the offset on mousemove, + // since the page might've been scrolled since activation + var pos = $trigger.offset(); + pos.right = pos.left + $trigger.outerWidth(); + pos.bottom = pos.top + $trigger.outerHeight(); + + if (opt.$layer && !opt.hovering && (!(e.pageX >= pos.left && e.pageX <= pos.right) || !(e.pageY >= pos.top && e.pageY <= pos.bottom))) { + // if mouse in menu... + opt.$menu.trigger('contextmenu:hide'); + } + }); + } + }, + hide: function(opt, force) { + var $trigger = $(this); + if (!opt) { + opt = $trigger.data('contextMenu') || {}; + } + + // hide event + if (!force && opt.events && opt.events.hide.call($trigger, opt) === false) { + return; + } + + // remove options and revert state + $trigger + .removeData('contextMenu') + .removeClass("context-menu-active"); + + if (opt.$layer) { + // keep layer for a bit so the contextmenu event can be aborted properly by opera + setTimeout((function($layer) { + return function(){ + $layer.remove(); + }; + })(opt.$layer), 10); + + try { + delete opt.$layer; + } catch(e) { + opt.$layer = null; + } + } + + // remove handle + $currentTrigger = null; + // remove selected + opt.$menu.find('.hover').trigger('contextmenu:blur'); + opt.$selected = null; + // unregister key and mouse handlers + //$(document).off('.contextMenuAutoHide keydown.contextMenu'); // http://bugs.jquery.com/ticket/10705 + $(document).off('.contextMenuAutoHide').off('keydown.contextMenu'); + // hide menu + opt.$menu && opt.$menu[opt.animation.hide](opt.animation.duration, function (){ + // tear down dynamically built menu after animation is completed. + if (opt.build) { + opt.$menu.remove(); + $.each(opt, function(key, value) { + switch (key) { + case 'ns': + case 'selector': + case 'build': + case 'trigger': + return true; + + default: + opt[key] = undefined; + try { + delete opt[key]; + } catch (e) {} + return true; + } + }); + } + + setTimeout(function() { + $trigger.trigger('contextmenu:hidden'); + }, 10); + }); + }, + create: function(opt, root) { + if (root === undefined) { + root = opt; + } + // create contextMenu + opt.$menu = $('
      ').addClass(opt.className || "").data({ + 'contextMenu': opt, + 'contextMenuRoot': root + }); + + $.each(['callbacks', 'commands', 'inputs'], function(i,k){ + opt[k] = {}; + if (!root[k]) { + root[k] = {}; + } + }); + + root.accesskeys || (root.accesskeys = {}); + + // create contextMenu items + $.each(opt.items, function(key, item){ + var $t = $('
    • ').addClass(item.className || ""), + $label = null, + $input = null; + + // iOS needs to see a click-event bound to an element to actually + // have the TouchEvents infrastructure trigger the click event + $t.on('click', $.noop); + + item.$node = $t.data({ + 'contextMenu': opt, + 'contextMenuRoot': root, + 'contextMenuKey': key + }); + + // register accesskey + // NOTE: the accesskey attribute should be applicable to any element, but Safari5 and Chrome13 still can't do that + if (item.accesskey) { + var aks = splitAccesskey(item.accesskey); + for (var i=0, ak; ak = aks[i]; i++) { + if (!root.accesskeys[ak]) { + root.accesskeys[ak] = item; + item._name = item.name.replace(new RegExp('(' + ak + ')', 'i'), '$1'); + break; + } + } + } + + if (typeof item == "string") { + $t.addClass('context-menu-separator not-selectable'); + } else if (item.type && types[item.type]) { + // run custom type handler + types[item.type].call($t, item, opt, root); + // register commands + $.each([opt, root], function(i,k){ + k.commands[key] = item; + if ($.isFunction(item.callback)) { + k.callbacks[key] = item.callback; + } + }); + } else { + // add label for input + if (item.type == 'html') { + $t.addClass('context-menu-html not-selectable'); + } else if (item.type) { + $label = $('').appendTo($t); + $('').text(item._name || item.name).appendTo($label); + $t.addClass('context-menu-input'); + opt.hasTypes = true; + $.each([opt, root], function(i,k){ + k.commands[key] = item; + k.inputs[key] = item; + }); + } else if (item.items) { + item.type = 'sub'; + } + + switch (item.type) { + case 'text': + $input = $('') + .attr('name', 'context-menu-input-' + key) + .val(item.value || "") + .appendTo($label); + break; + + case 'textarea': + $input = $('') + .attr('name', 'context-menu-input-' + key) + .val(item.value || "") + .appendTo($label); + + if (item.height) { + $input.height(item.height); + } + break; + + case 'checkbox': + $input = $('') + .attr('name', 'context-menu-input-' + key) + .val(item.value || "") + .prop("checked", !!item.selected) + .prependTo($label); + break; + + case 'radio': + $input = $('') + .attr('name', 'context-menu-input-' + item.radio) + .val(item.value || "") + .prop("checked", !!item.selected) + .prependTo($label); + break; + + case 'select': + $input = $(' + if (item.type && item.type != 'sub' && item.type != 'html') { + $input + .on('focus', handle.focusInput) + .on('blur', handle.blurInput); + + if (item.events) { + $input.on(item.events, opt); + } + } + + // add icons + if (item.icon) { + $t.addClass("icon icon-" + item.icon); + } + } + + // cache contained elements + item.$input = $input; + item.$label = $label; + + // attach item to menu + $t.appendTo(opt.$menu); + + // Disable text selection + if (!opt.hasTypes && $.support.eventSelectstart) { + // browsers support user-select: none, + // IE has a special event for text-selection + // browsers supporting neither will not be preventing text-selection + $t.on('selectstart.disableTextSelect', handle.abortevent); + } + }); + // attach contextMenu to (to bypass any possible overflow:hidden issues on parents of the trigger element) + if (!opt.$node) { + opt.$menu.css('display', 'none').addClass('context-menu-root'); + } + opt.$menu.appendTo(opt.appendTo || document.body); + }, + resize: function($menu, nested) { + // determine widths of submenus, as CSS won't grow them automatically + // position:absolute within position:absolute; min-width:100; max-width:200; results in width: 100; + // kinda sucks hard... + + // determine width of absolutely positioned element + $menu.css({position: 'absolute', display: 'block'}); + // don't apply yet, because that would break nested elements' widths + // add a pixel to circumvent word-break issue in IE9 - #80 + $menu.data('width', Math.ceil($menu.width()) + 1); + // reset styles so they allow nested elements to grow/shrink naturally + $menu.css({ + position: 'static', + minWidth: '0px', + maxWidth: '100000px' + }); + // identify width of nested menus + $menu.find('> li > ul').each(function() { + op.resize($(this), true); + }); + // reset and apply changes in the end because nested + // elements' widths wouldn't be calculatable otherwise + if (!nested) { + $menu.find('ul').addBack().css({ + position: '', + display: '', + minWidth: '', + maxWidth: '' + }).width(function() { + return $(this).data('width'); + }); + } + }, + update: function(opt, root) { + var $trigger = this; + if (root === undefined) { + root = opt; + op.resize(opt.$menu); + } + // re-check disabled for each item + opt.$menu.children().each(function(){ + var $item = $(this), + key = $item.data('contextMenuKey'), + item = opt.items[key], + disabled = ($.isFunction(item.disabled) && item.disabled.call($trigger, key, root)) || item.disabled === true; + + // dis- / enable item + $item[disabled ? 'addClass' : 'removeClass']('disabled'); + + if (item.type) { + // dis- / enable input elements + $item.find('input, select, textarea').prop('disabled', disabled); + + // update input states + switch (item.type) { + case 'text': + case 'textarea': + item.$input.val(item.value || ""); + break; + + case 'checkbox': + case 'radio': + item.$input.val(item.value || "").prop('checked', !!item.selected); + break; + + case 'select': + item.$input.val(item.selected || ""); + break; + } + } + + if (item.$menu) { + // update sub-menu + op.update.call($trigger, item, root); + } + }); + }, + layer: function(opt, zIndex) { + // add transparent layer for click area + // filter and background for Internet Explorer, Issue #23 + var $layer = opt.$layer = $('
      ') + .css({height: $win.height(), width: $win.width(), display: 'block'}) + .data('contextMenuRoot', opt) + .insertBefore(this) + .on('contextmenu', handle.abortevent) + .on('mousedown', handle.layerClick); + + // IE6 doesn't know position:fixed; + if (document.body.style.maxWidth === undefined) {//IE6 doesn't support maxWidth + $layer.css({ + 'position' : 'absolute', + 'height' : $(document).height() + }); + } + + return $layer; + } + }; + +// split accesskey according to http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#assigned-access-key +function splitAccesskey(val) { + var t = val.split(/\s+/), + keys = []; + + for (var i=0, k; k = t[i]; i++) { + k = k.charAt(0).toUpperCase(); // first character only + // theoretically non-accessible characters should be ignored, but different systems, different keyboard layouts, ... screw it. + // a map to look up already used access keys would be nice + keys.push(k); + } + + return keys; +} + +// handle contextMenu triggers +$.fn.contextMenu = function(operation) { + if (operation === undefined) { + this.first().trigger('contextmenu'); + } else if (operation.x && operation.y) { + this.first().trigger($.Event("contextmenu", {pageX: operation.x, pageY: operation.y})); + } else if (operation === "hide") { + var $menu = this.first().data('contextMenu') ? this.first().data('contextMenu').$menu : null; + $menu && $menu.trigger('contextmenu:hide'); + } else if (operation === "destroy") { + $.contextMenu("destroy", {context: this}); + } else if ($.isPlainObject(operation)) { + operation.context = this; + $.contextMenu("create", operation); + } else if (operation) { + this.removeClass('context-menu-disabled'); + } else if (!operation) { + this.addClass('context-menu-disabled'); + } + + return this; +}; + +// manage contextMenu instances +$.contextMenu = function(operation, options) { + if (typeof operation != 'string') { + options = operation; + operation = 'create'; + } + + if (typeof options == 'string') { + options = {selector: options}; + } else if (options === undefined) { + options = {}; + } + + // merge with default options + var o = $.extend(true, {}, defaults, options || {}); + var $document = $(document); + var $context = $document; + var _hasContext = false; + + if (!o.context || !o.context.length) { + o.context = document; + } else { + // you never know what they throw at you... + $context = $(o.context).first(); + o.context = $context.get(0); + _hasContext = o.context !== document; + } + + switch (operation) { + case 'create': + // no selector no joy + if (!o.selector) { + throw new Error('No selector specified'); + } + // make sure internal classes are not bound to + if (o.selector.match(/.context-menu-(list|item|input)($|\s)/)) { + throw new Error('Cannot bind to selector "' + o.selector + '" as it contains a reserved className'); + } + if (!o.build && (!o.items || $.isEmptyObject(o.items))) { + throw new Error('No Items specified'); + } + counter ++; + o.ns = '.contextMenu' + counter; + if (!_hasContext) { + namespaces[o.selector] = o.ns; + } + menus[o.ns] = o; + + // default to right click + if (!o.trigger) { + o.trigger = 'right'; + } + + if (!initialized) { + // make sure item click is registered first + $document + .on({ + 'contextmenu:hide.contextMenu': handle.hideMenu, + 'prevcommand.contextMenu': handle.prevItem, + 'nextcommand.contextMenu': handle.nextItem, + 'contextmenu.contextMenu': handle.abortevent, + 'mouseenter.contextMenu': handle.menuMouseenter, + 'mouseleave.contextMenu': handle.menuMouseleave + }, '.context-menu-list') + .on('mouseup.contextMenu', '.context-menu-input', handle.inputClick) + .on({ + 'mouseup.contextMenu': handle.itemClick, + 'contextmenu:focus.contextMenu': handle.focusItem, + 'contextmenu:blur.contextMenu': handle.blurItem, + 'contextmenu.contextMenu': handle.abortevent, + 'mouseenter.contextMenu': handle.itemMouseenter, + 'mouseleave.contextMenu': handle.itemMouseleave + }, '.context-menu-item'); + + initialized = true; + } + + // engage native contextmenu event + $context + .on('contextmenu' + o.ns, o.selector, o, handle.contextmenu); + + if (_hasContext) { + // add remove hook, just in case + $context.on('remove' + o.ns, function() { + $(this).contextMenu("destroy"); + }); + } + + switch (o.trigger) { + case 'hover': + $context + .on('mouseenter' + o.ns, o.selector, o, handle.mouseenter) + .on('mouseleave' + o.ns, o.selector, o, handle.mouseleave); + break; + + case 'left': + $context.on('click' + o.ns, o.selector, o, handle.click); + break; + /* + default: + // http://www.quirksmode.org/dom/events/contextmenu.html + $document + .on('mousedown' + o.ns, o.selector, o, handle.mousedown) + .on('mouseup' + o.ns, o.selector, o, handle.mouseup); + break; + */ + } + + // create menu + if (!o.build) { + op.create(o); + } + break; + + case 'destroy': + var $visibleMenu; + if (_hasContext) { + // get proper options + var context = o.context; + $.each(menus, function(ns, o) { + if (o.context !== context) { + return true; + } + + $visibleMenu = $('.context-menu-list').filter(':visible'); + if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is($(o.context).find(o.selector))) { + $visibleMenu.trigger('contextmenu:hide', {force: true}); + } + + try { + if (menus[o.ns].$menu) { + menus[o.ns].$menu.remove(); + } + + delete menus[o.ns]; + } catch(e) { + menus[o.ns] = null; + } + + $(o.context).off(o.ns); + + return true; + }); + } else if (!o.selector) { + $document.off('.contextMenu .contextMenuAutoHide'); + $.each(menus, function(ns, o) { + $(o.context).off(o.ns); + }); + + namespaces = {}; + menus = {}; + counter = 0; + initialized = false; + + $('#context-menu-layer, .context-menu-list').remove(); + } else if (namespaces[o.selector]) { + $visibleMenu = $('.context-menu-list').filter(':visible'); + if ($visibleMenu.length && $visibleMenu.data().contextMenuRoot.$trigger.is(o.selector)) { + $visibleMenu.trigger('contextmenu:hide', {force: true}); + } + + try { + if (menus[namespaces[o.selector]].$menu) { + menus[namespaces[o.selector]].$menu.remove(); + } + + delete menus[namespaces[o.selector]]; + } catch(e) { + menus[namespaces[o.selector]] = null; + } + + $document.off(namespaces[o.selector]); + } + break; + + case 'html5': + // if or are not handled by the browser, + // or options was a bool true, + // initialize $.contextMenu for them + if ((!$.support.htmlCommand && !$.support.htmlMenuitem) || (typeof options == "boolean" && options)) { + $('menu[type="context"]').each(function() { + if (this.id) { + $.contextMenu({ + selector: '[contextmenu=' + this.id +']', + items: $.contextMenu.fromMenu(this) + }); + } + }).css('display', 'none'); + } + break; + + default: + throw new Error('Unknown operation "' + operation + '"'); + } + + return this; +}; + +// import values into commands +$.contextMenu.setInputValues = function(opt, data) { + if (data === undefined) { + data = {}; + } + + $.each(opt.inputs, function(key, item) { + switch (item.type) { + case 'text': + case 'textarea': + item.value = data[key] || ""; + break; + + case 'checkbox': + item.selected = data[key] ? true : false; + break; + + case 'radio': + item.selected = (data[item.radio] || "") == item.value ? true : false; + break; + + case 'select': + item.selected = data[key] || ""; + break; + } + }); +}; + +// export values from commands +$.contextMenu.getInputValues = function(opt, data) { + if (data === undefined) { + data = {}; + } + + $.each(opt.inputs, function(key, item) { + switch (item.type) { + case 'text': + case 'textarea': + case 'select': + data[key] = item.$input.val(); + break; + + case 'checkbox': + data[key] = item.$input.prop('checked'); + break; + + case 'radio': + if (item.$input.prop('checked')) { + data[item.radio] = item.value; + } + break; + } + }); + + return data; +}; + +// find