New Angular UI from 1806 93/56093/1
authorSonsino, Ofir (os0695) <os0695@intl.att.com>
Tue, 10 Jul 2018 12:57:37 +0000 (15:57 +0300)
committerSonsino, Ofir (os0695) <os0695@intl.att.com>
Tue, 10 Jul 2018 12:57:37 +0000 (15:57 +0300)
Change-Id: I39c160db0e0a6ec2e587ccf007ee1b23c6a08666
Issue-ID: VID-208
Signed-off-by: Sonsino, Ofir (os0695) <os0695@intl.att.com>
337 files changed:
vid-app-common/src/main/webapp/app/vid/scripts/controller/iframeController.js [new file with mode: 0644]
vid-app-common/src/main/webapp/app/vid/scripts/controller/iframeDialogController.js [new file with mode: 0644]
vid-app-common/src/main/webapp/app/vid/scripts/services/crService.js [new file with mode: 0644]
vid-webpack-master/.angular-cli.json [new file with mode: 0644]
vid-webpack-master/.editorconfig [new file with mode: 0644]
vid-webpack-master/.gitignore [new file with mode: 0644]
vid-webpack-master/.node-version [new file with mode: 0644]
vid-webpack-master/.npm-version [new file with mode: 0644]
vid-webpack-master/CHANGELOG.md [new file with mode: 0644]
vid-webpack-master/LICENSE [new file with mode: 0644]
vid-webpack-master/README.md [new file with mode: 0644]
vid-webpack-master/cypress.json [new file with mode: 0644]
vid-webpack-master/cypress/fixtures/constants.ts [new file with mode: 0644]
vid-webpack-master/cypress/fixtures/example.json [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/ala-carte.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/auditInfo.modal.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/drawingBoard.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/instantiationStatus.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/service.popup.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/tenantIsolation.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/iFrames/viewEdit.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/shared/error.message.popup.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/integration/shared/spinner.e2e.ts [new file with mode: 0644]
vid-webpack-master/cypress/plugins/cy-ts-preprocessor.js [new file with mode: 0644]
vid-webpack-master/cypress/plugins/index.js [new file with mode: 0644]
vid-webpack-master/cypress/support/application/application.session.actions.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/commands.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/elements/element.actions.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/elements/element.input.actions.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/elements/element.select.actions.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/elements/element.table.actions.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/index.js [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/jsonBuilder.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/aai.mock.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/a-la-carteService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstancePnfs.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstances.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServices.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubDetails.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForComplexService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/auditInfoMSO.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/auditInfoVid.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicAsyncInstantiation.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicService.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/categoryParametres.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/emptyObjectResponse.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/flags.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/service.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/subscribers.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/topMenuInfo.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/zones.json [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/mocks/vid.mock.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/models/aaiSubDetails.model.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/models/aaiSubViewEdit.model.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/models/asyncInstantiation.model.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/models/pnf.model.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/models/service.model.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/jsonBuilders/models/serviceInstances.model.ts [new file with mode: 0644]
vid-webpack-master/cypress/support/steps/login.step.ts [new file with mode: 0644]
vid-webpack-master/cypress/tsconfig.json [new file with mode: 0644]
vid-webpack-master/karma.conf.js [new file with mode: 0644]
vid-webpack-master/package-lock.json [new file with mode: 0644]
vid-webpack-master/package.json [new file with mode: 0644]
vid-webpack-master/polyfills.ts [new file with mode: 0644]
vid-webpack-master/pom.xml [new file with mode: 0644]
vid-webpack-master/postcss.config.js [new file with mode: 0644]
vid-webpack-master/protractor.conf.js [new file with mode: 0644]
vid-webpack-master/src/WEB-INF/web.xml [new file with mode: 0644]
vid-webpack-master/src/app/app.component.e2e-spec.js [new file with mode: 0644]
vid-webpack-master/src/app/app.component.html [new file with mode: 0644]
vid-webpack-master/src/app/app.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/app.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/app.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/app.routing.ts [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/browseSdc.component.html [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/browseSdc.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/browseSdc.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/browseSdc.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html [new file with mode: 0644]
vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss [new file with mode: 0644]
vid-webpack-master/src/app/components/form-async/form-async.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/form-async/form-async.style.scss [new file with mode: 0644]
vid-webpack-master/src/app/components/form-async/form-async.template.html [new file with mode: 0644]
vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-popup.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-popup.html [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-popup.scss [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/service-popup/service-popup.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss [new file with mode: 0644]
vid-webpack-master/src/app/components/vnf-popup/vnf-popup.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/configuration/vid.configuration.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/factories/models/requestDetails.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/factories/mso.factory.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/factories/mso.factory.ts [new file with mode: 0644]
vid-webpack-master/src/app/global.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/global.reducer.ts [new file with mode: 0644]
vid-webpack-master/src/app/healthStatus/health-status.component.html [new file with mode: 0644]
vid-webpack-master/src/app/healthStatus/health-status.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/healthStatus/health-status.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/home/home.component.e2e-spec.js [new file with mode: 0644]
vid-webpack-master/src/app/home/home.component.html [new file with mode: 0644]
vid-webpack-master/src/app/home/home.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/home/home.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/modules/inputs.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/service.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/service.reducer.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/service.reducer.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/aai.actions.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/aai.epics.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/aai.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/configuration.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/data.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/flags.resolve.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/msoService/mso.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/sdc.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/service-planning.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/services/service-planning.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/api.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/error/error.component.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/model-information/model-information.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/model-information/model-information.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/popover/popover.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/popover/popover.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/popover/popover.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/spinner/spinner.component.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/spinner/spinner.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/directives/svg/svg.directive.html [new file with mode: 0644]
vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/index.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/aicZone.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/categoryParams.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/dynamicInput.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/externalComponentStatus.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/inputTypes.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/lcpRegion.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/lcpRegionTenants.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/lcpRegionsAndTenants.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/modelInfo.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/nodeModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/owningEntity.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/productFamily.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/project.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/selectOption.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/serviceInstance.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/serviceModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/serviceNodeTypeToModelKeyMapper.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/serviceType.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/subscriber.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/tenant.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfModule.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfModuleInstance.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfModulesMap.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfcInstanceGroup.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfcInstanceGroupMap.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vfcInstanceGroupProperties.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vnfInstance.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vnfModel.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/models/vnfTreeNode.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/shared.module.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/utils/constants.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/utils/iframe.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts [new file with mode: 0644]
vid-webpack-master/src/app/shared/utils/log/log.service.ts [new file with mode: 0644]
vid-webpack-master/src/app/store/epics.ts [new file with mode: 0644]
vid-webpack-master/src/app/store/module.ts [new file with mode: 0644]
vid-webpack-master/src/app/store/reducers.ts [new file with mode: 0644]
vid-webpack-master/src/app/utils/utils.ts [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.html [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.scss [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts [new file with mode: 0644]
vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts [new file with mode: 0644]
vid-webpack-master/src/assets/.gitkeep [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/Apache License.txt [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Bold.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-BoldItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBold.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Italic.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Light.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-LightItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Regular.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Semibold.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-SemiboldItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/icomoon.eot [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/icomoon.svg [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/icomoon.ttf [new file with mode: 0644]
vid-webpack-master/src/assets/fonts/icomoon.woff [new file with mode: 0644]
vid-webpack-master/src/assets/img/Menu.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/UPLOAD.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/X_o.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/angular.png [new file with mode: 0644]
vid-webpack-master/src/assets/img/chevron.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/fail.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/favicon.ico [new file with mode: 0644]
vid-webpack-master/src/assets/img/inprogress.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/pause.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/pending.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/stoped.svg [new file with mode: 0644]
vid-webpack-master/src/assets/img/success+Circle.svg [new file with mode: 0644]
vid-webpack-master/src/environments/environment.prod.ts [new file with mode: 0644]
vid-webpack-master/src/environments/environment.ts [new file with mode: 0644]
vid-webpack-master/src/index.html [new file with mode: 0644]
vid-webpack-master/src/main.ts [new file with mode: 0644]
vid-webpack-master/src/polyfills.ts [new file with mode: 0644]
vid-webpack-master/src/public/img/UPLOAD.svg [new file with mode: 0644]
vid-webpack-master/src/public/img/angular.png [new file with mode: 0644]
vid-webpack-master/src/public/img/favicon.ico [new file with mode: 0644]
vid-webpack-master/src/public/img/spinner.gif [new file with mode: 0644]
vid-webpack-master/src/public/index.html [new file with mode: 0644]
vid-webpack-master/src/public/service-worker.js [new file with mode: 0644]
vid-webpack-master/src/style/app.scss [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/Apache License.txt [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Bold.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-BoldItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBold.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Italic.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Light.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-LightItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Regular.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Semibold.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/OpenSans/OpenSans-SemiboldItalic.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/icomoon.eot [new file with mode: 0644]
vid-webpack-master/src/style/fonts/icomoon.svg [new file with mode: 0644]
vid-webpack-master/src/style/fonts/icomoon.ttf [new file with mode: 0644]
vid-webpack-master/src/style/fonts/icomoon.woff [new file with mode: 0644]
vid-webpack-master/src/styles.scss [new file with mode: 0644]
vid-webpack-master/src/test.ts [new file with mode: 0644]
vid-webpack-master/src/tsconfig.app.json [new file with mode: 0644]
vid-webpack-master/src/tsconfig.spec.json [new file with mode: 0644]
vid-webpack-master/src/vendor.ts [new file with mode: 0644]
vid-webpack-master/tsconfig.json [new file with mode: 0644]
vid-webpack-master/tslint.json [new file with mode: 0644]
vid-webpack-master/typedoc.json [new file with mode: 0644]

diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/iframeController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/iframeController.js
new file mode 100644 (file)
index 0000000..007ed05
--- /dev/null
@@ -0,0 +1,7 @@
+"use strict";
+
+var iframeController = function($scope, $location) {
+    $scope.url = "app/ui/#" +  $location.$$url;
+}
+
+app.controller("iframeController", [ "$scope", "$location", iframeController ]);
\ No newline at end of file
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/iframeDialogController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/iframeDialogController.js
new file mode 100644 (file)
index 0000000..ab33206
--- /dev/null
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+"use strict";
+
+var iframeDialogController = function (COMPONENT, FIELD, PARAMETER, $scope, $http, $timeout, $log,
+                                         CreationService, UtilityService, DataService, $routeParams) {
+
+    $scope.isDialogVisible = false;
+
+    function receiveMessage(event) {
+        window.removeEventListener("message", receiveMessage, false);
+        $scope.isDialogVisible = false;
+        $scope.popup.isVisible = false;
+
+        if (event.data.eventId == 'submitIframe') {
+            CreationService.initializeComponent(COMPONENT.VNF);
+            var instanceId = $routeParams.serviceInstanceId;
+            DataService.setServiceInstanceId(instanceId);
+            console.log(event.data.data);
+
+            $scope.$broadcast(COMPONENT.MSO_CREATE_REQ, {
+                url: CreationService.getMsoUrl(),
+                requestDetails: event.data.data,
+                componentId: COMPONENT.VNF,
+                callbackFunction: function (response) {
+                    // if (response.isSuccessful) {
+                    //     $scope.popup.shouldShowIframePopup = false;
+                    // } else {
+                    $scope.isDialogVisible = false;
+                    $scope.popup.isVisible = false;
+                    // }
+                }
+            })
+        }
+        $scope.$apply();
+    }
+
+
+    $scope.$on(COMPONENT.IFRAME_DIALOG, function (event, data) {
+        var queryString = Object.keys(data).map(function(key) {
+            return key + '=' + data[key]
+        }).join('&');
+        $scope.url = COMPONENT.SUB_INTERFACE_POPUP_IFRAME_URL + queryString;
+        $scope.isDialogVisible = true;
+        $scope.popup.isVisible = true;
+
+        window.addEventListener("message", receiveMessage, false);
+    });
+};
+
+appDS2.controller("iframeDialogController", ["COMPONENT", "FIELD", "PARAMETER", "$scope", "$http",
+    "$timeout", "$log", "CreationService", "UtilityService", "DataService", "$routeParams",
+    iframeDialogController]);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/crService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/crService.js
new file mode 100644 (file)
index 0000000..ee45596
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+"use strict";
+
+var CrService = function (AaiService) {
+    return {
+        getCr: function (instance) {
+            return AaiService.getCRInformationByInstanceId(instance.serviceInstanceId);
+        }
+    };
+};
+
+appDS2.factory("CrService", ["AaiService", CrService]);
diff --git a/vid-webpack-master/.angular-cli.json b/vid-webpack-master/.angular-cli.json
new file mode 100644 (file)
index 0000000..0c2ce56
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "project": {
+    "name": "vid-cli"
+  },
+  "apps": [
+    {
+      "root": "src",
+      "outDir": "dist",
+      "assets": [
+        "assets",
+        "favicon.ico"
+      ],
+      "index": "index.html",
+      "main": "main.ts",
+      "polyfills": "polyfills.ts",
+      "test": "test.ts",
+      "tsconfig": "tsconfig.app.json",
+      "testTsconfig": "tsconfig.spec.json",
+      "prefix": "app",
+      "styles": [
+        "styles.scss",
+        "../node_modules/font-awesome/css/font-awesome.css",
+        "../node_modules/bootstrap/dist/css/bootstrap.min.css",
+        "../node_modules/angular-tree-component/dist/angular-tree-component.css"
+      ],
+      "scripts": [],
+      "environmentSource": "environments/environment.ts",
+      "environments": {
+        "dev": "environments/environment.ts",
+        "prod": "environments/environment.prod.ts"
+      }
+    }
+  ],
+  "e2e": {
+    "protractor": {
+      "config": "./protractor.conf.js"
+    }
+  },
+  "lint": [
+    {
+      "project": "src/tsconfig.app.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "src/tsconfig.spec.json",
+      "exclude": "**/node_modules/**"
+    }
+  ],
+  "test": {
+    "karma": {
+      "config": "./karma.conf.js"
+    }
+  },
+  "defaults": {
+    "styleExt": "scss",
+    "component": {}
+  }
+}
diff --git a/vid-webpack-master/.editorconfig b/vid-webpack-master/.editorconfig
new file mode 100644 (file)
index 0000000..a443ba7
--- /dev/null
@@ -0,0 +1,12 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/vid-webpack-master/.gitignore b/vid-webpack-master/.gitignore
new file mode 100644 (file)
index 0000000..cb1cd7b
--- /dev/null
@@ -0,0 +1,57 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Users Environment Variables
+.lock-wscript
+
+# OS generated files #
+.DS_Store
+ehthumbs.db
+Icon?
+Thumbs.db
+
+# Node Files #
+/node
+/node_modules
+/bower_components
+
+# Coverage #
+/coverage/
+
+# Typing #
+/src/typings/tsd/
+/typings/
+/tsd_typings/
+
+# Dist #
+/dist
+!/dist/.placeholder
+/public/__build__/
+/src/*/__build__/
+__build__/**
+.webpack.json
+
+# Doc #
+/doc/
+
+# IDE #
+.idea/
+*.swp
diff --git a/vid-webpack-master/.node-version b/vid-webpack-master/.node-version
new file mode 100644 (file)
index 0000000..675e45a
--- /dev/null
@@ -0,0 +1 @@
+8.9.3
\ No newline at end of file
diff --git a/vid-webpack-master/.npm-version b/vid-webpack-master/.npm-version
new file mode 100644 (file)
index 0000000..d41f08f
--- /dev/null
@@ -0,0 +1 @@
+5.5.1
\ No newline at end of file
diff --git a/vid-webpack-master/CHANGELOG.md b/vid-webpack-master/CHANGELOG.md
new file mode 100644 (file)
index 0000000..ba275de
--- /dev/null
@@ -0,0 +1,33 @@
+# Changelog
+
+# 04 October 2016
+
+- Migrate to webpack 2
+
+# 18 September 2016
+
+- Using `awesome-typescript-loader` instead of `ts-loader`.
+
+# 5 September 2016
+
+- Migration to TS2 and @types
+
+## 1 September 2016
+
+- Using RC6.
+
+## 28 August 2016
+
+- Adding webpack-dashboard.
+
+## 23 August 2016
+
+- Adding HMR support.
+
+## 3 July 2016
+
+- Use html5mode instead of hash navigation.
+
+## 24 June 2016
+
+- Be able to import Component's templates and styles without using require.
diff --git a/vid-webpack-master/LICENSE b/vid-webpack-master/LICENSE
new file mode 100644 (file)
index 0000000..ad6b740
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Preboot team
+
+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/vid-webpack-master/README.md b/vid-webpack-master/README.md
new file mode 100644 (file)
index 0000000..5c37773
--- /dev/null
@@ -0,0 +1,149 @@
+# angular-webpack
+
+[![Dependency Status](https://david-dm.org/preboot/angular-webpack/status.svg)](https://david-dm.org/preboot/angular-webpack#info=dependencies) [![devDependency Status](https://david-dm.org/preboot/angular-webpack/dev-status.svg)](https://david-dm.org/preboot/angular-webpack#info=devDependencies)
+[![Join the chat at https://gitter.im/preboot/angular-webpack](https://badges.gitter.im/preboot/angular-webpack.svg)](https://gitter.im/preboot/angular-webpack?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+A complete, yet simple, starter for Angular v2+ using Webpack.
+
+This seed repo serves as an Angular starter for anyone looking to get up and running with Angular and TypeScript fast. Using [Webpack](http://webpack.github.io/) for building our files and assisting with boilerplate. We're also using Protractor for our end-to-end story and Karma for our unit tests.
+* Best practices in file and application organization for [Angular](https://angular.io/).
+* Ready to go build system using [Webpack](https://webpack.github.io/docs/) for working with [TypeScript](http://www.typescriptlang.org/).
+* Testing Angular code with [Jasmine](http://jasmine.github.io/) and [Karma](http://karma-runner.github.io/).
+* Coverage with [Istanbul](https://github.com/gotwarlost/istanbul)
+* End-to-end Angular code using [Protractor](https://angular.github.io/protractor/).
+* Stylesheets with [SASS](http://sass-lang.com/) (not required, it supports regular css too).
+* Error reported with [TSLint](http://palantir.github.io/tslint/) and [Codelyzer](https://github.com/mgechev/codelyzer).
+* Documentation with [TypeDoc](http://typedoc.org/).
+
+>Warning: Make sure you're using the latest version of Node.js and NPM
+
+### Quick start
+
+```bash
+# clone our repo
+$ git clone https://github.com/preboot/angular-webpack.git my-app
+
+# change directory to your app
+$ cd vid-app
+
+# install the dependencies with npm
+$ npm install
+
+# start the server
+$ npm start
+```
+go to [http://localhost:8181](http://localhost:8181) in your browser.
+
+# Table of Contents
+
+* [Getting Started](#getting-started)
+    * [Dependencies](#dependencies)
+    * [Installing](#installing)
+    * [Developing](#developing)
+    * [Testing](#testing)
+    * [Production](#production)
+    * [Documentation](#documentation)
+* [Frequently asked questions](#faq)
+* [TypeScript](#typescript)
+* [License](#license)
+
+# Getting Started
+
+## Dependencies
+
+What you need to run this app:
+* `node` and `npm` (Use [NVM](https://github.com/creationix/nvm))
+* Ensure you're running Node (`v6.x.x`+) and NPM (`3.x.x`+)
+
+## Installing
+
+* `fork` this repo
+* `clone` your fork
+* `npm install` to install all dependencies
+
+## Developing
+
+After you have installed all dependencies you can now start developing with:
+
+* `npm start`
+
+It will start a local server using `webpack-dev-server` which will watch, build (in-memory), and reload for you. The application can be checked at `http://localhost:8181`.
+
+As an alternative, you can work using Hot Module Replacement (HMR):
+
+* `npm run start:hmr`
+
+And you are all set! You can now modify your components on the fly without having to reload the entire page.
+
+## Testing
+
+#### 1. Unit Tests
+
+* single run: `npm test`
+* live mode (TDD style): `npm run test-watch`
+
+#### 2. End-to-End Tests (aka. e2e, integration)
+
+* single run:
+  * in a tab, *if not already running!*: `npm start`
+  * in a new tab: `npm run webdriver-start`
+  * in another new tab: `npm run e2e`
+* interactive mode:
+  * instead of the last command above, you can run: `npm run e2e-live`
+  * when debugging or first writing test suites, you may find it helpful to try out Protractor commands without starting up the entire test suite. You can do this with the element explorer.
+  * you can learn more about [Protractor Interactive Mode here](https://github.com/angular/protractor/blob/master/docs/debugging.md#testing-out-protractor-interactively)
+
+## Production
+
+To build your application, run:
+
+* `npm run build`
+
+You can now go to `/dist` and deploy that to your server!
+
+## Documentation
+
+You can generate api docs (using [TypeDoc](http://typedoc.org/)) for your code with the following:
+
+* `npm run docs`
+
+# FAQ
+
+#### Do I need to add script / link tags into index.html ?
+
+No, Webpack will add all the needed Javascript bundles as script tags and all the CSS files as link tags. The advantage is that you don't need to modify the index.html every time you build your solution to update the hashes.
+
+#### How to include external angular libraries ?
+
+It's simple, just install the lib via npm and import it in your code when you need it. Don't forget that you need to configure some external libs in the [bootstrap](https://github.com/preboot/angular-webpack/blob/master/src/main.ts) of your application.
+
+#### How to include external css files such as bootstrap.css ?
+
+Just install the lib and import the css files in [vendor.ts](https://github.com/preboot/angular-webpack/blob/master/src/vendor.ts). For example this is how to do it with bootstrap:
+
+```sh
+npm install bootstrap@next --save
+```
+
+And in [vendor.ts](https://github.com/preboot/angular-webpack/blob/master/src/vendor.ts) add the following:
+
+```ts
+import 'bootstrap/dist/css/bootstrap.css';
+```
+
+# TypeScript
+
+> To take full advantage of TypeScript with autocomplete you would have to use an editor with the correct TypeScript plugins.
+
+## Use a TypeScript-aware editor
+
+We have good experience using these editors:
+
+* [Visual Studio Code](https://code.visualstudio.com/)
+* [Webstorm 11+](https://www.jetbrains.com/webstorm/download/)
+* [Atom](https://atom.io/) with [TypeScript plugin](https://atom.io/packages/atom-typescript)
+* [Sublime Text](http://www.sublimetext.com/3) with [Typescript-Sublime-Plugin](https://github.com/Microsoft/Typescript-Sublime-plugin#installation)
+
+# License
+
+[MIT](/LICENSE)
diff --git a/vid-webpack-master/cypress.json b/vid-webpack-master/cypress.json
new file mode 100644 (file)
index 0000000..eb8c6e4
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "chromeWebSecurity": false,
+  "hostPortPath": null,
+       "reporter": "junit",
+  "pageLoadTimeout" : 100000,
+  "defaultCommandTimeout" : 10000,
+  "responseTimeout" : 100000,
+       "reporterOptions": {
+               "mochaFile": "cypress/junitreport.xml",
+               "toConsole": true
+       }
+}
diff --git a/vid-webpack-master/cypress/fixtures/constants.ts b/vid-webpack-master/cypress/fixtures/constants.ts
new file mode 100644 (file)
index 0000000..794bcdc
--- /dev/null
@@ -0,0 +1,3 @@
+export const global = {
+  loginCookies : null
+};
diff --git a/vid-webpack-master/cypress/fixtures/example.json b/vid-webpack-master/cypress/fixtures/example.json
new file mode 100644 (file)
index 0000000..da18d93
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "name": "Using fixtures to represent data",
+  "email": "hello@cypress.io",
+  "body": "Fixtures are a great way to mock data for responses to routes"
+}
\ No newline at end of file
diff --git a/vid-webpack-master/cypress/integration/iFrames/ala-carte.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/ala-carte.e2e.ts
new file mode 100644 (file)
index 0000000..22eb88c
--- /dev/null
@@ -0,0 +1,80 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+/// <reference types="Cypress" />
+import { JsonBuilder } from '../../support/jsonBuilders/jsonBuilder';
+import { ServiceModel } from '../../support/jsonBuilders/models/service.model';
+
+describe('A la carte', function () {
+  describe('check service name', () => {
+    var jsonBuilderAAIService : JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.setReduxState();
+        cy.preventErrorsOnLoading();
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.initAlaCarteService();
+        cy.initZones();
+        cy.login();
+      });
+    });
+
+    const SERVICE_ID: string = '4d71990b-d8ad-4510-ac61-496288d9078e';
+    const INSTANCE_NAME_MANDATORY_MESSAGE: string = 'Missing data ("Instance Name" and 3 other fields';
+    const INSTANCE_NAME_NOT_MANDATORY_MESSAGE: string = 'Missing data ("Subscriber Name" and 2 other fields)';
+    const CONFIRM_BUTTON : string = 'confirmButton';
+
+
+    // function changeServiceName(obj : AAIServiceModel){
+    //   obj.service.version = "NEW VALUE";
+    //   return obj;
+    // }
+    it(`service name should be mandatory : serviceEcompNaming = false`, function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicService.json').then((res) => {
+        jsonBuilderAAIService.basicJson(res,
+          Cypress.config('baseUrl') + '/rest/models/services/4d71990b-d8ad-4510-ac61-496288d9078e',
+          200,
+          0,
+          SERVICE_ID + ' - service',
+          changeServiceEcompNamingToFalse);
+
+          checkServiceNameInputIdMandatory();
+      });
+    });
+
+    it(`service name should be mandatory : serviceEcompNaming = true`, function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicService.json').then((res) => {
+        jsonBuilderAAIService.basicJson(res,
+          Cypress.config('baseUrl') + '/rest/models/services/4d71990b-d8ad-4510-ac61-496288d9078e',
+          200,
+          0,
+          SERVICE_ID + ' - service',
+          changeServiceEcompNamingToTrue);
+          checkServiceNameInputIdMandatory();
+      });
+    });
+
+    function changeServiceEcompNamingToTrue(obj : ServiceModel){
+      obj.service.serviceEcompNaming = "true";
+      return obj;
+    }
+
+    function changeServiceEcompNamingToFalse(obj : ServiceModel){
+      obj.service.serviceEcompNaming = "false";
+      return obj;
+    }
+
+    function checkServiceNameInputIdMandatory(){
+      cy.get('span').contains('Browse ASDC Service Models').click({force: true})
+        .getElementByDataTestsId('deploy-' + SERVICE_ID).click({force: true})
+        .wait(1000).getElementByDataTestsId(CONFIRM_BUTTON).click({force: true})
+        .get('.error').contains(INSTANCE_NAME_MANDATORY_MESSAGE)
+        .typeToInput('instanceName', 'testService');
+
+      cy.getElementByDataTestsId(CONFIRM_BUTTON).click({force: true})
+        .get('.error').contains(INSTANCE_NAME_NOT_MANDATORY_MESSAGE);
+    }
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/auditInfo.modal.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/auditInfo.modal.e2e.ts
new file mode 100644 (file)
index 0000000..c915d48
--- /dev/null
@@ -0,0 +1,37 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+import { JsonBuilder } from '../../support/jsonBuilders/jsonBuilder';
+import { AsyncInstantiationModel } from '../../support/jsonBuilders/models/asyncInstantiation.model';
+
+describe('Audit information modal', function () {
+  describe('basic UI tests', () => {
+    var jsonBuilderInstantiationBuilder : JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.setReduxState();
+        cy.preventErrorsOnLoading();
+        jsonBuilderInstantiationBuilder.basicMock('/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json',
+          Cypress.config('baseUrl') + "/asyncInstantiation**");
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.login();
+      })
+    });
+
+    it(`should display 2 tables with information's`, function () {
+
+        cy.openIframe('app/ui/#/instantiationStatus');
+        cy.get('.instantiation-status-data tbody tr').each(function (row, index) {
+          cy.get('.icon-menu').eq(index).click()
+             .get('.audit-icon').click()
+            .get('#service-model-name').should('contain', row.find('#serviceModelName').text().trim())
+          .getElementByDataTestsId('model-item-value-userId').should('contain', row.find('#userId').text().trim())
+          .get('#service-instantiation-audit-info-vid').should('be.visible')
+          .get('#service-instantiation-audit-info-vid').find('#vidJobStatus').should('be.visible')
+          .get('#service-instantiation-audit-info-mso').should('be.visible')
+          .get('#service-instantiation-audit-info-mso').find('#msoJobStatus').should('be.visible')
+          .get('#cancelButton').click();
+        });
+    });
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/drawingBoard.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/drawingBoard.e2e.ts
new file mode 100644 (file)
index 0000000..2f98ba8
--- /dev/null
@@ -0,0 +1,130 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+describe('Drawing board', function () {
+  describe('basic UI tests', () => {
+
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.setReduxState();
+        cy.preventErrorsOnLoading();
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.login();
+      });
+    });
+
+
+    it('should display service model name', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+        cy.get('#service-model-name').contains('action-data');
+      });
+    });
+
+    it('should display icon and message if no vnf and vnfModules', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+
+        cy.get('#not-node-img-id').and('be.visible');
+      });
+    });
+
+    it('should show alert on remove vnf with modules', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json').then((res) => {
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+        cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0-menu-btn')
+          .click({force: true});
+        // assert vfModules are enabled
+        cy.get('.tree-node-disabled div[data-tests-id="node-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1"]')
+          .should('not.be.visible');
+        cy.get('.icon-trash').click();
+        cy.get('.title').contains('Remove VNF');
+        cy.get('.sdc-button').contains('Remove VNF').click();
+        // assert vfModules are disabled after remove parent vnf
+        cy.get('.tree-node-disabled div[data-tests-id="node-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1"]')
+          .should('be.visible');
+      });
+    });
+
+    it('should not show alert on remove vnf without modules', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json').then((res) => {
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+        cy.getElementByDataTestsId('node-0903e1c0-8e03-4936-b5c2-260653b96413-2017-388_ADIOD-vPE 1-menu-btn')
+          .click({force: true});
+        cy.get('.icon-trash').click();
+      });
+    });
+
+    it('should show <Automatically Assigned> if ecomp is true', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+        cy.getElementByDataTestsId('node-2017-488_ADIOD-vPE 0-add-btn').click({force: true});
+
+        cy.selectDropdownOptionByText('productFamily', 'DHV');
+        cy.selectDropdownOptionByText('lcpRegion', 'mtn6');
+        cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testgamma');
+        cy.selectDropdownOptionByText('lineOfBusiness', 'ECOMP');
+        cy.selectDropdownOptionByText('platform', 'platform');
+
+        cy.getElementByDataTestsId('vnf-form-set').click({force: true});
+
+        cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').contains('<Automatically Assigned>');
+      });
+    });
+
+    it('should show model nameif ecomp is false', function () {
+      const vnfModelName: string = '2017-488_ADIOD-vPE 0';
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json').then((res) => {
+        res.service.serviceHierarchy['2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd'].vnfs[vnfModelName].properties.ecomp_generated_naming = 'false';
+        cy.setReduxState(<any>res);
+        cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+        cy.getElementByDataTestsId('node-2017-488_ADIOD-vPE 0-add-btn').click({force: true});
+
+        cy.selectDropdownOptionByText('productFamily', 'DHV');
+        cy.selectDropdownOptionByText('lcpRegion', 'mtn6');
+        cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testgamma');
+        cy.selectDropdownOptionByText('lineOfBusiness', 'ECOMP');
+        cy.selectDropdownOptionByText('platform', 'platform');
+
+        cy.getElementByDataTestsId('vnf-form-set').click({force: true});
+
+        cy.getElementByDataTestsId('node-69e09f68-8b63-4cc9-b9ff-860960b5db09-2017-488_ADIOD-vPE 0').contains(vnfModelName);
+      });
+    });
+
+    // describe('add instance open a popup', () => {
+    //
+    //   it('shouldn add vfModule without popup with no empty required fields', function () {
+    //     cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json').then((res) => {
+    //       res.service.serviceInstance["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-488_ADIOD-vPE 0"].vfModules = [];
+    //       cy.setReduxState(<any>res);
+    //       cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+    //       cy.get('available-models-tree tree-node-expander').eq(2).click();
+    //       cy.getElementByDataTestsId('node-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1-add-btn').click();
+    //       cy.get('drawing-board-tree .toggle-children').click();
+    //       cy.getElementByDataTestsId('node-25284168-24bb-4698-8cb4-3f509146eca5-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1')
+    //         .and('be.visible');
+    //     });
+    //   });
+    //
+    //   it('should add vfModule with popup if empty required dynamic input', function () {
+    //     cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json').then((res) => {
+    //       res.service.serviceHierarchy["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-488_ADIOD-vPE 0"].vfModules["2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1"].inputs["adiodvpe0_bandwidth"].default = '';
+    //       res.service.serviceInstance["2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd"].vnfs["2017-488_ADIOD-vPE 0"].vfModules = [];
+    //       cy.setReduxState(<any>res);
+    //       cy.openIframe('app/ui/#/servicePlanning?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd');
+    //       cy.get('available-models-tree tree-node-expander').eq(2).click();
+    //       cy.getElementByDataTestsId('node-2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1-add-btn').click();
+    //       cy.get('#instance-popup').and('be.visible');
+    //     });
+    //
+    //   });
+    //
+    // });
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/instantiationStatus.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/instantiationStatus.e2e.ts
new file mode 100644 (file)
index 0000000..be1b2ac
--- /dev/null
@@ -0,0 +1,50 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+/// <reference types="Cypress" />
+
+import { JsonBuilder } from '../../support/jsonBuilders/jsonBuilder';
+import { AsyncInstantiationModel } from '../../support/jsonBuilders/models/asyncInstantiation.model';
+
+describe('Instantiation status page', function () {
+  var jsonBuilderInstantiationBuilder : JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+  beforeEach(() => {
+    cy.window().then((win) => {
+      win.sessionStorage.clear();
+      cy.setReduxState();
+      cy.preventErrorsOnLoading();
+      cy.initAAIMock();
+      cy.initVidMock();
+      jsonBuilderInstantiationBuilder.basicMock('/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json',
+        Cypress.config('baseUrl') + "/asyncInstantiation**");
+      cy.login();
+    })
+  });
+
+  it('should disaplay the correct icons per status', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json').then((res) => {
+        cy.openIframe('app/ui/#/instantiationStatus');
+        for(let i = 0 ; i < res.length; i++){
+          if(res[i].project){
+            cy.getTableRowByIndex('instantiation-status', i).get('td#project span').contains(res[i].project);
+          }
+          if(res[i].userId){
+            cy.getTableRowByIndex('instantiation-status', i).get('td#userId span').contains(res[i].userId);
+          }
+          if(res[i].tenantName){
+            cy.getTableRowByIndex('instantiation-status', i).get('td#tenantName span').contains(res[i].tenantName);
+          }
+          if(res[i].serviceModelName){
+            cy.getTableRowByIndex('instantiation-status', i).get('td#serviceModelName span').contains(res[i].serviceModelName);
+          }
+          if(res[i].serviceInstanceName){
+            cy.getTableRowByIndex('instantiation-status', i).get('td#serviceInstanceName span').contains(res[i].serviceInstanceName);
+          }
+          if(res[i].serviceModelVersion){
+            cy.getTableRowByIndex('instantiation-status', i).get('td#serviceModelVersion span').contains(res[i].serviceModelVersion);
+          }
+          if(res[i].subscriberName){
+            cy.getTableRowByIndex('instantiation-status', i).get('td#subscriberName span').contains(res[i].subscriberName);
+          }
+        }
+      });
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/service.popup.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/service.popup.e2e.ts
new file mode 100644 (file)
index 0000000..9d1fbfd
--- /dev/null
@@ -0,0 +1,57 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+describe('Service popup', function () {
+  describe('basic UI tests', () => {
+
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.setReduxState();
+        cy.preventErrorsOnLoading();
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.login();
+      })
+    });
+
+    it('should contains basic selects with required astrix', function () {
+      cy.openIframe('/app/ui/#/servicePopup?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd&isCreate=true');
+      cy.isElementContainsAttr('service-form-set', 'disabled');
+      cy.get('label').contains('Subscriber name:').should('have.class', 'required')
+        .get('label').contains('Service type:').should('have.class', 'required')
+        .get('label').contains('LCP region:').should('have.class', 'required')
+        .get('label').contains('Tenant:').should('have.class', 'required')
+        .get('label').contains('Owning entity:').should('have.class', 'required')
+        .get('label').contains('Product family:').should('have.class', 'required')
+        .get('label').contains('AIC Zone:').should('not.have.class', 'required')
+        .get('label').contains('Project').should('not.have.class', 'required')
+        .get('label').contains('Rollback On Failure').should('have.class', 'required');
+    });
+
+    it('should be able fill all selects', function () {
+      cy.openIframe('/app/ui/#/servicePopup?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd&isCreate=true');
+
+      cy.selectDropdownOptionByText('subscriberName', 'USP VOICE');
+      cy.selectDropdownOptionByText('serviceType', 'VIRTUAL USP');
+      cy.selectDropdownOptionByText('productFamily', 'VIRTUAL USP');
+      cy.selectDropdownOptionByText('lcpRegion', 'mtn6');
+      cy.selectDropdownOptionByText('tenant', 'AIN Web Tool-15-D-testgamma');
+      cy.selectDropdownOptionByText('aic_zone', 'NFTJSSSS-NFT1');
+      cy.selectDropdownOptionByText('project', 'DFW');
+      cy.selectDropdownOptionByText('owningEntity', 'aaa1');
+      cy.selectDropdownOptionByText('rollback', 'Rollback');
+
+    });
+
+    it('should display error when api return empty data', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/categoryParametres.json').then((res)=>{
+        res.categoryParameters.owningEntity = [];
+        cy.initCategoryParameter(<any>res);
+
+        cy.openIframe('/app/ui/#/servicePopup?serviceModelId=2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd&isCreate=true');
+
+        cy.get('.message').contains('No results for this request. Please change criteria.');
+        cy.get('form-general-error').contains('Page contains errors. Please see details next to the relevant fields.');
+      });
+    });
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/iFrames/tenantIsolation.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/tenantIsolation.e2e.ts
new file mode 100644 (file)
index 0000000..7b848ba
--- /dev/null
@@ -0,0 +1,18 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/> / <reference types="Cypress" />
+
+describe('Tenant isolation - Test Environments Page', function () {
+  describe('New Test Environment popup', () => {
+    
+    beforeEach(() => {
+      cy.login();
+    });
+
+    it(`verifying proper text for the "Tenant Context" label; instead of "Select VSP"`, function () {
+      
+      cy.visit('/app/vid/scripts/modals/new-test-environment/new-test-environment.html');
+      cy.get('label[for=tenantContext]').contains('Tenant Context');
+      });
+    });
+  });
+
+
diff --git a/vid-webpack-master/cypress/integration/iFrames/viewEdit.e2e.ts b/vid-webpack-master/cypress/integration/iFrames/viewEdit.e2e.ts
new file mode 100644 (file)
index 0000000..e589b1e
--- /dev/null
@@ -0,0 +1,424 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/> / <reference types="Cypress" />
+import { JsonBuilder } from '../../support/jsonBuilders/jsonBuilder';
+import { PnfModel } from '../../support/jsonBuilders/models/pnf.model';
+import { ServiceModel } from '../../support/jsonBuilders/models/service.model';
+import { AaiServiceInstancesModel } from '../../support/jsonBuilders/models/serviceInstances.model';
+import { AAISubDetailsModel } from '../../support/jsonBuilders/models/aaiSubDetails.model';
+import { AAISubViewEditModel } from '../../support/jsonBuilders/models/aaiSubViewEdit.model';
+
+describe('View Edit Page', function () {
+  describe('basic UI tests', () => {
+    var jsonBuilderAAIService : JsonBuilder<ServiceModel> = new JsonBuilder<ServiceModel>();
+
+
+    var jsonBuilderAAISubViewEditModel: JsonBuilder<AAISubViewEditModel> = new JsonBuilder<AAISubViewEditModel>();
+    var jsonBuilderAAISubDetailsModel: JsonBuilder<AAISubDetailsModel> = new JsonBuilder<AAISubDetailsModel>();
+    var jsonBuilderPNF: JsonBuilder<PnfModel> = new JsonBuilder<PnfModel>();
+    var jsonBuilderAaiServiceInstances: JsonBuilder<AaiServiceInstancesModel> = new JsonBuilder<AaiServiceInstancesModel>();
+    var jsonBuilderEmpty: JsonBuilder<Object> = new JsonBuilder<Object>();
+    beforeEach(() => {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicService.json').then((res) => {
+        jsonBuilderAAIService.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/rest/models/services/6e59c5de-f052-46fa-aa7e-2fca9d674c44",
+          200, 0,
+          "service-complexService",
+          changeServiceModel)
+      });
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForComplexService.json').then((res) => {
+        jsonBuilderAAISubViewEditModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_viewedit/**",
+          200,
+          0,
+          "aai-sub-view-edit")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubDetails.json').then((res) => {
+        jsonBuilderAAISubDetailsModel.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_sub_details/**",
+          200,
+          0,
+          "aai-sub-details")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstancePnfs.json').then((res) => {
+        jsonBuilderPNF.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_get_service_instance_pnfs/**",
+          200,
+          0,
+          "aai-get-service-instance-pnfs")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstances.json').then((res) => {
+        jsonBuilderAaiServiceInstances.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/search_service_instances**",
+          200,
+          0,
+          "aai-get-service-instances")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyObjectResponse.json').then((res) => {
+        jsonBuilderEmpty.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_getPortMirroringConfigsData**",
+          200,
+          0,
+          "aai_getPortMirroringConfigsDate - empty response")
+      });
+
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/emptyObjectResponse.json').then((res) => {
+        jsonBuilderEmpty.basicJson(
+          res,
+          Cypress.config('baseUrl') + "/aai_getPortMirroringSourcePorts**",
+          200,
+          0,
+          "aai_getPortMirroringSourcePorts - empty response")
+      });
+
+      cy.login();
+    });
+
+
+    it(`should display service model name and version on each info form`, function () {
+      let typesToIncludeModel:Array<string> = ['service', 'vnf', 'vfmodule', 'volume-group', 'network'];
+      cy.visit('/serviceModels.htm#/instantiate?subscriberId=e433710f-9217-458d-a79d-1c7aff376d89&subscriberName=USP%20VOICE&serviceType=VIRTUAL%20USP&serviceInstanceId=3f93c7cb-2fd0-4557-9514-e189b7b04f9d&aaiModelVersionId=6e59c5de-f052-46fa-aa7e-2fca9d674c44&isPermitted=true');
+      cy.wait('@service-complexService');
+      typesToIncludeModel.forEach((type) => {
+        cy.get('.' + type + '-info').click({force: true});
+        cy.getElementByDataTestsId("Model Version").contains('1.0');
+        cy.getElementByDataTestsId("Model Name").contains('vidmacrofalsenaming');
+        cy.getElementByDataTestsId("detailsCloseBtn").click();
+      });
+    });
+  });
+
+  function changeServiceModel(serviceModel: ServiceModel) {
+    serviceModel.service.uuid = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
+    serviceModel.vnfs = {
+      "VF_vMee 0": {
+        "uuid": "d6557200-ecf2-4641-8094-5393ae3aae60",
+        "invariantUuid": "4160458e-f648-4b30-a176-43881ffffe9e",
+        "description": "VSP_vMee",
+        "name": "VF_vMee",
+        "version": "2.0",
+        "customizationUuid": "91415b44-753d-494c-926a-456a9172bbb9",
+        "inputs": {},
+        "commands": {},
+        "properties": {
+          "gpb2_Internal2_mac": "00:80:37:0E:02:22",
+          "sctp-b-ipv6-egress_src_start_port": "0",
+          "sctp-a-ipv6-egress_rule_application": "any",
+          "Internal2_allow_transit": "true",
+          "sctp-b-IPv6_ethertype": "IPv6",
+          "sctp-a-egress_rule_application": "any",
+          "sctp-b-ingress_action": "pass",
+          "sctp-b-ingress_rule_protocol": "icmp",
+          "ncb2_Internal1_mac": "00:80:37:0E:0F:12",
+          "sctp-b-ipv6-ingress-src_start_port": "0.0",
+          "ncb1_Internal2_mac": "00:80:37:0E:09:12",
+          "fsb_volume_size_0": "320.0",
+          "sctp-b-egress_src_addresses": "local",
+          "sctp-a-ipv6-ingress_ethertype": "IPv4",
+          "sctp-a-ipv6-ingress-dst_start_port": "0",
+          "sctp-b-ipv6-ingress_rule_application": "any",
+          "domain_name": "default-domain",
+          "sctp-a-ingress_rule_protocol": "icmp",
+          "sctp-b-egress-src_start_port": "0.0",
+          "sctp-a-egress_src_addresses": "local",
+          "sctp-b-display_name": "epc-sctp-b-ipv4v6-sec-group",
+          "sctp-a-egress-src_start_port": "0.0",
+          "sctp-a-ingress_ethertype": "IPv4",
+          "sctp-b-ipv6-ingress-dst_end_port": "65535",
+          "sctp-b-dst_subnet_prefix_v6": "::",
+          "nf_naming": "{ecomp_generated_naming=true}",
+          "sctp-a-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+          "sctp-b-egress-dst_start_port": "0.0",
+          "ncb_flavor_name": "nv.c20r64d1",
+          "gpb1_Internal1_mac": "00:80:37:0E:01:22",
+          "sctp-b-egress_dst_subnet_prefix_len": "0.0",
+          "Internal2_net_cidr": "169.255.0.0",
+          "sctp-a-ingress-dst_start_port": "0.0",
+          "sctp-a-egress-dst_start_port": "0.0",
+          "fsb1_Internal2_mac": "00:80:37:0E:0B:12",
+          "sctp-a-egress_ethertype": "IPv4",
+          "vlc_st_service_mode": "in-network-nat",
+          "sctp-a-ipv6-egress_ethertype": "IPv4",
+          "sctp-a-egress-src_end_port": "65535.0",
+          "sctp-b-ipv6-egress_rule_application": "any",
+          "sctp-b-egress_action": "pass",
+          "sctp-a-ingress-src_subnet_prefix_len": "0.0",
+          "sctp-b-ipv6-ingress-src_end_port": "65535.0",
+          "sctp-b-name": "epc-sctp-b-ipv4v6-sec-group",
+          "fsb2_Internal1_mac": "00:80:37:0E:0D:12",
+          "sctp-a-ipv6-ingress-src_start_port": "0.0",
+          "sctp-b-ipv6-egress_ethertype": "IPv4",
+          "Internal1_net_cidr": "169.253.0.0",
+          "sctp-a-egress_dst_subnet_prefix": "0.0.0.0",
+          "fsb_flavor_name": "nv.c20r64d1",
+          "sctp_rule_protocol": "132",
+          "sctp-b-ipv6-ingress_src_subnet_prefix_len": "0",
+          "sctp-a-ipv6-ingress_rule_application": "any",
+          "ecomp_generated_naming": "true",
+          "sctp-a-IPv6_ethertype": "IPv6",
+          "vlc2_Internal1_mac": "00:80:37:0E:02:12",
+          "vlc_st_virtualization_type": "virtual-machine",
+          "sctp-b-ingress-dst_start_port": "0.0",
+          "sctp-b-ingress-dst_end_port": "65535.0",
+          "sctp-a-ipv6-ingress-src_end_port": "65535.0",
+          "sctp-a-display_name": "epc-sctp-a-ipv4v6-sec-group",
+          "sctp-b-ingress_rule_application": "any",
+          "int2_sec_group_name": "int2-sec-group",
+          "vlc_flavor_name": "nd.c16r64d1",
+          "sctp-b-ipv6-egress_src_addresses": "local",
+          "vlc_st_interface_type_int1": "other1",
+          "sctp-b-egress-src_end_port": "65535.0",
+          "sctp-a-ipv6-egress-dst_start_port": "0",
+          "vlc_st_interface_type_int2": "other2",
+          "sctp-a-ipv6-egress_rule_protocol": "any",
+          "Internal2_shared": "false",
+          "sctp-a-ipv6-egress_dst_subnet_prefix_len": "0",
+          "Internal2_rpf": "disable",
+          "vlc1_Internal1_mac": "00:80:37:0E:01:12",
+          "sctp-b-ipv6-egress_src_end_port": "65535",
+          "sctp-a-ipv6-egress_src_addresses": "local",
+          "sctp-a-ingress-dst_end_port": "65535.0",
+          "sctp-a-ipv6-egress_src_end_port": "65535",
+          "Internal1_forwarding_mode": "l2",
+          "Internal2_dhcp": "false",
+          "sctp-a-dst_subnet_prefix_v6": "::",
+          "pxe_image_name": "MME_PXE-Boot_16ACP04_GA.qcow2",
+          "vlc_st_interface_type_gtp": "other0",
+          "ncb1_Internal1_mac": "00:80:37:0E:09:12",
+          "sctp-b-src_subnet_prefix_v6": "::",
+          "sctp-a-egress_dst_subnet_prefix_len": "0.0",
+          "int1_sec_group_name": "int1-sec-group",
+          "Internal1_dhcp": "false",
+          "sctp-a-ipv6-egress_dst_end_port": "65535",
+          "Internal2_forwarding_mode": "l2",
+          "fsb2_Internal2_mac": "00:80:37:0E:0D:12",
+          "sctp-b-egress_dst_subnet_prefix": "0.0.0.0",
+          "Internal1_net_cidr_len": "17",
+          "gpb2_Internal1_mac": "00:80:37:0E:02:22",
+          "sctp-b-ingress-src_subnet_prefix_len": "0.0",
+          "sctp-a-ingress_dst_addresses": "local",
+          "sctp-a-egress_action": "pass",
+          "fsb_volume_type_0": "SF-Default-SSD",
+          "ncb2_Internal2_mac": "00:80:37:0E:0F:12",
+          "vlc_st_interface_type_sctp_a": "left",
+          "vlc_st_interface_type_sctp_b": "right",
+          "sctp-a-src_subnet_prefix_v6": "::",
+          "vlc_st_version": "2",
+          "sctp-b-egress_ethertype": "IPv4",
+          "sctp-a-ingress_rule_application": "any",
+          "gpb1_Internal2_mac": "00:80:37:0E:01:22",
+          "instance_ip_family_v6": "v6",
+          "sctp-a-ipv6-egress_src_start_port": "0",
+          "sctp-b-ingress-src_start_port": "0.0",
+          "sctp-b-ingress_dst_addresses": "local",
+          "fsb1_Internal1_mac": "00:80:37:0E:0B:12",
+          "vlc_st_interface_type_oam": "management",
+          "multi_stage_design": "false",
+          "oam_sec_group_name": "oam-sec-group",
+          "Internal2_net_gateway": "169.255.0.3",
+          "sctp-a-ipv6-ingress-dst_end_port": "65535",
+          "sctp-b-ipv6-egress-dst_start_port": "0",
+          "Internal1_net_gateway": "169.253.0.3",
+          "sctp-b-ipv6-egress_rule_protocol": "any",
+          "gtp_sec_group_name": "gtp-sec-group",
+          "sctp-a-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+          "sctp-b-ipv6-egress_dst_subnet_prefix_len": "0",
+          "sctp-a-ipv6-ingress_dst_addresses": "local",
+          "sctp-a-egress_rule_protocol": "icmp",
+          "sctp-b-ipv6-egress_action": "pass",
+          "sctp-a-ipv6-egress_action": "pass",
+          "Internal1_shared": "false",
+          "sctp-b-ipv6-ingress_rule_protocol": "any",
+          "Internal2_net_cidr_len": "17",
+          "sctp-a-name": "epc-sctp-a-ipv4v6-sec-group",
+          "sctp-a-ingress-src_end_port": "65535.0",
+          "sctp-b-ipv6-ingress_src_subnet_prefix": "0.0.0.0",
+          "sctp-a-egress-dst_end_port": "65535.0",
+          "sctp-a-ingress_action": "pass",
+          "sctp-b-egress_rule_protocol": "icmp",
+          "sctp-b-ipv6-ingress_action": "pass",
+          "vlc_st_service_type": "firewall",
+          "sctp-b-ipv6-egress_dst_end_port": "65535",
+          "sctp-b-ipv6-ingress-dst_start_port": "0",
+          "vlc2_Internal2_mac": "00:80:37:0E:02:12",
+          "vlc_st_availability_zone": "true",
+          "fsb_volume_image_name_1": "MME_FSB2_16ACP04_GA.qcow2",
+          "sctp-b-ingress-src_subnet_prefix": "0.0.0.0",
+          "sctp-a-ipv6-ingress_src_subnet_prefix_len": "0",
+          "Internal1_allow_transit": "true",
+          "gpb_flavor_name": "nv.c20r64d1",
+          "availability_zone_max_count": "1",
+          "fsb_volume_image_name_0": "MME_FSB1_16ACP04_GA.qcow2",
+          "sctp-b-ipv6-ingress_dst_addresses": "local",
+          "sctp-b-ipv6-egress_dst_subnet_prefix": "0.0.0.0",
+          "sctp-b-ipv6-ingress_ethertype": "IPv4",
+          "vlc1_Internal2_mac": "00:80:37:0E:01:12",
+          "sctp-a-ingress-src_subnet_prefix": "0.0.0.0",
+          "sctp-a-ipv6-ingress_action": "pass",
+          "Internal1_rpf": "disable",
+          "sctp-b-ingress_ethertype": "IPv4",
+          "sctp-b-egress_rule_application": "any",
+          "sctp-b-ingress-src_end_port": "65535.0",
+          "sctp-a-ipv6-ingress_rule_protocol": "any",
+          "sctp-a-ingress-src_start_port": "0.0",
+          "sctp-b-egress-dst_end_port": "65535.0"
+        },
+        "type": "VF",
+        "modelCustomizationName": "VF_vMee 0",
+        "vfModules": {
+          "vf_vmee0..VfVmee..vmme_vlc..module-1": {
+            "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+            "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b",
+            "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091",
+            "description": null,
+            "name": "VfVmee..vmme_vlc..module-1",
+            "version": "2",
+            "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "vmme_vlc"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": false
+          },
+          "vf_vmee0..VfVmee..vmme_gpb..module-2": {
+            "uuid": "41708296-e443-4c71-953f-d9a010f059e1",
+            "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9",
+            "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c",
+            "description": null,
+            "name": "VfVmee..vmme_gpb..module-2",
+            "version": "2",
+            "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "vmme_gpb"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": false
+          },
+          "vf_vmee0..VfVmee..base_vmme..module-0": {
+            "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+            "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+            "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+            "description": null,
+            "name": "VfVmee..base_vmme..module-0",
+            "version": "2",
+            "modelCustomizationName": "VfVmee..base_vmme..module-0",
+            "properties": {
+              "minCountInstances": 1,
+              "maxCountInstances": 1,
+              "initialCount": 1,
+              "vfModuleLabel": "base_vmme"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": true
+          }
+        },
+        "volumeGroups": {
+          "vf_vmee0..VfVmee..base_vmme..module-0": {
+            "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+            "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+            "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+            "description": null,
+            "name": "VfVmee..base_vmme..module-0",
+            "version": "2",
+            "modelCustomizationName": "VfVmee..base_vmme..module-0",
+            "properties": {
+              "minCountInstances": 1,
+              "maxCountInstances": 1,
+              "initialCount": 1,
+              "vfModuleLabel": "base_vmme"
+            },
+            "inputs": {}
+          }
+        },
+        "vfcInstanceGroups": {}
+      }
+    };
+    serviceModel.vfModules = {
+      "vf_vmee0..VfVmee..vmme_vlc..module-1": {
+        "uuid": "522159d5-d6e0-4c2a-aa44-5a542a12a830",
+        "invariantUuid": "98a7c88b-b577-476a-90e4-e25a5871e02b",
+        "customizationUuid": "55b1be94-671a-403e-a26c-667e9c47d091",
+        "description": null,
+        "name": "VfVmee..vmme_vlc..module-1",
+        "version": "2",
+        "modelCustomizationName": "VfVmee..vmme_vlc..module-1",
+        "properties": {
+          "minCountInstances": 0,
+          "maxCountInstances": null,
+          "initialCount": 0,
+          "vfModuleLabel": "vmme_vlc"
+        },
+        "inputs": {},
+        "volumeGroupAllowed": false
+      },
+      "vf_vmee0..VfVmee..vmme_gpb..module-2": {
+        "uuid": "41708296-e443-4c71-953f-d9a010f059e1",
+        "invariantUuid": "1cca90b8-3490-495e-87da-3f3e4c57d5b9",
+        "customizationUuid": "6add59e0-7fe1-4bc4-af48-f8812422ae7c",
+        "description": null,
+        "name": "VfVmee..vmme_gpb..module-2",
+        "version": "2",
+        "modelCustomizationName": "VfVmee..vmme_gpb..module-2",
+        "properties": {
+          "minCountInstances": 0,
+          "maxCountInstances": null,
+          "initialCount": 0,
+          "vfModuleLabel": "vmme_gpb"
+        },
+        "inputs": {},
+        "volumeGroupAllowed": false
+      },
+      "vf_vmee0..VfVmee..base_vmme..module-0": {
+        "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+        "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+        "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+        "description": null,
+        "name": "VfVmee..base_vmme..module-0",
+        "version": "2",
+        "modelCustomizationName": "VfVmee..base_vmme..module-0",
+        "properties": {
+          "minCountInstances": 1,
+          "maxCountInstances": 1,
+          "initialCount": 1,
+          "vfModuleLabel": "base_vmme"
+        },
+        "inputs": {},
+        "volumeGroupAllowed": true
+      }
+    };
+    serviceModel.volumeGroups = {
+      "vf_vmee0..VfVmee..base_vmme..module-0": {
+        "uuid": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+        "invariantUuid": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+        "customizationUuid": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+        "description": null,
+        "name": "VfVmee..base_vmme..module-0",
+        "version": "2",
+        "modelCustomizationName": "VfVmee..base_vmme..module-0",
+        "properties": {
+          "minCountInstances": 1,
+          "maxCountInstances": 1,
+          "initialCount": 1,
+          "vfModuleLabel": "base_vmme"
+        },
+        "inputs": {}
+      }
+    };
+    return serviceModel;
+  }
+});
+
diff --git a/vid-webpack-master/cypress/integration/shared/error.message.popup.e2e.ts b/vid-webpack-master/cypress/integration/shared/error.message.popup.e2e.ts
new file mode 100644 (file)
index 0000000..8e78067
--- /dev/null
@@ -0,0 +1,33 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+/// <reference types="Cypress" />
+
+import { JsonBuilder } from '../../support/jsonBuilders/jsonBuilder';
+import { AsyncInstantiationModel } from '../../support/jsonBuilders/models/asyncInstantiation.model';
+
+describe('Error message popup', function () {
+  describe('show error on status 500', () => {
+    var jsonBuilderInstantiationBuilder : JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.setReduxState();
+        cy.preventErrorsOnLoading();
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.login();
+      })
+    });
+
+    it('spinner should display after api call', function () {
+      // adding call with delay of 2000 sec
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json').then((res) => {
+        jsonBuilderInstantiationBuilder.basicJson(res, Cypress.config('baseUrl') + "/asyncInstantiation**", 500,0, "error 500 asyncInstantiation");
+
+        cy.openIframe('app/ui/#/instantiationStatus');
+        cy.get('div.title')
+          .contains('Server not available');
+
+      });
+    });
+  });
+});
diff --git a/vid-webpack-master/cypress/integration/shared/spinner.e2e.ts b/vid-webpack-master/cypress/integration/shared/spinner.e2e.ts
new file mode 100644 (file)
index 0000000..35f386f
--- /dev/null
@@ -0,0 +1,36 @@
+///<reference path="../../../node_modules/cypress/types/index.d.ts"/>
+/// <reference types="Cypress" />
+import { JsonBuilder } from '../../support/jsonBuilders/jsonBuilder';
+import { AsyncInstantiationModel } from '../../support/jsonBuilders/models/asyncInstantiation.model';
+
+describe('Spinner', function () {
+  describe('spinner', () => {
+    var jsonBuilderInstantiationBuilder : JsonBuilder<AsyncInstantiationModel> = new JsonBuilder<AsyncInstantiationModel>();
+    beforeEach(() => {
+      cy.window().then((win) => {
+        win.sessionStorage.clear();
+        cy.setReduxState();
+        cy.preventErrorsOnLoading();
+        cy.initAAIMock();
+        cy.initVidMock();
+        cy.login();
+      })
+    });
+
+    it('spinner should display after api call', function () {
+      cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json').then((res) => {
+
+        jsonBuilderInstantiationBuilder.basicJson(res,
+          Cypress.config('baseUrl') + "/asyncInstantiation**",
+          200,
+          2000,
+          "error 500 asyncInstantiation");
+        cy.openIframe('app/ui/#/instantiationStatus');
+
+        cy.get('.spinner')
+          .and('be.visible');
+
+      });
+    });
+  });
+});
diff --git a/vid-webpack-master/cypress/plugins/cy-ts-preprocessor.js b/vid-webpack-master/cypress/plugins/cy-ts-preprocessor.js
new file mode 100644 (file)
index 0000000..7f0bba9
--- /dev/null
@@ -0,0 +1,26 @@
+const wp = require('@cypress/webpack-preprocessor')
+
+const webpackOptions = {
+  resolve: {
+    extensions: ['.ts', '.js']
+  },
+  module: {
+    rules: [
+      {
+        test: /\.ts$/,
+        exclude: [/node_modules/],
+        use: [
+          {
+            loader: 'ts-loader'
+          }
+        ]
+      }
+    ]
+  }
+}
+
+const options = {
+  webpackOptions
+}
+
+module.exports = wp(options)
diff --git a/vid-webpack-master/cypress/plugins/index.js b/vid-webpack-master/cypress/plugins/index.js
new file mode 100644 (file)
index 0000000..4170a8f
--- /dev/null
@@ -0,0 +1,6 @@
+const cypressTypeScriptPreprocessor = require('./cy-ts-preprocessor')
+module.exports = on => {
+  on('file:preprocessor', cypressTypeScriptPreprocessor);
+  on('fail', (err, runnable) => {return false});
+};
+
diff --git a/vid-webpack-master/cypress/support/application/application.session.actions.ts b/vid-webpack-master/cypress/support/application/application.session.actions.ts
new file mode 100644 (file)
index 0000000..490016b
--- /dev/null
@@ -0,0 +1,21 @@
+declare namespace Cypress {
+  interface Chainable {
+    setReduxState : typeof setReduxState;
+  }
+}
+
+/**********************************
+ Type to input with id some text
+ *********************************/
+function setReduxState(state?: string) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json').then((res) => {
+    cy.window().then((win) => {
+      win.sessionStorage.setItem('reduxState',  JSON.stringify(state ? state : res));
+    });
+  });
+}
+
+
+
+Cypress.Commands.add('setReduxState', setReduxState);
+
diff --git a/vid-webpack-master/cypress/support/commands.ts b/vid-webpack-master/cypress/support/commands.ts
new file mode 100644 (file)
index 0000000..3f72c23
--- /dev/null
@@ -0,0 +1,15 @@
+// Cypress.Commands.add('login', () => {
+//   const constant = {
+//     'LOGIN_ID': '#loginId',
+//     'PASSWORD_ID': '#password'
+//   };
+//
+//   cy.on('fail', (err, runnable) => { return false});
+//   cy.visit('/login_external.htm')
+//     .get(constant.LOGIN_ID).type('16807000')
+//     .get(constant.PASSWORD_ID).type('16807000')
+//     .get('#loginBtn').click()
+//     .getCookies().then((cookies) => {
+//         console.log(cookies[0].value)
+//     })
+// });
diff --git a/vid-webpack-master/cypress/support/elements/element.actions.ts b/vid-webpack-master/cypress/support/elements/element.actions.ts
new file mode 100644 (file)
index 0000000..2d30aa1
--- /dev/null
@@ -0,0 +1,49 @@
+import Chainable = Cypress.Chainable;
+
+declare namespace Cypress {
+  interface Chainable {
+    isElementContainsAttr : typeof isElementContainsAttr;
+    isElementDisabled : typeof isElementDisabled;
+    isElementEnabled : typeof isElementEnabled;
+    hasClass : typeof hasClass;
+    getElementByDataTestsId : typeof getElementByDataTestsId;
+  }
+}
+
+/*************************************************************************
+ isElementContainsAttr : check if element with id contains some attribute
+ *************************************************************************/
+function isElementContainsAttr(id : string, attr: string) : void {
+  cy.get("[data-tests-id='" + id +"']")
+    .should('have.attr', attr);
+}
+
+/*********************************************************
+ isElementDisabled : check if element with id is disabled
+ *********************************************************/
+function isElementDisabled(id : string) : void {
+  cy.get( "[data-tests-id='" + id +"']").should('be:disabled');
+}
+
+function isElementEnabled(id : string) : void {
+  cy.get( "button[data-tests-id='" + id +"']").should('be:enabled');
+}
+
+/****************************************************************
+ hasClass : check if element with id contains some class name
+ ****************************************************************/
+function hasClass(id : string, className : string) : void {
+  cy.get( "[data-tests-id='" + id +"']")
+    .should('have.class', className);
+}
+
+function getElementByDataTestsId(dataTestsId : string) : Chainable<JQuery<HTMLElement>> {
+  return cy.get( "[data-tests-id='" + dataTestsId +"']");
+}
+
+
+Cypress.Commands.add('isElementContainsAttr', isElementContainsAttr);
+Cypress.Commands.add('isElementDisabled', isElementDisabled);
+Cypress.Commands.add('isElementEnabled', isElementEnabled);
+Cypress.Commands.add('hasClass', hasClass);
+Cypress.Commands.add('getElementByDataTestsId', getElementByDataTestsId);
diff --git a/vid-webpack-master/cypress/support/elements/element.input.actions.ts b/vid-webpack-master/cypress/support/elements/element.input.actions.ts
new file mode 100644 (file)
index 0000000..714daf9
--- /dev/null
@@ -0,0 +1,46 @@
+declare namespace Cypress {
+  interface Chainable {
+    typeToInput : typeof typeToInput;
+    blurInput : typeof blurInput;
+    focusInput : typeof focusInput;
+    shouldInputContainsText: typeof shouldInputContainsText;
+  }
+}
+
+/**********************************
+  Type to input with id some text
+ *********************************/
+function typeToInput(id : string, text : string) : void {
+  cy.get( "[data-tests-id='" + id +"']")
+    .type(text, {force: true});
+}
+
+/********************
+ blur input with id
+ ********************/
+function blurInput(id : string) : void {
+  cy.get( "[data-tests-id='" + id +"']")
+    .blur();
+}
+
+/********************
+ focus input with id
+ ********************/
+function focusInput(id : string) : void {
+  cy.get( "[data-tests-id='" + id +"']")
+    .focus();
+}
+
+/*****************************************
+ test if input with id contains some text
+ ****************************************/
+function shouldInputContainsText(id : string, text : string) : void {
+  cy.get( "[data-tests-id='" + id +"']")
+    .contains('text')
+}
+
+Cypress.Commands.add('typeToInput', typeToInput);
+Cypress.Commands.add('blurInput', blurInput);
+Cypress.Commands.add('focusInput', focusInput);
+Cypress.Commands.add('shouldInputContainsText', shouldInputContainsText);
+
diff --git a/vid-webpack-master/cypress/support/elements/element.select.actions.ts b/vid-webpack-master/cypress/support/elements/element.select.actions.ts
new file mode 100644 (file)
index 0000000..452323d
--- /dev/null
@@ -0,0 +1,16 @@
+declare namespace Cypress {
+  interface Chainable {
+    selectDropdownOptionByText : typeof selectDropdownOptionByText;
+  }
+}
+
+/************************************************
+ select option with some text with select tag id
+ ************************************************/
+function selectDropdownOptionByText(selectId : string, optionText : string) : void {
+  cy.getElementByDataTestsId(selectId)
+    .select(optionText);
+}
+
+Cypress.Commands.add('selectDropdownOptionByText', selectDropdownOptionByText);
+
diff --git a/vid-webpack-master/cypress/support/elements/element.table.actions.ts b/vid-webpack-master/cypress/support/elements/element.table.actions.ts
new file mode 100644 (file)
index 0000000..4994723
--- /dev/null
@@ -0,0 +1,15 @@
+declare namespace Cypress {
+  interface Chainable {
+    getTableRowByIndex : typeof getTableRowByIndex;
+  }
+}
+
+/***************************************
+  get table row by table id and index
+ *************************************/
+function getTableRowByIndex(id : string, index : number) : Chainable<JQuery<HTMLElement>> {
+  return cy.get('table#' + id + ' tbody tr').eq(index);
+}
+
+Cypress.Commands.add('getTableRowByIndex', getTableRowByIndex);
+
diff --git a/vid-webpack-master/cypress/support/index.js b/vid-webpack-master/cypress/support/index.js
new file mode 100644 (file)
index 0000000..7b8506a
--- /dev/null
@@ -0,0 +1,30 @@
+// ***********************************************************
+// This example support/index.js is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands';
+import './steps/login.step';
+import './elements/element.actions';
+import './elements/element.input.actions';
+import './elements/element.select.actions';
+import './application/application.session.actions';
+import './elements/element.table.actions';
+import './jsonBuilders/mocks/aai.mock';
+import './jsonBuilders/mocks/vid.mock';
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
+
+
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/jsonBuilder.ts b/vid-webpack-master/cypress/support/jsonBuilders/jsonBuilder.ts
new file mode 100644 (file)
index 0000000..0bab4e1
--- /dev/null
@@ -0,0 +1,31 @@
+export class JsonBuilder<T> implements IJsonBuilder<T>{
+  currentValue: T;
+
+  public basicJson(json: JSON, url: string, status: number, delay: number, alias: string, changeResFunc?: Function) : void {
+    this.currentValue = <T>JSON.parse(JSON.stringify(json));
+    this.currentValue = changeResFunc ? changeResFunc(this.currentValue) : this.currentValue;
+    return this.initMockCall(url, status, delay, alias);
+  }
+
+  public initMockCall(url: string, status: number, delay: number, alias: string) {
+      cy.server()
+        .route({
+          method: 'GET',
+          status: status,
+          delay : delay ? delay : 0,
+          url: url,
+          response: JSON.stringify(this.currentValue)
+        }).as(alias);
+  }
+  public basicMock(jsonPath: string, url: string) {
+    cy.readFile(jsonPath).then((res) => {
+      this.basicJson(res, url, 200, 0, url,);
+    })
+  }
+}
+
+export interface IJsonBuilder<T>{
+  basicJson(json: JSON, url: string, status: number, delay: number, alias: string, changeResFunc?: Function) : void;
+  initMockCall(url: string, status: number, delay: number, alias: string): void;
+  basicMock(jsonPath: string, url: string): void;
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/aai.mock.ts b/vid-webpack-master/cypress/support/jsonBuilders/mocks/aai.mock.ts
new file mode 100644 (file)
index 0000000..a954877
--- /dev/null
@@ -0,0 +1,80 @@
+declare namespace Cypress {
+  interface Chainable {
+    initAAIMock: typeof initAAIMock;
+    initAlaCarteService : typeof initAlaCarteService;
+    initZones : typeof initZones;
+  }
+}
+
+function initGetSubscribers(response? : JSON) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/subscribers.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        status : 200,
+        url : Cypress.config('baseUrl') + "/aai_get_subscribers**",
+        response : response ? response : res
+      }).as('initGetSubscribers')
+  });
+}
+
+function initGetAAISubDetails(response? : JSON) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiSubDetails.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        status: 200,
+        url: Cypress.config('baseUrl') + "/aai_sub_details**",
+        response: response ? response : res
+      })
+  });
+}
+
+function initAlaCarteService(response? : JSON) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/a-la-carteService.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        status: 200,
+        url: Cypress.config('baseUrl') + "/rest/models/services**",
+        response: response ? response : res
+      }).as('initAlaCarteService')
+  });
+}
+
+function initAAIServices(response? : JSON) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/aaiServices.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        status : 200,
+        url : Cypress.config('baseUrl') + "/aai_get_services**",
+        response : response ? response : res
+      }).as(('initAAIServices'));
+  });
+}
+
+function initZones(response? : JSON) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/zones.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        status : 200,
+        url : Cypress.config('baseUrl') + "/aai_get_aic_zones**",
+        response : response ? response : res
+      }).as(('zones'));
+  });
+}
+
+
+function initAAIMock(): void {
+  initGetSubscribers();
+  initAAIServices();
+}
+
+
+Cypress.Commands.add('initAAIMock', initAAIMock);
+Cypress.Commands.add('initAlaCarteService', initAlaCarteService);
+Cypress.Commands.add('initZones', initZones);
+
+
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/a-la-carteService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/a-la-carteService.json
new file mode 100644 (file)
index 0000000..68a8d45
--- /dev/null
@@ -0,0 +1,159 @@
+{
+  "services": [
+    {
+      "uuid": "4d71990b-d8ad-4510-ac61-496288d9078e",
+      "invariantUUID": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+      "name": "action-data",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+      "invariantUUID": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+      "name": "action-data",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "666a06ee-4b57-46df-bacf-908da8f10c3f",
+      "invariantUUID": "ea78c9e3-514d-4a0a-9162-13837fa54c35",
+      "name": "multicast-configuration",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "20c4431c-246d-11e7-93ae-92361f002671",
+      "invariantUUID": "78ca26d0-246d-11e7-93ae-92361f002671",
+      "name": "vSAMP10aDEV::base::module-0",
+      "version": "2",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "797a6c41-0f80-4d35-a288-3920c4e06baa",
+      "invariantUUID": "5b607929-6088-4614-97ef-cac817508e0e",
+      "name": "CONTRAIL30_L2NODHCP",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "f1bde010-cc5f-4765-941f-75f15b24f9fc",
+      "invariantUUID": "0143d57b-a517-4de9-a0a1-eb76db51f402",
+      "name": "BkVmxAv061917..base_vPE_AV..module-0",
+      "version": "2",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "ipe-resource-id-ps-02",
+      "invariantUUID": "ipe-resource-id-ps-02",
+      "name": "abc",
+      "version": "v1.0",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "lmoser410-connector-model-version-id",
+      "invariantUUID": "lmoser410-connector-model-id",
+      "name": "connector",
+      "version": "v1.0",
+      "toscaModelURL": null,
+      "category": "widget",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "ff2ae348-214a-11e7-93ae-92361f002673",
+      "invariantUUID": "3a97db99-c4bb-498a-a13a-38f65f1ced3d",
+      "name": "vSAMP10aDEV::base::module-0",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "204c641a-3494-48c8-979a-86856f5fd32a",
+      "invariantUUID": "3c504d40-b847-424c-9d25-4fb7e0a3e994",
+      "name": "named-query-element",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "widget",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    },
+    {
+      "uuid": "acba1f72-c6e0-477f-9426-ad190151e100",
+      "invariantUUID": "93e56950-cb19-44e6-ace4-8b50f2d02e45",
+      "name": "RG_6-19_Test",
+      "version": "1.0",
+      "toscaModelURL": null,
+      "category": "resource",
+      "lifecycleState": null,
+      "lastUpdaterUserId": null,
+      "lastUpdaterFullName": null,
+      "distributionStatus": null,
+      "artifacts": null,
+      "resources": null
+    }
+  ],
+  "readOnly": false
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstancePnfs.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstancePnfs.json
new file mode 100644 (file)
index 0000000..fe51488
--- /dev/null
@@ -0,0 +1 @@
+[]
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstances.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServiceInstances.json
new file mode 100644 (file)
index 0000000..3435ff0
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "service-instances": [
+    {
+      "aaiModelInvariantId": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+      "aaiModelVersionId": "240376de-870e-48df-915a-31f140eedd2c",
+      "globalCustomerId": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "isPermitted": true,
+      "serviceInstanceId": "3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
+      "serviceInstanceName": "vid-test-444",
+      "serviceType": "VIRTUAL USP",
+      "subscriberName": "USP VOICE"
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServices.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiServices.json
new file mode 100644 (file)
index 0000000..7b4440d
--- /dev/null
@@ -0,0 +1,46 @@
+{
+  "service": {
+    "uuid": "4d71990b-d8ad-4510-ac61-496288d9078e",
+    "invariantUuid": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+    "name": "vidmacrofalsenaming",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L1-3",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "vidmacrofalsenaming",
+    "serviceEcompNaming": "false",
+    "instantiationType": "A-La-Carte",
+    "inputs": {}
+  },
+  "vnfs": {},
+  "networks": {
+    "MULTI_PROVIDER_PORT_GROUP 0": {
+      "uuid": "e5d235de-2188-4f9f-a28c-fe38967883f2",
+      "invariantUuid": "b0303003-0abb-454c-9119-8cbe2e09e003",
+      "description": "Creates a neutron multi-provider VLAN network with dummy subnet",
+      "name": "MULTI_PROVIDER_PORT_GROUP",
+      "version": "1.0",
+      "customizationUuid": "0fde4286-ee4c-439d-9556-74b6be6bbc42",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+        "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+        "network_scope": "GLOBAL",
+        "network_ecomp_naming": "{ecomp_generated_naming=true}",
+        "network_type": "MULTI_PROVIDER_PORT_GROUP",
+        "network_technology": "MULTI_GROUP",
+        "network_homing": "{ecomp_selected_instance_node_target=false}"
+      },
+      "type": "VL",
+      "modelCustomizationName": "MULTI_PROVIDER_PORT_GROUP 0"
+    }
+  },
+  "collectionResource": {},
+  "configurations": {},
+  "serviceProxies": {},
+  "vfModules": {},
+  "volumeGroups": {},
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubDetails.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubDetails.json
new file mode 100644 (file)
index 0000000..0063a9d
--- /dev/null
@@ -0,0 +1,478 @@
+{
+  "global-customer-id": "e433710f-9217-458d-a79d-1c7aff376d89",
+  "subscriber-name": "USP VOICE",
+  "subscriber-type": "INFRA",
+  "resource-version": "1494001938080",
+  "service-subscriptions": {
+    "service-subscription": [
+      {
+        "service-type": "HOSTED COMMUNICATIONS",
+        "resource-version": "1494001920845",
+        "service-instances": {
+          "service-instance": [
+            {
+              "service-instance-id": "67aba9ab-f745-442e-a37b-2040a17ec9c7",
+              "service-instance-name": "test_948473",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1501137356564",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "1de57bcf-365a-4ba7-8a51-7377b7144586"
+            },
+            {
+              "service-instance-id": "328e117c-8f27-4a59-beea-3b3c36e4652f",
+              "service-instance-name": "test_inputs_002",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1501142919029",
+              "orchestration-status": "Active",
+              "model-invariant-id": "74b2fa72-e3b9-4942-8448-983a4b50891a",
+              "model-version-id": "8c16d416-f183-4f2e-8a05-48a7ee0738f7"
+            },
+            {
+              "service-instance-id": "66608fd9-a786-4f60-ae7b-c18d030c499b",
+              "service-instance-name": "testtt",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1503224667654",
+              "orchestration-status": "Active",
+              "model-invariant-id": "1cc41b64-5c12-4d51-bac9-448e963bd81d",
+              "model-version-id": "91f79100-6450-4078-80d7-531427b4fe74"
+            },
+            {
+              "service-instance-id": "9d29dcf2-7742-4384-bca0-a38f6c296a79",
+              "service-instance-name": "test_9sdfkdfj",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500813552431",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "5b174112-cea4-4a36-b540-853b9d0548fc"
+            },
+            {
+              "service-instance-id": "e10414d0-692b-4e8e-b56e-9fdc5ef24059",
+              "service-instance-name": "test_04598485",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1501144603052",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "1de57bcf-365a-4ba7-8a51-7377b7144586"
+            },
+            {
+              "service-instance-id": "25a5cc93-73df-4c9c-9cc5-e2df9a72f3b7",
+              "service-instance-name": "test_inputs_values1",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1501412516301",
+              "orchestration-status": "Active",
+              "model-invariant-id": "b594a6ec-94e0-4c95-826f-4c3d3af56339",
+              "model-version-id": "59f3ea84-313a-4670-b7c2-8997e5749864"
+            },
+            {
+              "service-instance-id": "9cfcd777-7f14-425c-80bf-a562fba03cfa",
+              "service-instance-name": "test_vl_inputs01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1501421232100",
+              "orchestration-status": "Active",
+              "model-invariant-id": "9f5ed6d5-c960-4903-9625-4ccb6ba9c63a",
+              "model-version-id": "f263c8f6-b52f-4b6c-9ed9-0c83ad098697"
+            },
+            {
+              "service-instance-id": "4173d5da-df33-474e-a4ef-c93be61a1355",
+              "service-instance-name": "test_instance_vl_01",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500966394803",
+              "orchestration-status": "Active",
+              "model-invariant-id": "9f5ed6d5-c960-4903-9625-4ccb6ba9c63a",
+              "model-version-id": "25447dd8-4154-4146-b57b-bc3d82e1a670"
+            },
+            {
+              "service-instance-id": "1753f7eb-85db-498c-aa6a-c68a06fc77db",
+              "service-instance-name": "sdfjdfj",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500991399818",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "1de57bcf-365a-4ba7-8a51-7377b7144586"
+            },
+            {
+              "service-instance-id": "5d5520c7-dcbc-4287-bed2-50ff57c41a6f",
+              "service-instance-name": "tesy_jsdjjdj",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1501400257544",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "240376de-870e-48df-915a-31f140eedd2c"
+            },
+            {
+              "service-instance-id": "1ab8ad18-1445-412a-81f2-671b936ab650",
+              "service-instance-name": "Test_098765",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500562034054",
+              "orchestration-status": "Active",
+              "model-invariant-id": "74b2fa72-e3b9-4942-8448-983a4b50891a",
+              "model-version-id": "8c16d416-f183-4f2e-8a05-48a7ee0738f7"
+            },
+            {
+              "service-instance-id": "a1427609-254d-4637-906f-8f0f6f6d4711",
+              "service-instance-name": "test343445",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502111792531",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "c079d859-4d81-4add-a9c3-94551f96e2b0"
+            },
+            {
+              "service-instance-id": "f87c0dbe-2658-4971-8014-ad5da1f9df51",
+              "service-instance-name": "test_03494595",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502006858511",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "240376de-870e-48df-915a-31f140eedd2c"
+            },
+            {
+              "service-instance-id": "7a8dea9f-5f67-4755-9344-ec3736240b9e",
+              "service-instance-name": "test_045045",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502111390681",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "c079d859-4d81-4add-a9c3-94551f96e2b0"
+            },
+            {
+              "service-instance-id": "8d0f4c13-a564-43ec-b756-c0017161dee2",
+              "service-instance-name": "testkjhjjj",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500553831697",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "5b174112-cea4-4a36-b540-853b9d0548fc"
+            },
+            {
+              "service-instance-id": "27535e2a-785e-47e8-a482-16f4d019033a",
+              "service-instance-name": "test765766",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502109495302",
+              "orchestration-status": "Active",
+              "model-invariant-id": "452538c0-ef1e-4d65-9939-697f6ed58934",
+              "model-version-id": "f430728a-4530-42be-a577-1206b9484cef"
+            },
+            {
+              "service-instance-id": "9601d34e-d3f9-4108-932c-fc52312c260a",
+              "service-instance-name": "test_9459495",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502028721334",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d2103eaa-8cc7-4422-ad67-1ce582af0097",
+              "model-version-id": "5801fed3-b6db-4969-abb4-d1171c4c3202"
+            },
+            {
+              "service-instance-id": "e65ae593-afdd-4f31-8192-ba7606a026e4",
+              "service-instance-name": "test_84574854",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502026481024",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d2103eaa-8cc7-4422-ad67-1ce582af0097",
+              "model-version-id": "5801fed3-b6db-4969-abb4-d1171c4c3202"
+            },
+            {
+              "service-instance-id": "29e210af-9fa5-44ae-940c-acca84b1b287",
+              "service-instance-name": "testjkdfkdf",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502114664500",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "c079d859-4d81-4add-a9c3-94551f96e2b0"
+            },
+            {
+              "service-instance-id": "c1a81ab3-2bc6-4b6f-b04f-d358e67c1d01",
+              "service-instance-name": "test499494",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500552497782",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "1de57bcf-365a-4ba7-8a51-7377b7144586"
+            },
+            {
+              "service-instance-id": "01834681-686a-4258-aff0-6eea448deddd",
+              "service-instance-name": "tesr_iii_999",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502019889568",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d2103eaa-8cc7-4422-ad67-1ce582af0097",
+              "model-version-id": "5801fed3-b6db-4969-abb4-d1171c4c3202"
+            },
+            {
+              "service-instance-id": "266008e8-04f9-440a-90e9-d9299821ec08",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001993349",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "6c3a22e9-6b04-49d2-b1fa-1e49103971ca",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001986409",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "918085fc-29cf-41c2-acc8-15878c0d58b3",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001986411",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "1c464a9d-eff7-4d29-8e97-ed1e9e3c8458",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001953169",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "bb2f563f-6db7-46ec-b521-fc6ee07e4f3e",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494002002228",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "4cf94a42-85b8-414f-8fb4-a43b1dac1d2f",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001834026",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "ed7c0d8e-de81-408f-b695-47b9dd6b2ca0",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001986403",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "8bf34b89-1648-4a41-a21f-9b752833bd4b",
+              "service-instance-name": "test-gkmf546g",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500377885652",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "1de57bcf-365a-4ba7-8a51-7377b7144586"
+            },
+            {
+              "service-instance-id": "082c606c-60d7-4d9a-87c7-1370de6e56ba",
+              "service-instance-name": "test123456",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500375305701",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d2103eaa-8cc7-4422-ad67-1ce582af0097",
+              "model-version-id": "5801fed3-b6db-4969-abb4-d1171c4c3202"
+            },
+            {
+              "service-instance-id": "c4707aae-9b16-49b4-8b52-cbeb8c4129ab",
+              "service-instance-name": "test_sdfdlfldl",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500376318829",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+              "model-version-id": "cad9f2eb-39f7-4692-90c2-8726bb594610"
+            },
+            {
+              "service-instance-id": "86ab6048-9037-4367-ac01-f2e5881e8034",
+              "service-instance-name": "test1234456",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500369079277",
+              "orchestration-status": "Active",
+              "model-invariant-id": "b1ed0d58-0700-4631-be18-d2f1e527d637",
+              "model-version-id": "849a6347-cca7-4ae6-b5c2-7d41e9f6d9b2"
+            },
+            {
+              "service-instance-id": "a5e3b6ae-7b4c-4247-b975-1cd46c3b3e9a",
+              "service-instance-name": "pavel_usp_voice",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1506931067790",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "5b174112-cea4-4a36-b540-853b9d0548fc"
+            },
+            {
+              "service-instance-id": "c9fb03a4-8c21-444a-84ee-a6f969698d9c",
+              "service-instance-name": "test_0e459495945kg",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502021459612",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d2103eaa-8cc7-4422-ad67-1ce582af0097",
+              "model-version-id": "5801fed3-b6db-4969-abb4-d1171c4c3202"
+            },
+            {
+              "service-instance-id": "4fd55324-bc4d-4acf-8f76-2e1eb01ae6a5",
+              "service-instance-name": "test_0w459495",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502019352627",
+              "orchestration-status": "Active",
+              "model-invariant-id": "e3ee9d25-2c6b-4734-8a8c-b6e0dee11ca9",
+              "model-version-id": "159cc54d-a6be-4c3b-bea3-3214181ebb5d"
+            },
+            {
+              "service-instance-id": "bbccd5cf-f641-4082-8411-7ae123530d92",
+              "service-instance-name": "kkk",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1502087710872",
+              "orchestration-status": "Active",
+              "model-invariant-id": "331a194d-9248-4533-88bc-62c812ccb5c1",
+              "model-version-id": "171b3887-e73e-479d-8ef8-2690bf74f2aa"
+            },
+            {
+              "service-instance-id": "4c263e04-260e-434a-8ac2-b0335a02f30b",
+              "service-instance-name": null,
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001791264",
+              "orchestration-status": null,
+              "model-invariant-id": "",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "e4feb759-e4a9-4614-b2d2-985848ba3b9f",
+              "service-instance-name": "test345345342334f",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1499869396079",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "240376de-870e-48df-915a-31f140eedd2c"
+            }
+          ]
+        },
+        "is-permitted": false
+      },
+      {
+        "service-type": "TSBC",
+        "resource-version": "1494001891362",
+        "service-instances": {
+          "service-instance": [
+            {
+              "service-instance-id": "c0edefb0-2505-4a34-85cc-96c4cd5a121d",
+              "service-instance-name": "test-343432",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1500370094198",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "240376de-870e-48df-915a-31f140eedd2c"
+            },
+            {
+              "service-instance-id": "7cb54908-f3fb-46b9-b547-d1e670ea95b2",
+              "service-instance-name": "test765445g",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1499868690949",
+              "orchestration-status": "Active",
+              "model-invariant-id": "709d1be4-9a3f-4a29-8c4d-a20465e808a3",
+              "model-version-id": "240376de-870e-48df-915a-31f140eedd2c"
+            },
+            {
+              "service-instance-id": "8e953267-4cd8-45ec-ae7f-bdeb018656c0",
+              "service-instance-name": "a1",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1509355912484",
+              "orchestration-status": "Active",
+              "model-invariant-id": "340f3957-ff0a-4503-866d-a34fd1b97450",
+              "model-version-id": "ee2d8783-8495-4fb1-9553-6cdbd2dd3a50"
+            },
+            {
+              "service-instance-id": "e2ecfd33-b5d3-4a7b-85ba-1a709b26b66c",
+              "service-instance-name": "a3",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1509356358573",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d5937aa1-37fb-4ed0-8c30-5144b89a64ae",
+              "model-version-id": "06ac9663-54cf-4c77-b926-6e8757cf6380"
+            },
+            {
+              "service-instance-id": "7dfef88f-fec0-421f-90d4-91eea35a5813",
+              "service-instance-name": "shanitest",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1508144995828",
+              "orchestration-status": "Active",
+              "model-invariant-id": "d7b48529-6ae2-49f0-8633-b29e7cd4d4ce",
+              "model-version-id": "44671b15-83dd-4db7-a36e-dfada3eaa2f9"
+            },
+            {
+              "service-instance-id": "a46ca55c-e9bd-4e68-9c49-c98933240218",
+              "service-instance-name": "si_failtest",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1494001997513",
+              "orchestration-status": null,
+              "model-invariant-id": "732263bd-0655-428d-a347-d65676d1a949",
+              "model-version-id": null
+            },
+            {
+              "service-instance-id": "e165f1af-a3cf-4323-8cd2-607acb55baa9",
+              "service-instance-name": "first_macro_shani",
+              "persona-model-id": null,
+              "persona-model-version": null,
+              "resource-version": "1508071197869",
+              "orchestration-status": "Active",
+              "model-invariant-id": "5b9c0f33-eec1-484a-bf77-736a6644d7a8",
+              "model-version-id": "b75e0d22-05ff-4448-9266-5f0d4e1dbbd6"
+            }
+          ]
+        },
+        "is-permitted": false
+      }
+    ]
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForComplexService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/aaiSubViewEditForComplexService.json
new file mode 100644 (file)
index 0000000..0706036
--- /dev/null
@@ -0,0 +1,113 @@
+{
+  "inventory-response-item": [
+    {
+      "model-name": "1707vidnf",
+      "service-instance": {
+        "service-instance-id": "3f93c7cb-2fd0-4557-9514-e189b7b04f9d",
+        "service-instance-name": "complex-service"
+      },
+      "extra-properties": {},
+      "inventory-response-items": {
+        "inventory-response-item": [
+          {
+            "model-name": "VID-PCRF-05-15-17",
+            "generic-vnf": {
+              "vnf-id": "c015cc0f-0f37-4488-aabf-53795fd93cd3",
+              "vnf-name": "fsd",
+              "vnf-type": "1707vidnf/VID-PCRF-05-15-17 0",
+              "service-id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+              "prov-status": "PREPROV",
+              "orchestration-status": "Created",
+              "in-maint": false,
+              "is-closed-loop-disabled": false,
+              "resource-version": "1502299355826",
+              "model-invariant-id": "4160458e-f648-4b30-a176-43881ffffe9e",
+              "model-version-id": "d6557200-ecf2-4641-8094-5393ae3aae60",
+              "model-customization-id": "91415b44-753d-494c-926a-456a9172bbb9",
+              "nf-type": "null",
+              "nf-function": "null",
+              "nf-role": "null",
+              "nf-naming-code": "null"
+            },
+            "extra-properties": {},
+            "inventory-response-items": {
+              "inventory-response-item": [
+                {
+                  "volume-group": {
+                    "volume-group-id": "d9db0900-31f6-4880-8658-8c996c6123b4",
+                    "volume-group-name": "f",
+                    "heat-stack-id": "",
+                    "vnf-type": "1707vidnf/null",
+                    "orchestration-status": "Pending",
+                    "vf-module-model-customization-id": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                    "resource-version": "1508048984071"
+                  },
+                  "extra-properties": {}
+                },
+                {
+                  "model-name": "VidPcrf051517..pcrf_base_template_v3_0..module-0",
+                  "vf-module": {
+                    "vf-module-id": "f2805715-e24f-4c8a-9eb3-6c618da7691d",
+                    "vf-module-name": "aa",
+                    "orchestration-status": "pendingactivation",
+                    "is-base-vf-module": true,
+                    "resource-version": "1504770843380",
+                    "model-invariant-id": "a6f9e51a-2b35-416a-ae15-15e58d61f36d",
+                    "model-version-id": "a27f5cfc-7f12-4f99-af08-0af9c3885c87",
+                    "model-customization-id": "f8c040f1-7e51-4a11-aca8-acf256cfd861",
+                    "module-index": 0
+                  },
+                  "extra-properties": {}
+                }
+              ]
+            }
+          },
+          {
+            "l3-network": {
+              "network-id": "6adc05e4-85c6-4f91-aa5a-1eb9546c4369",
+              "network-name": "APP-C-DND_vEPDG-FN_hsl_fn_net_1",
+              "network-type": "CONTRAIL30_BASIC",
+              "network-role": "hsl",
+              "network-technology": "contrail",
+              "neutron-network-id": "41a61725-f623-4166-bc84-e76a219cca9d",
+              "is-bound-to-vpn": false,
+              "service-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "network-role-instance": 0,
+              "resource-version": "1511279493784",
+              "orchestration-status": "Created",
+              "heat-stack-id": "APP-C-DND_vEPDG-FN_hsl_fn_net_1/af134fb1-8ce3-4d41-88d9-8a83f5f79776",
+              "contrail-network-fqdn": "default-domain:APP-C-DND:APP-C-DND_vEPDG-FN_hsl_fn_net_1",
+              "physical-network-name": "leave blank",
+              "is-provider-network": false,
+              "is-shared-network": true,
+              "is-external-network": false
+            },
+            "extra-properties": {},
+            "inventory-response-items": {
+              "inventory-response-item": [
+                {
+                  "subnet": {
+                    "subnet-id": "1254dd9b-e689-4075-a089-f0deeb23c00c",
+                    "subnet-name": "APP-C-DND_vEPDG-FN_hsl_fn_net_1_subnet_1",
+                    "neutron-subnet-id": "7b5ea34d-fb95-4278-a148-4f6677ebe866",
+                    "gateway-address": "107.243.49.1",
+                    "network-start-address": "107.243.49.0",
+                    "cidr-mask": "26",
+                    "ip-version": "4",
+                    "orchestration-status": "Created",
+                    "dhcp-enabled": true,
+                    "dhcp-start": "107.243.49.3",
+                    "dhcp-end": "107.243.49.62",
+                    "ip-assignment-direction": "false",
+                    "resource-version": "1511279493791"
+                  },
+                  "extra-properties": {}
+                }
+              ]
+            }
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/asyncInstantiation.json
new file mode 100644 (file)
index 0000000..f9d4d06
--- /dev/null
@@ -0,0 +1,274 @@
+[
+  {
+    "id": 8,
+    "created": 1525075968000,
+    "modified": 1525075971000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "5c2cd8e5-27d0-42e3-85a1-85db5eaba459",
+    "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1525075968000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "nWUfl instance name_002",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1525075968000
+  },
+  {
+    "id": 7,
+    "created": 1525075968000,
+    "modified": 1525075971000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "13063a83-924e-4500-a3a1-e53d1b58450b",
+    "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
+    "userId": "16807000",
+    "jobStatus": "IN_PROGRESS",
+    "statusModifiedDate": 1525075968000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "nWUfl instance name_001",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1525075968000
+  },
+  {
+    "id": 6,
+    "created": 1525007432000,
+    "modified": 1525007434000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "e1db03c3-6274-4ff7-84cf-7bd3a3946de7",
+    "templateId": "cad41760-8653-4c5a-a5fd-8ee34780ae69",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1525007432000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "someID",
+    "owningEntityName": "expected-owningEntityName",
+    "project": "a-project-name57322c07-bb83-4e9a-9ef2-8fd53c4dd012",
+    "aicZoneId": null,
+    "aicZoneName": null,
+    "tenantId": "greatTenant",
+    "tenantName": null,
+    "regionId": "my-expected-region-id",
+    "regionName": null,
+    "serviceType": "mySubType",
+    "subscriberName": "ac040e8a-b43a-441b-ab87-603f5b70be55",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "MichaelJordan_01",
+    "serviceModelId": "300adb1e-9b0c-4d52-bfb5-fa5393c4eabb",
+    "serviceModelName": "AIM_TRANSPORT_00004",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1525007432000
+  },
+  {
+    "id": 5,
+    "created": 1524995555000,
+    "modified": 1524995556000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "9f88fdb5-bb47-4bf3-8c5f-98f1ad0ec87c",
+    "templateId": "ce4ec177-cfc8-483e-8a2c-b7aea53fd740",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524995555000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "aaa1",
+    "owningEntityName": "aaa1",
+    "project": "DFW",
+    "aicZoneId": "BAN1",
+    "aicZoneName": "VSDKYUTP-BAN1",
+    "tenantId": "1178612d2b394be4834ad77f567c0af2",
+    "tenantName": "AIN Web Tool-15-D-SSPtestcustome",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": null,
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "ComplexService",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524995555000
+  },
+  {
+    "id": 4,
+    "created": 1524994349000,
+    "modified": 1524994350000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "b73b1543-fa12-4ad5-8ef5-49f02eb33698",
+    "templateId": "79af00c6-4712-432a-8989-b6419c8baa40",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524994349000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "aaa1",
+    "owningEntityName": "aaa1",
+    "project": "DFW",
+    "aicZoneId": null,
+    "aicZoneName": null,
+    "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+    "tenantName": "AIN Web Tool-15-D-STTest2",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": null,
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "ComplexService",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524994349000
+  },
+  {
+    "id": 3,
+    "created": 1524991828000,
+    "modified": 1524991830000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "725ef127-4ee5-4665-bdf1-55ee342b362f",
+    "templateId": "6bd53c0d-8742-43f6-9ed2-efbb87062779",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524991828000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "aaa1",
+    "owningEntityName": "aaa1",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+    "tenantName": "USP-SIP-IC-24335-T-01",
+    "regionId": "AAIAIC25",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": null,
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "ComplexService",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524991828000
+  },
+  {
+    "id": 2,
+    "created": 1524663233000,
+    "modified": 1524663236000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "b1ff271b-829a-43f9-a2e3-23987a34f261",
+    "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524663233000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "sPenLiZXXpqzsVck instance name_02",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524663233000
+  },
+  {
+    "id": 1,
+    "created": 1524663233000,
+    "modified": 1524663236000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "850dc7d2-5240-437f-9bcd-b1ed7dc339ca",
+    "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
+    "userId": "16807000",
+    "jobStatus": "IN_PROGRESS",
+    "statusModifiedDate": 1524663233000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "sPenLiZXXpqzsVck instance name_01",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524663233000
+  }
+]
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/auditInfoMSO.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/auditInfoMSO.json
new file mode 100644 (file)
index 0000000..0f7646d
--- /dev/null
@@ -0,0 +1,12 @@
+[
+  {
+    "id": null,
+    "jobId": "20fb575c-130a-4c5e-b434-50440bf992ec",
+    "jobStatus": "COMPLETE",
+    "source": "MSO",
+    "requestId": "c0011670-0e1a-4b74-945d-8bf5aede1d9c",
+    "additionalInfo": "Service Instance was created successfully.",
+    "final": null,
+    "createdDate": 1526471134058
+  }
+]
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/auditInfoVid.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/auditInfoVid.json
new file mode 100644 (file)
index 0000000..d1764a1
--- /dev/null
@@ -0,0 +1,32 @@
+[
+  {
+    "id": null,
+    "jobId": "20fb575c-130a-4c5e-b434-50440bf992ec",
+    "jobStatus": "PENDING",
+    "source": "VID",
+    "requestId": null,
+    "additionalInfo": null,
+    "final": false,
+    "createdDate": 1526471134058
+  },
+  {
+    "id": null,
+    "jobId": "20fb575c-130a-4c5e-b434-50440bf992ec",
+    "jobStatus": "IN_PROGRESS",
+    "source": "VID",
+    "requestId": null,
+    "additionalInfo": null,
+    "final": false,
+    "createdDate": 1526471134058
+  },
+  {
+    "id": null,
+    "jobId": "20fb575c-130a-4c5e-b434-50440bf992ec",
+    "jobStatus": "COMPLETED",
+    "source": "VID",
+    "requestId": null,
+    "additionalInfo": null,
+    "final": true,
+    "createdDate": 1526471134058
+  }
+]
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicAsyncInstantiation.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicAsyncInstantiation.json
new file mode 100644 (file)
index 0000000..f9d4d06
--- /dev/null
@@ -0,0 +1,274 @@
+[
+  {
+    "id": 8,
+    "created": 1525075968000,
+    "modified": 1525075971000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "5c2cd8e5-27d0-42e3-85a1-85db5eaba459",
+    "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1525075968000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "nWUfl instance name_002",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1525075968000
+  },
+  {
+    "id": 7,
+    "created": 1525075968000,
+    "modified": 1525075971000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "13063a83-924e-4500-a3a1-e53d1b58450b",
+    "templateId": "d42ba7c8-9e19-4e34-ae2c-d8af3f24498e",
+    "userId": "16807000",
+    "jobStatus": "IN_PROGRESS",
+    "statusModifiedDate": 1525075968000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "nWUfl instance name_001",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1525075968000
+  },
+  {
+    "id": 6,
+    "created": 1525007432000,
+    "modified": 1525007434000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "e1db03c3-6274-4ff7-84cf-7bd3a3946de7",
+    "templateId": "cad41760-8653-4c5a-a5fd-8ee34780ae69",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1525007432000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "someID",
+    "owningEntityName": "expected-owningEntityName",
+    "project": "a-project-name57322c07-bb83-4e9a-9ef2-8fd53c4dd012",
+    "aicZoneId": null,
+    "aicZoneName": null,
+    "tenantId": "greatTenant",
+    "tenantName": null,
+    "regionId": "my-expected-region-id",
+    "regionName": null,
+    "serviceType": "mySubType",
+    "subscriberName": "ac040e8a-b43a-441b-ab87-603f5b70be55",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "MichaelJordan_01",
+    "serviceModelId": "300adb1e-9b0c-4d52-bfb5-fa5393c4eabb",
+    "serviceModelName": "AIM_TRANSPORT_00004",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1525007432000
+  },
+  {
+    "id": 5,
+    "created": 1524995555000,
+    "modified": 1524995556000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "9f88fdb5-bb47-4bf3-8c5f-98f1ad0ec87c",
+    "templateId": "ce4ec177-cfc8-483e-8a2c-b7aea53fd740",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524995555000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "aaa1",
+    "owningEntityName": "aaa1",
+    "project": "DFW",
+    "aicZoneId": "BAN1",
+    "aicZoneName": "VSDKYUTP-BAN1",
+    "tenantId": "1178612d2b394be4834ad77f567c0af2",
+    "tenantName": "AIN Web Tool-15-D-SSPtestcustome",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": null,
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "ComplexService",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524995555000
+  },
+  {
+    "id": 4,
+    "created": 1524994349000,
+    "modified": 1524994350000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "b73b1543-fa12-4ad5-8ef5-49f02eb33698",
+    "templateId": "79af00c6-4712-432a-8989-b6419c8baa40",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524994349000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "aaa1",
+    "owningEntityName": "aaa1",
+    "project": "DFW",
+    "aicZoneId": null,
+    "aicZoneName": null,
+    "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+    "tenantName": "AIN Web Tool-15-D-STTest2",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": null,
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "ComplexService",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524994349000
+  },
+  {
+    "id": 3,
+    "created": 1524991828000,
+    "modified": 1524991830000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "725ef127-4ee5-4665-bdf1-55ee342b362f",
+    "templateId": "6bd53c0d-8742-43f6-9ed2-efbb87062779",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524991828000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "aaa1",
+    "owningEntityName": "aaa1",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+    "tenantName": "USP-SIP-IC-24335-T-01",
+    "regionId": "AAIAIC25",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": null,
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "ComplexService",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524991828000
+  },
+  {
+    "id": 2,
+    "created": 1524663233000,
+    "modified": 1524663236000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "b1ff271b-829a-43f9-a2e3-23987a34f261",
+    "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
+    "userId": "16807000",
+    "jobStatus": "FAILED",
+    "statusModifiedDate": 1524663233000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "sPenLiZXXpqzsVck instance name_02",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524663233000
+  },
+  {
+    "id": 1,
+    "created": 1524663233000,
+    "modified": 1524663236000,
+    "createdId": null,
+    "modifiedId": null,
+    "rowNum": null,
+    "auditUserId": null,
+    "auditTrail": null,
+    "jobId": "850dc7d2-5240-437f-9bcd-b1ed7dc339ca",
+    "templateId": "262fccc5-cae9-4258-b522-540c4010e0a9",
+    "userId": "16807000",
+    "jobStatus": "IN_PROGRESS",
+    "statusModifiedDate": 1524663233000,
+    "hidden": false,
+    "pause": false,
+    "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+    "owningEntityName": "MetroPacketCore",
+    "project": "DFW",
+    "aicZoneId": "NFT1",
+    "aicZoneName": "NFTJSSSS-NFT1",
+    "tenantId": "bae71557c5bb4d5aac6743a4e5f1d054",
+    "tenantName": "AIN Web Tool-15-D-testgamma",
+    "regionId": "mtn6",
+    "regionName": null,
+    "serviceType": "VIRTUAL USP",
+    "subscriberName": "e433710f-9217-458d-a79d-1c7aff376d89",
+    "serviceInstanceId": null,
+    "serviceInstanceName": "sPenLiZXXpqzsVck instance name_01",
+    "serviceModelId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "serviceModelName": "action-data",
+    "serviceModelVersion": "1.0",
+    "createdBulkDate": 1524663233000
+  }
+]
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicRedux.json
new file mode 100644 (file)
index 0000000..714b3a4
--- /dev/null
@@ -0,0 +1,2003 @@
+{
+  "global": {
+    "name": null
+  },
+  "service": {
+    "serviceHierarchy": {
+      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "service": {
+          "uuid": "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+          "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "name": "action-data",
+          "version": "1.0",
+          "toscaModelURL": null,
+          "category": "",
+          "serviceType": "",
+          "serviceRole": "",
+          "description": "",
+          "serviceEcompNaming": "true",
+          "instantiationType": "Macro",
+          "inputs": {
+            "2017488_adiodvpe0_ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            }
+          }
+        },
+        "vnfs": {
+          "2017-388_ADIOD-vPE 1": {
+            "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+            "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-388_ADIOD-vPE",
+            "version": "1.0",
+            "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+            "vfModules": {},
+            "volumeGroups": {},
+            "vfcInstanceGroups": {}
+          },
+          "2017-388_ADIOD-vPE 0": {
+            "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+            "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-388_ADIOD-vPE",
+            "version": "4.0",
+            "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+            "vfModules": {},
+            "volumeGroups": {},
+            "vfcInstanceGroups": {}
+          },
+          "2017-488_ADIOD-vPE 0": {
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+            "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-488_ADIOD-vPE",
+            "version": "5.0",
+            "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  }
+                },
+                "volumeGroupAllowed": true
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "version": "5",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "properties": {
+                  "minCountInstances": 1,
+                  "maxCountInstances": 1,
+                  "initialCount": 1,
+                  "vfModuleLabel": "ADIOD_base_vPE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": false
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": true
+              }
+            },
+            "volumeGroups": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  }
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {}
+              }
+            },
+            "vfcInstanceGroups": {}
+          }
+        },
+        "networks": {},
+        "collectionResource": {},
+        "configurations": {},
+        "serviceProxies": {},
+        "vfModules": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              },
+              "adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              }
+            },
+            "volumeGroupAllowed": true
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+            "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+            "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+            "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "version": "5",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "properties": {
+              "minCountInstances": 1,
+              "maxCountInstances": 1,
+              "initialCount": 1,
+              "vfModuleLabel": "ADIOD_base_vPE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": false
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": true
+          }
+        },
+        "volumeGroups": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              },
+              "adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              }
+            }
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {}
+          }
+        },
+        "pnfs": {}
+      }
+    },
+    "serviceInstance": {},
+    "lcpRegionsAndTenants": {
+      "lcpRegionList": [
+        {
+          "id": "AAIAIC25",
+          "name": "AAIAIC25",
+          "isPermitted": true
+        },
+        {
+          "id": "mtn6",
+          "name": "mtn6",
+          "isPermitted": true
+        }
+      ],
+      "lcpRegionsTenantsMap": {
+        "AAIAIC25": [
+          {
+            "id": "092eb9e8e4b7412e8787dd091bc58e86",
+            "name": "USP-SIP-IC-24335-T-01",
+            "isPermitted": true
+          }
+        ],
+        "mtn6": [
+          {
+            "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+            "name": "AIN Web Tool-15-D-testgamma",
+            "isPermitted": true
+          },
+          {
+            "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "name": "AIN Web Tool-15-D-STTest2",
+            "isPermitted": true
+          },
+          {
+            "id": "1178612d2b394be4834ad77f567c0af2",
+            "name": "AIN Web Tool-15-D-SSPtestcustome",
+            "isPermitted": true
+          },
+          {
+            "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+            "name": "AIN Web Tool-15-D-UncheckedEcopm",
+            "isPermitted": true
+          },
+          {
+            "id": "de007636e25249238447264a988a927b",
+            "name": "AIN Web Tool-15-D-dfsdf",
+            "isPermitted": true
+          },
+          {
+            "id": "62f29b3613634ca6a3065cbe0e020c44",
+            "name": "AIN/SMS-16-D-Multiservices1",
+            "isPermitted": true
+          },
+          {
+            "id": "649289e30d3244e0b48098114d63c2aa",
+            "name": "AIN Web Tool-15-D-SSPST66",
+            "isPermitted": true
+          },
+          {
+            "id": "3f21eeea6c2c486bba31dab816c05a32",
+            "name": "AIN Web Tool-15-D-ASSPST47",
+            "isPermitted": true
+          },
+          {
+            "id": "f60ce21d3ee6427586cff0d22b03b773",
+            "name": "CESAR-100-D-sspjg67246",
+            "isPermitted": true
+          },
+          {
+            "id": "8774659e425f479895ae091bb5d46560",
+            "name": "CESAR-100-D-sspjg68359",
+            "isPermitted": true
+          },
+          {
+            "id": "624eb554b0d147c19ff8885341760481",
+            "name": "AINWebTool-15-D-iftach",
+            "isPermitted": true
+          },
+          {
+            "id": "214f55f5fc414c678059c383b03e4962",
+            "name": "CESAR-100-D-sspjg612401",
+            "isPermitted": true
+          },
+          {
+            "id": "c90666c291664841bb98e4d981ff1db5",
+            "name": "CESAR-100-D-sspjg621340",
+            "isPermitted": true
+          },
+          {
+            "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+            "name": "sspjg621351cloned",
+            "isPermitted": true
+          },
+          {
+            "id": "b386b768a3f24c8e953abbe0b3488c02",
+            "name": "AINWebTool-15-D-eteancomp",
+            "isPermitted": true
+          },
+          {
+            "id": "dc6c4dbfd225474e9deaadd34968646c",
+            "name": "AINWebTool-15-T-SPFET",
+            "isPermitted": true
+          },
+          {
+            "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+            "name": "AINWebTool-15-X-eeweww",
+            "isPermitted": true
+          },
+          {
+            "id": "f2f3830e4c984d45bcd00e1a04158a79",
+            "name": "CESAR-100-D-spjg61909",
+            "isPermitted": true
+          },
+          {
+            "id": "05b91bd5137f4929878edd965755c06d",
+            "name": "CESAR-100-D-sspjg621512cloned",
+            "isPermitted": true
+          },
+          {
+            "id": "7002fbe8482d4a989ddf445b1ce336e0",
+            "name": "AINWebTool-15-X-vdr",
+            "isPermitted": true
+          },
+          {
+            "id": "4008522be43741dcb1f5422022a2aa0b",
+            "name": "AINWebTool-15-D-ssasa",
+            "isPermitted": true
+          },
+          {
+            "id": "f44e2e96a1b6476abfda2fa407b00169",
+            "name": "AINWebTool-15-D-PFNPT",
+            "isPermitted": true
+          },
+          {
+            "id": "b69a52bec8a84669a37a1e8b72708be7",
+            "name": "AINWebTool-15-X-vdre",
+            "isPermitted": true
+          },
+          {
+            "id": "fac7d9fd56154caeb9332202dcf2969f",
+            "name": "AINWebTool-15-X-NONPODECOMP",
+            "isPermitted": true
+          },
+          {
+            "id": "2d34d8396e194eb49969fd61ffbff961",
+            "name": "DN5242-Nov16-T5",
+            "isPermitted": true
+          },
+          {
+            "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+            "name": "ro-T11",
+            "isPermitted": true
+          },
+          {
+            "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+            "name": "ro-T112",
+            "isPermitted": true
+          },
+          {
+            "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+            "name": "DN5242-Nov21-T1",
+            "isPermitted": true
+          },
+          {
+            "id": "d0a3e3f2964542259d155a81c41aadc3",
+            "name": "test-mtn6-09",
+            "isPermitted": true
+          },
+          {
+            "id": "cbb99fe4ada84631b7baf046b6fd2044",
+            "name": "DN5242-Nov16-T3",
+            "isPermitted": true
+          }
+        ]
+      }
+    },
+    "subscribers": [
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Mobility",
+        "isPermitted": false
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
+        "name": "PACKET CORE",
+        "isPermitted": false
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "USP VOICE",
+        "isPermitted": true
+      }
+    ],
+    "productFamilies": [
+      {
+        "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "name": "DHV",
+        "isPermitted": true
+      },
+      {
+        "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+        "name": "FLEXREACH",
+        "isPermitted": true
+      },
+      {
+        "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+        "name": "Netbond",
+        "isPermitted": true
+      },
+      {
+        "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+        "name": "Enhanced Services",
+        "isPermitted": true
+      },
+      {
+        "id": "vRRaaS",
+        "name": "vRRaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+        "name": "vSCP",
+        "isPermitted": true
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Mobility",
+        "isPermitted": true
+      },
+      {
+        "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "name": "BVOIP",
+        "isPermitted": true
+      },
+      {
+        "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+        "name": "FIRSTNET",
+        "isPermitted": true
+      },
+      {
+        "id": "LRSI-OSPF",
+        "name": "LRSI-OSPF",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNGWaas",
+        "name": "HNGATEWAY",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNPaas",
+        "name": "HNPORTAL",
+        "isPermitted": true
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "VIRTUAL USP",
+        "isPermitted": true
+      },
+      {
+        "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+        "name": "VROUTER",
+        "isPermitted": true
+      },
+      {
+        "id": "VIPRaaS",
+        "name": "vIPRaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+        "name": "WAN Bonding",
+        "isPermitted": true
+      },
+      {
+        "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+        "name": "HOSTED COMMUNICATIONS",
+        "isPermitted": true
+      },
+      {
+        "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+        "name": "Transport",
+        "isPermitted": true
+      },
+      {
+        "id": "vVIGaaS",
+        "name": "vVIGaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+        "name": "uCPE-VMS",
+        "isPermitted": true
+      },
+      {
+        "id": "vPEaaS",
+        "name": "vPEaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+        "name": "HOSTED COMMUNICATIONS",
+        "isPermitted": true
+      }
+    ],
+    "serviceTypes": {
+      "e433710f-9217-458d-a79d-1c7aff376d89": [
+        {
+          "id": "0",
+          "name": "vFlowLogic",
+          "isPermitted": false
+        },
+        {
+          "id": "1",
+          "name": "VIRTUAL USP",
+          "isPermitted": true
+        },
+        {
+          "id": "2",
+          "name": "Mobility",
+          "isPermitted": false
+        },
+        {
+          "id": "3",
+          "name": "vBNG",
+          "isPermitted": false
+        },
+        {
+          "id": "4",
+          "name": "vVoiceMail",
+          "isPermitted": false
+        },
+        {
+          "id": "5",
+          "name": "Nimbus",
+          "isPermitted": false
+        },
+        {
+          "id": "6",
+          "name": "vSEGW",
+          "isPermitted": false
+        },
+        {
+          "id": "7",
+          "name": "vVM",
+          "isPermitted": false
+        },
+        {
+          "id": "8",
+          "name": "vOTA",
+          "isPermitted": false
+        },
+        {
+          "id": "9",
+          "name": "vMME",
+          "isPermitted": false
+        },
+        {
+          "id": "10",
+          "name": "vMNS",
+          "isPermitted": false
+        },
+        {
+          "id": "11",
+          "name": "vSCP",
+          "isPermitted": false
+        },
+        {
+          "id": "12",
+          "name": "VPMS",
+          "isPermitted": false
+        },
+        {
+          "id": "13",
+          "name": "vMMSC",
+          "isPermitted": false
+        },
+        {
+          "id": "14",
+          "name": "SSD",
+          "isPermitted": false
+        },
+        {
+          "id": "15",
+          "name": "vMOG",
+          "isPermitted": false
+        },
+        {
+          "id": "16",
+          "name": "FIRSTNET",
+          "isPermitted": false
+        },
+        {
+          "id": "17",
+          "name": "ACTIVE_CHARGE",
+          "isPermitted": false
+        },
+        {
+          "id": "18",
+          "name": "vHSS",
+          "isPermitted": false
+        }
+      ]
+    },
+    "aicZones": [
+      {
+        "id": "NFT1",
+        "name": "NFTJSSSS-NFT1"
+      },
+      {
+        "id": "JAG1",
+        "name": "YUDFJULP-JAG1"
+      },
+      {
+        "id": "YYY1",
+        "name": "UUUAIAAI-YYY1"
+      },
+      {
+        "id": "BAN1",
+        "name": "VSDKYUTP-BAN1"
+      },
+      {
+        "id": "DKJ1",
+        "name": "DKJSJDKA-DKJ1"
+      },
+      {
+        "id": "MCS1",
+        "name": "ASACMAMS-MCS1"
+      },
+      {
+        "id": "UIO1",
+        "name": "uioclli1-UIO1"
+      },
+      {
+        "id": "RAJ1",
+        "name": "YGBIJNLQ-RAJ1"
+      },
+      {
+        "id": "OPA1",
+        "name": "opaclli1-OPA1"
+      },
+      {
+        "id": "SDE1",
+        "name": "ZXCVBNMA-SDE1"
+      },
+      {
+        "id": "VEN2",
+        "name": "FGHJUHIL-VEN2"
+      },
+      {
+        "id": "ORL1",
+        "name": "ORLDFLMA-ORL1"
+      },
+      {
+        "id": "JAD1",
+        "name": "JADECLLI-JAD1"
+      },
+      {
+        "id": "ZXL1",
+        "name": "LWLWCANN-ZXL1"
+      },
+      {
+        "id": "CKL1",
+        "name": "CLKSKCKK-CKL1"
+      },
+      {
+        "id": "SDF1",
+        "name": "sdfclli1-SDF1"
+      },
+      {
+        "id": "RAD1",
+        "name": "RADICAL1-RAD1"
+      },
+      {
+        "id": "KIT1",
+        "name": "BHYJFGLN-KIT1"
+      },
+      {
+        "id": "REL1",
+        "name": "INGERFGT-REL1"
+      },
+      {
+        "id": "JNL1",
+        "name": "CJALSDAC-JNL1"
+      },
+      {
+        "id": "OLK1",
+        "name": "OLKOLKLS-OLK1"
+      },
+      {
+        "id": "CHI1",
+        "name": "CHILLIWE-CHI1"
+      },
+      {
+        "id": "UUU4",
+        "name": "UUUAAAUU-UUU4"
+      },
+      {
+        "id": "TUF1",
+        "name": "TUFCLLI1-TUF1"
+      },
+      {
+        "id": "KJN1",
+        "name": "CKALDKSA-KJN1"
+      },
+      {
+        "id": "SAM1",
+        "name": "SNDGCA64-SAN1"
+      },
+      {
+        "id": "SCK1",
+        "name": "SCKSCKSK-SCK1"
+      },
+      {
+        "id": "HJH1",
+        "name": "AOEEQQQD-HJH1"
+      },
+      {
+        "id": "HGD1",
+        "name": "SDFQWHGD-HGD1"
+      },
+      {
+        "id": "KOR1",
+        "name": "HYFLNBVT-KOR1"
+      },
+      {
+        "id": "ATL43",
+        "name": "AICLOCID-ATL43"
+      },
+      {
+        "id": "ATL54",
+        "name": "AICFTAAI-ATL54"
+      },
+      {
+        "id": "ATL66",
+        "name": "CLLIAAII-ATL66"
+      },
+      {
+        "id": "VEL1",
+        "name": "BNMLKUIK-VEL1"
+      },
+      {
+        "id": "ICC1",
+        "name": "SANJITAT-ICC1"
+      },
+      {
+        "id": "MNT11",
+        "name": "WSXEFBTH-MNT11"
+      },
+      {
+        "id": "DEF2",
+        "name": "WSBHGTYL-DEF2"
+      },
+      {
+        "id": "MAD11",
+        "name": "SDFQWGKL-MAD11"
+      },
+      {
+        "id": "OLG1",
+        "name": "OLHOLHOL-OLG1"
+      },
+      {
+        "id": "GAR1",
+        "name": "NGFVSJKO-GAR1"
+      },
+      {
+        "id": "SAN22",
+        "name": "GNVLSCTL-SAN22"
+      },
+      {
+        "id": "HRG1",
+        "name": "HRGHRGGS-HRG1"
+      },
+      {
+        "id": "JCS1",
+        "name": "JCSJSCJS-JCS1"
+      },
+      {
+        "id": "DHA12",
+        "name": "WSXEDECF-DHA12"
+      },
+      {
+        "id": "HJE1",
+        "name": "AOEEWWWD-HJE1"
+      },
+      {
+        "id": "NCA1",
+        "name": "NCANCANN-NCA1"
+      },
+      {
+        "id": "IOP1",
+        "name": "iopclli1-IOP1"
+      },
+      {
+        "id": "RTY1",
+        "name": "rtyclli1-RTY1"
+      },
+      {
+        "id": "KAP1",
+        "name": "HIOUYTRQ-KAP1"
+      },
+      {
+        "id": "ZEN1",
+        "name": "ZENCLLI1-ZEN1"
+      },
+      {
+        "id": "HKA1",
+        "name": "JAKHLASS-HKA1"
+      },
+      {
+        "id": "CQK1",
+        "name": "CQKSCAKK-CQK1"
+      },
+      {
+        "id": "SAI1",
+        "name": "UBEKQLPD-SAI1"
+      },
+      {
+        "id": "ERT1",
+        "name": "ertclli1-ERT1"
+      },
+      {
+        "id": "IBB1",
+        "name": "PLMKOIJU-IBB1"
+      },
+      {
+        "id": "TIR2",
+        "name": "PLKINHYI-TIR2"
+      },
+      {
+        "id": "HSD1",
+        "name": "CHASKCDS-HSD1"
+      },
+      {
+        "id": "SLF78",
+        "name": "SDCTLFN1-SLF78"
+      },
+      {
+        "id": "SEE78",
+        "name": "SDCTEEE4-SEE78"
+      },
+      {
+        "id": "SAN13",
+        "name": "TOKYJPFA-SAN13"
+      },
+      {
+        "id": "SAA78",
+        "name": "SDCTAAA1-SAA78"
+      },
+      {
+        "id": "LUC1",
+        "name": "ATLDFGYC-LUC1"
+      },
+      {
+        "id": "AMD13",
+        "name": "MEMATLAN-AMD13"
+      },
+      {
+        "id": "TOR1",
+        "name": "TOROONXN-TOR1"
+      },
+      {
+        "id": "QWE1",
+        "name": "QWECLLI1-QWE1"
+      },
+      {
+        "id": "ZOG1",
+        "name": "ZOGASTRO-ZOG1"
+      },
+      {
+        "id": "CAL33",
+        "name": "CALIFORN-CAL33"
+      },
+      {
+        "id": "SHH78",
+        "name": "SDIT1HHH-SHH78"
+      },
+      {
+        "id": "DSA1",
+        "name": "LKJHGFDS-DSA1"
+      },
+      {
+        "id": "CLG1",
+        "name": "CLGRABAD-CLG1"
+      },
+      {
+        "id": "BNA1",
+        "name": "BNARAGBK-BNA1"
+      },
+      {
+        "id": "ATL84",
+        "name": "CANTTCOC-ATL84"
+      },
+      {
+        "id": "APP1",
+        "name": "WBHGTYUI-APP1"
+      },
+      {
+        "id": "RJN1",
+        "name": "RJNRBZAW-RJN1"
+      },
+      {
+        "id": "EHH78",
+        "name": "SDCSHHH5-EHH78"
+      },
+      {
+        "id": "mac10",
+        "name": "PKGTESTF-mac10"
+      },
+      {
+        "id": "SXB78",
+        "name": "SDCTGXB1-SXB78"
+      },
+      {
+        "id": "SAX78",
+        "name": "SDCTAXG1-SAX78"
+      },
+      {
+        "id": "SYD1",
+        "name": "SYDNAUBV-SYD1"
+      },
+      {
+        "id": "TOK1",
+        "name": "TOKYJPFA-TOK1"
+      },
+      {
+        "id": "KGM2",
+        "name": "KGMTNC20-KGM2"
+      },
+      {
+        "id": "DCC1b",
+        "name": "POIUYTGH-DCC1b"
+      },
+      {
+        "id": "SKK78",
+        "name": "SDCTKKK1-SKK78"
+      },
+      {
+        "id": "SGG78",
+        "name": "SDCTGGG1-SGG78"
+      },
+      {
+        "id": "SJJ78",
+        "name": "SDCTJJJ1-SJJ78"
+      },
+      {
+        "id": "SBX78",
+        "name": "SDCTBXG1-SBX78"
+      },
+      {
+        "id": "LAG1",
+        "name": "LARGIZON-LAG1"
+      },
+      {
+        "id": "IAA1",
+        "name": "QAZXSWED-IAA1"
+      },
+      {
+        "id": "POI1",
+        "name": "PLMNJKIU-POI1"
+      },
+      {
+        "id": "LAG1a",
+        "name": "LARGIZON-LAG1a"
+      },
+      {
+        "id": "PBL1",
+        "name": "PBLAPBAI-PBL1"
+      },
+      {
+        "id": "LAG45",
+        "name": "LARGIZON-LAG1a"
+      },
+      {
+        "id": "MAR1",
+        "name": "MNBVCXZM-MAR1"
+      },
+      {
+        "id": "HST70",
+        "name": "HSTNTX70-HST70"
+      },
+      {
+        "id": "DCC1a",
+        "name": "POIUYTGH-DCC1a"
+      },
+      {
+        "id": "TOL1",
+        "name": "TOLDOH21-TOL1"
+      },
+      {
+        "id": "LON1",
+        "name": "LONEENCO-LON1"
+      },
+      {
+        "id": "SJU78",
+        "name": "SDIT1JUB-SJU78"
+      },
+      {
+        "id": "STN27",
+        "name": "HSTNTX01-STN27"
+      },
+      {
+        "id": "SSW56",
+        "name": "ss8126GT-SSW56"
+      },
+      {
+        "id": "SBB78",
+        "name": "SDIT1BBB-SBB78"
+      },
+      {
+        "id": "DCC3",
+        "name": "POIUYTGH-DCC3"
+      },
+      {
+        "id": "GNV1",
+        "name": "GNVLSCTL-GNV1"
+      },
+      {
+        "id": "WAS1",
+        "name": "WASHDCSW-WAS1"
+      },
+      {
+        "id": "TOY1",
+        "name": "TORYONNZ-TOY1"
+      },
+      {
+        "id": "STT1",
+        "name": "STTLWA02-STT1"
+      },
+      {
+        "id": "STG1",
+        "name": "STTGGE62-STG1"
+      },
+      {
+        "id": "SLL78",
+        "name": "SDCTLLL1-SLL78"
+      },
+      {
+        "id": "SBU78",
+        "name": "SDIT1BUB-SBU78"
+      },
+      {
+        "id": "ATL2",
+        "name": "ATLNGANW-ATL2"
+      },
+      {
+        "id": "BOT1",
+        "name": "BOTHWAKY-BOT1"
+      },
+      {
+        "id": "SNG1",
+        "name": "SNGPSIAU-SNG1"
+      },
+      {
+        "id": "NYC1",
+        "name": "NYCMNY54-NYC1"
+      },
+      {
+        "id": "LAG1b",
+        "name": "LARGIZON-LAG1b"
+      },
+      {
+        "id": "AMD15",
+        "name": "AMDFAA01-AMD15"
+      },
+      {
+        "id": "SNA1",
+        "name": "SNANTXCA-SNA1"
+      },
+      {
+        "id": "PLT1",
+        "name": "PLTNCA60-PLT1"
+      },
+      {
+        "id": "TLP1",
+        "name": "TLPNXM18-TLP1"
+      },
+      {
+        "id": "SDD81",
+        "name": "SAIT1DD6-SDD81"
+      },
+      {
+        "id": "DCC1",
+        "name": "POIUYTGH-DCC1"
+      },
+      {
+        "id": "DCC2",
+        "name": "POIUYTGH-DCC2"
+      },
+      {
+        "id": "OKC1",
+        "name": "OKCBOK55-OKC1"
+      },
+      {
+        "id": "PAR1",
+        "name": "PARSFRCG-PAR1"
+      },
+      {
+        "id": "TES36",
+        "name": "ABCEETES-TES36"
+      },
+      {
+        "id": "COM1",
+        "name": "PLMKOPIU-COM1"
+      },
+      {
+        "id": "ANI1",
+        "name": "ATLNGTRE-ANI1"
+      },
+      {
+        "id": "SDG78",
+        "name": "SDIT1BDG-SDG78"
+      },
+      {
+        "id": "mac20",
+        "name": "PKGTESTF-mac20"
+      },
+      {
+        "id": "DSF45",
+        "name": "DSFBG123-DSF45"
+      },
+      {
+        "id": "HST25",
+        "name": "HSTNTX01-HST25"
+      },
+      {
+        "id": "AMD18",
+        "name": "AUDIMA01-AMD18"
+      },
+      {
+        "id": "SAA80",
+        "name": "SAIT9AA3-SAA80"
+      },
+      {
+        "id": "SSA56",
+        "name": "SSIT2AA7-SSA56"
+      },
+      {
+        "id": "SDD82",
+        "name": "SAIT1DD9-SDD82"
+      },
+      {
+        "id": "JCV1",
+        "name": "JCVLFLBW-JCV1"
+      },
+      {
+        "id": "SUL2",
+        "name": "WERTYUJK-SUL2"
+      },
+      {
+        "id": "PUR1",
+        "name": "purelyde-PUR1"
+      },
+      {
+        "id": "FDE55",
+        "name": "FDERT555-FDE55"
+      },
+      {
+        "id": "SITE",
+        "name": "LONEENCO-SITE"
+      },
+      {
+        "id": "ATL1",
+        "name": "ATLNGAMA-ATL1"
+      },
+      {
+        "id": "JUL1",
+        "name": "ZXCVBNMM-JUL1"
+      },
+      {
+        "id": "TAT34",
+        "name": "TESAAISB-TAT34"
+      },
+      {
+        "id": "XCP12",
+        "name": "CHKGH123-XCP12"
+      },
+      {
+        "id": "RAI1",
+        "name": "poiuytre-RAI1"
+      },
+      {
+        "id": "HPO1",
+        "name": "ATLNGAUP-HPO1"
+      },
+      {
+        "id": "KJF12",
+        "name": "KJFDH123-KJF12"
+      },
+      {
+        "id": "SCC80",
+        "name": "SAIT9CC3-SCC80"
+      },
+      {
+        "id": "SAA12",
+        "name": "SAIT9AF8-SAA12"
+      },
+      {
+        "id": "SAA14",
+        "name": "SAIT1AA9-SAA14"
+      },
+      {
+        "id": "ATL35",
+        "name": "TTESSAAI-ATL35"
+      },
+      {
+        "id": "CWY1",
+        "name": "CWYMOWBS-CWY1"
+      },
+      {
+        "id": "ATL76",
+        "name": "TELEPAAI-ATL76"
+      },
+      {
+        "id": "DSL12",
+        "name": "DSLFK242-DSL12"
+      },
+      {
+        "id": "ATL53",
+        "name": "AAIATLTE-ATL53"
+      },
+      {
+        "id": "SAA11",
+        "name": "SAIT9AA2-SAA11"
+      },
+      {
+        "id": "ATL62",
+        "name": "TESSASCH-ATL62"
+      },
+      {
+        "id": "AUG1",
+        "name": "ASDFGHJK-AUG1"
+      },
+      {
+        "id": "POI22",
+        "name": "POIUY123-POI22"
+      },
+      {
+        "id": "SAA13",
+        "name": "SAIT1AA9-SAA13"
+      },
+      {
+        "id": "BHY17",
+        "name": "BHYTFRF3-BHY17"
+      },
+      {
+        "id": "LIS1",
+        "name": "HOSTPROF-LIS1"
+      },
+      {
+        "id": "SIP1",
+        "name": "ZXCVBNMK-SIP1"
+      },
+      {
+        "id": "ATL99",
+        "name": "TEESTAAI-ATL43"
+      },
+      {
+        "id": "ATL64",
+        "name": "FORLOAAJ-ATL64"
+      },
+      {
+        "id": "TAT33",
+        "name": "TESAAISA-TAT33"
+      },
+      {
+        "id": "RAD10",
+        "name": "INDIPUNE-RAD10"
+      },
+      {
+        "id": "RTW5",
+        "name": "BHYTFRY4-RTW5"
+      },
+      {
+        "id": "JGS1",
+        "name": "KSJKKKKK-JGS1"
+      },
+      {
+        "id": "ATL98",
+        "name": "TEESTAAI-ATL43"
+      },
+      {
+        "id": "WAN1",
+        "name": "LEIWANGW-WAN1"
+      },
+      {
+        "id": "ATL44",
+        "name": "ATLSANAB-ATL44"
+      },
+      {
+        "id": "RTD2",
+        "name": "BHYTFRk4-RTD2"
+      },
+      {
+        "id": "NIR1",
+        "name": "ORFLMANA-NIR1"
+      },
+      {
+        "id": "ATL75",
+        "name": "SANAAIRE-ATL75"
+      },
+      {
+        "id": "NUM1",
+        "name": "QWERTYUI-NUM1"
+      },
+      {
+        "id": "MTN32",
+        "name": "MDTWNJ21-MTN32"
+      },
+      {
+        "id": "RTZ4",
+        "name": "BHYTFRZ6-RTZ4"
+      },
+      {
+        "id": "ATL56",
+        "name": "ATLSANAC-ATL56"
+      },
+      {
+        "id": "AMS1",
+        "name": "AMSTNLBW-AMS1"
+      },
+      {
+        "id": "RCT1",
+        "name": "AMSTERNL-RCT1"
+      },
+      {
+        "id": "JAN1",
+        "name": "ORFLMATT-JAN1"
+      },
+      {
+        "id": "ABC14",
+        "name": "TESAAISA-ABC14"
+      },
+      {
+        "id": "TAT37",
+        "name": "TESAAISD-TAT37"
+      },
+      {
+        "id": "MIC54",
+        "name": "MICHIGAN-MIC54"
+      },
+      {
+        "id": "ABC11",
+        "name": "ATLSANAI-ABC11"
+      },
+      {
+        "id": "AMF11",
+        "name": "AMDOCS01-AMF11"
+      },
+      {
+        "id": "ATL63",
+        "name": "ATLSANEW-ATL63"
+      },
+      {
+        "id": "ABC12",
+        "name": "ATLSECIA-ABC12"
+      },
+      {
+        "id": "MTN20",
+        "name": "MDTWNJ21-MTN20"
+      },
+      {
+        "id": "ABC15",
+        "name": "AAITESAN-ABC15"
+      },
+      {
+        "id": "AVT1",
+        "name": "AVTRFLHD-AVT1"
+      },
+      {
+        "id": "ATL34",
+        "name": "ATLSANAI-ATL34"
+      }
+    ],
+    "categoryParameters": {
+      "owningEntityList": [
+        {
+          "id": "aaa1",
+          "name": "aaa1"
+        },
+        {
+          "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+          "name": "MetroPacketCore"
+        },
+        {
+          "id": "Wireline",
+          "name": "Wireline"
+        }
+      ],
+      "projectList": [
+        {
+          "id": "DFW",
+          "name": "DFW"
+        },
+        {
+          "id": "x1",
+          "name": "x1"
+        },
+        {
+          "id": "yyy1",
+          "name": "yyy1"
+        }
+      ],
+      "lineOfBusinessList": [
+        {
+          "id": "ECOMP",
+          "name": "ECOMP"
+        },
+        {
+          "id": "zzz1",
+          "name": "zzz1"
+        }
+      ],
+      "platformList": [
+        {
+          "id": "platform",
+          "name": "platform"
+        },
+        {
+          "id": "xxx1",
+          "name": "xxx1"
+        }
+      ]
+    },
+    "type": "[PRODUCT_FAMILIES] Update"
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicService.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/basicService.json
new file mode 100644 (file)
index 0000000..7b4440d
--- /dev/null
@@ -0,0 +1,46 @@
+{
+  "service": {
+    "uuid": "4d71990b-d8ad-4510-ac61-496288d9078e",
+    "invariantUuid": "d27e42cf-087e-4d31-88ac-6c4b7585f800",
+    "name": "vidmacrofalsenaming",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L1-3",
+    "serviceType": "",
+    "serviceRole": "",
+    "description": "vidmacrofalsenaming",
+    "serviceEcompNaming": "false",
+    "instantiationType": "A-La-Carte",
+    "inputs": {}
+  },
+  "vnfs": {},
+  "networks": {
+    "MULTI_PROVIDER_PORT_GROUP 0": {
+      "uuid": "e5d235de-2188-4f9f-a28c-fe38967883f2",
+      "invariantUuid": "b0303003-0abb-454c-9119-8cbe2e09e003",
+      "description": "Creates a neutron multi-provider VLAN network with dummy subnet",
+      "name": "MULTI_PROVIDER_PORT_GROUP",
+      "version": "1.0",
+      "customizationUuid": "0fde4286-ee4c-439d-9556-74b6be6bbc42",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "network_assignments": "{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}",
+        "network_flows": "{is_network_policy=false, is_bound_to_vpn=false}",
+        "network_scope": "GLOBAL",
+        "network_ecomp_naming": "{ecomp_generated_naming=true}",
+        "network_type": "MULTI_PROVIDER_PORT_GROUP",
+        "network_technology": "MULTI_GROUP",
+        "network_homing": "{ecomp_selected_instance_node_target=false}"
+      },
+      "type": "VL",
+      "modelCustomizationName": "MULTI_PROVIDER_PORT_GROUP 0"
+    }
+  },
+  "collectionResource": {},
+  "configurations": {},
+  "serviceProxies": {},
+  "vfModules": {},
+  "volumeGroups": {},
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/categoryParametres.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/categoryParametres.json
new file mode 100644 (file)
index 0000000..93a8bf5
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "categoryParameters": {
+    "lineOfBusiness": [
+      {
+        "id": "ECOMP",
+        "name": "ECOMP"
+      },
+      {
+        "id": "zzz1",
+        "name": "zzz1"
+      }
+    ],
+    "owningEntity": [
+      {
+        "id": "aaa1",
+        "name": "aaa1"
+      },
+      {
+        "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+        "name": "MetroPacketCore"
+      },
+      {
+        "id": "Wireline",
+        "name": "Wireline"
+      }
+    ],
+    "project": [
+      {
+        "id": "DFW",
+        "name": "DFW"
+      },
+      {
+        "id": "x1",
+        "name": "x1"
+      },
+      {
+        "id": "yyy1",
+        "name": "yyy1"
+      }
+    ],
+    "platform": [
+      {
+        "id": "platform",
+        "name": "platform"
+      },
+      {
+        "id": "xxx1",
+        "name": "xxx1"
+      }
+    ]
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/emptyObjectResponse.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/emptyObjectResponse.json
new file mode 100644 (file)
index 0000000..0967ef4
--- /dev/null
@@ -0,0 +1 @@
+{}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/emptyServiceRedux.json
new file mode 100644 (file)
index 0000000..bf54204
--- /dev/null
@@ -0,0 +1,2657 @@
+{
+  "global": {
+    "name": null
+  },
+  "service": {
+    "serviceHierarchy": {
+      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "service": {
+          "uuid": "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+          "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "name": "action-data",
+          "version": "1.0",
+          "toscaModelURL": null,
+          "category": "",
+          "serviceType": "",
+          "serviceRole": "",
+          "description": "",
+          "serviceEcompNaming": "true",
+          "instantiationType": "Macro",
+          "inputs": {
+            "2017488_adiodvpe0_ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            }
+          }
+        },
+        "vnfs": {
+          "2017-388_ADIOD-vPE 1": {
+            "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+            "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-388_ADIOD-vPE",
+            "version": "1.0",
+            "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+            "vfModules": {},
+            "volumeGroups": {},
+            "vfcInstanceGroups": {}
+          },
+          "2017-388_ADIOD-vPE 0": {
+            "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+            "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-388_ADIOD-vPE",
+            "version": "4.0",
+            "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+            "vfModules": {},
+            "volumeGroups": {},
+            "vfcInstanceGroups": {}
+          },
+          "2017-488_ADIOD-vPE 0": {
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+            "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-488_ADIOD-vPE",
+            "version": "5.0",
+            "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  }
+                },
+                "volumeGroupAllowed": true
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "version": "5",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "properties": {
+                  "minCountInstances": 1,
+                  "maxCountInstances": 1,
+                  "initialCount": 1,
+                  "vfModuleLabel": "ADIOD_base_vPE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": false
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": true
+              }
+            },
+            "volumeGroups": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  }
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {}
+              }
+            },
+            "vfcInstanceGroups": {}
+          }
+        },
+        "networks": {},
+        "collectionResource": {},
+        "configurations": {},
+        "serviceProxies": {},
+        "vfModules": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              },
+              "adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              }
+            },
+            "volumeGroupAllowed": true
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+            "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+            "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+            "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "version": "5",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "properties": {
+              "minCountInstances": 1,
+              "maxCountInstances": 1,
+              "initialCount": 1,
+              "vfModuleLabel": "ADIOD_base_vPE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": false
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": true
+          }
+        },
+        "volumeGroups": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              },
+              "adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              }
+            }
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {}
+          }
+        },
+        "pnfs": {}
+      },
+      "f4d84bb4-a416-4b4e-997e-0059973630b9": {
+        "service": {
+          "uuid": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+          "invariantUuid": "598e3f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+          "name": "ADIOD vMX vPE_BV Service 488",
+          "version": "1.0",
+          "toscaModelURL": null,
+          "category": "Network L1-3",
+          "serviceType": "",
+          "serviceRole": "",
+          "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+          "serviceEcompNaming": "true",
+          "instantiationType": "Macro",
+          "inputs": {
+            "2017488_adiodvpe0_ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            }
+          }
+        },
+        "vnfs": {
+          "2017-488_ADIOD-vPE 0": {
+            "uuid": "ea81d6f7-0861-44a7-b7d5-d173b562c350",
+            "invariantUuid": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-488_ADIOD-vPE",
+            "version": "9.0",
+            "customizationUuid": "41516cc6-5098-4b40-a619-f8d5f55fc4d8",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "ROUTER",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "vre172_nova_img",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "multi_stage_design": "false",
+              "nf_naming_code": "me6",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "vpfe172_nova_img",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "ADIOD vPE",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "get_input:2017488_adiodvpe0_availability_zone_0",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "vPE",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "2017488_adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  }
+                },
+                "volumeGroupAllowed": true
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+                "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "properties": {
+                  "minCountInstances": 1,
+                  "maxCountInstances": 1,
+                  "initialCount": 1,
+                  "vfModuleLabel": "ADIOD_base_vPE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": false
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_availability_zone_0": {
+                    "type": "string",
+                    "description": "The Availability Zone to launch the instance.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vPFE_BV",
+                      "paramName": "availability_zone_0"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtpocfo-kvm-az01"
+                  }
+                },
+                "volumeGroupAllowed": true
+              }
+            },
+            "volumeGroups": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "2017488_adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  }
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_availability_zone_0": {
+                    "type": "string",
+                    "description": "The Availability Zone to launch the instance.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vPFE_BV",
+                      "paramName": "availability_zone_0"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtpocfo-kvm-az01"
+                  }
+                }
+              }
+            },
+            "vfcInstanceGroups": {}
+          }
+        },
+        "networks": {},
+        "collectionResource": {},
+        "configurations": {},
+        "serviceProxies": {},
+        "vfModules": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              },
+              "2017488_adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              }
+            },
+            "volumeGroupAllowed": true
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+            "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+            "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+            "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "properties": {
+              "minCountInstances": 1,
+              "maxCountInstances": 1,
+              "initialCount": 1,
+              "vfModuleLabel": "ADIOD_base_vPE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": false
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_availability_zone_0": {
+                "type": "string",
+                "description": "The Availability Zone to launch the instance.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vPFE_BV",
+                  "paramName": "availability_zone_0"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtpocfo-kvm-az01"
+              }
+            },
+            "volumeGroupAllowed": true
+          }
+        },
+        "volumeGroups": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              },
+              "2017488_adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              }
+            }
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_availability_zone_0": {
+                "type": "string",
+                "description": "The Availability Zone to launch the instance.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vPFE_BV",
+                  "paramName": "availability_zone_0"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtpocfo-kvm-az01"
+              }
+            }
+          }
+        },
+        "pnfs": {}
+      }
+    },
+    "serviceInstance": {
+      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "vnfs": {},
+        "instanceParams": [
+          {
+            "2017488_adiodvpe0_ASN": "AV_vPE"
+          }
+        ],
+        "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "subscriptionServiceType": "VIRTUAL USP",
+        "lcpCloudRegionId": "AAIAIC25",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+        "aicZoneId": "JAG1",
+        "projectName": "DFW",
+        "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+        "bulkSize": 1,
+        "modelInfo": {
+          "modelType": "service",
+          "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "modelVersionId": "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+          "modelName": "action-data",
+          "modelVersion": "1.0"
+        },
+        "isUserProvidedNaming": false,
+        "tenantName": "USP-SIP-IC-24335-T-01",
+        "aicZoneName": "YUDFJULP-JAG1"
+      }
+    },
+    "lcpRegionsAndTenants": {
+      "lcpRegionList": [
+        {
+          "id": "AAIAIC25",
+          "name": "AAIAIC25",
+          "isPermitted": true
+        },
+        {
+          "id": "mtn6",
+          "name": "mtn6",
+          "isPermitted": true
+        }
+      ],
+      "lcpRegionsTenantsMap": {
+        "AAIAIC25": [
+          {
+            "id": "092eb9e8e4b7412e8787dd091bc58e86",
+            "name": "USP-SIP-IC-24335-T-01",
+            "isPermitted": true
+          }
+        ],
+        "mtn6": [
+          {
+            "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+            "name": "AIN Web Tool-15-D-testgamma",
+            "isPermitted": true
+          },
+          {
+            "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "name": "AIN Web Tool-15-D-STTest2",
+            "isPermitted": true
+          },
+          {
+            "id": "1178612d2b394be4834ad77f567c0af2",
+            "name": "AIN Web Tool-15-D-SSPtestcustome",
+            "isPermitted": true
+          },
+          {
+            "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+            "name": "AIN Web Tool-15-D-UncheckedEcopm",
+            "isPermitted": true
+          },
+          {
+            "id": "de007636e25249238447264a988a927b",
+            "name": "AIN Web Tool-15-D-dfsdf",
+            "isPermitted": true
+          },
+          {
+            "id": "62f29b3613634ca6a3065cbe0e020c44",
+            "name": "AIN/SMS-16-D-Multiservices1",
+            "isPermitted": true
+          },
+          {
+            "id": "649289e30d3244e0b48098114d63c2aa",
+            "name": "AIN Web Tool-15-D-SSPST66",
+            "isPermitted": true
+          },
+          {
+            "id": "3f21eeea6c2c486bba31dab816c05a32",
+            "name": "AIN Web Tool-15-D-ASSPST47",
+            "isPermitted": true
+          },
+          {
+            "id": "f60ce21d3ee6427586cff0d22b03b773",
+            "name": "CESAR-100-D-sspjg67246",
+            "isPermitted": true
+          },
+          {
+            "id": "8774659e425f479895ae091bb5d46560",
+            "name": "CESAR-100-D-sspjg68359",
+            "isPermitted": true
+          },
+          {
+            "id": "624eb554b0d147c19ff8885341760481",
+            "name": "AINWebTool-15-D-iftach",
+            "isPermitted": true
+          },
+          {
+            "id": "214f55f5fc414c678059c383b03e4962",
+            "name": "CESAR-100-D-sspjg612401",
+            "isPermitted": true
+          },
+          {
+            "id": "c90666c291664841bb98e4d981ff1db5",
+            "name": "CESAR-100-D-sspjg621340",
+            "isPermitted": true
+          },
+          {
+            "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+            "name": "sspjg621351cloned",
+            "isPermitted": true
+          },
+          {
+            "id": "b386b768a3f24c8e953abbe0b3488c02",
+            "name": "AINWebTool-15-D-eteancomp",
+            "isPermitted": true
+          },
+          {
+            "id": "dc6c4dbfd225474e9deaadd34968646c",
+            "name": "AINWebTool-15-T-SPFET",
+            "isPermitted": true
+          },
+          {
+            "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+            "name": "AINWebTool-15-X-eeweww",
+            "isPermitted": true
+          },
+          {
+            "id": "f2f3830e4c984d45bcd00e1a04158a79",
+            "name": "CESAR-100-D-spjg61909",
+            "isPermitted": true
+          },
+          {
+            "id": "05b91bd5137f4929878edd965755c06d",
+            "name": "CESAR-100-D-sspjg621512cloned",
+            "isPermitted": true
+          },
+          {
+            "id": "7002fbe8482d4a989ddf445b1ce336e0",
+            "name": "AINWebTool-15-X-vdr",
+            "isPermitted": true
+          },
+          {
+            "id": "4008522be43741dcb1f5422022a2aa0b",
+            "name": "AINWebTool-15-D-ssasa",
+            "isPermitted": true
+          },
+          {
+            "id": "f44e2e96a1b6476abfda2fa407b00169",
+            "name": "AINWebTool-15-D-PFNPT",
+            "isPermitted": true
+          },
+          {
+            "id": "b69a52bec8a84669a37a1e8b72708be7",
+            "name": "AINWebTool-15-X-vdre",
+            "isPermitted": true
+          },
+          {
+            "id": "fac7d9fd56154caeb9332202dcf2969f",
+            "name": "AINWebTool-15-X-NONPODECOMP",
+            "isPermitted": true
+          },
+          {
+            "id": "2d34d8396e194eb49969fd61ffbff961",
+            "name": "DN5242-Nov16-T5",
+            "isPermitted": true
+          },
+          {
+            "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+            "name": "ro-T11",
+            "isPermitted": true
+          },
+          {
+            "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+            "name": "ro-T112",
+            "isPermitted": true
+          },
+          {
+            "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+            "name": "DN5242-Nov21-T1",
+            "isPermitted": true
+          },
+          {
+            "id": "d0a3e3f2964542259d155a81c41aadc3",
+            "name": "test-mtn6-09",
+            "isPermitted": true
+          },
+          {
+            "id": "cbb99fe4ada84631b7baf046b6fd2044",
+            "name": "DN5242-Nov16-T3",
+            "isPermitted": true
+          }
+        ]
+      }
+    },
+    "subscribers": [
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Mobility",
+        "isPermitted": false
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
+        "name": "PACKET CORE",
+        "isPermitted": false
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "USP VOICE",
+        "isPermitted": true
+      }
+    ],
+    "productFamilies": [
+      {
+        "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "name": "DHV",
+        "isPermitted": true
+      },
+      {
+        "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+        "name": "FLEXREACH",
+        "isPermitted": true
+      },
+      {
+        "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+        "name": "Netbond",
+        "isPermitted": true
+      },
+      {
+        "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+        "name": "Enhanced Services",
+        "isPermitted": true
+      },
+      {
+        "id": "vRRaaS",
+        "name": "vRRaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+        "name": "vSCP",
+        "isPermitted": true
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Mobility",
+        "isPermitted": true
+      },
+      {
+        "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "name": "BVOIP",
+        "isPermitted": true
+      },
+      {
+        "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+        "name": "FIRSTNET",
+        "isPermitted": true
+      },
+      {
+        "id": "LRSI-OSPF",
+        "name": "LRSI-OSPF",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNGWaas",
+        "name": "HNGATEWAY",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNPaas",
+        "name": "HNPORTAL",
+        "isPermitted": true
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "VIRTUAL USP",
+        "isPermitted": true
+      },
+      {
+        "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+        "name": "VROUTER",
+        "isPermitted": true
+      },
+      {
+        "id": "VIPRaaS",
+        "name": "vIPRaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+        "name": "WAN Bonding",
+        "isPermitted": true
+      },
+      {
+        "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+        "name": "HOSTED COMMUNICATIONS",
+        "isPermitted": true
+      },
+      {
+        "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+        "name": "Transport",
+        "isPermitted": true
+      },
+      {
+        "id": "vVIGaaS",
+        "name": "vVIGaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+        "name": "uCPE-VMS",
+        "isPermitted": true
+      },
+      {
+        "id": "vPEaaS",
+        "name": "vPEaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+        "name": "HOSTED COMMUNICATIONS",
+        "isPermitted": true
+      }
+    ],
+    "serviceTypes": {
+      "e433710f-9217-458d-a79d-1c7aff376d89": [
+        {
+          "id": "0",
+          "name": "vFlowLogic",
+          "isPermitted": false
+        },
+        {
+          "id": "1",
+          "name": "VIRTUAL USP",
+          "isPermitted": true
+        },
+        {
+          "id": "2",
+          "name": "Mobility",
+          "isPermitted": false
+        },
+        {
+          "id": "3",
+          "name": "vBNG",
+          "isPermitted": false
+        },
+        {
+          "id": "4",
+          "name": "vVoiceMail",
+          "isPermitted": false
+        },
+        {
+          "id": "5",
+          "name": "Nimbus",
+          "isPermitted": false
+        },
+        {
+          "id": "6",
+          "name": "vSEGW",
+          "isPermitted": false
+        },
+        {
+          "id": "7",
+          "name": "vVM",
+          "isPermitted": false
+        },
+        {
+          "id": "8",
+          "name": "vOTA",
+          "isPermitted": false
+        },
+        {
+          "id": "9",
+          "name": "vMME",
+          "isPermitted": false
+        },
+        {
+          "id": "10",
+          "name": "vMNS",
+          "isPermitted": false
+        },
+        {
+          "id": "11",
+          "name": "vSCP",
+          "isPermitted": false
+        },
+        {
+          "id": "12",
+          "name": "VPMS",
+          "isPermitted": false
+        },
+        {
+          "id": "13",
+          "name": "vMMSC",
+          "isPermitted": false
+        },
+        {
+          "id": "14",
+          "name": "SSD",
+          "isPermitted": false
+        },
+        {
+          "id": "15",
+          "name": "vMOG",
+          "isPermitted": false
+        },
+        {
+          "id": "16",
+          "name": "FIRSTNET",
+          "isPermitted": false
+        },
+        {
+          "id": "17",
+          "name": "ACTIVE_CHARGE",
+          "isPermitted": false
+        },
+        {
+          "id": "18",
+          "name": "vHSS",
+          "isPermitted": false
+        }
+      ]
+    },
+    "aicZones": [
+      {
+        "id": "NFT1",
+        "name": "NFTJSSSS-NFT1"
+      },
+      {
+        "id": "JAG1",
+        "name": "YUDFJULP-JAG1"
+      },
+      {
+        "id": "YYY1",
+        "name": "UUUAIAAI-YYY1"
+      },
+      {
+        "id": "BAN1",
+        "name": "VSDKYUTP-BAN1"
+      },
+      {
+        "id": "DKJ1",
+        "name": "DKJSJDKA-DKJ1"
+      },
+      {
+        "id": "MCS1",
+        "name": "ASACMAMS-MCS1"
+      },
+      {
+        "id": "UIO1",
+        "name": "uioclli1-UIO1"
+      },
+      {
+        "id": "RAJ1",
+        "name": "YGBIJNLQ-RAJ1"
+      },
+      {
+        "id": "OPA1",
+        "name": "opaclli1-OPA1"
+      },
+      {
+        "id": "SDE1",
+        "name": "ZXCVBNMA-SDE1"
+      },
+      {
+        "id": "VEN2",
+        "name": "FGHJUHIL-VEN2"
+      },
+      {
+        "id": "ORL1",
+        "name": "ORLDFLMA-ORL1"
+      },
+      {
+        "id": "JAD1",
+        "name": "JADECLLI-JAD1"
+      },
+      {
+        "id": "ZXL1",
+        "name": "LWLWCANN-ZXL1"
+      },
+      {
+        "id": "CKL1",
+        "name": "CLKSKCKK-CKL1"
+      },
+      {
+        "id": "SDF1",
+        "name": "sdfclli1-SDF1"
+      },
+      {
+        "id": "RAD1",
+        "name": "RADICAL1-RAD1"
+      },
+      {
+        "id": "KIT1",
+        "name": "BHYJFGLN-KIT1"
+      },
+      {
+        "id": "REL1",
+        "name": "INGERFGT-REL1"
+      },
+      {
+        "id": "JNL1",
+        "name": "CJALSDAC-JNL1"
+      },
+      {
+        "id": "OLK1",
+        "name": "OLKOLKLS-OLK1"
+      },
+      {
+        "id": "CHI1",
+        "name": "CHILLIWE-CHI1"
+      },
+      {
+        "id": "UUU4",
+        "name": "UUUAAAUU-UUU4"
+      },
+      {
+        "id": "TUF1",
+        "name": "TUFCLLI1-TUF1"
+      },
+      {
+        "id": "KJN1",
+        "name": "CKALDKSA-KJN1"
+      },
+      {
+        "id": "SAM1",
+        "name": "SNDGCA64-SAN1"
+      },
+      {
+        "id": "SCK1",
+        "name": "SCKSCKSK-SCK1"
+      },
+      {
+        "id": "HJH1",
+        "name": "AOEEQQQD-HJH1"
+      },
+      {
+        "id": "HGD1",
+        "name": "SDFQWHGD-HGD1"
+      },
+      {
+        "id": "KOR1",
+        "name": "HYFLNBVT-KOR1"
+      },
+      {
+        "id": "ATL43",
+        "name": "AICLOCID-ATL43"
+      },
+      {
+        "id": "ATL54",
+        "name": "AICFTAAI-ATL54"
+      },
+      {
+        "id": "ATL66",
+        "name": "CLLIAAII-ATL66"
+      },
+      {
+        "id": "VEL1",
+        "name": "BNMLKUIK-VEL1"
+      },
+      {
+        "id": "ICC1",
+        "name": "SANJITAT-ICC1"
+      },
+      {
+        "id": "MNT11",
+        "name": "WSXEFBTH-MNT11"
+      },
+      {
+        "id": "DEF2",
+        "name": "WSBHGTYL-DEF2"
+      },
+      {
+        "id": "MAD11",
+        "name": "SDFQWGKL-MAD11"
+      },
+      {
+        "id": "OLG1",
+        "name": "OLHOLHOL-OLG1"
+      },
+      {
+        "id": "GAR1",
+        "name": "NGFVSJKO-GAR1"
+      },
+      {
+        "id": "SAN22",
+        "name": "GNVLSCTL-SAN22"
+      },
+      {
+        "id": "HRG1",
+        "name": "HRGHRGGS-HRG1"
+      },
+      {
+        "id": "JCS1",
+        "name": "JCSJSCJS-JCS1"
+      },
+      {
+        "id": "DHA12",
+        "name": "WSXEDECF-DHA12"
+      },
+      {
+        "id": "HJE1",
+        "name": "AOEEWWWD-HJE1"
+      },
+      {
+        "id": "NCA1",
+        "name": "NCANCANN-NCA1"
+      },
+      {
+        "id": "IOP1",
+        "name": "iopclli1-IOP1"
+      },
+      {
+        "id": "RTY1",
+        "name": "rtyclli1-RTY1"
+      },
+      {
+        "id": "KAP1",
+        "name": "HIOUYTRQ-KAP1"
+      },
+      {
+        "id": "ZEN1",
+        "name": "ZENCLLI1-ZEN1"
+      },
+      {
+        "id": "HKA1",
+        "name": "JAKHLASS-HKA1"
+      },
+      {
+        "id": "CQK1",
+        "name": "CQKSCAKK-CQK1"
+      },
+      {
+        "id": "SAI1",
+        "name": "UBEKQLPD-SAI1"
+      },
+      {
+        "id": "ERT1",
+        "name": "ertclli1-ERT1"
+      },
+      {
+        "id": "IBB1",
+        "name": "PLMKOIJU-IBB1"
+      },
+      {
+        "id": "TIR2",
+        "name": "PLKINHYI-TIR2"
+      },
+      {
+        "id": "HSD1",
+        "name": "CHASKCDS-HSD1"
+      },
+      {
+        "id": "SLF78",
+        "name": "SDCTLFN1-SLF78"
+      },
+      {
+        "id": "SEE78",
+        "name": "SDCTEEE4-SEE78"
+      },
+      {
+        "id": "SAN13",
+        "name": "TOKYJPFA-SAN13"
+      },
+      {
+        "id": "SAA78",
+        "name": "SDCTAAA1-SAA78"
+      },
+      {
+        "id": "LUC1",
+        "name": "ATLDFGYC-LUC1"
+      },
+      {
+        "id": "AMD13",
+        "name": "MEMATLAN-AMD13"
+      },
+      {
+        "id": "TOR1",
+        "name": "TOROONXN-TOR1"
+      },
+      {
+        "id": "QWE1",
+        "name": "QWECLLI1-QWE1"
+      },
+      {
+        "id": "ZOG1",
+        "name": "ZOGASTRO-ZOG1"
+      },
+      {
+        "id": "CAL33",
+        "name": "CALIFORN-CAL33"
+      },
+      {
+        "id": "SHH78",
+        "name": "SDIT1HHH-SHH78"
+      },
+      {
+        "id": "DSA1",
+        "name": "LKJHGFDS-DSA1"
+      },
+      {
+        "id": "CLG1",
+        "name": "CLGRABAD-CLG1"
+      },
+      {
+        "id": "BNA1",
+        "name": "BNARAGBK-BNA1"
+      },
+      {
+        "id": "ATL84",
+        "name": "CANTTCOC-ATL84"
+      },
+      {
+        "id": "APP1",
+        "name": "WBHGTYUI-APP1"
+      },
+      {
+        "id": "RJN1",
+        "name": "RJNRBZAW-RJN1"
+      },
+      {
+        "id": "EHH78",
+        "name": "SDCSHHH5-EHH78"
+      },
+      {
+        "id": "mac10",
+        "name": "PKGTESTF-mac10"
+      },
+      {
+        "id": "SXB78",
+        "name": "SDCTGXB1-SXB78"
+      },
+      {
+        "id": "SAX78",
+        "name": "SDCTAXG1-SAX78"
+      },
+      {
+        "id": "SYD1",
+        "name": "SYDNAUBV-SYD1"
+      },
+      {
+        "id": "TOK1",
+        "name": "TOKYJPFA-TOK1"
+      },
+      {
+        "id": "KGM2",
+        "name": "KGMTNC20-KGM2"
+      },
+      {
+        "id": "DCC1b",
+        "name": "POIUYTGH-DCC1b"
+      },
+      {
+        "id": "SKK78",
+        "name": "SDCTKKK1-SKK78"
+      },
+      {
+        "id": "SGG78",
+        "name": "SDCTGGG1-SGG78"
+      },
+      {
+        "id": "SJJ78",
+        "name": "SDCTJJJ1-SJJ78"
+      },
+      {
+        "id": "SBX78",
+        "name": "SDCTBXG1-SBX78"
+      },
+      {
+        "id": "LAG1",
+        "name": "LARGIZON-LAG1"
+      },
+      {
+        "id": "IAA1",
+        "name": "QAZXSWED-IAA1"
+      },
+      {
+        "id": "POI1",
+        "name": "PLMNJKIU-POI1"
+      },
+      {
+        "id": "LAG1a",
+        "name": "LARGIZON-LAG1a"
+      },
+      {
+        "id": "PBL1",
+        "name": "PBLAPBAI-PBL1"
+      },
+      {
+        "id": "LAG45",
+        "name": "LARGIZON-LAG1a"
+      },
+      {
+        "id": "MAR1",
+        "name": "MNBVCXZM-MAR1"
+      },
+      {
+        "id": "HST70",
+        "name": "HSTNTX70-HST70"
+      },
+      {
+        "id": "DCC1a",
+        "name": "POIUYTGH-DCC1a"
+      },
+      {
+        "id": "TOL1",
+        "name": "TOLDOH21-TOL1"
+      },
+      {
+        "id": "LON1",
+        "name": "LONEENCO-LON1"
+      },
+      {
+        "id": "SJU78",
+        "name": "SDIT1JUB-SJU78"
+      },
+      {
+        "id": "STN27",
+        "name": "HSTNTX01-STN27"
+      },
+      {
+        "id": "SSW56",
+        "name": "ss8126GT-SSW56"
+      },
+      {
+        "id": "SBB78",
+        "name": "SDIT1BBB-SBB78"
+      },
+      {
+        "id": "DCC3",
+        "name": "POIUYTGH-DCC3"
+      },
+      {
+        "id": "GNV1",
+        "name": "GNVLSCTL-GNV1"
+      },
+      {
+        "id": "WAS1",
+        "name": "WASHDCSW-WAS1"
+      },
+      {
+        "id": "TOY1",
+        "name": "TORYONNZ-TOY1"
+      },
+      {
+        "id": "STT1",
+        "name": "STTLWA02-STT1"
+      },
+      {
+        "id": "STG1",
+        "name": "STTGGE62-STG1"
+      },
+      {
+        "id": "SLL78",
+        "name": "SDCTLLL1-SLL78"
+      },
+      {
+        "id": "SBU78",
+        "name": "SDIT1BUB-SBU78"
+      },
+      {
+        "id": "ATL2",
+        "name": "ATLNGANW-ATL2"
+      },
+      {
+        "id": "BOT1",
+        "name": "BOTHWAKY-BOT1"
+      },
+      {
+        "id": "SNG1",
+        "name": "SNGPSIAU-SNG1"
+      },
+      {
+        "id": "NYC1",
+        "name": "NYCMNY54-NYC1"
+      },
+      {
+        "id": "LAG1b",
+        "name": "LARGIZON-LAG1b"
+      },
+      {
+        "id": "AMD15",
+        "name": "AMDFAA01-AMD15"
+      },
+      {
+        "id": "SNA1",
+        "name": "SNANTXCA-SNA1"
+      },
+      {
+        "id": "PLT1",
+        "name": "PLTNCA60-PLT1"
+      },
+      {
+        "id": "TLP1",
+        "name": "TLPNXM18-TLP1"
+      },
+      {
+        "id": "SDD81",
+        "name": "SAIT1DD6-SDD81"
+      },
+      {
+        "id": "DCC1",
+        "name": "POIUYTGH-DCC1"
+      },
+      {
+        "id": "DCC2",
+        "name": "POIUYTGH-DCC2"
+      },
+      {
+        "id": "OKC1",
+        "name": "OKCBOK55-OKC1"
+      },
+      {
+        "id": "PAR1",
+        "name": "PARSFRCG-PAR1"
+      },
+      {
+        "id": "TES36",
+        "name": "ABCEETES-TES36"
+      },
+      {
+        "id": "COM1",
+        "name": "PLMKOPIU-COM1"
+      },
+      {
+        "id": "ANI1",
+        "name": "ATLNGTRE-ANI1"
+      },
+      {
+        "id": "SDG78",
+        "name": "SDIT1BDG-SDG78"
+      },
+      {
+        "id": "mac20",
+        "name": "PKGTESTF-mac20"
+      },
+      {
+        "id": "DSF45",
+        "name": "DSFBG123-DSF45"
+      },
+      {
+        "id": "HST25",
+        "name": "HSTNTX01-HST25"
+      },
+      {
+        "id": "AMD18",
+        "name": "AUDIMA01-AMD18"
+      },
+      {
+        "id": "SAA80",
+        "name": "SAIT9AA3-SAA80"
+      },
+      {
+        "id": "SSA56",
+        "name": "SSIT2AA7-SSA56"
+      },
+      {
+        "id": "SDD82",
+        "name": "SAIT1DD9-SDD82"
+      },
+      {
+        "id": "JCV1",
+        "name": "JCVLFLBW-JCV1"
+      },
+      {
+        "id": "SUL2",
+        "name": "WERTYUJK-SUL2"
+      },
+      {
+        "id": "PUR1",
+        "name": "purelyde-PUR1"
+      },
+      {
+        "id": "FDE55",
+        "name": "FDERT555-FDE55"
+      },
+      {
+        "id": "SITE",
+        "name": "LONEENCO-SITE"
+      },
+      {
+        "id": "ATL1",
+        "name": "ATLNGAMA-ATL1"
+      },
+      {
+        "id": "JUL1",
+        "name": "ZXCVBNMM-JUL1"
+      },
+      {
+        "id": "TAT34",
+        "name": "TESAAISB-TAT34"
+      },
+      {
+        "id": "XCP12",
+        "name": "CHKGH123-XCP12"
+      },
+      {
+        "id": "RAI1",
+        "name": "poiuytre-RAI1"
+      },
+      {
+        "id": "HPO1",
+        "name": "ATLNGAUP-HPO1"
+      },
+      {
+        "id": "KJF12",
+        "name": "KJFDH123-KJF12"
+      },
+      {
+        "id": "SCC80",
+        "name": "SAIT9CC3-SCC80"
+      },
+      {
+        "id": "SAA12",
+        "name": "SAIT9AF8-SAA12"
+      },
+      {
+        "id": "SAA14",
+        "name": "SAIT1AA9-SAA14"
+      },
+      {
+        "id": "ATL35",
+        "name": "TTESSAAI-ATL35"
+      },
+      {
+        "id": "CWY1",
+        "name": "CWYMOWBS-CWY1"
+      },
+      {
+        "id": "ATL76",
+        "name": "TELEPAAI-ATL76"
+      },
+      {
+        "id": "DSL12",
+        "name": "DSLFK242-DSL12"
+      },
+      {
+        "id": "ATL53",
+        "name": "AAIATLTE-ATL53"
+      },
+      {
+        "id": "SAA11",
+        "name": "SAIT9AA2-SAA11"
+      },
+      {
+        "id": "ATL62",
+        "name": "TESSASCH-ATL62"
+      },
+      {
+        "id": "AUG1",
+        "name": "ASDFGHJK-AUG1"
+      },
+      {
+        "id": "POI22",
+        "name": "POIUY123-POI22"
+      },
+      {
+        "id": "SAA13",
+        "name": "SAIT1AA9-SAA13"
+      },
+      {
+        "id": "BHY17",
+        "name": "BHYTFRF3-BHY17"
+      },
+      {
+        "id": "LIS1",
+        "name": "HOSTPROF-LIS1"
+      },
+      {
+        "id": "SIP1",
+        "name": "ZXCVBNMK-SIP1"
+      },
+      {
+        "id": "ATL99",
+        "name": "TEESTAAI-ATL43"
+      },
+      {
+        "id": "ATL64",
+        "name": "FORLOAAJ-ATL64"
+      },
+      {
+        "id": "TAT33",
+        "name": "TESAAISA-TAT33"
+      },
+      {
+        "id": "RAD10",
+        "name": "INDIPUNE-RAD10"
+      },
+      {
+        "id": "RTW5",
+        "name": "BHYTFRY4-RTW5"
+      },
+      {
+        "id": "JGS1",
+        "name": "KSJKKKKK-JGS1"
+      },
+      {
+        "id": "ATL98",
+        "name": "TEESTAAI-ATL43"
+      },
+      {
+        "id": "WAN1",
+        "name": "LEIWANGW-WAN1"
+      },
+      {
+        "id": "ATL44",
+        "name": "ATLSANAB-ATL44"
+      },
+      {
+        "id": "RTD2",
+        "name": "BHYTFRk4-RTD2"
+      },
+      {
+        "id": "NIR1",
+        "name": "ORFLMANA-NIR1"
+      },
+      {
+        "id": "ATL75",
+        "name": "SANAAIRE-ATL75"
+      },
+      {
+        "id": "NUM1",
+        "name": "QWERTYUI-NUM1"
+      },
+      {
+        "id": "MTN32",
+        "name": "MDTWNJ21-MTN32"
+      },
+      {
+        "id": "RTZ4",
+        "name": "BHYTFRZ6-RTZ4"
+      },
+      {
+        "id": "ATL56",
+        "name": "ATLSANAC-ATL56"
+      },
+      {
+        "id": "AMS1",
+        "name": "AMSTNLBW-AMS1"
+      },
+      {
+        "id": "RCT1",
+        "name": "AMSTERNL-RCT1"
+      },
+      {
+        "id": "JAN1",
+        "name": "ORFLMATT-JAN1"
+      },
+      {
+        "id": "ABC14",
+        "name": "TESAAISA-ABC14"
+      },
+      {
+        "id": "TAT37",
+        "name": "TESAAISD-TAT37"
+      },
+      {
+        "id": "MIC54",
+        "name": "MICHIGAN-MIC54"
+      },
+      {
+        "id": "ABC11",
+        "name": "ATLSANAI-ABC11"
+      },
+      {
+        "id": "AMF11",
+        "name": "AMDOCS01-AMF11"
+      },
+      {
+        "id": "ATL63",
+        "name": "ATLSANEW-ATL63"
+      },
+      {
+        "id": "ABC12",
+        "name": "ATLSECIA-ABC12"
+      },
+      {
+        "id": "MTN20",
+        "name": "MDTWNJ21-MTN20"
+      },
+      {
+        "id": "ABC15",
+        "name": "AAITESAN-ABC15"
+      },
+      {
+        "id": "AVT1",
+        "name": "AVTRFLHD-AVT1"
+      },
+      {
+        "id": "ATL34",
+        "name": "ATLSANAI-ATL34"
+      }
+    ],
+    "categoryParameters": {
+      "owningEntityList": [
+        {
+          "id": "aaa1",
+          "name": "aaa1"
+        },
+        {
+          "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+          "name": "MetroPacketCore"
+        },
+        {
+          "id": "Wireline",
+          "name": "Wireline"
+        }
+      ],
+      "projectList": [
+        {
+          "id": "DFW",
+          "name": "DFW"
+        },
+        {
+          "id": "x1",
+          "name": "x1"
+        },
+        {
+          "id": "yyy1",
+          "name": "yyy1"
+        }
+      ],
+      "lineOfBusinessList": [
+        {
+          "id": "ECOMP",
+          "name": "ECOMP"
+        },
+        {
+          "id": "zzz1",
+          "name": "zzz1"
+        }
+      ],
+      "platformList": [
+        {
+          "id": "platform",
+          "name": "platform"
+        },
+        {
+          "id": "xxx1",
+          "name": "xxx1"
+        }
+      ]
+    },
+    "type": "[PRODUCT_FAMILIES] Update"
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/flags.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/flags.json
new file mode 100644 (file)
index 0000000..a2e1543
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "FLAG_ADVANCED_PORTS_FILTER": true,
+  "CREATE_INSTANCE_TEST": false,
+  "EMPTY_DRAWING_BOARD_TEST": false,
+  "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": true,
+  "FLAG_REGION_ID_FROM_REMOTE": true,
+  "FLAG_ASYNC_INSTANTIATION": true,
+  "FLAG_ASYNC_JOBS": true,
+  "FLAG_ADD_MSO_TESTAPI_FIELD": true,
+  "FLAG_UNASSIGN_SERVICE": false,
+  "FLAG_SERVICE_MODEL_CACHE": false,
+  "FLAG_COLLECTION_RESOURCE_SUPPORT": true,
+  "FLAG_SHOW_ASSIGNMENTS": true
+
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/service.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/service.json
new file mode 100644 (file)
index 0000000..3da9015
--- /dev/null
@@ -0,0 +1,495 @@
+{
+  "service": {
+    "uuid": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+    "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+    "name": "action-data",
+    "version": "1.0",
+    "toscaModelURL": null,
+    "category": "Network L1-3",
+    "serviceType": "pnf",
+    "serviceRole": "Testing",
+    "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+    "serviceEcompNaming": "false",
+    "instantiationType": "Macro",
+    "inputs": {}
+  },
+  "vnfs": {
+    "2017-388_ADIOD-vPE 1": {
+      "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+      "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+      "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+      "name": "2017-388_ADIOD-vPE",
+      "version": "1.0",
+      "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "vmxvre_retype": "RE-VMX",
+        "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+        "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+        "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+        "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+        "int_ctl_net_name": "VMX-INTXI",
+        "vmx_int_ctl_prefix": "128.0.0.0",
+        "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+        "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+        "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+        "nf_type": "vPE",
+        "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+        "is_AVPN_service": "false",
+        "vmx_RSG_name": "vREXI-affinity",
+        "vmx_int_ctl_forwarding": "l2",
+        "vmxvre_oam_ip_0": "10.40.123.5",
+        "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+        "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+        "vmxvre_instance": "0",
+        "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvre_flavor_name": "ns.c1r16d32.v5",
+        "vmxvpfe_volume_size_0": "40.0",
+        "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+        "nf_naming": "{ecomp_generated_naming=true}",
+        "nf_naming_code": "Navneet",
+        "vmxvre_name_0": "vREXI",
+        "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+        "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+        "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+        "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+        "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+        "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+        "vmxvre_console": "vidconsole",
+        "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+        "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+        "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+        "vf_module_id": "123",
+        "nf_function": "JAI",
+        "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+        "vmxvre_int_ctl_ip_0": "128.0.0.1",
+        "ecomp_generated_naming": "true",
+        "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+        "vnf_name": "mtnj309me6vre",
+        "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+        "vmxvre_volume_type_1": "HITACHI",
+        "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+        "vmxvre_volume_type_0": "HITACHI",
+        "vmxvpfe_volume_type_0": "HITACHI",
+        "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+        "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+        "vnf_id": "123",
+        "vmxvre_oam_prefix": "24",
+        "availability_zone_0": "mtpocfo-kvm-az01",
+        "ASN": "get_input:2017488_adiodvpe0_ASN",
+        "vmxvre_chassis_i2cid": "161",
+        "vmxvpfe_name_0": "vPFEXI",
+        "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+        "availability_zone_max_count": "1",
+        "vmxvre_volume_size_0": "45.0",
+        "vmxvre_volume_size_1": "50.0",
+        "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+        "vmxvre_oam_gateway": "10.40.123.1",
+        "vmxvre_volume_name_1": "vREXI_FAVolume",
+        "vmxvre_ore_present": "0",
+        "vmxvre_volume_name_0": "vREXI_FBVolume",
+        "vmxvre_type": "0",
+        "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+        "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+        "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+        "vmx_int_ctl_len": "24",
+        "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+        "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+        "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+        "nf_role": "Testing",
+        "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+        "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+        "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+      },
+      "type": "VF",
+      "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+      "vfModules": {},
+      "volumeGroups": {},
+      "vfcInstanceGroups": {}
+    },
+    "2017-388_ADIOD-vPE 0": {
+      "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+      "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+      "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+      "name": "2017-388_ADIOD-vPE",
+      "version": "4.0",
+      "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "vmxvre_retype": "RE-VMX",
+        "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+        "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+        "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+        "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+        "int_ctl_net_name": "VMX-INTXI",
+        "vmx_int_ctl_prefix": "128.0.0.0",
+        "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+        "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+        "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+        "nf_type": "vPE",
+        "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+        "is_AVPN_service": "false",
+        "vmx_RSG_name": "vREXI-affinity",
+        "vmx_int_ctl_forwarding": "l2",
+        "vmxvre_oam_ip_0": "10.40.123.5",
+        "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+        "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+        "vmxvre_instance": "0",
+        "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvre_flavor_name": "ns.c1r16d32.v5",
+        "vmxvpfe_volume_size_0": "40.0",
+        "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+        "nf_naming": "{ecomp_generated_naming=true}",
+        "nf_naming_code": "Navneet",
+        "vmxvre_name_0": "vREXI",
+        "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+        "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+        "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+        "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+        "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+        "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+        "vmxvre_console": "vidconsole",
+        "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+        "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+        "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+        "vf_module_id": "123",
+        "nf_function": "JAI",
+        "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+        "vmxvre_int_ctl_ip_0": "128.0.0.1",
+        "ecomp_generated_naming": "true",
+        "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+        "vnf_name": "mtnj309me6vre",
+        "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+        "vmxvre_volume_type_1": "HITACHI",
+        "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+        "vmxvre_volume_type_0": "HITACHI",
+        "vmxvpfe_volume_type_0": "HITACHI",
+        "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+        "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+        "vnf_id": "123",
+        "vmxvre_oam_prefix": "24",
+        "availability_zone_0": "mtpocfo-kvm-az01",
+        "ASN": "get_input:2017488_adiodvpe0_ASN",
+        "vmxvre_chassis_i2cid": "161",
+        "vmxvpfe_name_0": "vPFEXI",
+        "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+        "availability_zone_max_count": "1",
+        "vmxvre_volume_size_0": "45.0",
+        "vmxvre_volume_size_1": "50.0",
+        "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+        "vmxvre_oam_gateway": "10.40.123.1",
+        "vmxvre_volume_name_1": "vREXI_FAVolume",
+        "vmxvre_ore_present": "0",
+        "vmxvre_volume_name_0": "vREXI_FBVolume",
+        "vmxvre_type": "0",
+        "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+        "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+        "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+        "vmx_int_ctl_len": "24",
+        "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+        "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+        "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+        "nf_role": "Testing",
+        "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+        "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+        "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+      },
+      "type": "VF",
+      "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+      "vfModules": {},
+      "volumeGroups": {},
+      "vfcInstanceGroups": {}
+    },
+    "2017-488_ADIOD-vPE 0": {
+      "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+      "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+      "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+      "name": "2017-488_ADIOD-vPE",
+      "version": "5.0",
+      "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+      "inputs": {},
+      "commands": {},
+      "properties": {
+        "vmxvre_retype": "RE-VMX",
+        "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+        "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+        "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+        "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+        "int_ctl_net_name": "VMX-INTXI",
+        "vmx_int_ctl_prefix": "128.0.0.0",
+        "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+        "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+        "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+        "nf_type": "vPE",
+        "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+        "is_AVPN_service": "false",
+        "vmx_RSG_name": "vREXI-affinity",
+        "vmx_int_ctl_forwarding": "l2",
+        "vmxvre_oam_ip_0": "10.40.123.5",
+        "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+        "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+        "vmxvre_instance": "0",
+        "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvre_flavor_name": "ns.c1r16d32.v5",
+        "vmxvpfe_volume_size_0": "40.0",
+        "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+        "nf_naming": "{ecomp_generated_naming=true}",
+        "nf_naming_code": "Navneet",
+        "vmxvre_name_0": "vREXI",
+        "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+        "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+        "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+        "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+        "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+        "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+        "vmxvre_console": "vidconsole",
+        "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+        "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+        "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+        "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+        "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+        "vf_module_id": "123",
+        "nf_function": "JAI",
+        "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+        "vmxvre_int_ctl_ip_0": "128.0.0.1",
+        "ecomp_generated_naming": "true",
+        "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+        "vnf_name": "mtnj309me6vre",
+        "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+        "vmxvre_volume_type_1": "HITACHI",
+        "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+        "vmxvre_volume_type_0": "HITACHI",
+        "vmxvpfe_volume_type_0": "HITACHI",
+        "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+        "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+        "vnf_id": "123",
+        "vmxvre_oam_prefix": "24",
+        "availability_zone_0": "mtpocfo-kvm-az01",
+        "ASN": "get_input:2017488_adiodvpe0_ASN",
+        "vmxvre_chassis_i2cid": "161",
+        "vmxvpfe_name_0": "vPFEXI",
+        "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+        "availability_zone_max_count": "1",
+        "vmxvre_volume_size_0": "45.0",
+        "vmxvre_volume_size_1": "50.0",
+        "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+        "vmxvre_oam_gateway": "10.40.123.1",
+        "vmxvre_volume_name_1": "vREXI_FAVolume",
+        "vmxvre_ore_present": "0",
+        "vmxvre_volume_name_0": "vREXI_FBVolume",
+        "vmxvre_type": "0",
+        "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+        "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+        "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+        "vmx_int_ctl_len": "24",
+        "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+        "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+        "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+        "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+        "nf_role": "Testing",
+        "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+        "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+        "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+      },
+      "type": "VF",
+      "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+      "vfModules": {
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+          "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+          "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+          "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "version": "6",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vRE_BV"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": true
+        },
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+          "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+          "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+          "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+          "version": "5",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "ADIOD_base_vPE_BV"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": false
+        },
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+          "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+          "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+          "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "version": "6",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vPFE_BV"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": true
+        }
+      },
+      "volumeGroups": {
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+          "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+          "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+          "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "version": "6",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vRE_BV"
+          },
+          "inputs": {}
+        },
+        "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+          "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+          "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+          "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+          "description": null,
+          "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "version": "6",
+          "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+          "properties": {
+            "minCountInstances": 0,
+            "maxCountInstances": null,
+            "initialCount": 0,
+            "vfModuleLabel": "ADIOD_vPFE_BV"
+          },
+          "inputs": {}
+        }
+      },
+      "vfcInstanceGroups": {}
+    }
+  },
+  "networks": {},
+  "collectionResource": {},
+  "configurations": {},
+  "serviceProxies": {},
+  "vfModules": {
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+      "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+      "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+      "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "version": "6",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vRE_BV"
+      },
+      "inputs": {},
+      "volumeGroupAllowed": true
+    },
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+      "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+      "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+      "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+      "version": "5",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+      "properties": {
+        "minCountInstances": 1,
+        "maxCountInstances": 1,
+        "initialCount": 1,
+        "vfModuleLabel": "ADIOD_base_vPE_BV"
+      },
+      "inputs": {},
+      "volumeGroupAllowed": false
+    },
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+      "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+      "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+      "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "version": "6",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vPFE_BV"
+      },
+      "inputs": {},
+      "volumeGroupAllowed": true
+    }
+  },
+  "volumeGroups": {
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+      "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+      "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+      "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "version": "6",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vRE_BV"
+      },
+      "inputs": {}
+    },
+    "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+      "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+      "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+      "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+      "description": null,
+      "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "version": "6",
+      "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+      "properties": {
+        "minCountInstances": 0,
+        "maxCountInstances": null,
+        "initialCount": 0,
+        "vfModuleLabel": "ADIOD_vPFE_BV"
+      },
+      "inputs": {}
+    }
+  },
+  "pnfs": {}
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/serviceWithVnfAndVfModules.json
new file mode 100644 (file)
index 0000000..a95803f
--- /dev/null
@@ -0,0 +1,2718 @@
+{
+  "global": {
+    "name": null
+  },
+  "service": {
+    "serviceHierarchy": {
+      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "service": {
+          "uuid": "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+          "invariantUuid": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "name": "action-data",
+          "version": "1.0",
+          "toscaModelURL": null,
+          "category": "",
+          "serviceType": "",
+          "serviceRole": "",
+          "description": "",
+          "serviceEcompNaming": "true",
+          "instantiationType": "Macro",
+          "inputs": {
+            "2017488_adiodvpe0_ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            }
+          }
+        },
+        "vnfs": {
+          "2017-388_ADIOD-vPE 1": {
+            "uuid": "0903e1c0-8e03-4936-b5c2-260653b96413",
+            "invariantUuid": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-388_ADIOD-vPE",
+            "version": "1.0",
+            "customizationUuid": "280dec31-f16d-488b-9668-4aae55d6648a",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-388_ADIOD-vPE 1",
+            "vfModules": {},
+            "volumeGroups": {},
+            "vfcInstanceGroups": {}
+          },
+          "2017-388_ADIOD-vPE 0": {
+            "uuid": "afacccf6-397d-45d6-b5ae-94c39734b168",
+            "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-388_ADIOD-vPE",
+            "version": "4.0",
+            "customizationUuid": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-388_ADIOD-vPE 0",
+            "vfModules": {},
+            "volumeGroups": {},
+            "vfcInstanceGroups": {}
+          },
+          "2017-488_ADIOD-vPE 0": {
+            "uuid": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+            "invariantUuid": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-488_ADIOD-vPE",
+            "version": "5.0",
+            "customizationUuid": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "vPE",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "VRE-ENGINE_17.2-S2.1.qcow2",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "nf_naming_code": "Navneet",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "JAI",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "mtpocfo-kvm-az01",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "Testing",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  }
+                },
+                "volumeGroupAllowed": true
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+                "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "version": "5",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "properties": {
+                  "minCountInstances": 1,
+                  "maxCountInstances": 1,
+                  "initialCount": 1,
+                  "vfModuleLabel": "ADIOD_base_vPE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": false
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": true
+              }
+            },
+            "volumeGroups": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  },
+                  "adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  }
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {}
+              }
+            },
+            "vfcInstanceGroups": {}
+          }
+        },
+        "networks": {},
+        "collectionResource": {},
+        "configurations": {},
+        "serviceProxies": {},
+        "vfModules": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              },
+              "adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              }
+            },
+            "volumeGroupAllowed": true
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+            "uuid": "f8360508-3f17-4414-a2ed-6bc71161e8db",
+            "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+            "customizationUuid": "a55961b2-2065-4ab0-a5b7-2fcee1c227e3",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "version": "5",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "properties": {
+              "minCountInstances": 1,
+              "maxCountInstances": 1,
+              "initialCount": 1,
+              "vfModuleLabel": "ADIOD_base_vPE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": false
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": true
+          }
+        },
+        "volumeGroups": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "25284168-24bb-4698-8cb4-3f509146eca5",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f7e7c365-60cf-49a9-9ebf-a1aa11b9d401",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              },
+              "adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              }
+            }
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "3cd946bb-50e0-40d8-96d3-c9023520b557",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {}
+          }
+        },
+        "pnfs": {}
+      },
+      "f4d84bb4-a416-4b4e-997e-0059973630b9": {
+        "service": {
+          "uuid": "f4d84bb4-a416-4b4e-997e-0059973630b9",
+          "invariantUuid": "598e3f9e-3244-4d8f-a8e0-0e5d7a29eda9",
+          "name": "ADIOD vMX vPE_BV Service 488",
+          "version": "1.0",
+          "toscaModelURL": null,
+          "category": "Network L1-3",
+          "serviceType": "",
+          "serviceRole": "",
+          "description": "ADIOD vMX vPE based on Juniper 17.2 release. Updated with updated VF for v8.0 of VLM",
+          "serviceEcompNaming": "true",
+          "instantiationType": "Macro",
+          "inputs": {
+            "2017488_adiodvpe0_ASN": {
+              "type": "string",
+              "description": "AV/PE",
+              "entry_schema": null,
+              "inputProperties": null,
+              "constraints": [],
+              "required": true,
+              "default": "AV_vPE"
+            }
+          }
+        },
+        "vnfs": {
+          "2017-488_ADIOD-vPE 0": {
+            "uuid": "ea81d6f7-0861-44a7-b7d5-d173b562c350",
+            "invariantUuid": "5be7e99e-8eb2-4d97-be63-8081ff3cd10e",
+            "description": "Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM",
+            "name": "2017-488_ADIOD-vPE",
+            "version": "9.0",
+            "customizationUuid": "41516cc6-5098-4b40-a619-f8d5f55fc4d8",
+            "inputs": {},
+            "commands": {},
+            "properties": {
+              "vmxvre_retype": "RE-VMX",
+              "vnf_config_template_version": "get_input:2017488_adiodvpe0_vnf_config_template_version",
+              "sriov44_net_id": "48d399b3-11ee-48a8-94d2-f0ea94d6be8d",
+              "int_ctl_net_id": "2f323477-6936-4d01-ac53-d849430281d9",
+              "vmxvpfe_sriov41_0_port_mac": "00:11:22:EF:AC:DF",
+              "int_ctl_net_name": "VMX-INTXI",
+              "vmx_int_ctl_prefix": "128.0.0.0",
+              "sriov43_net_id": "da349ca1-6de9-4548-be88-2d88e99bfef5",
+              "sriov42_net_id": "760669ba-013d-4d9b-b0e7-4151fe2e6279",
+              "sriov41_net_id": "25ad52d5-c165-40f8-b3b0-ddfc2373280a",
+              "nf_type": "ROUTER",
+              "vmxvpfe_int_ctl_ip_1": "128.0.0.16",
+              "is_AVPN_service": "false",
+              "vmx_RSG_name": "vREXI-affinity",
+              "vmx_int_ctl_forwarding": "l2",
+              "vmxvre_oam_ip_0": "10.40.123.5",
+              "vmxvpfe_sriov44_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_sriov41_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov42_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov44_0_port_unknownunicastallow": "true",
+              "vmxvre_image_name_0": "vre172_nova_img",
+              "vmxvre_instance": "0",
+              "vmxvpfe_sriov43_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvre_flavor_name": "ns.c1r16d32.v5",
+              "vmxvpfe_volume_size_0": "40.0",
+              "vmxvpfe_sriov43_0_port_vlanfilter": "4001",
+              "nf_naming": "{ecomp_generated_naming=true}",
+              "multi_stage_design": "false",
+              "nf_naming_code": "me6",
+              "vmxvre_name_0": "vREXI",
+              "vmxvpfe_sriov42_0_port_vlanstrip": "false",
+              "vmxvpfe_volume_name_0": "vPFEXI_FBVolume",
+              "vmx_RSG_id": "bd89a33c-13c3-4a04-8fde-1a57eb123141",
+              "vmxvpfe_image_name_0": "vpfe172_nova_img",
+              "vmxvpfe_sriov43_0_port_unknownunicastallow": "true",
+              "vmxvpfe_sriov44_0_port_unknownmulticastallow": "true",
+              "vmxvre_console": "vidconsole",
+              "vmxvpfe_sriov44_0_port_vlanfilter": "4001",
+              "vmxvpfe_sriov42_0_port_mac": "00:11:22:EF:AC:DF",
+              "vmxvpfe_volume_id_0": "47cede15-da2f-4397-a101-aa683220aff3",
+              "vmxvpfe_sriov42_0_port_unknownmulticastallow": "true",
+              "vmxvpfe_sriov44_0_port_vlanstrip": "false",
+              "vf_module_id": "123",
+              "nf_function": "ADIOD vPE",
+              "vmxvpfe_sriov43_0_port_unknownmulticastallow": "true",
+              "vmxvre_int_ctl_ip_0": "128.0.0.1",
+              "ecomp_generated_naming": "true",
+              "AIC_CLLI": "get_input:2017488_adiodvpe0_AIC_CLLI",
+              "vnf_name": "mtnj309me6vre",
+              "vmxvpfe_sriov41_0_port_unknownunicastallow": "true",
+              "vmxvre_volume_type_1": "HITACHI",
+              "vmxvpfe_sriov44_0_port_broadcastallow": "true",
+              "vmxvre_volume_type_0": "HITACHI",
+              "vmxvpfe_volume_type_0": "HITACHI",
+              "vmxvpfe_sriov43_0_port_broadcastallow": "true",
+              "bandwidth_units": "get_input:2017488_adiodvpe0_bandwidth_units",
+              "vnf_id": "123",
+              "vmxvre_oam_prefix": "24",
+              "availability_zone_0": "get_input:2017488_adiodvpe0_availability_zone_0",
+              "ASN": "get_input:2017488_adiodvpe0_ASN",
+              "vmxvre_chassis_i2cid": "161",
+              "vmxvpfe_name_0": "vPFEXI",
+              "bandwidth": "get_input:2017488_adiodvpe0_bandwidth",
+              "availability_zone_max_count": "1",
+              "vmxvre_volume_size_0": "45.0",
+              "vmxvre_volume_size_1": "50.0",
+              "vmxvpfe_sriov42_0_port_broadcastallow": "true",
+              "vmxvre_oam_gateway": "10.40.123.1",
+              "vmxvre_volume_name_1": "vREXI_FAVolume",
+              "vmxvre_ore_present": "0",
+              "vmxvre_volume_name_0": "vREXI_FBVolume",
+              "vmxvre_type": "0",
+              "vnf_instance_name": "get_input:2017488_adiodvpe0_vnf_instance_name",
+              "vmxvpfe_sriov41_0_port_unknownmulticastallow": "true",
+              "oam_net_id": "b95eeb1d-d55d-4827-abb4-8ebb94941429",
+              "vmx_int_ctl_len": "24",
+              "vmxvpfe_sriov43_0_port_vlanstrip": "false",
+              "vmxvpfe_sriov41_0_port_broadcastallow": "true",
+              "vmxvre_volume_id_1": "6e86797e-03cd-4fdc-ba72-2957119c746d",
+              "vmxvpfe_sriov41_0_port_vlanfilter": "4001",
+              "nf_role": "vPE",
+              "vmxvre_volume_id_0": "f4eacb79-f687-4e9d-b760-21847c8bb15a",
+              "vmxvpfe_sriov42_0_port_unknownunicastallow": "true",
+              "vmxvpfe_flavor_name": "ns.c20r16d25.v5"
+            },
+            "type": "VF",
+            "modelCustomizationName": "2017-488_ADIOD-vPE 0",
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "2017488_adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  }
+                },
+                "volumeGroupAllowed": true
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+                "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+                "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+                "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "version": "6",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+                "properties": {
+                  "minCountInstances": 1,
+                  "maxCountInstances": 1,
+                  "initialCount": 1,
+                  "vfModuleLabel": "ADIOD_base_vPE_BV"
+                },
+                "inputs": {},
+                "volumeGroupAllowed": false
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_availability_zone_0": {
+                    "type": "string",
+                    "description": "The Availability Zone to launch the instance.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vPFE_BV",
+                      "paramName": "availability_zone_0"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtpocfo-kvm-az01"
+                  }
+                },
+                "volumeGroupAllowed": true
+              }
+            },
+            "volumeGroups": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+                "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vRE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_bandwidth_units": {
+                    "type": "string",
+                    "description": "Units of bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth_units"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "Gbps"
+                  },
+                  "2017488_adiodvpe0_bandwidth": {
+                    "type": "string",
+                    "description": "Requested VPE bandwidth",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "bandwidth"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "10"
+                  },
+                  "2017488_adiodvpe0_vnf_instance_name": {
+                    "type": "string",
+                    "description": "The hostname assigned to the vpe.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_instance_name"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtnj309me6"
+                  },
+                  "2017488_adiodvpe0_vnf_config_template_version": {
+                    "type": "string",
+                    "description": "VPE Software Version",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "vnf_config_template_version"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "17.2"
+                  },
+                  "2017488_adiodvpe0_AIC_CLLI": {
+                    "type": "string",
+                    "description": "AIC Site CLLI",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vRE_BV",
+                      "paramName": "AIC_CLLI"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "ATLMY8GA"
+                  }
+                }
+              },
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+                "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+                "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+                "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+                "description": null,
+                "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "version": "8",
+                "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+                "properties": {
+                  "minCountInstances": 0,
+                  "maxCountInstances": null,
+                  "initialCount": 0,
+                  "vfModuleLabel": "ADIOD_vPFE_BV"
+                },
+                "inputs": {
+                  "2017488_adiodvpe0_availability_zone_0": {
+                    "type": "string",
+                    "description": "The Availability Zone to launch the instance.",
+                    "entry_schema": null,
+                    "inputProperties": {
+                      "sourceType": "HEAT",
+                      "vfModuleLabel": "ADIOD_vPFE_BV",
+                      "paramName": "availability_zone_0"
+                    },
+                    "constraints": null,
+                    "required": true,
+                    "default": "mtpocfo-kvm-az01"
+                  }
+                }
+              }
+            },
+            "vfcInstanceGroups": {}
+          }
+        },
+        "networks": {},
+        "collectionResource": {},
+        "configurations": {},
+        "serviceProxies": {},
+        "vfModules": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              },
+              "2017488_adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              }
+            },
+            "volumeGroupAllowed": true
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0": {
+            "uuid": "040e591e-5d30-4e0d-850f-7266e5a8e013",
+            "invariantUuid": "b34833bb-6aa9-4ad6-a831-70b06367a091",
+            "customizationUuid": "5c5f91f9-5e31-4120-b892-5536587ec258",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "version": "6",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_base_vPE_BV..module-0",
+            "properties": {
+              "minCountInstances": 1,
+              "maxCountInstances": 1,
+              "initialCount": 1,
+              "vfModuleLabel": "ADIOD_base_vPE_BV"
+            },
+            "inputs": {},
+            "volumeGroupAllowed": false
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_availability_zone_0": {
+                "type": "string",
+                "description": "The Availability Zone to launch the instance.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vPFE_BV",
+                  "paramName": "availability_zone_0"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtpocfo-kvm-az01"
+              }
+            },
+            "volumeGroupAllowed": true
+          }
+        },
+        "volumeGroups": {
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+            "uuid": "a5d8df05-11cb-4351-96e0-b6d4168ea4df",
+            "invariantUuid": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+            "customizationUuid": "f3d97417-0c8d-424e-8ff7-b2eb4fbcecc3",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vRE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_bandwidth_units": {
+                "type": "string",
+                "description": "Units of bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth_units"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "Gbps"
+              },
+              "2017488_adiodvpe0_bandwidth": {
+                "type": "string",
+                "description": "Requested VPE bandwidth",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "bandwidth"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "10"
+              },
+              "2017488_adiodvpe0_vnf_instance_name": {
+                "type": "string",
+                "description": "The hostname assigned to the vpe.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_instance_name"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtnj309me6"
+              },
+              "2017488_adiodvpe0_vnf_config_template_version": {
+                "type": "string",
+                "description": "VPE Software Version",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "vnf_config_template_version"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "17.2"
+              },
+              "2017488_adiodvpe0_AIC_CLLI": {
+                "type": "string",
+                "description": "AIC Site CLLI",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vRE_BV",
+                  "paramName": "AIC_CLLI"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "ATLMY8GA"
+              }
+            }
+          },
+          "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2": {
+            "uuid": "b3e8b26e-cff0-49fc-a4e6-f3e16c8440fe",
+            "invariantUuid": "eff8cc59-53a1-4101-aed7-8cf24ecf8339",
+            "customizationUuid": "6e410843-257c-46d9-ba8a-8d94e1362452",
+            "description": null,
+            "name": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "version": "8",
+            "modelCustomizationName": "2017488AdiodVpe..ADIOD_vPFE_BV..module-2",
+            "properties": {
+              "minCountInstances": 0,
+              "maxCountInstances": null,
+              "initialCount": 0,
+              "vfModuleLabel": "ADIOD_vPFE_BV"
+            },
+            "inputs": {
+              "2017488_adiodvpe0_availability_zone_0": {
+                "type": "string",
+                "description": "The Availability Zone to launch the instance.",
+                "entry_schema": null,
+                "inputProperties": {
+                  "sourceType": "HEAT",
+                  "vfModuleLabel": "ADIOD_vPFE_BV",
+                  "paramName": "availability_zone_0"
+                },
+                "constraints": null,
+                "required": true,
+                "default": "mtpocfo-kvm-az01"
+              }
+            }
+          }
+        },
+        "pnfs": {}
+      }
+    },
+    "serviceInstance": {
+      "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+        "vnfs": {
+          "2017-388_ADIOD-vPE 1": {
+            "rollbackOnFailure": "false",
+            "vfModules": {},
+            "productFamilyId": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+            "lcpCloudRegionId": "mtn6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "lineOfBusiness": "zzz1",
+            "platformName": "platform",
+            "modelInfo": {
+              "modelType": "service",
+              "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+              "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413",
+              "modelName": "2017-388_ADIOD-vPE",
+              "modelVersion": "1.0",
+              "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
+              "modelCustomizationName": "2017-388_ADIOD-vPE 1"
+            },
+            "isUserProvidedNaming": false
+          },
+          "2017-488_ADIOD-vPE 0": {
+            "rollbackOnFailure": "false",
+            "vfModules": {
+              "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                  "rollbackOnFailure": true,
+                  "modelInfo": {
+                    "modelType": "service",
+                    "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                    "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                    "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                    "modelVersion": "6"
+                  },
+                  "instanceParams": [
+                    {
+                      "adiodvpe0_bandwidth": "10",
+                      "2017488_adiodvpe0_vnf_instance_name": "mtnj309me6",
+                      "2017488_adiodvpe0_vnf_config_template_version": "17.2",
+                      "2017488_adiodvpe0_AIC_CLLI": "ATLMY8GA",
+                      "adiodvpe0_bandwidth_units": "Gbps"
+                    }
+                  ]
+                }
+              }
+            },
+            "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+            "lcpCloudRegionId": "mtn6",
+            "tenantId": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "lineOfBusiness": "ECOMP",
+            "platformName": "platform",
+            "modelInfo": {
+              "modelType": "service",
+              "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+              "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+              "modelName": "2017-488_ADIOD-vPE",
+              "modelVersion": "5.0",
+              "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+              "modelCustomizationName": "2017-488_ADIOD-vPE 0"
+            },
+            "isUserProvidedNaming": false
+          }
+        },
+        "instanceParams": [
+          {
+            "2017488_adiodvpe0_ASN": "AV_vPE"
+          }
+        ],
+        "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "subscriptionServiceType": "VIRTUAL USP",
+        "lcpCloudRegionId": "AAIAIC25",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+        "aicZoneId": "JAG1",
+        "projectName": "DFW",
+        "owningEntityId": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+        "bulkSize": 1,
+        "modelInfo": {
+          "modelType": "service",
+          "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+          "modelVersionId": "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+          "modelName": "action-data",
+          "modelVersion": "1.0"
+        },
+        "isUserProvidedNaming": false,
+        "tenantName": "USP-SIP-IC-24335-T-01",
+        "aicZoneName": "YUDFJULP-JAG1"
+      }
+    },
+    "lcpRegionsAndTenants": {
+      "lcpRegionList": [
+        {
+          "id": "AAIAIC25",
+          "name": "AAIAIC25",
+          "isPermitted": true
+        },
+        {
+          "id": "mtn6",
+          "name": "mtn6",
+          "isPermitted": true
+        }
+      ],
+      "lcpRegionsTenantsMap": {
+        "AAIAIC25": [
+          {
+            "id": "092eb9e8e4b7412e8787dd091bc58e86",
+            "name": "USP-SIP-IC-24335-T-01",
+            "isPermitted": true
+          }
+        ],
+        "mtn6": [
+          {
+            "id": "bae71557c5bb4d5aac6743a4e5f1d054",
+            "name": "AIN Web Tool-15-D-testgamma",
+            "isPermitted": true
+          },
+          {
+            "id": "229bcdc6eaeb4ca59d55221141d01f8e",
+            "name": "AIN Web Tool-15-D-STTest2",
+            "isPermitted": true
+          },
+          {
+            "id": "1178612d2b394be4834ad77f567c0af2",
+            "name": "AIN Web Tool-15-D-SSPtestcustome",
+            "isPermitted": true
+          },
+          {
+            "id": "19c5ade915eb461e8af52fb2fd8cd1f2",
+            "name": "AIN Web Tool-15-D-UncheckedEcopm",
+            "isPermitted": true
+          },
+          {
+            "id": "de007636e25249238447264a988a927b",
+            "name": "AIN Web Tool-15-D-dfsdf",
+            "isPermitted": true
+          },
+          {
+            "id": "62f29b3613634ca6a3065cbe0e020c44",
+            "name": "AIN/SMS-16-D-Multiservices1",
+            "isPermitted": true
+          },
+          {
+            "id": "649289e30d3244e0b48098114d63c2aa",
+            "name": "AIN Web Tool-15-D-SSPST66",
+            "isPermitted": true
+          },
+          {
+            "id": "3f21eeea6c2c486bba31dab816c05a32",
+            "name": "AIN Web Tool-15-D-ASSPST47",
+            "isPermitted": true
+          },
+          {
+            "id": "f60ce21d3ee6427586cff0d22b03b773",
+            "name": "CESAR-100-D-sspjg67246",
+            "isPermitted": true
+          },
+          {
+            "id": "8774659e425f479895ae091bb5d46560",
+            "name": "CESAR-100-D-sspjg68359",
+            "isPermitted": true
+          },
+          {
+            "id": "624eb554b0d147c19ff8885341760481",
+            "name": "AINWebTool-15-D-iftach",
+            "isPermitted": true
+          },
+          {
+            "id": "214f55f5fc414c678059c383b03e4962",
+            "name": "CESAR-100-D-sspjg612401",
+            "isPermitted": true
+          },
+          {
+            "id": "c90666c291664841bb98e4d981ff1db5",
+            "name": "CESAR-100-D-sspjg621340",
+            "isPermitted": true
+          },
+          {
+            "id": "ce5b6bc5c7b348e1bf4b91ac9a174278",
+            "name": "sspjg621351cloned",
+            "isPermitted": true
+          },
+          {
+            "id": "b386b768a3f24c8e953abbe0b3488c02",
+            "name": "AINWebTool-15-D-eteancomp",
+            "isPermitted": true
+          },
+          {
+            "id": "dc6c4dbfd225474e9deaadd34968646c",
+            "name": "AINWebTool-15-T-SPFET",
+            "isPermitted": true
+          },
+          {
+            "id": "02cb5030e9914aa4be120bd9ed1e19eb",
+            "name": "AINWebTool-15-X-eeweww",
+            "isPermitted": true
+          },
+          {
+            "id": "f2f3830e4c984d45bcd00e1a04158a79",
+            "name": "CESAR-100-D-spjg61909",
+            "isPermitted": true
+          },
+          {
+            "id": "05b91bd5137f4929878edd965755c06d",
+            "name": "CESAR-100-D-sspjg621512cloned",
+            "isPermitted": true
+          },
+          {
+            "id": "7002fbe8482d4a989ddf445b1ce336e0",
+            "name": "AINWebTool-15-X-vdr",
+            "isPermitted": true
+          },
+          {
+            "id": "4008522be43741dcb1f5422022a2aa0b",
+            "name": "AINWebTool-15-D-ssasa",
+            "isPermitted": true
+          },
+          {
+            "id": "f44e2e96a1b6476abfda2fa407b00169",
+            "name": "AINWebTool-15-D-PFNPT",
+            "isPermitted": true
+          },
+          {
+            "id": "b69a52bec8a84669a37a1e8b72708be7",
+            "name": "AINWebTool-15-X-vdre",
+            "isPermitted": true
+          },
+          {
+            "id": "fac7d9fd56154caeb9332202dcf2969f",
+            "name": "AINWebTool-15-X-NONPODECOMP",
+            "isPermitted": true
+          },
+          {
+            "id": "2d34d8396e194eb49969fd61ffbff961",
+            "name": "DN5242-Nov16-T5",
+            "isPermitted": true
+          },
+          {
+            "id": "cb42a77ff45b48a8b8deb83bb64acc74",
+            "name": "ro-T11",
+            "isPermitted": true
+          },
+          {
+            "id": "fa45ca53c80b492fa8be5477cd84fc2b",
+            "name": "ro-T112",
+            "isPermitted": true
+          },
+          {
+            "id": "4914ab0ab3a743e58f0eefdacc1dde77",
+            "name": "DN5242-Nov21-T1",
+            "isPermitted": true
+          },
+          {
+            "id": "d0a3e3f2964542259d155a81c41aadc3",
+            "name": "test-mtn6-09",
+            "isPermitted": true
+          },
+          {
+            "id": "cbb99fe4ada84631b7baf046b6fd2044",
+            "name": "DN5242-Nov16-T3",
+            "isPermitted": true
+          }
+        ]
+      }
+    },
+    "subscribers": [
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Mobility",
+        "isPermitted": false
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
+        "name": "PACKET CORE",
+        "isPermitted": false
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "USP VOICE",
+        "isPermitted": true
+      }
+    ],
+    "productFamilies": [
+      {
+        "id": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+        "name": "DHV",
+        "isPermitted": true
+      },
+      {
+        "id": "17cc1042-527b-11e6-beb8-9e71128cae77",
+        "name": "FLEXREACH",
+        "isPermitted": true
+      },
+      {
+        "id": "36b4733a-53f4-4cc8-8ff0-9172e5fc4b8e",
+        "name": "Netbond",
+        "isPermitted": true
+      },
+      {
+        "id": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+        "name": "Enhanced Services",
+        "isPermitted": true
+      },
+      {
+        "id": "vRRaaS",
+        "name": "vRRaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "323d69d9-2efe-4r45-ay0a-89ea7ard4e6f",
+        "name": "vSCP",
+        "isPermitted": true
+      },
+      {
+        "id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "name": "Mobility",
+        "isPermitted": true
+      },
+      {
+        "id": "d8a6ed93-251c-47ca-adc9-86671fd19f4c",
+        "name": "BVOIP",
+        "isPermitted": true
+      },
+      {
+        "id": "db171b8f-115c-4992-a2e3-ee04cae357e0",
+        "name": "FIRSTNET",
+        "isPermitted": true
+      },
+      {
+        "id": "LRSI-OSPF",
+        "name": "LRSI-OSPF",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNGWaas",
+        "name": "HNGATEWAY",
+        "isPermitted": true
+      },
+      {
+        "id": "vHNPaas",
+        "name": "HNPORTAL",
+        "isPermitted": true
+      },
+      {
+        "id": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "name": "VIRTUAL USP",
+        "isPermitted": true
+      },
+      {
+        "id": "b6a3f28c-eebf-494c-a900-055cc7c874ce",
+        "name": "VROUTER",
+        "isPermitted": true
+      },
+      {
+        "id": "VIPRaaS",
+        "name": "vIPRaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "0ee8c1bc-7cbd-4b0a-a1ac-e9999255abc1",
+        "name": "WAN Bonding",
+        "isPermitted": true
+      },
+      {
+        "id": "c7611ebe-c324-48f1-8085-94aef0c6ef3d",
+        "name": "HOSTED COMMUNICATIONS",
+        "isPermitted": true
+      },
+      {
+        "id": "e30755dc-5673-4b6b-9dcf-9abdd96b93d1",
+        "name": "Transport",
+        "isPermitted": true
+      },
+      {
+        "id": "vVIGaaS",
+        "name": "vVIGaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "d7bb0a21-66f2-4e6d-87d9-9ef3ced63ae4",
+        "name": "uCPE-VMS",
+        "isPermitted": true
+      },
+      {
+        "id": "vPEaaS",
+        "name": "vPEaaS",
+        "isPermitted": true
+      },
+      {
+        "id": "12a96a9d-4b4c-4349-a950-fe1159602621",
+        "name": "HOSTED COMMUNICATIONS",
+        "isPermitted": true
+      }
+    ],
+    "serviceTypes": {
+      "e433710f-9217-458d-a79d-1c7aff376d89": [
+        {
+          "id": "0",
+          "name": "vFlowLogic",
+          "isPermitted": false
+        },
+        {
+          "id": "1",
+          "name": "VIRTUAL USP",
+          "isPermitted": true
+        },
+        {
+          "id": "2",
+          "name": "Mobility",
+          "isPermitted": false
+        },
+        {
+          "id": "3",
+          "name": "vBNG",
+          "isPermitted": false
+        },
+        {
+          "id": "4",
+          "name": "vVoiceMail",
+          "isPermitted": false
+        },
+        {
+          "id": "5",
+          "name": "Nimbus",
+          "isPermitted": false
+        },
+        {
+          "id": "6",
+          "name": "vSEGW",
+          "isPermitted": false
+        },
+        {
+          "id": "7",
+          "name": "vVM",
+          "isPermitted": false
+        },
+        {
+          "id": "8",
+          "name": "vOTA",
+          "isPermitted": false
+        },
+        {
+          "id": "9",
+          "name": "vMME",
+          "isPermitted": false
+        },
+        {
+          "id": "10",
+          "name": "vMNS",
+          "isPermitted": false
+        },
+        {
+          "id": "11",
+          "name": "vSCP",
+          "isPermitted": false
+        },
+        {
+          "id": "12",
+          "name": "VPMS",
+          "isPermitted": false
+        },
+        {
+          "id": "13",
+          "name": "vMMSC",
+          "isPermitted": false
+        },
+        {
+          "id": "14",
+          "name": "SSD",
+          "isPermitted": false
+        },
+        {
+          "id": "15",
+          "name": "vMOG",
+          "isPermitted": false
+        },
+        {
+          "id": "16",
+          "name": "FIRSTNET",
+          "isPermitted": false
+        },
+        {
+          "id": "17",
+          "name": "ACTIVE_CHARGE",
+          "isPermitted": false
+        },
+        {
+          "id": "18",
+          "name": "vHSS",
+          "isPermitted": false
+        }
+      ]
+    },
+    "aicZones": [
+      {
+        "id": "NFT1",
+        "name": "NFTJSSSS-NFT1"
+      },
+      {
+        "id": "JAG1",
+        "name": "YUDFJULP-JAG1"
+      },
+      {
+        "id": "YYY1",
+        "name": "UUUAIAAI-YYY1"
+      },
+      {
+        "id": "BAN1",
+        "name": "VSDKYUTP-BAN1"
+      },
+      {
+        "id": "DKJ1",
+        "name": "DKJSJDKA-DKJ1"
+      },
+      {
+        "id": "MCS1",
+        "name": "ASACMAMS-MCS1"
+      },
+      {
+        "id": "UIO1",
+        "name": "uioclli1-UIO1"
+      },
+      {
+        "id": "RAJ1",
+        "name": "YGBIJNLQ-RAJ1"
+      },
+      {
+        "id": "OPA1",
+        "name": "opaclli1-OPA1"
+      },
+      {
+        "id": "SDE1",
+        "name": "ZXCVBNMA-SDE1"
+      },
+      {
+        "id": "VEN2",
+        "name": "FGHJUHIL-VEN2"
+      },
+      {
+        "id": "ORL1",
+        "name": "ORLDFLMA-ORL1"
+      },
+      {
+        "id": "JAD1",
+        "name": "JADECLLI-JAD1"
+      },
+      {
+        "id": "ZXL1",
+        "name": "LWLWCANN-ZXL1"
+      },
+      {
+        "id": "CKL1",
+        "name": "CLKSKCKK-CKL1"
+      },
+      {
+        "id": "SDF1",
+        "name": "sdfclli1-SDF1"
+      },
+      {
+        "id": "RAD1",
+        "name": "RADICAL1-RAD1"
+      },
+      {
+        "id": "KIT1",
+        "name": "BHYJFGLN-KIT1"
+      },
+      {
+        "id": "REL1",
+        "name": "INGERFGT-REL1"
+      },
+      {
+        "id": "JNL1",
+        "name": "CJALSDAC-JNL1"
+      },
+      {
+        "id": "OLK1",
+        "name": "OLKOLKLS-OLK1"
+      },
+      {
+        "id": "CHI1",
+        "name": "CHILLIWE-CHI1"
+      },
+      {
+        "id": "UUU4",
+        "name": "UUUAAAUU-UUU4"
+      },
+      {
+        "id": "TUF1",
+        "name": "TUFCLLI1-TUF1"
+      },
+      {
+        "id": "KJN1",
+        "name": "CKALDKSA-KJN1"
+      },
+      {
+        "id": "SAM1",
+        "name": "SNDGCA64-SAN1"
+      },
+      {
+        "id": "SCK1",
+        "name": "SCKSCKSK-SCK1"
+      },
+      {
+        "id": "HJH1",
+        "name": "AOEEQQQD-HJH1"
+      },
+      {
+        "id": "HGD1",
+        "name": "SDFQWHGD-HGD1"
+      },
+      {
+        "id": "KOR1",
+        "name": "HYFLNBVT-KOR1"
+      },
+      {
+        "id": "ATL43",
+        "name": "AICLOCID-ATL43"
+      },
+      {
+        "id": "ATL54",
+        "name": "AICFTAAI-ATL54"
+      },
+      {
+        "id": "ATL66",
+        "name": "CLLIAAII-ATL66"
+      },
+      {
+        "id": "VEL1",
+        "name": "BNMLKUIK-VEL1"
+      },
+      {
+        "id": "ICC1",
+        "name": "SANJITAT-ICC1"
+      },
+      {
+        "id": "MNT11",
+        "name": "WSXEFBTH-MNT11"
+      },
+      {
+        "id": "DEF2",
+        "name": "WSBHGTYL-DEF2"
+      },
+      {
+        "id": "MAD11",
+        "name": "SDFQWGKL-MAD11"
+      },
+      {
+        "id": "OLG1",
+        "name": "OLHOLHOL-OLG1"
+      },
+      {
+        "id": "GAR1",
+        "name": "NGFVSJKO-GAR1"
+      },
+      {
+        "id": "SAN22",
+        "name": "GNVLSCTL-SAN22"
+      },
+      {
+        "id": "HRG1",
+        "name": "HRGHRGGS-HRG1"
+      },
+      {
+        "id": "JCS1",
+        "name": "JCSJSCJS-JCS1"
+      },
+      {
+        "id": "DHA12",
+        "name": "WSXEDECF-DHA12"
+      },
+      {
+        "id": "HJE1",
+        "name": "AOEEWWWD-HJE1"
+      },
+      {
+        "id": "NCA1",
+        "name": "NCANCANN-NCA1"
+      },
+      {
+        "id": "IOP1",
+        "name": "iopclli1-IOP1"
+      },
+      {
+        "id": "RTY1",
+        "name": "rtyclli1-RTY1"
+      },
+      {
+        "id": "KAP1",
+        "name": "HIOUYTRQ-KAP1"
+      },
+      {
+        "id": "ZEN1",
+        "name": "ZENCLLI1-ZEN1"
+      },
+      {
+        "id": "HKA1",
+        "name": "JAKHLASS-HKA1"
+      },
+      {
+        "id": "CQK1",
+        "name": "CQKSCAKK-CQK1"
+      },
+      {
+        "id": "SAI1",
+        "name": "UBEKQLPD-SAI1"
+      },
+      {
+        "id": "ERT1",
+        "name": "ertclli1-ERT1"
+      },
+      {
+        "id": "IBB1",
+        "name": "PLMKOIJU-IBB1"
+      },
+      {
+        "id": "TIR2",
+        "name": "PLKINHYI-TIR2"
+      },
+      {
+        "id": "HSD1",
+        "name": "CHASKCDS-HSD1"
+      },
+      {
+        "id": "SLF78",
+        "name": "SDCTLFN1-SLF78"
+      },
+      {
+        "id": "SEE78",
+        "name": "SDCTEEE4-SEE78"
+      },
+      {
+        "id": "SAN13",
+        "name": "TOKYJPFA-SAN13"
+      },
+      {
+        "id": "SAA78",
+        "name": "SDCTAAA1-SAA78"
+      },
+      {
+        "id": "LUC1",
+        "name": "ATLDFGYC-LUC1"
+      },
+      {
+        "id": "AMD13",
+        "name": "MEMATLAN-AMD13"
+      },
+      {
+        "id": "TOR1",
+        "name": "TOROONXN-TOR1"
+      },
+      {
+        "id": "QWE1",
+        "name": "QWECLLI1-QWE1"
+      },
+      {
+        "id": "ZOG1",
+        "name": "ZOGASTRO-ZOG1"
+      },
+      {
+        "id": "CAL33",
+        "name": "CALIFORN-CAL33"
+      },
+      {
+        "id": "SHH78",
+        "name": "SDIT1HHH-SHH78"
+      },
+      {
+        "id": "DSA1",
+        "name": "LKJHGFDS-DSA1"
+      },
+      {
+        "id": "CLG1",
+        "name": "CLGRABAD-CLG1"
+      },
+      {
+        "id": "BNA1",
+        "name": "BNARAGBK-BNA1"
+      },
+      {
+        "id": "ATL84",
+        "name": "CANTTCOC-ATL84"
+      },
+      {
+        "id": "APP1",
+        "name": "WBHGTYUI-APP1"
+      },
+      {
+        "id": "RJN1",
+        "name": "RJNRBZAW-RJN1"
+      },
+      {
+        "id": "EHH78",
+        "name": "SDCSHHH5-EHH78"
+      },
+      {
+        "id": "mac10",
+        "name": "PKGTESTF-mac10"
+      },
+      {
+        "id": "SXB78",
+        "name": "SDCTGXB1-SXB78"
+      },
+      {
+        "id": "SAX78",
+        "name": "SDCTAXG1-SAX78"
+      },
+      {
+        "id": "SYD1",
+        "name": "SYDNAUBV-SYD1"
+      },
+      {
+        "id": "TOK1",
+        "name": "TOKYJPFA-TOK1"
+      },
+      {
+        "id": "KGM2",
+        "name": "KGMTNC20-KGM2"
+      },
+      {
+        "id": "DCC1b",
+        "name": "POIUYTGH-DCC1b"
+      },
+      {
+        "id": "SKK78",
+        "name": "SDCTKKK1-SKK78"
+      },
+      {
+        "id": "SGG78",
+        "name": "SDCTGGG1-SGG78"
+      },
+      {
+        "id": "SJJ78",
+        "name": "SDCTJJJ1-SJJ78"
+      },
+      {
+        "id": "SBX78",
+        "name": "SDCTBXG1-SBX78"
+      },
+      {
+        "id": "LAG1",
+        "name": "LARGIZON-LAG1"
+      },
+      {
+        "id": "IAA1",
+        "name": "QAZXSWED-IAA1"
+      },
+      {
+        "id": "POI1",
+        "name": "PLMNJKIU-POI1"
+      },
+      {
+        "id": "LAG1a",
+        "name": "LARGIZON-LAG1a"
+      },
+      {
+        "id": "PBL1",
+        "name": "PBLAPBAI-PBL1"
+      },
+      {
+        "id": "LAG45",
+        "name": "LARGIZON-LAG1a"
+      },
+      {
+        "id": "MAR1",
+        "name": "MNBVCXZM-MAR1"
+      },
+      {
+        "id": "HST70",
+        "name": "HSTNTX70-HST70"
+      },
+      {
+        "id": "DCC1a",
+        "name": "POIUYTGH-DCC1a"
+      },
+      {
+        "id": "TOL1",
+        "name": "TOLDOH21-TOL1"
+      },
+      {
+        "id": "LON1",
+        "name": "LONEENCO-LON1"
+      },
+      {
+        "id": "SJU78",
+        "name": "SDIT1JUB-SJU78"
+      },
+      {
+        "id": "STN27",
+        "name": "HSTNTX01-STN27"
+      },
+      {
+        "id": "SSW56",
+        "name": "ss8126GT-SSW56"
+      },
+      {
+        "id": "SBB78",
+        "name": "SDIT1BBB-SBB78"
+      },
+      {
+        "id": "DCC3",
+        "name": "POIUYTGH-DCC3"
+      },
+      {
+        "id": "GNV1",
+        "name": "GNVLSCTL-GNV1"
+      },
+      {
+        "id": "WAS1",
+        "name": "WASHDCSW-WAS1"
+      },
+      {
+        "id": "TOY1",
+        "name": "TORYONNZ-TOY1"
+      },
+      {
+        "id": "STT1",
+        "name": "STTLWA02-STT1"
+      },
+      {
+        "id": "STG1",
+        "name": "STTGGE62-STG1"
+      },
+      {
+        "id": "SLL78",
+        "name": "SDCTLLL1-SLL78"
+      },
+      {
+        "id": "SBU78",
+        "name": "SDIT1BUB-SBU78"
+      },
+      {
+        "id": "ATL2",
+        "name": "ATLNGANW-ATL2"
+      },
+      {
+        "id": "BOT1",
+        "name": "BOTHWAKY-BOT1"
+      },
+      {
+        "id": "SNG1",
+        "name": "SNGPSIAU-SNG1"
+      },
+      {
+        "id": "NYC1",
+        "name": "NYCMNY54-NYC1"
+      },
+      {
+        "id": "LAG1b",
+        "name": "LARGIZON-LAG1b"
+      },
+      {
+        "id": "AMD15",
+        "name": "AMDFAA01-AMD15"
+      },
+      {
+        "id": "SNA1",
+        "name": "SNANTXCA-SNA1"
+      },
+      {
+        "id": "PLT1",
+        "name": "PLTNCA60-PLT1"
+      },
+      {
+        "id": "TLP1",
+        "name": "TLPNXM18-TLP1"
+      },
+      {
+        "id": "SDD81",
+        "name": "SAIT1DD6-SDD81"
+      },
+      {
+        "id": "DCC1",
+        "name": "POIUYTGH-DCC1"
+      },
+      {
+        "id": "DCC2",
+        "name": "POIUYTGH-DCC2"
+      },
+      {
+        "id": "OKC1",
+        "name": "OKCBOK55-OKC1"
+      },
+      {
+        "id": "PAR1",
+        "name": "PARSFRCG-PAR1"
+      },
+      {
+        "id": "TES36",
+        "name": "ABCEETES-TES36"
+      },
+      {
+        "id": "COM1",
+        "name": "PLMKOPIU-COM1"
+      },
+      {
+        "id": "ANI1",
+        "name": "ATLNGTRE-ANI1"
+      },
+      {
+        "id": "SDG78",
+        "name": "SDIT1BDG-SDG78"
+      },
+      {
+        "id": "mac20",
+        "name": "PKGTESTF-mac20"
+      },
+      {
+        "id": "DSF45",
+        "name": "DSFBG123-DSF45"
+      },
+      {
+        "id": "HST25",
+        "name": "HSTNTX01-HST25"
+      },
+      {
+        "id": "AMD18",
+        "name": "AUDIMA01-AMD18"
+      },
+      {
+        "id": "SAA80",
+        "name": "SAIT9AA3-SAA80"
+      },
+      {
+        "id": "SSA56",
+        "name": "SSIT2AA7-SSA56"
+      },
+      {
+        "id": "SDD82",
+        "name": "SAIT1DD9-SDD82"
+      },
+      {
+        "id": "JCV1",
+        "name": "JCVLFLBW-JCV1"
+      },
+      {
+        "id": "SUL2",
+        "name": "WERTYUJK-SUL2"
+      },
+      {
+        "id": "PUR1",
+        "name": "purelyde-PUR1"
+      },
+      {
+        "id": "FDE55",
+        "name": "FDERT555-FDE55"
+      },
+      {
+        "id": "SITE",
+        "name": "LONEENCO-SITE"
+      },
+      {
+        "id": "ATL1",
+        "name": "ATLNGAMA-ATL1"
+      },
+      {
+        "id": "JUL1",
+        "name": "ZXCVBNMM-JUL1"
+      },
+      {
+        "id": "TAT34",
+        "name": "TESAAISB-TAT34"
+      },
+      {
+        "id": "XCP12",
+        "name": "CHKGH123-XCP12"
+      },
+      {
+        "id": "RAI1",
+        "name": "poiuytre-RAI1"
+      },
+      {
+        "id": "HPO1",
+        "name": "ATLNGAUP-HPO1"
+      },
+      {
+        "id": "KJF12",
+        "name": "KJFDH123-KJF12"
+      },
+      {
+        "id": "SCC80",
+        "name": "SAIT9CC3-SCC80"
+      },
+      {
+        "id": "SAA12",
+        "name": "SAIT9AF8-SAA12"
+      },
+      {
+        "id": "SAA14",
+        "name": "SAIT1AA9-SAA14"
+      },
+      {
+        "id": "ATL35",
+        "name": "TTESSAAI-ATL35"
+      },
+      {
+        "id": "CWY1",
+        "name": "CWYMOWBS-CWY1"
+      },
+      {
+        "id": "ATL76",
+        "name": "TELEPAAI-ATL76"
+      },
+      {
+        "id": "DSL12",
+        "name": "DSLFK242-DSL12"
+      },
+      {
+        "id": "ATL53",
+        "name": "AAIATLTE-ATL53"
+      },
+      {
+        "id": "SAA11",
+        "name": "SAIT9AA2-SAA11"
+      },
+      {
+        "id": "ATL62",
+        "name": "TESSASCH-ATL62"
+      },
+      {
+        "id": "AUG1",
+        "name": "ASDFGHJK-AUG1"
+      },
+      {
+        "id": "POI22",
+        "name": "POIUY123-POI22"
+      },
+      {
+        "id": "SAA13",
+        "name": "SAIT1AA9-SAA13"
+      },
+      {
+        "id": "BHY17",
+        "name": "BHYTFRF3-BHY17"
+      },
+      {
+        "id": "LIS1",
+        "name": "HOSTPROF-LIS1"
+      },
+      {
+        "id": "SIP1",
+        "name": "ZXCVBNMK-SIP1"
+      },
+      {
+        "id": "ATL99",
+        "name": "TEESTAAI-ATL43"
+      },
+      {
+        "id": "ATL64",
+        "name": "FORLOAAJ-ATL64"
+      },
+      {
+        "id": "TAT33",
+        "name": "TESAAISA-TAT33"
+      },
+      {
+        "id": "RAD10",
+        "name": "INDIPUNE-RAD10"
+      },
+      {
+        "id": "RTW5",
+        "name": "BHYTFRY4-RTW5"
+      },
+      {
+        "id": "JGS1",
+        "name": "KSJKKKKK-JGS1"
+      },
+      {
+        "id": "ATL98",
+        "name": "TEESTAAI-ATL43"
+      },
+      {
+        "id": "WAN1",
+        "name": "LEIWANGW-WAN1"
+      },
+      {
+        "id": "ATL44",
+        "name": "ATLSANAB-ATL44"
+      },
+      {
+        "id": "RTD2",
+        "name": "BHYTFRk4-RTD2"
+      },
+      {
+        "id": "NIR1",
+        "name": "ORFLMANA-NIR1"
+      },
+      {
+        "id": "ATL75",
+        "name": "SANAAIRE-ATL75"
+      },
+      {
+        "id": "NUM1",
+        "name": "QWERTYUI-NUM1"
+      },
+      {
+        "id": "MTN32",
+        "name": "MDTWNJ21-MTN32"
+      },
+      {
+        "id": "RTZ4",
+        "name": "BHYTFRZ6-RTZ4"
+      },
+      {
+        "id": "ATL56",
+        "name": "ATLSANAC-ATL56"
+      },
+      {
+        "id": "AMS1",
+        "name": "AMSTNLBW-AMS1"
+      },
+      {
+        "id": "RCT1",
+        "name": "AMSTERNL-RCT1"
+      },
+      {
+        "id": "JAN1",
+        "name": "ORFLMATT-JAN1"
+      },
+      {
+        "id": "ABC14",
+        "name": "TESAAISA-ABC14"
+      },
+      {
+        "id": "TAT37",
+        "name": "TESAAISD-TAT37"
+      },
+      {
+        "id": "MIC54",
+        "name": "MICHIGAN-MIC54"
+      },
+      {
+        "id": "ABC11",
+        "name": "ATLSANAI-ABC11"
+      },
+      {
+        "id": "AMF11",
+        "name": "AMDOCS01-AMF11"
+      },
+      {
+        "id": "ATL63",
+        "name": "ATLSANEW-ATL63"
+      },
+      {
+        "id": "ABC12",
+        "name": "ATLSECIA-ABC12"
+      },
+      {
+        "id": "MTN20",
+        "name": "MDTWNJ21-MTN20"
+      },
+      {
+        "id": "ABC15",
+        "name": "AAITESAN-ABC15"
+      },
+      {
+        "id": "AVT1",
+        "name": "AVTRFLHD-AVT1"
+      },
+      {
+        "id": "ATL34",
+        "name": "ATLSANAI-ATL34"
+      }
+    ],
+    "categoryParameters": {
+      "owningEntityList": [
+        {
+          "id": "aaa1",
+          "name": "aaa1"
+        },
+        {
+          "id": "d61e6f2d-12fa-4cc2-91df-7c244011d6fc",
+          "name": "MetroPacketCore"
+        },
+        {
+          "id": "Wireline",
+          "name": "Wireline"
+        }
+      ],
+      "projectList": [
+        {
+          "id": "DFW",
+          "name": "DFW"
+        },
+        {
+          "id": "x1",
+          "name": "x1"
+        },
+        {
+          "id": "yyy1",
+          "name": "yyy1"
+        }
+      ],
+      "lineOfBusinessList": [
+        {
+          "id": "ECOMP",
+          "name": "ECOMP"
+        },
+        {
+          "id": "zzz1",
+          "name": "zzz1"
+        }
+      ],
+      "platformList": [
+        {
+          "id": "platform",
+          "name": "platform"
+        },
+        {
+          "id": "xxx1",
+          "name": "xxx1"
+        }
+      ]
+    },
+    "type": "[PRODUCT_FAMILIES] Update"
+  }
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/subscribers.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/subscribers.json
new file mode 100644 (file)
index 0000000..088fbe7
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "customer": [
+    {
+      "global-customer-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "subscriber-name": "Mobility",
+      "subscriber-type": "INFRA",
+      "resource-version": "1494255056308",
+      "is-permitted": false
+    },
+    {
+      "global-customer-id": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc",
+      "subscriber-name": "PACKET CORE",
+      "subscriber-type": "INFRA",
+      "resource-version": "1506548476111",
+      "is-permitted": false
+    },
+    {
+      "global-customer-id": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "subscriber-name": "USP VOICE",
+      "subscriber-type": "INFRA",
+      "is-permitted": true
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/topMenuInfo.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/topMenuInfo.json
new file mode 100644 (file)
index 0000000..92627f4
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "contactUsLink": "https://wiki.web.att.com/display/EcompPortal/ECOMP+Portal+Home",
+  "firstName": "uspVoiceVirtualUsp",
+  "portalUrl": "https://www.e-access.att.com/ecomp_portal_dev_n1/ecompui/process_csp",
+  "getAccessUrl": "https://www.e-access.att.com/ecomp_portal_dev_n1/ecompui/get_access",
+  "userName": "uspVoiceVirtualUsp null",
+  "userid": "uspVoiceVirtualUsp"
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/zones.json b/vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/zones.json
new file mode 100644 (file)
index 0000000..de18d8b
--- /dev/null
@@ -0,0 +1,772 @@
+{
+  "zone": [
+    {
+      "zone-id": "NFT1",
+      "zone-name": "NFTJSSSS-NFT1"
+    },
+    {
+      "zone-id": "JAG1",
+      "zone-name": "YUDFJULP-JAG1"
+    },
+    {
+      "zone-id": "YYY1",
+      "zone-name": "UUUAIAAI-YYY1"
+    },
+    {
+      "zone-id": "BAN1",
+      "zone-name": "VSDKYUTP-BAN1"
+    },
+    {
+      "zone-id": "DKJ1",
+      "zone-name": "DKJSJDKA-DKJ1"
+    },
+    {
+      "zone-id": "MCS1",
+      "zone-name": "ASACMAMS-MCS1"
+    },
+    {
+      "zone-id": "UIO1",
+      "zone-name": "uioclli1-UIO1"
+    },
+    {
+      "zone-id": "RAJ1",
+      "zone-name": "YGBIJNLQ-RAJ1"
+    },
+    {
+      "zone-id": "OPA1",
+      "zone-name": "opaclli1-OPA1"
+    },
+    {
+      "zone-id": "SDE1",
+      "zone-name": "ZXCVBNMA-SDE1"
+    },
+    {
+      "zone-id": "VEN2",
+      "zone-name": "FGHJUHIL-VEN2"
+    },
+    {
+      "zone-id": "ORL1",
+      "zone-name": "ORLDFLMA-ORL1"
+    },
+    {
+      "zone-id": "JAD1",
+      "zone-name": "JADECLLI-JAD1"
+    },
+    {
+      "zone-id": "ZXL1",
+      "zone-name": "LWLWCANN-ZXL1"
+    },
+    {
+      "zone-id": "CKL1",
+      "zone-name": "CLKSKCKK-CKL1"
+    },
+    {
+      "zone-id": "SDF1",
+      "zone-name": "sdfclli1-SDF1"
+    },
+    {
+      "zone-id": "RAD1",
+      "zone-name": "RADICAL1-RAD1"
+    },
+    {
+      "zone-id": "KIT1",
+      "zone-name": "BHYJFGLN-KIT1"
+    },
+    {
+      "zone-id": "REL1",
+      "zone-name": "INGERFGT-REL1"
+    },
+    {
+      "zone-id": "JNL1",
+      "zone-name": "CJALSDAC-JNL1"
+    },
+    {
+      "zone-id": "OLK1",
+      "zone-name": "OLKOLKLS-OLK1"
+    },
+    {
+      "zone-id": "CHI1",
+      "zone-name": "CHILLIWE-CHI1"
+    },
+    {
+      "zone-id": "UUU4",
+      "zone-name": "UUUAAAUU-UUU4"
+    },
+    {
+      "zone-id": "TUF1",
+      "zone-name": "TUFCLLI1-TUF1"
+    },
+    {
+      "zone-id": "KJN1",
+      "zone-name": "CKALDKSA-KJN1"
+    },
+    {
+      "zone-id": "SAM1",
+      "zone-name": "SNDGCA64-SAN1"
+    },
+    {
+      "zone-id": "SCK1",
+      "zone-name": "SCKSCKSK-SCK1"
+    },
+    {
+      "zone-id": "HJH1",
+      "zone-name": "AOEEQQQD-HJH1"
+    },
+    {
+      "zone-id": "HGD1",
+      "zone-name": "SDFQWHGD-HGD1"
+    },
+    {
+      "zone-id": "KOR1",
+      "zone-name": "HYFLNBVT-KOR1"
+    },
+    {
+      "zone-id": "ATL43",
+      "zone-name": "AICLOCID-ATL43"
+    },
+    {
+      "zone-id": "ATL54",
+      "zone-name": "AICFTAAI-ATL54"
+    },
+    {
+      "zone-id": "ATL66",
+      "zone-name": "CLLIAAII-ATL66"
+    },
+    {
+      "zone-id": "VEL1",
+      "zone-name": "BNMLKUIK-VEL1"
+    },
+    {
+      "zone-id": "ICC1",
+      "zone-name": "SANJITAT-ICC1"
+    },
+    {
+      "zone-id": "MNT11",
+      "zone-name": "WSXEFBTH-MNT11"
+    },
+    {
+      "zone-id": "DEF2",
+      "zone-name": "WSBHGTYL-DEF2"
+    },
+    {
+      "zone-id": "MAD11",
+      "zone-name": "SDFQWGKL-MAD11"
+    },
+    {
+      "zone-id": "OLG1",
+      "zone-name": "OLHOLHOL-OLG1"
+    },
+    {
+      "zone-id": "GAR1",
+      "zone-name": "NGFVSJKO-GAR1"
+    },
+    {
+      "zone-id": "SAN22",
+      "zone-name": "GNVLSCTL-SAN22"
+    },
+    {
+      "zone-id": "HRG1",
+      "zone-name": "HRGHRGGS-HRG1"
+    },
+    {
+      "zone-id": "JCS1",
+      "zone-name": "JCSJSCJS-JCS1"
+    },
+    {
+      "zone-id": "DHA12",
+      "zone-name": "WSXEDECF-DHA12"
+    },
+    {
+      "zone-id": "HJE1",
+      "zone-name": "AOEEWWWD-HJE1"
+    },
+    {
+      "zone-id": "NCA1",
+      "zone-name": "NCANCANN-NCA1"
+    },
+    {
+      "zone-id": "IOP1",
+      "zone-name": "iopclli1-IOP1"
+    },
+    {
+      "zone-id": "RTY1",
+      "zone-name": "rtyclli1-RTY1"
+    },
+    {
+      "zone-id": "KAP1",
+      "zone-name": "HIOUYTRQ-KAP1"
+    },
+    {
+      "zone-id": "ZEN1",
+      "zone-name": "ZENCLLI1-ZEN1"
+    },
+    {
+      "zone-id": "HKA1",
+      "zone-name": "JAKHLASS-HKA1"
+    },
+    {
+      "zone-id": "CQK1",
+      "zone-name": "CQKSCAKK-CQK1"
+    },
+    {
+      "zone-id": "SAI1",
+      "zone-name": "UBEKQLPD-SAI1"
+    },
+    {
+      "zone-id": "ERT1",
+      "zone-name": "ertclli1-ERT1"
+    },
+    {
+      "zone-id": "IBB1",
+      "zone-name": "PLMKOIJU-IBB1"
+    },
+    {
+      "zone-id": "TIR2",
+      "zone-name": "PLKINHYI-TIR2"
+    },
+    {
+      "zone-id": "HSD1",
+      "zone-name": "CHASKCDS-HSD1"
+    },
+    {
+      "zone-id": "SLF78",
+      "zone-name": "SDCTLFN1-SLF78"
+    },
+    {
+      "zone-id": "SEE78",
+      "zone-name": "SDCTEEE4-SEE78"
+    },
+    {
+      "zone-id": "SAN13",
+      "zone-name": "TOKYJPFA-SAN13"
+    },
+    {
+      "zone-id": "SAA78",
+      "zone-name": "SDCTAAA1-SAA78"
+    },
+    {
+      "zone-id": "LUC1",
+      "zone-name": "ATLDFGYC-LUC1"
+    },
+    {
+      "zone-id": "AMD13",
+      "zone-name": "MEMATLAN-AMD13"
+    },
+    {
+      "zone-id": "TOR1",
+      "zone-name": "TOROONXN-TOR1"
+    },
+    {
+      "zone-id": "QWE1",
+      "zone-name": "QWECLLI1-QWE1"
+    },
+    {
+      "zone-id": "ZOG1",
+      "zone-name": "ZOGASTRO-ZOG1"
+    },
+    {
+      "zone-id": "CAL33",
+      "zone-name": "CALIFORN-CAL33"
+    },
+    {
+      "zone-id": "SHH78",
+      "zone-name": "SDIT1HHH-SHH78"
+    },
+    {
+      "zone-id": "DSA1",
+      "zone-name": "LKJHGFDS-DSA1"
+    },
+    {
+      "zone-id": "CLG1",
+      "zone-name": "CLGRABAD-CLG1"
+    },
+    {
+      "zone-id": "BNA1",
+      "zone-name": "BNARAGBK-BNA1"
+    },
+    {
+      "zone-id": "ATL84",
+      "zone-name": "CANTTCOC-ATL84"
+    },
+    {
+      "zone-id": "APP1",
+      "zone-name": "WBHGTYUI-APP1"
+    },
+    {
+      "zone-id": "RJN1",
+      "zone-name": "RJNRBZAW-RJN1"
+    },
+    {
+      "zone-id": "EHH78",
+      "zone-name": "SDCSHHH5-EHH78"
+    },
+    {
+      "zone-id": "mac10",
+      "zone-name": "PKGTESTF-mac10"
+    },
+    {
+      "zone-id": "SXB78",
+      "zone-name": "SDCTGXB1-SXB78"
+    },
+    {
+      "zone-id": "SAX78",
+      "zone-name": "SDCTAXG1-SAX78"
+    },
+    {
+      "zone-id": "SYD1",
+      "zone-name": "SYDNAUBV-SYD1"
+    },
+    {
+      "zone-id": "TOK1",
+      "zone-name": "TOKYJPFA-TOK1"
+    },
+    {
+      "zone-id": "KGM2",
+      "zone-name": "KGMTNC20-KGM2"
+    },
+    {
+      "zone-id": "DCC1b",
+      "zone-name": "POIUYTGH-DCC1b"
+    },
+    {
+      "zone-id": "SKK78",
+      "zone-name": "SDCTKKK1-SKK78"
+    },
+    {
+      "zone-id": "SGG78",
+      "zone-name": "SDCTGGG1-SGG78"
+    },
+    {
+      "zone-id": "SJJ78",
+      "zone-name": "SDCTJJJ1-SJJ78"
+    },
+    {
+      "zone-id": "SBX78",
+      "zone-name": "SDCTBXG1-SBX78"
+    },
+    {
+      "zone-id": "LAG1",
+      "zone-name": "LARGIZON-LAG1"
+    },
+    {
+      "zone-id": "IAA1",
+      "zone-name": "QAZXSWED-IAA1"
+    },
+    {
+      "zone-id": "POI1",
+      "zone-name": "PLMNJKIU-POI1"
+    },
+    {
+      "zone-id": "LAG1a",
+      "zone-name": "LARGIZON-LAG1a"
+    },
+    {
+      "zone-id": "PBL1",
+      "zone-name": "PBLAPBAI-PBL1"
+    },
+    {
+      "zone-id": "LAG45",
+      "zone-name": "LARGIZON-LAG1a"
+    },
+    {
+      "zone-id": "MAR1",
+      "zone-name": "MNBVCXZM-MAR1"
+    },
+    {
+      "zone-id": "HST70",
+      "zone-name": "HSTNTX70-HST70"
+    },
+    {
+      "zone-id": "DCC1a",
+      "zone-name": "POIUYTGH-DCC1a"
+    },
+    {
+      "zone-id": "TOL1",
+      "zone-name": "TOLDOH21-TOL1"
+    },
+    {
+      "zone-id": "LON1",
+      "zone-name": "LONEENCO-LON1"
+    },
+    {
+      "zone-id": "SJU78",
+      "zone-name": "SDIT1JUB-SJU78"
+    },
+    {
+      "zone-id": "STN27",
+      "zone-name": "HSTNTX01-STN27"
+    },
+    {
+      "zone-id": "SSW56",
+      "zone-name": "ss8126GT-SSW56"
+    },
+    {
+      "zone-id": "SBB78",
+      "zone-name": "SDIT1BBB-SBB78"
+    },
+    {
+      "zone-id": "DCC3",
+      "zone-name": "POIUYTGH-DCC3"
+    },
+    {
+      "zone-id": "GNV1",
+      "zone-name": "GNVLSCTL-GNV1"
+    },
+    {
+      "zone-id": "WAS1",
+      "zone-name": "WASHDCSW-WAS1"
+    },
+    {
+      "zone-id": "TOY1",
+      "zone-name": "TORYONNZ-TOY1"
+    },
+    {
+      "zone-id": "STT1",
+      "zone-name": "STTLWA02-STT1"
+    },
+    {
+      "zone-id": "STG1",
+      "zone-name": "STTGGE62-STG1"
+    },
+    {
+      "zone-id": "SLL78",
+      "zone-name": "SDCTLLL1-SLL78"
+    },
+    {
+      "zone-id": "SBU78",
+      "zone-name": "SDIT1BUB-SBU78"
+    },
+    {
+      "zone-id": "ATL2",
+      "zone-name": "ATLNGANW-ATL2"
+    },
+    {
+      "zone-id": "BOT1",
+      "zone-name": "BOTHWAKY-BOT1"
+    },
+    {
+      "zone-id": "SNG1",
+      "zone-name": "SNGPSIAU-SNG1"
+    },
+    {
+      "zone-id": "NYC1",
+      "zone-name": "NYCMNY54-NYC1"
+    },
+    {
+      "zone-id": "LAG1b",
+      "zone-name": "LARGIZON-LAG1b"
+    },
+    {
+      "zone-id": "AMD15",
+      "zone-name": "AMDFAA01-AMD15"
+    },
+    {
+      "zone-id": "SNA1",
+      "zone-name": "SNANTXCA-SNA1"
+    },
+    {
+      "zone-id": "PLT1",
+      "zone-name": "PLTNCA60-PLT1"
+    },
+    {
+      "zone-id": "TLP1",
+      "zone-name": "TLPNXM18-TLP1"
+    },
+    {
+      "zone-id": "SDD81",
+      "zone-name": "SAIT1DD6-SDD81"
+    },
+    {
+      "zone-id": "DCC1",
+      "zone-name": "POIUYTGH-DCC1"
+    },
+    {
+      "zone-id": "DCC2",
+      "zone-name": "POIUYTGH-DCC2"
+    },
+    {
+      "zone-id": "OKC1",
+      "zone-name": "OKCBOK55-OKC1"
+    },
+    {
+      "zone-id": "PAR1",
+      "zone-name": "PARSFRCG-PAR1"
+    },
+    {
+      "zone-id": "TES36",
+      "zone-name": "ABCEETES-TES36"
+    },
+    {
+      "zone-id": "COM1",
+      "zone-name": "PLMKOPIU-COM1"
+    },
+    {
+      "zone-id": "ANI1",
+      "zone-name": "ATLNGTRE-ANI1"
+    },
+    {
+      "zone-id": "SDG78",
+      "zone-name": "SDIT1BDG-SDG78"
+    },
+    {
+      "zone-id": "mac20",
+      "zone-name": "PKGTESTF-mac20"
+    },
+    {
+      "zone-id": "DSF45",
+      "zone-name": "DSFBG123-DSF45"
+    },
+    {
+      "zone-id": "HST25",
+      "zone-name": "HSTNTX01-HST25"
+    },
+    {
+      "zone-id": "AMD18",
+      "zone-name": "AUDIMA01-AMD18"
+    },
+    {
+      "zone-id": "SAA80",
+      "zone-name": "SAIT9AA3-SAA80"
+    },
+    {
+      "zone-id": "SSA56",
+      "zone-name": "SSIT2AA7-SSA56"
+    },
+    {
+      "zone-id": "SDD82",
+      "zone-name": "SAIT1DD9-SDD82"
+    },
+    {
+      "zone-id": "JCV1",
+      "zone-name": "JCVLFLBW-JCV1"
+    },
+    {
+      "zone-id": "SUL2",
+      "zone-name": "WERTYUJK-SUL2"
+    },
+    {
+      "zone-id": "PUR1",
+      "zone-name": "purelyde-PUR1"
+    },
+    {
+      "zone-id": "FDE55",
+      "zone-name": "FDERT555-FDE55"
+    },
+    {
+      "zone-id": "SITE",
+      "zone-name": "LONEENCO-SITE"
+    },
+    {
+      "zone-id": "ATL1",
+      "zone-name": "ATLNGAMA-ATL1"
+    },
+    {
+      "zone-id": "JUL1",
+      "zone-name": "ZXCVBNMM-JUL1"
+    },
+    {
+      "zone-id": "TAT34",
+      "zone-name": "TESAAISB-TAT34"
+    },
+    {
+      "zone-id": "XCP12",
+      "zone-name": "CHKGH123-XCP12"
+    },
+    {
+      "zone-id": "RAI1",
+      "zone-name": "poiuytre-RAI1"
+    },
+    {
+      "zone-id": "HPO1",
+      "zone-name": "ATLNGAUP-HPO1"
+    },
+    {
+      "zone-id": "KJF12",
+      "zone-name": "KJFDH123-KJF12"
+    },
+    {
+      "zone-id": "SCC80",
+      "zone-name": "SAIT9CC3-SCC80"
+    },
+    {
+      "zone-id": "SAA12",
+      "zone-name": "SAIT9AF8-SAA12"
+    },
+    {
+      "zone-id": "SAA14",
+      "zone-name": "SAIT1AA9-SAA14"
+    },
+    {
+      "zone-id": "ATL35",
+      "zone-name": "TTESSAAI-ATL35"
+    },
+    {
+      "zone-id": "CWY1",
+      "zone-name": "CWYMOWBS-CWY1"
+    },
+    {
+      "zone-id": "ATL76",
+      "zone-name": "TELEPAAI-ATL76"
+    },
+    {
+      "zone-id": "DSL12",
+      "zone-name": "DSLFK242-DSL12"
+    },
+    {
+      "zone-id": "ATL53",
+      "zone-name": "AAIATLTE-ATL53"
+    },
+    {
+      "zone-id": "SAA11",
+      "zone-name": "SAIT9AA2-SAA11"
+    },
+    {
+      "zone-id": "ATL62",
+      "zone-name": "TESSASCH-ATL62"
+    },
+    {
+      "zone-id": "AUG1",
+      "zone-name": "ASDFGHJK-AUG1"
+    },
+    {
+      "zone-id": "POI22",
+      "zone-name": "POIUY123-POI22"
+    },
+    {
+      "zone-id": "SAA13",
+      "zone-name": "SAIT1AA9-SAA13"
+    },
+    {
+      "zone-id": "BHY17",
+      "zone-name": "BHYTFRF3-BHY17"
+    },
+    {
+      "zone-id": "LIS1",
+      "zone-name": "HOSTPROF-LIS1"
+    },
+    {
+      "zone-id": "SIP1",
+      "zone-name": "ZXCVBNMK-SIP1"
+    },
+    {
+      "zone-id": "ATL99",
+      "zone-name": "TEESTAAI-ATL43"
+    },
+    {
+      "zone-id": "ATL64",
+      "zone-name": "FORLOAAJ-ATL64"
+    },
+    {
+      "zone-id": "TAT33",
+      "zone-name": "TESAAISA-TAT33"
+    },
+    {
+      "zone-id": "RAD10",
+      "zone-name": "INDIPUNE-RAD10"
+    },
+    {
+      "zone-id": "RTW5",
+      "zone-name": "BHYTFRY4-RTW5"
+    },
+    {
+      "zone-id": "JGS1",
+      "zone-name": "KSJKKKKK-JGS1"
+    },
+    {
+      "zone-id": "ATL98",
+      "zone-name": "TEESTAAI-ATL43"
+    },
+    {
+      "zone-id": "WAN1",
+      "zone-name": "LEIWANGW-WAN1"
+    },
+    {
+      "zone-id": "ATL44",
+      "zone-name": "ATLSANAB-ATL44"
+    },
+    {
+      "zone-id": "RTD2",
+      "zone-name": "BHYTFRk4-RTD2"
+    },
+    {
+      "zone-id": "NIR1",
+      "zone-name": "ORFLMANA-NIR1"
+    },
+    {
+      "zone-id": "ATL75",
+      "zone-name": "SANAAIRE-ATL75"
+    },
+    {
+      "zone-id": "NUM1",
+      "zone-name": "QWERTYUI-NUM1"
+    },
+    {
+      "zone-id": "MTN32",
+      "zone-name": "MDTWNJ21-MTN32"
+    },
+    {
+      "zone-id": "RTZ4",
+      "zone-name": "BHYTFRZ6-RTZ4"
+    },
+    {
+      "zone-id": "ATL56",
+      "zone-name": "ATLSANAC-ATL56"
+    },
+    {
+      "zone-id": "AMS1",
+      "zone-name": "AMSTNLBW-AMS1"
+    },
+    {
+      "zone-id": "RCT1",
+      "zone-name": "AMSTERNL-RCT1"
+    },
+    {
+      "zone-id": "JAN1",
+      "zone-name": "ORFLMATT-JAN1"
+    },
+    {
+      "zone-id": "ABC14",
+      "zone-name": "TESAAISA-ABC14"
+    },
+    {
+      "zone-id": "TAT37",
+      "zone-name": "TESAAISD-TAT37"
+    },
+    {
+      "zone-id": "MIC54",
+      "zone-name": "MICHIGAN-MIC54"
+    },
+    {
+      "zone-id": "ABC11",
+      "zone-name": "ATLSANAI-ABC11"
+    },
+    {
+      "zone-id": "AMF11",
+      "zone-name": "AMDOCS01-AMF11"
+    },
+    {
+      "zone-id": "ATL63",
+      "zone-name": "ATLSANEW-ATL63"
+    },
+    {
+      "zone-id": "ABC12",
+      "zone-name": "ATLSECIA-ABC12"
+    },
+    {
+      "zone-id": "MTN20",
+      "zone-name": "MDTWNJ21-MTN20"
+    },
+    {
+      "zone-id": "ABC15",
+      "zone-name": "AAITESAN-ABC15"
+    },
+    {
+      "zone-id": "AVT1",
+      "zone-name": "AVTRFLHD-AVT1"
+    },
+    {
+      "zone-id": "ATL34",
+      "zone-name": "ATLSANAI-ATL34"
+    }
+  ]
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/mocks/vid.mock.ts b/vid-webpack-master/cypress/support/jsonBuilders/mocks/vid.mock.ts
new file mode 100644 (file)
index 0000000..5bc02d1
--- /dev/null
@@ -0,0 +1,91 @@
+declare namespace Cypress {
+  interface Chainable {
+    initVidMock: typeof initVidMock;
+    preventErrorsOnLoading : typeof preventErrorsOnLoading;
+    initCategoryParameter : typeof initCategoryParameter;
+  }
+}
+
+function preventErrorsOnLoading() : void {
+  cy.on('uncaught:exception', (err, runnable) => {
+    return false
+  });
+}
+
+function initGetToMenuInfo(response? : JSON) : void {
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/topMenuInfo.json').then((res) => {
+      cy.server()
+        .route({
+          method: 'GET',
+          status : 200,
+          url : Cypress.config('baseUrl') + "/get_topMenuInfo",
+          response : response ? response : res
+        });
+    });
+
+}
+
+
+function initCategoryParameter(response? : JSON) : void {
+    cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/categoryParametres.json').then((res) => {
+      cy.server()
+        .route({
+          method: 'GET',
+          status : 200,
+          url : Cypress.config('baseUrl') + "/category_parameter**",
+          response : response ? response : res
+        });
+    })
+}
+
+function initFlags(response? : JSON, delay?: number, status?: number) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/flags.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        delay : delay ? delay : 0,
+        status : status ? status : 200,
+        url : Cypress.config('baseUrl') + "/flags**",
+        response : response ? response : res
+      }).as('initFlags');
+  })
+}
+
+function initAuditInfoVID(response? : JSON, delay?: number, status?: number) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/auditInfoVid.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        delay : delay ? delay : 0,
+        status : status ? status : 200,
+        url : Cypress.config('baseUrl') + "/asyncInstantiation/auditStatus/**?source=VID",
+        response : response ? response : res
+      }).as('initAuditInfoVID');
+  })
+}
+
+function initAuditInfoMSO(response? : JSON, delay?: number, status?: number) : void {
+  cy.readFile('/cypress/support/jsonBuilders/mocks/jsons/auditInfoMSO.json').then((res) => {
+    cy.server()
+      .route({
+        method: 'GET',
+        delay : delay ? delay : 0,
+        status : status ? status : 200,
+        url : Cypress.config('baseUrl') + "/asyncInstantiation/auditStatus/**?source=MSO",
+        response : response ? response : res
+      }).as('initAuditInfoMSO');
+  })
+}
+
+function initVidMock(): void {
+  initGetToMenuInfo();
+  initCategoryParameter();
+  initFlags();
+  initAuditInfoVID();
+  initAuditInfoMSO();
+}
+
+
+Cypress.Commands.add('initVidMock', initVidMock);
+Cypress.Commands.add('preventErrorsOnLoading', preventErrorsOnLoading);
+Cypress.Commands.add('initCategoryParameter', initCategoryParameter);
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/models/aaiSubDetails.model.ts b/vid-webpack-master/cypress/support/jsonBuilders/models/aaiSubDetails.model.ts
new file mode 100644 (file)
index 0000000..6f72b7f
--- /dev/null
@@ -0,0 +1,8 @@
+/// <reference types="Cypress" />
+export class AAISubDetailsModel{
+  "global-customer-id": string;
+  "subscriber-name": string;
+  "subscriber-type": string;
+  "resource-version": string;
+  "service-subscriptions": Object;
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/models/aaiSubViewEdit.model.ts b/vid-webpack-master/cypress/support/jsonBuilders/models/aaiSubViewEdit.model.ts
new file mode 100644 (file)
index 0000000..70a02aa
--- /dev/null
@@ -0,0 +1,5 @@
+/// <reference types="Cypress" />
+
+export class AAISubViewEditModel{
+  "inventory-response-item": Array<any>;
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/models/asyncInstantiation.model.ts b/vid-webpack-master/cypress/support/jsonBuilders/models/asyncInstantiation.model.ts
new file mode 100644 (file)
index 0000000..fa39436
--- /dev/null
@@ -0,0 +1,36 @@
+/// <reference types="Cypress" />
+
+export class AsyncInstantiationModel{
+  id: number;
+  created : number;
+  modified: number;
+  createdId : string;
+  modifiedId : string;
+  rowNum : string;
+  auditUserId : string;
+  auditTrail : string;
+  jobId : string;
+  templateId : string;
+  userId : string;
+  jobStatus : string;
+  statusModifiedDate: number;
+  hidden : boolean;
+  pause: boolean;
+  owningEntityId: string;
+  owningEntityName: string;
+  project: string;
+  aicZoneId: string;
+  aicZoneName: string;
+  tenantId: string;
+  tenantName: string;
+  regionId: string;
+  regionName: string;
+  serviceType: string;
+  subscriberName: string;
+  serviceInstanceId : number;
+  serviceInstanceName: string;
+  serviceModelId: string;
+  serviceModelName: string;
+  serviceModelVersion: string;
+  createdBulkDate: number;
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/models/pnf.model.ts b/vid-webpack-master/cypress/support/jsonBuilders/models/pnf.model.ts
new file mode 100644 (file)
index 0000000..9cc9795
--- /dev/null
@@ -0,0 +1,3 @@
+/// <reference types="Cypress" />
+export class PnfModel{
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/models/service.model.ts b/vid-webpack-master/cypress/support/jsonBuilders/models/service.model.ts
new file mode 100644 (file)
index 0000000..af12dfb
--- /dev/null
@@ -0,0 +1,27 @@
+/// <reference types="Cypress" />
+
+export class ServiceModel{
+  service: {
+    uuid: string;
+    invariantUuid: string;
+    name: string;
+    version: string;
+    toscaModelURL: string;
+    category: string;
+    serviceType: string;
+    serviceRole: string;
+    description: string;
+    serviceEcompNaming : string;
+    instantiationType: string;
+    inputs: Object;
+  };
+  vnfs: Object;
+  networks: Object;
+  collectionResource: Object;
+  configurations: Object;
+  serviceProxies: Object;
+  vfModules: Object;
+  volumeGroups: Object;
+  pnfs:Object;
+
+}
diff --git a/vid-webpack-master/cypress/support/jsonBuilders/models/serviceInstances.model.ts b/vid-webpack-master/cypress/support/jsonBuilders/models/serviceInstances.model.ts
new file mode 100644 (file)
index 0000000..1ac8df2
--- /dev/null
@@ -0,0 +1,4 @@
+/// <reference types="Cypress" />
+export class AaiServiceInstancesModel{
+  "service-instances": Array<Object>;
+}
diff --git a/vid-webpack-master/cypress/support/steps/login.step.ts b/vid-webpack-master/cypress/support/steps/login.step.ts
new file mode 100644 (file)
index 0000000..f35e6e6
--- /dev/null
@@ -0,0 +1,43 @@
+// add new command to the existing Cypress interface
+declare namespace Cypress {
+  interface Chainable {
+    login: typeof login,
+    openIframe : typeof openIframe
+  }
+}
+
+let currentLoginCookies : any = null;
+
+
+function login(): void {
+  if(currentLoginCookies){
+    cy.setCookie('JSESSIONID', currentLoginCookies.value, {
+      expiry : currentLoginCookies.expiry,
+      path : currentLoginCookies.path,
+      domain : currentLoginCookies.domain
+    });
+  }else {
+    const constant = {
+      "LOGIN_ID" : "#loginId",
+      "PASSWORD_ID" : "#password",
+      "LOGIN_BTN_ID" : "#loginBtn"
+    };
+
+    cy.visit('/login_external.htm');
+    cy.get(constant.LOGIN_ID).type("us16807000")
+      .get(constant.PASSWORD_ID).type("us16807000")
+      .get(constant.LOGIN_BTN_ID).click();
+
+    cy.getCookie("JSESSIONID").then((res) => {
+      currentLoginCookies = res;
+    });
+  }
+
+}
+
+function openIframe(iframeUrl : string): void {
+  cy.visit(iframeUrl);
+}
+
+Cypress.Commands.add('login', login);
+Cypress.Commands.add('openIframe', openIframe);
diff --git a/vid-webpack-master/cypress/tsconfig.json b/vid-webpack-master/cypress/tsconfig.json
new file mode 100644 (file)
index 0000000..1e316ff
--- /dev/null
@@ -0,0 +1,16 @@
+{
+  "compilerOptions": {
+    "strict": true,
+    "baseUrl": "../node_modules",
+    "target": "es5",
+    "lib": ["es5", "dom"],
+    "types": ["cypress"]
+  },
+  "extends": "../tsconfig.json",
+  "include": [
+    "../node_modules/cypress/types",
+    "**/*.e2e.ts",
+    "./integration/**/*.ts",
+    "./support/**/*.ts"
+  ]
+}
diff --git a/vid-webpack-master/karma.conf.js b/vid-webpack-master/karma.conf.js
new file mode 100644 (file)
index 0000000..6c05760
--- /dev/null
@@ -0,0 +1,37 @@
+module.exports = function (config) {
+  config.set({
+    basePath: '',
+    frameworks: ['jasmine', '@angular/cli'],
+    plugins: [
+      require('karma-jasmine'),
+      require('karma-chrome-launcher'),
+      require('karma-jasmine-html-reporter'),
+      require('karma-coverage-istanbul-reporter'),
+      require('karma-junit-reporter'),
+      require('karma-phantomjs-launcher'),
+      require('@angular/cli/plugins/karma')
+    ],
+    client:{
+      clearContext: false // leave Jasmine Spec Runner output visible in browser
+    },
+    coverageIstanbulReporter: {
+      reports: [ 'html','json', 'lcovonly' ],
+      fixWebpackSourcePaths: true
+    },
+    angularCli: {
+      environment: 'dev'
+    },
+    reporters: ['progress', 'junit'],
+    port: 9876,
+    colors: true,
+    logLevel: config.LOG_ERROR,
+    autoWatch: false,
+    browsers: ['PhantomJS'],
+    junitReporter: {
+      outputFile: '../test-resultskarma.xml',
+      outputDir : 'coverage',
+      suite : ''
+    },
+    singleRun: true
+  });
+}
diff --git a/vid-webpack-master/package-lock.json b/vid-webpack-master/package-lock.json
new file mode 100644 (file)
index 0000000..2e2adc0
--- /dev/null
@@ -0,0 +1,18190 @@
+{
+  "name": "vid-cli",
+  "version": "0.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@angular-devkit/build-optimizer": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz",
+      "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "source-map": "0.5.7",
+        "typescript": "2.6.2",
+        "webpack-sources": "1.1.0"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
+          "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+          "dev": true
+        }
+      }
+    },
+    "@angular-devkit/core": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz",
+      "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.2",
+        "chokidar": "1.7.0",
+        "rxjs": "5.5.6",
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        }
+      }
+    },
+    "@angular-devkit/schematics": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz",
+      "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==",
+      "dev": true,
+      "requires": {
+        "@ngtools/json-schema": "1.2.0",
+        "rxjs": "5.5.6"
+      }
+    },
+    "@angular-redux/store": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/@angular-redux/store/-/store-7.1.1.tgz",
+      "integrity": "sha512-Uhj+wzByvQ04j6hh75xYdUMfi/sA71OLcxMl0U8uhfEGsM13GaLmf1cheDfaAMNv04KKNqj72Gdb1j+Ov2S2Nw=="
+    },
+    "@angular/animations": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.0.tgz",
+      "integrity": "sha512-JLR42YHiJppO4ruAkFxgbzghUDtHkXHkKPM8udd2qyt16T7e1OX7EEOrrmldUu59CC56tZnJ/32p4SrYmxyBSA==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/cdk": {
+      "version": "2.0.0-beta.12",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-2.0.0-beta.12.tgz",
+      "integrity": "sha1-OiQ8tiuT9OA5EgunD5ANyeI1Yi4=",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/cli": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.2.tgz",
+      "integrity": "sha512-U0RXiG6rNe5GqZazn+FLy3p4rOhBwpf5NWAec/JKe+u/cekIsyeDXLfqGJwzLhMEV4Iv2k4i3o5imejkEc4A9g==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/build-optimizer": "0.3.2",
+        "@angular-devkit/core": "0.3.2",
+        "@angular-devkit/schematics": "0.3.2",
+        "@ngtools/json-schema": "1.2.0",
+        "@ngtools/webpack": "1.10.1",
+        "@schematics/angular": "0.3.2",
+        "@schematics/package-update": "0.3.2",
+        "ajv": "6.3.0",
+        "autoprefixer": "7.2.6",
+        "cache-loader": "1.2.2",
+        "chalk": "2.2.2",
+        "circular-dependency-plugin": "4.4.0",
+        "clean-css": "4.1.11",
+        "common-tags": "1.7.2",
+        "copy-webpack-plugin": "4.4.3",
+        "core-object": "3.1.5",
+        "denodeify": "1.2.1",
+        "ember-cli-string-utils": "1.1.0",
+        "extract-text-webpack-plugin": "3.0.2",
+        "file-loader": "1.1.11",
+        "fs-extra": "4.0.3",
+        "glob": "7.1.2",
+        "html-webpack-plugin": "2.30.1",
+        "istanbul-instrumenter-loader": "3.0.0",
+        "karma-source-map-support": "1.2.0",
+        "less": "2.7.3",
+        "less-loader": "4.1.0",
+        "license-webpack-plugin": "1.3.0",
+        "loader-utils": "1.1.0",
+        "lodash": "4.17.5",
+        "memory-fs": "0.4.1",
+        "minimatch": "3.0.4",
+        "node-modules-path": "1.0.1",
+        "node-sass": "4.7.2",
+        "nopt": "4.0.1",
+        "opn": "5.1.0",
+        "portfinder": "1.0.13",
+        "postcss": "6.0.20",
+        "postcss-import": "11.1.0",
+        "postcss-loader": "2.1.2",
+        "postcss-url": "7.3.1",
+        "raw-loader": "0.5.1",
+        "resolve": "1.5.0",
+        "rxjs": "5.5.6",
+        "sass-loader": "6.0.7",
+        "semver": "5.5.0",
+        "silent-error": "1.1.0",
+        "source-map-support": "0.4.18",
+        "style-loader": "0.19.1",
+        "stylus": "0.54.5",
+        "stylus-loader": "3.0.2",
+        "uglifyjs-webpack-plugin": "1.2.4",
+        "url-loader": "0.6.2",
+        "webpack": "3.11.0",
+        "webpack-dev-middleware": "1.12.2",
+        "webpack-dev-server": "2.11.2",
+        "webpack-merge": "4.1.2",
+        "webpack-sources": "1.1.0",
+        "webpack-subresource-integrity": "1.0.4"
+      }
+    },
+    "@angular/common": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.0.tgz",
+      "integrity": "sha512-yMFn2isC7/XOs56/2Kzzbb1AASHiwipAPOVFtKe7TdZQClO8fJXwCnk326rzr615+CG0eSBNQWeiFGyWN2riBA==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/compiler": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.0.tgz",
+      "integrity": "sha512-RfYa4ESgjGX0T0ob/Xz00IF7nd2xZkoyRy6oKgL82q42uzB3xZUDMrFNgeGxAUs3H22IkL46/5SSPOMOTMZ0NA==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/compiler-cli": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.0.tgz",
+      "integrity": "sha512-+Kef4NjuHwLj2hRPdVo4yAtPmv+kn0Nu/ShmKfaEK4mt9aaQMFxKNt6beUuDK5iUPMB5nuTCZ4bqEFpqd+EtxQ==",
+      "dev": true,
+      "requires": {
+        "chokidar": "1.7.0",
+        "minimist": "1.2.0",
+        "reflect-metadata": "0.1.12",
+        "tsickle": "0.26.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "@angular/core": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.0.tgz",
+      "integrity": "sha512-s2ne45DguNUubhC1YgybGECC4Tyx3G4EZCntUiRMDWWkmKXSK+6dgHMesyDo8R5Oat8VfN4Anf8l3JHS1He8kg==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/forms": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.0.tgz",
+      "integrity": "sha512-g1/SF9lY0ZwzJ0w4NXbFsTGGEuUdgtaZny8DmkaqtmA7idby3FW398X0tv25KQfVYKtL+p9Jp1Y8EI0CvrIsvw==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/http": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.0.tgz",
+      "integrity": "sha512-V5Cl24dP3rCXTTQvDc0TIKoWqBRAa0DWAQbtr7iuDAt5a1vPGdKz5K1sEiiV6ziwX6gzjiwHjUvL+B+WbIUrQA==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/language-service": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.0.tgz",
+      "integrity": "sha512-Yj/y5XrBBXbtwnZ6HJOBl/0XS/JBvVlHb1UWw5MIrsc81k7/eFiRAIKzmGpAba+Sw0G0dO22ABZ4yJjAMsML6A==",
+      "dev": true
+    },
+    "@angular/platform-browser": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.0.tgz",
+      "integrity": "sha512-c6cR15MfopPwGZ097HdRuAi9+R9BhA3bRRFpP2HmrSSB/BW4ZNovUYwB2QUMSYbd9s0lYTtnavqGm6DKcyF2QA==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/platform-browser-dynamic": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.0.tgz",
+      "integrity": "sha512-xG1eNoi8sm4Jcly2y98r5mqYVe3XV8sUJCtOhvGBYtvt4dKEQ5tOns6fWQ0nUbl6Vv3Y0xgGUS1JCtfut3DuaQ==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angular/router": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.0.tgz",
+      "integrity": "sha512-VXDXtp2A1GQEUEhXg0ZzqHdTUERLgDSo3/Mmpzt+dgLMKlXDSCykcm4gINwE5VQLGD1zQvDFCCRv3seGRNfrqA==",
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "@angularclass/hmr": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@angularclass/hmr/-/hmr-2.1.3.tgz",
+      "integrity": "sha1-NOZY7T2jfyOwogDi2lqJvpK7IJ8="
+    },
+    "@angularclass/hmr-loader": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@angularclass/hmr-loader/-/hmr-loader-3.0.4.tgz",
+      "integrity": "sha1-PjoHuoNWUMkBVim44Yf+jc1VJ7g=",
+      "requires": {
+        "loader-utils": "1.1.0"
+      }
+    },
+    "@bahmutov/add-typescript-to-cypress": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@bahmutov/add-typescript-to-cypress/-/add-typescript-to-cypress-2.0.0.tgz",
+      "integrity": "sha512-tnM/bBrvOHAXvTD6WAnbkwi9Su6WXiuOBhDsNr9SLu42Ne6DjRKHZdxo8Ros6kToEoh+Pe2E6dP9u0QEDfMABg==",
+      "dev": true,
+      "requires": {
+        "@cypress/webpack-preprocessor": "1.1.3",
+        "am-i-a-dependency": "1.1.2",
+        "chalk": "2.3.0",
+        "debug": "3.1.0",
+        "shelljs": "0.8.0",
+        "terminal-banner": "1.1.0",
+        "ts-loader": "3.2.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+          "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "4.5.0"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "shelljs": {
+          "version": "0.8.0",
+          "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.0.tgz",
+          "integrity": "sha512-wb72o5SM27oFRq2mMeNSl70DVkkvwf3ZSgk9rvieRVz7xFMIQp02HYw0oxlZgeAWS+wzGB+jcJWQTF7hH9WIPg==",
+          "dev": true,
+          "requires": {
+            "glob": "7.1.2",
+            "interpret": "1.1.0",
+            "rechoir": "0.6.2"
+          }
+        }
+      }
+    },
+    "@cypress/listr-verbose-renderer": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz",
+      "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-cursor": "1.0.2",
+        "date-fns": "1.29.0",
+        "figures": "1.7.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "cli-cursor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "1.0.1"
+          }
+        },
+        "figures": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "1.0.5",
+            "object-assign": "4.1.1"
+          }
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+          "dev": true
+        },
+        "restore-cursor": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+          "dev": true,
+          "requires": {
+            "exit-hook": "1.1.1",
+            "onetime": "1.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "@cypress/webpack-preprocessor": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-1.1.3.tgz",
+      "integrity": "sha512-guldaqrDN2+tINtgedExYKOO5lIl7ieacFb5V6vAqm7UgaLGguld7hm3lYip6HhfkVhE+gentdJ7yZeH36WChw==",
+      "dev": true,
+      "requires": {
+        "babel-core": "6.26.0",
+        "babel-loader": "7.1.2",
+        "babel-preset-env": "1.6.0",
+        "babel-preset-react": "6.24.1",
+        "bluebird": "3.5.0",
+        "debug": "3.1.0",
+        "lodash.clonedeep": "4.5.0",
+        "webpack": "3.6.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "ajv-keywords": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+          "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "babel-loader": {
+          "version": "7.1.2",
+          "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz",
+          "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==",
+          "dev": true,
+          "requires": {
+            "find-cache-dir": "1.0.0",
+            "loader-utils": "1.1.0",
+            "mkdirp": "0.5.1"
+          }
+        },
+        "babel-preset-env": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz",
+          "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==",
+          "dev": true,
+          "requires": {
+            "babel-plugin-check-es2015-constants": "6.22.0",
+            "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+            "babel-plugin-transform-async-to-generator": "6.24.1",
+            "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+            "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+            "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+            "babel-plugin-transform-es2015-classes": "6.24.1",
+            "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+            "babel-plugin-transform-es2015-destructuring": "6.23.0",
+            "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+            "babel-plugin-transform-es2015-for-of": "6.23.0",
+            "babel-plugin-transform-es2015-function-name": "6.24.1",
+            "babel-plugin-transform-es2015-literals": "6.22.0",
+            "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+            "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+            "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+            "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+            "babel-plugin-transform-es2015-object-super": "6.24.1",
+            "babel-plugin-transform-es2015-parameters": "6.24.1",
+            "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+            "babel-plugin-transform-es2015-spread": "6.22.0",
+            "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+            "babel-plugin-transform-es2015-template-literals": "6.22.0",
+            "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+            "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+            "babel-plugin-transform-exponentiation-operator": "6.24.1",
+            "babel-plugin-transform-regenerator": "6.26.0",
+            "browserslist": "2.11.3",
+            "invariant": "2.2.4",
+            "semver": "5.5.0"
+          }
+        },
+        "bluebird": {
+          "version": "3.5.0",
+          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
+          "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+          "dev": true,
+          "requires": {
+            "center-align": "0.1.3",
+            "right-align": "0.1.3",
+            "wordwrap": "0.0.2"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "parse-json": "2.2.0",
+            "pify": "2.3.0",
+            "strip-bom": "3.0.0"
+          }
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+          "dev": true,
+          "requires": {
+            "execa": "0.7.0",
+            "lcid": "1.0.0",
+            "mem": "1.1.0"
+          }
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "2.3.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "2.0.0",
+            "normalize-package-data": "2.4.0",
+            "path-type": "2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "dev": true,
+          "requires": {
+            "find-up": "2.1.0",
+            "read-pkg": "2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "dev": true,
+          "requires": {
+            "is-fullwidth-code-point": "2.0.0",
+            "strip-ansi": "4.0.0"
+          },
+          "dependencies": {
+            "is-fullwidth-code-point": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+              "dev": true
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "3.0.0"
+              }
+            }
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        },
+        "uglify-js": {
+          "version": "2.8.29",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+          "dev": true,
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-to-browserify": "1.0.2",
+            "yargs": "3.10.0"
+          },
+          "dependencies": {
+            "yargs": {
+              "version": "3.10.0",
+              "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+              "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+              "dev": true,
+              "requires": {
+                "camelcase": "1.2.1",
+                "cliui": "2.1.0",
+                "decamelize": "1.2.0",
+                "window-size": "0.1.0"
+              }
+            }
+          }
+        },
+        "uglifyjs-webpack-plugin": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
+          "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+          "dev": true,
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-js": "2.8.29",
+            "webpack-sources": "1.1.0"
+          }
+        },
+        "webpack": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz",
+          "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==",
+          "dev": true,
+          "requires": {
+            "acorn": "5.5.3",
+            "acorn-dynamic-import": "2.0.2",
+            "ajv": "5.5.2",
+            "ajv-keywords": "2.1.1",
+            "async": "2.6.0",
+            "enhanced-resolve": "3.4.1",
+            "escope": "3.6.0",
+            "interpret": "1.1.0",
+            "json-loader": "0.5.7",
+            "json5": "0.5.1",
+            "loader-runner": "2.3.0",
+            "loader-utils": "1.1.0",
+            "memory-fs": "0.4.1",
+            "mkdirp": "0.5.1",
+            "node-libs-browser": "2.1.0",
+            "source-map": "0.5.7",
+            "supports-color": "4.5.0",
+            "tapable": "0.2.8",
+            "uglifyjs-webpack-plugin": "0.4.6",
+            "watchpack": "1.5.0",
+            "webpack-sources": "1.1.0",
+            "yargs": "8.0.2"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "dev": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "8.0.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+          "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+          "dev": true,
+          "requires": {
+            "camelcase": "4.1.0",
+            "cliui": "3.2.0",
+            "decamelize": "1.2.0",
+            "get-caller-file": "1.0.2",
+            "os-locale": "2.1.0",
+            "read-pkg-up": "2.0.0",
+            "require-directory": "2.1.1",
+            "require-main-filename": "1.0.1",
+            "set-blocking": "2.0.0",
+            "string-width": "2.1.1",
+            "which-module": "2.0.0",
+            "y18n": "3.2.1",
+            "yargs-parser": "7.0.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+              "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+              "dev": true
+            },
+            "cliui": {
+              "version": "3.2.0",
+              "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+              "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+              "dev": true,
+              "requires": {
+                "string-width": "1.0.2",
+                "strip-ansi": "3.0.1",
+                "wrap-ansi": "2.1.0"
+              },
+              "dependencies": {
+                "string-width": {
+                  "version": "1.0.2",
+                  "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                  "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                  "dev": true,
+                  "requires": {
+                    "code-point-at": "1.1.0",
+                    "is-fullwidth-code-point": "1.0.0",
+                    "strip-ansi": "3.0.1"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "yargs-parser": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+          "dev": true,
+          "requires": {
+            "camelcase": "4.1.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+              "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "@cypress/xvfb": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.1.3.tgz",
+      "integrity": "sha512-EfRzw+wgI0Zdb4ZlhSvjh3q7I+oenqEYPXvr7oH/2RnzQqGDrPr7IU1Pi2yzGwoXmkNUQbo6qvntnItvQj0F4Q==",
+      "dev": true,
+      "requires": {
+        "lodash.once": "4.1.1"
+      }
+    },
+    "@harmowatch/ngx-redux-core": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/@harmowatch/ngx-redux-core/-/ngx-redux-core-0.2.2.tgz",
+      "integrity": "sha512-68I2L8Qe49ApUtezKtiNThcpIfnXAbHanxSJDLm9wQvAL4jBrQVN7K+DthGjO++THCQBHP1U64HHW8KVTRkqhw==",
+      "requires": {
+        "@harmowatch/redux-decorators": "0.1.0",
+        "tslib": "1.9.0"
+      }
+    },
+    "@harmowatch/redux-decorators": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/@harmowatch/redux-decorators/-/redux-decorators-0.1.0.tgz",
+      "integrity": "sha512-BWpYM+8TYYO2N/gceHcEZVyri1KJ/P3fBfahi8YfyaR+2rQ7cHEWHh/cHciaIt0ceRSX3R1H5zNmo8AYnmYqaA=="
+    },
+    "@ngtools/json-schema": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz",
+      "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==",
+      "dev": true
+    },
+    "@ngtools/webpack": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.1.tgz",
+      "integrity": "sha512-Pa2FUy9n2Pu7kkTho6ADfHyypTmDMY8/HT7y9G3tZdaEsS7CjFMdchN5Dx+TCATGVh+G6FLS2mjgXBiGVTmbWw==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.2.2",
+        "enhanced-resolve": "3.4.1",
+        "loader-utils": "1.1.0",
+        "magic-string": "0.22.5",
+        "semver": "5.5.0",
+        "source-map": "0.5.7",
+        "tree-kill": "1.2.0",
+        "webpack-sources": "1.1.0"
+      }
+    },
+    "@nicky-lenaers/ngx-scroll-to": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-0.6.1.tgz",
+      "integrity": "sha512-K5Lffbnvr75VVrcxIM3F2+JX5Eh5cpsDqdcySsO9SLdsLZ0UdHfzoVjUab3452ocpTpNDfC5o24F2CtMx1ENfQ=="
+    },
+    "@schematics/angular": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz",
+      "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==",
+      "dev": true,
+      "requires": {
+        "typescript": "2.6.2"
+      },
+      "dependencies": {
+        "typescript": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
+          "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+          "dev": true
+        }
+      }
+    },
+    "@schematics/package-update": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz",
+      "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==",
+      "dev": true,
+      "requires": {
+        "rxjs": "5.5.6",
+        "semver": "5.5.0",
+        "semver-intersect": "1.3.1"
+      }
+    },
+    "@storybook/addon-actions": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-3.4.1.tgz",
+      "integrity": "sha512-mCpEbzex7WYkyIHn9QUnIz83IwMO9Zi4D2LC6c/0u42HzQdkmTJWnyEg4NY5Az/1WZZTtwe9aep/pLc+Zzokdw==",
+      "requires": {
+        "@storybook/components": "3.4.1",
+        "babel-runtime": "6.26.0",
+        "deep-equal": "1.0.1",
+        "glamor": "2.20.40",
+        "glamorous": "4.12.2",
+        "global": "4.3.2",
+        "make-error": "1.3.4",
+        "prop-types": "15.6.1",
+        "react-inspector": "2.3.0",
+        "uuid": "3.2.1"
+      }
+    },
+    "@storybook/addon-links": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-3.4.1.tgz",
+      "integrity": "sha512-yOVStezQO/VTTlxoqDdVu6CCI2kHBNdLD6lY9w1ly20b6J4hg2Cgy/d/VyPUKfM3fTkdAHeBFayg41KmR9lrMQ==",
+      "requires": {
+        "@storybook/components": "3.4.1",
+        "babel-runtime": "6.26.0",
+        "global": "4.3.2",
+        "prop-types": "15.6.1"
+      }
+    },
+    "@storybook/addons": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-3.4.1.tgz",
+      "integrity": "sha512-WFHwVnJq6zItotj89fGFtEJ/MPdbUaOXu0QsNUbM1Muqw/kVX7gVAwXDPllBJ5y1/42aAzsJCQ/WMdrD2M9Tcg=="
+    },
+    "@storybook/channel-postmessage": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-3.4.1.tgz",
+      "integrity": "sha512-3LhieYOBJFPi5JRFUCc0axSj28GWAJjnXSNKRsWoRy+oSnj/Ux56ywkGLuh20Mze9NoA45MIKvtrsTPq2UiEkw==",
+      "requires": {
+        "@storybook/channels": "3.4.1",
+        "global": "4.3.2",
+        "json-stringify-safe": "5.0.1"
+      }
+    },
+    "@storybook/channels": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-3.4.1.tgz",
+      "integrity": "sha512-D8q64LsAmjZ+MeMUr/j0r+a2M9mm5y1yXBGkbEzucI2e48RP4zcc9ZVNB8yqCDPwtQLDU6w2idFWcaJaZNHXQw=="
+    },
+    "@storybook/client-logger": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-3.4.1.tgz",
+      "integrity": "sha512-wGIdo9GxxZ8iRzjTD9IrOk5UycOm8cnxJfe1Pfw9G5pisthASsxBYeqSVI44K9WchV1fMSRZ4AKUPmpoJ1H+ww=="
+    },
+    "@storybook/components": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/components/-/components-3.4.1.tgz",
+      "integrity": "sha512-STu4EkkUWZgMb/Cbpdf3YUKcQVTqIpg+kEP9zG7519/Eg0OuBgRZ4qRr5jiDbLQMsaGS8oxwjhCoHufG903oZw==",
+      "requires": {
+        "glamor": "2.20.40",
+        "glamorous": "4.12.2",
+        "prop-types": "15.6.1"
+      }
+    },
+    "@storybook/core": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/core/-/core-3.4.1.tgz",
+      "integrity": "sha512-LGfJFaOjKKP2WQfVMcjxJ+Abv1DBJYmWcMXF1w5nt3sua/GYcidgFVj5txu6Ib44UZubp1iXXQAKr35T+iSNOg==",
+      "requires": {
+        "@storybook/addons": "3.4.1",
+        "@storybook/channel-postmessage": "3.4.1",
+        "@storybook/client-logger": "3.4.1",
+        "@storybook/node-logger": "3.4.1",
+        "@storybook/ui": "3.4.1",
+        "autoprefixer": "7.2.6",
+        "babel-runtime": "6.26.0",
+        "chalk": "2.3.2",
+        "commander": "2.15.0",
+        "css-loader": "0.28.11",
+        "dotenv": "5.0.1",
+        "events": "2.0.0",
+        "express": "4.16.3",
+        "file-loader": "1.1.11",
+        "global": "4.3.2",
+        "json-loader": "0.5.7",
+        "postcss-flexbugs-fixes": "3.3.0",
+        "postcss-loader": "2.1.2",
+        "prop-types": "15.6.1",
+        "qs": "6.5.1",
+        "serve-favicon": "2.5.0",
+        "shelljs": "0.8.1",
+        "style-loader": "0.20.3",
+        "url-loader": "0.6.2",
+        "webpack": "3.11.0",
+        "webpack-dev-middleware": "1.12.2",
+        "webpack-hot-middleware": "2.22.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+          "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.3.0"
+          }
+        },
+        "events": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/events/-/events-2.0.0.tgz",
+          "integrity": "sha512-r/M5YkNg9zwI8QbSf7tsDWWJvO3PGwZXyG7GpFAxtMASnHL2eblFd7iHiGPtyGKKFPZ59S63NeX10Ws6WqGDcg=="
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        },
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+        },
+        "style-loader": {
+          "version": "0.20.3",
+          "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.20.3.tgz",
+          "integrity": "sha512-2I7AVP73MvK33U7B9TKlYZAqdROyMXDYSMvHLX43qy3GCOaJNiV6i0v/sv9idWIaQ42Yn2dNv79Q5mKXbKhAZg==",
+          "requires": {
+            "loader-utils": "1.1.0",
+            "schema-utils": "0.4.5"
+          }
+        },
+        "supports-color": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+          "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "@storybook/mantra-core": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/@storybook/mantra-core/-/mantra-core-1.7.2.tgz",
+      "integrity": "sha512-GD4OYJ8GsayVhIg306sfgcKDk9j8YfuSKIAWvdB/g7IDlw0pDgueONALVEEE2XWJtCwcsUyDtCYzXFgCBWLEjA==",
+      "requires": {
+        "@storybook/react-komposer": "2.0.4",
+        "@storybook/react-simple-di": "1.3.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "@storybook/node-logger": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-3.4.1.tgz",
+      "integrity": "sha512-vnM2+TIubLLsU5pcqydjnbPnska6zYvPSKIOO7lKTsGV0DdmDy7myvUn+oSRPubVyMh8+uno1J+XTHzdRkhsXQ==",
+      "requires": {
+        "npmlog": "4.1.2"
+      }
+    },
+    "@storybook/podda": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@storybook/podda/-/podda-1.2.3.tgz",
+      "integrity": "sha512-g7dsdsn50AhlGZ8iIDKdF8bi7Am++iFOq+QN+hNKz3FvgLuf8Dz+mpC/BFl90eE9bEYxXqXKeMf87399Ec5Qhw==",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "immutable": "3.8.2"
+      }
+    },
+    "@storybook/react": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/react/-/react-3.4.1.tgz",
+      "integrity": "sha512-fBeHDwQPmsLcEPjEEDrOzBJMjbcidNms9aAtv8yo+pf8uvLMbe4nOxwt5/goKrj994wpqUrZ0gXXzarcQW59Vg==",
+      "requires": {
+        "@storybook/addon-actions": "3.4.1",
+        "@storybook/addon-links": "3.4.1",
+        "@storybook/addons": "3.4.1",
+        "@storybook/channel-postmessage": "3.4.1",
+        "@storybook/client-logger": "3.4.1",
+        "@storybook/core": "3.4.1",
+        "@storybook/node-logger": "3.4.1",
+        "@storybook/ui": "3.4.1",
+        "airbnb-js-shims": "1.4.1",
+        "babel-loader": "7.1.4",
+        "babel-plugin-macros": "2.2.0",
+        "babel-plugin-react-docgen": "1.9.0",
+        "babel-plugin-transform-regenerator": "6.26.0",
+        "babel-plugin-transform-runtime": "6.23.0",
+        "babel-preset-env": "1.6.1",
+        "babel-preset-minify": "0.3.0",
+        "babel-preset-react": "6.24.1",
+        "babel-preset-stage-0": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "case-sensitive-paths-webpack-plugin": "2.1.2",
+        "common-tags": "1.7.2",
+        "core-js": "2.5.5",
+        "dotenv-webpack": "1.5.5",
+        "find-cache-dir": "1.0.0",
+        "glamor": "2.20.40",
+        "glamorous": "4.12.2",
+        "global": "4.3.2",
+        "html-loader": "0.5.5",
+        "html-webpack-plugin": "2.30.1",
+        "json5": "0.5.1",
+        "lodash.flattendeep": "4.4.0",
+        "markdown-loader": "2.0.2",
+        "prop-types": "15.6.1",
+        "react-dev-utils": "5.0.1",
+        "redux": "3.7.2",
+        "uglifyjs-webpack-plugin": "1.2.4",
+        "util-deprecate": "1.0.2",
+        "webpack": "3.11.0",
+        "webpack-hot-middleware": "2.22.0"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.5.5",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+          "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
+        }
+      }
+    },
+    "@storybook/react-komposer": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@storybook/react-komposer/-/react-komposer-2.0.4.tgz",
+      "integrity": "sha1-wsDUp12bSpwMa0bxSrBQ9FitS7A=",
+      "requires": {
+        "@storybook/react-stubber": "1.0.1",
+        "babel-runtime": "6.26.0",
+        "hoist-non-react-statics": "1.2.0",
+        "lodash.pick": "4.4.0",
+        "shallowequal": "0.2.2"
+      }
+    },
+    "@storybook/react-simple-di": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@storybook/react-simple-di/-/react-simple-di-1.3.0.tgz",
+      "integrity": "sha512-RH6gPQaYMs/VzQX2dgbZU8DQMKFXVOv1ruohHjjNPys4q+YdqMFMDe5jOP1AUE3j9g01x0eW7bVjRawSpl++Ew==",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "create-react-class": "15.6.3",
+        "hoist-non-react-statics": "1.2.0",
+        "prop-types": "15.6.1"
+      }
+    },
+    "@storybook/react-stubber": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@storybook/react-stubber/-/react-stubber-1.0.1.tgz",
+      "integrity": "sha512-k+CHH+vA8bQfCmzBTtJsPkITFgD+C/w19KuByZ9WeEvNUFtnDaCqfP+Vp3/OR+3IAfAXYYOWolqPLxNPcEqEjw==",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "@storybook/ui": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-3.4.1.tgz",
+      "integrity": "sha512-OX/mnl3jQwZwt1wltFcmO+8yPJlZgeQ4sksKy/jmMqfnk4GFP+UVmg2KIDYhh6Xl2/H1xi14iAdH9Z36losrpw==",
+      "requires": {
+        "@storybook/components": "3.4.1",
+        "@storybook/mantra-core": "1.7.2",
+        "@storybook/podda": "1.2.3",
+        "@storybook/react-komposer": "2.0.4",
+        "babel-runtime": "6.26.0",
+        "deep-equal": "1.0.1",
+        "events": "2.0.0",
+        "fuse.js": "3.2.0",
+        "global": "4.3.2",
+        "keycode": "2.2.0",
+        "lodash.debounce": "4.0.8",
+        "lodash.pick": "4.4.0",
+        "lodash.sortby": "4.7.0",
+        "lodash.throttle": "4.1.1",
+        "prop-types": "15.6.1",
+        "qs": "6.5.1",
+        "react-fuzzy": "0.5.2",
+        "react-icons": "2.2.7",
+        "react-modal": "3.3.2",
+        "react-split-pane": "0.1.77",
+        "react-treebeard": "2.1.0"
+      },
+      "dependencies": {
+        "events": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/events/-/events-2.0.0.tgz",
+          "integrity": "sha512-r/M5YkNg9zwI8QbSf7tsDWWJvO3PGwZXyG7GpFAxtMASnHL2eblFd7iHiGPtyGKKFPZ59S63NeX10Ws6WqGDcg=="
+        },
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+        }
+      }
+    },
+    "@types/blob-util": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@types/blob-util/-/blob-util-1.3.3.tgz",
+      "integrity": "sha512-4ahcL/QDnpjWA2Qs16ZMQif7HjGP2cw3AGjHabybjw7Vm1EKu+cfQN1D78BaZbS1WJNa1opSMF5HNMztx7lR0w==",
+      "dev": true
+    },
+    "@types/bluebird": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.18.tgz",
+      "integrity": "sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w==",
+      "dev": true
+    },
+    "@types/chai": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz",
+      "integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww==",
+      "dev": true
+    },
+    "@types/chai-jquery": {
+      "version": "1.1.35",
+      "resolved": "https://registry.npmjs.org/@types/chai-jquery/-/chai-jquery-1.1.35.tgz",
+      "integrity": "sha512-7aIt9QMRdxuagLLI48dPz96YJdhu64p6FCa6n4qkGN5DQLHnrIjZpD9bXCvV2G0NwgZ1FAmfP214dxc5zNCfgQ==",
+      "dev": true,
+      "requires": {
+        "@types/chai": "4.1.3",
+        "@types/jquery": "3.2.16"
+      }
+    },
+    "@types/cypress": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@types/cypress/-/cypress-1.1.3.tgz",
+      "integrity": "sha512-OXe0Gw8LeCflkG1oPgFpyrYWJmEKqYncBsD/J0r17r0ETx/TnIGDNLwXt/pFYSYuYTpzcq1q3g62M9DrfsBL4g==",
+      "dev": true,
+      "requires": {
+        "cypress": "2.1.0"
+      }
+    },
+    "@types/jasmine": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.3.tgz",
+      "integrity": "sha512-BN0ho2/U55Td9k8RT2KqonDNmWZHTl1crIk8GIh+xNeCw8A60GMCIKN5a6u/Voz3pF3zzl3Ui+ldGrGxCSsYQw==",
+      "dev": true
+    },
+    "@types/jasminewd2": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.2.tgz",
+      "integrity": "sha1-X2jh5pe/ELxv2Mvy4Aaj1nEsW2Q=",
+      "dev": true,
+      "requires": {
+        "@types/jasmine": "2.8.3"
+      }
+    },
+    "@types/jquery": {
+      "version": "3.2.16",
+      "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.2.16.tgz",
+      "integrity": "sha512-q2WC02YxQoX2nY1HRKlYGHpGP1saPmD7GN0pwCDlTz35a4eOtJG+aHRlXyjCuXokUukSrR2aXyBhSW3j+jPc0A==",
+      "dev": true
+    },
+    "@types/lodash": {
+      "version": "4.14.91",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.91.tgz",
+      "integrity": "sha512-k+nc3moSlAaXacyvz4/c6D9lnUeI6AKsLvkXFuNzUEEqMw7sjDnLW2GqlJ4nyFgMX/p+QzvVG6zRoDo4lJIV5g=="
+    },
+    "@types/minimatch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.1.tgz",
+      "integrity": "sha512-rUO/jz10KRSyA9SHoCWQ8WX9BICyj5jZYu1/ucKEJKb4KzLZCKMURdYbadP157Q6Zl1x0vHsrU+Z/O0XlhYQDw==",
+      "dev": true
+    },
+    "@types/mocha": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.0.tgz",
+      "integrity": "sha512-YeDiSEzznwZwwp766SJ6QlrTyBYUGPSIwmREHVTmktUYiT/WADdWtpt9iH0KuUSf8lZLdI4lP0X6PBzPo5//JQ==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "6.0.60",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.60.tgz",
+      "integrity": "sha1-5+E068Z0rm7ZPDbHZ3ObEQ0sV/w=",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "0.0.32",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz",
+      "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=",
+      "dev": true
+    },
+    "@types/selenium-webdriver": {
+      "version": "2.53.43",
+      "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz",
+      "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==",
+      "dev": true
+    },
+    "@types/sinon": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.0.0.tgz",
+      "integrity": "sha512-cuK4xM8Lg2wd8cxshcQa8RG4IK/xfyB6TNE6tNVvkrShR4xdrYgsV04q6Dp6v1Lp6biEFdzD8k8zg/ujQeiw+A==",
+      "dev": true
+    },
+    "@types/sinon-chai": {
+      "version": "2.7.29",
+      "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-2.7.29.tgz",
+      "integrity": "sha512-EkI/ZvJT4hglWo7Ipf9SX+J+R9htNOMjW8xiOhce7+0csqvgoF5IXqY5Ae1GqRgNtWCuaywR5HjVa1snkTqpOw==",
+      "dev": true,
+      "requires": {
+        "@types/chai": "4.1.3",
+        "@types/sinon": "4.0.0"
+      }
+    },
+    "@types/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
+      "dev": true
+    },
+    "@types/strip-json-comments": {
+      "version": "0.0.30",
+      "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
+      "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
+      "dev": true
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "requires": {
+        "mime-types": "2.1.18",
+        "negotiator": "0.6.1"
+      }
+    },
+    "acorn": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+      "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ=="
+    },
+    "acorn-dynamic-import": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
+      "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+      "requires": {
+        "acorn": "4.0.13"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+        }
+      }
+    },
+    "address": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
+      "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
+    },
+    "addressparser": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz",
+      "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=",
+      "dev": true,
+      "optional": true
+    },
+    "adm-zip": {
+      "version": "0.4.7",
+      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
+      "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=",
+      "dev": true
+    },
+    "after": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+      "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+      "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+      "dev": true,
+      "requires": {
+        "extend": "3.0.1",
+        "semver": "5.0.3"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.0.3",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+          "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+          "dev": true
+        }
+      }
+    },
+    "airbnb-js-shims": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-1.4.1.tgz",
+      "integrity": "sha512-b7S3d+DPRMwaDAs0cgKQTMLO/JG/iSehIlzEGvt2FpxIztRDDABEjWI73AfTxkSiK3/OsraPRYxVNAX3yhSNLw==",
+      "requires": {
+        "array-includes": "3.0.3",
+        "array.prototype.flatmap": "1.2.1",
+        "array.prototype.flatten": "1.2.1",
+        "es5-shim": "4.5.10",
+        "es6-shim": "0.35.3",
+        "function.prototype.name": "1.1.0",
+        "object.entries": "1.0.4",
+        "object.getownpropertydescriptors": "2.0.3",
+        "object.values": "1.0.4",
+        "promise.prototype.finally": "3.1.0",
+        "string.prototype.padend": "3.0.0",
+        "string.prototype.padstart": "3.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz",
+      "integrity": "sha1-FlCkERTvAFdMrBC4Ay2PTBSBLac=",
+      "requires": {
+        "fast-deep-equal": "1.1.0",
+        "fast-json-stable-stringify": "2.0.0",
+        "json-schema-traverse": "0.3.1"
+      }
+    },
+    "ajv-keywords": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz",
+      "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74="
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "requires": {
+        "kind-of": "3.2.2",
+        "longest": "1.0.1",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
+    },
+    "am-i-a-dependency": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/am-i-a-dependency/-/am-i-a-dependency-1.1.2.tgz",
+      "integrity": "sha1-+dNCIwTW9kL4IeTEB1ZQNfYWfx8=",
+      "dev": true
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+    },
+    "amqplib": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz",
+      "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "bitsyntax": "0.0.4",
+        "bluebird": "3.5.1",
+        "buffer-more-ints": "0.0.2",
+        "readable-stream": "1.1.14",
+        "safe-buffer": "5.1.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true,
+          "optional": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "angular-svg-icon": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/angular-svg-icon/-/angular-svg-icon-5.0.0.tgz",
+      "integrity": "sha512-wIRpoQ3PwytxA4MRe9cgmdytXrHgTGUuTdmIFtAQvCcftUSWWkzkVaXF1QSlFip6ipHf/YacdJHFYXpnW2lWPQ=="
+    },
+    "angular-tree-component": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/angular-tree-component/-/angular-tree-component-7.0.1.tgz",
+      "integrity": "sha1-/I0OctjDS4cTGjuivTKtIJRWiaw=",
+      "requires": {
+        "lodash": "4.17.4",
+        "mobx": "4.1.0",
+        "mobx-angular": "3.0.1"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "4.17.4",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
+        }
+      }
+    },
+    "angular2-datatable": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/angular2-datatable/-/angular2-datatable-0.6.0.tgz",
+      "integrity": "sha1-ygCPdAh/DLh9pXCe0vLR0GF3JjI=",
+      "requires": {
+        "lodash": "4.17.5"
+      }
+    },
+    "angular2-multiselect-dropdown": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/angular2-multiselect-dropdown/-/angular2-multiselect-dropdown-2.5.0.tgz",
+      "integrity": "sha1-6halE/Z0LN5V312fqumSzThU7dM=",
+      "requires": {
+        "font-awesome": "4.7.0"
+      }
+    },
+    "ansi-escapes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
+    },
+    "ansi-gray": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+      "dev": true,
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "requires": {
+        "color-convert": "1.9.1"
+      }
+    },
+    "ansi-wrap": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+      "dev": true
+    },
+    "anymatch": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+      "dev": true,
+      "requires": {
+        "micromatch": "2.3.11",
+        "normalize-path": "2.1.1"
+      }
+    },
+    "app-root-path": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz",
+      "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=",
+      "dev": true
+    },
+    "append-transform": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
+      "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
+      "dev": true,
+      "requires": {
+        "default-require-extensions": "1.0.0"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+    },
+    "are-we-there-yet": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+      "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
+      "requires": {
+        "delegates": "1.0.0",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "requires": {
+        "sprintf-js": "1.0.3"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "1.1.0"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+    },
+    "array-differ": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+      "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+      "dev": true
+    },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
+    },
+    "array-find": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz",
+      "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg="
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz",
+      "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=",
+      "dev": true
+    },
+    "array-includes": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
+      "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0"
+      }
+    },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI="
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys="
+    },
+    "array-slice": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+      "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "1.0.3"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+      "dev": true
+    },
+    "array.prototype.flatmap": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.1.tgz",
+      "integrity": "sha512-i18e2APdsiezkcqDyZor78Pbfjfds3S94dG6dgIV2ZASJaUf1N0dz2tGdrmwrmlZuNUgxH+wz6Z0zYVH2c5xzQ==",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1"
+      }
+    },
+    "array.prototype.flatten": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatten/-/array.prototype.flatten-1.2.1.tgz",
+      "integrity": "sha512-3GhsA78XgK//wQKbhUe6L93kknekGlTRY0kvYcpuSi0aa9rVrMr/okeIIv/XSpN8fZ5iUM+bWifhf2/7CYKtIg==",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1"
+      }
+    },
+    "arraybuffer.slice": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+      "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+      "dev": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+    },
+    "asn1": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+      "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+      "dev": true
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "requires": {
+        "bn.js": "4.11.8",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "assert": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "requires": {
+        "util": "0.10.3"
+      }
+    },
+    "assert-plus": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+      "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+    },
+    "ast-types": {
+      "version": "0.11.3",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz",
+      "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==",
+      "dev": true,
+      "optional": true
+    },
+    "async": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+      "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+      "requires": {
+        "lodash": "4.17.5"
+      }
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
+    },
+    "async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+      "dev": true,
+      "optional": true
+    },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
+      "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10="
+    },
+    "autoprefixer": {
+      "version": "7.2.6",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz",
+      "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==",
+      "requires": {
+        "browserslist": "2.11.3",
+        "caniuse-lite": "1.0.30000815",
+        "normalize-range": "0.1.2",
+        "num2fraction": "1.2.2",
+        "postcss": "6.0.20",
+        "postcss-value-parser": "3.3.0"
+      }
+    },
+    "aws-sign2": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+      "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+      "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+      "dev": true
+    },
+    "axios": {
+      "version": "0.15.3",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz",
+      "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "follow-redirects": "1.0.0"
+      }
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "requires": {
+        "chalk": "1.1.3",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+        }
+      }
+    },
+    "babel-core": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+      "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-generator": "6.26.1",
+        "babel-helpers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-register": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "convert-source-map": "1.5.1",
+        "debug": "2.6.9",
+        "json5": "0.5.1",
+        "lodash": "4.17.5",
+        "minimatch": "3.0.4",
+        "path-is-absolute": "1.0.1",
+        "private": "0.1.8",
+        "slash": "1.0.0",
+        "source-map": "0.5.7"
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+      "dev": true,
+      "requires": {
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "detect-indent": "4.0.0",
+        "jsesc": "1.3.0",
+        "lodash": "4.17.5",
+        "source-map": "0.5.7",
+        "trim-right": "1.0.1"
+      }
+    },
+    "babel-helper-bindify-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
+      "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-builder-binary-assignment-operator-visitor": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+      "requires": {
+        "babel-helper-explode-assignable-expression": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-builder-react-jsx": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
+      "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "esutils": "2.0.2"
+      }
+    },
+    "babel-helper-call-delegate": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-define-map": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-helper-evaluate-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz",
+      "integrity": "sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw=="
+    },
+    "babel-helper-explode-assignable-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-explode-class": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
+      "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
+      "requires": {
+        "babel-helper-bindify-decorators": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-flip-expressions": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz",
+      "integrity": "sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw=="
+    },
+    "babel-helper-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+      "requires": {
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-get-function-arity": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-hoist-variables": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-is-nodes-equiv": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+      "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ="
+    },
+    "babel-helper-is-void-0": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz",
+      "integrity": "sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ=="
+    },
+    "babel-helper-mark-eval-scopes": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz",
+      "integrity": "sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ=="
+    },
+    "babel-helper-optimise-call-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-regex": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-helper-remap-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-remove-or-void": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz",
+      "integrity": "sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ=="
+    },
+    "babel-helper-replace-supers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+      "requires": {
+        "babel-helper-optimise-call-expression": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-to-multiple-sequence-expressions": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz",
+      "integrity": "sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw=="
+    },
+    "babel-helpers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-loader": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.4.tgz",
+      "integrity": "sha512-/hbyEvPzBJuGpk9o80R0ZyTej6heEOr59GoEUtn8qFKbnx4cJm9FWES6J/iv644sYgrtVw9JJQkjaLW/bqb5gw==",
+      "requires": {
+        "find-cache-dir": "1.0.0",
+        "loader-utils": "1.1.0",
+        "mkdirp": "0.5.1"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-check-es2015-constants": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-macros": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.2.0.tgz",
+      "integrity": "sha512-HGdenPU9+WGhg++P65O+6aIdmXx99p58K7VtAtizC3eUHbO4FXfyfK9SCJubylcyKziEB3nMAUDFHeyDUj38eA==",
+      "requires": {
+        "cosmiconfig": "4.0.0"
+      },
+      "dependencies": {
+        "cosmiconfig": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz",
+          "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==",
+          "requires": {
+            "is-directory": "0.3.1",
+            "js-yaml": "3.11.0",
+            "parse-json": "4.0.0",
+            "require-from-string": "2.0.2"
+          }
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "requires": {
+            "error-ex": "1.3.1",
+            "json-parse-better-errors": "1.0.2"
+          }
+        },
+        "require-from-string": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+          "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+        }
+      }
+    },
+    "babel-plugin-minify-builtins": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz",
+      "integrity": "sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg==",
+      "requires": {
+        "babel-helper-evaluate-path": "0.3.0"
+      }
+    },
+    "babel-plugin-minify-constant-folding": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz",
+      "integrity": "sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A==",
+      "requires": {
+        "babel-helper-evaluate-path": "0.3.0"
+      }
+    },
+    "babel-plugin-minify-dead-code-elimination": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz",
+      "integrity": "sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw==",
+      "requires": {
+        "babel-helper-evaluate-path": "0.3.0",
+        "babel-helper-mark-eval-scopes": "0.3.0",
+        "babel-helper-remove-or-void": "0.3.0",
+        "lodash.some": "4.6.0"
+      }
+    },
+    "babel-plugin-minify-flip-comparisons": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz",
+      "integrity": "sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw==",
+      "requires": {
+        "babel-helper-is-void-0": "0.3.0"
+      }
+    },
+    "babel-plugin-minify-guarded-expressions": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz",
+      "integrity": "sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA==",
+      "requires": {
+        "babel-helper-flip-expressions": "0.3.0"
+      }
+    },
+    "babel-plugin-minify-infinity": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz",
+      "integrity": "sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ=="
+    },
+    "babel-plugin-minify-mangle-names": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz",
+      "integrity": "sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q==",
+      "requires": {
+        "babel-helper-mark-eval-scopes": "0.3.0"
+      }
+    },
+    "babel-plugin-minify-numeric-literals": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz",
+      "integrity": "sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg=="
+    },
+    "babel-plugin-minify-replace": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz",
+      "integrity": "sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg=="
+    },
+    "babel-plugin-minify-simplify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz",
+      "integrity": "sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q==",
+      "requires": {
+        "babel-helper-flip-expressions": "0.3.0",
+        "babel-helper-is-nodes-equiv": "0.0.1",
+        "babel-helper-to-multiple-sequence-expressions": "0.3.0"
+      }
+    },
+    "babel-plugin-minify-type-constructors": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz",
+      "integrity": "sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q==",
+      "requires": {
+        "babel-helper-is-void-0": "0.3.0"
+      }
+    },
+    "babel-plugin-react-docgen": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-1.9.0.tgz",
+      "integrity": "sha512-8lQ73p4BL+xcgba03NTiHrddl2X8J6PDMQHPpz73sesrRBf6JtAscQPLIjFWQR/abLokdv81HdshpjYGppOXgA==",
+      "requires": {
+        "babel-types": "6.26.0",
+        "lodash": "4.17.5",
+        "react-docgen": "3.0.0-beta9"
+      }
+    },
+    "babel-plugin-syntax-async-functions": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU="
+    },
+    "babel-plugin-syntax-async-generators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+      "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o="
+    },
+    "babel-plugin-syntax-class-constructor-call": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
+      "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY="
+    },
+    "babel-plugin-syntax-class-properties": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94="
+    },
+    "babel-plugin-syntax-decorators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
+      "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs="
+    },
+    "babel-plugin-syntax-do-expressions": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz",
+      "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0="
+    },
+    "babel-plugin-syntax-dynamic-import": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+      "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo="
+    },
+    "babel-plugin-syntax-exponentiation-operator": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4="
+    },
+    "babel-plugin-syntax-export-extensions": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
+      "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE="
+    },
+    "babel-plugin-syntax-flow": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
+      "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0="
+    },
+    "babel-plugin-syntax-function-bind": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz",
+      "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y="
+    },
+    "babel-plugin-syntax-jsx": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+      "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
+    },
+    "babel-plugin-syntax-object-rest-spread": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
+    },
+    "babel-plugin-syntax-trailing-function-commas": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM="
+    },
+    "babel-plugin-transform-async-generator-functions": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+      "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+      "requires": {
+        "babel-helper-remap-async-to-generator": "6.24.1",
+        "babel-plugin-syntax-async-generators": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+      "requires": {
+        "babel-helper-remap-async-to-generator": "6.24.1",
+        "babel-plugin-syntax-async-functions": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-class-constructor-call": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
+      "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
+      "requires": {
+        "babel-plugin-syntax-class-constructor-call": "6.18.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-class-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-plugin-syntax-class-properties": "6.13.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
+      "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+      "requires": {
+        "babel-helper-explode-class": "6.24.1",
+        "babel-plugin-syntax-decorators": "6.13.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-do-expressions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz",
+      "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=",
+      "requires": {
+        "babel-plugin-syntax-do-expressions": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-arrow-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoped-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoping": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-plugin-transform-es2015-classes": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+      "requires": {
+        "babel-helper-define-map": "6.26.0",
+        "babel-helper-function-name": "6.24.1",
+        "babel-helper-optimise-call-expression": "6.24.1",
+        "babel-helper-replace-supers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-computed-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-destructuring": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-duplicate-keys": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-for-of": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-amd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+      "requires": {
+        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-commonjs": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+      "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+      "requires": {
+        "babel-plugin-transform-strict-mode": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-systemjs": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-umd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+      "requires": {
+        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-object-super": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+      "requires": {
+        "babel-helper-replace-supers": "6.24.1",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-parameters": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+      "requires": {
+        "babel-helper-call-delegate": "6.24.1",
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-shorthand-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-spread": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-sticky-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+      "requires": {
+        "babel-helper-regex": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-template-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-typeof-symbol": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-unicode-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+      "requires": {
+        "babel-helper-regex": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "regexpu-core": "2.0.0"
+      },
+      "dependencies": {
+        "regexpu-core": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+          "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+          "requires": {
+            "regenerate": "1.3.3",
+            "regjsgen": "0.2.0",
+            "regjsparser": "0.1.5"
+          }
+        }
+      }
+    },
+    "babel-plugin-transform-exponentiation-operator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+      "requires": {
+        "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+        "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-export-extensions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz",
+      "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
+      "requires": {
+        "babel-plugin-syntax-export-extensions": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-flow-strip-types": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
+      "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
+      "requires": {
+        "babel-plugin-syntax-flow": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-function-bind": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz",
+      "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=",
+      "requires": {
+        "babel-plugin-syntax-function-bind": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-inline-consecutive-adds": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz",
+      "integrity": "sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA=="
+    },
+    "babel-plugin-transform-member-expression-literals": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.1.tgz",
+      "integrity": "sha1-lr4umWjn9UlzM64DKE7NU0BAVIk="
+    },
+    "babel-plugin-transform-merge-sibling-variables": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.1.tgz",
+      "integrity": "sha1-kHHkQ7IUWM5rCo04QbpaF09dwoI="
+    },
+    "babel-plugin-transform-minify-booleans": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.1.tgz",
+      "integrity": "sha1-UsunnAD6UJc3BkBV76siFm4UDE0="
+    },
+    "babel-plugin-transform-object-rest-spread": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+      "requires": {
+        "babel-plugin-syntax-object-rest-spread": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-property-literals": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.1.tgz",
+      "integrity": "sha1-aXD5Oxd5OrzenPJdLozRPgCI5ck=",
+      "requires": {
+        "esutils": "2.0.2"
+      }
+    },
+    "babel-plugin-transform-react-display-name": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
+      "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
+      "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
+      "requires": {
+        "babel-helper-builder-react-jsx": "6.26.0",
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx-self": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
+      "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-react-jsx-source": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
+      "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-regenerator": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+      "requires": {
+        "regenerator-transform": "0.10.1"
+      }
+    },
+    "babel-plugin-transform-regexp-constructors": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz",
+      "integrity": "sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw=="
+    },
+    "babel-plugin-transform-remove-console": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.1.tgz",
+      "integrity": "sha1-QP6V2YyuWBHYoOGImBLXixKFllE="
+    },
+    "babel-plugin-transform-remove-debugger": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.1.tgz",
+      "integrity": "sha1-dlUtLp1sQ9nGdrv8CPPCoswUvhQ="
+    },
+    "babel-plugin-transform-remove-undefined": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz",
+      "integrity": "sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw==",
+      "requires": {
+        "babel-helper-evaluate-path": "0.3.0"
+      }
+    },
+    "babel-plugin-transform-runtime": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
+      "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-simplify-comparison-operators": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.1.tgz",
+      "integrity": "sha1-Ww0GmAoXp4D1MYsnTAC+L7HHxP4="
+    },
+    "babel-plugin-transform-strict-mode": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-undefined-to-void": {
+      "version": "6.9.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.1.tgz",
+      "integrity": "sha1-19+cHdDsEuD/6JXtFEX2Hxv14iE="
+    },
+    "babel-preset-env": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz",
+      "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==",
+      "requires": {
+        "babel-plugin-check-es2015-constants": "6.22.0",
+        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+        "babel-plugin-transform-async-to-generator": "6.24.1",
+        "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+        "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+        "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+        "babel-plugin-transform-es2015-classes": "6.24.1",
+        "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+        "babel-plugin-transform-es2015-destructuring": "6.23.0",
+        "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+        "babel-plugin-transform-es2015-for-of": "6.23.0",
+        "babel-plugin-transform-es2015-function-name": "6.24.1",
+        "babel-plugin-transform-es2015-literals": "6.22.0",
+        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+        "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+        "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+        "babel-plugin-transform-es2015-object-super": "6.24.1",
+        "babel-plugin-transform-es2015-parameters": "6.24.1",
+        "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+        "babel-plugin-transform-es2015-spread": "6.22.0",
+        "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+        "babel-plugin-transform-es2015-template-literals": "6.22.0",
+        "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+        "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+        "babel-plugin-transform-exponentiation-operator": "6.24.1",
+        "babel-plugin-transform-regenerator": "6.26.0",
+        "browserslist": "2.11.3",
+        "invariant": "2.2.4",
+        "semver": "5.5.0"
+      }
+    },
+    "babel-preset-flow": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
+      "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
+      "requires": {
+        "babel-plugin-transform-flow-strip-types": "6.22.0"
+      }
+    },
+    "babel-preset-minify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz",
+      "integrity": "sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ==",
+      "requires": {
+        "babel-plugin-minify-builtins": "0.3.0",
+        "babel-plugin-minify-constant-folding": "0.3.0",
+        "babel-plugin-minify-dead-code-elimination": "0.3.0",
+        "babel-plugin-minify-flip-comparisons": "0.3.0",
+        "babel-plugin-minify-guarded-expressions": "0.3.0",
+        "babel-plugin-minify-infinity": "0.3.0",
+        "babel-plugin-minify-mangle-names": "0.3.0",
+        "babel-plugin-minify-numeric-literals": "0.3.0",
+        "babel-plugin-minify-replace": "0.3.0",
+        "babel-plugin-minify-simplify": "0.3.0",
+        "babel-plugin-minify-type-constructors": "0.3.0",
+        "babel-plugin-transform-inline-consecutive-adds": "0.3.0",
+        "babel-plugin-transform-member-expression-literals": "6.9.1",
+        "babel-plugin-transform-merge-sibling-variables": "6.9.1",
+        "babel-plugin-transform-minify-booleans": "6.9.1",
+        "babel-plugin-transform-property-literals": "6.9.1",
+        "babel-plugin-transform-regexp-constructors": "0.3.0",
+        "babel-plugin-transform-remove-console": "6.9.1",
+        "babel-plugin-transform-remove-debugger": "6.9.1",
+        "babel-plugin-transform-remove-undefined": "0.3.0",
+        "babel-plugin-transform-simplify-comparison-operators": "6.9.1",
+        "babel-plugin-transform-undefined-to-void": "6.9.1",
+        "lodash.isplainobject": "4.0.6"
+      }
+    },
+    "babel-preset-react": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
+      "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
+      "requires": {
+        "babel-plugin-syntax-jsx": "6.18.0",
+        "babel-plugin-transform-react-display-name": "6.25.0",
+        "babel-plugin-transform-react-jsx": "6.24.1",
+        "babel-plugin-transform-react-jsx-self": "6.22.0",
+        "babel-plugin-transform-react-jsx-source": "6.22.0",
+        "babel-preset-flow": "6.23.0"
+      }
+    },
+    "babel-preset-stage-0": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz",
+      "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=",
+      "requires": {
+        "babel-plugin-transform-do-expressions": "6.22.0",
+        "babel-plugin-transform-function-bind": "6.22.0",
+        "babel-preset-stage-1": "6.24.1"
+      }
+    },
+    "babel-preset-stage-1": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz",
+      "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
+      "requires": {
+        "babel-plugin-transform-class-constructor-call": "6.24.1",
+        "babel-plugin-transform-export-extensions": "6.22.0",
+        "babel-preset-stage-2": "6.24.1"
+      }
+    },
+    "babel-preset-stage-2": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
+      "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
+      "requires": {
+        "babel-plugin-syntax-dynamic-import": "6.18.0",
+        "babel-plugin-transform-class-properties": "6.24.1",
+        "babel-plugin-transform-decorators": "6.24.1",
+        "babel-preset-stage-3": "6.24.1"
+      }
+    },
+    "babel-preset-stage-3": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
+      "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+      "requires": {
+        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+        "babel-plugin-transform-async-generator-functions": "6.24.1",
+        "babel-plugin-transform-async-to-generator": "6.24.1",
+        "babel-plugin-transform-exponentiation-operator": "6.24.1",
+        "babel-plugin-transform-object-rest-spread": "6.26.0"
+      }
+    },
+    "babel-register": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+      "dev": true,
+      "requires": {
+        "babel-core": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "core-js": "2.5.6",
+        "home-or-tmp": "2.0.0",
+        "lodash": "4.17.5",
+        "mkdirp": "0.5.1",
+        "source-map-support": "0.4.18"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.5.6",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz",
+          "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==",
+          "dev": true
+        }
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "requires": {
+        "core-js": "2.4.1",
+        "regenerator-runtime": "0.11.1"
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "debug": "2.6.9",
+        "globals": "9.18.0",
+        "invariant": "2.2.4",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "esutils": "2.0.2",
+        "lodash": "4.17.5",
+        "to-fast-properties": "1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+    },
+    "backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "requires": {
+        "cache-base": "1.0.1",
+        "class-utils": "0.3.6",
+        "component-emitter": "1.2.1",
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "mixin-deep": "1.3.1",
+        "pascalcase": "0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "base64-arraybuffer": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+      "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+      "dev": true
+    },
+    "base64-js": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz",
+      "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w=="
+    },
+    "base64id": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+      "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+      "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "beeper": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+      "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+      "dev": true
+    },
+    "better-assert": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+      "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+      "dev": true,
+      "requires": {
+        "callsite": "1.0.0"
+      }
+    },
+    "big.js": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+      "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
+    },
+    "binary-extensions": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+      "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU="
+    },
+    "bitsyntax": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz",
+      "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "buffer-more-ints": "0.0.2"
+      }
+    },
+    "bl": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
+      "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "readable-stream": "2.0.6"
+      },
+      "dependencies": {
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+          "dev": true,
+          "optional": true
+        },
+        "readable-stream": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "1.0.7",
+            "string_decoder": "0.10.31",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "blob": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+      "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+      "dev": true
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "blocking-proxy": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz",
+      "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=",
+      "dev": true,
+      "requires": {
+        "minimist": "1.2.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "bluebird": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+    },
+    "body-parser": {
+      "version": "1.18.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+      "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "1.0.4",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "http-errors": "1.6.2",
+        "iconv-lite": "0.4.19",
+        "on-finished": "2.3.0",
+        "qs": "6.5.1",
+        "raw-body": "2.3.2",
+        "type-is": "1.6.16"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "2.1.1",
+        "deep-equal": "1.0.1",
+        "dns-equal": "1.0.0",
+        "dns-txt": "2.0.2",
+        "multicast-dns": "6.2.3",
+        "multicast-dns-service-types": "1.1.0"
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+    },
+    "boom": {
+      "version": "2.10.1",
+      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+      "dev": true,
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "bootstrap": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz",
+      "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E="
+    },
+    "bowser": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.3.tgz",
+      "integrity": "sha512-/gp96UlcFw5DbV2KQPCqTqi0Mb9gZRyDAHiDsGEH+4B/KOQjeoE5lM1PxlVX8DQDvfEfitmC1rW2Oy8fk/XBDg=="
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "dev": true,
+      "requires": {
+        "expand-range": "1.8.2",
+        "preserve": "0.2.0",
+        "repeat-element": "1.1.2"
+      }
+    },
+    "brcast": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz",
+      "integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg=="
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+    },
+    "browserify-aes": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
+      "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==",
+      "requires": {
+        "buffer-xor": "1.0.3",
+        "cipher-base": "1.0.4",
+        "create-hash": "1.1.3",
+        "evp_bytestokey": "1.0.3",
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
+      "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
+      "requires": {
+        "browserify-aes": "1.1.1",
+        "browserify-des": "1.0.0",
+        "evp_bytestokey": "1.0.3"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
+      "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
+      "requires": {
+        "cipher-base": "1.0.4",
+        "des.js": "1.0.0",
+        "inherits": "2.0.3"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "randombytes": "2.0.6"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "elliptic": "6.4.0",
+        "inherits": "2.0.3",
+        "parse-asn1": "5.1.0"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "requires": {
+        "pako": "1.0.6"
+      }
+    },
+    "browserslist": {
+      "version": "2.11.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
+      "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
+      "requires": {
+        "caniuse-lite": "1.0.30000815",
+        "electron-to-chromium": "1.3.39"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "requires": {
+        "base64-js": "1.2.3",
+        "ieee754": "1.1.10",
+        "isarray": "1.0.0"
+      }
+    },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+      "dev": true
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-more-ints": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz",
+      "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+    },
+    "buildmail": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz",
+      "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "addressparser": "1.0.1",
+        "libbase64": "0.1.0",
+        "libmime": "3.0.0",
+        "libqp": "1.1.0",
+        "nodemailer-fetch": "1.6.0",
+        "nodemailer-shared": "1.1.0",
+        "punycode": "1.4.1"
+      }
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+    },
+    "cacache": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+      "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
+      "requires": {
+        "bluebird": "3.5.1",
+        "chownr": "1.0.1",
+        "glob": "7.1.2",
+        "graceful-fs": "4.1.11",
+        "lru-cache": "4.1.2",
+        "mississippi": "2.0.0",
+        "mkdirp": "0.5.1",
+        "move-concurrently": "1.0.1",
+        "promise-inflight": "1.0.1",
+        "rimraf": "2.6.2",
+        "ssri": "5.3.0",
+        "unique-filename": "1.1.0",
+        "y18n": "4.0.0"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "requires": {
+        "collection-visit": "1.0.0",
+        "component-emitter": "1.2.1",
+        "get-value": "2.0.6",
+        "has-value": "1.0.0",
+        "isobject": "3.0.1",
+        "set-value": "2.0.0",
+        "to-object-path": "0.3.0",
+        "union-value": "1.0.0",
+        "unset-value": "1.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "cache-loader": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz",
+      "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "mkdirp": "0.5.1",
+        "neo-async": "2.5.0",
+        "schema-utils": "0.4.5"
+      }
+    },
+    "callsite": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+      "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+      "requires": {
+        "no-case": "2.3.2",
+        "upper-case": "1.1.3"
+      }
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "2.1.1",
+        "map-obj": "1.0.1"
+      }
+    },
+    "caniuse-api": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
+      "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-db": "1.0.30000827",
+        "lodash.memoize": "4.1.2",
+        "lodash.uniq": "4.5.0"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "requires": {
+            "caniuse-db": "1.0.30000827",
+            "electron-to-chromium": "1.3.39"
+          }
+        },
+        "lodash.memoize": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+          "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+        }
+      }
+    },
+    "caniuse-db": {
+      "version": "1.0.30000827",
+      "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000827.tgz",
+      "integrity": "sha1-vSg53Rlgk7RMKMF/k1ExQMnZJYg="
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000815",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000815.tgz",
+      "integrity": "sha512-PGSOPK6gFe5fWd+eD0u2bG0aOsN1qC4B1E66tl3jOsIoKkTIcBYAc2+O6AeNzKW8RsFykWgnhkTlfOyuTzgI9A=="
+    },
+    "case-sensitive-paths-webpack-plugin": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.2.tgz",
+      "integrity": "sha512-oEZgAFfEvKtjSRCu6VgYkuGxwrWXMnQzyBmlLPP7r6PWQVtHxP5Z5N6XsuJvtoVax78am/r7lr46bwo3IVEBOg=="
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "requires": {
+        "align-text": "0.1.4",
+        "lazy-cache": "1.0.4"
+      }
+    },
+    "chain-function": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz",
+      "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w="
+    },
+    "chalk": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz",
+      "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==",
+      "requires": {
+        "ansi-styles": "3.2.1",
+        "escape-string-regexp": "1.0.5",
+        "supports-color": "4.5.0"
+      }
+    },
+    "chardet": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
+    },
+    "check-more-types": {
+      "version": "2.24.0",
+      "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+      "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=",
+      "dev": true
+    },
+    "chokidar": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+      "dev": true,
+      "requires": {
+        "anymatch": "1.3.2",
+        "async-each": "1.0.1",
+        "fsevents": "1.1.3",
+        "glob-parent": "2.0.0",
+        "inherits": "2.0.3",
+        "is-binary-path": "1.0.1",
+        "is-glob": "2.0.1",
+        "path-is-absolute": "1.0.1",
+        "readdirp": "2.1.0"
+      }
+    },
+    "chownr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
+      "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE="
+    },
+    "ci-info": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
+      "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
+      "dev": true
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "circular-dependency-plugin": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz",
+      "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==",
+      "dev": true
+    },
+    "circular-json": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.1.tgz",
+      "integrity": "sha512-UjgcRlTAhAkLeXmDe2wK7ktwy/tgAqxiSndTIPiFZuIPLZmzHzWMwUIe9h9m/OokypG7snxCDEuwJshGBdPvaw==",
+      "dev": true
+    },
+    "clap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
+      "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==",
+      "requires": {
+        "chalk": "1.1.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+        }
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "requires": {
+        "arr-union": "3.1.0",
+        "define-property": "0.2.5",
+        "isobject": "3.0.1",
+        "static-extend": "0.1.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+        }
+      }
+    },
+    "classnames": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz",
+      "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0="
+    },
+    "clean-css": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+      "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+      "requires": {
+        "source-map": "0.5.7"
+      }
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "requires": {
+        "restore-cursor": "2.0.0"
+      }
+    },
+    "cli-spinners": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz",
+      "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=",
+      "dev": true
+    },
+    "cli-truncate": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
+      "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
+      "dev": true,
+      "requires": {
+        "slice-ansi": "0.0.4",
+        "string-width": "1.0.2"
+      }
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+    },
+    "cliui": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1",
+        "wrap-ansi": "2.1.0"
+      }
+    },
+    "clone": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+      "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
+      "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
+      "dev": true,
+      "requires": {
+        "for-own": "1.0.0",
+        "is-plain-object": "2.0.4",
+        "kind-of": "6.0.2",
+        "shallow-clone": "1.0.0"
+      },
+      "dependencies": {
+        "for-own": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+          "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+          "dev": true,
+          "requires": {
+            "for-in": "1.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "clone-stats": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+      "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+      "dev": true
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+    },
+    "coa": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
+      "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
+      "requires": {
+        "q": "1.4.1"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+    },
+    "codelyzer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.1.tgz",
+      "integrity": "sha512-MsOcaiLqcBK7hjHbfp9HZrflqWg5tD9A5qVSXkW208OJ8pkf63id8IiOjEiK/XU3o70W8tWbFKi1tAOwiJDMrQ==",
+      "dev": true,
+      "requires": {
+        "app-root-path": "2.0.1",
+        "css-selector-tokenizer": "0.7.0",
+        "cssauron": "1.4.0",
+        "semver-dsl": "1.0.1",
+        "source-map": "0.5.7",
+        "sprintf-js": "1.0.3"
+      }
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "requires": {
+        "map-visit": "1.0.0",
+        "object-visit": "1.0.1"
+      }
+    },
+    "color": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
+      "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+      "requires": {
+        "clone": "1.0.4",
+        "color-convert": "1.9.1",
+        "color-string": "0.3.0"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+        }
+      }
+    },
+    "color-convert": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+      "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "color-string": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
+      "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "dev": true
+    },
+    "colormin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz",
+      "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
+      "requires": {
+        "color": "0.11.4",
+        "css-color-names": "0.0.4",
+        "has": "1.0.1"
+      }
+    },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
+    },
+    "combine-lists": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
+      "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.5"
+      }
+    },
+    "combined-stream": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+      "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.15.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz",
+      "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg=="
+    },
+    "common-tags": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz",
+      "integrity": "sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ==",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+    },
+    "compare-versions": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz",
+      "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==",
+      "dev": true
+    },
+    "component-bind": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+    },
+    "component-inherit": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+      "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.13",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz",
+      "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.33.0"
+      }
+    },
+    "compression": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
+      "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "2.0.13",
+        "debug": "2.6.9",
+        "on-headers": "1.0.1",
+        "safe-buffer": "5.1.1",
+        "vary": "1.1.2"
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "concat-stream": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz",
+      "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==",
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.5",
+        "typedarray": "0.0.6"
+      }
+    },
+    "connect": {
+      "version": "3.6.6",
+      "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
+      "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "finalhandler": "1.1.0",
+        "parseurl": "1.3.2",
+        "utils-merge": "1.0.1"
+      },
+      "dependencies": {
+        "finalhandler": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+          "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "encodeurl": "1.0.2",
+            "escape-html": "1.0.3",
+            "on-finished": "2.3.0",
+            "parseurl": "1.3.2",
+            "statuses": "1.3.1",
+            "unpipe": "1.0.0"
+          }
+        },
+        "statuses": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+          "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+          "dev": true
+        }
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
+      "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "requires": {
+        "date-now": "0.1.4"
+      }
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+    },
+    "convert-source-map": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+      "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+      "dev": true
+    },
+    "cookie": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "requires": {
+        "aproba": "1.2.0",
+        "fs-write-stream-atomic": "1.0.10",
+        "iferr": "0.1.5",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "run-queue": "1.0.3"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+    },
+    "copy-webpack-plugin": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz",
+      "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==",
+      "dev": true,
+      "requires": {
+        "cacache": "10.0.4",
+        "find-cache-dir": "1.0.0",
+        "globby": "7.1.1",
+        "is-glob": "4.0.0",
+        "loader-utils": "1.1.0",
+        "minimatch": "3.0.4",
+        "p-limit": "1.2.0",
+        "serialize-javascript": "1.4.0"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        }
+      }
+    },
+    "core-js": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
+      "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4="
+    },
+    "core-object": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz",
+      "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.2.2"
+      }
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "cosmiconfig": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz",
+      "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==",
+      "requires": {
+        "is-directory": "0.3.1",
+        "js-yaml": "3.11.0",
+        "minimist": "1.2.0",
+        "object-assign": "4.1.1",
+        "os-homedir": "1.0.2",
+        "parse-json": "2.2.0",
+        "require-from-string": "1.2.1"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
+      "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "elliptic": "6.4.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
+      "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
+      "requires": {
+        "cipher-base": "1.0.4",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.1",
+        "sha.js": "2.4.10"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
+      "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
+      "requires": {
+        "cipher-base": "1.0.4",
+        "create-hash": "1.1.3",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.1",
+        "safe-buffer": "5.1.1",
+        "sha.js": "2.4.10"
+      }
+    },
+    "create-react-class": {
+      "version": "15.6.3",
+      "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz",
+      "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==",
+      "requires": {
+        "fbjs": "0.8.16",
+        "loose-envify": "1.3.1",
+        "object-assign": "4.1.1"
+      }
+    },
+    "cross-spawn": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "lru-cache": "4.1.2",
+        "which": "1.3.0"
+      }
+    },
+    "cryptiles": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+      "dev": true,
+      "requires": {
+        "boom": "2.10.1"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "requires": {
+        "browserify-cipher": "1.0.0",
+        "browserify-sign": "4.0.4",
+        "create-ecdh": "4.0.0",
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "diffie-hellman": "5.0.2",
+        "inherits": "2.0.3",
+        "pbkdf2": "3.0.14",
+        "public-encrypt": "4.0.0",
+        "randombytes": "2.0.6",
+        "randomfill": "1.0.4"
+      }
+    },
+    "css": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz",
+      "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=",
+      "requires": {
+        "inherits": "2.0.3",
+        "source-map": "0.1.43",
+        "source-map-resolve": "0.3.1",
+        "urix": "0.1.0"
+      },
+      "dependencies": {
+        "atob": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz",
+          "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M="
+        },
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        },
+        "source-map-resolve": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz",
+          "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=",
+          "requires": {
+            "atob": "1.1.3",
+            "resolve-url": "0.2.1",
+            "source-map-url": "0.3.0",
+            "urix": "0.1.0"
+          }
+        },
+        "source-map-url": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz",
+          "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk="
+        }
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
+    },
+    "css-in-js-utils": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz",
+      "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==",
+      "requires": {
+        "hyphenate-style-name": "1.0.2",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "css-loader": {
+      "version": "0.28.11",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz",
+      "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==",
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "css-selector-tokenizer": "0.7.0",
+        "cssnano": "3.10.0",
+        "icss-utils": "2.1.0",
+        "loader-utils": "1.1.0",
+        "lodash.camelcase": "4.3.0",
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-modules-extract-imports": "1.2.0",
+        "postcss-modules-local-by-default": "1.2.0",
+        "postcss-modules-scope": "1.1.0",
+        "postcss-modules-values": "1.3.0",
+        "postcss-value-parser": "3.3.0",
+        "source-list-map": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "css-parse": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
+      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=",
+      "dev": true
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "requires": {
+        "boolbase": "1.0.0",
+        "css-what": "2.1.0",
+        "domutils": "1.5.1",
+        "nth-check": "1.0.1"
+      }
+    },
+    "css-selector-tokenizer": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
+      "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+      "requires": {
+        "cssesc": "0.1.0",
+        "fastparse": "1.1.1",
+        "regexpu-core": "1.0.0"
+      }
+    },
+    "css-what": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+      "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0="
+    },
+    "cssauron": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
+      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
+      "dev": true,
+      "requires": {
+        "through": "2.3.8"
+      }
+    },
+    "cssesc": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q="
+    },
+    "cssnano": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz",
+      "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
+      "requires": {
+        "autoprefixer": "6.7.7",
+        "decamelize": "1.2.0",
+        "defined": "1.0.0",
+        "has": "1.0.1",
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-calc": "5.3.1",
+        "postcss-colormin": "2.2.2",
+        "postcss-convert-values": "2.6.1",
+        "postcss-discard-comments": "2.0.4",
+        "postcss-discard-duplicates": "2.1.0",
+        "postcss-discard-empty": "2.1.0",
+        "postcss-discard-overridden": "0.1.1",
+        "postcss-discard-unused": "2.2.3",
+        "postcss-filter-plugins": "2.0.2",
+        "postcss-merge-idents": "2.1.7",
+        "postcss-merge-longhand": "2.0.2",
+        "postcss-merge-rules": "2.1.2",
+        "postcss-minify-font-values": "1.0.5",
+        "postcss-minify-gradients": "1.0.5",
+        "postcss-minify-params": "1.2.2",
+        "postcss-minify-selectors": "2.1.1",
+        "postcss-normalize-charset": "1.1.1",
+        "postcss-normalize-url": "3.0.8",
+        "postcss-ordered-values": "2.2.3",
+        "postcss-reduce-idents": "2.4.0",
+        "postcss-reduce-initial": "1.0.1",
+        "postcss-reduce-transforms": "1.0.4",
+        "postcss-svgo": "2.1.6",
+        "postcss-unique-selectors": "2.0.2",
+        "postcss-value-parser": "3.3.0",
+        "postcss-zindex": "2.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "autoprefixer": {
+          "version": "6.7.7",
+          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
+          "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+          "requires": {
+            "browserslist": "1.7.7",
+            "caniuse-db": "1.0.30000827",
+            "normalize-range": "0.1.2",
+            "num2fraction": "1.2.2",
+            "postcss": "5.2.18",
+            "postcss-value-parser": "3.3.0"
+          }
+        },
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "requires": {
+            "caniuse-db": "1.0.30000827",
+            "electron-to-chromium": "1.3.39"
+          }
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "csso": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz",
+      "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
+      "requires": {
+        "clap": "1.2.3",
+        "source-map": "0.5.7"
+      }
+    },
+    "cuint": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
+      "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
+      "dev": true
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "1.0.2"
+      }
+    },
+    "custom-event": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+      "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+      "dev": true
+    },
+    "cyclist": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA="
+    },
+    "cypress": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-2.1.0.tgz",
+      "integrity": "sha512-EKXGjKFKUkhXXfAkYixBN2Lo2Gji4ZGC+ezWflRf/co49+OyHarZaXp7Y/n826WjmMdpHTmkOw4wUWBgyFHEHQ==",
+      "dev": true,
+      "requires": {
+        "@cypress/listr-verbose-renderer": "0.4.1",
+        "@cypress/xvfb": "1.1.3",
+        "@types/blob-util": "1.3.3",
+        "@types/bluebird": "3.5.18",
+        "@types/chai": "4.0.8",
+        "@types/chai-jquery": "1.1.35",
+        "@types/jquery": "3.2.16",
+        "@types/lodash": "4.14.87",
+        "@types/minimatch": "3.0.1",
+        "@types/mocha": "2.2.44",
+        "@types/sinon": "4.0.0",
+        "@types/sinon-chai": "2.7.29",
+        "bluebird": "3.5.0",
+        "chalk": "2.1.0",
+        "check-more-types": "2.24.0",
+        "commander": "2.11.0",
+        "common-tags": "1.4.0",
+        "debug": "3.1.0",
+        "extract-zip": "1.6.6",
+        "fs-extra": "4.0.1",
+        "getos": "2.8.4",
+        "glob": "7.1.2",
+        "is-ci": "1.0.10",
+        "is-installed-globally": "0.1.0",
+        "lazy-ass": "1.6.0",
+        "listr": "0.12.0",
+        "lodash": "4.17.4",
+        "minimist": "1.2.0",
+        "progress": "1.1.8",
+        "ramda": "0.24.1",
+        "request": "2.81.0",
+        "request-progress": "0.3.1",
+        "supports-color": "5.1.0",
+        "tmp": "0.0.31",
+        "url": "0.11.0",
+        "yauzl": "2.8.0"
+      },
+      "dependencies": {
+        "@types/chai": {
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.8.tgz",
+          "integrity": "sha512-m812CONwdZn/dMzkIJEY0yAs4apyTkTORgfB2UsMOxgkUbC205AHnm4T8I0I5gPg9MHrFc1dJ35iS75c0CJkjg==",
+          "dev": true
+        },
+        "@types/lodash": {
+          "version": "4.14.87",
+          "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.87.tgz",
+          "integrity": "sha512-AqRC+aEF4N0LuNHtcjKtvF9OTfqZI0iaBoe3dA6m/W+/YZJBZjBmW/QIZ8fBeXC6cnytSY9tBoFBqZ9uSCeVsw==",
+          "dev": true
+        },
+        "@types/mocha": {
+          "version": "2.2.44",
+          "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.44.tgz",
+          "integrity": "sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw==",
+          "dev": true
+        },
+        "bluebird": {
+          "version": "3.5.0",
+          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz",
+          "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz",
+          "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "4.5.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "4.5.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+              "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+              "dev": true,
+              "requires": {
+                "has-flag": "2.0.0"
+              }
+            }
+          }
+        },
+        "commander": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+          "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+          "dev": true
+        },
+        "common-tags": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.4.0.tgz",
+          "integrity": "sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA=",
+          "dev": true,
+          "requires": {
+            "babel-runtime": "6.26.0"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "fs-extra": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz",
+          "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "jsonfile": "3.0.1",
+            "universalify": "0.1.1"
+          }
+        },
+        "jsonfile": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
+          "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11"
+          }
+        },
+        "lodash": {
+          "version": "4.17.4",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+          "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "ramda": {
+          "version": "0.24.1",
+          "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz",
+          "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=",
+          "dev": true
+        },
+        "request-progress": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz",
+          "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=",
+          "dev": true,
+          "requires": {
+            "throttleit": "0.0.2"
+          }
+        },
+        "supports-color": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz",
+          "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "2.0.0"
+          }
+        },
+        "throttleit": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+          "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+          "dev": true
+        },
+        "tmp": {
+          "version": "0.0.31",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
+          "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "1.0.2"
+          }
+        },
+        "yauzl": {
+          "version": "2.8.0",
+          "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz",
+          "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=",
+          "dev": true,
+          "requires": {
+            "buffer-crc32": "0.2.13",
+            "fd-slicer": "1.0.1"
+          }
+        }
+      }
+    },
+    "d": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+      "requires": {
+        "es5-ext": "0.10.41"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "data-uri-to-buffer": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz",
+      "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==",
+      "dev": true,
+      "optional": true
+    },
+    "date-fns": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
+      "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==",
+      "dev": true
+    },
+    "date-format": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
+      "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=",
+      "dev": true
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+    },
+    "dateformat": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+      "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1",
+        "meow": "3.7.0"
+      }
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+    },
+    "deep-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
+    },
+    "default-require-extensions": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
+      "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
+      "dev": true,
+      "requires": {
+        "strip-bom": "2.0.0"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+      "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+      "requires": {
+        "foreach": "2.0.5",
+        "object-keys": "1.0.11"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "requires": {
+        "is-descriptor": "1.0.2",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+    },
+    "degenerator": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz",
+      "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "ast-types": "0.11.3",
+        "escodegen": "1.9.1",
+        "esprima": "3.1.3"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "del": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+      "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+      "dev": true,
+      "requires": {
+        "globby": "6.1.0",
+        "is-path-cwd": "1.0.0",
+        "is-path-in-cwd": "1.0.0",
+        "p-map": "1.2.0",
+        "pify": "3.0.0",
+        "rimraf": "2.6.2"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "glob": "7.1.2",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+    },
+    "denodeify": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
+      "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
+      "dev": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "detect-node": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
+      "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
+      "dev": true
+    },
+    "detect-port-alt": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+      "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+      "requires": {
+        "address": "1.0.3",
+        "debug": "2.6.9"
+      }
+    },
+    "di": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+      "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+      "dev": true
+    },
+    "diff": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
+      "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "miller-rabin": "4.0.1",
+        "randombytes": "2.0.6"
+      }
+    },
+    "dir-glob": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+      "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+      "dev": true,
+      "requires": {
+        "arrify": "1.0.1",
+        "path-type": "3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "dev": true,
+      "requires": {
+        "ip": "1.1.5",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "1.1.1"
+      }
+    },
+    "doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "requires": {
+        "esutils": "2.0.2"
+      }
+    },
+    "dom-converter": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
+      "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
+      "requires": {
+        "utila": "0.3.3"
+      },
+      "dependencies": {
+        "utila": {
+          "version": "0.3.3",
+          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
+          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY="
+        }
+      }
+    },
+    "dom-helpers": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz",
+      "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg=="
+    },
+    "dom-serialize": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+      "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
+      "dev": true,
+      "requires": {
+        "custom-event": "1.0.1",
+        "ent": "2.2.0",
+        "extend": "3.0.1",
+        "void-elements": "2.0.1"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+      "requires": {
+        "domelementtype": "1.1.3",
+        "entities": "1.1.1"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
+        }
+      }
+    },
+    "dom-walk": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz",
+      "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg="
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
+    },
+    "domelementtype": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
+    },
+    "domhandler": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
+      "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
+      "requires": {
+        "domelementtype": "1.3.0"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "requires": {
+        "dom-serializer": "0.1.0",
+        "domelementtype": "1.3.0"
+      }
+    },
+    "dotenv": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz",
+      "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow=="
+    },
+    "dotenv-webpack": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.5.5.tgz",
+      "integrity": "sha1-NEEJTwTTBLYRnmtyUk5i+zJS9fI=",
+      "requires": {
+        "dotenv": "5.0.1"
+      }
+    },
+    "double-ended-queue": {
+      "version": "2.1.0-0",
+      "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
+      "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=",
+      "dev": true,
+      "optional": true
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
+    },
+    "duplexify": {
+      "version": "3.5.4",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
+      "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.5",
+        "stream-shift": "1.0.0"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+      "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "jsbn": "0.1.1"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+    },
+    "ejs": {
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz",
+      "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.39",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.39.tgz",
+      "integrity": "sha1-16RpZAnKCZXidQFW2mEsIhr62E0="
+    },
+    "elegant-spinner": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
+      "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
+      "dev": true
+    },
+    "elliptic": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+      "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0",
+        "hash.js": "1.1.3",
+        "hmac-drbg": "1.0.1",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "ember-cli-string-utils": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz",
+      "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=",
+      "dev": true
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+    },
+    "encoding": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+      "requires": {
+        "iconv-lite": "0.4.19"
+      }
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+      "requires": {
+        "once": "1.4.0"
+      }
+    },
+    "engine.io": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
+      "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "base64id": "1.0.0",
+        "cookie": "0.3.1",
+        "debug": "3.1.0",
+        "engine.io-parser": "2.1.2",
+        "uws": "9.14.0",
+        "ws": "3.3.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "engine.io-client": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz",
+      "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.2.1",
+        "component-inherit": "0.0.3",
+        "debug": "3.1.0",
+        "engine.io-parser": "2.1.2",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "parseqs": "0.0.5",
+        "parseuri": "0.0.5",
+        "ws": "3.3.3",
+        "xmlhttprequest-ssl": "1.5.5",
+        "yeast": "0.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "engine.io-parser": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+      "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+      "dev": true,
+      "requires": {
+        "after": "0.8.2",
+        "arraybuffer.slice": "0.0.7",
+        "base64-arraybuffer": "0.1.5",
+        "blob": "0.0.4",
+        "has-binary2": "1.0.2"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+      "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "memory-fs": "0.4.1",
+        "object-assign": "4.1.1",
+        "tapable": "0.2.8"
+      }
+    },
+    "ent": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+      "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+      "dev": true
+    },
+    "entities": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+      "requires": {
+        "prr": "1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+      "requires": {
+        "is-arrayish": "0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz",
+      "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==",
+      "requires": {
+        "es-to-primitive": "1.1.1",
+        "function-bind": "1.1.1",
+        "has": "1.0.1",
+        "is-callable": "1.1.3",
+        "is-regex": "1.0.4"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+      "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+      "requires": {
+        "is-callable": "1.1.3",
+        "is-date-object": "1.0.1",
+        "is-symbol": "1.0.1"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.41",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.41.tgz",
+      "integrity": "sha512-MYK02wXfwTMie5TEJWPolgOsXEmz7wKCQaGzgmRjZOoV6VLG8I5dSv2bn6AOClXhK64gnSQTQ9W9MKvx87J4gw==",
+      "requires": {
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1",
+        "next-tick": "1.0.0"
+      }
+    },
+    "es5-shim": {
+      "version": "4.5.10",
+      "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.10.tgz",
+      "integrity": "sha512-vmryBdqKRO8Ei9LJ4yyEk/EOmAOGIagcHDYPpTAi6pot4IMHS1AC2q5cTKPmydpijg2iX8DVmCuqgrNxIWj8Yg=="
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.41",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "es6-map": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.41",
+        "es6-iterator": "2.0.3",
+        "es6-set": "0.1.5",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-promise": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+      "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+      "dev": true
+    },
+    "es6-set": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.41",
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-shim": {
+      "version": "0.35.3",
+      "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz",
+      "integrity": "sha1-m/tzY/7//4emzbbNk+QF7DxLbyY="
+    },
+    "es6-symbol": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.41"
+      }
+    },
+    "es6-templates": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz",
+      "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=",
+      "requires": {
+        "recast": "0.11.23",
+        "through": "2.3.8"
+      },
+      "dependencies": {
+        "ast-types": {
+          "version": "0.9.6",
+          "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
+          "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk="
+        },
+        "esprima": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
+        },
+        "recast": {
+          "version": "0.11.23",
+          "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
+          "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=",
+          "requires": {
+            "ast-types": "0.9.6",
+            "esprima": "3.1.3",
+            "private": "0.1.8",
+            "source-map": "0.5.7"
+          }
+        }
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.41",
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "escodegen": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+      "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "esprima": "3.1.3",
+        "estraverse": "4.2.0",
+        "esutils": "2.0.2",
+        "optionator": "0.8.2",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+          "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+          "dev": true,
+          "optional": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "escope": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+      "requires": {
+        "es6-map": "0.1.5",
+        "es6-weak-map": "2.0.2",
+        "esrecurse": "4.2.1",
+        "estraverse": "4.2.0"
+      }
+    },
+    "esprima": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+      "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "requires": {
+        "estraverse": "4.2.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.41"
+      }
+    },
+    "eventemitter3": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+      "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+      "dev": true
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
+    },
+    "eventsource": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
+      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+      "requires": {
+        "original": "1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "requires": {
+        "md5.js": "1.3.4",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "execa": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "requires": {
+        "cross-spawn": "5.1.0",
+        "get-stream": "3.0.0",
+        "is-stream": "1.1.0",
+        "npm-run-path": "2.0.2",
+        "p-finally": "1.0.0",
+        "signal-exit": "3.0.2",
+        "strip-eof": "1.0.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "requires": {
+            "lru-cache": "4.1.2",
+            "shebang-command": "1.2.0",
+            "which": "1.3.0"
+          }
+        }
+      }
+    },
+    "exenv": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz",
+      "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50="
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "dev": true
+    },
+    "exit-hook": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
+      "dev": true
+    },
+    "expand-braces": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
+      "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+      "dev": true,
+      "requires": {
+        "array-slice": "0.2.3",
+        "array-unique": "0.2.1",
+        "braces": "0.1.5"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
+          "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
+          "dev": true,
+          "requires": {
+            "expand-range": "0.1.1"
+          }
+        },
+        "expand-range": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
+          "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
+          "dev": true,
+          "requires": {
+            "is-number": "0.1.1",
+            "repeat-string": "0.2.2"
+          }
+        },
+        "is-number": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
+          "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
+          "dev": true
+        },
+        "repeat-string": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
+          "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
+          "dev": true
+        }
+      }
+    },
+    "expand-brackets": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+      "dev": true,
+      "requires": {
+        "is-posix-bracket": "0.1.1"
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "dev": true,
+      "requires": {
+        "fill-range": "2.2.3"
+      }
+    },
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+      "requires": {
+        "homedir-polyfill": "1.0.1"
+      }
+    },
+    "express": {
+      "version": "4.16.3",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
+      "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+      "requires": {
+        "accepts": "1.3.5",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.2",
+        "content-disposition": "0.5.2",
+        "content-type": "1.0.4",
+        "cookie": "0.3.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "finalhandler": "1.1.1",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "1.1.2",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "2.0.3",
+        "qs": "6.5.1",
+        "range-parser": "1.2.0",
+        "safe-buffer": "5.1.1",
+        "send": "0.16.2",
+        "serve-static": "1.13.2",
+        "setprototypeof": "1.1.0",
+        "statuses": "1.4.0",
+        "type-is": "1.6.16",
+        "utils-merge": "1.0.1",
+        "vary": "1.1.2"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+        },
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+      "dev": true
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "requires": {
+        "assign-symbols": "1.0.0",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+      "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+      "requires": {
+        "chardet": "0.4.2",
+        "iconv-lite": "0.4.19",
+        "tmp": "0.0.33"
+      }
+    },
+    "extglob": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "1.0.0"
+      }
+    },
+    "extract-text-webpack-plugin": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz",
+      "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==",
+      "dev": true,
+      "requires": {
+        "async": "2.6.0",
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0",
+        "webpack-sources": "1.1.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "extract-zip": {
+      "version": "1.6.6",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
+      "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
+      "dev": true,
+      "requires": {
+        "concat-stream": "1.6.0",
+        "debug": "2.6.9",
+        "mkdirp": "0.5.0",
+        "yauzl": "2.4.1"
+      },
+      "dependencies": {
+        "concat-stream": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+          "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.3",
+            "readable-stream": "2.3.5",
+            "typedarray": "0.0.6"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
+          "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        }
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
+    "fancy-log": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+      "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+      "dev": true,
+      "requires": {
+        "ansi-gray": "0.1.1",
+        "color-support": "1.1.3",
+        "time-stamp": "1.1.0"
+      },
+      "dependencies": {
+        "time-stamp": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+          "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+          "dev": true
+        }
+      }
+    },
+    "fast-deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "fast-memoize": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.3.2.tgz",
+      "integrity": "sha512-h2avnhux4p3tXTA9xR7ntnQSFQdY4hAkyNj8wDXlVT2Die38JxVCInnrieuktdxzRevRWa3dBjN+SbQe1os0GQ=="
+    },
+    "fastparse": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
+      "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg="
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": "0.7.0"
+      }
+    },
+    "fbjs": {
+      "version": "0.8.16",
+      "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz",
+      "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=",
+      "requires": {
+        "core-js": "1.2.7",
+        "isomorphic-fetch": "2.2.1",
+        "loose-envify": "1.3.1",
+        "object-assign": "4.1.1",
+        "promise": "7.3.1",
+        "setimmediate": "1.0.5",
+        "ua-parser-js": "0.7.17"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+          "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
+        }
+      }
+    },
+    "fd-slicer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+      "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+      "dev": true,
+      "requires": {
+        "pend": "1.2.0"
+      }
+    },
+    "figures": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "requires": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "file-loader": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
+      "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
+      "requires": {
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.4.5"
+      }
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true,
+      "optional": true
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true
+    },
+    "fileset": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
+      "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.2",
+        "minimatch": "3.0.4"
+      }
+    },
+    "filesize": {
+      "version": "3.5.11",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz",
+      "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g=="
+    },
+    "fill-range": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+      "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+      "dev": true,
+      "requires": {
+        "is-number": "2.1.0",
+        "isobject": "2.1.0",
+        "randomatic": "1.1.7",
+        "repeat-element": "1.1.2",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "statuses": "1.4.0",
+        "unpipe": "1.0.0"
+      }
+    },
+    "find-cache-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
+      "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+      "requires": {
+        "commondir": "1.0.1",
+        "make-dir": "1.2.0",
+        "pkg-dir": "2.0.0"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "requires": {
+        "locate-path": "2.0.0"
+      }
+    },
+    "flatten": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
+      "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I="
+    },
+    "flush-write-stream": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz",
+      "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=",
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz",
+      "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "debug": "2.6.9"
+      }
+    },
+    "font-awesome": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
+      "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2"
+      }
+    },
+    "foreach": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+      "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+      "dev": true,
+      "requires": {
+        "asynckit": "0.4.0",
+        "combined-stream": "1.0.6",
+        "mime-types": "2.1.18"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "requires": {
+        "map-cache": "0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "fs": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz",
+      "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=",
+      "dev": true
+    },
+    "fs-access": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
+      "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
+      "dev": true,
+      "requires": {
+        "null-check": "1.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+      "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "jsonfile": "4.0.0",
+        "universalify": "0.1.1"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "iferr": "0.1.5",
+        "imurmurhash": "0.1.4",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
+      "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
+      "optional": true,
+      "requires": {
+        "nan": "2.10.0",
+        "node-pre-gyp": "0.6.39"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.0",
+          "bundled": true,
+          "optional": true
+        },
+        "ajv": {
+          "version": "4.11.8",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "co": "4.6.0",
+            "json-stable-stringify": "1.0.1"
+          }
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true
+        },
+        "aproba": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "delegates": "1.0.0",
+            "readable-stream": "2.2.9"
+          }
+        },
+        "asn1": {
+          "version": "0.2.3",
+          "bundled": true,
+          "optional": true
+        },
+        "assert-plus": {
+          "version": "0.2.0",
+          "bundled": true,
+          "optional": true
+        },
+        "asynckit": {
+          "version": "0.4.0",
+          "bundled": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.6.0",
+          "bundled": true,
+          "optional": true
+        },
+        "aws4": {
+          "version": "1.6.0",
+          "bundled": true,
+          "optional": true
+        },
+        "balanced-match": {
+          "version": "0.4.2",
+          "bundled": true
+        },
+        "bcrypt-pbkdf": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "tweetnacl": "0.14.5"
+          }
+        },
+        "block-stream": {
+          "version": "0.0.9",
+          "bundled": true,
+          "requires": {
+            "inherits": "2.0.3"
+          }
+        },
+        "boom": {
+          "version": "2.10.1",
+          "bundled": true,
+          "requires": {
+            "hoek": "2.16.3"
+          }
+        },
+        "brace-expansion": {
+          "version": "1.1.7",
+          "bundled": true,
+          "requires": {
+            "balanced-match": "0.4.2",
+            "concat-map": "0.0.1"
+          }
+        },
+        "buffer-shims": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "caseless": {
+          "version": "0.12.0",
+          "bundled": true,
+          "optional": true
+        },
+        "co": {
+          "version": "4.6.0",
+          "bundled": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "combined-stream": {
+          "version": "1.0.5",
+          "bundled": true,
+          "requires": {
+            "delayed-stream": "1.0.0"
+          }
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "cryptiles": {
+          "version": "2.0.5",
+          "bundled": true,
+          "requires": {
+            "boom": "2.10.1"
+          }
+        },
+        "dashdash": {
+          "version": "1.14.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "debug": {
+          "version": "2.6.8",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "bundled": true,
+          "optional": true
+        },
+        "delayed-stream": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "ecc-jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "0.1.1"
+          }
+        },
+        "extend": {
+          "version": "3.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "extsprintf": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "forever-agent": {
+          "version": "0.6.1",
+          "bundled": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.1.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.5",
+            "mime-types": "2.1.15"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "fstream": {
+          "version": "1.0.11",
+          "bundled": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "inherits": "2.0.3",
+            "mkdirp": "0.5.1",
+            "rimraf": "2.6.1"
+          }
+        },
+        "fstream-ignore": {
+          "version": "1.0.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "fstream": "1.0.11",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4"
+          }
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "aproba": "1.1.1",
+            "console-control-strings": "1.1.0",
+            "has-unicode": "2.0.1",
+            "object-assign": "4.1.1",
+            "signal-exit": "3.0.2",
+            "string-width": "1.0.2",
+            "strip-ansi": "3.0.1",
+            "wide-align": "1.1.2"
+          }
+        },
+        "getpass": {
+          "version": "0.1.7",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.11",
+          "bundled": true
+        },
+        "har-schema": {
+          "version": "1.0.5",
+          "bundled": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "4.2.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ajv": "4.11.8",
+            "har-schema": "1.0.5"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "hawk": {
+          "version": "3.1.3",
+          "bundled": true,
+          "requires": {
+            "boom": "2.10.1",
+            "cryptiles": "2.0.5",
+            "hoek": "2.16.3",
+            "sntp": "1.0.9"
+          }
+        },
+        "hoek": {
+          "version": "2.16.3",
+          "bundled": true
+        },
+        "http-signature": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "0.2.0",
+            "jsprim": "1.4.0",
+            "sshpk": "1.13.0"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "requires": {
+            "once": "1.4.0",
+            "wrappy": "1.0.2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true
+        },
+        "ini": {
+          "version": "1.3.4",
+          "bundled": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "jodid25519": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "0.1.1"
+          }
+        },
+        "jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "json-schema": {
+          "version": "0.2.3",
+          "bundled": true,
+          "optional": true
+        },
+        "json-stable-stringify": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "jsonify": "0.0.0"
+          }
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "jsonify": {
+          "version": "0.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "jsprim": {
+          "version": "1.4.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "extsprintf": "1.0.2",
+            "json-schema": "0.2.3",
+            "verror": "1.3.6"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "mime-db": {
+          "version": "1.27.0",
+          "bundled": true
+        },
+        "mime-types": {
+          "version": "2.1.15",
+          "bundled": true,
+          "requires": {
+            "mime-db": "1.27.0"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "requires": {
+            "brace-expansion": "1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "node-pre-gyp": {
+          "version": "0.6.39",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "1.0.2",
+            "hawk": "3.1.3",
+            "mkdirp": "0.5.1",
+            "nopt": "4.0.1",
+            "npmlog": "4.1.0",
+            "rc": "1.2.1",
+            "request": "2.81.0",
+            "rimraf": "2.6.1",
+            "semver": "5.3.0",
+            "tar": "2.2.1",
+            "tar-pack": "3.4.0"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1.1.0",
+            "osenv": "0.1.4"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "1.1.4",
+            "console-control-strings": "1.1.0",
+            "gauge": "2.7.4",
+            "set-blocking": "2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "oauth-sign": {
+          "version": "0.8.2",
+          "bundled": true,
+          "optional": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "requires": {
+            "wrappy": "1.0.2"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "1.0.2",
+            "os-tmpdir": "1.0.2"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "performance-now": {
+          "version": "0.2.0",
+          "bundled": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "bundled": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "bundled": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.4.0",
+          "bundled": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "0.4.2",
+            "ini": "1.3.4",
+            "minimist": "1.2.0",
+            "strip-json-comments": "2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.2.9",
+          "bundled": true,
+          "requires": {
+            "buffer-shims": "1.0.0",
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "1.0.7",
+            "string_decoder": "1.0.1",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "request": {
+          "version": "2.81.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.6.0",
+            "aws4": "1.6.0",
+            "caseless": "0.12.0",
+            "combined-stream": "1.0.5",
+            "extend": "3.0.1",
+            "forever-agent": "0.6.1",
+            "form-data": "2.1.4",
+            "har-validator": "4.2.1",
+            "hawk": "3.1.3",
+            "http-signature": "1.1.1",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.15",
+            "oauth-sign": "0.8.2",
+            "performance-now": "0.2.0",
+            "qs": "6.4.0",
+            "safe-buffer": "5.0.1",
+            "stringstream": "0.0.5",
+            "tough-cookie": "2.3.2",
+            "tunnel-agent": "0.6.0",
+            "uuid": "3.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.1",
+          "bundled": true,
+          "requires": {
+            "glob": "7.1.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.0.1",
+          "bundled": true
+        },
+        "semver": {
+          "version": "5.3.0",
+          "bundled": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "sntp": {
+          "version": "1.0.9",
+          "bundled": true,
+          "requires": {
+            "hoek": "2.16.3"
+          }
+        },
+        "sshpk": {
+          "version": "1.13.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "asn1": "0.2.3",
+            "assert-plus": "1.0.0",
+            "bcrypt-pbkdf": "1.0.1",
+            "dashdash": "1.14.1",
+            "ecc-jsbn": "0.1.1",
+            "getpass": "0.1.7",
+            "jodid25519": "1.0.2",
+            "jsbn": "0.1.1",
+            "tweetnacl": "0.14.5"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "requires": {
+            "code-point-at": "1.1.0",
+            "is-fullwidth-code-point": "1.0.0",
+            "strip-ansi": "3.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.0.1",
+          "bundled": true,
+          "requires": {
+            "safe-buffer": "5.0.1"
+          }
+        },
+        "stringstream": {
+          "version": "0.0.5",
+          "bundled": true,
+          "optional": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "requires": {
+            "ansi-regex": "2.1.1"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "2.2.1",
+          "bundled": true,
+          "requires": {
+            "block-stream": "0.0.9",
+            "fstream": "1.0.11",
+            "inherits": "2.0.3"
+          }
+        },
+        "tar-pack": {
+          "version": "3.4.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "debug": "2.6.8",
+            "fstream": "1.0.11",
+            "fstream-ignore": "1.0.5",
+            "once": "1.4.0",
+            "readable-stream": "2.2.9",
+            "rimraf": "2.6.1",
+            "tar": "2.2.1",
+            "uid-number": "0.0.6"
+          }
+        },
+        "tough-cookie": {
+          "version": "2.3.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "punycode": "1.4.1"
+          }
+        },
+        "tunnel-agent": {
+          "version": "0.6.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "5.0.1"
+          }
+        },
+        "tweetnacl": {
+          "version": "0.14.5",
+          "bundled": true,
+          "optional": true
+        },
+        "uid-number": {
+          "version": "0.0.6",
+          "bundled": true,
+          "optional": true
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "uuid": {
+          "version": "3.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "verror": {
+          "version": "1.3.6",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "extsprintf": "1.0.2"
+          }
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "string-width": "1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true
+        }
+      }
+    },
+    "fstream": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "inherits": "2.0.3",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2"
+      }
+    },
+    "ftp": {
+      "version": "0.3.10",
+      "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
+      "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "readable-stream": "1.1.14",
+        "xregexp": "2.0.0"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true,
+          "optional": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "function.prototype.name": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz",
+      "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==",
+      "requires": {
+        "define-properties": "1.1.2",
+        "function-bind": "1.1.1",
+        "is-callable": "1.1.3"
+      }
+    },
+    "fuse.js": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.2.0.tgz",
+      "integrity": "sha1-8ESOgGmFW/Kj5oPNwdMg5+KgfvQ="
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "requires": {
+        "aproba": "1.2.0",
+        "console-control-strings": "1.1.0",
+        "has-unicode": "2.0.1",
+        "object-assign": "4.1.1",
+        "signal-exit": "3.0.2",
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1",
+        "wide-align": "1.1.2"
+      }
+    },
+    "gaze": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
+      "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "globule": "1.2.0"
+      }
+    },
+    "generate-function": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+      "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+      "dev": true,
+      "optional": true
+    },
+    "generate-object-property": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+      "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "is-property": "1.0.2"
+      }
+    },
+    "get-caller-file": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+      "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+    },
+    "get-uri": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz",
+      "integrity": "sha512-7aelVrYqCLuVjq2kEKRTH8fXPTC0xKTkM+G7UlFkEwCXY3sFbSxvY375JoFowOAYbkaU47SrBvOefUlLZZ+6QA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "data-uri-to-buffer": "1.2.0",
+        "debug": "2.6.9",
+        "extend": "3.0.1",
+        "file-uri-to-path": "1.0.0",
+        "ftp": "0.3.10",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+    },
+    "getos": {
+      "version": "2.8.4",
+      "resolved": "https://registry.npmjs.org/getos/-/getos-2.8.4.tgz",
+      "integrity": "sha1-e4YD02GcKOOMsP56T2PDrLgNUWM=",
+      "dev": true,
+      "requires": {
+        "async": "2.1.4"
+      },
+      "dependencies": {
+        "async": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz",
+          "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=",
+          "dev": true,
+          "requires": {
+            "lodash": "4.17.5"
+          }
+        }
+      }
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "gitbook-plugin-github": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/gitbook-plugin-github/-/gitbook-plugin-github-2.0.0.tgz",
+      "integrity": "sha1-UWbnY8/MQC1DKIC3pshcHFS1ao0="
+    },
+    "glamor": {
+      "version": "2.20.40",
+      "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz",
+      "integrity": "sha512-DNXCd+c14N9QF8aAKrfl4xakPk5FdcFwmH7sD0qnC0Pr7xoZ5W9yovhUrY/dJc3psfGGXC58vqQyRtuskyUJxA==",
+      "requires": {
+        "fbjs": "0.8.16",
+        "inline-style-prefixer": "3.0.8",
+        "object-assign": "4.1.1",
+        "prop-types": "15.6.1",
+        "through": "2.3.8"
+      }
+    },
+    "glamorous": {
+      "version": "4.12.2",
+      "resolved": "https://registry.npmjs.org/glamorous/-/glamorous-4.12.2.tgz",
+      "integrity": "sha512-+jGoFgY+Czd/WFXDE4HszXJlYUks2xawlzNx+5rtkwjpc9M36QtgI7YXIq+X7rg1t8sc+0o/PJsO1A9T9atcVA==",
+      "requires": {
+        "brcast": "3.0.1",
+        "fast-memoize": "2.3.2",
+        "html-tag-names": "1.1.2",
+        "is-function": "1.0.1",
+        "is-plain-object": "2.0.4",
+        "react-html-attributes": "1.4.1",
+        "svg-tag-names": "1.1.1"
+      }
+    },
+    "glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+      "requires": {
+        "fs.realpath": "1.0.0",
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "dev": true,
+      "requires": {
+        "glob-parent": "2.0.0",
+        "is-glob": "2.0.1"
+      }
+    },
+    "glob-parent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+      "dev": true,
+      "requires": {
+        "is-glob": "2.0.1"
+      }
+    },
+    "global": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
+      "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
+      "requires": {
+        "min-document": "2.19.0",
+        "process": "0.5.2"
+      },
+      "dependencies": {
+        "process": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
+          "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8="
+        }
+      }
+    },
+    "global-dirs": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+      "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+      "dev": true,
+      "requires": {
+        "ini": "1.3.5"
+      }
+    },
+    "global-modules": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+      "requires": {
+        "global-prefix": "1.0.2",
+        "is-windows": "1.0.2",
+        "resolve-dir": "1.0.1"
+      }
+    },
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+      "requires": {
+        "expand-tilde": "2.0.2",
+        "homedir-polyfill": "1.0.1",
+        "ini": "1.3.5",
+        "is-windows": "1.0.2",
+        "which": "1.3.0"
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+    },
+    "globby": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "dev": true,
+      "requires": {
+        "array-union": "1.0.2",
+        "dir-glob": "2.0.0",
+        "glob": "7.1.2",
+        "ignore": "3.3.7",
+        "pify": "3.0.0",
+        "slash": "1.0.0"
+      }
+    },
+    "globule": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz",
+      "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "7.1.2",
+        "lodash": "4.17.5",
+        "minimatch": "3.0.4"
+      }
+    },
+    "glogg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+      "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+      "dev": true,
+      "requires": {
+        "sparkles": "1.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+    },
+    "gulp-util": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz",
+      "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=",
+      "dev": true,
+      "requires": {
+        "array-differ": "1.0.0",
+        "array-uniq": "1.0.3",
+        "beeper": "1.1.1",
+        "chalk": "1.1.3",
+        "dateformat": "1.0.12",
+        "fancy-log": "1.3.2",
+        "gulplog": "1.0.0",
+        "has-gulplog": "0.1.0",
+        "lodash._reescape": "3.0.0",
+        "lodash._reevaluate": "3.0.0",
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.template": "3.6.2",
+        "minimist": "1.2.0",
+        "multipipe": "0.1.2",
+        "object-assign": "3.0.0",
+        "replace-ext": "0.0.1",
+        "through2": "2.0.3",
+        "vinyl": "0.5.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "object-assign": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+          "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "gulplog": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+      "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+      "dev": true,
+      "requires": {
+        "glogg": "1.0.1"
+      }
+    },
+    "gzip-size": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
+      "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
+      "requires": {
+        "duplexer": "0.1.1"
+      }
+    },
+    "handle-thing": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+      "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+      "dev": true
+    },
+    "handlebars": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+      "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+      "dev": true,
+      "requires": {
+        "async": "1.5.2",
+        "optimist": "0.6.1",
+        "source-map": "0.4.4",
+        "uglify-js": "2.8.29"
+      },
+      "dependencies": {
+        "async": {
+          "version": "1.5.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
+        },
+        "camelcase": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+          "dev": true,
+          "optional": true
+        },
+        "cliui": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "center-align": "0.1.3",
+            "right-align": "0.1.3",
+            "wordwrap": "0.0.2"
+          }
+        },
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        },
+        "uglify-js": {
+          "version": "2.8.29",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-to-browserify": "1.0.2",
+            "yargs": "3.10.0"
+          },
+          "dependencies": {
+            "source-map": {
+              "version": "0.5.7",
+              "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+              "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "yargs": {
+          "version": "3.10.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+          "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "camelcase": "1.2.1",
+            "cliui": "2.1.0",
+            "decamelize": "1.2.0",
+            "window-size": "0.1.0"
+          }
+        }
+      }
+    },
+    "har-schema": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+      "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+      "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+      "dev": true,
+      "requires": {
+        "ajv": "4.11.8",
+        "har-schema": "1.0.5"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "4.11.8",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+          "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "json-stable-stringify": "1.0.1"
+          }
+        }
+      }
+    },
+    "has": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+      "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+      "requires": {
+        "function-bind": "1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "has-binary2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+      "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+      "dev": true,
+      "requires": {
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        }
+      }
+    },
+    "has-cors": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+      "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
+    },
+    "has-gulplog": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+      "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+      "dev": true,
+      "requires": {
+        "sparkles": "1.0.0"
+      }
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "requires": {
+        "get-value": "2.0.6",
+        "has-values": "1.0.0",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "requires": {
+        "is-number": "3.0.0",
+        "kind-of": "4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "requires": {
+            "is-buffer": "1.1.6"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
+      "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "hash.js": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
+      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "hasha": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
+      "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
+      "dev": true,
+      "requires": {
+        "is-stream": "1.1.0",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "hawk": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+      "dev": true,
+      "requires": {
+        "boom": "2.10.1",
+        "cryptiles": "2.0.5",
+        "hoek": "2.16.3",
+        "sntp": "1.0.9"
+      }
+    },
+    "he": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
+    },
+    "hipchat-notifier": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz",
+      "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "lodash": "4.17.5",
+        "request": "2.81.0"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "requires": {
+        "hash.js": "1.1.3",
+        "minimalistic-assert": "1.0.0",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "hoek": {
+      "version": "2.16.3",
+      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+      "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+      "dev": true
+    },
+    "hoist-non-react-statics": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
+      "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs="
+    },
+    "home-or-tmp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "homedir-polyfill": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+      "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+      "requires": {
+        "parse-passwd": "1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+      "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "obuf": "1.1.2",
+        "readable-stream": "2.3.5",
+        "wbuf": "1.7.3"
+      }
+    },
+    "html-comment-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
+      "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4="
+    },
+    "html-element-attributes": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/html-element-attributes/-/html-element-attributes-1.3.0.tgz",
+      "integrity": "sha1-8G69/OIt6XnbggICZcrFQfsX1Pw="
+    },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8="
+    },
+    "html-loader": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz",
+      "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==",
+      "requires": {
+        "es6-templates": "0.2.3",
+        "fastparse": "1.1.1",
+        "html-minifier": "3.5.12",
+        "loader-utils": "1.1.0",
+        "object-assign": "4.1.1"
+      }
+    },
+    "html-minifier": {
+      "version": "3.5.12",
+      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.12.tgz",
+      "integrity": "sha512-+N778qLf0RWBscD0TPGoYdeGNDZ0s76/0pQhY1/409EOudcENkm9IbSkk37RDyPdg/09GVHTKotU4ya93RF1Gg==",
+      "requires": {
+        "camel-case": "3.0.0",
+        "clean-css": "4.1.11",
+        "commander": "2.15.0",
+        "he": "1.1.1",
+        "ncname": "1.0.0",
+        "param-case": "2.1.1",
+        "relateurl": "0.2.7",
+        "uglify-js": "3.3.16"
+      }
+    },
+    "html-tag-names": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/html-tag-names/-/html-tag-names-1.1.2.tgz",
+      "integrity": "sha1-9lFolkxanIJnXv2ogoddyyqHXCI="
+    },
+    "html-webpack-plugin": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz",
+      "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=",
+      "requires": {
+        "bluebird": "3.5.1",
+        "html-minifier": "3.5.12",
+        "loader-utils": "0.2.17",
+        "lodash": "4.17.5",
+        "pretty-error": "2.1.1",
+        "toposort": "1.0.6"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "requires": {
+            "big.js": "3.2.0",
+            "emojis-list": "2.1.0",
+            "json5": "0.5.1",
+            "object-assign": "4.1.1"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
+      "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
+      "requires": {
+        "domelementtype": "1.3.0",
+        "domhandler": "2.1.0",
+        "domutils": "1.1.6",
+        "readable-stream": "1.0.34"
+      },
+      "dependencies": {
+        "domutils": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
+          "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
+          "requires": {
+            "domelementtype": "1.3.0"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        }
+      }
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+      "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+      "requires": {
+        "depd": "1.1.1",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.0.3",
+        "statuses": "1.4.0"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+          "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
+        },
+        "setprototypeof": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+          "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
+        }
+      }
+    },
+    "http-loader": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/http-loader/-/http-loader-0.0.1.tgz",
+      "integrity": "sha1-sE+MLY6HKuB5VyYG7/D0uO9V0Hw="
+    },
+    "http-parser-js": {
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.11.tgz",
+      "integrity": "sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA=="
+    },
+    "http-proxy": {
+      "version": "1.16.2",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
+      "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "1.2.0",
+        "requires-port": "1.0.0"
+      }
+    },
+    "http-proxy-agent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-1.0.0.tgz",
+      "integrity": "sha1-zBzjjkU7+YSg93AtLdWcc9CBKEo=",
+      "dev": true,
+      "requires": {
+        "agent-base": "2.1.1",
+        "debug": "2.6.9",
+        "extend": "3.0.1"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.17.4",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+      "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+      "dev": true,
+      "requires": {
+        "http-proxy": "1.16.2",
+        "is-glob": "3.1.0",
+        "lodash": "4.17.5",
+        "micromatch": "2.3.11"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+      "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "0.2.0",
+        "jsprim": "1.4.1",
+        "sshpk": "1.14.1"
+      }
+    },
+    "httpntlm": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz",
+      "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=",
+      "dev": true,
+      "requires": {
+        "httpreq": "0.4.24",
+        "underscore": "1.7.0"
+      }
+    },
+    "httpreq": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz",
+      "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=",
+      "dev": true
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+    },
+    "https-proxy-agent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+      "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+      "dev": true,
+      "requires": {
+        "agent-base": "2.1.1",
+        "debug": "2.6.9",
+        "extend": "3.0.1"
+      }
+    },
+    "hyphenate-style-name": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz",
+      "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es="
+    },
+    "iconv-lite": {
+      "version": "0.4.19",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+      "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+    },
+    "icss-replace-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+      "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0="
+    },
+    "icss-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+      "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+      "requires": {
+        "postcss": "6.0.20"
+      }
+    },
+    "ieee754": {
+      "version": "1.1.10",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.10.tgz",
+      "integrity": "sha512-byWFX8OyW/qeVxcY21r6Ncxl0ZYHgnf0cPup2h34eHXrCJbOp7IuqnJ4Q0omfyWl6Z++BTI6bByf31pZt7iRLg=="
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+    },
+    "ignore": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+      "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+      "dev": true
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "dev": true,
+      "optional": true
+    },
+    "immutable": {
+      "version": "3.8.2",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
+      "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM="
+    },
+    "import-local": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
+      "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "2.0.0",
+        "resolve-cwd": "2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+    },
+    "in-publish": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+      "dev": true,
+      "optional": true
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
+    },
+    "inflection": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.10.0.tgz",
+      "integrity": "sha1-W//LEZetPoEFD44X4hZoCH7p6y8=",
+      "dev": true,
+      "optional": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "1.4.0",
+        "wrappy": "1.0.2"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+    },
+    "inline-style-prefixer": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz",
+      "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=",
+      "requires": {
+        "bowser": "1.9.3",
+        "css-in-js-utils": "2.0.1"
+      }
+    },
+    "inquirer": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+      "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+      "requires": {
+        "ansi-escapes": "3.1.0",
+        "chalk": "2.2.2",
+        "cli-cursor": "2.1.0",
+        "cli-width": "2.2.0",
+        "external-editor": "2.2.0",
+        "figures": "2.0.0",
+        "lodash": "4.17.5",
+        "mute-stream": "0.0.7",
+        "run-async": "2.3.0",
+        "rx-lite": "4.0.8",
+        "rx-lite-aggregates": "4.0.8",
+        "string-width": "2.1.1",
+        "strip-ansi": "4.0.0",
+        "through": "2.3.8"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+        },
+        "is-fullwidth-code-point": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "requires": {
+            "is-fullwidth-code-point": "2.0.0",
+            "strip-ansi": "4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
+    },
+    "internal-ip": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz",
+      "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
+      "dev": true,
+      "requires": {
+        "meow": "3.7.0"
+      }
+    },
+    "interpret": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "requires": {
+        "loose-envify": "1.3.1"
+      }
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
+      "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs="
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
+    },
+    "is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+      "requires": {
+        "kind-of": "6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "requires": {
+        "binary-extensions": "1.11.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
+    "is-builtin-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "requires": {
+        "builtin-modules": "1.1.1"
+      }
+    },
+    "is-callable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
+      "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI="
+    },
+    "is-ci": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz",
+      "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=",
+      "dev": true,
+      "requires": {
+        "ci-info": "1.1.3"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+      "requires": {
+        "kind-of": "6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
+    },
+    "is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+      "requires": {
+        "is-accessor-descriptor": "1.0.0",
+        "is-data-descriptor": "1.0.0",
+        "kind-of": "6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
+    },
+    "is-dom": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz",
+      "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0="
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+      "dev": true
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "dev": true,
+      "requires": {
+        "is-primitive": "2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+    },
+    "is-extglob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-function": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz",
+      "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU="
+    },
+    "is-glob": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "1.0.0"
+      }
+    },
+    "is-installed-globally": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+      "dev": true,
+      "requires": {
+        "global-dirs": "0.1.1",
+        "is-path-inside": "1.0.1"
+      }
+    },
+    "is-my-ip-valid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+      "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+      "dev": true,
+      "optional": true
+    },
+    "is-my-json-valid": {
+      "version": "2.17.2",
+      "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
+      "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "generate-function": "2.0.0",
+        "generate-object-property": "1.2.0",
+        "is-my-ip-valid": "1.0.0",
+        "jsonpointer": "4.0.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "is-number": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-odd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+      "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+      "requires": {
+        "is-number": "4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+        }
+      }
+    },
+    "is-path-cwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+      "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "1.0.1"
+      }
+    },
+    "is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "1.0.2"
+      }
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+      "dev": true
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+      "dev": true
+    },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+    },
+    "is-property": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+      "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+      "dev": true,
+      "optional": true
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "requires": {
+        "has": "1.0.1"
+      }
+    },
+    "is-root": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz",
+      "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU="
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+    },
+    "is-svg": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
+      "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
+      "requires": {
+        "html-comment-regex": "1.1.1"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+      "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI="
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isbinaryfile": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
+      "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "dev": true,
+      "requires": {
+        "isarray": "1.0.0"
+      }
+    },
+    "isomorphic-fetch": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+      "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
+      "requires": {
+        "node-fetch": "1.7.3",
+        "whatwg-fetch": "2.0.4"
+      }
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "istanbul": {
+      "version": "0.4.5",
+      "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+      "dev": true,
+      "requires": {
+        "abbrev": "1.0.9",
+        "async": "1.5.2",
+        "escodegen": "1.8.1",
+        "esprima": "2.7.3",
+        "glob": "5.0.15",
+        "handlebars": "4.0.11",
+        "js-yaml": "3.11.0",
+        "mkdirp": "0.5.1",
+        "nopt": "3.0.6",
+        "once": "1.4.0",
+        "resolve": "1.1.7",
+        "supports-color": "3.2.3",
+        "which": "1.3.0",
+        "wordwrap": "1.0.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.0.9",
+          "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+          "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+          "dev": true
+        },
+        "async": {
+          "version": "1.5.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
+        },
+        "escodegen": {
+          "version": "1.8.1",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+          "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+          "dev": true,
+          "requires": {
+            "esprima": "2.7.3",
+            "estraverse": "1.9.3",
+            "esutils": "2.0.2",
+            "optionator": "0.8.2",
+            "source-map": "0.2.0"
+          }
+        },
+        "esprima": {
+          "version": "2.7.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+          "dev": true
+        },
+        "estraverse": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+          "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+          "dev": true
+        },
+        "glob": {
+          "version": "5.0.15",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+          "dev": true,
+          "requires": {
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "nopt": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+          "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+          "dev": true,
+          "requires": {
+            "abbrev": "1.0.9"
+          }
+        },
+        "resolve": {
+          "version": "1.1.7",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        },
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-api": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz",
+      "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==",
+      "dev": true,
+      "requires": {
+        "async": "2.6.0",
+        "compare-versions": "3.1.0",
+        "fileset": "2.0.3",
+        "istanbul-lib-coverage": "1.2.0",
+        "istanbul-lib-hook": "1.2.0",
+        "istanbul-lib-instrument": "1.10.1",
+        "istanbul-lib-report": "1.1.4",
+        "istanbul-lib-source-maps": "1.2.4",
+        "istanbul-reports": "1.3.0",
+        "js-yaml": "3.11.0",
+        "mkdirp": "0.5.1",
+        "once": "1.4.0"
+      }
+    },
+    "istanbul-instrumenter-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.0.tgz",
+      "integrity": "sha512-alLSEFX06ApU75sm5oWcaVNaiss/bgMRiWTct3g0P0ZZTKjR+6QiCcuVOKDI1kWJgwHEnIXsv/dWm783kPpmtw==",
+      "dev": true,
+      "requires": {
+        "convert-source-map": "1.5.1",
+        "istanbul-lib-instrument": "1.10.1",
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "istanbul-lib-coverage": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz",
+      "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==",
+      "dev": true
+    },
+    "istanbul-lib-hook": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz",
+      "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==",
+      "dev": true,
+      "requires": {
+        "append-transform": "0.4.0"
+      }
+    },
+    "istanbul-lib-instrument": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz",
+      "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==",
+      "dev": true,
+      "requires": {
+        "babel-generator": "6.26.1",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "istanbul-lib-coverage": "1.2.0",
+        "semver": "5.5.0"
+      }
+    },
+    "istanbul-lib-report": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz",
+      "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "1.2.0",
+        "mkdirp": "0.5.1",
+        "path-parse": "1.0.5",
+        "supports-color": "3.2.3"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz",
+      "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==",
+      "dev": true,
+      "requires": {
+        "debug": "3.1.0",
+        "istanbul-lib-coverage": "1.2.0",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "istanbul-reports": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz",
+      "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==",
+      "dev": true,
+      "requires": {
+        "handlebars": "4.0.11"
+      }
+    },
+    "jasmine": {
+      "version": "2.99.0",
+      "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz",
+      "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=",
+      "dev": true,
+      "requires": {
+        "exit": "0.1.2",
+        "glob": "7.1.2",
+        "jasmine-core": "2.99.1"
+      },
+      "dependencies": {
+        "jasmine-core": {
+          "version": "2.99.1",
+          "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz",
+          "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=",
+          "dev": true
+        }
+      }
+    },
+    "jasmine-core": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz",
+      "integrity": "sha1-b2G9eQYeJ/Q+b5NV5Es8bKtv8pc=",
+      "dev": true
+    },
+    "jasmine-spec-reporter": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
+      "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==",
+      "dev": true,
+      "requires": {
+        "colors": "1.1.2"
+      }
+    },
+    "jasminewd2": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz",
+      "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=",
+      "dev": true
+    },
+    "js-base64": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz",
+      "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw=="
+    },
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+    },
+    "js-yaml": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+      "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+      "requires": {
+        "argparse": "1.0.10",
+        "esprima": "4.0.0"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true,
+      "optional": true
+    },
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+      "dev": true
+    },
+    "json-loader": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
+      "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w=="
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
+    },
+    "json-stable-stringify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+      "dev": true,
+      "requires": {
+        "jsonify": "0.0.0"
+      }
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+    },
+    "json3": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE="
+    },
+    "json5": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11"
+      }
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+    },
+    "jsonpointer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+      "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+      "dev": true,
+      "optional": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "karma": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.2.tgz",
+      "integrity": "sha1-TS25QChQpmVR+nhLAWT7CCTtjEs=",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.1",
+        "body-parser": "1.18.2",
+        "chokidar": "1.7.0",
+        "colors": "1.1.2",
+        "combine-lists": "1.0.1",
+        "connect": "3.6.6",
+        "core-js": "2.4.1",
+        "di": "0.0.1",
+        "dom-serialize": "2.2.1",
+        "expand-braces": "0.1.2",
+        "glob": "7.1.2",
+        "graceful-fs": "4.1.11",
+        "http-proxy": "1.16.2",
+        "isbinaryfile": "3.0.2",
+        "lodash": "4.17.5",
+        "log4js": "2.5.3",
+        "mime": "1.6.0",
+        "minimatch": "3.0.4",
+        "optimist": "0.6.1",
+        "qjobs": "1.2.0",
+        "range-parser": "1.2.0",
+        "rimraf": "2.6.2",
+        "safe-buffer": "5.1.1",
+        "socket.io": "2.0.4",
+        "source-map": "0.6.1",
+        "tmp": "0.0.33",
+        "useragent": "2.2.1"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz",
+          "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "useragent": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz",
+          "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "2.2.4",
+            "tmp": "0.0.33"
+          }
+        }
+      }
+    },
+    "karma-chrome-launcher": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
+      "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
+      "dev": true,
+      "requires": {
+        "fs-access": "1.0.1",
+        "which": "1.3.0"
+      }
+    },
+    "karma-coverage-istanbul-reporter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.1.tgz",
+      "integrity": "sha512-UcgrHkFehI5+ivMouD8NH/UOHiX4oCAtwaANylzPFdcAuD52fnCUuelacq2gh8tZ4ydhU3+xiXofSq7j5Ehygw==",
+      "dev": true,
+      "requires": {
+        "istanbul-api": "1.3.1",
+        "minimatch": "3.0.4"
+      }
+    },
+    "karma-istanbul-threshold": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/karma-istanbul-threshold/-/karma-istanbul-threshold-1.2.2.tgz",
+      "integrity": "sha1-cWReASb9t5DeKGXJWFp5KV7LF/s=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "chokidar": "1.7.0",
+        "fs": "0.0.2",
+        "istanbul": "0.4.5",
+        "lodash": "4.17.5",
+        "minimatch": "3.0.4"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "karma-jasmine": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz",
+      "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=",
+      "dev": true
+    },
+    "karma-jasmine-html-reporter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.1.0.tgz",
+      "integrity": "sha512-uhNED+4B1axgptXkM8cCa3kztpQqsPrOxhfbjr4FdunNexnU6+cF2bfiIeGfsFMhphVyOMKy/S9LFaOFj8VXRA==",
+      "dev": true
+    },
+    "karma-junit-reporter": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz",
+      "integrity": "sha1-T5xAzt+xo5X4rvh2q/lhiZF8Y5Y=",
+      "dev": true,
+      "requires": {
+        "path-is-absolute": "1.0.1",
+        "xmlbuilder": "8.2.2"
+      },
+      "dependencies": {
+        "xmlbuilder": {
+          "version": "8.2.2",
+          "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+          "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+          "dev": true
+        }
+      }
+    },
+    "karma-phantomjs-launcher": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz",
+      "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.5",
+        "phantomjs-prebuilt": "2.1.16"
+      }
+    },
+    "karma-remap-istanbul": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/karma-remap-istanbul/-/karma-remap-istanbul-0.6.0.tgz",
+      "integrity": "sha1-l/O3cAZSVPm0ck8tm+SjouG69vw=",
+      "dev": true,
+      "requires": {
+        "istanbul": "0.4.5",
+        "remap-istanbul": "0.9.6"
+      }
+    },
+    "karma-source-map-support": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz",
+      "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=",
+      "dev": true,
+      "requires": {
+        "source-map-support": "0.4.18"
+      }
+    },
+    "karma-spec-reporter": {
+      "version": "0.0.32",
+      "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz",
+      "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=",
+      "dev": true,
+      "requires": {
+        "colors": "1.1.2"
+      }
+    },
+    "kew": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
+      "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
+      "dev": true
+    },
+    "keycode": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz",
+      "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ="
+    },
+    "killable": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz",
+      "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "requires": {
+        "is-buffer": "1.1.6"
+      }
+    },
+    "klaw": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+      "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11"
+      }
+    },
+    "lazy-ass": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+      "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=",
+      "dev": true
+    },
+    "lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "requires": {
+        "invert-kv": "1.0.0"
+      }
+    },
+    "less": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz",
+      "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
+      "dev": true,
+      "requires": {
+        "errno": "0.1.7",
+        "graceful-fs": "4.1.11",
+        "image-size": "0.5.5",
+        "mime": "1.6.0",
+        "mkdirp": "0.5.1",
+        "promise": "7.3.1",
+        "request": "2.81.0",
+        "source-map": "0.5.7"
+      }
+    },
+    "less-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
+      "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
+      "dev": true,
+      "requires": {
+        "clone": "2.1.1",
+        "loader-utils": "1.1.0",
+        "pify": "3.0.0"
+      }
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2"
+      }
+    },
+    "libbase64": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz",
+      "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=",
+      "dev": true
+    },
+    "libmime": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz",
+      "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.15",
+        "libbase64": "0.1.0",
+        "libqp": "1.1.0"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.15",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
+          "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
+          "dev": true
+        }
+      }
+    },
+    "libqp": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz",
+      "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=",
+      "dev": true
+    },
+    "license-webpack-plugin": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.0.tgz",
+      "integrity": "sha512-12Spl8M5Ty7aRszGQUEfNK1W0gwcWNfAj0sMyJv7E7BglAb4YaZ6FciGncmwzxEcuzJ45RjA/Fql3Gw13la6aA==",
+      "dev": true,
+      "requires": {
+        "ejs": "2.5.7"
+      }
+    },
+    "listr": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz",
+      "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-truncate": "0.2.1",
+        "figures": "1.7.0",
+        "indent-string": "2.1.0",
+        "is-promise": "2.1.0",
+        "is-stream": "1.1.0",
+        "listr-silent-renderer": "1.1.1",
+        "listr-update-renderer": "0.2.0",
+        "listr-verbose-renderer": "0.4.1",
+        "log-symbols": "1.0.2",
+        "log-update": "1.0.2",
+        "ora": "0.2.3",
+        "p-map": "1.2.0",
+        "rxjs": "5.5.6",
+        "stream-to-observable": "0.1.0",
+        "strip-ansi": "3.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "figures": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "1.0.5",
+            "object-assign": "4.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "listr-silent-renderer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
+      "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
+      "dev": true
+    },
+    "listr-update-renderer": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz",
+      "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-truncate": "0.2.1",
+        "elegant-spinner": "1.0.1",
+        "figures": "1.7.0",
+        "indent-string": "3.2.0",
+        "log-symbols": "1.0.2",
+        "log-update": "1.0.2",
+        "strip-ansi": "3.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "figures": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "1.0.5",
+            "object-assign": "4.1.1"
+          }
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "listr-verbose-renderer": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz",
+      "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-cursor": "1.0.2",
+        "date-fns": "1.29.0",
+        "figures": "1.7.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "cli-cursor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "1.0.1"
+          }
+        },
+        "figures": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+          "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "1.0.5",
+            "object-assign": "4.1.1"
+          }
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+          "dev": true
+        },
+        "restore-cursor": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+          "dev": true,
+          "requires": {
+            "exit-hook": "1.1.1",
+            "onetime": "1.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "parse-json": "2.2.0",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1",
+        "strip-bom": "2.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
+      "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI="
+    },
+    "loader-utils": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+      "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+      "requires": {
+        "big.js": "3.2.0",
+        "emojis-list": "2.1.0",
+        "json5": "0.5.1"
+      }
+    },
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "requires": {
+        "p-locate": "2.0.0",
+        "path-exists": "3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.5",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+      "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
+    },
+    "lodash-es": {
+      "version": "4.17.8",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.8.tgz",
+      "integrity": "sha512-I9mjAxengFAleSThFhhAhvba6fsO0hunb9/0sQ6qQihSZsJRBofv2rYH58WXaOb/O++eUmYpCLywSQ22GfU+sA=="
+    },
+    "lodash._basecopy": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+      "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+      "dev": true
+    },
+    "lodash._basetostring": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+      "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+      "dev": true
+    },
+    "lodash._basevalues": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+      "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+      "dev": true
+    },
+    "lodash._getnative": {
+      "version": "3.9.1",
+      "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+      "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
+    },
+    "lodash._isiterateecall": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+      "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+      "dev": true
+    },
+    "lodash._reescape": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+      "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+      "dev": true
+    },
+    "lodash._reevaluate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+      "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+      "dev": true
+    },
+    "lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+      "dev": true
+    },
+    "lodash._root": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+      "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
+      "dev": true
+    },
+    "lodash.assign": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+      "dev": true,
+      "optional": true
+    },
+    "lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "dev": true
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+    },
+    "lodash.escape": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+      "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+      "dev": true,
+      "requires": {
+        "lodash._root": "3.0.1"
+      }
+    },
+    "lodash.flattendeep": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI="
+    },
+    "lodash.isarguments": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+      "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
+    },
+    "lodash.isarray": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+      "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+    },
+    "lodash.keys": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+      "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+      "requires": {
+        "lodash._getnative": "3.9.1",
+        "lodash.isarguments": "3.1.0",
+        "lodash.isarray": "3.0.4"
+      }
+    },
+    "lodash.mergewith": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
+      "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
+      "dev": true,
+      "optional": true
+    },
+    "lodash.once": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
+      "dev": true
+    },
+    "lodash.pick": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+      "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
+    },
+    "lodash.restparam": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+      "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+      "dev": true
+    },
+    "lodash.some": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+      "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0="
+    },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
+    },
+    "lodash.tail": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
+      "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
+      "dev": true
+    },
+    "lodash.template": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+      "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+      "dev": true,
+      "requires": {
+        "lodash._basecopy": "3.0.1",
+        "lodash._basetostring": "3.0.1",
+        "lodash._basevalues": "3.0.0",
+        "lodash._isiterateecall": "3.0.9",
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.escape": "3.2.0",
+        "lodash.keys": "3.1.2",
+        "lodash.restparam": "3.6.1",
+        "lodash.templatesettings": "3.1.1"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+      "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "3.0.0",
+        "lodash.escape": "3.2.0"
+      }
+    },
+    "lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+    },
+    "log-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+      "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "log-update": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz",
+      "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "1.4.0",
+        "cli-cursor": "1.0.2"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+          "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
+          "dev": true
+        },
+        "cli-cursor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "1.0.1"
+          }
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+          "dev": true
+        },
+        "restore-cursor": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+          "dev": true,
+          "requires": {
+            "exit-hook": "1.1.1",
+            "onetime": "1.1.0"
+          }
+        }
+      }
+    },
+    "log4js": {
+      "version": "2.5.3",
+      "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.5.3.tgz",
+      "integrity": "sha512-YL/qpTxYtK0iWWbuKCrevDZz5lh+OjyHHD+mICqpjnYGKdNRBvPeh/1uYjkKUemT1CSO4wwLOwphWMpKAnD9kw==",
+      "dev": true,
+      "requires": {
+        "amqplib": "0.5.2",
+        "axios": "0.15.3",
+        "circular-json": "0.5.1",
+        "date-format": "1.2.0",
+        "debug": "3.1.0",
+        "hipchat-notifier": "1.1.0",
+        "loggly": "1.1.1",
+        "mailgun-js": "0.7.15",
+        "nodemailer": "2.7.2",
+        "redis": "2.8.0",
+        "semver": "5.5.0",
+        "slack-node": "0.2.0",
+        "streamroller": "0.7.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "loggly": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz",
+      "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "json-stringify-safe": "5.0.1",
+        "request": "2.75.0",
+        "timespan": "2.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true,
+          "optional": true
+        },
+        "caseless": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+          "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+          "dev": true,
+          "optional": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "form-data": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz",
+          "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.6",
+            "mime-types": "2.1.18"
+          }
+        },
+        "har-validator": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+          "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "commander": "2.15.0",
+            "is-my-json-valid": "2.17.2",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "node-uuid": {
+          "version": "1.4.8",
+          "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+          "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.2.3",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz",
+          "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
+          "dev": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.75.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz",
+          "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.6.0",
+            "aws4": "1.6.0",
+            "bl": "1.1.2",
+            "caseless": "0.11.0",
+            "combined-stream": "1.0.6",
+            "extend": "3.0.1",
+            "forever-agent": "0.6.1",
+            "form-data": "2.0.0",
+            "har-validator": "2.0.6",
+            "hawk": "3.1.3",
+            "http-signature": "1.1.1",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.18",
+            "node-uuid": "1.4.8",
+            "oauth-sign": "0.8.2",
+            "qs": "6.2.3",
+            "stringstream": "0.0.5",
+            "tough-cookie": "2.3.4",
+            "tunnel-agent": "0.4.3"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true,
+          "optional": true
+        },
+        "tunnel-agent": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+          "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "loglevel": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
+      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
+      "dev": true
+    },
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+    },
+    "loose-envify": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+      "requires": {
+        "js-tokens": "3.0.2"
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "0.4.1",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "lower-case": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
+    },
+    "lru-cache": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
+      "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
+      "requires": {
+        "pseudomap": "1.0.2",
+        "yallist": "2.1.2"
+      }
+    },
+    "macaddress": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz",
+      "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI="
+    },
+    "magic-string": {
+      "version": "0.22.5",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+      "dev": true,
+      "requires": {
+        "vlq": "0.2.3"
+      }
+    },
+    "mailcomposer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz",
+      "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "buildmail": "4.0.1",
+        "libmime": "3.0.0"
+      }
+    },
+    "mailgun-js": {
+      "version": "0.7.15",
+      "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.7.15.tgz",
+      "integrity": "sha1-7jZqINrGTDwVwD1sGz4O15UlKrs=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "async": "2.1.5",
+        "debug": "2.2.0",
+        "form-data": "2.1.4",
+        "inflection": "1.10.0",
+        "is-stream": "1.1.0",
+        "path-proxy": "1.0.0",
+        "proxy-agent": "2.0.0",
+        "q": "1.4.1",
+        "tsscmp": "1.0.5"
+      },
+      "dependencies": {
+        "async": {
+          "version": "2.1.5",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.1.5.tgz",
+          "integrity": "sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "lodash": "4.17.5"
+          }
+        },
+        "debug": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+          "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "0.7.1"
+          }
+        },
+        "ms": {
+          "version": "0.7.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+          "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "make-dir": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
+      "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
+      "requires": {
+        "pify": "3.0.0"
+      }
+    },
+    "make-error": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz",
+      "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g=="
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "requires": {
+        "object-visit": "1.0.1"
+      }
+    },
+    "markdown-loader": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/markdown-loader/-/markdown-loader-2.0.2.tgz",
+      "integrity": "sha512-v/ej7DflZbb6t//3Yu9vg0T+sun+Q9EoqggifeyABKfvFROqPwwwpv+hd1NKT2QxTRg6VCFk10IIJcMI13yCoQ==",
+      "requires": {
+        "loader-utils": "1.1.0",
+        "marked": "0.3.19"
+      }
+    },
+    "marked": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
+      "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg=="
+    },
+    "math-expression-evaluator": {
+      "version": "1.2.17",
+      "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
+      "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw="
+    },
+    "md5.js": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+      "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+      "requires": {
+        "hash-base": "3.0.4",
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "hash-base": {
+          "version": "3.0.4",
+          "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+          "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+          "requires": {
+            "inherits": "2.0.3",
+            "safe-buffer": "5.1.1"
+          }
+        }
+      }
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+    },
+    "mem": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+      "requires": {
+        "mimic-fn": "1.2.0"
+      }
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "requires": {
+        "errno": "0.1.7",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "2.1.0",
+        "decamelize": "1.2.0",
+        "loud-rejection": "1.6.0",
+        "map-obj": "1.0.1",
+        "minimist": "1.2.0",
+        "normalize-package-data": "2.4.0",
+        "object-assign": "4.1.1",
+        "read-pkg-up": "1.0.1",
+        "redent": "1.0.0",
+        "trim-newlines": "1.0.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+    },
+    "micromatch": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+      "dev": true,
+      "requires": {
+        "arr-diff": "2.0.0",
+        "array-unique": "0.2.1",
+        "braces": "1.8.5",
+        "expand-brackets": "0.1.5",
+        "extglob": "0.3.2",
+        "filename-regex": "2.0.1",
+        "is-extglob": "1.0.0",
+        "is-glob": "2.0.1",
+        "kind-of": "3.2.2",
+        "normalize-path": "2.1.1",
+        "object.omit": "2.0.1",
+        "parse-glob": "3.0.4",
+        "regex-cache": "0.4.4"
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0"
+      }
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+    },
+    "mime-db": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+      "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
+    },
+    "mime-types": {
+      "version": "2.1.18",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+      "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+      "requires": {
+        "mime-db": "1.33.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+    },
+    "min-document": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+      "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
+      "requires": {
+        "dom-walk": "0.1.1"
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+      "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M="
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "1.1.11"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+    },
+    "mississippi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
+      "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
+      "requires": {
+        "concat-stream": "1.6.1",
+        "duplexify": "3.5.4",
+        "end-of-stream": "1.4.1",
+        "flush-write-stream": "1.0.2",
+        "from2": "2.3.0",
+        "parallel-transform": "1.1.0",
+        "pump": "2.0.1",
+        "pumpify": "1.4.0",
+        "stream-each": "1.2.2",
+        "through2": "2.0.3"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "requires": {
+        "for-in": "1.0.2",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
+    "mixin-object": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+      "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
+      "dev": true,
+      "requires": {
+        "for-in": "0.1.8",
+        "is-extendable": "0.1.1"
+      },
+      "dependencies": {
+        "for-in": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+          "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
+          "dev": true
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "mobx": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/mobx/-/mobx-4.1.0.tgz",
+      "integrity": "sha1-5KlnnNr74hWyDjLvk6cDGEWz8a8="
+    },
+    "mobx-angular": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mobx-angular/-/mobx-angular-3.0.1.tgz",
+      "integrity": "sha512-PoEUEw74LoR7Ib6iGGCqvw8xMlmA/Zr5/0TVyhshq4kuzA8pHdvtCiE5AeyRK0w4LhyS7J0Qt0GboTgdhuys+A=="
+    },
+    "moment": {
+      "version": "2.22.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz",
+      "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ=="
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "requires": {
+        "aproba": "1.2.0",
+        "copy-concurrently": "1.0.5",
+        "fs-write-stream-atomic": "1.0.10",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "run-queue": "1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "requires": {
+        "dns-packet": "1.3.1",
+        "thunky": "1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "multipipe": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+      "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+      "dev": true,
+      "requires": {
+        "duplexer2": "0.0.2"
+      },
+      "dependencies": {
+        "duplexer2": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+          "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "1.1.14"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.1.14",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+    },
+    "nan": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+      "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+      "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+      "requires": {
+        "arr-diff": "4.0.0",
+        "array-unique": "0.3.2",
+        "define-property": "2.0.2",
+        "extend-shallow": "3.0.2",
+        "fragment-cache": "0.2.1",
+        "is-odd": "2.0.0",
+        "is-windows": "1.0.2",
+        "kind-of": "6.0.2",
+        "object.pick": "1.3.0",
+        "regex-not": "1.0.2",
+        "snapdragon": "0.8.2",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "ncname": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz",
+      "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=",
+      "requires": {
+        "xml-char-classes": "1.0.0"
+      }
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
+    },
+    "neo-async": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz",
+      "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g=="
+    },
+    "netmask": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz",
+      "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=",
+      "dev": true,
+      "optional": true
+    },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+    },
+    "ng-multiselect-dropdown": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/ng-multiselect-dropdown/-/ng-multiselect-dropdown-0.1.3.tgz",
+      "integrity": "sha512-N4MTqtcEwIQYOPB8LDer6eylo9uGmpNUrAS99HPYz9LTbupEiPkh/V87nsQmaenkiPndHXDbQhpa3/DSLcj+ew=="
+    },
+    "ng2-bootstrap-modal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ng2-bootstrap-modal/-/ng2-bootstrap-modal-1.0.1.tgz",
+      "integrity": "sha1-8xZvymP9Ozrqyym41eO4cqtqseQ="
+    },
+    "ngx-bootstrap": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-2.0.3.tgz",
+      "integrity": "sha512-SdtOQeQrT2BW5mUbzotZF8S55QaAYOBT7orrl2Pi/U5mCVH4U7YJIaN7yNzMfjGsYINmBOSY8Zi1MBUC1UzbWg=="
+    },
+    "ngx-contextmenu": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/ngx-contextmenu/-/ngx-contextmenu-4.1.2.tgz",
+      "integrity": "sha512-y8Q4txpzEIAgd6BqZCZQmEM0zlubfWZh/AU3Y5O2Xx+qF1hA2cYWNJZo/msqiK8ACpJ5xkAmBAs2O7nqqP0wiQ=="
+    },
+    "ngx-datatable": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/ngx-datatable/-/ngx-datatable-1.0.3.tgz",
+      "integrity": "sha1-nvmRWqAZ6Zg6qOOJe2H0APL9adU="
+    },
+    "ngx-moment": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ngx-moment/-/ngx-moment-2.0.0.tgz",
+      "integrity": "sha512-KVTiKeSbrnTTVVtEGvC/7cqN+SCTWtbFYcRP+o0gudOPOYPS35rjIRHygADSFWoq5XqctUr5tC4/ZsWv3vJDRw==",
+      "requires": {
+        "moment": "2.22.1",
+        "tslib": "1.9.0"
+      }
+    },
+    "ngx-tooltip": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/ngx-tooltip/-/ngx-tooltip-0.0.9.tgz",
+      "integrity": "sha1-mCFpPn2RxX2ugYnF1qgQUmiQtvY="
+    },
+    "no-case": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+      "requires": {
+        "lower-case": "1.1.4"
+      }
+    },
+    "node-dir": {
+      "version": "0.1.17",
+      "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
+      "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=",
+      "requires": {
+        "minimatch": "3.0.4"
+      }
+    },
+    "node-fetch": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+      "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+      "requires": {
+        "encoding": "0.1.12",
+        "is-stream": "1.1.0"
+      }
+    },
+    "node-forge": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz",
+      "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz",
+      "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "fstream": "1.0.11",
+        "glob": "7.1.2",
+        "graceful-fs": "4.1.11",
+        "minimatch": "3.0.4",
+        "mkdirp": "0.5.1",
+        "nopt": "3.0.6",
+        "npmlog": "4.1.2",
+        "osenv": "0.1.5",
+        "request": "2.81.0",
+        "rimraf": "2.6.2",
+        "semver": "5.3.0",
+        "tar": "2.2.1",
+        "which": "1.3.0"
+      },
+      "dependencies": {
+        "nopt": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+          "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1.1.1"
+          }
+        },
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "node-libs-browser": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
+      "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
+      "requires": {
+        "assert": "1.4.1",
+        "browserify-zlib": "0.2.0",
+        "buffer": "4.9.1",
+        "console-browserify": "1.1.0",
+        "constants-browserify": "1.0.0",
+        "crypto-browserify": "3.12.0",
+        "domain-browser": "1.2.0",
+        "events": "1.1.1",
+        "https-browserify": "1.0.0",
+        "os-browserify": "0.3.0",
+        "path-browserify": "0.0.0",
+        "process": "0.11.10",
+        "punycode": "1.4.1",
+        "querystring-es3": "0.2.1",
+        "readable-stream": "2.3.5",
+        "stream-browserify": "2.0.1",
+        "stream-http": "2.8.1",
+        "string_decoder": "1.0.3",
+        "timers-browserify": "2.0.6",
+        "tty-browserify": "0.0.0",
+        "url": "0.11.0",
+        "util": "0.10.3",
+        "vm-browserify": "0.0.4"
+      }
+    },
+    "node-modules-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz",
+      "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=",
+      "dev": true
+    },
+    "node-sass": {
+      "version": "4.7.2",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz",
+      "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "async-foreach": "0.1.3",
+        "chalk": "1.1.3",
+        "cross-spawn": "3.0.1",
+        "gaze": "1.1.2",
+        "get-stdin": "4.0.1",
+        "glob": "7.1.2",
+        "in-publish": "2.0.0",
+        "lodash.assign": "4.2.0",
+        "lodash.clonedeep": "4.5.0",
+        "lodash.mergewith": "4.6.1",
+        "meow": "3.7.0",
+        "mkdirp": "0.5.1",
+        "nan": "2.10.0",
+        "node-gyp": "3.6.2",
+        "npmlog": "4.1.2",
+        "request": "2.79.0",
+        "sass-graph": "2.2.4",
+        "stdout-stream": "1.4.0",
+        "true-case-path": "1.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "caseless": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+          "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+          "dev": true,
+          "optional": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "har-validator": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+          "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "commander": "2.15.0",
+            "is-my-json-valid": "2.17.2",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "qs": {
+          "version": "6.3.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+          "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+          "dev": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.79.0",
+          "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+          "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.6.0",
+            "aws4": "1.6.0",
+            "caseless": "0.11.0",
+            "combined-stream": "1.0.6",
+            "extend": "3.0.1",
+            "forever-agent": "0.6.1",
+            "form-data": "2.1.4",
+            "har-validator": "2.0.6",
+            "hawk": "3.1.3",
+            "http-signature": "1.1.1",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.18",
+            "oauth-sign": "0.8.2",
+            "qs": "6.3.2",
+            "stringstream": "0.0.5",
+            "tough-cookie": "2.3.4",
+            "tunnel-agent": "0.4.3",
+            "uuid": "3.2.1"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        },
+        "tunnel-agent": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+          "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "nodemailer": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz",
+      "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "libmime": "3.0.0",
+        "mailcomposer": "4.0.1",
+        "nodemailer-direct-transport": "3.3.2",
+        "nodemailer-shared": "1.1.0",
+        "nodemailer-smtp-pool": "2.8.2",
+        "nodemailer-smtp-transport": "2.7.2",
+        "socks": "1.1.9"
+      },
+      "dependencies": {
+        "socks": {
+          "version": "1.1.9",
+          "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz",
+          "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ip": "1.1.5",
+            "smart-buffer": "1.1.15"
+          }
+        }
+      }
+    },
+    "nodemailer-direct-transport": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz",
+      "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nodemailer-shared": "1.1.0",
+        "smtp-connection": "2.12.0"
+      }
+    },
+    "nodemailer-fetch": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz",
+      "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=",
+      "dev": true
+    },
+    "nodemailer-shared": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz",
+      "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=",
+      "dev": true,
+      "requires": {
+        "nodemailer-fetch": "1.6.0"
+      }
+    },
+    "nodemailer-smtp-pool": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz",
+      "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nodemailer-shared": "1.1.0",
+        "nodemailer-wellknown": "0.1.10",
+        "smtp-connection": "2.12.0"
+      }
+    },
+    "nodemailer-smtp-transport": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz",
+      "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nodemailer-shared": "1.1.0",
+        "nodemailer-wellknown": "0.1.10",
+        "smtp-connection": "2.12.0"
+      }
+    },
+    "nodemailer-wellknown": {
+      "version": "0.1.10",
+      "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz",
+      "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=",
+      "dev": true
+    },
+    "nopt": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+      "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+      "dev": true,
+      "requires": {
+        "abbrev": "1.1.1",
+        "osenv": "0.1.5"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+      "requires": {
+        "hosted-git-info": "2.6.0",
+        "is-builtin-module": "1.0.0",
+        "semver": "5.5.0",
+        "validate-npm-package-license": "3.0.3"
+      }
+    },
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "requires": {
+        "remove-trailing-separator": "1.1.0"
+      }
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+    },
+    "normalize-url": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+      "requires": {
+        "object-assign": "4.1.1",
+        "prepend-http": "1.0.4",
+        "query-string": "4.3.4",
+        "sort-keys": "1.1.2"
+      }
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "requires": {
+        "path-key": "2.0.1"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "requires": {
+        "are-we-there-yet": "1.1.4",
+        "console-control-strings": "1.1.0",
+        "gauge": "2.7.4",
+        "set-blocking": "2.0.0"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
+      "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
+      "requires": {
+        "boolbase": "1.0.0"
+      }
+    },
+    "null-check": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz",
+      "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=",
+      "dev": true
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+    },
+    "oauth-sign": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "object-component": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+      "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "requires": {
+        "copy-descriptor": "0.1.1",
+        "define-property": "0.2.5",
+        "kind-of": "3.2.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "requires": {
+            "kind-of": "3.2.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "requires": {
+            "kind-of": "3.2.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+            }
+          }
+        }
+      }
+    },
+    "object-keys": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+      "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0="
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "object.entries": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz",
+      "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1",
+        "has": "1.0.1"
+      }
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
+      "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0"
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "dev": true,
+      "requires": {
+        "for-own": "0.1.5",
+        "is-extendable": "0.1.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "requires": {
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "object.values": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz",
+      "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1",
+        "has": "1.0.1"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1.0.2"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "requires": {
+        "mimic-fn": "1.2.0"
+      }
+    },
+    "opn": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz",
+      "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "1.1.0"
+      }
+    },
+    "optimist": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8",
+        "wordwrap": "0.0.2"
+      }
+    },
+    "optionator": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+      "dev": true,
+      "requires": {
+        "deep-is": "0.1.3",
+        "fast-levenshtein": "2.0.6",
+        "levn": "0.3.0",
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2",
+        "wordwrap": "1.0.0"
+      },
+      "dependencies": {
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+          "dev": true
+        }
+      }
+    },
+    "options": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
+      "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
+      "dev": true
+    },
+    "ora": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz",
+      "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cli-cursor": "1.0.2",
+        "cli-spinners": "0.1.2",
+        "object-assign": "4.1.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "cli-cursor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "1.0.1"
+          }
+        },
+        "onetime": {
+          "version": "1.1.0",
+          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+          "dev": true
+        },
+        "restore-cursor": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+          "dev": true,
+          "requires": {
+            "exit-hook": "1.1.1",
+            "onetime": "1.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "original": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz",
+      "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=",
+      "requires": {
+        "url-parse": "1.0.5"
+      },
+      "dependencies": {
+        "url-parse": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz",
+          "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=",
+          "requires": {
+            "querystringify": "0.0.4",
+            "requires-port": "1.0.0"
+          }
+        }
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "requires": {
+        "lcid": "1.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+    },
+    "p-limit": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+      "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+      "requires": {
+        "p-try": "1.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "requires": {
+        "p-limit": "1.2.0"
+      }
+    },
+    "p-map": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+      "dev": true
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+    },
+    "pac-proxy-agent": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz",
+      "integrity": "sha512-QBELCWyLYPgE2Gj+4wUEiMscHrQ8nRPBzYItQNOHWavwBt25ohZHQC4qnd5IszdVVrFbLsQ+dPkm6eqdjJAmwQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "agent-base": "2.1.1",
+        "debug": "2.6.9",
+        "extend": "3.0.1",
+        "get-uri": "2.0.1",
+        "http-proxy-agent": "1.0.0",
+        "https-proxy-agent": "1.0.0",
+        "pac-resolver": "2.0.0",
+        "raw-body": "2.3.2",
+        "socks-proxy-agent": "2.1.1"
+      }
+    },
+    "pac-resolver": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-2.0.0.tgz",
+      "integrity": "sha1-mbiNLxk/ve78HJpSnB8yYKtSd80=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "co": "3.0.6",
+        "degenerator": "1.0.4",
+        "ip": "1.0.1",
+        "netmask": "1.0.6",
+        "thunkify": "2.1.2"
+      },
+      "dependencies": {
+        "co": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz",
+          "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=",
+          "dev": true,
+          "optional": true
+        },
+        "ip": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz",
+          "integrity": "sha1-x+NWzeoiWucbNtcPLnGpK6TkJZA=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "pako": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+      "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg=="
+    },
+    "parallel-transform": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+      "requires": {
+        "cyclist": "0.2.2",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "param-case": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+      "requires": {
+        "no-case": "2.3.2"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
+      "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
+      "requires": {
+        "asn1.js": "4.10.1",
+        "browserify-aes": "1.1.1",
+        "create-hash": "1.1.3",
+        "evp_bytestokey": "1.0.3",
+        "pbkdf2": "3.0.14"
+      }
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "dev": true,
+      "requires": {
+        "glob-base": "0.3.0",
+        "is-dotfile": "1.0.3",
+        "is-extglob": "1.0.0",
+        "is-glob": "2.0.1"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "requires": {
+        "error-ex": "1.3.1"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+    },
+    "parseqs": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+      "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+      "dev": true,
+      "requires": {
+        "better-assert": "1.0.2"
+      }
+    },
+    "parseuri": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+      "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+      "dev": true,
+      "requires": {
+        "better-assert": "1.0.2"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+    },
+    "path-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo="
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+    },
+    "path-parse": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+    },
+    "path-proxy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz",
+      "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "inflection": "1.3.8"
+      },
+      "dependencies": {
+        "inflection": {
+          "version": "1.3.8",
+          "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz",
+          "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+      "dev": true,
+      "requires": {
+        "pify": "3.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.0.14",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz",
+      "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==",
+      "requires": {
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "ripemd160": "2.0.1",
+        "safe-buffer": "5.1.1",
+        "sha.js": "2.4.10"
+      }
+    },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+      "dev": true
+    },
+    "performance-now": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+      "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+      "dev": true
+    },
+    "phantomjs-prebuilt": {
+      "version": "2.1.16",
+      "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
+      "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
+      "dev": true,
+      "requires": {
+        "es6-promise": "4.2.4",
+        "extract-zip": "1.6.6",
+        "fs-extra": "1.0.0",
+        "hasha": "2.2.0",
+        "kew": "0.7.0",
+        "progress": "1.1.8",
+        "request": "2.81.0",
+        "request-progress": "2.0.1",
+        "which": "1.3.0"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
+          "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "jsonfile": "2.4.0",
+            "klaw": "1.3.1"
+          }
+        },
+        "jsonfile": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+          "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11"
+          }
+        }
+      }
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "2.0.4"
+      }
+    },
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "requires": {
+        "find-up": "2.1.0"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz",
+      "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=",
+      "dev": true,
+      "requires": {
+        "async": "1.5.2",
+        "debug": "2.6.9",
+        "mkdirp": "0.5.1"
+      },
+      "dependencies": {
+        "async": {
+          "version": "1.5.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+    },
+    "postcss": {
+      "version": "6.0.20",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.20.tgz",
+      "integrity": "sha512-Opr6usW30Iy0xEDrJywDckRxtylfO7gTGs3Kfb2LdLQlGsUg89fTy0R3Vm1Dub2YHO7MK58avr0p70+uFFHb7A==",
+      "requires": {
+        "chalk": "2.3.2",
+        "source-map": "0.6.1",
+        "supports-color": "5.3.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+          "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.3.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        },
+        "supports-color": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+          "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-calc": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz",
+      "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=",
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-message-helpers": "2.0.0",
+        "reduce-css-calc": "1.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-colormin": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz",
+      "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=",
+      "requires": {
+        "colormin": "1.1.2",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz",
+      "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=",
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz",
+      "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=",
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz",
+      "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=",
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz",
+      "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=",
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz",
+      "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=",
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-unused": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz",
+      "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=",
+      "requires": {
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-filter-plugins": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz",
+      "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=",
+      "requires": {
+        "postcss": "5.2.18",
+        "uniqid": "4.1.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-flexbugs-fixes": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.3.0.tgz",
+      "integrity": "sha512-15JauG6a2hu2XZHdB9BaOwCLrI9oyK2UB8kt1ToTGdP1Pd3BQ/TJI9tNiTALntll25/66xMLUIyUPA9w/3BLtg==",
+      "requires": {
+        "postcss": "6.0.20"
+      }
+    },
+    "postcss-import": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz",
+      "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.20",
+        "postcss-value-parser": "3.3.0",
+        "read-cache": "1.0.0",
+        "resolve": "1.5.0"
+      }
+    },
+    "postcss-load-config": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz",
+      "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=",
+      "requires": {
+        "cosmiconfig": "2.2.2",
+        "object-assign": "4.1.1",
+        "postcss-load-options": "1.2.0",
+        "postcss-load-plugins": "2.3.0"
+      }
+    },
+    "postcss-load-options": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz",
+      "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=",
+      "requires": {
+        "cosmiconfig": "2.2.2",
+        "object-assign": "4.1.1"
+      }
+    },
+    "postcss-load-plugins": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz",
+      "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=",
+      "requires": {
+        "cosmiconfig": "2.2.2",
+        "object-assign": "4.1.1"
+      }
+    },
+    "postcss-loader": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.2.tgz",
+      "integrity": "sha512-Hf7gcgJKlJivXZAMprvVq6m6t7lZSkiih4Sa7cOoCd8sEHGMnH/Yc0CbWT2cL1ag+XEKh6nsdpgF6yNHplpa9Q==",
+      "requires": {
+        "loader-utils": "1.1.0",
+        "postcss": "6.0.20",
+        "postcss-load-config": "1.2.0",
+        "schema-utils": "0.4.5"
+      }
+    },
+    "postcss-merge-idents": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz",
+      "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=",
+      "requires": {
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz",
+      "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=",
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz",
+      "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=",
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-api": "1.6.1",
+        "postcss": "5.2.18",
+        "postcss-selector-parser": "2.2.3",
+        "vendors": "1.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "requires": {
+            "caniuse-db": "1.0.30000827",
+            "electron-to-chromium": "1.3.39"
+          }
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-message-helpers": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz",
+      "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4="
+    },
+    "postcss-minify-font-values": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz",
+      "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=",
+      "requires": {
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz",
+      "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=",
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz",
+      "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=",
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz",
+      "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=",
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "postcss-selector-parser": "2.2.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz",
+      "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=",
+      "requires": {
+        "postcss": "6.0.20"
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+      "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+      "requires": {
+        "css-selector-tokenizer": "0.7.0",
+        "postcss": "6.0.20"
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+      "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+      "requires": {
+        "css-selector-tokenizer": "0.7.0",
+        "postcss": "6.0.20"
+      }
+    },
+    "postcss-modules-values": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+      "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+      "requires": {
+        "icss-replace-symbols": "1.1.0",
+        "postcss": "6.0.20"
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
+      "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=",
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz",
+      "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=",
+      "requires": {
+        "is-absolute-url": "2.1.0",
+        "normalize-url": "1.9.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz",
+      "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=",
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-idents": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz",
+      "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=",
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz",
+      "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=",
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz",
+      "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=",
+      "requires": {
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+      "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+      "requires": {
+        "flatten": "1.0.2",
+        "indexes-of": "1.0.1",
+        "uniq": "1.0.1"
+      }
+    },
+    "postcss-svgo": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz",
+      "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
+      "requires": {
+        "is-svg": "2.1.0",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0",
+        "svgo": "0.7.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz",
+      "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=",
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-url": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.1.tgz",
+      "integrity": "sha512-Ya5KIjGptgz0OtrVYfi2UbLxVAZ6Emc4Of+Grx4Sf1deWlRpFwLr8FrtkUxfqh+XiZIVkXbjQrddE10ESpNmdA==",
+      "dev": true,
+      "requires": {
+        "mime": "1.6.0",
+        "minimatch": "3.0.4",
+        "mkdirp": "0.5.1",
+        "postcss": "6.0.20",
+        "xxhashjs": "0.2.2"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+      "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU="
+    },
+    "postcss-zindex": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz",
+      "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
+      "requires": {
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+      "dev": true
+    },
+    "prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+      "dev": true
+    },
+    "pretty-error": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+      "requires": {
+        "renderkid": "2.0.1",
+        "utila": "0.4.0"
+      }
+    },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+    },
+    "progress": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+      "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+      "dev": true
+    },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "requires": {
+        "asap": "2.0.6"
+      }
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+    },
+    "promise.prototype.finally": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz",
+      "integrity": "sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ==",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1"
+      }
+    },
+    "prop-types": {
+      "version": "15.6.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz",
+      "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==",
+      "requires": {
+        "fbjs": "0.8.16",
+        "loose-envify": "1.3.1",
+        "object-assign": "4.1.1"
+      }
+    },
+    "protractor": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz",
+      "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=",
+      "dev": true,
+      "requires": {
+        "@types/node": "6.0.60",
+        "@types/q": "0.0.32",
+        "@types/selenium-webdriver": "2.53.43",
+        "blocking-proxy": "0.0.5",
+        "chalk": "1.1.3",
+        "glob": "7.1.2",
+        "jasmine": "2.99.0",
+        "jasminewd2": "2.2.0",
+        "optimist": "0.6.1",
+        "q": "1.4.1",
+        "saucelabs": "1.3.0",
+        "selenium-webdriver": "3.0.1",
+        "source-map-support": "0.4.18",
+        "webdriver-js-extender": "1.0.0",
+        "webdriver-manager": "12.0.6"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "del": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+          "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+          "dev": true,
+          "requires": {
+            "globby": "5.0.0",
+            "is-path-cwd": "1.0.0",
+            "is-path-in-cwd": "1.0.0",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1",
+            "rimraf": "2.6.2"
+          }
+        },
+        "globby": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "arrify": "1.0.1",
+            "glob": "7.1.2",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        },
+        "webdriver-manager": {
+          "version": "12.0.6",
+          "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz",
+          "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=",
+          "dev": true,
+          "requires": {
+            "adm-zip": "0.4.7",
+            "chalk": "1.1.3",
+            "del": "2.2.2",
+            "glob": "7.1.2",
+            "ini": "1.3.5",
+            "minimist": "1.2.0",
+            "q": "1.4.1",
+            "request": "2.81.0",
+            "rimraf": "2.6.2",
+            "semver": "5.5.0",
+            "xml2js": "0.4.19"
+          }
+        }
+      }
+    },
+    "proxy-addr": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
+      "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
+      "requires": {
+        "forwarded": "0.1.2",
+        "ipaddr.js": "1.6.0"
+      }
+    },
+    "proxy-agent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz",
+      "integrity": "sha1-V+tTR6qAXXTsaByyVknbo5yTNJk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "agent-base": "2.1.1",
+        "debug": "2.6.9",
+        "extend": "3.0.1",
+        "http-proxy-agent": "1.0.0",
+        "https-proxy-agent": "1.0.0",
+        "lru-cache": "2.6.5",
+        "pac-proxy-agent": "1.1.0",
+        "socks-proxy-agent": "2.1.1"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "2.6.5",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz",
+          "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+    },
+    "public-encrypt": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
+      "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.1.3",
+        "parse-asn1": "5.1.0",
+        "randombytes": "2.0.6"
+      }
+    },
+    "pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "once": "1.4.0"
+      }
+    },
+    "pumpify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz",
+      "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
+      "requires": {
+        "duplexify": "3.5.4",
+        "inherits": "2.0.3",
+        "pump": "2.0.1"
+      }
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+    },
+    "q": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+      "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4="
+    },
+    "qjobs": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+      "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+      "dev": true
+    },
+    "query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+      "requires": {
+        "object-assign": "4.1.1",
+        "strict-uri-encode": "1.1.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+    },
+    "querystringify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz",
+      "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw="
+    },
+    "radium": {
+      "version": "0.19.6",
+      "resolved": "https://registry.npmjs.org/radium/-/radium-0.19.6.tgz",
+      "integrity": "sha512-IABYntqCwYelUUIwA52maSCgJbqtJjHKIoD21wgpw3dGhIUbJ5chDShDGdaFiEzdF03hN9jfQqlmn0bF4YhfrQ==",
+      "requires": {
+        "array-find": "1.0.0",
+        "exenv": "1.2.2",
+        "inline-style-prefixer": "2.0.5",
+        "prop-types": "15.6.1"
+      },
+      "dependencies": {
+        "inline-style-prefixer": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz",
+          "integrity": "sha1-wVPH6I/YT+9cYC6VqBaLJ3BnH+c=",
+          "requires": {
+            "bowser": "1.9.3",
+            "hyphenate-style-name": "1.0.2"
+          }
+        }
+      }
+    },
+    "ramda": {
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz",
+      "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU="
+    },
+    "randomatic": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+      "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+      "dev": true,
+      "requires": {
+        "is-number": "3.0.0",
+        "kind-of": "4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "1.1.6"
+          }
+        }
+      }
+    },
+    "randombytes": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+      "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "requires": {
+        "randombytes": "2.0.6",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
+    },
+    "raw-body": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+      "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+      "requires": {
+        "bytes": "3.0.0",
+        "http-errors": "1.6.2",
+        "iconv-lite": "0.4.19",
+        "unpipe": "1.0.0"
+      }
+    },
+    "raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
+      "dev": true
+    },
+    "react": {
+      "version": "15.6.2",
+      "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz",
+      "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=",
+      "requires": {
+        "create-react-class": "15.6.3",
+        "fbjs": "0.8.16",
+        "loose-envify": "1.3.1",
+        "object-assign": "4.1.1",
+        "prop-types": "15.6.1"
+      }
+    },
+    "react-dev-utils": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-5.0.1.tgz",
+      "integrity": "sha512-+y92rG6pmXt3cpcg/NGmG4w/W309tWNSmyyPL8hCMxuCSg2UP/hUg3npACj2UZc8UKVSXexyLrCnxowizGoAsw==",
+      "requires": {
+        "address": "1.0.3",
+        "babel-code-frame": "6.26.0",
+        "chalk": "1.1.3",
+        "cross-spawn": "5.1.0",
+        "detect-port-alt": "1.1.6",
+        "escape-string-regexp": "1.0.5",
+        "filesize": "3.5.11",
+        "global-modules": "1.0.0",
+        "gzip-size": "3.0.0",
+        "inquirer": "3.3.0",
+        "is-root": "1.0.0",
+        "opn": "5.2.0",
+        "react-error-overlay": "4.0.0",
+        "recursive-readdir": "2.2.1",
+        "shell-quote": "1.6.1",
+        "sockjs-client": "1.1.4",
+        "strip-ansi": "3.0.1",
+        "text-table": "0.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "requires": {
+            "lru-cache": "4.1.2",
+            "shebang-command": "1.2.0",
+            "which": "1.3.0"
+          }
+        },
+        "opn": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz",
+          "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==",
+          "requires": {
+            "is-wsl": "1.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+        }
+      }
+    },
+    "react-docgen": {
+      "version": "3.0.0-beta9",
+      "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-3.0.0-beta9.tgz",
+      "integrity": "sha512-3UqwxygAP/eZdDtOKum6vClKWUlceZ7RBVQ3Fe122l1WBYOqHcBzoUZIwN8feaLVo+s2eB/q+NkBfanLgvmt+w==",
+      "requires": {
+        "async": "2.6.0",
+        "babel-runtime": "6.26.0",
+        "babylon": "7.0.0-beta.31",
+        "commander": "2.15.0",
+        "doctrine": "2.1.0",
+        "node-dir": "0.1.17",
+        "recast": "0.12.9"
+      },
+      "dependencies": {
+        "babylon": {
+          "version": "7.0.0-beta.31",
+          "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz",
+          "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ=="
+        }
+      }
+    },
+    "react-dom": {
+      "version": "15.6.2",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz",
+      "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=",
+      "requires": {
+        "fbjs": "0.8.16",
+        "loose-envify": "1.3.1",
+        "object-assign": "4.1.1",
+        "prop-types": "15.6.1"
+      }
+    },
+    "react-error-overlay": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-4.0.0.tgz",
+      "integrity": "sha512-FlsPxavEyMuR6TjVbSSywovXSEyOg6ZDj5+Z8nbsRl9EkOzAhEIcS+GLoQDC5fz/t9suhUXWmUrOBrgeUvrMxw=="
+    },
+    "react-fuzzy": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/react-fuzzy/-/react-fuzzy-0.5.2.tgz",
+      "integrity": "sha512-qIZZxaCheb/HhcBi5fABbiCFg85+K5r1TCps1D4uaL0LAMMD/1zm/x1/kNR130Tx7nnY9V7mbFyY0DquPYeLAw==",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "classnames": "2.2.5",
+        "fuse.js": "3.2.0",
+        "prop-types": "15.6.1"
+      }
+    },
+    "react-html-attributes": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/react-html-attributes/-/react-html-attributes-1.4.1.tgz",
+      "integrity": "sha1-l7XscQ2miDNZjIvm+JrENiFoQKU=",
+      "requires": {
+        "html-element-attributes": "1.3.0"
+      }
+    },
+    "react-icon-base": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/react-icon-base/-/react-icon-base-2.1.0.tgz",
+      "integrity": "sha1-oZbjP98eeqof2jrvu2i9rZ6Cp50="
+    },
+    "react-icons": {
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-2.2.7.tgz",
+      "integrity": "sha512-0n4lcGqzJFcIQLoQytLdJCE0DKSA9dkwEZRYoGrIDJZFvIT6Hbajx5mv9geqhqFiNjUgtxg8kPyDfjlhymbGFg==",
+      "requires": {
+        "react-icon-base": "2.1.0"
+      }
+    },
+    "react-inspector": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-2.3.0.tgz",
+      "integrity": "sha512-aIcbWb0fKFhEMB+RadoOYawlr1JoMMfrQ1oRgPUG/f/e4zERVJ6nYcIaQmrQmdHCZ63BOqe2cEkoeY0kyLBzNg==",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "is-dom": "1.0.9"
+      }
+    },
+    "react-modal": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.3.2.tgz",
+      "integrity": "sha512-DLrmPG9PyXWSNA2ve1LttnNRE9Umy3u3awFeK+72dLOksLM+EoTg8Z2h/i/DV3O8ZGvnEhacjAVXdZuRDGvaag==",
+      "requires": {
+        "exenv": "1.2.2",
+        "prop-types": "15.6.1",
+        "warning": "3.0.0"
+      }
+    },
+    "react-split-pane": {
+      "version": "0.1.77",
+      "resolved": "https://registry.npmjs.org/react-split-pane/-/react-split-pane-0.1.77.tgz",
+      "integrity": "sha512-xq0PPsbkNI9xEd6yTrGPr7hzf6XfIgnsxuUEdRJELq+kLPHMsO3ymFCjhiYP35wlDPn9W46+rHDsJd7LFYteMw==",
+      "requires": {
+        "inline-style-prefixer": "3.0.8",
+        "prop-types": "15.6.1",
+        "react-style-proptype": "3.2.1"
+      }
+    },
+    "react-style-proptype": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/react-style-proptype/-/react-style-proptype-3.2.1.tgz",
+      "integrity": "sha512-Z02QsgmdZ4wYNxJsHhNGGZsIF8+MO93fYmdPaC+ljdqX3rq8tl/fSMXOGBbofGJNzq5W/2LFcONllmV6vzyYHA==",
+      "requires": {
+        "prop-types": "15.6.1"
+      }
+    },
+    "react-transition-group": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz",
+      "integrity": "sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q==",
+      "requires": {
+        "chain-function": "1.0.0",
+        "dom-helpers": "3.3.1",
+        "loose-envify": "1.3.1",
+        "prop-types": "15.6.1",
+        "warning": "3.0.0"
+      }
+    },
+    "react-treebeard": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/react-treebeard/-/react-treebeard-2.1.0.tgz",
+      "integrity": "sha512-unoy8IJL1NR5jgTtK+CqOCZKZylh/Tlid0oYajW9bLZCbFelxzmCsF8Y2hyS6pvHqM4W501oOm5O/jvg3VZCrg==",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "deep-equal": "1.0.1",
+        "prop-types": "15.6.1",
+        "radium": "0.19.6",
+        "shallowequal": "0.2.2",
+        "velocity-react": "1.3.3"
+      }
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "1.1.0",
+        "normalize-package-data": "2.4.0",
+        "path-type": "1.1.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "1.1.2",
+        "read-pkg": "1.1.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "2.1.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "2.0.1"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
+      "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
+      "requires": {
+        "core-util-is": "1.0.2",
+        "inherits": "2.0.3",
+        "isarray": "1.0.0",
+        "process-nextick-args": "2.0.0",
+        "safe-buffer": "5.1.1",
+        "string_decoder": "1.0.3",
+        "util-deprecate": "1.0.2"
+      }
+    },
+    "readdirp": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "minimatch": "3.0.4",
+        "readable-stream": "2.3.5",
+        "set-immediate-shim": "1.0.1"
+      }
+    },
+    "recast": {
+      "version": "0.12.9",
+      "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz",
+      "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==",
+      "requires": {
+        "ast-types": "0.10.1",
+        "core-js": "2.4.1",
+        "esprima": "4.0.0",
+        "private": "0.1.8",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "ast-types": {
+          "version": "0.10.1",
+          "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz",
+          "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ=="
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "requires": {
+        "resolve": "1.5.0"
+      }
+    },
+    "recursive-readdir": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz",
+      "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=",
+      "requires": {
+        "minimatch": "3.0.3"
+      },
+      "dependencies": {
+        "minimatch": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+          "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
+          "requires": {
+            "brace-expansion": "1.1.11"
+          }
+        }
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "2.1.0",
+        "strip-indent": "1.0.1"
+      }
+    },
+    "redis": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
+      "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "double-ended-queue": "2.1.0-0",
+        "redis-commands": "1.3.5",
+        "redis-parser": "2.6.0"
+      }
+    },
+    "redis-commands": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz",
+      "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==",
+      "dev": true,
+      "optional": true
+    },
+    "redis-parser": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
+      "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=",
+      "dev": true,
+      "optional": true
+    },
+    "reduce-css-calc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
+      "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+      "requires": {
+        "balanced-match": "0.4.2",
+        "math-expression-evaluator": "1.2.17",
+        "reduce-function-call": "1.0.2"
+      },
+      "dependencies": {
+        "balanced-match": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+        }
+      }
+    },
+    "reduce-function-call": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz",
+      "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=",
+      "requires": {
+        "balanced-match": "0.4.2"
+      },
+      "dependencies": {
+        "balanced-match": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+        }
+      }
+    },
+    "redux": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz",
+      "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==",
+      "requires": {
+        "lodash": "4.17.5",
+        "lodash-es": "4.17.8",
+        "loose-envify": "1.3.1",
+        "symbol-observable": "1.2.0"
+      }
+    },
+    "redux-observable": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/redux-observable/-/redux-observable-0.18.0.tgz",
+      "integrity": "sha512-tu02n6jr6/bq/vyI9E/AHxIyIl0YsWloqvWqSBG0KqN6aQBujMBP6hlDAlQLj8hP+XQpqL293MLX6V612c0jSg==",
+      "requires": {
+        "gitbook-plugin-github": "2.0.0"
+      }
+    },
+    "reflect-metadata": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz",
+      "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A=="
+    },
+    "regenerate": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+      "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg=="
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
+    "regenerator-transform": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+      "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "private": "0.1.8"
+      }
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+      "dev": true,
+      "requires": {
+        "is-equal-shallow": "0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "requires": {
+        "extend-shallow": "3.0.2",
+        "safe-regex": "1.1.0"
+      }
+    },
+    "regexpu-core": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
+      "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+      "requires": {
+        "regenerate": "1.3.3",
+        "regjsgen": "0.2.0",
+        "regjsparser": "0.1.5"
+      }
+    },
+    "regjsgen": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc="
+    },
+    "regjsparser": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+      "requires": {
+        "jsesc": "0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
+    },
+    "remap-istanbul": {
+      "version": "0.9.6",
+      "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.9.6.tgz",
+      "integrity": "sha512-l0WDBsVjaTzP8m3glERJO6bjlAFUahcgfcgvcX+owZw7dKeDLT3CVRpS7UO4L9LfGcMiNsqk223HopwVxlh8Hg==",
+      "dev": true,
+      "requires": {
+        "amdefine": "1.0.1",
+        "gulp-util": "3.0.7",
+        "istanbul": "0.4.5",
+        "minimatch": "3.0.4",
+        "source-map": "0.6.1",
+        "through2": "2.0.1"
+      },
+      "dependencies": {
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+          "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "1.0.7",
+            "string_decoder": "0.10.31",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        },
+        "through2": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz",
+          "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=",
+          "dev": true,
+          "requires": {
+            "readable-stream": "2.0.6",
+            "xtend": "4.0.1"
+          }
+        }
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+    },
+    "renderkid": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
+      "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
+      "requires": {
+        "css-select": "1.2.0",
+        "dom-converter": "0.1.4",
+        "htmlparser2": "3.3.0",
+        "strip-ansi": "3.0.1",
+        "utila": "0.3.3"
+      },
+      "dependencies": {
+        "utila": {
+          "version": "0.3.3",
+          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
+          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY="
+        }
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "1.0.2"
+      }
+    },
+    "replace-ext": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+      "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+      "dev": true
+    },
+    "request": {
+      "version": "2.81.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+      "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "0.6.0",
+        "aws4": "1.6.0",
+        "caseless": "0.12.0",
+        "combined-stream": "1.0.6",
+        "extend": "3.0.1",
+        "forever-agent": "0.6.1",
+        "form-data": "2.1.4",
+        "har-validator": "4.2.1",
+        "hawk": "3.1.3",
+        "http-signature": "1.1.1",
+        "is-typedarray": "1.0.0",
+        "isstream": "0.1.2",
+        "json-stringify-safe": "5.0.1",
+        "mime-types": "2.1.18",
+        "oauth-sign": "0.8.2",
+        "performance-now": "0.2.0",
+        "qs": "6.4.0",
+        "safe-buffer": "5.1.1",
+        "stringstream": "0.0.5",
+        "tough-cookie": "2.3.4",
+        "tunnel-agent": "0.6.0",
+        "uuid": "3.2.1"
+      }
+    },
+    "request-progress": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
+      "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
+      "dev": true,
+      "requires": {
+        "throttleit": "1.0.0"
+      }
+    },
+    "requestretry": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz",
+      "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "extend": "3.0.1",
+        "lodash": "4.17.5",
+        "request": "2.81.0",
+        "when": "3.7.8"
+      },
+      "dependencies": {
+        "when": {
+          "version": "3.7.8",
+          "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
+          "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-from-string": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
+      "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg="
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
+    },
+    "resolve": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+      "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+      "requires": {
+        "path-parse": "1.0.5"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "3.0.0"
+      }
+    },
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "requires": {
+        "expand-tilde": "2.0.2",
+        "global-modules": "1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "requires": {
+        "onetime": "2.0.1",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+      "requires": {
+        "align-text": "0.1.4"
+      }
+    },
+    "rimraf": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+      "requires": {
+        "glob": "7.1.2"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
+      "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
+      "requires": {
+        "hash-base": "2.0.2",
+        "inherits": "2.0.3"
+      }
+    },
+    "run-async": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "requires": {
+        "is-promise": "2.1.0"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "requires": {
+        "aproba": "1.2.0"
+      }
+    },
+    "rx": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
+      "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
+    },
+    "rx-lite": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+      "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
+    },
+    "rx-lite-aggregates": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+      "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+      "requires": {
+        "rx-lite": "4.0.8"
+      }
+    },
+    "rxjs": {
+      "version": "5.5.6",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz",
+      "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==",
+      "requires": {
+        "symbol-observable": "1.0.1"
+      },
+      "dependencies": {
+        "symbol-observable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
+          "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+        }
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "requires": {
+        "ret": "0.1.15"
+      }
+    },
+    "sass-graph": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "7.1.2",
+        "lodash": "4.17.5",
+        "scss-tokenizer": "0.2.3",
+        "yargs": "7.1.0"
+      }
+    },
+    "sass-loader": {
+      "version": "6.0.7",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz",
+      "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "2.0.2",
+        "loader-utils": "1.1.0",
+        "lodash.tail": "4.1.1",
+        "neo-async": "2.5.0",
+        "pify": "3.0.0"
+      }
+    },
+    "saucelabs": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz",
+      "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=",
+      "dev": true,
+      "requires": {
+        "https-proxy-agent": "1.0.0"
+      }
+    },
+    "sax": {
+      "version": "0.5.8",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
+      "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=",
+      "dev": true
+    },
+    "schema-utils": {
+      "version": "0.4.5",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz",
+      "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==",
+      "requires": {
+        "ajv": "6.3.0",
+        "ajv-keywords": "3.1.0"
+      }
+    },
+    "scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "js-base64": "2.4.3",
+        "source-map": "0.4.4"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "sdc-ui": {
+      "version": "1.6.29-angular5",
+      "resolved": "https://registry.npmjs.org/sdc-ui/-/sdc-ui-1.6.29-angular5.tgz",
+      "integrity": "sha1-lZEY6CCYeamY1bqZaX4bImoK/m8=",
+      "requires": {
+        "@angular/animations": "5.2.9",
+        "@angular/common": "5.2.0",
+        "@angular/core": "5.2.0",
+        "@angular/forms": "5.2.0",
+        "@angular/http": "5.2.0",
+        "@angular/platform-browser": "5.2.0",
+        "@angular/platform-browser-dynamic": "5.2.0",
+        "@angular/upgrade": "5.2.9",
+        "@storybook/react": "3.4.1",
+        "http-loader": "0.0.1",
+        "prop-types": "15.6.1",
+        "react": "15.6.2",
+        "react-dom": "15.6.2",
+        "reflect-metadata": "0.1.12",
+        "rxjs": "5.4.2",
+        "svg-react-loader": "0.4.5",
+        "zone.js": "0.8.19"
+      },
+      "dependencies": {
+        "@angular/animations": {
+          "version": "5.2.9",
+          "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.9.tgz",
+          "integrity": "sha512-H/3fMs4PhYjKoA81II6D0PHifDrqlKet2u/EXzUBq3ehXby+N/0GBzqsBYwPeU5pTye7WPFfW+5sgoJpN8Ye6Q==",
+          "requires": {
+            "tslib": "1.9.0"
+          }
+        },
+        "@angular/upgrade": {
+          "version": "5.2.9",
+          "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-5.2.9.tgz",
+          "integrity": "sha512-R3LwId5J8ynlzDaeD+SFe1HWuxM0Xqg6Ugl3vzxDWDKuzbFCdEsc2ZvhMpASrfs+JPdazANHoFPLrRaeXulWeQ==",
+          "requires": {
+            "tslib": "1.9.0"
+          }
+        },
+        "rxjs": {
+          "version": "5.4.2",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz",
+          "integrity": "sha1-KjI2/L8D31e64G/Wly/ZnlwI/Pc=",
+          "requires": {
+            "symbol-observable": "1.2.0"
+          }
+        }
+      }
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selenium-webdriver": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz",
+      "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=",
+      "dev": true,
+      "requires": {
+        "adm-zip": "0.4.7",
+        "rimraf": "2.6.2",
+        "tmp": "0.0.30",
+        "xml2js": "0.4.19"
+      },
+      "dependencies": {
+        "tmp": {
+          "version": "0.0.30",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
+          "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
+          "dev": true,
+          "requires": {
+            "os-tmpdir": "1.0.2"
+          }
+        }
+      }
+    },
+    "selfsigned": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz",
+      "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.7.1"
+      }
+    },
+    "semver": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+      "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+    },
+    "semver-dsl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
+      "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
+      "dev": true,
+      "requires": {
+        "semver": "5.5.0"
+      }
+    },
+    "semver-intersect": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz",
+      "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=",
+      "dev": true,
+      "requires": {
+        "semver": "5.5.0"
+      }
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "destroy": "1.0.4",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "1.6.2",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "2.3.0",
+        "range-parser": "1.2.0",
+        "statuses": "1.4.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+          "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz",
+      "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU="
+    },
+    "serve-favicon": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz",
+      "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=",
+      "requires": {
+        "etag": "1.8.1",
+        "fresh": "0.5.2",
+        "ms": "2.1.1",
+        "parseurl": "1.3.2",
+        "safe-buffer": "5.1.1"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+        }
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "1.0.3",
+        "http-errors": "1.6.2",
+        "mime-types": "2.1.18",
+        "parseurl": "1.3.2"
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+      "requires": {
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "parseurl": "1.3.2",
+        "send": "0.16.2"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "set-immediate-shim": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "requires": {
+        "extend-shallow": "2.0.1",
+        "is-extendable": "0.1.1",
+        "is-plain-object": "2.0.4",
+        "split-string": "3.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+    },
+    "setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+    },
+    "sha.js": {
+      "version": "2.4.10",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz",
+      "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==",
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "shallow-clone": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
+      "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
+      "dev": true,
+      "requires": {
+        "is-extendable": "0.1.1",
+        "kind-of": "5.1.0",
+        "mixin-object": "2.0.1"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "shallowequal": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz",
+      "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=",
+      "requires": {
+        "lodash.keys": "3.1.2"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "requires": {
+        "shebang-regex": "1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+    },
+    "shell-quote": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+      "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+      "requires": {
+        "array-filter": "0.0.1",
+        "array-map": "0.0.0",
+        "array-reduce": "0.0.0",
+        "jsonify": "0.0.0"
+      }
+    },
+    "shelljs": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz",
+      "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==",
+      "requires": {
+        "glob": "7.1.2",
+        "interpret": "1.1.0",
+        "rechoir": "0.6.2"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+    },
+    "silent-error": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz",
+      "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9"
+      }
+    },
+    "slack-node": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz",
+      "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "requestretry": "1.13.0"
+      }
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
+      "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
+      "dev": true
+    },
+    "smart-buffer": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz",
+      "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=",
+      "dev": true
+    },
+    "smtp-connection": {
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz",
+      "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=",
+      "dev": true,
+      "requires": {
+        "httpntlm": "1.6.1",
+        "nodemailer-shared": "1.1.0"
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "requires": {
+        "base": "0.11.2",
+        "debug": "2.6.9",
+        "define-property": "0.2.5",
+        "extend-shallow": "2.0.1",
+        "map-cache": "0.2.2",
+        "source-map": "0.5.7",
+        "source-map-resolve": "0.5.1",
+        "use": "3.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "requires": {
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "snapdragon-util": "3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "sntp": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+      "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+      "dev": true,
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "socket.io": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
+      "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "engine.io": "3.1.5",
+        "socket.io-adapter": "1.1.1",
+        "socket.io-client": "2.0.4",
+        "socket.io-parser": "3.1.3"
+      }
+    },
+    "socket.io-adapter": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+      "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+      "dev": true
+    },
+    "socket.io-client": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
+      "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
+      "dev": true,
+      "requires": {
+        "backo2": "1.0.2",
+        "base64-arraybuffer": "0.1.5",
+        "component-bind": "1.0.0",
+        "component-emitter": "1.2.1",
+        "debug": "2.6.9",
+        "engine.io-client": "3.1.6",
+        "has-cors": "1.1.0",
+        "indexof": "0.0.1",
+        "object-component": "0.0.3",
+        "parseqs": "0.0.5",
+        "parseuri": "0.0.5",
+        "socket.io-parser": "3.1.3",
+        "to-array": "0.1.4"
+      }
+    },
+    "socket.io-parser": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz",
+      "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==",
+      "dev": true,
+      "requires": {
+        "component-emitter": "1.2.1",
+        "debug": "3.1.0",
+        "has-binary2": "1.0.2",
+        "isarray": "2.0.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "isarray": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+          "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+          "dev": true
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "0.10.0",
+        "uuid": "3.2.1"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz",
+      "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=",
+      "requires": {
+        "debug": "2.6.9",
+        "eventsource": "0.1.6",
+        "faye-websocket": "0.11.1",
+        "inherits": "2.0.3",
+        "json3": "3.3.2",
+        "url-parse": "1.2.0"
+      },
+      "dependencies": {
+        "faye-websocket": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
+          "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+          "requires": {
+            "websocket-driver": "0.7.0"
+          }
+        }
+      }
+    },
+    "socks": {
+      "version": "1.1.10",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz",
+      "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=",
+      "dev": true,
+      "requires": {
+        "ip": "1.1.5",
+        "smart-buffer": "1.1.15"
+      }
+    },
+    "socks-proxy-agent": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-2.1.1.tgz",
+      "integrity": "sha512-sFtmYqdUK5dAMh85H0LEVFUCO7OhJJe1/z2x/Z6mxp3s7/QPf1RkZmpZy+BpuU0bEjcV9npqKjq9Y3kwFUjnxw==",
+      "dev": true,
+      "requires": {
+        "agent-base": "2.1.1",
+        "extend": "3.0.1",
+        "socks": "1.1.10"
+      }
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "requires": {
+        "is-plain-obj": "1.1.0"
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
+      "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A=="
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-resolve": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+      "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+      "requires": {
+        "atob": "2.0.3",
+        "decode-uri-component": "0.2.0",
+        "resolve-url": "0.2.1",
+        "source-map-url": "0.4.0",
+        "urix": "0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+      "dev": true,
+      "requires": {
+        "source-map": "0.5.7"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+    },
+    "sparkles": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+      "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+      "requires": {
+        "spdx-expression-parse": "3.0.0",
+        "spdx-license-ids": "3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "requires": {
+        "spdx-exceptions": "2.1.0",
+        "spdx-license-ids": "3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
+    },
+    "spdy": {
+      "version": "3.4.7",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+      "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "handle-thing": "1.2.5",
+        "http-deceiver": "1.2.7",
+        "safe-buffer": "5.1.1",
+        "select-hose": "2.0.0",
+        "spdy-transport": "2.0.20"
+      }
+    },
+    "spdy-transport": {
+      "version": "2.0.20",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz",
+      "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "detect-node": "2.0.3",
+        "hpack.js": "2.1.6",
+        "obuf": "1.1.2",
+        "readable-stream": "2.3.5",
+        "safe-buffer": "5.1.1",
+        "wbuf": "1.7.3"
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "requires": {
+        "extend-shallow": "3.0.2"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+    },
+    "sshpk": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
+      "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
+      "dev": true,
+      "requires": {
+        "asn1": "0.2.3",
+        "assert-plus": "1.0.0",
+        "bcrypt-pbkdf": "1.0.1",
+        "dashdash": "1.14.1",
+        "ecc-jsbn": "0.1.1",
+        "getpass": "0.1.7",
+        "jsbn": "0.1.1",
+        "tweetnacl": "0.14.5"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "ssri": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+      "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "requires": {
+        "define-property": "0.2.5",
+        "object-copy": "0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "requires": {
+            "is-accessor-descriptor": "0.1.6",
+            "is-data-descriptor": "0.1.4",
+            "kind-of": "5.1.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
+    },
+    "stdout-stream": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
+      "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "readable-stream": "2.3.5"
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.5"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz",
+      "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==",
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "stream-shift": "1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz",
+      "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==",
+      "requires": {
+        "builtin-status-codes": "3.0.0",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.5",
+        "to-arraybuffer": "1.0.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
+    },
+    "stream-to-observable": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz",
+      "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=",
+      "dev": true
+    },
+    "streamroller": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
+      "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==",
+      "dev": true,
+      "requires": {
+        "date-format": "1.2.0",
+        "debug": "3.1.0",
+        "mkdirp": "0.5.1",
+        "readable-stream": "2.3.5"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "requires": {
+        "code-point-at": "1.1.0",
+        "is-fullwidth-code-point": "1.0.0",
+        "strip-ansi": "3.0.1"
+      }
+    },
+    "string.prototype.padend": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz",
+      "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1"
+      }
+    },
+    "string.prototype.padstart": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz",
+      "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=",
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.10.0",
+        "function-bind": "1.1.1"
+      }
+    },
+    "string_decoder": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "stringstream": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+      "dev": true
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "0.2.1"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1"
+      }
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
+    },
+    "style-loader": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz",
+      "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "dev": true,
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "stylus": {
+      "version": "0.54.5",
+      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
+      "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
+      "dev": true,
+      "requires": {
+        "css-parse": "1.7.0",
+        "debug": "2.6.9",
+        "glob": "7.0.6",
+        "mkdirp": "0.5.1",
+        "sax": "0.5.8",
+        "source-map": "0.1.43"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.0.6",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
+          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "dev": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "stylus-loader": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
+      "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "lodash.clonedeep": "4.5.0",
+        "when": "3.6.4"
+      }
+    },
+    "supports-color": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+      "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+      "requires": {
+        "has-flag": "2.0.0"
+      }
+    },
+    "svg-react-loader": {
+      "version": "0.4.5",
+      "resolved": "https://registry.npmjs.org/svg-react-loader/-/svg-react-loader-0.4.5.tgz",
+      "integrity": "sha1-HzJMnHuFj1yJ+sdSu+nKP2IU+FA=",
+      "requires": {
+        "css": "2.2.1",
+        "loader-utils": "1.1.0",
+        "ramda": "0.21.0",
+        "rx": "4.1.0",
+        "traverse": "0.6.6",
+        "xml2js": "0.4.17"
+      },
+      "dependencies": {
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        },
+        "xml2js": {
+          "version": "0.4.17",
+          "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz",
+          "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=",
+          "requires": {
+            "sax": "1.2.4",
+            "xmlbuilder": "4.2.1"
+          }
+        },
+        "xmlbuilder": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz",
+          "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=",
+          "requires": {
+            "lodash": "4.17.5"
+          }
+        }
+      }
+    },
+    "svg-tag-names": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/svg-tag-names/-/svg-tag-names-1.1.1.tgz",
+      "integrity": "sha1-lkGynvcQJe4JTHBD983efZn71Qo="
+    },
+    "svgo": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz",
+      "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=",
+      "requires": {
+        "coa": "1.0.4",
+        "colors": "1.1.2",
+        "csso": "2.3.2",
+        "js-yaml": "3.7.0",
+        "mkdirp": "0.5.1",
+        "sax": "1.2.4",
+        "whet.extend": "0.9.9"
+      },
+      "dependencies": {
+        "esprima": {
+          "version": "2.7.3",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
+        },
+        "js-yaml": {
+          "version": "3.7.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz",
+          "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=",
+          "requires": {
+            "argparse": "1.0.10",
+            "esprima": "2.7.3"
+          }
+        },
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+        }
+      }
+    },
+    "symbol-observable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+    },
+    "tapable": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
+      "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI="
+    },
+    "tar": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+      "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "block-stream": "0.0.9",
+        "fstream": "1.0.11",
+        "inherits": "2.0.3"
+      }
+    },
+    "terminal-banner": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/terminal-banner/-/terminal-banner-1.1.0.tgz",
+      "integrity": "sha512-A70B8Io5gGOTKQuoqU6LUPLouNd9DvFLgw3cPh6bfrQjdy7HWW1t04VJfQwjTnygTVDX0xremaj1cg3SQaCGyg==",
+      "dev": true
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+    },
+    "throttleit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+      "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
+      "dev": true
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+    },
+    "through2": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+      "requires": {
+        "readable-stream": "2.3.5",
+        "xtend": "4.0.1"
+      }
+    },
+    "thunkify": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz",
+      "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=",
+      "dev": true,
+      "optional": true
+    },
+    "thunky": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz",
+      "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=",
+      "dev": true
+    },
+    "time-stamp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz",
+      "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c="
+    },
+    "timers-browserify": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz",
+      "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==",
+      "requires": {
+        "setimmediate": "1.0.5"
+      }
+    },
+    "timespan": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz",
+      "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=",
+      "dev": true,
+      "optional": true
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "requires": {
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "to-array": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+      "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+      "dev": true
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+    },
+    "to-fast-properties": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "requires": {
+        "define-property": "2.0.2",
+        "extend-shallow": "3.0.2",
+        "regex-not": "1.0.2",
+        "safe-regex": "1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "requires": {
+        "is-number": "3.0.0",
+        "repeat-string": "1.6.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "3.2.2"
+          }
+        }
+      }
+    },
+    "toposort": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz",
+      "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw="
+    },
+    "tough-cookie": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+      "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+      "dev": true,
+      "requires": {
+        "punycode": "1.4.1"
+      }
+    },
+    "traverse": {
+      "version": "0.6.6",
+      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
+      "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
+    },
+    "tree-kill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz",
+      "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==",
+      "dev": true
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "true-case-path": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz",
+      "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "glob": "6.0.4"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "6.0.4",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+          "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        }
+      }
+    },
+    "ts-loader": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-3.2.0.tgz",
+      "integrity": "sha512-4g8BF3gKWBHeM1jAFmMPHofuJlwTUU4iHJ0i3mwXRHwy74RU6VBOgl9kDVMGpapvGcMlVqV5G6v9XmV66Qqd7w==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.1",
+        "enhanced-resolve": "3.4.1",
+        "loader-utils": "1.1.0",
+        "semver": "5.5.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.4.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.4.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+          "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "ts-node": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz",
+      "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==",
+      "dev": true,
+      "requires": {
+        "arrify": "1.0.1",
+        "chalk": "2.3.2",
+        "diff": "3.5.0",
+        "make-error": "1.3.4",
+        "minimist": "1.2.0",
+        "mkdirp": "0.5.1",
+        "source-map-support": "0.5.4",
+        "tsconfig": "7.0.0",
+        "v8flags": "3.0.2",
+        "yn": "2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+          "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.3.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.5.4",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz",
+          "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==",
+          "dev": true,
+          "requires": {
+            "source-map": "0.6.1"
+          }
+        },
+        "supports-color": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+          "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "tsconfig": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
+      "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
+      "dev": true,
+      "requires": {
+        "@types/strip-bom": "3.0.0",
+        "@types/strip-json-comments": "0.0.30",
+        "strip-bom": "3.0.0",
+        "strip-json-comments": "2.0.1"
+      },
+      "dependencies": {
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "dev": true
+        }
+      }
+    },
+    "tsickle": {
+      "version": "0.26.0",
+      "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.26.0.tgz",
+      "integrity": "sha512-eWJ2CUfttGK0LqF9iJ/Avnxbj4M+fCyJ50Zag3wm73Fut1hsasPRHKxKdrMWVj4BMHnQNx7TO+DdNmLmJTSuNw==",
+      "dev": true,
+      "requires": {
+        "minimist": "1.2.0",
+        "mkdirp": "0.5.1",
+        "source-map": "0.5.7",
+        "source-map-support": "0.4.18"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "tslib": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
+      "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
+    },
+    "tslint": {
+      "version": "5.9.1",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz",
+      "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "builtin-modules": "1.1.1",
+        "chalk": "2.3.2",
+        "commander": "2.15.0",
+        "diff": "3.5.0",
+        "glob": "7.1.2",
+        "js-yaml": "3.11.0",
+        "minimatch": "3.0.4",
+        "resolve": "1.5.0",
+        "semver": "5.5.0",
+        "tslib": "1.9.0",
+        "tsutils": "2.22.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
+          "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.1",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "5.3.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+          "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        }
+      }
+    },
+    "tsscmp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz",
+      "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=",
+      "dev": true,
+      "optional": true
+    },
+    "tsutils": {
+      "version": "2.22.2",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz",
+      "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==",
+      "dev": true,
+      "requires": {
+        "tslib": "1.9.0"
+      }
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true,
+      "optional": true
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "1.1.2"
+      }
+    },
+    "type-is": {
+      "version": "1.6.16",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "2.1.18"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+    },
+    "typescript": {
+      "version": "2.5.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz",
+      "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==",
+      "dev": true
+    },
+    "ua-parser-js": {
+      "version": "0.7.17",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
+      "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g=="
+    },
+    "uglify-js": {
+      "version": "3.3.16",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.16.tgz",
+      "integrity": "sha512-FMh5SRqJRGhv9BbaTffENIpDDQIoPDR8DBraunGORGhySArsXlw9++CN+BWzPBLpoI4RcSnpfGPnilTxWL3Vvg==",
+      "requires": {
+        "commander": "2.15.0",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
+    "uglify-to-browserify": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "optional": true
+    },
+    "uglifyjs-webpack-plugin": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.4.tgz",
+      "integrity": "sha512-z0IbjpW8b3O/OVn+TTZN4pI29RN1zktFBXLIzzfZ+++cUtZ1ERSlLWgpE/5OERuEUs1ijVQnpYAkSlpoVmQmSQ==",
+      "requires": {
+        "cacache": "10.0.4",
+        "find-cache-dir": "1.0.0",
+        "schema-utils": "0.4.5",
+        "serialize-javascript": "1.4.0",
+        "source-map": "0.6.1",
+        "uglify-es": "3.3.9",
+        "webpack-sources": "1.1.0",
+        "worker-farm": "1.6.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.13.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA=="
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        },
+        "uglify-es": {
+          "version": "3.3.9",
+          "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+          "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+          "requires": {
+            "commander": "2.13.0",
+            "source-map": "0.6.1"
+          }
+        }
+      }
+    },
+    "ultron": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+      "dev": true
+    },
+    "underscore": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+      "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "requires": {
+        "arr-union": "3.1.0",
+        "get-value": "2.0.6",
+        "is-extendable": "0.1.1",
+        "set-value": "0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-extendable": "0.1.1",
+            "is-plain-object": "2.0.4",
+            "to-object-path": "0.3.0"
+          }
+        }
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+    },
+    "uniqid": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz",
+      "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
+      "requires": {
+        "macaddress": "0.2.8"
+      }
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
+    },
+    "unique-filename": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz",
+      "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=",
+      "requires": {
+        "unique-slug": "2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz",
+      "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=",
+      "requires": {
+        "imurmurhash": "0.1.4"
+      }
+    },
+    "universalify": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+      "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+      "dev": true
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "requires": {
+        "has-value": "0.3.1",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "requires": {
+            "get-value": "2.0.6",
+            "has-values": "0.1.4",
+            "isobject": "2.1.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "upath": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz",
+      "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw=="
+    },
+    "upper-case": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+        }
+      }
+    },
+    "url-loader": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz",
+      "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==",
+      "requires": {
+        "loader-utils": "1.1.0",
+        "mime": "1.6.0",
+        "schema-utils": "0.3.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "schema-utils": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+          "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+          "requires": {
+            "ajv": "5.5.2"
+          }
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz",
+      "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==",
+      "requires": {
+        "querystringify": "1.0.0",
+        "requires-port": "1.0.0"
+      },
+      "dependencies": {
+        "querystringify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz",
+          "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs="
+        }
+      }
+    },
+    "use": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+      "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+      "requires": {
+        "kind-of": "6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "util": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+      "requires": {
+        "inherits": "2.0.1"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+    },
+    "uuid": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+      "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+    },
+    "uws": {
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz",
+      "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==",
+      "dev": true,
+      "optional": true
+    },
+    "v8flags": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz",
+      "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==",
+      "dev": true,
+      "requires": {
+        "homedir-polyfill": "1.0.1"
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+      "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+      "requires": {
+        "spdx-correct": "3.0.0",
+        "spdx-expression-parse": "3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+    },
+    "velocity-animate": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.1.tgz",
+      "integrity": "sha512-VJ3csMz5zP1ifkbBlsNYpxnoWkPHfVRQ8tUongS78W5DxSGHB68pjYHDTgUYBkVM7P/HpYdVukgVUFcxjr1gGg=="
+    },
+    "velocity-react": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.3.3.tgz",
+      "integrity": "sha1-1tRyds/Ivip1Yjh5sgFArFjBuCs=",
+      "requires": {
+        "lodash": "3.10.1",
+        "prop-types": "15.6.1",
+        "react-transition-group": "1.2.1",
+        "velocity-animate": "1.5.1"
+      },
+      "dependencies": {
+        "lodash": {
+          "version": "3.10.1",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
+        }
+      }
+    },
+    "vendors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz",
+      "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI="
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "1.3.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "dev": true
+        }
+      }
+    },
+    "vinyl": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+      "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+      "dev": true,
+      "requires": {
+        "clone": "1.0.3",
+        "clone-stats": "0.0.1",
+        "replace-ext": "0.0.1"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+          "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+          "dev": true
+        }
+      }
+    },
+    "vlq": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+      "dev": true
+    },
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+      "dev": true
+    },
+    "warning": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
+      "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
+      "requires": {
+        "loose-envify": "1.3.1"
+      }
+    },
+    "watchpack": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz",
+      "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==",
+      "requires": {
+        "chokidar": "2.0.2",
+        "graceful-fs": "4.1.11",
+        "neo-async": "2.5.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "requires": {
+            "micromatch": "3.1.9",
+            "normalize-path": "2.1.1"
+          }
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        },
+        "braces": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
+          "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
+          "requires": {
+            "arr-flatten": "1.1.0",
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "extend-shallow": "2.0.1",
+            "fill-range": "4.0.0",
+            "isobject": "3.0.1",
+            "kind-of": "6.0.2",
+            "repeat-element": "1.1.2",
+            "snapdragon": "0.8.2",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "chokidar": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz",
+          "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==",
+          "requires": {
+            "anymatch": "2.0.0",
+            "async-each": "1.0.1",
+            "braces": "2.3.1",
+            "fsevents": "1.1.3",
+            "glob-parent": "3.1.0",
+            "inherits": "2.0.3",
+            "is-binary-path": "1.0.1",
+            "is-glob": "4.0.0",
+            "normalize-path": "2.1.1",
+            "path-is-absolute": "1.0.1",
+            "readdirp": "2.1.0",
+            "upath": "1.0.4"
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "requires": {
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "expand-brackets": "2.1.4",
+            "extend-shallow": "2.0.1",
+            "fragment-cache": "0.2.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-number": "3.0.0",
+            "repeat-string": "1.6.1",
+            "to-regex-range": "2.1.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "requires": {
+            "is-glob": "3.1.0",
+            "path-dirname": "1.0.2"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "requires": {
+                "is-extglob": "2.1.1"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+        },
+        "is-glob": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        },
+        "micromatch": {
+          "version": "3.1.9",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
+          "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
+          "requires": {
+            "arr-diff": "4.0.0",
+            "array-unique": "0.3.2",
+            "braces": "2.3.1",
+            "define-property": "2.0.2",
+            "extend-shallow": "3.0.2",
+            "extglob": "2.0.4",
+            "fragment-cache": "0.2.1",
+            "kind-of": "6.0.2",
+            "nanomatch": "1.2.9",
+            "object.pick": "1.3.0",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          }
+        }
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "webdriver-js-extender": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz",
+      "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=",
+      "dev": true,
+      "requires": {
+        "@types/selenium-webdriver": "2.53.43",
+        "selenium-webdriver": "2.53.3"
+      },
+      "dependencies": {
+        "adm-zip": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz",
+          "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=",
+          "dev": true
+        },
+        "sax": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz",
+          "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=",
+          "dev": true
+        },
+        "selenium-webdriver": {
+          "version": "2.53.3",
+          "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz",
+          "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=",
+          "dev": true,
+          "requires": {
+            "adm-zip": "0.4.4",
+            "rimraf": "2.6.2",
+            "tmp": "0.0.24",
+            "ws": "1.1.5",
+            "xml2js": "0.4.4"
+          }
+        },
+        "tmp": {
+          "version": "0.0.24",
+          "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz",
+          "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=",
+          "dev": true
+        },
+        "ultron": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
+          "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
+          "dev": true
+        },
+        "ws": {
+          "version": "1.1.5",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
+          "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
+          "dev": true,
+          "requires": {
+            "options": "0.0.6",
+            "ultron": "1.0.2"
+          }
+        },
+        "xml2js": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz",
+          "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=",
+          "dev": true,
+          "requires": {
+            "sax": "0.6.1",
+            "xmlbuilder": "9.0.7"
+          }
+        }
+      }
+    },
+    "webpack": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz",
+      "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==",
+      "requires": {
+        "acorn": "5.5.3",
+        "acorn-dynamic-import": "2.0.2",
+        "ajv": "6.3.0",
+        "ajv-keywords": "3.1.0",
+        "async": "2.6.0",
+        "enhanced-resolve": "3.4.1",
+        "escope": "3.6.0",
+        "interpret": "1.1.0",
+        "json-loader": "0.5.7",
+        "json5": "0.5.1",
+        "loader-runner": "2.3.0",
+        "loader-utils": "1.1.0",
+        "memory-fs": "0.4.1",
+        "mkdirp": "0.5.1",
+        "node-libs-browser": "2.1.0",
+        "source-map": "0.5.7",
+        "supports-color": "4.5.0",
+        "tapable": "0.2.8",
+        "uglifyjs-webpack-plugin": "0.4.6",
+        "watchpack": "1.5.0",
+        "webpack-sources": "1.1.0",
+        "yargs": "8.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+        },
+        "camelcase": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
+        },
+        "cliui": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+          "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+          "requires": {
+            "center-align": "0.1.3",
+            "right-align": "0.1.3",
+            "wordwrap": "0.0.2"
+          }
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "parse-json": "2.2.0",
+            "pify": "2.3.0",
+            "strip-bom": "3.0.0"
+          }
+        },
+        "os-locale": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+          "requires": {
+            "execa": "0.7.0",
+            "lcid": "1.0.0",
+            "mem": "1.1.0"
+          }
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "requires": {
+            "pify": "2.3.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "requires": {
+            "load-json-file": "2.0.0",
+            "normalize-package-data": "2.4.0",
+            "path-type": "2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "requires": {
+            "find-up": "2.1.0",
+            "read-pkg": "2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "requires": {
+            "is-fullwidth-code-point": "2.0.0",
+            "strip-ansi": "4.0.0"
+          },
+          "dependencies": {
+            "is-fullwidth-code-point": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+              "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+            },
+            "strip-ansi": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+              "requires": {
+                "ansi-regex": "3.0.0"
+              }
+            }
+          }
+        },
+        "strip-bom": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+        },
+        "uglify-js": {
+          "version": "2.8.29",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-to-browserify": "1.0.2",
+            "yargs": "3.10.0"
+          },
+          "dependencies": {
+            "yargs": {
+              "version": "3.10.0",
+              "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+              "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+              "requires": {
+                "camelcase": "1.2.1",
+                "cliui": "2.1.0",
+                "decamelize": "1.2.0",
+                "window-size": "0.1.0"
+              }
+            }
+          }
+        },
+        "uglifyjs-webpack-plugin": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
+          "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-js": "2.8.29",
+            "webpack-sources": "1.1.0"
+          }
+        },
+        "which-module": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+        },
+        "yargs": {
+          "version": "8.0.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+          "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+          "requires": {
+            "camelcase": "4.1.0",
+            "cliui": "3.2.0",
+            "decamelize": "1.2.0",
+            "get-caller-file": "1.0.2",
+            "os-locale": "2.1.0",
+            "read-pkg-up": "2.0.0",
+            "require-directory": "2.1.1",
+            "require-main-filename": "1.0.1",
+            "set-blocking": "2.0.0",
+            "string-width": "2.1.1",
+            "which-module": "2.0.0",
+            "y18n": "3.2.1",
+            "yargs-parser": "7.0.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+              "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+            },
+            "cliui": {
+              "version": "3.2.0",
+              "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+              "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+              "requires": {
+                "string-width": "1.0.2",
+                "strip-ansi": "3.0.1",
+                "wrap-ansi": "2.1.0"
+              },
+              "dependencies": {
+                "string-width": {
+                  "version": "1.0.2",
+                  "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                  "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                  "requires": {
+                    "code-point-at": "1.1.0",
+                    "is-fullwidth-code-point": "1.0.0",
+                    "strip-ansi": "3.0.1"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "yargs-parser": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+          "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+          "requires": {
+            "camelcase": "4.1.0"
+          },
+          "dependencies": {
+            "camelcase": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+              "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+            }
+          }
+        }
+      }
+    },
+    "webpack-core": {
+      "version": "0.6.9",
+      "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
+      "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
+      "dev": true,
+      "requires": {
+        "source-list-map": "0.1.8",
+        "source-map": "0.4.4"
+      },
+      "dependencies": {
+        "source-list-map": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
+          "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+          "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+          "dev": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
+      "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
+      "requires": {
+        "memory-fs": "0.4.1",
+        "mime": "1.6.0",
+        "path-is-absolute": "1.0.1",
+        "range-parser": "1.2.0",
+        "time-stamp": "2.0.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "2.11.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz",
+      "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "array-includes": "3.0.3",
+        "bonjour": "3.5.0",
+        "chokidar": "2.0.2",
+        "compression": "1.7.2",
+        "connect-history-api-fallback": "1.5.0",
+        "debug": "3.1.0",
+        "del": "3.0.0",
+        "express": "4.16.3",
+        "html-entities": "1.2.1",
+        "http-proxy-middleware": "0.17.4",
+        "import-local": "1.0.0",
+        "internal-ip": "1.2.0",
+        "ip": "1.1.5",
+        "killable": "1.0.0",
+        "loglevel": "1.6.1",
+        "opn": "5.1.0",
+        "portfinder": "1.0.13",
+        "selfsigned": "1.10.2",
+        "serve-index": "1.9.1",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.1.4",
+        "spdy": "3.4.7",
+        "strip-ansi": "3.0.1",
+        "supports-color": "5.3.0",
+        "webpack-dev-middleware": "1.12.2",
+        "yargs": "6.6.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+          "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+          "dev": true,
+          "requires": {
+            "micromatch": "3.1.9",
+            "normalize-path": "2.1.1"
+          }
+        },
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz",
+          "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "1.1.0",
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "extend-shallow": "2.0.1",
+            "fill-range": "4.0.0",
+            "isobject": "3.0.1",
+            "kind-of": "6.0.2",
+            "repeat-element": "1.1.2",
+            "snapdragon": "0.8.2",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        },
+        "chokidar": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz",
+          "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==",
+          "dev": true,
+          "requires": {
+            "anymatch": "2.0.0",
+            "async-each": "1.0.1",
+            "braces": "2.3.1",
+            "fsevents": "1.1.3",
+            "glob-parent": "3.1.0",
+            "inherits": "2.0.3",
+            "is-binary-path": "1.0.1",
+            "is-glob": "4.0.0",
+            "normalize-path": "2.1.1",
+            "path-is-absolute": "1.0.1",
+            "readdirp": "2.1.0",
+            "upath": "1.0.4"
+          }
+        },
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "dev": true,
+              "requires": {
+                "ms": "2.0.0"
+              }
+            },
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
+          "requires": {
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "expand-brackets": "2.1.4",
+            "extend-shallow": "2.0.1",
+            "fragment-cache": "0.2.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-number": "3.0.0",
+            "repeat-string": "1.6.1",
+            "to-regex-range": "2.1.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "3.1.0",
+            "path-dirname": "1.0.2"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "2.1.1"
+              }
+            }
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "dev": true
+        },
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "is-extglob": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+          "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+          "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.9",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz",
+          "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "4.0.0",
+            "array-unique": "0.3.2",
+            "braces": "2.3.1",
+            "define-property": "2.0.2",
+            "extend-shallow": "3.0.2",
+            "extglob": "2.0.4",
+            "fragment-cache": "0.2.1",
+            "kind-of": "6.0.2",
+            "nanomatch": "1.2.9",
+            "object.pick": "1.3.0",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          }
+        },
+        "supports-color": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
+          "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
+          "dev": true,
+          "requires": {
+            "has-flag": "3.0.0"
+          }
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "6.6.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+          "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "3.0.0",
+            "cliui": "3.2.0",
+            "decamelize": "1.2.0",
+            "get-caller-file": "1.0.2",
+            "os-locale": "1.4.0",
+            "read-pkg-up": "1.0.1",
+            "require-directory": "2.1.1",
+            "require-main-filename": "1.0.1",
+            "set-blocking": "2.0.0",
+            "string-width": "1.0.2",
+            "which-module": "1.0.0",
+            "y18n": "3.2.1",
+            "yargs-parser": "4.2.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+          "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+          "dev": true,
+          "requires": {
+            "camelcase": "3.0.0"
+          }
+        }
+      }
+    },
+    "webpack-hot-middleware": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.22.0.tgz",
+      "integrity": "sha512-kmjTZ6WXZowuBfTk1/H/scmyp09eHwPpqF2mHRZ9WMCBlQ61NSkqZ25azPlPOeCIhva57PGrUyeTIW5X8Q7HEw==",
+      "requires": {
+        "ansi-html": "0.0.7",
+        "html-entities": "1.2.1",
+        "querystring": "0.2.0",
+        "strip-ansi": "3.0.1"
+      }
+    },
+    "webpack-merge": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz",
+      "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.5"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
+      "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
+      "requires": {
+        "source-list-map": "2.0.0",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
+    "webpack-subresource-integrity": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz",
+      "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=",
+      "dev": true,
+      "requires": {
+        "webpack-core": "0.6.9"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "requires": {
+        "http-parser-js": "0.4.11",
+        "websocket-extensions": "0.1.3"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
+    },
+    "whatwg-fetch": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
+      "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
+    },
+    "when": {
+      "version": "3.6.4",
+      "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
+      "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
+      "dev": true
+    },
+    "whet.extend": {
+      "version": "0.9.9",
+      "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
+      "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE="
+    },
+    "which": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+      "requires": {
+        "isexe": "2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+      "dev": true
+    },
+    "wide-align": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
+      "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
+      "requires": {
+        "string-width": "1.0.2"
+      }
+    },
+    "window-size": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+    },
+    "wordwrap": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
+    },
+    "worker-farm": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
+      "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
+      "requires": {
+        "errno": "0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "requires": {
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "ws": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+      "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "1.0.0",
+        "safe-buffer": "5.1.1",
+        "ultron": "1.1.1"
+      }
+    },
+    "xml-char-classes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz",
+      "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0="
+    },
+    "xml2js": {
+      "version": "0.4.19",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
+      "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+      "dev": true,
+      "requires": {
+        "sax": "1.2.4",
+        "xmlbuilder": "9.0.7"
+      },
+      "dependencies": {
+        "sax": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+          "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+          "dev": true
+        }
+      }
+    },
+    "xmlbuilder": {
+      "version": "9.0.7",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+      "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
+      "dev": true
+    },
+    "xmlhttprequest-ssl": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+      "dev": true
+    },
+    "xregexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
+      "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
+      "dev": true,
+      "optional": true
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+    },
+    "xxhashjs": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz",
+      "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==",
+      "dev": true,
+      "requires": {
+        "cuint": "0.2.2"
+      }
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+    },
+    "yargs": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase": "3.0.0",
+        "cliui": "3.2.0",
+        "decamelize": "1.2.0",
+        "get-caller-file": "1.0.2",
+        "os-locale": "1.4.0",
+        "read-pkg-up": "1.0.1",
+        "require-directory": "2.1.1",
+        "require-main-filename": "1.0.1",
+        "set-blocking": "2.0.0",
+        "string-width": "1.0.2",
+        "which-module": "1.0.0",
+        "y18n": "3.2.1",
+        "yargs-parser": "5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true,
+          "optional": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "camelcase": "3.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
+    "yauzl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+      "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+      "dev": true,
+      "requires": {
+        "fd-slicer": "1.0.1"
+      }
+    },
+    "yeast": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+      "dev": true
+    },
+    "yn": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+      "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
+      "dev": true
+    },
+    "zone.js": {
+      "version": "0.8.19",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.19.tgz",
+      "integrity": "sha512-l9rofaOs6a4y1W8zt4pDmnCUCnYG377dG+5SZlXNWrTWYUuXFqcJZiOarhYiRVR0NI9sH/8ooPJiz4uprB/Mkg=="
+    }
+  }
+}
diff --git a/vid-webpack-master/package.json b/vid-webpack-master/package.json
new file mode 100644 (file)
index 0000000..8cb4b92
--- /dev/null
@@ -0,0 +1,89 @@
+{
+  "name": "vid-cli",
+  "version": "0.0.0",
+  "license": "MIT",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve --port 4201",
+    "build": "ng build --no-progress --no-aot",
+    "build.prod": "ng build",
+    "test": "ng test --c --single-run",
+    "lint": "ng lint --type-check --fix",
+    "coverage": "ng test --code-coverage",
+    "coverage-console": "ng test --c --single-run",
+    "e2e": "ng e2e",
+    "build-watch": "ng build --watch",
+    "cypress:open": "cypress open",
+    "cypress:open:dev": "cypress open --config baseUrl=http://localhost:8080/vid ",
+    "cypress:run": "cypress run"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular-redux/store": "^7.1.1",
+    "@angular/animations": "5.2.0",
+    "@angular/cdk": "2.0.0-beta.12",
+    "@angular/common": "5.2.0",
+    "@angular/compiler": "5.2.0",
+    "@angular/core": "5.2.0",
+    "@angular/forms": "5.2.0",
+    "@angular/http": "5.2.0",
+    "@angular/platform-browser": "5.2.0",
+    "@angular/platform-browser-dynamic": "5.2.0",
+    "@angular/router": "5.2.0",
+    "@angularclass/hmr": "2.1.3",
+    "@angularclass/hmr-loader": "3.0.4",
+    "@harmowatch/ngx-redux-core": "0.2.2",
+    "@nicky-lenaers/ngx-scroll-to": "^0.6.1",
+    "@types/lodash": "4.14.91",
+    "angular-svg-icon": "^5.0.0",
+    "angular-tree-component": "7.0.1",
+    "angular2-datatable": "0.6.0",
+    "angular2-multiselect-dropdown": "2.5.0",
+    "bootstrap": "^3.3.7",
+    "core-js": "2.4.1",
+    "font-awesome": "^4.7.0",
+    "ng-multiselect-dropdown": "0.1.3",
+    "ng2-bootstrap-modal": "1.0.1",
+    "ngx-bootstrap": "^2.0.2",
+    "ngx-contextmenu": "4.1.2",
+    "ngx-datatable": "1.0.3",
+    "ngx-moment": "^2.0.0-rc.0",
+    "ngx-tooltip": "0.0.9",
+    "redux": "^3.7.2",
+    "redux-observable": "^0.18.0",
+    "rxjs": "5.5.6",
+    "sdc-ui": "^1.6.29-angular5",
+    "tslib": "1.9.x",
+    "zone.js": "0.8.19"
+  },
+  "devDependencies": {
+    "@angular/cli": "1.7.2",
+    "@angular/compiler-cli": "5.2.0",
+    "@angular/language-service": "5.2.0",
+    "@bahmutov/add-typescript-to-cypress": "^2.0.0",
+    "@types/chai": "^4.1.3",
+    "@types/cypress": "^1.1.3",
+    "@types/jasmine": "2.8.3",
+    "@types/jasminewd2": "2.0.2",
+    "@types/mocha": "^5.2.0",
+    "@types/node": "6.0.60",
+    "codelyzer": "4.0.1",
+    "cypress": "^2.1.0",
+    "jasmine-core": "2.5.2",
+    "jasmine-spec-reporter": "4.2.1",
+    "karma": "2.0.2",
+    "karma-chrome-launcher": "2.2.0",
+    "karma-coverage-istanbul-reporter": "2.0.1",
+    "karma-istanbul-threshold": "1.2.2",
+    "karma-jasmine": "1.1.2",
+    "karma-jasmine-html-reporter": "1.1.0",
+    "karma-junit-reporter": "^1.2.0",
+    "karma-phantomjs-launcher": "1.0.4",
+    "karma-remap-istanbul": "0.6.0",
+    "karma-spec-reporter": "0.0.32",
+    "protractor": "5.1.2",
+    "ts-node": "4.1.0",
+    "tslint": "5.9.1",
+    "typescript": "2.5.3"
+  }
+}
diff --git a/vid-webpack-master/polyfills.ts b/vid-webpack-master/polyfills.ts
new file mode 100644 (file)
index 0000000..6fb2c40
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+import 'core-js/es6/symbol';
+import 'core-js/es6/object';
+import 'core-js/es6/function';
+import 'core-js/es6/parse-int';
+import 'core-js/es6/parse-float';
+import 'core-js/es6/number';
+import 'core-js/es6/math';
+import 'core-js/es6/string';
+import 'core-js/es6/date';
+import 'core-js/es6/array';
+import 'core-js/es6/regexp';
+import 'core-js/es6/map';
+import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js';
+
+/** IE10 and IE11 requires the following to support `@angular/animation`. */
+//import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+/** Evergreen browsers require these. **/
+import 'core-js/es6/reflect';
+import 'core-js/es7/reflect';
+
+
+/** ALL Firefox browsers require the following to support `@angular/animation`. **/
+//import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone';  // Included with Angular CLI.
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+//import 'intl';  // Run `npm install --save intl`.
diff --git a/vid-webpack-master/pom.xml b/vid-webpack-master/pom.xml
new file mode 100644 (file)
index 0000000..fd069d7
--- /dev/null
@@ -0,0 +1,305 @@
+<?xml version="1.0"?>
+<project
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+  xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+
+  <!-- This is the Maven project object model (POM) file for VID web application
+      based on the ECOMP SDK distribution. This file stands alone; it does not
+      inherit from a parent maven module. -->
+  <groupId>org.onap.vid</groupId>
+  <artifactId>vid-webpack-master</artifactId>
+  <version>1.3.0</version>
+  <packaging>war</packaging>
+  <name>VID UI</name>
+  <description>VID UI</description>
+
+  <properties>
+    <encoding>UTF-8</encoding>
+    <!--<epsdk.version>1.3.0</epsdk.version>-->
+    <!--<springframework.version>4.2.0.RELEASE</springframework.version>-->
+    <!--<hibernate.version>4.3.11.Final</hibernate.version>-->
+    <!--<jackson.version>2.6.3</jackson.version>-->
+    <!-- Skip assembling the zip by default -->
+    <skipassembly>true</skipassembly>
+    <!-- Tests usually require some setup that maven cannot do, so skip. -->
+    <skiptests>false</skiptests>
+    <!-- this should be commented for local debugging -->
+    <!-- <deployenv>local</deployenv> -->
+    <nexusproxy>https://nexus.onap.org</nexusproxy>
+    <stagingNexusPath>content/repositories/staging/</stagingNexusPath>
+    <snapshotNexusPath>content/repositories/snapshots/</snapshotNexusPath>
+    <releaseNexusPath>content/repositories/releases/</releaseNexusPath>
+  </properties>
+
+
+  <repositories>
+    <repository>
+      <!-- Snapshots repository has ECOMP snapshot artifacts -->
+      <id>att-mavencentral-ecomp-snapshots-repo</id>
+      <name>ATT Maven Central - Snapshots</name>
+      <url>http://mavencentral.it.att.com:8084/nexus/content/repositories/att-repository-snapshots/</url>
+    </repository>
+    <repository>
+      <id>onap-staging</id>
+      <name>ONAP - Staging Repository</name>
+      <url>${nexusproxy}/${stagingNexusPath}</url>
+    </repository>
+    <repository>
+      <!-- Releases repository has ECOMP release artifacts -->
+      <id>att-mavencentral-ecomp-releases-repo</id>
+      <name>ATT Maven Central - Releases</name>
+      <url>http://mavencentral.it.att.com:8084/nexus/content/repositories/att-repository-releases/</url>
+    </repository>
+    <repository>
+      <!-- Third party repository has Oracle and other jars -->
+      <id>att-mavencentral-3rd-repo</id>
+      <name>ATT Maven Central - Third Party</name>
+      <url>http://mavencentral.it.att.com:8084/nexus/content/repositories/att-repository-3rd-party/</url>
+    </repository>
+    <repository>
+      <!-- Service Assurance group has UEB/Cambria jars -->
+      <id>att-mavencentral-sa-group</id>
+      <name>ATT Maven Central - Service Assurance Group</name>
+      <url>http://mavencentral.it.att.com:8084/nexus/content/groups/2020SAPC/</url>
+    </repository>
+    <repository>
+      <!-- SWM repository has EELF jars -->
+      <id>att-swm-repo</id>
+      <name>ATT SWM Repository</name>
+      <url>http://mavencentral.it.att.com:8084/nexus/content/repositories/swm-releases</url>
+    </repository>
+
+    <repository>
+      <!-- Public repository has ECOMP jars -->
+      <id>att-mavencentral-public</id>
+      <name>ATT Maven Central - Public Group</name>
+      <url>http://mavencentral.it.att.com:8084/nexus/content/groups/att-public-group</url>
+    </repository>
+    <repository>
+      <id>ecomp-releases</id>
+      <name>OpenECOMP - Release Repository</name>
+      <url>${nexusproxy}/${releaseNexusPath}</url>
+    </repository>
+    <repository>
+      <id>ecomp-snapshots</id>
+      <name>OpenECOMP - Snapshot Repository</name>
+      <url>${nexusproxy}/${snapshotNexusPath}</url>
+    </repository>
+    <repository>
+      <id>ecomp-public</id>
+      <name>ecomp onap public Repository</name>
+      <url>https://nexus.onap.org/content/groups/public</url>
+    </repository>
+  </repositories>
+
+  <distributionManagement>
+    <repository>
+      <id>vid-releases</id>
+      <name>VID Release Repository</name>
+      <url>https://162.242.254.138:8443/repository/maven-releases</url>
+    </repository>
+
+    <snapshotRepository>
+      <id>vid-snapshots</id>
+      <name>VID Snapshot Repository</name>
+      <url>https://162.242.254.138:8443/repository/maven-snapshots</url>
+    </snapshotRepository>
+  </distributionManagement>
+
+  <profiles>
+    <profile>
+      <id>if-not-webpack</id>
+      <activation><activeByDefault>true</activeByDefault></activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-antrun-plugin</artifactId>
+            <version>1.8</version>
+            <executions>
+              <execution>
+                <id>make-empty-dist</id>
+                <phase>validate</phase>
+                <configuration>
+                  <target>
+                    <mkdir dir="${project.basedir}/dist/" />
+                    <echo file="${project.basedir}/dist/NO-WEBPACK.txt" append="false">
+                      Note: 'webpack' profile was not selected while mvn build. This 'dist' folder was created to make the war creation through.
+                    </echo>
+                  </target>
+                </configuration>
+                <goals>
+                  <goal>run</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>webpack</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>com.github.eirslett</groupId>
+            <artifactId>frontend-maven-plugin</artifactId>
+            <!-- NB! Set <version> to the latest released version of frontend-maven-plugin, like in README.md -->
+            <version>1.6</version>
+
+            <executions>
+
+              <execution>
+                <id>install node and npm</id>
+                <goals>
+                  <goal>install-node-and-npm</goal>
+                </goals>
+                <configuration>
+                  <!-- See https://nodejs.org/en/download/ for latest node and npm (lts) versions -->
+                  <nodeVersion>v8.9.4</nodeVersion>
+                  <npmVersion>5.6.0</npmVersion>
+                </configuration>
+              </execution>
+
+              <execution>
+                <id>npm set no-progress</id>
+                <goals>
+                  <goal>npm</goal>
+                </goals>
+                <configuration>
+                  <arguments>set progress=false</arguments>
+                </configuration>
+              </execution>
+
+              <execution>
+                <id>npm install</id>
+                <goals>
+                  <goal>npm</goal>
+                </goals>
+                <!-- Optional configuration which provides for running any npm command -->
+                <configuration>
+                  <arguments>install</arguments>
+                  <environmentVariables>
+                    <CYPRESS_INSTALL_BINARY>0</CYPRESS_INSTALL_BINARY>
+                    <NO_PROXY>.att.com</NO_PROXY>
+                    <http_proxy>http://one.proxy.att.com:8080</http_proxy>
+                    <https_proxy>http://one.proxy.att.com:8080</https_proxy> <!-- for cypress install -->
+                  </environmentVariables>
+                </configuration>
+              </execution>
+
+              <execution>
+                <id>npm run test</id>
+                <goals>
+                  <goal>npm</goal>
+                </goals>
+                <configuration>
+                  <arguments>run test</arguments>
+                </configuration>
+              </execution>
+
+              <execution>
+                <id>npm run build</id>
+                <goals>
+                  <goal>npm</goal>
+                </goals>
+                <configuration>
+                  <arguments>run build</arguments>
+                </configuration>
+              </execution>
+
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+
+    <profile>
+      <id>cypress</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>com.github.eirslett</groupId>
+            <artifactId>frontend-maven-plugin</artifactId>
+            <!-- NB! Set <version> to the latest released version of frontend-maven-plugin, like in README.md -->
+            <version>1.6</version>
+
+            <executions>
+
+              <execution>
+                <id>install node and npm</id>
+                <goals>
+                  <goal>install-node-and-npm</goal>
+                </goals>
+                <configuration>
+                  <!-- See https://nodejs.org/en/download/ for latest node and npm (lts) versions -->
+                  <nodeVersion>v8.9.4</nodeVersion>
+                  <npmVersion>5.6.0</npmVersion>
+                </configuration>
+              </execution>
+
+              <execution>
+                <id>npm install cypress</id>
+                <goals>
+                  <goal>npm</goal>
+                </goals>
+                <!-- Optional configuration which provides for running any npm command -->
+                <configuration>
+                  <arguments>install --verbose cypress @bahmutov/add-typescript-to-cypress</arguments>
+                  <environmentVariables>
+                    <NO_PROXY>.att.com</NO_PROXY>
+                    <http_proxy>http://one.proxy.att.com:8080</http_proxy>
+                    <https_proxy>http://one.proxy.att.com:8080</https_proxy>
+                  </environmentVariables>
+                </configuration>
+              </execution>
+
+              <execution>
+                <id>npm run cypress</id>
+                <goals>
+                  <goal>npm</goal>
+                </goals>
+                <configuration>
+                  <npmInheritsProxyConfigFromMaven>false</npmInheritsProxyConfigFromMaven>
+                  <arguments>run cypress:run -- --config baseUrl=http://${VID_HOST}:8080/vid</arguments>
+                </configuration>
+              </execution>
+
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+  <build>
+    <finalName>vid-webpack-master</finalName>
+    <plugins>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>3.2.0</version>
+        <configuration>
+          <webResources>
+            <resource>
+              <!-- this is relative to the pom.xml directory -->
+              <directory>dist</directory>
+              <targetPath>app/ui</targetPath>
+            </resource>
+          </webResources>
+          <webXml>src/WEB-INF/web.xml</webXml>
+        </configuration>
+      </plugin>
+
+    </plugins>
+
+
+  </build>
+
+  <dependencies>
+  </dependencies>
+
+</project>
diff --git a/vid-webpack-master/postcss.config.js b/vid-webpack-master/postcss.config.js
new file mode 100644 (file)
index 0000000..2499ae9
--- /dev/null
@@ -0,0 +1,8 @@
+module.exports = {
+  syntax: 'postcss-scss',
+  plugins: {
+    'postcss-import': {},
+    'postcss-cssnext': {},
+    'cssnano': {}
+  }
+};
diff --git a/vid-webpack-master/protractor.conf.js b/vid-webpack-master/protractor.conf.js
new file mode 100644 (file)
index 0000000..ed99e23
--- /dev/null
@@ -0,0 +1,43 @@
+exports.config = {
+  baseUrl: 'http://localhost:8181/',
+
+  specs: [
+    'src/**/*.e2e-spec.js'
+  ],
+  exclude: [],
+
+  framework: 'jasmine2',
+
+  allScriptsTimeout: 110000,
+
+  jasmineNodeOpts: {
+    showTiming: true,
+    showColors: true,
+    isVerbose: false,
+    includeStackTrace: false,
+    defaultTimeoutInterval: 400000
+  },
+  directConnect: true,
+
+  capabilities: {
+    'browserName': 'chrome'
+  },
+
+  onPrepare: function () {
+    var SpecReporter = require('jasmine-spec-reporter').SpecReporter;
+    // add jasmine spec reporter
+    jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: true}));
+
+    browser.ignoreSynchronization = true;
+  },
+
+
+  /**
+   * Angular 2 configuration
+   *
+   * useAllAngular2AppRoots: tells Protractor to wait for any angular2 apps on the page instead of just the one matching
+   * `rootEl`
+   *
+   */
+  useAllAngular2AppRoots: true
+};
diff --git a/vid-webpack-master/src/WEB-INF/web.xml b/vid-webpack-master/src/WEB-INF/web.xml
new file mode 100644 (file)
index 0000000..a4152da
--- /dev/null
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
+
+  <!-- This is a stub web.xml in the common area -->
+  <display-name>vid-ebpack-master</display-name>
+
+  <!--
+  `vid-webpack-master` servlet and it's servlet mapping below, serves
+  Angular's index.html for any requests like the following, letting
+  the JavaScript router do its magic:
+  * /vid/app/ui/
+  * /vid/app/ui/servicePlanning
+  * /vid/app/ui/browseSdc
+  -->
+  <servlet>
+    <servlet-name>vid-webpack-master</servlet-name>
+    <jsp-file>/app/ui/index.html</jsp-file>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>vid-webpack-master</servlet-name>
+    <url-pattern>/app/ui/*</url-pattern>
+  </servlet-mapping>
+
+
+  <!--
+  All the files under the paths below are served as static files, using
+  tomcat's `default` servlet. This overrides the `vid-webpack-master`
+  url-pattern.
+  The filter `charset-to-utf8-filter` adds "charset=UTF-8" to these files
+  content type, as the default content-type is platform-dependant (which
+  is not ok for Windows stations).
+  -->
+  <servlet-mapping>
+    <servlet-name>default</servlet-name>
+    <url-pattern>/app/ui/css/*</url-pattern>
+    <url-pattern>/app/ui/fonts/*</url-pattern>
+    <url-pattern>/app/ui/img/*</url-pattern>
+    <url-pattern>/app/ui/js/*</url-pattern>
+  </servlet-mapping>
+
+  <filter>
+    <filter-name>charset-to-utf8-filter</filter-name>
+    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+    <init-param>
+      <param-name>encoding</param-name>
+      <param-value>UTF-8</param-value>
+    </init-param>
+    <init-param>
+      <param-name>forceEncoding</param-name>
+      <param-value>true</param-value>
+    </init-param>
+  </filter>
+
+  <filter-mapping>
+    <filter-name>charset-to-utf8-filter</filter-name>
+    <url-pattern>/app/ui/*</url-pattern>
+  </filter-mapping>
+
+</web-app>
diff --git a/vid-webpack-master/src/app/app.component.e2e-spec.js b/vid-webpack-master/src/app/app.component.e2e-spec.js
new file mode 100644 (file)
index 0000000..9ec9d23
--- /dev/null
@@ -0,0 +1,27 @@
+describe('App', function () {
+
+  beforeEach(function () {
+    browser.get('/');
+  });
+
+  it('should have a title', function () {
+    expect(browser.getTitle()).toEqual("Angular 2 App | ng2-webpack");
+  });
+
+  it('should have <header>', function () {
+    expect(element(by.css('my-app header')).isPresent()).toEqual(true);
+  });
+
+  it('should have <main>', function () {
+    expect(element(by.css('my-app main')).isPresent()).toEqual(true);
+  });
+
+  it('should have a main title', function () {
+    expect(element(by.css('main h1')).getText()).toEqual('Hello from Angular 2!');
+  });
+
+  it('should have <footer>', function () {
+    expect(element(by.css('my-app footer')).getText()).toEqual("Webpack Angular 2 Starter");
+  });
+
+});
diff --git a/vid-webpack-master/src/app/app.component.html b/vid-webpack-master/src/app/app.component.html
new file mode 100644 (file)
index 0000000..3768d0c
--- /dev/null
@@ -0,0 +1,6 @@
+<main>
+  <router-outlet>
+    <message-box></message-box>
+    <spinner-component></spinner-component>
+  </router-outlet>
+</main>
diff --git a/vid-webpack-master/src/app/app.component.scss b/vid-webpack-master/src/app/app.component.scss
new file mode 100644 (file)
index 0000000..9149aef
--- /dev/null
@@ -0,0 +1,24 @@
+// styles applied on :host are applied on the current component, "app" in this case
+:host {
+  display: block;
+}
+
+header {
+  background-color: #fff;
+  padding: 16px;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5);
+}
+
+main {
+  font-family: Arial, Helvetica, sans-serif;
+  display: block;
+}
+
+footer {
+  text-align: center;
+  font-size: 0.8em;
+}
diff --git a/vid-webpack-master/src/app/app.component.ts b/vid-webpack-master/src/app/app.component.ts
new file mode 100644 (file)
index 0000000..528c7d7
--- /dev/null
@@ -0,0 +1,28 @@
+import {Component, Inject} from '@angular/core';
+
+import { ApiService } from './shared';
+
+import '../style/app.scss';
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "./store/reducers";
+import { LogService } from './shared/utils/log/log.service';
+
+@Component({
+  selector: 'vid-app', // <vid-app></vid-app>
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.scss'],
+})
+export class AppComponent {
+  url = 'https://github.com/preboot/angular2-webpack';
+  title: string;
+
+
+  constructor(private api: ApiService, private store: NgRedux<AppState>, private _logService : LogService) {
+    this.title = this.api.title;
+    store.subscribe(()=>{
+      sessionStorage.setItem('reduxState', JSON.stringify(store.getState()));
+    });
+
+    this._logService.info("testing new log service");
+  }
+}
diff --git a/vid-webpack-master/src/app/app.module.ts b/vid-webpack-master/src/app/app.module.ts
new file mode 100644 (file)
index 0000000..a87ffb5
--- /dev/null
@@ -0,0 +1,79 @@
+import { ApplicationRef, NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { AppComponent } from './app.component';
+import { HomeComponent } from './home/home.component';
+import { ApiService } from './shared';
+import { routing } from './app.routing';
+import { createNewHosts, removeNgStyles } from '@angularclass/hmr';
+import { BrowseSdcModule } from './browseSdc/browseSdc.module';
+import { VlanTaggingModule } from './vlanTagging/vlan-tagging.module'
+import { BootstrapModalModule } from 'ng2-bootstrap-modal';
+import { HashLocationStrategy, LocationStrategy } from "@angular/common";
+import { InstantiationStatusModule } from './instantiationStatus/InstantiationStatus.module';
+import { SharedModule } from './shared/shared.module';
+import { AngularSvgIconModule } from 'angular-svg-icon';
+import { NgReduxModule } from '@angular-redux/store';
+import { StoreModule } from "./store/module";
+import { HttpInterceptorService } from './shared/utils/httpInterceptor/httpInterceptor.service';
+import { DrawingBoardModule } from './drawingBoard/drawingBoard.module';
+import { HealthStatusComponent } from './healthStatus/health-status.component';
+import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to';
+import { LogService } from './shared/utils/log/log.service';
+
+@NgModule({
+  imports: [
+    BrowserModule,
+    HttpClientModule,
+    FormsModule,
+    routing,
+    SharedModule.forRoot(),
+    ScrollToModule.forRoot(),
+    DrawingBoardModule,
+    VlanTaggingModule,
+    InstantiationStatusModule,
+    BrowseSdcModule,
+    BootstrapModalModule,
+    BrowseSdcModule,
+    AngularSvgIconModule,
+    ReactiveFormsModule,
+    NgReduxModule,
+    StoreModule,
+  ],
+  declarations: [
+    AppComponent,
+    HomeComponent,
+    HealthStatusComponent
+  ],
+  providers: [
+    ApiService,
+    LogService,
+    { provide: LocationStrategy, useClass: HashLocationStrategy },
+    { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true }
+  ],
+  bootstrap: [AppComponent]
+})
+export class AppModule {
+  private static CustomLoader: any;
+
+  constructor(public appRef: ApplicationRef) {
+    //for ng2-bootstrap-modal in angualar 5
+    Object.defineProperty(appRef, '_rootComponents', { get: () => appRef['components'] });
+  }
+  hmrOnInit(store) {
+    console.log('HMR store', store);
+  }
+  hmrOnDestroy(store) {
+    let cmpLocation = this.appRef.components.map(cmp => cmp.location.nativeElement);
+    // recreate elements
+    store.disposeOldHosts = createNewHosts(cmpLocation);
+    // remove styles
+    removeNgStyles();
+  }
+  hmrAfterDestroy(store) {
+    // display new elements
+    store.disposeOldHosts();
+    delete store.disposeOldHosts;
+  }
+}
diff --git a/vid-webpack-master/src/app/app.routing.ts b/vid-webpack-master/src/app/app.routing.ts
new file mode 100644 (file)
index 0000000..e6f42f9
--- /dev/null
@@ -0,0 +1,40 @@
+import {RouterModule, Routes} from '@angular/router';
+
+import {HomeComponent} from './home/home.component';
+import {BrowseSdcComponent} from './browseSdc/browseSdc.component';
+import {ServicePlanningComponent, ServicePlanningEmptyComponent} from './drawingBoard/service-planning/service-planning.component';
+import {VlanTaggingComponent} from './vlanTagging/vlan-tagging.component';
+import {ServicePopupComponent} from './components/service-popup/service-popup.component';
+import { InstantiationStatusComponent } from './instantiationStatus/instantiationStatus.component';
+import {HealthStatusComponent} from "./healthStatus/health-status.component";
+import {FlagsResolve} from "./services/flags.resolve";
+
+const routes: Routes = [
+  { path: '', component: HomeComponent, pathMatch: 'full' ,resolve : {
+    flags : FlagsResolve,
+  }},
+  { path: 'browseSdc', component: BrowseSdcComponent, resolve : {
+    flags : FlagsResolve,
+  }},
+  { path: 'servicePlanning', component: ServicePlanningComponent, resolve : {
+    flags : FlagsResolve,
+  }},
+  { path: 'servicePlanningEmpty', component: ServicePlanningEmptyComponent, resolve : {
+    flags : FlagsResolve,
+  }},
+  { path: 'servicePopup', component: ServicePopupComponent, resolve : {
+    flags : FlagsResolve,
+  }},
+  { path :'vlan', component : VlanTaggingComponent, resolve : {
+    flags : FlagsResolve,
+  }},
+  { path: 'instantiationStatus', component: InstantiationStatusComponent, resolve : {
+     flags : FlagsResolve,
+    }},
+  { path: 'healthStatus', component: HealthStatusComponent, resolve : {
+    flags : FlagsResolve,
+  }}
+
+];
+
+export const routing = RouterModule.forRoot(routes);
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.html b/vid-webpack-master/src/app/browseSdc/browseSdc.component.html
new file mode 100644 (file)
index 0000000..7ffd793
--- /dev/null
@@ -0,0 +1,26 @@
+<div>
+
+       <span class="statusLine" [hidden]="!isSpinnerVisible">
+                       <img src="./img/spinner.gif"/>
+       </span>
+  <span class="statusLine" [hidden]="!isProgressVisible">
+                       <label>Status:</label><span class="status"><span [hidden]="!error"><font color='red'><b>Error: </b></font></span>{{status}}</span>
+               </span>
+  <br><br>
+  <div>
+    <input class="form-control search-query" placeholder="Filter..." data-tests-id="browseFilter" type="text" [(ngModel)]="filterQuery" size="20" style="width: 250px;">
+  </div>
+
+  <h1 class="heading1" style="margin-top:20px;">Browse SDC Service Models</h1>
+  <div style="margin-top:30px">
+    <button (click)="deploy()">deploy</button>
+    <vid-table
+      [options]="tableOptions"
+      [filterQuery]="filterQuery"
+      (clickEvent)="clickAction($event)">
+      Loading table...
+    </vid-table>
+  </div>
+</div>
+
+
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss b/vid-webpack-master/src/app/browseSdc/browseSdc.component.scss
new file mode 100644 (file)
index 0000000..0d1678a
--- /dev/null
@@ -0,0 +1,59 @@
+div[ng-controller=ServiceModelController] .popupContents {
+  text-align: left;
+}
+
+div[ng-controller=ServiceModelController] .statusLine {
+  vertical-align: center;
+}
+
+div[ng-controller=ServiceModelController] .statusLine img {
+  width: 20px;
+  margin: 10px;
+}
+
+div[ng-controller=ServiceModelController] .status {
+  margin-left: 5px;
+}
+
+div[ng-controller=ServiceModelController] .feedback {
+  height: 35px;
+  vertical-align: center;
+}
+
+div[ng-controller=ServiceModelController] .progress {
+  margin: 0px 10px;
+  font-weight: bold;
+}
+
+div[ng-controller=ServiceModelController] .error {
+  width: 630px;
+  font-weight: bold;
+  font-size: 16px;
+  color: red;
+  margin: 0px 10px 0px 45px;
+}
+
+div[ng-controller=ServiceModelController] .error img {
+  width: 25px;
+  margin: 0px 10px;
+}
+
+div[ng-controller=ServiceModelController] .buttonRow {
+  text-align: center;
+  margin-bottom: 10px;
+}
+
+div[ng-controller=ServiceModelController] .log {
+  width: 700px;
+  height: 500px;
+  border: solid black 1px;
+  text-align: left !important;
+  margin: 10px;
+  padding: 10px;
+  overflow: auto;
+}
+
+
+.previous-versions-button {
+  width: 113px;
+}
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts b/vid-webpack-master/src/app/browseSdc/browseSdc.component.ts
new file mode 100644 (file)
index 0000000..46f37dc
--- /dev/null
@@ -0,0 +1,176 @@
+import {Component, Input, OnInit} from '@angular/core';
+import * as _ from 'lodash';
+import {SdcService} from '../services/sdc.service';
+import {DialogService} from 'ng2-bootstrap-modal';
+import {Constants} from '../shared/utils/constants';
+import {CustomTableColumnDefinition, CustomTableOptions} from './vid-table/vid-table.component';
+import {ServicePopupComponent} from "../components/service-popup/service-popup.component";
+import { PreviousVersionsComponent } from './previous-versions/previous-versions.component';
+
+@Component({
+  selector: 'browse-sdc',
+  templateUrl: './browseSdc.component.html',
+  styleUrls: ['./browseSdc.component.scss']
+})
+
+
+export class BrowseSdcComponent implements OnInit {
+
+  isSpinnerVisible = false;
+  isProgressVisible = false;
+  error: boolean;
+  status: string;
+  // table
+
+  private basicColumns: CustomTableColumnDefinition[];
+  @Input () filterQuery = '';
+  tableOptions: CustomTableOptions;
+  private wholeData: any[];
+
+  constructor(private _sdcService: SdcService, private dialogService: DialogService) {}
+
+  initTableOptions() {
+    this.basicColumns = [
+      { displayName: 'Action', key: 'action', type: 'button' , text: 'deploy', action: 'deploy' },
+      { displayName: 'UUID', key: 'uuid', filter: 'text'},
+      { displayName: 'invariantUUID', key: 'invariantUUID', filter: 'text'},
+      { displayName: 'Name', key: 'name', filter: 'text'},
+      { displayName: 'Version', key: 'version', filter: 'text'},
+      { displayName: 'Category', key: 'category', filter: 'text'},
+      { displayName: 'Distribution Status', key: 'distributionStatus', filter: 'text'},
+      { displayName: 'Last Updated By', key: 'lastUpdaterUserId', filter: 'text'},
+      { displayName: 'Tosca Model', key: 'toscaModelUrl', filter: 'text'}
+    ];
+
+    let columns: CustomTableColumnDefinition[] = this.basicColumns.concat(
+      {displayName: 'Action', key: 'actions', type: 'button', text: 'Previous Versions',
+        showCondition: 'hasPreviousVersion', action: 'loadPreviousData' }
+    );
+
+    this.tableOptions = {
+      data: [],
+      columns: columns,
+      config: {
+        sortBy: 'name',
+        sortOrder: 'asc',
+        pageSize: 10,
+        pageNumber: 1,
+        totalCount: 0,
+        totalPages: 0,
+        maxSize: 10,
+        showSelectCheckbox: true,
+        showSelectAll: true,
+        showSort: true,
+        clientSort: true,
+        clientPaging: true,
+        // displayPager: true,
+        // displayPageSize: true,
+        stickyHeader: true,
+        stickyHeaderOffset: 0,
+        stickyContainer: '.table1-container'
+      },
+    };
+  }
+  private deploy(service: any): void {
+    if (service) {
+      console.log('this row uuid:' + service.uuid);
+    }
+
+    this.dialogService.addDialog(ServicePopupComponent, {
+    })
+  }
+
+  private filterDataWithHigherVersion(serviceData) {
+    let delimiter = '$$';
+    let filterDataServices = {};
+    for (let i = 0; i < serviceData.length; i++) {
+      let index = serviceData[i].invariantUUID.trim() + delimiter + serviceData[i].name.trim();
+      if (!filterDataServices[index]) {
+        filterDataServices[index] = {
+          service: serviceData[i],
+          hasPreviousVersion: false
+        };
+      } else {
+        filterDataServices[index].hasPreviousVersion = true;
+        if (parseFloat(serviceData[i].version.trim()) > parseFloat(filterDataServices[index].service.version.trim())) {
+          filterDataServices[index].service = serviceData[i];
+        }
+      }
+    }
+    return Object.keys(filterDataServices).map(function (key) {
+      let service = filterDataServices[key].service;
+      service.hasPreviousVersion = filterDataServices[key].hasPreviousVersion;
+      return service;
+    });
+  }
+
+  private initData() {
+    this.isProgressVisible = true;
+    this.isSpinnerVisible = true;
+    console.log('getServicesModels: ');
+    this._sdcService.getServicesModels().subscribe(
+      // onNext() function
+      value => this.getServiceCallback(value),
+      // onError() function
+      error => this.getServiceOnError(error),
+      // onComplete() function
+      () => console.log('completed')
+    );
+  }
+
+  private getServiceCallback(responseBody: any): void {
+    console.log('response is ' , responseBody);
+    this.wholeData = responseBody.services;
+    this.tableOptions.data = this.filterDataWithHigherVersion(responseBody.services);
+    this.isSpinnerVisible = false;
+    this.isProgressVisible = false;
+  }
+  private getServiceOnError(error: any): void {
+    console.log('error is ' , error);
+    this.status =  Constants.Status.FAILED_SERVICE_MODELS_ASDC;
+    this.error = true;
+    this.isSpinnerVisible = false;
+  }
+
+  private loadPreviousVersionData(service): void {
+    let previousVersionData: any[] = _.filter(this.wholeData, function(item) {
+      return item.invariantUUID === service.invariantUUID && item.name === service.name && service.version !== item.version;
+    });
+
+    let modalTableOptions: CustomTableOptions = {
+      data: previousVersionData,
+      columns: this.basicColumns,
+      config: {
+        sortBy: 'version',
+        sortOrder: 'desc'}
+    };
+    // open modal
+    this.dialogService.addDialog(PreviousVersionsComponent, {
+      title: service.name + ' - Previous Version',
+      tableOptions: modalTableOptions
+    })
+      .subscribe( service => {
+        if (service) {
+          this.deploy(service);
+        }
+    });
+  }
+
+
+  public clickAction(row) {
+    switch (row.actionName) {
+      case 'loadPreviousData':
+        this.loadPreviousVersionData(row);
+        break;
+      case 'deploy':
+        this.deploy(row);
+        break;
+    }
+  }
+
+  ngOnInit() {
+    console.log('Browse SDC Service Models');
+    this.initTableOptions();
+    this.initData();
+  }
+}
diff --git a/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts b/vid-webpack-master/src/app/browseSdc/browseSdc.module.ts
new file mode 100644 (file)
index 0000000..b7dd78e
--- /dev/null
@@ -0,0 +1,35 @@
+
+import { NgModule } from '@angular/core';
+import {BrowseSdcComponent} from './browseSdc.component';
+import {VidTableComponent} from './vid-table/vid-table.component';
+import {SdcService} from '../services/sdc.service';
+import {CommonModule} from '@angular/common';
+import {FormsModule, ReactiveFormsModule} from '@angular/forms';
+import {DataTableModule} from 'angular2-datatable';
+import {BootstrapModalModule} from 'ng2-bootstrap-modal';
+import {PreviousVersionsComponent} from './previous-versions/previous-versions.component';
+import {ServicePopupComponent} from '../components/service-popup/service-popup.component';
+import {ServiceInstanceDetailsComponent} from "../components/service-popup/service-instance-details/service-instance-details.component";
+import {TooltipModule} from 'ngx-tooltip';
+import {InputsModule} from "../modules/inputs.module";
+import {VnfPopupComponent} from "../components/vnf-popup/vnf-popup.components";
+import {VnfInstanceDetailsComponent} from "../components/vnf-popup/vnf-instance-details/vnf-instance-details.component";
+import { VnfInstanceDetailsService } from '../components/vnf-popup/vnf-instance-details/vnf-instance-details.service';
+import { SharedModule } from '../shared/shared.module';
+import { ServiceInstanceDetailsService } from '../components/service-popup/service-instance-details/service-instance-details.service';
+import { ServicePopupService } from '../components/service-popup/service-popup.service';
+import { DataFilterPipe } from '../shared/pipes/data-filter.pipe';
+
+
+@NgModule({
+  imports: [CommonModule, FormsModule, ReactiveFormsModule, BootstrapModalModule, DataTableModule, TooltipModule, InputsModule, SharedModule.forRoot()],
+  providers: [SdcService, VnfInstanceDetailsService, ServiceInstanceDetailsService, ServicePopupService],
+  declarations: [BrowseSdcComponent, VidTableComponent, DataFilterPipe, PreviousVersionsComponent,
+    ServicePopupComponent, ServiceInstanceDetailsComponent, VnfPopupComponent, VnfInstanceDetailsComponent
+    ],
+  entryComponents: [BrowseSdcComponent, PreviousVersionsComponent, ServicePopupComponent, VnfPopupComponent],
+  exports: [ ]
+
+})
+
+export class BrowseSdcModule { }
diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.component.ts
new file mode 100644 (file)
index 0000000..8faf04d
--- /dev/null
@@ -0,0 +1,29 @@
+import { Component } from '@angular/core';
+import { DialogComponent, DialogService } from 'ng2-bootstrap-modal';
+import { CustomTableOptions } from '../vid-table/vid-table.component';
+
+export interface PreviousVersionsModel {
+
+  title: string;
+  tableOptions: CustomTableOptions;
+}
+
+@Component({
+  selector: 'previous-versions',
+  templateUrl: 'previous-versions.html',
+  styleUrls: ['previous-versions.css']
+})
+export class PreviousVersionsComponent extends DialogComponent<PreviousVersionsModel, boolean> implements PreviousVersionsModel {
+
+  title: string;
+  tableOptions: CustomTableOptions;
+
+  constructor(dialogService: DialogService) {
+    super(dialogService);
+  }
+
+  public deploy(row) {
+    this.result = row;
+    this.close();
+  }
+}
diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.css
new file mode 100644 (file)
index 0000000..92bcbd1
--- /dev/null
@@ -0,0 +1,4 @@
+.modal-dialog {
+  width: 1145px;
+  font-size: 11px;
+}
diff --git a/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html b/vid-webpack-master/src/app/browseSdc/previous-versions/previous-versions.html
new file mode 100644 (file)
index 0000000..68209b8
--- /dev/null
@@ -0,0 +1,18 @@
+<div class="modal-dialog">
+  <div class="modal-content">
+    <div class="modal-header">
+      <button type="button" class="close" (click)="close()" >&times;</button>
+      <h4 class="modal-title">{{title}}</h4>
+    </div>
+    <div class="modal-body">
+      <vid-table
+        [options]="tableOptions"
+        (clickEvent)="deploy($event)">
+        Loading table...
+      </vid-table>
+    </div>
+    <div class="modal-footer">
+      <button type="button" class="btn btn-default" (click)="close()" >Cancel</button>
+    </div>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.html
new file mode 100644 (file)
index 0000000..5650e5d
--- /dev/null
@@ -0,0 +1,26 @@
+<table class="table table-hover table-striped table-sortable" [mfData]="options.data | dataFilter : filterQuery" #mf="mfDataTable"  [(mfSortBy)]="options.config.sortBy" [(mfSortOrder)]="options.config.sortOrder" [mfRowsOnPage]="10">
+  <thead>
+  <tr>
+    <th *ngFor="let column of options.columns">
+      <mfDefaultSorter by="{{column.key}}"> {{column.displayName}}</mfDefaultSorter>
+    </th>
+  </tr>
+  </thead>
+  <tbody>
+  <tr *ngFor="let row of mf.data">
+    <td *ngFor="let column of options.columns" >
+      <button class="btn btn-primary" *ngIf="column.type==='button' && (!column.showCondition || row[column.showCondition])" title="{{column.text}}" (click)="clickBtn(row, column.action)">
+       {{column.text}}
+      </button>
+      {{row[column.key]}}
+    </td>
+  </tr>
+  </tbody>
+  <tfoot>
+  <tr>
+    <td colspan="5">
+      <mfBootstrapPaginator [rowsOnPageSet]="[10,15,20]"></mfBootstrapPaginator>
+    </td>
+  </tr>
+  </tfoot>
+</table>
diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.scss
new file mode 100644 (file)
index 0000000..f348879
--- /dev/null
@@ -0,0 +1,40 @@
+table > thead > tr > th {
+  cursor: pointer;
+  position: relative;
+  background-image: none;
+  color: #fff;
+  background-color: #666;
+  a{
+    color: #fff;
+  }
+}
+
+.table-sortable > thead > tr > th:after,
+.table-sortable > thead > tr > th.sort-false:after,
+.table-sortable > thead > tr > th.sort-true:after {
+  font-family: FontAwesome;
+  padding-left: 5px;
+}
+
+.table-sortable > thead > tr > th:after {
+  content: "\f0dc";
+  color: #ddd;
+}
+.table-sortable > thead > tr > th.sort-false:after {
+  content: "\f0de";
+  color: #767676;
+}
+.table-sortable > thead > tr > th.sort-true:after {
+  content: "\f0dd";
+  color: #767676;
+}
+//.table-sortable > tbody > td >
+.table-sortable {
+  tbody{
+    td{
+      .btn-primary{
+          min-width: 100px;
+        }
+      }
+    }
+}
diff --git a/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts b/vid-webpack-master/src/app/browseSdc/vid-table/vid-table.component.ts
new file mode 100644 (file)
index 0000000..aa20309
--- /dev/null
@@ -0,0 +1,59 @@
+/**
+ * Created by cp2122 on 1/2/2018.
+ */
+import { Component, Input, EventEmitter, Output } from '@angular/core';
+export class CustomTableColumnDefinition {
+  public displayName = '';
+  public key = '';
+  public type? = 'text';
+  public text? = ''; // for button
+  public action? = ''; // for button - callback
+  public showCondition? = ''; // for button
+  // public binding = '';
+  public filter? = '';
+  // public computedClass: any;
+  // public isComputed = false;
+  // public isAnchor = false;
+  // public srefBinding = '';
+}
+
+export class CustomTableConfig {
+  public sortBy = '';
+  public sortOrder = 'desc';
+  public pageSize? = 10;
+  public pageNumber? = 1;
+  public totalCount? = 0;
+  public totalPages? = 0;
+  public maxSize? = 10;
+  public showSelectCheckbox? = false;
+  public showSelectAll? = true;
+  public showSort? = true;
+  public clientSort? = true;
+  public clientPaging? = true;
+  public stickyHeader? = true;
+  public stickyHeaderOffset? = 0;
+  public stickyContainer? = '';
+}
+
+export class CustomTableOptions {
+  public data: any[];
+  public columns: Array<CustomTableColumnDefinition>;
+  public config: CustomTableConfig;
+  // public callbacks: any;
+}
+@Component({
+  selector: 'vid-table',
+  styleUrls: ['./vid-table.component.scss'],
+  templateUrl: './vid-table.component.html'
+})
+
+export class VidTableComponent {
+  @Input() options: CustomTableOptions;
+  @Input() filterQuery = '';
+
+  @Output() clickEvent = new EventEmitter<any>();
+  clickBtn(row, actionName) {
+    row.actionName = actionName;
+    this.clickEvent.emit(row);
+  }
+}
diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts b/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.component.ts
new file mode 100644 (file)
index 0000000..921c923
--- /dev/null
@@ -0,0 +1,80 @@
+import {Component, Input, OnInit} from '@angular/core';
+import {FormControl, FormGroup, Validators} from "@angular/forms";
+import {DynamicInput, DynamicMultiSelect, DynamicNumber, DynamicSelect} from "../../shared/models/dynamicInput";
+
+@Component({
+  selector: 'dynamic-inputs',
+  templateUrl: './dynamic-inputs.html',
+  styleUrls: ['./dynamic-inputs.scss']
+})
+
+export class DynamicInputsComponent implements OnInit{
+  @Input() public list:any[] = [];
+  @Input() public group: FormGroup;
+
+  private dynamicList:DynamicInput<any>[] = [];
+
+  isDynamicNumber(item: any): item is DynamicNumber {
+    return item;
+  }
+
+  buildValidators(item: DynamicInput<any>) {
+    let validatorArr = [];
+    item.maxLength && validatorArr.push(Validators.maxLength(item.maxLength));
+    item.minLength && validatorArr.push(Validators.minLength(item.minLength));
+    if(this.isDynamicNumber(item)) {
+      item.max && validatorArr.push(Validators.max(item.max));
+      item.min && validatorArr.push(Validators.min(item.min));
+    }
+    return Validators.compose(validatorArr);
+  }
+
+  ngOnInit(): void {
+    this.list.forEach((item)=> {
+      let dynamicItem: DynamicInput<any>;
+      switch (item.type) {
+        case 'multi_select':
+          item.optionList.forEach(function(option) { option.id = option.id||option.name;
+          option.itemName = option.name;});
+          item.settings = {
+            disabled: !item.isEnabled,
+            text: item.prompt,
+          };
+          dynamicItem = new DynamicMultiSelect(item);
+          break;
+        case 'select':
+          let defaultValue:any = item.optionList.find((option) => option.isDataLoading && option.name);
+          item.value = defaultValue && defaultValue.id;
+          dynamicItem = new DynamicSelect(item);
+          break;
+        case 'boolean':
+          item.value = item.value || false;
+          item.optionList = [{name: true, isPermitted: true, isDataLoading: item.value}, {name: false, isPermitted: true, isDataLoading: !item.value}];
+
+          dynamicItem = new DynamicSelect(item);
+          break;
+        case 'number':
+          dynamicItem = new DynamicNumber(item);
+          break;
+        case 'file':
+          dynamicItem = new DynamicInput<any>(item);
+          break;
+        case 'checkbox':
+          dynamicItem = new DynamicInput<boolean>(item);
+          break;
+        case 'map':
+          item.prompt = "{<key1>: <value1>,\.\.\.,<keyN>: <valueN>}";
+          dynamicItem = new DynamicInput<string>(item);
+          break;
+        case 'list':
+          item.prompt = "[<value1>,...,<valueN>]";
+          dynamicItem = new DynamicInput<string>(item);
+          break;
+        default: dynamicItem = new DynamicInput<string>(item);
+      }
+      this.dynamicList.push(dynamicItem);
+      this.group.addControl(dynamicItem.name, new FormControl({value: dynamicItem.value, disabled: !dynamicItem.isEnabled}, this.buildValidators(dynamicItem)));
+    })
+  }
+
+}
diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html b/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.html
new file mode 100644 (file)
index 0000000..a933364
--- /dev/null
@@ -0,0 +1,22 @@
+<div *ngFor="let item of dynamicList">
+  <div id="{{item.id}}" class="details-item" [ngSwitch]="item.type" [formGroup]="group" [hidden]="!item.isVisible">
+    <label>{{item.name | dynamicInputLabel }}</label>
+    <select *ngSwitchCase="item.type === 'select'|| item.type === 'boolean'? item.type: ''" name="{{item.name}}" class="form-control input-text" [formControlName]="item.name" title="{{item.description}}" [required]="item.isRequired && item.isVisible"  maxlength="{{item.maxLength}}" minlength="{{item.minLength}}">
+      <option value="null" [selected]="item.value == null || item.value == undefined" hidden disabled>{{item.prompt}}</option>
+      <option *ngFor="let option of item.optionList" [ngValue]="option.id || option.name" [disabled]="!option.isPermitted" [selected]="option.isDataLoading">{{option.name}}</option>
+    </select>
+    <angular2-multiselect *ngSwitchCase="'multi_select'" [formControlName]="item.name" [(ngModel)]="item.selectedItems" [data]="item.optionList" [settings]="item.settings" title="{{item.description}}" [required]="item.isRequired && item.isVisible"></angular2-multiselect>
+    <input *ngSwitchCase="'number'"  name="{{item.name}}" class="form-control input-text" [formControlName]="item.name" type="number" placeholder="{{item.prompt}}" title="{{item.description}}" min="{{item.min}}" max="{{item.max}}" [readonly]="item.isReadOnly" [required]="item.isRequired && item.isVisible">
+    <div *ngSwitchCase="'file'">
+
+      <label class="dynamicFileName" for="dynamicFileInput-{{item.name}}">
+        <input id="dynamicFileInput-{{item.name}}"  name="{{item.name}}" class="form-control input-text" [formControlName]="item.name" type="file" placeholder="{{item.prompt}}" [readonly]="item.isReadOnly" [required]="item.isRequired && item.isVisible">
+        <label for="dynamicFileInput-{{item.name}}" class="labelForImage">
+          <span class="icon-browse"></span>
+        </label>
+      </label>
+    </div>
+    <input *ngSwitchCase="'checkbox'"  name="{{item.name}}" [formControlName]="item.name" type="checkbox"  data-toggle="toggle" title="{{item.description}}" [readonly]="item.isReadOnly" [required]="item.isRequired && item.isVisible">
+    <input *ngSwitchDefault name="{{item.name}}" class="form-control input-text" [formControlName]="item.name" placeholder="{{item.prompt}}" title="{{item.description}}" maxlength="{{item.maxLength}}" minlength="{{item.minLength}}" [readonly]="item.isReadOnly" [required]="item.isRequired && item.isVisible"/>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss b/vid-webpack-master/src/app/components/dynamic-inputs/dynamic-inputs.scss
new file mode 100644 (file)
index 0000000..11a1414
--- /dev/null
@@ -0,0 +1,58 @@
+input[type=file] {
+  opacity: 0;
+  position: relative;
+  z-index: 1;
+  width: 0.5px;
+  height: 0.5px;
+  display: inline-block;
+  input {
+    display: none;
+  }
+}
+
+.dynamicFileName {
+  width: 100%;
+  height: 34px;
+  background: #FFFFFF;
+  border: 1px solid #D2D2D2;
+  border-radius: 2px;
+  display: inline-block;
+  line-height: 34px;
+  font-weight: normal !important;
+  padding-left: 3px;
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+
+.labelForImage {
+  background: #F2F2F2;
+  border-left: 1px solid #D2D2D2;
+  float: right;
+  height: 32px;
+}
+
+.icon-browse:before {
+  content: "\e90d";
+  color: #5A5A5A;
+  font-size: 15px;
+  cursor: pointer;
+  width: 34px;
+  height: 100%;
+  line-height: 34px;
+  text-align: center;
+  display: inline-block;
+  vertical-align: super;
+  border-radius: 2px;
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+
+.icon-browse:hover::before {
+  background-color: #E6F6FB;
+  color: #009FDB;
+}
+
+.icon-browse:active::before {
+  background-color: #E6F6FB;
+  color: #009FDB;
+}
diff --git a/vid-webpack-master/src/app/components/form-async/form-async.component.ts b/vid-webpack-master/src/app/components/form-async/form-async.component.ts
new file mode 100644 (file)
index 0000000..e71c444
--- /dev/null
@@ -0,0 +1,80 @@
+import {Component, Input, OnInit, ViewChild} from '@angular/core';
+import { NgRedux, select } from '@angular-redux/store';
+import { Observable } from "rxjs/Observable";
+import { updateProductFamilies } from "../../service.actions";
+import { AppState } from "../../store/reducers";
+import {
+  loadProductFamiliesAction, loadLcpTenant, loadAicZones,
+  loadCategoryParameters
+} from '../../services/aaiService/aai.actions';
+import { LcpRegionsAndTenants } from "../../shared/models/lcpRegionsAndTenants";
+import {NgForm} from "@angular/forms";
+import {SelectOption} from "../../shared/models/selectOption";
+import {VNFModel} from "../../shared/models/vnfModel";
+
+@Component({
+  selector: "formasync",
+  templateUrl: "form-async.template.html",
+  styleUrls: ["form-async.style.scss"],
+
+})
+
+export class formasync implements OnInit {
+
+  constructor(private store: NgRedux<AppState>) { }
+
+  @ViewChild('form') form: NgForm;
+
+  @Input()
+  set model(model: VNFModel) {
+    if (model) {
+      this.isUserProvidedNaming = model.isUserProvidedNaming;
+    }
+  };
+
+  @select(['service', 'productFamilies'])
+  readonly productFamilies: Observable<any>;
+
+  @select(['service', 'lcpRegionsAndTenants'])
+  readonly lcpRegionsAndTenants: Observable<any>;
+
+  @select(['service', 'lcpRegionsAndTenants', 'lcpRegionList'])
+  readonly lcpRegions: Observable<any>;
+
+  @select(['service', 'aicZones'])
+  readonly aicZones: Observable<any>;
+
+  @select(['service', 'categoryParameters', 'platformList'])
+  readonly platformList: Observable<any>;
+
+  @select(['service', 'categoryParameters', 'lineOfBusinessList'])
+  readonly lineOfBusinessList: Observable<any>;
+
+  rollbackOnFailure = [
+    new SelectOption({id: 'true', name: 'Rollback'}),
+    new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+  ];
+  tenants = [];
+
+  serviceInstance: any = {
+    rollback:'true'
+  };
+
+  isUserProvidedNaming: boolean = false;
+
+  onLcpSelect(newValue: string) {
+    let value: LcpRegionsAndTenants = undefined;
+    this.lcpRegionsAndTenants.subscribe(data => value = data);
+    this.tenants = value.lcpRegionsTenantsMap[newValue];
+  }
+
+  ngOnInit() {
+    this.store.dispatch(loadProductFamiliesAction());
+    this.store.dispatch(loadLcpTenant());
+    this.store.dispatch(loadAicZones());
+    this.store.dispatch(loadCategoryParameters());
+  }
+}
+
+
+
diff --git a/vid-webpack-master/src/app/components/form-async/form-async.style.scss b/vid-webpack-master/src/app/components/form-async/form-async.style.scss
new file mode 100644 (file)
index 0000000..e6c89bc
--- /dev/null
@@ -0,0 +1,15 @@
+.form-wrapper{
+  width:640px;
+  padding-left: 50px;
+  padding-top: 50px;
+  .details-item{
+    padding-bottom: 30px;
+  }
+  .details-item {
+    select {
+      font-family: OpenSans-Italic;
+      font-size: 14px;
+      color: #959595 !important;
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/components/form-async/form-async.template.html b/vid-webpack-master/src/app/components/form-async/form-async.template.html
new file mode 100644 (file)
index 0000000..c63a7be
--- /dev/null
@@ -0,0 +1,67 @@
+<div class="content">
+  <form #form="ngForm" name="networkNodeForm" class="form-wrapper">
+    <div *ngIf="isUserProvidedNaming" class="details-item">
+      <label class="placeholder">Instance name*</label>
+      <input [attr.data-tests-id]="'instanceName'" id="instance-name" [(ngModel)]="serviceInstance.instanceName" name="instance-name"
+        class="form-control input-text" placeholder="Type Instance Name" type="text" required>
+    </div>
+
+    <div class="details-item">
+      <label>Product family</label>
+      <select class="form-control input-text" [(ngModel)]="serviceInstance.productFamily" data-tests-id="productFamily" id="product-family-select"
+        name="product-family-select">
+        <option class="placeholder" [value]="undefined" disabled>Select Product Family</option>
+        <option *ngFor="let productFamily of productFamilies | async" [value]="productFamily.id" [disabled]="!productFamily.isPermitted">{{productFamily.name}}</option>
+      </select>
+    </div>
+
+    <div class="details-item">
+      <label>LCP region:*</label>
+      <select (change)="onLcpSelect($event.target.value)" class="form-control input-text" [(ngModel)]="serviceInstance.lcpRegion"
+        name="lcpRegion" id="lcpRegion-select" data-tests-id="lcpRegion" required>
+        <option class="placeholder1" [value]="undefined" disabled>Select LCP Region</option>
+        <option *ngFor="let lcpRegion of lcpRegions | async" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option>
+      </select>
+    </div>
+    <div class="details-item">
+      <label>Tenant:*</label>
+      <select class="form-control input-text" [(ngModel)]="serviceInstance.tenantId" name="tenant" id="tenant-select" data-tests-id="tenant"
+        required>
+        <option class="placeholder1" [value]="undefined" disabled>Select Tenant</option>
+        <option *ngFor="let tenant of tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option>
+      </select>
+    </div>
+
+    <div class="details-item">
+      <label>AIC Zone:</label>
+      <select class="form-control input-text" name="aicZone" id="aicZone-select" data-tests-id="aic_zone" [(ngModel)]="serviceInstance.aicZone">
+        <option class="placeholder1" [value]="undefined" disabled>Select AIC Zone</option>
+        <option class="aicZoneOption" *ngFor="let aicZone of aicZones | async" [value]="aicZone.id">{{aicZone.name}}</option>
+      </select>
+    </div>
+    <div class="details-item">
+      <label>Platform:</label>
+      <select data-tests-id="platform" class="form-control input-text" name="platform" id="platform" [(ngModel)]="serviceInstance.platformName">
+        <option class="placeholder1" [value]="undefined" disabled>Select Platform</option>
+        <option *ngFor="let platform of platformList | async" [value]="platform.id">{{platform.name}}</option>
+      </select>
+    </div>
+
+    <div class="details-item">
+      <label>Line Of Business:*</label>
+      <select data-tests-id="lineOfBusiness" class="form-control input-text" [(ngModel)]="serviceInstance.lineOfBusiness"
+        name="owningEntity" id="owningEntity" required>
+        <option class="placeholder1" [value]="undefined" disabled>Select Line Of Business</option>
+        <option *ngFor="let lineOfBusiness of lineOfBusinessList | async" [value]="lineOfBusiness.id">{{lineOfBusiness.name}}</option>
+      </select>
+    </div>
+    <div class="details-item">
+      <label>Rollback On Failure:</label>
+      <select data-tests-id="suppressRollback" class="form-control input-text" name="rollbackOnFailure" id="rollbackOnFailure" [(ngModel)]="serviceInstance.rollback">
+        <option *ngFor="let option of rollbackOnFailure" [value]="option.id">{{option.name}}</option>
+      </select>
+    </div>
+  </form>
+
+</div>
+
diff --git a/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts b/vid-webpack-master/src/app/components/instance-popup/instance-popup.components.ts
new file mode 100644 (file)
index 0000000..b8ce613
--- /dev/null
@@ -0,0 +1,9 @@
+import {ModelInformationItem} from "../../shared/components/model-information/model-information.component";
+
+
+export interface InstancePopup {
+  onCancelClick():void;
+  createModelInformationItems(): Array<ModelInformationItem>;
+  getModelName():string;
+}
+
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.component.ts
new file mode 100644 (file)
index 0000000..b6a2e39
--- /dev/null
@@ -0,0 +1,238 @@
+import {Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild} from '@angular/core';
+import {FormControl, FormGroup, Validators} from "@angular/forms";
+import {ServicePopupDataModel} from './servicePopupDataModel';
+import {AaiService} from '../../../services/aaiService/aai.service';
+import {updateServiceInstance} from "../../../service.actions";
+import * as _ from 'lodash';
+import {ServiceModel} from "../../../shared/models/serviceModel";
+import {ModelInfo} from "../../../shared/models/modelInfo";
+import {loadProductFamiliesAction} from "../../../services/aaiService/aai.actions";
+import {Observable} from "rxjs/Observable";
+import {SelectOptionInterface} from "../../../shared/models/selectOption";
+import {NgRedux, select} from "@angular-redux/store";
+import {AppState} from "../../../store/reducers";
+import {isNullOrUndefined} from 'util';
+import {ServiceInstanceDetailsService} from './service-instance-details.service';
+import {NumbersLettersUnderscoreValidator} from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+import {DefaultDataGeneratorService} from '../../../shared/services/defaultDataServiceGenerator/default.data.generator.service';
+
+
+@Component({
+  selector: 'service-instance-details',
+  templateUrl: 'service-instance-details.html',
+  styleUrls: ['service-instance-details.scss'],
+  providers: [AaiService]
+})
+
+export class ServiceInstanceDetailsComponent implements OnInit, OnChanges {
+  ngOnChanges(changes: SimpleChanges): void {
+    if (changes["serviceInstance"] !== undefined && changes["serviceInstance"].currentValue !== changes["serviceInstance"].previousValue && changes["serviceInstance"].currentValue !== null) {
+      this.oldServiceInstance = Object.assign({}, this.serviceInstance);
+    }
+  }
+  _serviceModel: ServiceModel;
+  @Input () serviceInstance: any;
+  @Input () dynamicInputs;
+  @Input () servicesQty: number;
+  @Input ()
+  set serviceModel(serviceModel: ServiceModel) {
+    this._serviceModel = serviceModel;
+    this.updateFormGroupControlsWithServiceModel(serviceModel);
+  }
+  @ViewChild('serviceForm') serviceForm: 'ServiceForm';
+  @Output() closePopup : EventEmitter<any> = new EventEmitter<any>();
+  @Output() onDataChanged: EventEmitter<any> = new EventEmitter<any>();
+  oldServiceInstance = {};
+
+  //todo: implement Epics and use @select to fetch the rest of the form's data as done with productFamilies.
+  //that way we can loose the updateFormData function and the subscription to store in the constructor.
+  @select(['service','productFamilies'])
+  readonly productFamilies : Observable<SelectOptionInterface[]>;
+  serviceDetails:any = {
+
+  };
+  servicePopupDataModel: ServicePopupDataModel = new ServicePopupDataModel();
+  serviceInstanceDetailsFormGroup: FormGroup;
+  serviceInstanceDetailsService : ServiceInstanceDetailsService;
+
+  constructor(private _aaiService: AaiService, private store: NgRedux<AppState>, private _serviceInstanceDetailsService : ServiceInstanceDetailsService, private _defaultDataGeneratorService : DefaultDataGeneratorService) {
+    this.store.subscribe(() => {this.updateFormData()});
+    this.serviceInstanceDetailsService = this._serviceInstanceDetailsService;
+    this.serviceInstanceDetailsFormGroup = this.createFormGroup();
+
+    this.serviceInstanceDetailsFormGroup.valueChanges.subscribe(()=> {
+      this.onDataChanged.next();
+    })
+  }
+
+  ngOnInit() {
+    this.subscribeToFormChanges();
+    this._aaiService.getSubscribers().subscribe();
+    this._aaiService.getCategoryParameters(null).subscribe();
+    this._aaiService.getAicZones().subscribe();
+    this.store.dispatch(loadProductFamiliesAction());
+  }
+
+
+  createFormGroup(): FormGroup {
+    const formGroup = new FormGroup({
+      globalSubscriberId: new FormControl(
+        Validators.compose([Validators.required])
+      ),
+      productFamilyId: new FormControl(),
+      subscriptionServiceType: new FormControl({value: null,  disabled: true}, Validators.compose([Validators.required])),
+      lcpCloudRegionId: new FormControl({value: null,  disabled: true}, Validators.compose([Validators.required])),
+      tenantId: new FormControl({value: null,  disabled: true}, Validators.compose([Validators.required])),
+      aicZoneId: new FormControl(),
+      projectName: new FormControl(),
+      owningEntityId: new FormControl(Validators.compose([Validators.required])),
+      rollbackOnFailure: new FormControl(null, Validators.required),
+    });
+
+    return formGroup;
+  }
+
+  updateFormGroupControlsWithServiceModel(serviceModel: ServiceModel) {
+    this.serviceInstanceDetailsFormGroup.markAsUntouched();
+
+    if (serviceModel) {
+      this.serviceDetails.isUserProvidedNaming = serviceModel.isUserProvidedNaming;
+      if (serviceModel.isUserProvidedNaming) {
+        this.serviceInstanceDetailsFormGroup.addControl('instanceName', new FormControl('', Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid])))
+      }else{
+        this.serviceInstanceDetailsFormGroup.removeControl('instanceName');
+      }
+
+      if (serviceModel.isMultiStepDesign) {
+        this.serviceInstanceDetailsFormGroup.addControl('pause', new FormControl(true));
+      }else{
+        this.serviceInstanceDetailsFormGroup.removeControl('pause');
+      }
+    }
+  }
+
+  updateFormData() {
+    let service = this.store.getState().service;
+    this.servicePopupDataModel.subscribers = service.subscribers;
+    this.servicePopupDataModel.serviceTypes = service.serviceTypes[this.servicePopupDataModel.globalCustomerId];
+    this.servicePopupDataModel.lcpRegions = service.lcpRegionsAndTenants.lcpRegionList;
+    if (this.serviceInstance) {
+      this.servicePopupDataModel.tenants = service.lcpRegionsAndTenants.lcpRegionsTenantsMap[this.serviceInstance.lcpCloudRegionId];
+    }
+    this.servicePopupDataModel.aicZones = service.aicZones;
+    this.servicePopupDataModel.owningEntities = _.get(service.categoryParameters, 'owningEntityList');
+    this.servicePopupDataModel.projects = _.get(service.categoryParameters, 'projectList');
+    this.onDataChanged.next();
+  }
+
+  subscribeToFormChanges(): void {
+    this.serviceInstanceDetailsFormGroup.get('globalSubscriberId').valueChanges.subscribe(val => {
+      this.updateServiceTypes(val);
+      this.setDisabledState(val, 'subscriptionServiceType');
+
+    });
+    this.serviceInstanceDetailsFormGroup.get('subscriptionServiceType').valueChanges.subscribe(val => {
+      this.getTenants(val);
+      this.setDisabledState(val, 'lcpCloudRegionId');
+
+    });
+    this.serviceInstanceDetailsFormGroup.get('lcpCloudRegionId').valueChanges.subscribe(val => {
+      this.setDisabledState(val, 'tenantId');
+      this.updateTenantList(val);
+
+    });
+
+    this.serviceInstanceDetailsFormGroup.get('tenantId').valueChanges.subscribe(val => {
+      this.serviceDetails.tenantName = this.getNameFromListById(this.servicePopupDataModel.tenants, val);
+      this.onDataChanged.next();
+    });
+
+    this.serviceInstanceDetailsFormGroup.get('aicZoneId').valueChanges.subscribe(val => {
+      this.serviceDetails.aicZoneName = this.getNameFromListById(this.servicePopupDataModel.aicZones, val);
+      this.onDataChanged.next();
+    });
+  }
+
+  getNameFromListById(list, id:string ) {
+    if(list && id) {
+      let filterItem = list.filter(item => {
+        return item.id == id;
+      })
+      return filterItem && filterItem[0].name;
+    }
+    return null;
+  }
+
+  setDisabledState(val, field: string): void {
+    if(val) {
+      this.serviceInstanceDetailsFormGroup.controls[field].enable();
+    } else {
+      this.serviceInstanceDetailsFormGroup.controls[field].disable();
+    }
+  }
+
+  isShowingNotificationArea(): boolean {
+    return this.servicesQty > 1;
+  }
+
+  updateServiceTypes(subscriberId) {
+    if (subscriberId) {
+      this.servicePopupDataModel.globalCustomerId = subscriberId;
+      this._aaiService.getServiceTypes(subscriberId).subscribe(() => {
+        this.updateFormData();
+        this.onDataChanged.next();
+      }, (error) => {
+
+      });
+    }
+  }
+
+  updateTenantList(cloudRegionId) {
+    this.servicePopupDataModel.tenants = this.store.getState().service.lcpRegionsAndTenants.lcpRegionsTenantsMap[cloudRegionId];
+    this.onDataChanged.next();
+  }
+
+  getTenants(serviceType) {
+    if (serviceType) {
+      this._aaiService.getLcpRegionsAndTenants(this.servicePopupDataModel.globalCustomerId, serviceType).subscribe(()=>{
+        this.onDataChanged.next();
+      });
+    }
+  }
+
+  onSubmit(formValues): void {
+    formValues.bulkSize = this.servicesQty;
+    let dynamicFields: { [dynamicField: string] : string; };
+    dynamicFields = {};
+    this.dynamicInputs.map(function (x) {
+      let dynamicField: string = x.id;
+      dynamicFields[dynamicField] = formValues[dynamicField];
+      delete formValues[dynamicField];
+    });
+    formValues.instanceParams = [];
+    formValues.instanceParams.push(dynamicFields);
+    formValues.modelInfo = new ModelInfo(this._serviceModel);
+    Object.assign(formValues, this.serviceDetails);
+    this.store.dispatch(updateServiceInstance(formValues, this._serviceModel.uuid));
+    if (this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD']){
+      this._defaultDataGeneratorService.updateReduxOnFirstSet(this._serviceModel.uuid,formValues);
+    }
+    window.parent.postMessage( {
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: this._serviceModel.uuid
+      }
+    }, "*");
+    this.closePopup.emit(this._serviceModel.uuid);
+  }
+
+  hasApiError(controlName : string, data : Array<any>){
+    if(!isNullOrUndefined(this.servicePopupDataModel) && !isNullOrUndefined(data)){
+      if(!this.serviceInstanceDetailsFormGroup.controls[controlName].disabled && data.length === 0){
+          return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.html
new file mode 100644 (file)
index 0000000..3d632bd
--- /dev/null
@@ -0,0 +1,168 @@
+
+<div id="service-instance-details">
+  <form id="serviceForm" #serviceForm="ngForm" (ngSubmit)="onSubmit(serviceForm.value)" [formGroup]="serviceInstanceDetailsFormGroup">
+    <!--We can't use [hidden] since bootstrap.css label has display: inline-block. -->
+    <!--see https://stackoverflow.com/questions/34650410/angular-2-hidden-does-not-seem-to-be-working-->
+    <label id="notification-area" *ngIf="isShowingNotificationArea()">Data entered will apply to all service instances</label>
+
+    <div class="details-item" *ngIf="serviceInstanceDetailsFormGroup.get('instanceName')">
+      <label class="required">Instance name:</label>
+      <input patternInput
+             pattern="^[a-zA-Z0-9_]*$"
+             [attr.data-tests-id]="'instanceName'"
+             id="instance-name"
+             name="instance-name"
+             [ngClass]="{'error-style' :(serviceInstance?.instanceName != '' && serviceInstanceDetailsFormGroup.controls['instanceName']?.touched && serviceInstanceDetailsFormGroup.controls['instanceName']?.errors?.pattern !== null)}"
+             [formControlName]="'instanceName'"
+             class="form-control input-text"
+             placeholder="Type Instance Name"
+             type="text"
+             [(ngModel)]="serviceInstance.instanceName" required>
+      <form-control-error
+        *ngIf="serviceInstance?.instanceName != '' && serviceInstanceDetailsFormGroup.controls['instanceName']?.touched && serviceInstanceDetailsFormGroup.controls['instanceName']?.errors?.pattern !== null"
+        [message]="'Instance name may include only alphanumeric characters and underscore.'"></form-control-error>
+
+    </div>
+
+    <div class="details-item">
+      <label class="required">Subscriber name:</label>
+      <select class="subscriber form-control input-text" id="subscriber-name-select" data-tests-id="subscriberName"
+              name="subscriber-name-select" [formControlName]="'globalSubscriberId'"
+              [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('globalSubscriberId',servicePopupDataModel?.subscribers, serviceInstanceDetailsFormGroup)}"
+              [(ngModel)]="serviceInstance.globalSubscriberId"
+              required>
+        <option [value]="undefined" disabled>Select Subscriber Name</option>
+        <option class="subscriberNameOption" *ngFor="let subscriber of servicePopupDataModel.subscribers"
+                [value]="subscriber.id" [disabled]="!subscriber.isPermitted">{{subscriber.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('globalSubscriberId',servicePopupDataModel?.subscribers, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+
+    </div>
+
+    <div class="details-item">
+      <label class="required">Service type:</label>
+      <select class="form-control input-text"
+              [(ngModel)]="serviceInstance.subscriptionServiceType"
+              [formControlName]="'subscriptionServiceType'"
+              [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('subscriptionServiceType',servicePopupDataModel?.serviceTypes, serviceInstanceDetailsFormGroup)}"
+              data-tests-id="serviceType" id="service-type-select"
+              name="service-type" required>
+        <option [value]="undefined" disabled>Select Service Type</option>
+        <option *ngFor="let serviceType of servicePopupDataModel.serviceTypes" class="serviceTypeOption" [value]="serviceType.name" [disabled]="!serviceType.isPermitted">{{serviceType.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('subscriptionServiceType',servicePopupDataModel?.serviceTypes, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div class="details-item">
+      <label class="required">Product family:</label>
+      <select class="form-control input-text"
+              data-tests-id="productFamily"
+              id="product-family-select"
+              [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('productFamilyId',productFamilies, serviceInstanceDetailsFormGroup)}"
+              [formControlName]="'productFamilyId'"
+              [(ngModel)]="serviceInstance.productFamilyId"
+              name="product-family-select" required>
+        <option [value]="undefined" disabled>Select Product Family</option>
+        <option *ngFor="let productFamily of productFamilies | async" [value]="productFamily.id"
+                [disabled]="!productFamily.isPermitted">{{productFamily.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('productFamilyId',productFamilies, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div class="details-item">
+      <label class="required">LCP region:</label>
+      <select
+        class="form-control input-text"
+        [formControlName]="'lcpCloudRegionId'"
+        [(ngModel)]="serviceInstance.lcpCloudRegionId"
+        [ngClass]="{'error-style ' : serviceInstanceDetailsService.hasApiError('lcpCloudRegionId', servicePopupDataModel?.lcpRegions, serviceInstanceDetailsFormGroup)}"
+        name="lcpRegion"
+        id="lcpRegion-select"
+        data-tests-id="lcpRegion"
+        required>
+        <option [value]="undefined" disabled>Select LCP Region</option>
+        <option *ngFor="let lcpRegion of servicePopupDataModel.lcpRegions" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('lcpCloudRegionId', servicePopupDataModel?.lcpRegions, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div class="details-item">
+      <label class="required">Tenant:</label>
+      <select class="form-control input-text"
+              [formControlName]="'tenantId'"
+              [(ngModel)]="serviceInstance.tenantId"
+              name="tenant" id="tenant-select"
+              [ngClass]="{'error-style ' : serviceInstanceDetailsService.hasApiError('tenantId',servicePopupDataModel?.tenants ,serviceInstanceDetailsFormGroup)}"
+              data-tests-id="tenant" required>
+        <option [value]="undefined" disabled>Select Tenant</option>
+        <option *ngFor="let tenant of servicePopupDataModel.tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('tenantId',servicePopupDataModel?.tenants ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div class="details-item">
+      <label>AIC Zone:</label>
+      <select
+        class="form-control input-text"
+        name="aicZone" id="aicZone-select"
+        data-tests-id="aic_zone"
+        [formControlName]="'aicZoneId'"
+        [ngClass]="{'error-style ' : servicePopupDataModel?.aicZones?.length == 0 && serviceInstanceDetailsFormGroup.controls['aicZoneId'].disabled == false}"
+        [(ngModel)]="serviceInstance.aicZoneId" >
+        <option [value]="undefined" disabled>Select AIC Zone</option>
+        <option class="aicZoneOption" *ngFor="let aicZone of servicePopupDataModel.aicZones" [value]="aicZone.id">{{aicZone.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('aicZoneId',servicePopupDataModel?.aicZones ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+
+    </div>
+
+    <div class="details-item">
+      <label>Project:</label>
+      <select
+        [attr.data-tests-id]="'project'"
+        class="form-control input-text"
+        [ngClass]="{'error-style ' : servicePopupDataModel?.projects?.length == 0 && serviceInstanceDetailsFormGroup.controls['projectName'].disabled == false}"
+        name="project" id="project"
+        [formControlName]="'projectName'"
+        [(ngModel)]="serviceInstance.projectName" >
+        <option [value]="undefined" disabled>Select Project</option>
+        <option *ngFor="let project of servicePopupDataModel.projects" [value]="project.id">{{project.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('projectName',servicePopupDataModel?.projects ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+
+    </div>
+
+    <div class="details-item">
+      <label class="required">Owning entity:</label>
+      <select [attr.data-tests-id]="'owningEntity'"
+              class="form-control input-text"
+              [formControlName]="'owningEntityId'"
+              [(ngModel)]="serviceInstance.owningEntityId"
+              name="owningEntity" id="owningEntity"
+              [ngClass]="{'error-style ' : servicePopupDataModel?.owningEntities?.length == 0 && serviceInstanceDetailsFormGroup.controls['owningEntityId'].disabled == false}"
+              required>
+        <option [value]="undefined" disabled>Select Owning Entity</option>
+        <option *ngFor="let owningEntity of servicePopupDataModel.owningEntities" [value]="owningEntity.id">{{owningEntity.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('owningEntityId',servicePopupDataModel?.owningEntities ,serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+    <div class="details-item">
+      <label class="required">Rollback On Failure:</label>
+      <select [attr.data-tests-id]="'rollback'"
+              [ngClass]="{'error-style' :serviceInstanceDetailsService.hasApiError('rollbackOnFailure',servicePopupDataModel?.rollbackOnFailure, serviceInstanceDetailsFormGroup)}"
+              class="form-control input-text"
+              [(ngModel)]="serviceInstance.rollbackOnFailure"
+              [formControlName]="'rollbackOnFailure'" name="rollbackOnFailure" id="rollbackOnFailure">
+        <option *ngFor="let option of servicePopupDataModel.rollbackOnFailure" [value]="option.id">{{option.name}}</option>
+      </select>
+      <form-control-error *ngIf="serviceInstanceDetailsService.hasApiError('rollbackOnFailure',servicePopupDataModel?.rollbackOnFailure, serviceInstanceDetailsFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+    <div class="details-item" *ngIf="serviceInstanceDetailsFormGroup.get('pause')">
+      <input  #pause id="pause" [formControlName]="'pause'" [(ngModel)]="serviceInstance.pause" type="checkbox" name="pause" data-toggle="toggle">
+      <label class="checkbox-label" for="pause">Pause on pause points:</label>
+    </div>
+
+
+    <dynamic-inputs *ngIf="dynamicInputs != undefined && dynamicInputs.length>0" [group]="serviceInstanceDetailsFormGroup" [list]="dynamicInputs"></dynamic-inputs>
+  </form>
+</div>
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.scss
new file mode 100644 (file)
index 0000000..928343d
--- /dev/null
@@ -0,0 +1,64 @@
+#service-instance-details {
+  position: relative;
+
+  #notification-area {
+    color: #959595;
+    font-size: 12px;
+    position: absolute;
+    top: 3px;
+    left: 30px;
+  }
+
+  height: 100%;
+  overflow: auto;
+  padding: 30px;
+
+  /deep/ {
+    .form-control {
+      border-radius: 2px;
+      box-shadow: none;
+      border-color: #D2D2D2;
+    }
+
+    label {
+      font-family: OpenSans-Semibold;
+      font-size: 12px;
+    }
+
+    select {
+      @extend .form-control;
+      -webkit-appearance: none;
+      -moz-appearance: none;
+      appearance: none;
+      background: url('../../../../assets/img/chevron.svg') 0 0 no-repeat;
+      background-size: 24px;
+      background-position-x: right;
+      background-position-y: center;
+      font-family: OpenSans-Italic;
+      font-size: 14px;
+      color: #959595;
+      height: 38px;
+    }
+
+    input:not([type='checkbox']) {
+      @extend .form-control;
+      height: 38px;
+    }
+
+    .form-control[disabled], fieldset[disabled] .form-control {
+      opacity: 0.5;
+    }
+    .input-text {
+      border: 1px solid #D2D2D2;
+      border-radius: 2px;
+    }
+
+    .details-item {
+      margin-bottom: 20px;
+    }
+  }
+
+    .checkbox-label {
+      font-family: OpenSans-Regular;
+    }
+}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.spec.ts
new file mode 100644 (file)
index 0000000..605653b
--- /dev/null
@@ -0,0 +1,26 @@
+import { getTestBed, TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { ServiceInstanceDetailsService } from './service-instance-details.service';
+import { NgRedux } from '@angular-redux/store';
+
+export class MockAppStore<T> {}
+
+describe('Service instance details service', () => {
+  let injector;
+  let service: ServiceInstanceDetailsService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [ServiceInstanceDetailsService,
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+
+    injector = getTestBed();
+    service = injector.get(ServiceInstanceDetailsService);
+    httpMock = injector.get(HttpTestingController);
+  });
+});
+
+
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/service-instance-details.service.ts
new file mode 100644 (file)
index 0000000..99b390d
--- /dev/null
@@ -0,0 +1,22 @@
+import { Injectable } from '@angular/core';
+import { isNullOrUndefined } from 'util';
+import { FormGroup } from '@angular/forms';
+import * as _ from 'lodash';
+import { createVFModuleInstance, updateVFModuleInstance, updateVNFInstance } from '../../../service.actions';
+import { NgRedux } from '@angular-redux/store';
+import { AppState } from '../../../store/reducers';
+
+@Injectable()
+export class ServiceInstanceDetailsService {
+  static controlsFieldsStatus = {};
+
+  constructor(private store: NgRedux<AppState>) { }
+  hasApiError(controlName: string, data: Array<any>, serviceInstanceDetailsFormGroup: FormGroup) {
+    if (!isNullOrUndefined(data)) {
+      if (!serviceInstanceDetailsFormGroup.controls[controlName].disabled && data.length === 0) {
+          return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts b/vid-webpack-master/src/app/components/service-popup/service-instance-details/servicePopupDataModel.ts
new file mode 100644 (file)
index 0000000..c7894e2
--- /dev/null
@@ -0,0 +1,32 @@
+import {SelectOption, SelectOptionInterface} from "../../../shared/models/selectOption";
+
+export class ServicePopupDataModel {
+  subscribers: SelectOptionInterface[];
+  serviceTypes: SelectOptionInterface[];
+  aicZones: SelectOptionInterface[];
+  lcpRegions: SelectOptionInterface[];
+  productFamilies: SelectOptionInterface[];
+  lcpRegionsTenantsMap: object;
+  tenants: SelectOptionInterface[];
+  projects: SelectOptionInterface[];
+  owningEntities: SelectOptionInterface[];
+  globalCustomerId: string;
+  rollbackOnFailure: SelectOptionInterface[];
+
+
+  constructor(){
+    this.subscribers = null;
+    this.serviceTypes = null;
+    this.aicZones = null;
+    this.lcpRegions = null;
+    this.lcpRegionsTenantsMap = {};
+    this.tenants = null;
+    this.productFamilies = null;
+    this.projects = null;
+    this.owningEntities = null;
+    this.rollbackOnFailure = [
+      new SelectOption({id: 'true', name: 'Rollback'}),
+      new SelectOption({id: 'false', name: 'Don\'t Rollback'})
+    ];
+  }
+}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.component.ts
new file mode 100644 (file)
index 0000000..908ae4a
--- /dev/null
@@ -0,0 +1,144 @@
+import {Component, ViewChild} from '@angular/core';
+import {DialogComponent, DialogService} from 'ng2-bootstrap-modal';
+import {ServiceModel} from '../../shared/models/serviceModel';
+import {Constants} from '../../shared/utils/constants';
+import {ServiceInstanceDetailsComponent} from './service-instance-details/service-instance-details.component';
+import {ActivatedRoute} from "@angular/router";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {Utils} from "../../utils/utils";
+import {ServicePlanningService} from "../../services/service-planning.service";
+import * as _ from 'lodash';
+import {ModelInformationItem} from '../../shared/components/model-information/model-information.component';
+import {deleteServiceInstance} from '../../service.actions';
+
+import {InstancePopup} from "../instance-popup/instance-popup.components";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {ServicePopupService} from './service-popup.service';
+import {IframeService} from "../../shared/utils/iframe.service";
+
+export interface ServicePopupModel {
+  serviceModel: ServiceModel
+}
+
+@Component({
+  selector: 'service-popup',
+  templateUrl: 'service-popup.html',
+  styleUrls: ['service-popup.scss'],
+  providers: [AaiService, ServicePopupService]
+})
+
+export class ServicePopupComponent extends DialogComponent<ServicePopupModel, boolean>
+                                    implements ServicePopupModel, InstancePopup{
+  @ViewChild(ServiceInstanceDetailsComponent) serviceInstanceDetails: ServiceInstanceDetailsComponent;
+
+  serviceModel: ServiceModel;
+  serviceModelId: string;
+  serviceInstance: any = {
+    'rollbackOnFailure' : 'false'
+  };
+  title: string = Constants.ServicePopup.TITLE;
+  dynamicInputs: any[] = null;
+
+  maxServiceQty:number = 50;
+  minServiceQty:number = 1;
+  servicesQty = 1; //default
+  quantityOptions = this.getQuantityOptions();
+
+  modelInformationItems: Array<ModelInformationItem> = [];
+  hasGeneralApiError : boolean = false;
+  parentElementClassName = 'content';
+
+  constructor(dialogService: DialogService, private route: ActivatedRoute, private _aaiService: AaiService,
+              private _iframeService : IframeService,
+              private _servicePlanningService: ServicePlanningService, private store: NgRedux<AppState>, private _servicePopupService : ServicePopupService) {
+    super(dialogService);
+    this.title = Constants.ServicePopup.TITLE;
+  }
+
+  updateGeneralErrorSection() : void {
+    this.hasGeneralApiError = this._servicePopupService.onControlError(this.serviceInstanceDetails, this.serviceInstanceDetails.serviceInstanceDetailsFormGroup);
+  }
+
+
+  ngOnInit() {
+    this.route
+      .queryParams
+      .subscribe(params => {
+        this.serviceModelId = params['serviceModelId'];
+        if(params['isCreate']=="true") {
+          this.store.dispatch(deleteServiceInstance(this.serviceModelId));
+        }
+        this.updateServiceModelById(this.serviceModelId);
+        this.updateInstanceFromStore();
+      });
+  }
+
+  updateInstanceFromStore() {
+    let serviceInstance;
+    if (_.has(this.store.getState().service.serviceInstance, this.serviceModelId)) {
+      serviceInstance = Object.assign({}, this.store.getState().service.serviceInstance[this.serviceModelId]);
+    }
+
+    this.serviceInstance = serviceInstance ? serviceInstance : this.serviceInstance;
+    this.servicesQty = serviceInstance ? serviceInstance.bulkSize : 1;
+    if (serviceInstance && serviceInstance.instanceParams && serviceInstance.instanceParams[0]) {
+      this.dynamicInputs = this.dynamicInputs.map(function (x) {
+        x.value = (serviceInstance.instanceParams[0][x.id]) ? serviceInstance.instanceParams[0][x.id] : x.value;
+        return x;
+      });
+    }
+  }
+
+  updateServiceModelById(serviceModelId) {
+    this._aaiService.getServiceModelById(serviceModelId).subscribe(
+      value => {
+        const convertedModel = Utils.convertModel(value);
+        this.serviceModel = new ServiceModel(convertedModel);
+        let displayInputs = Object.assign({},convertedModel.service.inputs);
+        this.dynamicInputs = _.isEmpty(displayInputs)? [] : this._servicePlanningService.getArbitraryInputs(displayInputs);
+        this.modelInformationItems = this.createModelInformationItems();
+      },
+      error => {console.log('error is ', error)},
+      () => {console.log('completed')}
+    );
+  }
+
+  createModelInformationItems() : Array<ModelInformationItem> {
+     return [
+      new ModelInformationItem("Model version", "modelVersion", [this.serviceModel.version], "", true),
+      new ModelInformationItem("Description", "description", [this.serviceModel.description]),
+      new ModelInformationItem("Category", "category", [this.serviceModel.category]),
+      new ModelInformationItem("UUID", "uuid", [this.serviceModel.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
+      new ModelInformationItem("Invariant UUID", "invariantUuid", [this.serviceModel.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
+      new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
+      new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole])
+    ];
+  }
+
+  onCancelClick() {
+    this._iframeService.removeClassCloseModal(this.parentElementClassName);
+    this.dialogService.removeDialog(this);
+    this.serviceInstance = this.serviceInstanceDetails.oldServiceInstance;
+
+    this._servicePopupService.resetDynamicInputs(this.serviceInstanceDetails, this.dynamicInputs);
+    // Delaying the iframe close in few milliseconds.
+    // This should workaround a problem in Selenium tests' that
+    // blocks after click because the iframe goes out before
+    // the driver understands it was clicked. Similar bug is
+    // described here:
+    //  - https://github.com/mozilla/geckodriver/issues/611
+    //  - https://bugzilla.mozilla.org/show_bug.cgi?id=1223277
+    setTimeout(() => {
+      window.parent.postMessage("closeIframe", "*");
+    }, 15);
+  }
+
+  getModelName(): string {
+    return (this.serviceModel && this.serviceModel.name) || "";
+  }
+
+  getQuantityOptions(){
+    return _.range(this.minServiceQty, this.maxServiceQty + 1);
+  }
+}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.html b/vid-webpack-master/src/app/components/service-popup/service-popup.html
new file mode 100644 (file)
index 0000000..e967daa
--- /dev/null
@@ -0,0 +1,52 @@
+<div id="service-popup" class="modal-dialog">
+  <div class="modal-content">
+    <div class="modal-header">
+      <button type="button" class="close" (click)="onCancelClick()" >&times;</button>
+      <span [attr.data-tests-id]="'create-modal-title'" class="modal-title">{{title}}</span>
+    </div>
+    <div class="modal-body popup-content">
+
+      <div class="header-left">
+        <div>SERVICE MODEL: <span>"{{getModelName()}}"</span></div>
+      </div>
+
+      <div class="header-right">
+        Service Instance Details
+      </div>
+
+      <label class="quantity-label">Qty:</label>
+      <div class="quantity">
+        <select class="quantity-select" [(ngModel)]="servicesQty" name="quantity" id="quantity-select" required>
+          <option *ngFor="let qty of quantityOptions" [value]="qty">{{qty}}</option>
+        </select>
+      </div>
+
+      <div class="service-model">
+
+        <model-information [modelInformationItems]="modelInformationItems"></model-information>
+      </div>
+
+      <div class="service-instance">
+        <service-instance-details [dynamicInputs]="dynamicInputs"
+                                  [serviceInstance]="serviceInstance"
+                                  [serviceModel]="serviceModel"
+                                  [servicesQty]="servicesQty"
+                                  (onDataChanged)="updateGeneralErrorSection()"
+                                  (closePopup)="onCancelClick($event)"></service-instance-details>
+      </div>
+
+    </div>
+    <div class="modal-footer row" style="padding: 0">
+      <div class="col-md-6">
+        <div *ngIf="hasGeneralApiError == true">
+          <form-general-error [message]="'Page contains errors. Please see details next to the relevant fields.'"></form-general-error>
+        </div>
+      </div>
+      <div class="col-md-6" style="padding: 15px;padding-right: 35px;">
+        <button [attr.data-tests-id]="'cancelButton'"  type="button" class="btn btn-default cancel" (click)="onCancelClick()"><span>Cancel</span></button>
+        <input type="submit" value="Set" form="serviceForm"  data-tests-id="service-form-set"
+               class="btn btn-success submit" [disabled]="!serviceInstanceDetails?.serviceForm?.valid">
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.scss b/vid-webpack-master/src/app/components/service-popup/service-popup.scss
new file mode 100644 (file)
index 0000000..aa4552d
--- /dev/null
@@ -0,0 +1,185 @@
+$grid-border: 1px #d2d2d2 solid;
+
+#service-popup {
+  color: #191919;
+
+  .left-panel {
+    background: #f2f2f2;
+    border-right: $grid-border;
+  }
+
+  .header-common {
+    height: 100%;
+    align-items: center;
+    display: flex;
+    font-family: OpenSans-Semibold;
+    font-size: 12px;
+  }
+
+  .header-text {
+    padding-left: 30px;
+    @extend .header-common;
+  }
+
+  .header-left {
+    grid-area: header-left;
+    @extend .header-text;
+    @extend .left-panel;
+    border-bottom: $grid-border;
+
+    span {
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+    };
+  }
+
+  .header-right {
+    grid-area: header-right;
+
+    @extend .header-text;
+    border-bottom: $grid-border;
+  }
+
+  .quantity-label {
+    grid-area: quantity-label;
+    @extend .header-common;
+    border-bottom: $grid-border;
+    height: 100%;
+    font-family: OpenSans-Regular;
+  }
+
+  .quantity {
+    grid-area: quantity;
+    border-left: $grid-border;
+    border-bottom: $grid-border;
+    border-top-style: none;
+    font-family: OpenSans-Semibold;
+    text-align: start;
+    text-indent: 10px;
+  }
+
+  .quantity-select {
+    width: 78px;
+    height: 100%;
+    border: 0;
+    background: white;
+    outline: none;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+    background: url('../../../assets/img/chevron.svg') 0 0 no-repeat;
+    background-size: 24px;
+    background-position-x: right;
+    background-position-y: center;
+  }
+  input[type="number"]:hover::-webkit-inner-spin-button {
+    height: 20px;
+  }
+
+  .service-model {
+    grid-area: service-model;
+
+    padding: 30px;
+    overflow: auto;
+    @extend .left-panel;
+  }
+
+  .service-instance {
+    grid-area: service-instance;
+  }
+
+  .popup-content {
+    display: grid;
+    grid-template-columns: 400px auto 30px 93px;
+    grid-template-rows: 50px calc(100vh - 180px);
+    grid-template-areas:
+      "header-left header-right quantity-label quantity"
+      "service-model service-instance service-instance service-instance";
+    padding: 0;
+  }
+}
+
+.modal {
+  background-color: #191919;
+  opacity: 0.8;
+}
+
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 0;
+}
+@media (min-width: 1150px) {
+  .popup-content {
+    grid-template-rows: 30px 680px;
+  }
+}
+
+.modal-content {
+  border-radius: 0;
+  box-shadow: none;
+  border: none;
+}
+
+.modal-footer {
+  .cancel {
+    width: 120px;
+    height: 36px;
+    background: #ffffff;
+    border: 1px solid  #009fdb;
+    border-radius: 2px;
+    span {
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+      color: #009fdb;
+      line-height: 16px;
+    }
+  }
+
+  .submit {
+    width: 120px;
+    height: 36px;
+    background: #009fdb;
+    border-radius: 2px;
+    border-color: #009fdb;
+    span {
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+      color: #FFFFFF;
+      line-height: 16px;
+    }
+  }
+}
+
+.modal-header {
+  background-color: #009fdb;
+
+  padding-bottom: 13px;
+  padding-top: 13px;
+  padding-left: 29px;
+  padding-right: 21px;
+
+  .close {
+    font-size: 32px;
+    font-weight: 200;
+    color: #d8d8d8;
+    text-shadow: none;
+    filter: none;
+    opacity: 1;
+  }
+
+  .modal-title {
+    font-family: OpenSans-Regular;
+    font-size: 24px;
+    color: #fff;
+    line-height: 34px;
+  }
+}
+//
+//@media (min-width: 1200px) {
+//  .service-model,
+//  .service-instance {
+//    width: 1050px;
+//    margin: 30px auto;
+//  }
+//}
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.service.spec.ts
new file mode 100644 (file)
index 0000000..cddc640
--- /dev/null
@@ -0,0 +1,138 @@
+
+import { TestBed, getTestBed} from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+  HttpTestingController
+} from '@angular/common/http/testing';
+import { ServicePopupService } from './service-popup.service';
+import { FormControl, FormGroup, Validators } from '@angular/forms';
+import { NumbersLettersUnderscoreValidator } from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+
+describe('Service Popup Service', () => {
+  let injector;
+  let service: ServicePopupService;
+  let httpMock: HttpTestingController;
+  let form : FormGroup;
+  let servicePopupDataModel;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [ServicePopupService]
+    });
+
+    injector = getTestBed();
+    service = injector.get(ServicePopupService);
+    httpMock = injector.get(HttpTestingController);
+
+    form  = generateFormGroup();
+    servicePopupDataModel =  generateServicePopupDataModel();
+  });
+
+  describe('#resetDynamicInputs', () => {
+    it('resetDynamicInputs should reset dymanic fields',(done: DoneFn) => {
+      const dynamicInputs = generateDynamicInputs();
+      let serviceForm = generateFormGroup();
+      serviceForm.addControl(dynamicInputs[0].name, new FormControl({value: dynamicInputs[0].value, disabled: false}));
+
+      serviceForm.controls[dynamicInputs[0].name].setValue("diffValue");
+      service.resetDynamicInputs({
+        serviceInstanceDetailsFormGroup : serviceForm,
+        dynamicInputs : dynamicInputs
+      }, dynamicInputs);
+
+      expect(serviceForm.controls[dynamicInputs[0].name].value).toEqual(dynamicInputs[0].value);
+      done();
+    })
+  });
+
+  describe('#onControlError', () => {
+
+    it('should return true if instanceName is illegal', (done: DoneFn) => {
+      form.controls['instanceName'].setValue("illegal - illegal");
+
+      let result : boolean = service.onControlError(<any>servicePopupDataModel, form);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('should return false if instanceName is legal', (done: DoneFn) => {
+
+      form.controls['instanceName'].setValue("legal");
+      let result  = service.onControlError(<any>servicePopupDataModel, form);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('should return false if lcpRegions is empty and is disabled', (done: DoneFn) => {
+      servicePopupDataModel.servicePopupDataModel['lcpRegions'] = [];
+      let result  = service.onControlError(<any>servicePopupDataModel, form);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('should return true if lcpRegions is empty', (done: DoneFn) => {
+      servicePopupDataModel.servicePopupDataModel['lcpRegions'] = [];
+      form.controls['lcpCloudRegionId'].enable();
+      let result  = service.onControlError(<any>servicePopupDataModel, form);
+      expect(result).toBeTruthy();
+      done()
+    });
+  });
+
+
+  function generateDynamicInputs(){
+    return JSON.parse('[{"id":"2017488_adiodvpe0_ASN","type":"string","name":"2017488_adiodvpe0_ASN","value":"AV_vPE","isRequired":true,"description":"AV/PE"}]');
+  }
+
+
+  function generateServicePopupDataModel() {
+    return {
+      "servicePopupDataModel" : JSON.parse('{"subscribers":[{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb","name":"Mobility","isPermitted":false},{"id":"a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fc","name":"PACKET CORE","isPermitted":false},{"id":"e433710f-9217-458d-a79d-1c7aff376d89","name":"USP VOICE","isPermitted":true}],"serviceTypes":[{"id":"0","name":"vFlowLogic","isPermitted":false},{"id":"1","name":"VIRTUAL USP","isPermitted":true},{"id":"2","name":"Mobility","isPermitted":false},{"id":"3","name":"vBNG","isPermitted":false},{"id":"4","name":"vVoiceMail","isPermitted":false},{"id":"5","name":"Nimbus","isPermitted":false},{"id":"6","name":"vSEGW","isPermitted":false},{"id":"7","name":"vVM","isPermitted":false},{"id":"8","name":"vOTA","isPermitted":false},{"id":"9","name":"vMME","isPermitted":false},{"id":"10","name":"vMNS","isPermitted":false},{"id":"11","name":"vSCP","isPermitted":false},{"id":"12","name":"VPMS","isPermitted":false},{"id":"13","name":"vMMSC","isPermitted":false},{"id":"14","name":"SSD","isPermitted":false},{"id":"15","name":"vMOG","isPermitted":false},{"id":"16","name":"FIRSTNET","isPermitted":false},{"id":"17","name":"ACTIVE_CHARGE","isPermitted":false},{"id":"18","name":"vHSS","isPermitted":false}],"aicZones":[{"id":"NFT1","name":"NFTJSSSS-NFT1"},{"id":"JAG1","name":"YUDFJULP-JAG1"},{"id":"YYY1","name":"UUUAIAAI-YYY1"},{"id":"BAN1","name":"VSDKYUTP-BAN1"},{"id":"DKJ1","name":"DKJSJDKA-DKJ1"},{"id":"MCS1","name":"ASACMAMS-MCS1"},{"id":"UIO1","name":"uioclli1-UIO1"},{"id":"RAJ1","name":"YGBIJNLQ-RAJ1"},{"id":"OPA1","name":"opaclli1-OPA1"},{"id":"SDE1","name":"ZXCVBNMA-SDE1"},{"id":"VEN2","name":"FGHJUHIL-VEN2"},{"id":"ORL1","name":"ORLDFLMA-ORL1"},{"id":"JAD1","name":"JADECLLI-JAD1"},{"id":"ZXL1","name":"LWLWCANN-ZXL1"},{"id":"CKL1","name":"CLKSKCKK-CKL1"},{"id":"SDF1","name":"sdfclli1-SDF1"},{"id":"RAD1","name":"RADICAL1-RAD1"},{"id":"KIT1","name":"BHYJFGLN-KIT1"},{"id":"REL1","name":"INGERFGT-REL1"},{"id":"JNL1","name":"CJALSDAC-JNL1"},{"id":"OLK1","name":"OLKOLKLS-OLK1"},{"id":"CHI1","name":"CHILLIWE-CHI1"},{"id":"UUU4","name":"UUUAAAUU-UUU4"},{"id":"TUF1","name":"TUFCLLI1-TUF1"},{"id":"KJN1","name":"CKALDKSA-KJN1"},{"id":"SAM1","name":"SNDGCA64-SAN1"},{"id":"SCK1","name":"SCKSCKSK-SCK1"},{"id":"HJH1","name":"AOEEQQQD-HJH1"},{"id":"HGD1","name":"SDFQWHGD-HGD1"},{"id":"KOR1","name":"HYFLNBVT-KOR1"},{"id":"ATL43","name":"AICLOCID-ATL43"},{"id":"ATL54","name":"AICFTAAI-ATL54"},{"id":"ATL66","name":"CLLIAAII-ATL66"},{"id":"VEL1","name":"BNMLKUIK-VEL1"},{"id":"ICC1","name":"SANJITAT-ICC1"},{"id":"MNT11","name":"WSXEFBTH-MNT11"},{"id":"DEF2","name":"WSBHGTYL-DEF2"},{"id":"MAD11","name":"SDFQWGKL-MAD11"},{"id":"OLG1","name":"OLHOLHOL-OLG1"},{"id":"GAR1","name":"NGFVSJKO-GAR1"},{"id":"SAN22","name":"GNVLSCTL-SAN22"},{"id":"HRG1","name":"HRGHRGGS-HRG1"},{"id":"JCS1","name":"JCSJSCJS-JCS1"},{"id":"DHA12","name":"WSXEDECF-DHA12"},{"id":"HJE1","name":"AOEEWWWD-HJE1"},{"id":"NCA1","name":"NCANCANN-NCA1"},{"id":"IOP1","name":"iopclli1-IOP1"},{"id":"RTY1","name":"rtyclli1-RTY1"},{"id":"KAP1","name":"HIOUYTRQ-KAP1"},{"id":"ZEN1","name":"ZENCLLI1-ZEN1"},{"id":"HKA1","name":"JAKHLASS-HKA1"},{"id":"CQK1","name":"CQKSCAKK-CQK1"},{"id":"SAI1","name":"UBEKQLPD-SAI1"},{"id":"ERT1","name":"ertclli1-ERT1"},{"id":"IBB1","name":"PLMKOIJU-IBB1"},{"id":"TIR2","name":"PLKINHYI-TIR2"},{"id":"HSD1","name":"CHASKCDS-HSD1"},{"id":"SLF78","name":"SDCTLFN1-SLF78"},{"id":"SEE78","name":"SDCTEEE4-SEE78"},{"id":"SAN13","name":"TOKYJPFA-SAN13"},{"id":"SAA78","name":"SDCTAAA1-SAA78"},{"id":"LUC1","name":"ATLDFGYC-LUC1"},{"id":"AMD13","name":"MEMATLAN-AMD13"},{"id":"TOR1","name":"TOROONXN-TOR1"},{"id":"QWE1","name":"QWECLLI1-QWE1"},{"id":"ZOG1","name":"ZOGASTRO-ZOG1"},{"id":"CAL33","name":"CALIFORN-CAL33"},{"id":"SHH78","name":"SDIT1HHH-SHH78"},{"id":"DSA1","name":"LKJHGFDS-DSA1"},{"id":"CLG1","name":"CLGRABAD-CLG1"},{"id":"BNA1","name":"BNARAGBK-BNA1"},{"id":"ATL84","name":"CANTTCOC-ATL84"},{"id":"APP1","name":"WBHGTYUI-APP1"},{"id":"RJN1","name":"RJNRBZAW-RJN1"},{"id":"EHH78","name":"SDCSHHH5-EHH78"},{"id":"mac10","name":"PKGTESTF-mac10"},{"id":"SXB78","name":"SDCTGXB1-SXB78"},{"id":"SAX78","name":"SDCTAXG1-SAX78"},{"id":"SYD1","name":"SYDNAUBV-SYD1"},{"id":"TOK1","name":"TOKYJPFA-TOK1"},{"id":"KGM2","name":"KGMTNC20-KGM2"},{"id":"DCC1b","name":"POIUYTGH-DCC1b"},{"id":"SKK78","name":"SDCTKKK1-SKK78"},{"id":"SGG78","name":"SDCTGGG1-SGG78"},{"id":"SJJ78","name":"SDCTJJJ1-SJJ78"},{"id":"SBX78","name":"SDCTBXG1-SBX78"},{"id":"LAG1","name":"LARGIZON-LAG1"},{"id":"IAA1","name":"QAZXSWED-IAA1"},{"id":"POI1","name":"PLMNJKIU-POI1"},{"id":"LAG1a","name":"LARGIZON-LAG1a"},{"id":"PBL1","name":"PBLAPBAI-PBL1"},{"id":"LAG45","name":"LARGIZON-LAG1a"},{"id":"MAR1","name":"MNBVCXZM-MAR1"},{"id":"HST70","name":"HSTNTX70-HST70"},{"id":"DCC1a","name":"POIUYTGH-DCC1a"},{"id":"TOL1","name":"TOLDOH21-TOL1"},{"id":"LON1","name":"LONEENCO-LON1"},{"id":"SJU78","name":"SDIT1JUB-SJU78"},{"id":"STN27","name":"HSTNTX01-STN27"},{"id":"SSW56","name":"ss8126GT-SSW56"},{"id":"SBB78","name":"SDIT1BBB-SBB78"},{"id":"DCC3","name":"POIUYTGH-DCC3"},{"id":"GNV1","name":"GNVLSCTL-GNV1"},{"id":"WAS1","name":"WASHDCSW-WAS1"},{"id":"TOY1","name":"TORYONNZ-TOY1"},{"id":"STT1","name":"STTLWA02-STT1"},{"id":"STG1","name":"STTGGE62-STG1"},{"id":"SLL78","name":"SDCTLLL1-SLL78"},{"id":"SBU78","name":"SDIT1BUB-SBU78"},{"id":"ATL2","name":"ATLNGANW-ATL2"},{"id":"BOT1","name":"BOTHWAKY-BOT1"},{"id":"SNG1","name":"SNGPSIAU-SNG1"},{"id":"NYC1","name":"NYCMNY54-NYC1"},{"id":"LAG1b","name":"LARGIZON-LAG1b"},{"id":"AMD15","name":"AMDFAA01-AMD15"},{"id":"SNA1","name":"SNANTXCA-SNA1"},{"id":"PLT1","name":"PLTNCA60-PLT1"},{"id":"TLP1","name":"TLPNXM18-TLP1"},{"id":"SDD81","name":"SAIT1DD6-SDD81"},{"id":"DCC1","name":"POIUYTGH-DCC1"},{"id":"DCC2","name":"POIUYTGH-DCC2"},{"id":"OKC1","name":"OKCBOK55-OKC1"},{"id":"PAR1","name":"PARSFRCG-PAR1"},{"id":"TES36","name":"ABCEETES-TES36"},{"id":"COM1","name":"PLMKOPIU-COM1"},{"id":"ANI1","name":"ATLNGTRE-ANI1"},{"id":"SDG78","name":"SDIT1BDG-SDG78"},{"id":"mac20","name":"PKGTESTF-mac20"},{"id":"DSF45","name":"DSFBG123-DSF45"},{"id":"HST25","name":"HSTNTX01-HST25"},{"id":"AMD18","name":"AUDIMA01-AMD18"},{"id":"SAA80","name":"SAIT9AA3-SAA80"},{"id":"SSA56","name":"SSIT2AA7-SSA56"},{"id":"SDD82","name":"SAIT1DD9-SDD82"},{"id":"JCV1","name":"JCVLFLBW-JCV1"},{"id":"SUL2","name":"WERTYUJK-SUL2"},{"id":"PUR1","name":"purelyde-PUR1"},{"id":"FDE55","name":"FDERT555-FDE55"},{"id":"SITE","name":"LONEENCO-SITE"},{"id":"ATL1","name":"ATLNGAMA-ATL1"},{"id":"JUL1","name":"ZXCVBNMM-JUL1"},{"id":"TAT34","name":"TESAAISB-TAT34"},{"id":"XCP12","name":"CHKGH123-XCP12"},{"id":"RAI1","name":"poiuytre-RAI1"},{"id":"HPO1","name":"ATLNGAUP-HPO1"},{"id":"KJF12","name":"KJFDH123-KJF12"},{"id":"SCC80","name":"SAIT9CC3-SCC80"},{"id":"SAA12","name":"SAIT9AF8-SAA12"},{"id":"SAA14","name":"SAIT1AA9-SAA14"},{"id":"ATL35","name":"TTESSAAI-ATL35"},{"id":"CWY1","name":"CWYMOWBS-CWY1"},{"id":"ATL76","name":"TELEPAAI-ATL76"},{"id":"DSL12","name":"DSLFK242-DSL12"},{"id":"ATL53","name":"AAIATLTE-ATL53"},{"id":"SAA11","name":"SAIT9AA2-SAA11"},{"id":"ATL62","name":"TESSASCH-ATL62"},{"id":"AUG1","name":"ASDFGHJK-AUG1"},{"id":"POI22","name":"POIUY123-POI22"},{"id":"SAA13","name":"SAIT1AA9-SAA13"},{"id":"BHY17","name":"BHYTFRF3-BHY17"},{"id":"LIS1","name":"HOSTPROF-LIS1"},{"id":"SIP1","name":"ZXCVBNMK-SIP1"},{"id":"ATL99","name":"TEESTAAI-ATL43"},{"id":"ATL64","name":"FORLOAAJ-ATL64"},{"id":"TAT33","name":"TESAAISA-TAT33"},{"id":"RAD10","name":"INDIPUNE-RAD10"},{"id":"RTW5","name":"BHYTFRY4-RTW5"},{"id":"JGS1","name":"KSJKKKKK-JGS1"},{"id":"ATL98","name":"TEESTAAI-ATL43"},{"id":"WAN1","name":"LEIWANGW-WAN1"},{"id":"ATL44","name":"ATLSANAB-ATL44"},{"id":"RTD2","name":"BHYTFRk4-RTD2"},{"id":"NIR1","name":"ORFLMANA-NIR1"},{"id":"ATL75","name":"SANAAIRE-ATL75"},{"id":"NUM1","name":"QWERTYUI-NUM1"},{"id":"MTN32","name":"MDTWNJ21-MTN32"},{"id":"RTZ4","name":"BHYTFRZ6-RTZ4"},{"id":"ATL56","name":"ATLSANAC-ATL56"},{"id":"AMS1","name":"AMSTNLBW-AMS1"},{"id":"RCT1","name":"AMSTERNL-RCT1"},{"id":"JAN1","name":"ORFLMATT-JAN1"},{"id":"ABC14","name":"TESAAISA-ABC14"},{"id":"TAT37","name":"TESAAISD-TAT37"},{"id":"MIC54","name":"MICHIGAN-MIC54"},{"id":"ABC11","name":"ATLSANAI-ABC11"},{"id":"AMF11","name":"AMDOCS01-AMF11"},{"id":"ATL63","name":"ATLSANEW-ATL63"},{"id":"ABC12","name":"ATLSECIA-ABC12"},{"id":"MTN20","name":"MDTWNJ21-MTN20"},{"id":"ABC15","name":"AAITESAN-ABC15"},{"id":"AVT1","name":"AVTRFLHD-AVT1"},{"id":"ATL34","name":"ATLSANAI-ATL34"}],"lcpRegions":[{"id":"AAIAIC25","name":"AAIAIC25","isPermitted":true},{"id":"mtn6","name":"mtn6","isPermitted":true}],"lcpRegionsTenantsMap":{},"tenants":[{"id":"bae71557c5bb4d5aac6743a4e5f1d054","name":"AIN Web Tool-15-D-testgamma","isPermitted":true},{"id":"229bcdc6eaeb4ca59d55221141d01f8e","name":"AIN Web Tool-15-D-STTest2","isPermitted":true},{"id":"1178612d2b394be4834ad77f567c0af2","name":"AIN Web Tool-15-D-SSPtestcustome","isPermitted":true},{"id":"19c5ade915eb461e8af52fb2fd8cd1f2","name":"AIN Web Tool-15-D-UncheckedEcopm","isPermitted":true},{"id":"de007636e25249238447264a988a927b","name":"AIN Web Tool-15-D-dfsdf","isPermitted":true},{"id":"62f29b3613634ca6a3065cbe0e020c44","name":"AIN/SMS-16-D-Multiservices1","isPermitted":true},{"id":"649289e30d3244e0b48098114d63c2aa","name":"AIN Web Tool-15-D-SSPST66","isPermitted":true},{"id":"3f21eeea6c2c486bba31dab816c05a32","name":"AIN Web Tool-15-D-ASSPST47","isPermitted":true},{"id":"f60ce21d3ee6427586cff0d22b03b773","name":"CESAR-100-D-sspjg67246","isPermitted":true},{"id":"8774659e425f479895ae091bb5d46560","name":"CESAR-100-D-sspjg68359","isPermitted":true},{"id":"624eb554b0d147c19ff8885341760481","name":"AINWebTool-15-D-iftach","isPermitted":true},{"id":"214f55f5fc414c678059c383b03e4962","name":"CESAR-100-D-sspjg612401","isPermitted":true},{"id":"c90666c291664841bb98e4d981ff1db5","name":"CESAR-100-D-sspjg621340","isPermitted":true},{"id":"ce5b6bc5c7b348e1bf4b91ac9a174278","name":"sspjg621351cloned","isPermitted":true},{"id":"b386b768a3f24c8e953abbe0b3488c02","name":"AINWebTool-15-D-eteancomp","isPermitted":true},{"id":"dc6c4dbfd225474e9deaadd34968646c","name":"AINWebTool-15-T-SPFET","isPermitted":true},{"id":"02cb5030e9914aa4be120bd9ed1e19eb","name":"AINWebTool-15-X-eeweww","isPermitted":true},{"id":"f2f3830e4c984d45bcd00e1a04158a79","name":"CESAR-100-D-spjg61909","isPermitted":true},{"id":"05b91bd5137f4929878edd965755c06d","name":"CESAR-100-D-sspjg621512cloned","isPermitted":true},{"id":"7002fbe8482d4a989ddf445b1ce336e0","name":"AINWebTool-15-X-vdr","isPermitted":true},{"id":"4008522be43741dcb1f5422022a2aa0b","name":"AINWebTool-15-D-ssasa","isPermitted":true},{"id":"f44e2e96a1b6476abfda2fa407b00169","name":"AINWebTool-15-D-PFNPT","isPermitted":true},{"id":"b69a52bec8a84669a37a1e8b72708be7","name":"AINWebTool-15-X-vdre","isPermitted":true},{"id":"fac7d9fd56154caeb9332202dcf2969f","name":"AINWebTool-15-X-NONPODECOMP","isPermitted":true},{"id":"2d34d8396e194eb49969fd61ffbff961","name":"DN5242-Nov16-T5","isPermitted":true},{"id":"cb42a77ff45b48a8b8deb83bb64acc74","name":"ro-T11","isPermitted":true},{"id":"fa45ca53c80b492fa8be5477cd84fc2b","name":"ro-T112","isPermitted":true},{"id":"4914ab0ab3a743e58f0eefdacc1dde77","name":"DN5242-Nov21-T1","isPermitted":true},{"id":"d0a3e3f2964542259d155a81c41aadc3","name":"test-mtn6-09","isPermitted":true},{"id":"cbb99fe4ada84631b7baf046b6fd2044","name":"DN5242-Nov16-T3","isPermitted":true}],"productFamilies":null,"projects":[{"id":"DFW","name":"DFW"},{"id":"x1","name":"x1"},{"id":"yyy1","name":"yyy1"}],"owningEntities":[{"id":"aaa1","name":"aaa1"},{"id":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","name":"MetroPacketCore"},{"id":"Wireline","name":"Wireline"}],"globalCustomerId":"e433710f-9217-458d-a79d-1c7aff376d89"}')}
+  }
+
+  function generateFormGroup(){
+    return new FormGroup({
+      globalSubscriberId: new FormControl(
+        Validators.compose([Validators.required])
+      ),
+      productFamilyId: new FormControl(),
+      subscriptionServiceType: new FormControl({value: null,  disabled: true}, Validators.compose([Validators.required])),
+      lcpCloudRegionId: new FormControl({value: null,  disabled: true}, Validators.compose([Validators.required])),
+      tenantId: new FormControl({value: null,  disabled: true}, Validators.compose([Validators.required])),
+      aicZoneId: new FormControl(),
+      projectName: new FormControl(),
+      owningEntityId: new FormControl(Validators.compose([Validators.required])),
+      instanceName : new FormControl({value: null}, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid]))
+    });
+  }
+
+
+  function generateServiceInstanceDetails(){
+    return {
+      servicePopupDataModel : {
+        "productFamilies" : []
+      },
+      serviceInstanceDetailsFormGroup : {
+        controls : {
+          productFamilyId : {
+            disabled : false
+          }
+        }
+      }
+    }
+  }
+
+  function generateLegalServiceInstance(){
+    return {
+      instanceName : "legalInstanceName"
+    }
+  }
+
+  function generateIllegalServiceInstance(){
+    return {
+      instanceName : "illegalInstanceName"
+    }
+  }
+
+});
diff --git a/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts b/vid-webpack-master/src/app/components/service-popup/service-popup.service.ts
new file mode 100644 (file)
index 0000000..f6efd35
--- /dev/null
@@ -0,0 +1,33 @@
+import {Injectable} from '@angular/core';
+import {isNullOrUndefined} from "util";
+import {NumbersLettersUnderscoreValidator} from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+import {ServiceInstanceDetailsComponent} from './service-instance-details/service-instance-details.component';
+import {FormGroup} from '@angular/forms';
+import * as _ from "lodash";
+
+@Injectable()
+export class ServicePopupService {
+  onControlError(serviceInstanceDetails : ServiceInstanceDetailsComponent, serviceInstanceDetailsFormGroup : FormGroup) : boolean{
+    if(!isNullOrUndefined(serviceInstanceDetailsFormGroup) && !isNullOrUndefined(serviceInstanceDetailsFormGroup.controls['instanceName']) && NumbersLettersUnderscoreValidator.valid(serviceInstanceDetailsFormGroup.controls['instanceName'].value) && serviceInstanceDetailsFormGroup.controls['instanceName'].value != null && serviceInstanceDetailsFormGroup.controls['instanceName'].value.length > 0){
+      return true;
+    }
+
+    const controlName : Array<string> =  ['productFamilyId', 'lcpCloudRegionId', 'tenantId', 'owningEntityId', 'projectName', 'aicZoneId', 'subscriptionServiceType', 'globalSubscriberId',  'rollbackOnFailure'];
+    const selectDataName : Array<string> = ['productFamilies', 'lcpRegions', 'tenants', 'owningEntities', 'projects', 'aicZones', 'serviceTypes', 'subscribers', 'rollbackOnFailure'];
+    for(let i = 0 ; i < controlName.length ; i++){
+      if (!isNullOrUndefined(serviceInstanceDetails.servicePopupDataModel) && !isNullOrUndefined(serviceInstanceDetails.servicePopupDataModel[selectDataName[i]])) {
+        if (!serviceInstanceDetailsFormGroup.controls[controlName[i]].disabled && serviceInstanceDetails.servicePopupDataModel[selectDataName[i]].length === 0) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  resetDynamicInputs(serviceInstance : any, defaultDynamicInputs : any) : void {
+    for(let dynamicInput of serviceInstance.dynamicInputs){
+      const defaultDymanicInput = _.find(defaultDynamicInputs, {name:dynamicInput.name});
+      serviceInstance.serviceInstanceDetailsFormGroup.controls[dynamicInput.name].setValue(defaultDymanicInput.value);
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.component.ts
new file mode 100644 (file)
index 0000000..725e442
--- /dev/null
@@ -0,0 +1,275 @@
+import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
+import {FormControl, FormGroup, Validators} from "@angular/forms";
+import {VNFPopupDataModel} from './vnfPopupDataModel';
+import {AaiService} from '../../../services/aaiService/aai.service';
+import { createVFModuleInstance, updateVFModuleInstance, updateVNFInstance } from '../../../service.actions';
+import {VnfInstance} from "../../../shared/models/vnfInstance";
+import {ServiceInstance} from "../../../shared/models/serviceInstance";
+import {VNFModel} from "../../../shared/models/vnfModel";
+import {InputType} from "../../../shared/models/inputTypes";
+import {ModelInfo} from "../../../shared/models/modelInfo";
+import {VfModuleInstance} from "../../../shared/models/vfModuleInstance";
+import {NgRedux, select} from "@angular-redux/store";
+import {AppState} from "../../../store/reducers";
+import {SelectOptionInterface} from "../../../shared/models/selectOption";
+import {Observable} from "rxjs/Observable";
+import {loadProductFamiliesAction} from "../../../services/aaiService/aai.actions";
+import {VnfInstanceDetailsService} from "./vnf-instance-details.service";
+import {isNullOrUndefined} from 'util';
+import {NumbersLettersUnderscoreValidator} from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+import * as _ from "lodash";
+import {ServiceNodeTypes} from "../../../shared/models/ServiceNodeTypes";
+
+@Component({
+  selector: 'vnf-instance-details',
+  templateUrl: 'vnf-instance-details.html',
+  styleUrls: ['vnf-instance-details.scss'],
+  providers: [AaiService]
+})
+
+export class VnfInstanceDetailsComponent implements OnInit {
+  @ViewChild('vnfForm') vnfForm: 'VnfForm';
+  _vnfModel: VNFModel;
+  @Input ()
+  set vnfModel(vnfModel: VNFModel) {
+    this._vnfModel = vnfModel;
+    this.updateFormGroupControlsFromVNFModel();
+  }
+  @Input() vnfInstance: any;
+  @Input() serviceInstance: ServiceInstance;
+  @Input() dynamicInputs;
+  @Input() modelName: string;
+  @Input() serviceUuid: string;
+  @Input() userProvidedNaming: boolean;
+  _modelType: string;
+  @Input()
+  set modelType(modelType: string) {
+    this._modelType = modelType;
+    this.updateFormGroupControlsFromVNFModel();
+  }
+
+  @Input() parentModelName: string;
+  @Input() isNewVfModule : boolean;
+
+
+  @Output() onSubmitClick: EventEmitter<any> = new EventEmitter<any>();
+  @Output() onServiceInstanceNameChanged :  EventEmitter<boolean> = new EventEmitter<boolean>();
+  @Output() onVolumeGroupNameChanged :  EventEmitter<boolean> = new EventEmitter<boolean>();
+
+@Output() onDataChanged: EventEmitter<any> = new EventEmitter<any>();
+  @select(['service','productFamilies'])
+  readonly productFamilies : Observable<SelectOptionInterface[]>;
+
+  vnfPopupDataModel: VNFPopupDataModel = new VNFPopupDataModel();
+  lcpRegionsThatEnableLegacyRegionField = ['AAIAIC25', 'rdm3', 'rdm5a'];
+  shouldShowLegacyRegion: boolean;
+  instanceFormGroup: FormGroup = null;
+  inputType = InputType;
+  isNotUniqueInstanceName : boolean = false;
+  isNotUniqueVolumeGroupName : boolean = false;
+
+  constructor(private _aaiService: AaiService, private store: NgRedux<AppState>,
+              private _vnfInstanceDetailsService : VnfInstanceDetailsService) {
+    this.store.subscribe(() => {
+      this.updateFormData()
+    });
+  }
+
+  ngOnInit() {
+    this.updateFormGroup();
+    this.subscribeToFormChanges();
+    this._aaiService.getCategoryParameters(null).subscribe();
+    this._aaiService.getLcpRegionsAndTenants(this.serviceInstance.globalSubscriberId, this.serviceInstance.subscriptionServiceType).subscribe();
+    this.updateLegacyRegionVisibility();
+    this.store.dispatch(loadProductFamiliesAction());
+  }
+
+  isInputShouldBeShown(inputType: any) {
+    let vnfInputs = [InputType.LCP_REGION, InputType.LOB, InputType.TENANT, InputType.PRODUCT_FAMILY, InputType.PLATFORM, InputType.ROLLBACK];
+    let vfInputs = [InputType.VG];
+    let exist = false;
+    if (this._modelType === 'VF') {
+      exist = vnfInputs.indexOf(inputType) > -1;
+    }
+    else {
+      exist = vfInputs.indexOf(inputType) > -1;
+    }
+    return exist;
+  }
+
+  updateFormGroupControlsFromVNFModel() {
+    if (this._vnfModel && this._modelType) {
+      if (this._modelType === ServiceNodeTypes.VF) {
+        const vnfInstance = <VnfInstance>this.vnfInstance;
+        if (this.instanceFormGroup && this.userProvidedNaming
+          && !this.instanceFormGroup.get('instanceName')) {
+          const initialInstanceName = vnfInstance.instanceName || (!isNullOrUndefined(this._vnfModel.name) ? this._vnfModel.name.replace(/[-]/g, "") : this._vnfModel.name);
+          this.instanceFormGroup.addControl('instanceName', new FormControl(initialInstanceName, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid])))
+        }
+      }
+      else if (this._modelType === ServiceNodeTypes.VFmodule) {
+        const vfInstance = <VfModuleInstance>this.vnfInstance;
+        if (this.instanceFormGroup && this.userProvidedNaming && !this.instanceFormGroup.get('instanceName')) {
+          this.instanceFormGroup.addControl('instanceName', new FormControl(vfInstance.instanceName, Validators.required));
+
+          let vfModule = this.extractVfAccordingToVfModuleUuid(this.store.getState(), this._vnfModel.uuid);
+          if (vfModule.volumeGroupAllowed && !this.instanceFormGroup.get('volumeGroupName')) {
+            this.instanceFormGroup.addControl('volumeGroupName', new FormControl(vfInstance.volumeGroupName));
+          }
+        }
+      }
+    }
+  }
+
+  updateFormGroup() {
+    const tenantDisabled = !this.vnfInstance.lcpCloudRegionId;
+
+    if (this._modelType === ServiceNodeTypes.VF) {
+      const vnfInstance = <VnfInstance>this.vnfInstance;
+      this.instanceFormGroup = new FormGroup({
+        productFamilyId: new FormControl(vnfInstance.productFamilyId),
+        lcpCloudRegionId: new FormControl(vnfInstance.lcpCloudRegionId, Validators.required),
+        tenantId: new FormControl({value: vnfInstance.tenantId, disabled: tenantDisabled}, Validators.required),
+        legacyRegion: new FormControl(vnfInstance.legacyRegion),
+        lineOfBusiness: new FormControl(vnfInstance.lineOfBusiness),
+        platformName: new FormControl(vnfInstance.platformName, Validators.required),
+      });
+    }
+    else if (this._modelType === ServiceNodeTypes.VFmodule) {
+      const vfInstance = <VfModuleInstance>this.vnfInstance;
+      this.instanceFormGroup = new FormGroup({
+      });
+    }
+
+    this.instanceFormGroup.valueChanges.subscribe(()=> {
+      this.checkForUniqueInstanceName();
+      this.onDataChanged.next();
+    });
+
+    this.updateFormGroupControlsFromVNFModel();
+  }
+
+  private getParentVnfModel(): VNFModel {
+    const rawModel = _.get(this.store.getState().service.serviceHierarchy[this.serviceUuid], ['vnfs', this.parentModelName]);
+    return new VNFModel(rawModel);
+  }
+
+  extractVfAccordingToVfModuleUuid(state : any,vfModuleUuid : string) {
+    const vnfs = this.store.getState().service.serviceHierarchy[this.serviceUuid].vnfs;
+    const vnfsArray = Object.values(vnfs);
+    for (let i = 0; i<vnfsArray.length;i++){
+      let vfModules = Object.values(vnfsArray[i].vfModules);
+      for (let j = 0; j<vfModules.length;j++){
+        if (vfModules[j].uuid === vfModuleUuid){
+          return vfModules[j];
+        }
+      }
+    }
+  }
+
+  updateFormData() {
+    let service = this.store.getState().service;
+    this.vnfPopupDataModel.lcpRegions = service.lcpRegionsAndTenants.lcpRegionList;
+    if (this.vnfInstance && this.vnfInstance.lcpCloudRegionId) {
+      this.vnfPopupDataModel.tenants = service.lcpRegionsAndTenants.lcpRegionsTenantsMap[this.vnfInstance.lcpCloudRegionId];
+      console.log('setting vnf instances tenant: ' + JSON.stringify(this.vnfPopupDataModel.tenants));
+    }
+    this.vnfPopupDataModel.platforms = service.categoryParameters.platformList;
+    this.vnfPopupDataModel.lineOfBusinesses = service.categoryParameters.lineOfBusinessList;
+    this.onDataChanged.next();
+  }
+
+  subscribeToFormChanges(): void {
+    if (this.instanceFormGroup.get('lcpCloudRegionId') !== null) {
+      this.instanceFormGroup.get('lcpCloudRegionId').valueChanges.subscribe(val => {
+        this.setDisabledState(val, 'tenantId');
+        this.updateTenantList(val);
+        this.updateLegacyRegionVisibility();
+        this.onDataChanged.next();
+      });
+    }
+  }
+
+  setDisabledState(val, field: string): void {
+    if (val) {
+      this.instanceFormGroup.controls[field].enable();
+    }
+  }
+
+  updateLegacyRegionVisibility() {
+    if (this.instanceFormGroup.get('lcpCloudRegionId') !== null) {
+      this.shouldShowLegacyRegion = this.lcpRegionsThatEnableLegacyRegionField.indexOf(this.instanceFormGroup.get('lcpCloudRegionId').value) > -1;
+      if (!this.shouldShowLegacyRegion) {
+        this.instanceFormGroup.controls.legacyRegion.setValue(undefined);
+      }
+    }
+  }
+
+  updateTenantList(cloudRegionId) {
+    this.resetTenantSelection();
+    const tenantsForCloudRegionId = this.store.getState().service.lcpRegionsAndTenants.lcpRegionsTenantsMap[cloudRegionId];
+    console.log('tenants for selected cloud region id: ' + JSON.stringify(tenantsForCloudRegionId));
+    this.vnfPopupDataModel.tenants = tenantsForCloudRegionId;
+  }
+
+  resetTenantSelection() {
+    this.instanceFormGroup.controls.tenantId.setValue(undefined);
+  }
+
+  checkForUniqueInstanceName() {
+    let currentName = !isNullOrUndefined(this.instanceFormGroup.get('instanceName')) ? this.instanceFormGroup.get('instanceName').value : null;
+
+    if(currentName && !this._vnfInstanceDetailsService.isUnique(this.store.getState().service.serviceInstance, this.serviceUuid, currentName, currentName === this.serviceInstance.instanceName) && this.userProvidedNaming){
+      this.isNotUniqueInstanceName = true;
+      this.onServiceInstanceNameChanged.emit(true);
+    }else {
+      this.isNotUniqueInstanceName = false;
+      this.onServiceInstanceNameChanged.emit(false);
+    }
+  }
+
+  checkForUniqueGroupName(){
+    let currentName = this.instanceFormGroup.get('volumeGroupName').value;
+    if( !this._vnfInstanceDetailsService.isUnique(this.store.getState().service.serviceInstance, this.serviceUuid, currentName, currentName === this.serviceInstance['volumeGroupName'])){
+      this.isNotUniqueVolumeGroupName = true;
+      this.onVolumeGroupNameChanged.emit(true);
+    }else {
+      this.isNotUniqueVolumeGroupName = false;
+      this.onVolumeGroupNameChanged.emit(false);
+    }
+  }
+
+  onSubmit(formValues): void {
+    formValues.modelInfo = new ModelInfo(this._vnfModel);
+    if (this._modelType === 'VFmodule') {
+      let dynamicFields: { [dynamicField: string]: string; };
+      dynamicFields = {};
+      if(!_.isEmpty(this.dynamicInputs)) {
+        this.dynamicInputs.map(function (x) {
+          let dynamicField: string = x.id;
+          dynamicFields[dynamicField] = formValues[dynamicField];
+          delete formValues[dynamicField];
+        });
+      }
+      formValues.instanceParams = [];
+      formValues.instanceParams.push(dynamicFields);
+      if(this.isNewVfModule){
+        this.store.dispatch(createVFModuleInstance(formValues, this.modelName, this.serviceUuid));
+      }else {
+        this.store.dispatch(updateVFModuleInstance(formValues, this.modelName, this.serviceUuid));
+      }
+
+    }
+    else {
+      formValues.isUserProvidedNaming = this.userProvidedNaming;
+      this.store.dispatch(updateVNFInstance(formValues, this.modelName, this.serviceUuid));
+    }
+    window.parent.postMessage({
+      eventId: 'submitIframe',
+      data: {
+        serviceModelId: this.serviceUuid
+      }
+    }, "*");
+    this.onSubmitClick.emit(this.serviceUuid);
+  }
+}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.html
new file mode 100644 (file)
index 0000000..ccdaac5
--- /dev/null
@@ -0,0 +1,114 @@
+
+<div id="vnf-instance-details">
+  <form id="vnfForm" #vnfForm="ngForm" (ngSubmit)="onSubmit(vnfForm.value)" [formGroup]="instanceFormGroup">
+
+    <div class="details-item" *ngIf="instanceFormGroup.get('instanceName')">
+      <label class="required">Instance name:</label>
+      <input patternInput
+             pattern="^[a-zA-Z0-9_]*$"
+            [attr.data-tests-id]="'instanceName'"
+             [ngClass]="{'error-style' : _vnfInstanceDetailsService.hasInstanceNameError(instanceFormGroup) || _vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName)}"
+             id="instance-name" name="instance-name"
+             [formControlName]="'instanceName'"
+             class="form-control input-text"
+             placeholder="Type Instance Name"
+             type="text"
+             (blur)="checkForUniqueInstanceName()">
+      <form-control-error *ngIf="_vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName)" [message]="'Instance name is already in use, please pick another name.'"></form-control-error>
+      <form-control-error *ngIf="_vnfInstanceDetailsService.hasInstanceNameError(instanceFormGroup)" [message]="'Instance name may include only alphanumeric characters and underscore.'"></form-control-error>
+    </div>
+
+    <div *ngIf="isInputShouldBeShown(inputType.PRODUCT_FAMILY)" class="details-item">
+      <label>Product family:</label>
+      <select class="form-control input-text"
+              [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('productFamilyId',productFamilies, instanceFormGroup)}"
+              data-tests-id="productFamily"
+              id="product-family-select"
+              [formControlName]="'productFamilyId'"
+              name="product-family-select" >
+        <option [value]="null" disabled>Select Product Family</option>
+        <option *ngFor="let productFamily of productFamilies | async" [value]="productFamily.id"
+                [disabled]="!productFamily.isPermitted">{{productFamily.name}}</option>
+      </select>
+      <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('productFamilyId',productFamilies, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div *ngIf="isInputShouldBeShown(inputType.LCP_REGION)" class="details-item">
+      <label class="required">LCP region:</label>
+      <select
+        [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('lcpCloudRegionId',vnfPopupDataModel?.lcpRegions, instanceFormGroup)}"
+        class="form-control input-text"
+        [formControlName]="'lcpCloudRegionId'"
+        name="lcpRegion" id="lcpRegion-select"
+        data-tests-id="lcpRegion">
+        <option [value]="null" disabled>Select LCP Region</option>
+        <option *ngFor="let lcpRegion of vnfPopupDataModel.lcpRegions" [value]="lcpRegion.id" [disabled]="!lcpRegion.isPermitted" class="lcpRegionOption">{{lcpRegion.id}}</option>
+      </select>
+      <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('lcpCloudRegionId',vnfPopupDataModel?.lcpRegions, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div class="details-item" *ngIf="shouldShowLegacyRegion">
+      <label>Legacy Region:</label>
+      <input
+        [attr.data-tests-id]="'lcpRegionText'"
+        id="legacy-region"
+        name="legacy-region"
+        [formControlName]="'legacyRegion'"
+        class="form-control input-text"
+             placeholder="Type Legacy Region" type="text">
+    </div>
+
+    <div *ngIf="isInputShouldBeShown(inputType.TENANT)" class="details-item">
+      <label class="required">Tenant:</label>
+      <select class="form-control input-text"
+              [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('tenantId',vnfPopupDataModel?.tenants, instanceFormGroup)}"
+              [formControlName]="'tenantId'"
+              name="tenant" id="tenant-select" data-tests-id="tenant">
+        <option [value]="undefined" disabled>Select Tenant</option>
+        <option *ngFor="let tenant of vnfPopupDataModel.tenants" [value]="tenant.id" [disabled]="!tenant.isPermitted">{{tenant.name}}</option>
+      </select>
+      <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('tenantId',vnfPopupDataModel?.tenants, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div *ngIf="isInputShouldBeShown(inputType.LOB)"  class="details-item">
+      <label>Line of business:</label>
+      <select [attr.data-tests-id]="'lineOfBusiness'"
+              class="form-control input-text"
+              [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('lineOfBusiness',vnfPopupDataModel?.lineOfBusinesses, instanceFormGroup)}"
+              name="lineOfBusiness" id="lineOfBusiness"
+              [formControlName]="'lineOfBusiness'">
+        <option [value]="null" disabled>Select Line Of Business</option>
+        <option *ngFor="let project of vnfPopupDataModel.lineOfBusinesses" [value]="project.id">{{project.name}}</option>
+      </select>
+      <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('lineOfBusiness',vnfPopupDataModel?.lineOfBusinesses, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+    <div *ngIf="isInputShouldBeShown(inputType.PLATFORM)" class="details-item">
+      <label class="required">Platform:</label>
+      <select
+        [attr.data-tests-id]="'platform'"
+        [ngClass]="{'error-style' :_vnfInstanceDetailsService.hasApiError('platformName',vnfPopupDataModel?.platforms, instanceFormGroup)}"
+        class="form-control input-text"
+        [formControlName]="'platformName'"
+        name="platform" id="platform">
+        <option [value]="null" disabled>Select Platform</option>
+        <option *ngFor="let platform of vnfPopupDataModel.platforms" [value]="platform.id">{{platform.name}}</option>
+      </select>
+      <form-control-error *ngIf="_vnfInstanceDetailsService.hasApiError('platformName',vnfPopupDataModel?.platforms, instanceFormGroup)" [message]="'No results for this request. Please change criteria.'"></form-control-error>
+    </div>
+
+
+    <div *ngIf="isInputShouldBeShown(inputType.VG) && instanceFormGroup.get('volumeGroupName')" class="details-item" >
+      <label class="required">Volume Group Name:</label>
+      <input [attr.data-tests-id]="'volumeGroupName'"
+             id="vgName" name="vgName"
+             [ngClass]="{'error-style' :isNotUniqueVolumeGroupName}"
+             [formControlName]="'volumeGroupName'"
+             class="form-control input-text"
+             placeholder="Type Instance Name" type="text" (blur)="checkForUniqueGroupName()">
+      <form-control-error *ngIf="isNotUniqueVolumeGroupName" [message]="'Volume Group instance name is already in use, please pick another name.'"></form-control-error>
+    </div>
+
+    <dynamic-inputs *ngIf="dynamicInputs != undefined && dynamicInputs.length>0" [group]="instanceFormGroup" [list]="dynamicInputs"></dynamic-inputs>
+  </form>
+</div>
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.scss
new file mode 100644 (file)
index 0000000..080540a
--- /dev/null
@@ -0,0 +1,64 @@
+#vnf-instance-details {
+  position: relative;
+
+  #notification-area {
+    color: #959595;
+    font-size: 12px;
+    position: absolute;
+    top: 3px;
+    left: 30px;
+  }
+
+  height: 100%;
+  overflow: auto;
+  padding: 30px;
+
+  /deep/ {
+    .form-control {
+      border-radius: 2px;
+      box-shadow: none;
+      border-color: #D2D2D2;
+    }
+
+    label {
+      font-family: OpenSans-Semibold;
+      font-size: 12px;
+    }
+
+    select {
+      @extend .form-control;
+      -webkit-appearance: none;
+      -moz-appearance: none;
+      appearance: none;
+      background: url('../../../../assets/img/chevron.svg') 0 0 no-repeat;
+      background-size: 24px;
+      background-position-x: right;
+      background-position-y: center;
+      font-family: OpenSans-Italic;
+      font-size: 14px;
+      color: #959595;
+      height: 38px;
+    }
+
+    input:not([type='checkbox']) {
+      @extend .form-control;
+      height: 38px;
+    }
+
+    .form-control[disabled], fieldset[disabled] .form-control {
+      opacity: 0.5;
+    }
+    .input-text {
+      border: 1px solid #D2D2D2;
+      border-radius: 2px;
+    }
+
+    .details-item {
+      margin-bottom: 20px;
+    }
+  }
+
+    .checkbox-label {
+      font-family: OpenSans-Regular;
+    }
+}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.spec.ts
new file mode 100644 (file)
index 0000000..41ddb43
--- /dev/null
@@ -0,0 +1,241 @@
+import { TestBed, getTestBed } from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+  HttpTestingController
+} from '@angular/common/http/testing';
+import { VnfInstanceDetailsService } from './vnf-instance-details.service';
+import { FormControl, FormGroup, Validators } from '@angular/forms';
+import { NumbersLettersUnderscoreValidator } from '../../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+
+describe('Vnf Instance Details Service', () => {
+  let injector;
+  let service: VnfInstanceDetailsService;
+  let httpMock: HttpTestingController;
+
+  let SERVICE_ID: string = '1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd';
+  let serviceHierarchy;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [VnfInstanceDetailsService]
+    });
+
+    injector = getTestBed();
+    service = injector.get(VnfInstanceDetailsService);
+    httpMock = injector.get(HttpTestingController);
+    serviceHierarchy = getServiceServiceHierarchy();
+  });
+
+
+  describe('#hasInstanceNameError', ()=> {
+    it('hasInstanceNameError should return true if instanceName is illegal and enabled', (done: DoneFn) => {
+      let form = generateFormGroup();
+      form.controls['instanceName'].setValue('----');
+      form.controls['instanceName'].setErrors({
+        pattern : true
+      });
+      form.controls['instanceName'].markAsTouched();
+      let result = service.hasInstanceNameError(form);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('hasInstanceNameError should return false if instanceName is illegal and enabled and pattern is ok', (done: DoneFn) => {
+      let form = generateFormGroup();
+      form.controls['instanceName'].setValue('----');
+      form.controls['instanceName'].setErrors({
+        otherError : true
+      });
+      form.controls['instanceName'].markAsTouched();
+      let result = service.hasInstanceNameError(form);
+      expect(result).toBeFalsy();
+      done();
+    });
+  });
+
+  describe('#isUnique', () => {
+    it('Create Mode: should return false if instanceName exist', (done: DoneFn) => {
+      serviceHierarchy = getServiceServiceHierarchy();
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceName', false);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('Update Mode: should return true if instanceName exist once', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceName', true);
+      expect(result).toBeTruthy()
+      done();
+    });
+
+    it('Create Mode: should return true if instanceName not exist', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameNotExist', false);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('Create Mode: should return false if instanceName exist inside vf modules', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModule', false);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('Update Mode: should return true if instanceName  exist once inside vf modules', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModule', true);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('Create Mode: should return true if instanceName is not exist at vf modules and vnfs', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'uniqueInstanceNameVfModuleNotExist', false);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('Create Mode: should return false if instanceName exist service name', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'Instance-Name', false);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('Create Mode: should return false if volumeGroupName exist service name', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'volumeGroupNameExist', false);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('Create Mode: should return true if volumeGroupName not exist service name', (done: DoneFn) => {
+      let result = service.isUnique(serviceHierarchy, SERVICE_ID, 'volumeGroupNameNotExist', false);
+      expect(result).toBeTruthy();
+      done();
+    });
+  });
+
+  function getServiceServiceHierarchy() {
+    return JSON.parse(JSON.stringify(
+      {
+        "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd": {
+          "vnfs": {
+            "2017-388_ADIOD-vPE 1": {
+              "rollbackOnFailure": "true",
+              "vfModules": {},
+              "instanceParams": [
+                {}
+              ],
+              "productFamilyId": "a4f6f2ae-9bf5-4ed7-b904-06b2099c4bd7",
+              "lcpCloudRegionId": "AAIAIC25",
+              "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+              "lineOfBusiness": "zzz1",
+              "platformName": "platform",
+              "instanceName": "uniqueInstanceName",
+              "modelInfo": {
+                "modelInvariantId": "00beb8f9-6d39-452f-816d-c709b9cbb87d",
+                "modelVersionId": "0903e1c0-8e03-4936-b5c2-260653b96413",
+                "modelName": "2017-388_ADIOD-vPE",
+                "modelVersion": "1.0",
+                "modelCustomizationId": "280dec31-f16d-488b-9668-4aae55d6648a",
+                "modelCustomizationName": "2017-388_ADIOD-vPE 1"
+              },
+              "isUserProvidedNaming": true
+            },
+            "2017-388_ADIOD-vPE 0": {
+              "rollbackOnFailure": "true",
+              "vfModules": {},
+              "instanceParams": [
+                {}
+              ],
+              "productFamilyId": null,
+              "lcpCloudRegionId": "mtn6",
+              "tenantId": "1178612d2b394be4834ad77f567c0af2",
+              "lineOfBusiness": "ECOMP",
+              "platformName": "xxx1",
+              "instanceName": "blaaa",
+              "modelInfo": {
+                "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+                "modelVersionId": "afacccf6-397d-45d6-b5ae-94c39734b168",
+                "modelName": "2017-388_ADIOD-vPE",
+                "modelVersion": "4.0",
+                "modelCustomizationId": "b3c76f73-eeb5-4fb6-9d31-72a889f1811c",
+                "modelCustomizationName": "2017-388_ADIOD-vPE 0"
+              },
+              "isUserProvidedNaming": true
+            },
+            "2017488_ADIODvPE 0": {
+              "rollbackOnFailure": "true",
+              "vfModules": {
+                "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                  "2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1": {
+                    "rollbackOnFailure": "true",
+                    "instanceName": "uniqueInstanceNameVfModule",
+                    "volumeGroupName": "volumeGroupNameExist",
+                    "modelInfo": {
+                      "modelInvariantId": "7253ff5c-97f0-4b8b-937c-77aeb4d79aa1",
+                      "modelVersionId": "25284168-24bb-4698-8cb4-3f509146eca5",
+                      "modelName": "2017488AdiodVpe..ADIOD_vRE_BV..module-1",
+                      "modelVersion": "6"
+                    }
+                  }
+                }
+              },
+              "instanceParams": [
+                {}
+              ],
+              "productFamilyId": "ebc3bc3d-62fd-4a3f-a037-f619df4ff034",
+              "lcpCloudRegionId": "mtn6",
+              "tenantId": "19c5ade915eb461e8af52fb2fd8cd1f2",
+              "lineOfBusiness": "zzz1",
+              "platformName": "platform",
+              "instanceName": "2017488_ADIODvPE",
+              "modelInfo": {
+                "modelInvariantId": "72e465fe-71b1-4e7b-b5ed-9496118ff7a8",
+                "modelVersionId": "69e09f68-8b63-4cc9-b9ff-860960b5db09",
+                "modelName": "2017488_ADIODvPE",
+                "modelVersion": "5.0",
+                "modelCustomizationId": "1da7b585-5e61-4993-b95e-8e6606c81e45",
+                "modelCustomizationName": "2017488_ADIODvPE 0"
+              },
+              "isUserProvidedNaming": true
+            }
+          },
+          "instanceParams": [
+            {}
+          ],
+          "globalSubscriberId": "e433710f-9217-458d-a79d-1c7aff376d89",
+          "productFamilyId": "17cc1042-527b-11e6-beb8-9e71128cae77",
+          "subscriptionServiceType": "VIRTUAL USP",
+          "lcpCloudRegionId": "AAIAIC25",
+          "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+          "aicZoneId": "DKJ1",
+          "projectName": "DFW",
+          "owningEntityId": "aaa1",
+          "instanceName": "Instance-Name",
+          "bulkSize": 1,
+          "modelInfo": {
+            "modelInvariantId": "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0",
+            "modelVersionId": "1a80c596-27e5-4ca9-b5bb-e03a7fd4c0fd",
+            "modelName": "action-data",
+            "modelVersion": "1.0"
+          },
+          "tenantName": "USP-SIP-IC-24335-T-01",
+          "aicZoneName": "DKJSJDKA-DKJ1",
+          "isUserProvidedNaming": true
+        }
+      }
+    ));
+  }
+
+  function generateFormGroup() {
+    return new FormGroup({
+      productFamilyId: new FormControl(),
+      lcpCloudRegionId: new FormControl(Validators.required),
+      tenantId: new FormControl({value: null, disabled: false}, Validators.required),
+      legacyRegion: new FormControl(),
+      lineOfBusiness: new FormControl(),
+      platformName: new FormControl(Validators.required),
+      rollbackOnFailure: new FormControl(Validators.required),
+      instanceName: new FormControl({value: null}, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid]))
+
+    });
+  }
+
+});
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnf-instance-details.service.ts
new file mode 100644 (file)
index 0000000..677895e
--- /dev/null
@@ -0,0 +1,64 @@
+import { Injectable } from '@angular/core';
+import { isNullOrUndefined } from "util";
+import { FormGroup } from '@angular/forms';
+@Injectable()
+export class VnfInstanceDetailsService {
+  isUnique(serviceInstance : any, serviceId : string, name: string, isEqualToOriginalInstanceName : boolean) : boolean {
+    const service = serviceInstance[serviceId];
+    let countInstanceName = 0;
+    let countVolumeGroupName = 0;
+    if(service){
+      if(service.instanceName === name) return false;
+      if(service.vnfs){
+        for(let key in service.vnfs){
+          if(service.vnfs[key].instanceName === name) {
+            countInstanceName++;
+            if((isEqualToOriginalInstanceName && countInstanceName > 1) || (!isEqualToOriginalInstanceName)) return false;
+          }
+          if(service.vnfs[key].vfModules){
+            for(let vfModule in service.vnfs[key].vfModules){
+              if(service.vnfs[key].vfModules[vfModule]) {
+                for(let module in service.vnfs[key].vfModules[vfModule]){
+                  if(service.vnfs[key].vfModules[vfModule][module].instanceName === name ) {
+                    countInstanceName++;
+                    if((isEqualToOriginalInstanceName && countInstanceName > 1) || (!isEqualToOriginalInstanceName)) return false;
+                  }
+
+                  if(service.vnfs[key].vfModules[vfModule][module].volumeGroupName === name ) {
+                    countVolumeGroupName++;
+                    if((isEqualToOriginalInstanceName && countVolumeGroupName > 1) || (!isEqualToOriginalInstanceName)) return false;
+                  }
+                }
+              }
+            }
+          }
+
+        }
+      }
+    }
+    return true;
+  }
+
+  hasApiError(controlName: string, data: Array<any>, form: FormGroup) {
+    if (!isNullOrUndefined(data)) {
+      if (!form.controls[controlName].disabled && data.length === 0) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  hasInstanceNameError(form : FormGroup) : boolean {
+    if(!isNullOrUndefined(form) && !isNullOrUndefined(form.controls['instanceName'])){
+      if (form.controls['instanceName'].touched && form.controls['instanceName'].errors && form.controls['instanceName'].errors.pattern) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  hasUniqueError(isNotUniqueInstanceName) : boolean {
+    return isNotUniqueInstanceName;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-instance-details/vnfPopupDataModel.ts
new file mode 100644 (file)
index 0000000..9a2694c
--- /dev/null
@@ -0,0 +1,26 @@
+import {Project} from "../../../shared/models/project";
+import {LcpRegion} from "../../../shared/models/lcpRegion";
+import {Tenant} from "../../../shared/models/tenant";
+import {ProductFamily} from "../../../shared/models/productFamily";
+import {SelectOption, SelectOptionInterface} from "../../../shared/models/selectOption";
+
+export class VNFPopupDataModel {
+  productFamilies: ProductFamily[];
+  lcpRegions: LcpRegion[];
+  lcpRegionsTenantsMap: any;
+  tenants: Tenant[];
+  projects: Project[];
+  lineOfBusinesses: SelectOption[];
+  platforms: SelectOptionInterface[];
+  globalCustomerId: string;
+
+
+  constructor(){
+      this.lcpRegions = [];
+      this.lcpRegionsTenantsMap = {};
+      this.tenants = [];
+      this.productFamilies = [];
+      this.lineOfBusinesses = [];
+      this.platforms = [];
+  }
+}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup-service.ts
new file mode 100644 (file)
index 0000000..7dbe9b1
--- /dev/null
@@ -0,0 +1,55 @@
+import {Injectable} from "@angular/core";
+import {ServiceNodeTypeToModelKeyMapper} from "../../shared/models/serviceNodeTypeToModelKeyMapper";
+import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes";
+import {VfModule} from "../../shared/models/vfModule";
+import {ServicePlanningService} from "../../services/service-planning.service";
+import {VNFModel} from "../../shared/models/vnfModel";
+import * as _ from 'lodash';
+import {isNullOrUndefined} from "util";
+import {NumbersLettersUnderscoreValidator} from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+import {FormGroup} from '@angular/forms';
+import {VnfInstanceDetailsComponent} from './vnf-instance-details/vnf-instance-details.component';
+import {VnfInstanceDetailsService} from './vnf-instance-details/vnf-instance-details.service';
+
+@Injectable()
+export class VnfPopupService {
+
+  constructor(private _servicePlanningService : ServicePlanningService, private _vnfInstanceDetailsService : VnfInstanceDetailsService) {
+  }
+
+  public getModelFromResponse(result : any, modelType : string, modelName:string) {
+    let model = null;
+    let rawModel = _.get(result, [ServiceNodeTypeToModelKeyMapper[modelType], modelName]);
+    if (!rawModel) return;
+
+    if (modelType === ServiceNodeTypes.VFmodule) {
+      model = new VfModule(rawModel);
+    }
+    else {
+      model = new VNFModel(rawModel);
+    }
+    return model;
+  }
+
+  onControlError(servicePopupDataModel : VnfInstanceDetailsComponent, serviceInstanceDetailsFormGroup : FormGroup, isNotUniqueInstanceName : boolean, isNotUniqueVolumeGroupName : boolean) : boolean{
+    if(this._vnfInstanceDetailsService.hasUniqueError(isNotUniqueInstanceName) || isNotUniqueVolumeGroupName){
+      return true;
+    }
+    if(!isNullOrUndefined(serviceInstanceDetailsFormGroup.controls['instanceName']) && NumbersLettersUnderscoreValidator.valid(serviceInstanceDetailsFormGroup.controls['instanceName'].value) && serviceInstanceDetailsFormGroup.controls['instanceName'].value != null && serviceInstanceDetailsFormGroup.controls['instanceName'].value.length > 0){
+      return true;
+    }
+
+    const controlName : Array<string> =  ['lcpCloudRegionId', 'tenantId', 'lineOfBusiness', 'platformName'];
+    const selectDataName : Array<string> = ['lcpRegions', 'tenants', 'lineOfBusinesses', 'platforms', 'projects'];
+
+    for(let i = 0 ; i < controlName.length ; i++){
+      if (!isNullOrUndefined(servicePopupDataModel.vnfPopupDataModel) && !isNullOrUndefined(servicePopupDataModel.vnfPopupDataModel[selectDataName[i]])) {
+        if (!isNullOrUndefined(serviceInstanceDetailsFormGroup.controls[controlName[i]]) && !serviceInstanceDetailsFormGroup.controls[controlName[i]].disabled && servicePopupDataModel.vnfPopupDataModel[selectDataName[i]].length === 0) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.components.ts
new file mode 100644 (file)
index 0000000..26e667d
--- /dev/null
@@ -0,0 +1,190 @@
+import {Component, OnInit, ViewChild} from "@angular/core";
+import {AaiService} from "../../services/aaiService/aai.service";
+import {ModelInformationItem} from "../../shared/components/model-information/model-information.component";
+import {ActivatedRoute} from "@angular/router";
+import {DialogComponent, DialogService} from "ng2-bootstrap-modal";
+import {InstancePopup} from "../instance-popup/instance-popup.components";
+import {ServiceModel} from "../../shared/models/serviceModel";
+import {Constants} from "../../shared/utils/constants";
+import * as _ from "lodash";
+import {VnfInstance} from "../../shared/models/vnfInstance";
+import {ServiceInstance} from "../../shared/models/serviceInstance";
+import {VnfInstanceDetailsComponent} from "./vnf-instance-details/vnf-instance-details.component";
+import {Subscriber} from "../../shared/models/subscriber";
+import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes";
+import {AppState} from "../../store/reducers";
+import {NgRedux} from "@angular-redux/store";
+import {VfModuleInstance} from "../../shared/models/vfModuleInstance";
+import {VnfPopupService} from './vnf-popup-service';
+import {IframeService} from "../../shared/utils/iframe.service";
+
+export interface VnfPopupModel {
+  serviceModelId: string;
+  modelName: string;
+  parentModelName: string;
+  modelType: string;
+  dynamicInputs: any;
+  userProvidedNaming: boolean;
+  isNewVfModule : boolean;
+}
+
+@Component({
+  selector: 'vnf-popup',
+  templateUrl: 'vnf-popup.html',
+  styleUrls: ['vnf-popup.scss'],
+  providers: [AaiService, VnfPopupService]
+})
+
+export class VnfPopupComponent extends DialogComponent<VnfPopupModel, boolean> implements VnfPopupModel, InstancePopup, OnInit {
+
+  @ViewChild(VnfInstanceDetailsComponent) vnfInstanceDetails: VnfInstanceDetailsComponent;
+
+  serviceModelId: string;
+  modelName: string;
+  parentModelName: string;
+  modelType: string;
+  isNewVfModule : boolean;
+  model: any;
+  serviceModel: ServiceModel;
+  popupTypeName: string;
+  serviceInstance: ServiceInstance;
+  vnfInstance: VnfInstance;
+  dynamicInputs;
+  userProvidedNaming: boolean;
+  typeMapperForTitle = {
+    VF: "VNF",
+    VFmodule: "Module (Heat stack)"
+  };
+
+  modelInformationItems: Array<ModelInformationItem> = [];
+  isNotUniqueInstanceName : boolean = false;
+  isNotUniqueVolumeGroupName : boolean = false;
+  hasGeneralApiError : boolean = false;
+
+  parentElementClassName = 'content';
+
+  constructor(dialogService: DialogService, protected route: ActivatedRoute, protected _aaiService: AaiService,
+              private store: NgRedux<AppState>,
+              private _iframeService : IframeService,
+              private _vnfPopupService: VnfPopupService) {
+    super(dialogService);
+    this.vnfInstance = new VnfInstance();
+  }
+
+  updateGeneralErrorSection() : void {
+    this.hasGeneralApiError = this._vnfPopupService.onControlError(
+      this.vnfInstanceDetails,
+      this.vnfInstanceDetails.instanceFormGroup,
+      this.vnfInstanceDetails.isNotUniqueInstanceName,
+      this.vnfInstanceDetails.isNotUniqueVolumeGroupName);
+  }
+
+  ngOnInit(): void {
+    this.updateServiceModelById();
+    this.popupTypeName = this.getModelTypeForPopupTitle();
+    this.updateServiceModelById();
+    this.updateInstanceFromStore();
+  }
+
+  onCancelClick() {
+    this._iframeService.removeClassCloseModal(this.parentElementClassName);
+    super.close();
+  }
+
+  onServiceInstanceNameChanged(isNotUniqueInstanceName: boolean) : void {
+    this.isNotUniqueInstanceName = isNotUniqueInstanceName;
+  }
+
+  onVolumeGroupNameChanged(isNotUniqueVolumeGroupName: boolean) : void {
+    this.isNotUniqueVolumeGroupName = isNotUniqueVolumeGroupName;
+  }
+
+  onSetClick() {
+      this._iframeService.removeClassCloseModal(this.parentElementClassName);
+      this.result = true;
+      super.close();
+  }
+
+  updateServiceModelById() {
+    this._aaiService.getServiceModelById(this.serviceModelId).subscribe(
+      result => {
+        this.serviceModel = new ServiceModel(result);
+        this.model = this._vnfPopupService.getModelFromResponse(result, this.modelType, this.modelName);
+        this.modelInformationItems = this.createModelInformationItems();
+      },
+      error => {
+        console.log('error is ', error)
+      }
+    );
+  }
+
+  updateInstanceFromStore() {
+    let instance;
+    const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+    if (this.modelType === ServiceNodeTypes.VF) {
+      instance = serviceInstance.vnfs[this.modelName] || new VnfInstance();
+    } else {
+      instance = new VfModuleInstance();
+    }
+
+    if (instance.instanceParams && instance.instanceParams[0]) {
+      this.dynamicInputs = this.dynamicInputs.map(x => {
+        x.value = (instance.instanceParams[0][x.id]) ? instance.instanceParams[0][x.id] : x.value;
+        return x;
+      });
+    }
+    this.vnfInstance = instance;
+  }
+
+  getModelName(): string {
+    return this.modelName;
+  }
+
+  getModelTypeForPopupTitle(): string {
+    if (_.has(this.typeMapperForTitle, this.modelType)) {
+      return this.typeMapperForTitle[this.modelType];
+    }
+    return this.modelType;
+  }
+
+  extractSubscriberNameBySubscriberId(subsriberId: string) {
+    var result: string = null;
+    var filteredArray: any = _.filter(this.store.getState().service.subscribers, function (o: Subscriber) {
+      return o.id === subsriberId
+    })
+    if (filteredArray.length > 0) {
+      result = filteredArray[0].name;
+    }
+    return result;
+  }
+
+  createModelInformationItems(): Array<ModelInformationItem> {
+    var serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+
+    let items = [
+      new ModelInformationItem("Subscriber Name", "subscriberName", [this.extractSubscriberNameBySubscriberId(serviceInstance.globalSubscriberId)], "", true),
+      new ModelInformationItem("Service Name", "serviceModelName", [this.serviceModel.name], "", true),
+
+      new ModelInformationItem("Service Instance Name", "serviceName", [serviceInstance.instanceName], "", false),
+      new ModelInformationItem("Model Name", "modelName", [this.model.name], "", true),
+      new ModelInformationItem("Model version", "modelVersion", [this.model.version], "", true),
+      new ModelInformationItem("Description", "description", [this.model.description]),
+      new ModelInformationItem("Category", "category", [this.model.category]),
+      new ModelInformationItem("Sub Category", "subCategory",[this.model.subCategory]),
+      new ModelInformationItem("UUID", "uuid", [this.model.uuid], Constants.ServicePopup.TOOLTIP_UUID, true),
+      new ModelInformationItem("Invariant UUID", "invariantUuid", [this.model.invariantUuid], Constants.ServicePopup.TOOLTIP_INVARIANT_UUID, true),
+      new ModelInformationItem("Service type", "serviceType", [this.serviceModel.serviceType]),
+      new ModelInformationItem("Service role", "serviceRole", [this.serviceModel.serviceRole]),
+
+
+    ];
+    if (this.modelType === 'VFmodule') {
+      items.push(new ModelInformationItem("Minimum to instantiate", "min", [this.model.min], "", true),
+        new ModelInformationItem("Maximum to instantiate", "max", this.model.max == undefined ? [1] : [this.model.max], "", true),
+        new ModelInformationItem("Recommended to instantiate", "initial", [this.model.initial]));
+
+    }
+
+    return items;
+  }
+}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.html
new file mode 100644 (file)
index 0000000..d2e043b
--- /dev/null
@@ -0,0 +1,54 @@
+<div id="instance-popup" class="modal-dialog">
+  <div class="modal-content">
+    <div class="modal-header">
+      <button type="button" class="close" (click)="onCancelClick()" >&times;</button>
+      <span [attr.data-tests-id]="'create-modal-title'" class="modal-title">Set a new {{popupTypeName}}</span>
+    </div>
+    <div class="modal-body popup-content">
+
+      <div class="header-left">
+        <div>MODEL: <span>"{{popupTypeName}}"</span></div>
+      </div>
+
+      <div class="header-right">
+        {{getModelTypeForPopupTitle()}} Instance Details
+      </div>
+
+      <div class="model-information">
+        <model-information [modelInformationItems]="modelInformationItems"></model-information>
+      </div>
+
+      <div class="instance-form">
+        <vnf-instance-details [dynamicInputs]="dynamicInputs"
+                              [vnfModel]="model"
+                              [modelType]="modelType"
+                              [modelName]="modelName"
+                              [parentModelName]="parentModelName"
+                              [isNewVfModule]="isNewVfModule"
+                              [serviceInstance]="vnfInstance"
+                              [vnfInstance]="vnfInstance"
+                              [serviceUuid]="serviceModelId"
+                              [userProvidedNaming]="userProvidedNaming"
+                              (onSubmitClick)="onSetClick($event)"
+                              (onDataChanged)="updateGeneralErrorSection()"
+                              (onServiceInstanceNameChanged)="onServiceInstanceNameChanged($event)"
+                              (onVolumeGroupNameChanged)="onVolumeGroupNameChanged($event)"
+
+                              ></vnf-instance-details>
+      </div>
+
+    </div>
+    <div class="modal-footer row" style="padding: 0">
+      <div class="col-md-6">
+        <div *ngIf="hasGeneralApiError == true">
+          <form-general-error [message]="'Page contains errors. Please see details next to the relevant fields.'"></form-general-error>
+        </div>
+      </div>
+      <div class="col-md-6" style="padding: 15px;padding-right: 35px;">
+        <button [attr.data-tests-id]="'cancelButton'"  type="button" class="btn btn-default cancel" (click)="onCancelClick()"><span>Cancel</span></button>
+        <input type="submit" value="Set" form="vnfForm" data-tests-id="vnf-form-set"
+               class="btn btn-success submit" [disabled]="!vnfInstanceDetails?.vnfForm?.valid || isNotUniqueInstanceName || isNotUniqueVolumeGroupName">
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.scss
new file mode 100644 (file)
index 0000000..6e606db
--- /dev/null
@@ -0,0 +1,185 @@
+$grid-border: 1px #d2d2d2 solid;
+
+#instance-popup {
+  color: #191919;
+
+  .left-panel {
+    background: #f2f2f2;
+    border-right: $grid-border;
+  }
+
+  .header-common {
+    height: 100%;
+    align-items: center;
+    display: flex;
+    font-family: OpenSans-Semibold;
+    font-size: 12px;
+  }
+
+  .header-text {
+    padding-left: 30px;
+    @extend .header-common;
+  }
+
+  .header-left {
+    grid-area: header-left;
+    @extend .header-text;
+    @extend .left-panel;
+    border-bottom: $grid-border;
+
+    span {
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+    };
+  }
+
+  .header-right {
+    grid-area: header-right;
+
+    @extend .header-text;
+    border-bottom: $grid-border;
+  }
+
+  .quantity-label {
+    grid-area: quantity-label;
+    @extend .header-common;
+    border-bottom: $grid-border;
+    height: 100%;
+    font-family: OpenSans-Regular;
+  }
+
+  .quantity {
+    grid-area: quantity;
+    border-left: $grid-border;
+    border-bottom: $grid-border;
+    border-top-style: none;
+    font-family: OpenSans-Semibold;
+    text-align: start;
+    text-indent: 10px;
+  }
+
+  .quantity-select {
+    width: 78px;
+    height: 100%;
+    border: 0;
+    background: white;
+    outline: none;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+    background: url('../../../assets/img/chevron.svg') 0 0 no-repeat;
+    background-size: 24px;
+    background-position-x: right;
+    background-position-y: center;
+  }
+  input[type="number"]:hover::-webkit-inner-spin-button {
+    height: 20px;
+  }
+
+  .model-information {
+    grid-area: model-information;
+
+    padding: 30px;
+    overflow: auto;
+    @extend .left-panel;
+  }
+
+  .instance-form {
+    grid-area: instance-form;
+  }
+
+  .popup-content {
+    display: grid;
+    grid-template-columns: 400px auto 30px 93px;
+    grid-template-rows: 50px calc(100vh - 180px);
+    grid-template-areas:
+      "header-left header-right header-right header-right"
+      "model-information instance-form instance-form instance-form";
+    padding: 0;
+  }
+}
+
+.modal {
+  background-color: #191919;
+  opacity: 0.8;
+}
+
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 0;
+}
+@media (min-width: 1150px) {
+  .popup-content {
+    grid-template-rows: 30px 680px;
+  }
+}
+
+.modal-content {
+  border-radius: 0;
+  box-shadow: none;
+  border: none;
+}
+
+.modal-footer {
+  .cancel {
+    width: 120px;
+    height: 36px;
+    background: #ffffff;
+    border: 1px solid  #009fdb;
+    border-radius: 2px;
+    span {
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+      color: #009fdb;
+      line-height: 16px;
+    }
+  }
+
+  .submit {
+    width: 120px;
+    height: 36px;
+    background: #009fdb;
+    border-radius: 2px;
+    border-color: #009fdb;
+    span {
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+      color: #FFFFFF;
+      line-height: 16px;
+    }
+  }
+}
+
+.modal-header {
+  background-color: #009fdb;
+
+  padding-bottom: 13px;
+  padding-top: 13px;
+  padding-left: 29px;
+  padding-right: 21px;
+
+  .close {
+    font-size: 32px;
+    font-weight: 200;
+    color: #d8d8d8;
+    text-shadow: none;
+    filter: none;
+    opacity: 1;
+  }
+
+  .modal-title {
+    font-family: OpenSans-Regular;
+    font-size: 24px;
+    color: #fff;
+    line-height: 34px;
+  }
+}
+//
+//@media (min-width: 1200px) {
+//  .service-model,
+//  .service-instance {
+//    width: 1050px;
+//    margin: 30px auto;
+//  }
+//}
diff --git a/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.service.spec.ts b/vid-webpack-master/src/app/components/vnf-popup/vnf-popup.service.spec.ts
new file mode 100644 (file)
index 0000000..02296f7
--- /dev/null
@@ -0,0 +1,827 @@
+import {VnfPopupService} from './vnf-popup-service';
+import {ServicePlanningService} from '../../services/service-planning.service';
+import {ServiceNodeTypes} from '../../shared/models/ServiceNodeTypes';
+import {NgRedux} from '@angular-redux/store';
+import {VNFModel} from '../../shared/models/vnfModel';
+import {VfModule} from '../../shared/models/vfModule';
+import {FormControl, FormGroup, Validators} from '@angular/forms';
+import {NumbersLettersUnderscoreValidator} from '../../shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+import {VnfInstanceDetailsService} from './vnf-instance-details/vnf-instance-details.service';
+import {ReflectiveInjector} from '@angular/core';
+
+export class MockAppStore<T> {
+}
+
+describe('Vnf popup service', () => {
+  let injector;
+  let service: VnfPopupService;
+  let fg: FormGroup;
+  let data = generateModelData();
+  let servicePopupDataModel = generateServicePopupDataModel();
+  let form: FormGroup = generateFormGroup();
+  beforeEach(() => {
+
+    let injector = ReflectiveInjector.resolveAndCreate([
+      VnfPopupService,
+      ServicePlanningService,
+      VnfInstanceDetailsService,
+      {provide: FormGroup, useClass: MockAppStore},
+      {provide: NgRedux, useClass: MockAppStore}
+    ]);
+
+    service = injector.get(VnfPopupService);
+    fg = injector.get(FormGroup);
+  });
+
+  describe('#updateVnfDataFromModel', () => {
+    it('update vnf data from model should return new vnf', (done: DoneFn) => {
+      let vnf: VNFModel = service.getModelFromResponse(data, ServiceNodeTypes.VF, '2017-388_ADIOD-vPE 1');
+
+      expect(vnf).toEqual(jasmine.any(VNFModel));
+      done();
+    });
+
+    it('update wrong vnf data from model should be undefined', (done: DoneFn) => {
+      let vnf: VNFModel = service.getModelFromResponse(data, ServiceNodeTypes.VF, '2017-388_ADIOD-vPE 3');
+
+      expect(vnf).toBeUndefined();
+      done();
+    });
+
+    it('update vfModule data from model should return new vfModule', (done: DoneFn) => {
+      let vfModule: VfModule = service.getModelFromResponse(data, ServiceNodeTypes.VFmodule, '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1');
+
+      expect(vfModule).toEqual(jasmine.any(VfModule));
+      done();
+    });
+
+  });
+
+
+  describe('#onControlError', () => {
+    it('onControlError should return true if instanceName is not legal', (done: DoneFn) => {
+      form.controls['instanceName'].setValue('aaaa - aaa');
+
+      let result: boolean = service.onControlError(<any>servicePopupDataModel, form, false, false);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('onControlError should return false if instanceName is legal', (done: DoneFn) => {
+
+      form.controls['instanceName'].setValue('aaaa');
+      let result = service.onControlError(<any>servicePopupDataModel, form, false, false);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('onControlError should return true if instanceName is not unique', (done: DoneFn) => {
+
+      form.controls['instanceName'].setValue('aaaa');
+      let result = service.onControlError(<any>servicePopupDataModel, form, true, false);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('onControlError should return true if lcpRegions is empty', (done: DoneFn) => {
+      servicePopupDataModel.vnfPopupDataModel['lcpRegions'] = [];
+      let result = service.onControlError(<any>servicePopupDataModel, form, true, false);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('onControlError should return true if isNotUniqueVolumeGroupName is true', (done: DoneFn) => {
+      let result = service.onControlError(<any>servicePopupDataModel, form, true, true);
+      expect(result).toBeTruthy();
+      done();
+    })
+  });
+
+
+  function generateServicePopupDataModel() {
+    return {
+      'vnfPopupDataModel': JSON.parse('{"tenants" : [1,2,3],"lcpRegions":[1,2,3],"lcpRegionsTenantsMap":{},"productFamilies":[1,2,3],"lineOfBusinesses":[{"id":"ECOMP","name":"ECOMP"},{"id":"zzz1","name":"zzz1"}],"platforms":[{"id":"platform","name":"platform"},{"id":"xxx1","name":"xxx1"}],"rollbackOnFailure":[{"id":"true","name":"Rollback"}]}')
+    }
+  }
+
+  function generateFormGroup() {
+    return new FormGroup({
+      productFamilyId: new FormControl(),
+      lcpCloudRegionId: new FormControl(Validators.required),
+      tenantId: new FormControl({value: null, disabled: false}, Validators.required),
+      legacyRegion: new FormControl(),
+      lineOfBusiness: new FormControl(),
+      platformName: new FormControl(Validators.required),
+      instanceName: new FormControl({value: null}, Validators.compose([Validators.required, NumbersLettersUnderscoreValidator.valid]))
+    });
+  }
+
+  function generateModelData() {
+    return JSON.parse(JSON.stringify(
+      {
+      'service': {
+        'uuid': '2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd',
+        'invariantUuid': 'e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0',
+        'name': 'action-data',
+        'version': '1.0',
+        'toscaModelURL': null,
+        'category': '',
+        'serviceType': '',
+        'serviceRole': '',
+        'description': '',
+        'serviceEcompNaming': 'true',
+        'instantiationType': 'ClientConfig',
+        'inputs': {
+          '2017488_adiodvpe0_ASN': {
+            'type': 'string',
+            'description': 'AV/PE',
+            'entry_schema': null,
+            'constraints': [],
+            'required': true,
+            'default': 'AV_vPE'
+          },
+          'adiodvpe0_bandwidth': {
+            'type': 'string',
+            'description': 'Requested VPE bandwidth',
+            'entry_schema': null,
+            'constraints': [],
+            'required': true,
+            'default': '10'
+          },
+          '2017488_adiodvpe0_vnf_instance_name': {
+            'type': 'string',
+            'description': 'The hostname assigned to the vpe.',
+            'entry_schema': null,
+            'constraints': [],
+            'required': true,
+            'default': 'mtnj309me6'
+          },
+          '2017488_adiodvpe0_vnf_config_template_version': {
+            'type': 'string',
+            'description': 'VPE Software Version',
+            'entry_schema': null,
+            'constraints': [],
+            'required': true,
+            'default': '17.2'
+          },
+          '2017488_adiodvpe0_AIC_CLLI': {
+            'type': 'string',
+            'description': 'AIC Site CLLI',
+            'entry_schema': null,
+            'constraints': [],
+            'required': true,
+            'default': 'ATLMY8GA'
+          },
+          'adiodvpe0_bandwidth_units': {
+            'type': 'string',
+            'description': 'Units of bandwidth',
+            'entry_schema': null,
+            'constraints': [],
+            'required': true,
+            'default': 'Gbps'
+          }
+        }
+      },
+      'vnfs': {
+        '2017-388_ADIOD-vPE 1': {
+          'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413',
+          'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d',
+          'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
+          'name': '2017-388_ADIOD-vPE',
+          'version': '1.0',
+          'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a',
+          'inputs': {
+            'vnf_config_template_version': {
+              'type': 'string',
+              'description': 'VPE Software Version',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': '17.2'
+            },
+            'bandwidth_units': {
+              'type': 'string',
+              'description': 'Units of bandwidth',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'Gbps'
+            },
+            'bandwidth': {
+              'type': 'string',
+              'description': 'Requested VPE bandwidth',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': '10'
+            },
+            'AIC_CLLI': {
+              'type': 'string',
+              'description': 'AIC Site CLLI',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'ATLMY8GA'
+            },
+            'ASN': {
+              'type': 'string',
+              'description': 'AV/PE',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'AV_vPE'
+            },
+            'vnf_instance_name': {
+              'type': 'string',
+              'description': 'The hostname assigned to the vpe.',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'mtnj309me6'
+            }
+          },
+          'commands': {
+            'vnf_config_template_version': {
+              'displayName': 'vnf_config_template_version',
+              'command': 'get_input',
+              'inputName': '2017488_adiodvpe0_vnf_config_template_version'
+            },
+            'bandwidth_units': {
+              'displayName': 'bandwidth_units',
+              'command': 'get_input',
+              'inputName': 'adiodvpe0_bandwidth_units'
+            },
+            'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
+            'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
+            'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
+            'vnf_instance_name': {
+              'displayName': 'vnf_instance_name',
+              'command': 'get_input',
+              'inputName': '2017488_adiodvpe0_vnf_instance_name'
+            }
+          },
+          'properties': {
+            'vmxvre_retype': 'RE-VMX',
+            'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
+            'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
+            'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
+            'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
+            'int_ctl_net_name': 'VMX-INTXI',
+            'vmx_int_ctl_prefix': '128.0.0.0',
+            'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
+            'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
+            'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
+            'nf_type': 'vPE',
+            'vmxvpfe_int_ctl_ip_1': '128.0.0.16',
+            'is_AVPN_service': 'false',
+            'vmx_RSG_name': 'vREXI-affinity',
+            'vmx_int_ctl_forwarding': 'l2',
+            'vmxvre_oam_ip_0': '10.40.123.5',
+            'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
+            'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
+            'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
+            'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
+            'vmxvre_instance': '0',
+            'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvre_flavor_name': 'ns.c1r16d32.v5',
+            'vmxvpfe_volume_size_0': '40.0',
+            'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
+            'nf_naming': '{ecomp_generated_naming=true}',
+            'nf_naming_code': 'Navneet',
+            'vmxvre_name_0': 'vREXI',
+            'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
+            'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
+            'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
+            'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
+            'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
+            'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
+            'vmxvre_console': 'vidconsole',
+            'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
+            'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
+            'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
+            'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
+            'vf_module_id': '123',
+            'nf_function': 'JAI',
+            'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
+            'vmxvre_int_ctl_ip_0': '128.0.0.1',
+            'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
+            'vnf_name': 'mtnj309me6vre',
+            'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
+            'vmxvre_volume_type_1': 'HITACHI',
+            'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
+            'vmxvre_volume_type_0': 'HITACHI',
+            'vmxvpfe_volume_type_0': 'HITACHI',
+            'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
+            'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
+            'vnf_id': '123',
+            'vmxvre_oam_prefix': '24',
+            'availability_zone_0': 'mtpocfo-kvm-az01',
+            'ASN': 'get_input:2017488_adiodvpe0_ASN',
+            'vmxvre_chassis_i2cid': '161',
+            'vmxvpfe_name_0': 'vPFEXI',
+            'bandwidth': 'get_input:adiodvpe0_bandwidth',
+            'availability_zone_max_count': '1',
+            'vmxvre_volume_size_0': '45.0',
+            'vmxvre_volume_size_1': '50.0',
+            'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
+            'vmxvre_oam_gateway': '10.40.123.1',
+            'vmxvre_volume_name_1': 'vREXI_FAVolume',
+            'vmxvre_ore_present': '0',
+            'vmxvre_volume_name_0': 'vREXI_FBVolume',
+            'vmxvre_type': '0',
+            'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
+            'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
+            'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
+            'vmx_int_ctl_len': '24',
+            'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
+            'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
+            'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
+            'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
+            'nf_role': 'Testing',
+            'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
+            'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
+            'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
+          },
+          'type': 'VF',
+          'modelCustomizationName': '2017-388_ADIOD-vPE 1',
+          'vfModules': {},
+          'volumeGroups': {}
+        },
+        '2017-388_ADIOD-vPE 0': {
+          'uuid': 'afacccf6-397d-45d6-b5ae-94c39734b168',
+          'invariantUuid': '72e465fe-71b1-4e7b-b5ed-9496118ff7a8',
+          'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
+          'name': '2017-388_ADIOD-vPE',
+          'version': '4.0',
+          'customizationUuid': 'b3c76f73-eeb5-4fb6-9d31-72a889f1811c',
+          'inputs': {
+            'vnf_config_template_version': {
+              'type': 'string',
+              'description': 'VPE Software Version',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': '17.2'
+            },
+            'bandwidth_units': {
+              'type': 'string',
+              'description': 'Units of bandwidth',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'Gbps'
+            },
+            'bandwidth': {
+              'type': 'string',
+              'description': 'Requested VPE bandwidth',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': '10'
+            },
+            'AIC_CLLI': {
+              'type': 'string',
+              'description': 'AIC Site CLLI',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'ATLMY8GA'
+            },
+            'ASN': {
+              'type': 'string',
+              'description': 'AV/PE',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'AV_vPE'
+            },
+            'vnf_instance_name': {
+              'type': 'string',
+              'description': 'The hostname assigned to the vpe.',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'mtnj309me6'
+            }
+          },
+          'commands': {
+            'vnf_config_template_version': {
+              'displayName': 'vnf_config_template_version',
+              'command': 'get_input',
+              'inputName': '2017488_adiodvpe0_vnf_config_template_version'
+            },
+            'bandwidth_units': {
+              'displayName': 'bandwidth_units',
+              'command': 'get_input',
+              'inputName': 'adiodvpe0_bandwidth_units'
+            },
+            'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
+            'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
+            'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
+            'vnf_instance_name': {
+              'displayName': 'vnf_instance_name',
+              'command': 'get_input',
+              'inputName': '2017488_adiodvpe0_vnf_instance_name'
+            }
+          },
+          'properties': {
+            'vmxvre_retype': 'RE-VMX',
+            'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
+            'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
+            'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
+            'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
+            'int_ctl_net_name': 'VMX-INTXI',
+            'vmx_int_ctl_prefix': '128.0.0.0',
+            'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
+            'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
+            'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
+            'nf_type': 'vPE',
+            'vmxvpfe_int_ctl_ip_1': '128.0.0.16',
+            'is_AVPN_service': 'false',
+            'vmx_RSG_name': 'vREXI-affinity',
+            'vmx_int_ctl_forwarding': 'l2',
+            'vmxvre_oam_ip_0': '10.40.123.5',
+            'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
+            'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
+            'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
+            'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
+            'vmxvre_instance': '0',
+            'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvre_flavor_name': 'ns.c1r16d32.v5',
+            'vmxvpfe_volume_size_0': '40.0',
+            'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
+            'nf_naming': '{ecomp_generated_naming=true}',
+            'nf_naming_code': 'Navneet',
+            'vmxvre_name_0': 'vREXI',
+            'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
+            'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
+            'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
+            'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
+            'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
+            'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
+            'vmxvre_console': 'vidconsole',
+            'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
+            'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
+            'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
+            'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
+            'vf_module_id': '123',
+            'nf_function': 'JAI',
+            'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
+            'vmxvre_int_ctl_ip_0': '128.0.0.1',
+            'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
+            'vnf_name': 'mtnj309me6vre',
+            'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
+            'vmxvre_volume_type_1': 'HITACHI',
+            'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
+            'vmxvre_volume_type_0': 'HITACHI',
+            'vmxvpfe_volume_type_0': 'HITACHI',
+            'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
+            'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
+            'vnf_id': '123',
+            'vmxvre_oam_prefix': '24',
+            'availability_zone_0': 'mtpocfo-kvm-az01',
+            'ASN': 'get_input:2017488_adiodvpe0_ASN',
+            'vmxvre_chassis_i2cid': '161',
+            'vmxvpfe_name_0': 'vPFEXI',
+            'bandwidth': 'get_input:adiodvpe0_bandwidth',
+            'availability_zone_max_count': '1',
+            'vmxvre_volume_size_0': '45.0',
+            'vmxvre_volume_size_1': '50.0',
+            'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
+            'vmxvre_oam_gateway': '10.40.123.1',
+            'vmxvre_volume_name_1': 'vREXI_FAVolume',
+            'vmxvre_ore_present': '0',
+            'vmxvre_volume_name_0': 'vREXI_FBVolume',
+            'vmxvre_type': '0',
+            'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
+            'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
+            'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
+            'vmx_int_ctl_len': '24',
+            'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
+            'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
+            'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
+            'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
+            'nf_role': 'Testing',
+            'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
+            'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
+            'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
+          },
+          'type': 'VF',
+          'modelCustomizationName': '2017-388_ADIOD-vPE 0',
+          'vfModules': {},
+          'volumeGroups': {}
+        },
+        '2017488_ADIODvPE 0': {
+          'uuid': '69e09f68-8b63-4cc9-b9ff-860960b5db09',
+          'invariantUuid': '72e465fe-71b1-4e7b-b5ed-9496118ff7a8',
+          'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
+          'name': '2017488_ADIODvPE',
+          'version': '5.0',
+          'customizationUuid': '1da7b585-5e61-4993-b95e-8e6606c81e45',
+          'inputs': {
+            'vnf_config_template_version': {
+              'type': 'string',
+              'description': 'VPE Software Version',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': '17.2'
+            },
+            'bandwidth_units': {
+              'type': 'string',
+              'description': 'Units of bandwidth',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'Gbps'
+            },
+            'bandwidth': {
+              'type': 'string',
+              'description': 'Requested VPE bandwidth',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': '10'
+            },
+            'AIC_CLLI': {
+              'type': 'string',
+              'description': 'AIC Site CLLI',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'ATLMY8GA'
+            },
+            'ASN': {
+              'type': 'string',
+              'description': 'AV/PE',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'AV_vPE'
+            },
+            'vnf_instance_name': {
+              'type': 'string',
+              'description': 'The hostname assigned to the vpe.',
+              'entry_schema': null,
+              'constraints': [],
+              'required': true,
+              'default': 'mtnj309me6'
+            }
+          },
+          'commands': {
+            'vnf_config_template_version': {
+              'displayName': 'vnf_config_template_version',
+              'command': 'get_input',
+              'inputName': '2017488_adiodvpe0_vnf_config_template_version'
+            },
+            'bandwidth_units': {
+              'displayName': 'bandwidth_units',
+              'command': 'get_input',
+              'inputName': 'adiodvpe0_bandwidth_units'
+            },
+            'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
+            'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
+            'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
+            'vnf_instance_name': {
+              'displayName': 'vnf_instance_name',
+              'command': 'get_input',
+              'inputName': '2017488_adiodvpe0_vnf_instance_name'
+            }
+          },
+          'properties': {
+            'vmxvre_retype': 'RE-VMX',
+            'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
+            'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
+            'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
+            'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
+            'int_ctl_net_name': 'VMX-INTXI',
+            'vmx_int_ctl_prefix': '128.0.0.0',
+            'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
+            'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
+            'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
+            'nf_type': 'vPE',
+            'vmxvpfe_int_ctl_ip_1': '128.0.0.16',
+            'is_AVPN_service': 'false',
+            'vmx_RSG_name': 'vREXI-affinity',
+            'vmx_int_ctl_forwarding': 'l2',
+            'vmxvre_oam_ip_0': '10.40.123.5',
+            'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
+            'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
+            'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
+            'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
+            'vmxvre_instance': '0',
+            'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvre_flavor_name': 'ns.c1r16d32.v5',
+            'vmxvpfe_volume_size_0': '40.0',
+            'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
+            'nf_naming': '{ecomp_generated_naming=true}',
+            'nf_naming_code': 'Navneet',
+            'vmxvre_name_0': 'vREXI',
+            'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
+            'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
+            'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
+            'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
+            'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
+            'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
+            'vmxvre_console': 'vidconsole',
+            'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
+            'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
+            'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
+            'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
+            'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
+            'vf_module_id': '123',
+            'nf_function': 'JAI',
+            'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
+            'vmxvre_int_ctl_ip_0': '128.0.0.1',
+            'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
+            'vnf_name': 'mtnj309me6vre',
+            'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
+            'vmxvre_volume_type_1': 'HITACHI',
+            'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
+            'vmxvre_volume_type_0': 'HITACHI',
+            'vmxvpfe_volume_type_0': 'HITACHI',
+            'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
+            'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
+            'vnf_id': '123',
+            'vmxvre_oam_prefix': '24',
+            'availability_zone_0': 'mtpocfo-kvm-az01',
+            'ASN': 'get_input:2017488_adiodvpe0_ASN',
+            'vmxvre_chassis_i2cid': '161',
+            'vmxvpfe_name_0': 'vPFEXI',
+            'bandwidth': 'get_input:adiodvpe0_bandwidth',
+            'availability_zone_max_count': '1',
+            'vmxvre_volume_size_0': '45.0',
+            'vmxvre_volume_size_1': '50.0',
+            'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
+            'vmxvre_oam_gateway': '10.40.123.1',
+            'vmxvre_volume_name_1': 'vREXI_FAVolume',
+            'vmxvre_ore_present': '0',
+            'vmxvre_volume_name_0': 'vREXI_FBVolume',
+            'vmxvre_type': '0',
+            'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
+            'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
+            'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
+            'vmx_int_ctl_len': '24',
+            'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
+            'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
+            'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
+            'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
+            'nf_role': 'Testing',
+            'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
+            'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
+            'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
+          },
+          'type': 'VF',
+          'modelCustomizationName': '2017488_ADIODvPE 0',
+          'vfModules': {
+            '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1': {
+              'uuid': '25284168-24bb-4698-8cb4-3f509146eca5',
+              'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1',
+              'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401',
+              'description': null,
+              'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+              'version': '6',
+              'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+              'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+              'commands': {},
+              'volumeGroupAllowed': true,
+              'inputs': {
+                '2017488_adiodvpe0_vnf_config_template_version': {
+                  'type': 'string',
+                  'description': 'VPE Software Version',
+                  'entry_schema': null,
+                  'constraints': [],
+                  'required': true,
+                  'default': '17.2'
+                },
+                '2017488_adiodvpe0_AIC_CLLI': {
+                  'type': 'string',
+                  'description': 'AIC Site CLLI',
+                  'entry_schema': null,
+                  'constraints': [],
+                  'required': true,
+                  'default': 'ATLMY8GA'
+                }
+              }
+            },
+            '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0': {
+              'uuid': 'f8360508-3f17-4414-a2ed-6bc71161e8db',
+              'invariantUuid': 'b34833bb-6aa9-4ad6-a831-70b06367a091',
+              'customizationUuid': 'a55961b2-2065-4ab0-a5b7-2fcee1c227e3',
+              'description': null,
+              'name': '2017488AdiodVpe..ADIOD_base_vPE_BV..module-0',
+              'version': '5',
+              'modelCustomizationName': '2017488AdiodVpe..ADIOD_base_vPE_BV..module-0',
+              'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1},
+              'commands': {},
+              'volumeGroupAllowed': false,
+              'inputs': {
+                '2017488_adiodvpe0_ASN': {
+                  'type': 'string',
+                  'description': 'AV/PE',
+                  'entry_schema': null,
+                  'constraints': [],
+                  'required': true,
+                  'default': 'AV_vPE'
+                },
+                'adiodvpe0_bandwidth': {
+                  'type': 'string',
+                  'description': 'Requested VPE bandwidth',
+                  'entry_schema': null,
+                  'constraints': [],
+                  'required': true,
+                  'default': '10'
+                }
+              }
+            },
+            '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2': {
+              'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a',
+              'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339',
+              'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557',
+              'description': null,
+              'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+              'version': '6',
+              'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+              'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+              'commands': {},
+              'volumeGroupAllowed': true,
+              'inputs': {}
+            }
+          },
+          'volumeGroups': {
+            '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1': {
+              'uuid': '25284168-24bb-4698-8cb4-3f509146eca5',
+              'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1',
+              'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401',
+              'description': null,
+              'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+              'version': '6',
+              'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+              'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}
+            },
+            '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2': {
+              'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a',
+              'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339',
+              'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557',
+              'description': null,
+              'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+              'version': '6',
+              'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+              'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0}
+            }
+          }
+        }
+      },
+      'vfModules': {
+        '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vRE_BV..module-1': {
+          'uuid': '25284168-24bb-4698-8cb4-3f509146eca5',
+          'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1',
+          'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401',
+          'description': null,
+          'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+          'version': '6',
+          'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+          'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+          'commands': {},
+          'volumeGroupAllowed': true
+        },
+        '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_base_vPE_BV..module-0': {
+          'uuid': 'f8360508-3f17-4414-a2ed-6bc71161e8db',
+          'invariantUuid': 'b34833bb-6aa9-4ad6-a831-70b06367a091',
+          'customizationUuid': 'a55961b2-2065-4ab0-a5b7-2fcee1c227e3',
+          'description': null,
+          'name': '2017488AdiodVpe..ADIOD_base_vPE_BV..module-0',
+          'version': '5',
+          'modelCustomizationName': '2017488AdiodVpe..ADIOD_base_vPE_BV..module-0',
+          'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1},
+          'commands': {},
+          'volumeGroupAllowed': false
+        },
+        '2017488_adiodvpe0..2017488AdiodVpe..ADIOD_vPFE_BV..module-2': {
+          'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a',
+          'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339',
+          'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557',
+          'description': null,
+          'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+          'version': '6',
+          'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+          'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+          'commands': {},
+          'volumeGroupAllowed': true
+        }
+      },
+      'networks': {},
+      'collectionResource': {},
+      'configurations': {},
+      'serviceProxies': {},
+      'pnfs': {}
+    }
+    ))
+  }
+
+});
diff --git a/vid-webpack-master/src/app/configuration/vid.configuration.ts b/vid-webpack-master/src/app/configuration/vid.configuration.ts
new file mode 100644 (file)
index 0000000..2430d3b
--- /dev/null
@@ -0,0 +1,98 @@
+export class VidConfiguration {
+
+  public static VNF_STATUS_CHECK_ENABLED = false;
+
+  /*
+   * UPLOAD_SUPPLEMENTARY_STATUS_CHECK_ENABLED: Determines the Property to Govern Presence of
+   * Upload Supplementary File on Volume Group Screen.
+   * Set to false, to disable the check.
+   */
+  public static UPLOAD_SUPPLEMENTARY_STATUS_CHECK_ENABLED = false;
+
+  /*
+   * List of valid VNF status combinations
+   */
+  public static VNF_VALID_STATUS_LIST = [
+    {
+      'provStatus': 'preprov',
+      'orchestrationStatus': 'pending-create',
+      'inMaint': false,
+      'operationalStatus': null
+    },
+    {
+      'provStatus': 'preprov',
+      'orchestrationStatus': 'created',
+      'inMaint': false,
+      'operationalStatus': null
+    },
+    {
+      'provStatus': 'preprov',
+      'orchestrationStatus': 'active',
+      'inMaint': false,
+      'operationalStatus': null
+    },
+    {
+      'provStatus': 'nvtprov',
+      'orchestrationStatus': 'active',
+      'inMaint': false,
+      'operationalStatus': null
+    },
+    {
+      'provStatus': 'prov',
+      'orchestrationStatus': 'active',
+      'inMaint': false,
+      'operationalStatus': 'out-of-service-path'
+    },
+    {
+      'provStatus': 'prov',
+      'orchestrationStatus': 'activated',
+      'inMaint': false,
+      'operationalStatus': 'out-of-service-path'
+    }
+  ];
+
+  /*
+   * The model status VID uses to query SDC for a list of models. The possible values are:
+   * DISTRIBUTION_NOT_APPROVED,
+   * DISTRIBUTION_APPROVED,
+   * DISTRIBUTED,
+   * DISTRIBUTION_REJECTED,
+   * ALL,
+   * In the production env, this should always be set to DISTRIBUTED
+   */
+  public static ASDC_MODEL_STATUS = 'DISTRIBUTED';
+
+  /*
+   * Max number of times that VID will poll MSO for a given request status
+   */
+  public static MSO_MAX_POLLS = 10;
+
+  /*
+   * Number of msecs that VID will wait between MSO polls.
+   */
+  public static MSO_POLLING_INTERVAL_MSECS = 10000;
+
+  public static SCHEDULER_POLLING_INTERVAL_MSECS = 10000;
+
+  public static SCHEDULER_MAX_POLLS = 10;
+
+  public static COMPONENT_LIST_NAMED_QUERY_ID = '0367193e-c785-4d5f-9cb8-7bc89dc9ddb7';
+
+  /*
+   * List of all service model invariant UUIDs that need macro instantiation.
+   * Example:
+   * MACRO_SERVICES : ['3cf30cbb-5fe7-4fb3-b049-559a4997b221', 'b135a703-bab5-4295-a37f-580a4f2d0961']
+   *
+   */
+  public static MACRO_SERVICES = ['c9514b73-3dfe-4d7e-9146-b318d48655d9', '93150ffa-00c6-4ea0-85f2-3536ca46ebd2',
+    '2b54297f-72e7-4a94-b451-72df88d0be0b',
+    'd27e42cf-087e-4d31-88ac-6c4b7585f800',
+    'ec0c4bab-c272-4dab-b087-875031bb0c9f', '0311f998-9268-4fd6-bbba-afff15087b72',
+    '43596836-ae36-4608-a987-6608ede10dac', '306caa85-74c7-48a9-aa22-7e3a564b957a',
+    'e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0'];
+
+  public static SCHEDULER_CALLBACK_URL = 'https://vid-web-ete.ecomp.cci.att.com:8000/vid/change-management/workflow/';
+
+  public static SCHEDULER_PORTAL_URL = 'http://www.ecomp.att.com';
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.html
new file mode 100644 (file)
index 0000000..5eb9773
--- /dev/null
@@ -0,0 +1,35 @@
+<div class="available-models-tree">
+  <h5>
+    <span>SERVICE MODEL:</span>
+    <span id="service-model-name">{{service | serviceInfo: _store: serviceModelId : 'name'}}</span>
+  </h5>
+  <div class="available-models-content-wrapper">
+    <div class="search-container">
+      <input [attr.data-tests-id]="'search-left-tree'"  #filter (keyup)="searchTree(filter.value, $event)" placeholder="Filter..."/>
+      <span class="icon-search"></span>
+    </div>
+
+    <tree-root #tree [attr.data-tests-id]="'available-models-tree'" [nodes]="nodes" [options]="options">
+      <ng-template #treeNodeTemplate let-node let-index="index">
+        <div [attr.data-tests-id]="'node-'+node.data.name" (click)="selectNode(node)" [ngClass]="{'selected': index , 'isParent': node.data.type !== 'VFmodule' , 'isChild': node.data.type === 'VFmodule' }">
+          <span class="vf-type">{{node.data.type.substring(0,1)}}</span>
+          <span class="span-name" [innerHTML]=" isFilterEnabled ? (node.data.name | highlight : filter.value) : (node.data.name)"></span>
+          <span class="actions">
+            <span class="number-button" *ngIf="isShowNodeCount(node)">
+              <span>{{getNodeCount(node)}}</span>
+            </span>
+            <span class="icon-v" *ngIf="isShowIconV(node)">
+              <span ></span>
+            </span>
+            <span class="icon-plus" *ngIf="isShowIconAdd(node)">
+              <span tooltip="Add" [attr.data-tests-id]="'node-'+node.data.name+'-add-btn'" (click)="onClickAdd($event,node)">
+                <i class="fa fa-plus-circle" aria-hidden="true"></i>
+              </span>
+            </span>
+          </span>
+       </div>
+      </ng-template>
+    </tree-root>
+
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.scss
new file mode 100644 (file)
index 0000000..44f9410
--- /dev/null
@@ -0,0 +1,398 @@
+available-models-tree {
+  .available-models-tree {
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    line-height: 14px;
+    border-right: #D2D2D2 1.5px solid;
+    min-width: 340px;
+    h5 {
+      font-family: OpenSans-Semibold;
+      color: #5A5A5A;
+      background-color: #F2F2F2;
+      margin: 0;
+      padding: 15px;
+      padding-left: 20px;
+      span {
+        vertical-align: middle;
+        &:first-child {
+          font-size: 12px;
+          color: #191919;
+        }
+      }
+    }
+    .available-models-content-wrapper {
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      padding: 20px;
+      background-color: #F2F2F2;
+      .search-container {
+        margin-bottom: 30px;
+        width: 100%;
+        display: flex;
+        background: #FFFFFF;
+        border: 1px solid #D2D2D2;
+        border-radius: 2px;
+        height: 40px;
+        min-width: 40px;
+        font-family: OpenSans-Italic;
+        color: #959595;
+        input {
+          flex: 1;
+          border: 0;
+          padding-left: 10px;
+          outline: 0;
+        }
+        .icon-search {
+          display: flex;
+          width: 40px;
+          &:after {
+            content: "\e92e";
+            cursor: pointer;
+            font-size: 20px;
+            font-weight: 600;
+            text-align: center;
+            display: inline-block;
+            flex: auto;
+            align-self: center;
+          }
+        }
+      }
+      tree-root {
+        flex: 1;
+        display: flex;
+      }
+      tree-viewport {
+        flex: 1;
+        height: auto;
+        overflow: auto;
+        padding-top: 5px;
+        .tree-node {
+          color: #5A5A5A;
+          font-size: 13px;
+          white-space: normal;
+          word-break: break-all;
+          tree-node-drop-slot {
+            .node-drop-slot {
+              display: none;
+            }
+          }
+          &.tree-node-disabled {
+            color: #D2D2D2;
+            cursor: default;
+            pointer-events: none;
+          }
+          &:not(.tree-node-disabled) {
+            >tree-node-wrapper {
+              .node-wrapper:hover {
+                color: #009FDB;
+                .node-content-wrapper {
+                  tree-node-content {
+                    > div {
+                      span.actions {
+                        .number-button {
+                          span {
+                            //background-color: #009FDB;
+                          }
+                        }
+                        .icon-plus span:before {
+                          display: inline-block;
+                          color: #5A5A5A;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+          &.tree-node-focused:not(.tree-node-disabled)  {
+            & > tree-node-wrapper {
+              .node-wrapper {
+                color: #009FDB;
+                .node-content-wrapper-focused,
+                .node-content-wrapper:hover {
+                  background: none;
+                  box-shadow: none;
+                  tree-node-content {
+                    > div {
+                      span.actions {
+                        .number-button {
+                          span {
+                            //background-color: #009FDB;
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+          tree-node-wrapper {
+            .node-wrapper {
+              height: 36px;
+              tree-node-expander {
+                font-family: 'icomoon' !important;
+                height: 100%;
+                .toggle-children-wrapper {
+                  padding: 0;
+                  display: block;
+                  height: 100%;
+                  span.toggle-children {
+                    display: flex;
+                    width: 20px;
+                    top: 0;
+                    height: inherit;
+                    background-image: none;
+                    &:before {
+                      content: "\e900";
+                      font-weight: 600;
+                      text-align: center;
+                      display: inline-block;
+                      flex: auto;
+                      align-self: center;
+                      font-size: 20px;
+                    }
+                  }
+                }
+                .toggle-children-wrapper-expanded {
+                  span.toggle-children {
+                    transform: none;
+                    &:before {
+                      content: "\e930";
+                    }
+                  }
+                }
+                .toggle-children-placeholder {
+                  width: 20px;
+                }
+              }
+              .node-content-wrapper {
+                padding: 0;
+                background: none;
+                box-shadow: none;
+                height: 100%;
+                flex: 1;
+                min-width: 0;
+                border-left: 1px solid #D2D2D2;
+                tree-node-content {
+                  > div {
+                    height: 100%;
+                    display: flex;
+                    align-items: center;
+                    justify-content: space-between;
+                    padding-left: 10px;
+                    span {
+                      &.actions {
+                        height: 100%;
+                        display: flex;
+                        justify-content: space-between;
+                        align-items: center;
+                        >span {
+                          width: 45px;
+                          max-width: 45px;
+                          text-align: center;
+                        }
+                        .number-button {
+                          width: 30px;
+                          padding-left: 0;
+                          text-align: center;
+                          span {
+                            display: block;
+                            font-size: 11px;
+                          }
+                        }
+                        .icon-v {
+                          width: 45px;
+                          span:before {
+                            content: "\e932";
+                            color: #5A5A5A;
+                            font-size: 16px;
+                            text-align: center;
+                            display: inline-block;
+                            vertical-align: baseline;
+                          }
+                        }
+                        .icon-plus {
+                          width: 45px;
+                          span {
+                            &:before {
+                              //content: "\e901";
+                              //fill:#009FDB;
+                              //color: #009FDB;
+                              //font-size: 16px;
+                              //text-align: center;
+                              //display: none;
+                              //vertical-align: baseline;
+                            }
+                            &:hover:before {
+                              //color: #009FDB !important;
+
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+
+            }
+          }
+          tree-node-children {
+            .tree-children {
+              padding-left: 20px;
+            }
+          }
+        }
+      }
+
+    }
+  }
+}
+.highlight {
+  background-color: #9DD9EF;
+}
+
+#drawing-board-tree{
+  .tree-node.tree-node-expanded.tree-node-focused {
+    border: 1px solid #009FDB;
+  }
+
+}
+
+available-models-tree {
+
+  .tree-root {
+    margin-top: 35px;
+  }
+
+  tree-node-expander {
+    background: #FFFFFF;
+    border: 1px solid #D2D2D2;
+    border-right: none;
+    width: 45px;
+    padding-left: 12px;
+  }
+
+  .node-content-wrapper {
+    border: none;
+  }
+
+  tree-node-wrapper tree-node-expander{
+    background: none !important;
+    border: none !important;
+  }
+
+  tree-node-content div {
+    background: white;
+  }
+
+  .node-wrapper {
+    height: 45px !important;
+    background: #FFFFFF;
+    border: 1px solid #D2D2D2;
+  }
+
+  tree-node-collection div {
+    margin-top: 0px;
+  }
+
+  .tree-node-leaf .node-wrapper tree-node-expander {
+    display: none;
+  }
+
+  .tree-children  {
+    padding: 20px;
+  }
+
+  .tree-node.tree-node-expanded.tree-node-focused {
+    border: 1px solid #009FDB;
+  }
+
+  .tree-node.tree-node-expanded {
+    border: 1px solid rgba(128, 128, 128, 0.72);
+    margin-bottom: 10px;
+  }
+
+  .tree-children {
+    padding-left: 0;
+  }
+
+  tree-node-content .actions .number-button {
+    height: 45px;
+    padding-top: 14px;
+    border: 1px solid #D2D2D2;
+    padding-left: 0;
+    span {
+      background: none;
+      font-size: 11px;
+      color: #5A5A5A;
+    }
+  }
+
+
+
+  .node-content-wrapper.node-content-wrapper-focused tree-node-content div{
+    background: #009FDB !important;
+    color: white;
+
+    .isParent {
+      border-left: 1px solid #009FDB;
+    }
+
+    .number-button span{
+      color: white !important;
+    }
+
+    .icon-v span:before{
+      color: white !important;
+    }
+  }
+
+  .vf-type {
+    width: 20px;
+    height: 45px;
+    padding-top: 16px;
+    border-right: 1px solid #D2D2D2;
+
+  }
+
+  .isParent {
+    width: 100%;
+    padding-left: 5px;
+  }
+
+  .tree-node-expanded .isChild .vf-type {
+    display: none;
+  }
+
+  .isParent .span-name {
+    width: 100%;
+    padding-left: 10px;
+  }
+
+  .toggle-children-wrapper.toggle-children-wrapper-expanded {
+    .toggle-children:before {
+      color: #009FDB;
+    }
+  }
+
+  .tree-node.tree-node-expanded .tree-children {
+    border: 1px solid rgba(128, 128, 128, 0.72);
+  }
+
+  .tree-node.tree-node-expanded.tree-node-focused .tree-children {
+    border: 1px solid #009fdb;
+  }
+
+  .tree-node-leaf .node-wrapper{
+    margin-left: 45px;
+    border-left: none;
+  }
+}
+
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.component.ts
new file mode 100644 (file)
index 0000000..4e5819e
--- /dev/null
@@ -0,0 +1,166 @@
+import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
+import {ITreeOptions, TreeComponent} from 'angular-tree-component';
+import '../../../../node_modules/angular-tree-component/dist/angular-tree-component.css';
+import {IDType, ITreeNode} from 'angular-tree-component/dist/defs/api';
+import {DialogService} from 'ng2-bootstrap-modal';
+import {AvailableModelsTreeService} from './available-models-tree.service';
+import {NgRedux} from "@angular-redux/store";
+import {ActivatedRoute} from '@angular/router';
+import {AppState} from '../../store/reducers';
+import {AaiService} from '../../services/aaiService/aai.service';
+import {ServicePlanningService} from '../../services/service-planning.service';
+import {VnfPopupComponent} from '../../components/vnf-popup/vnf-popup.components';
+import {ServiceNodeTypes} from '../../shared/models/ServiceNodeTypes';
+import {VfModuleMap} from '../../shared/models/vfModulesMap';
+import {IframeService} from "../../shared/utils/iframe.service";
+import {createVFModuleInstance} from "../../service.actions";
+import {DefaultDataGeneratorService} from "../../shared/services/defaultDataServiceGenerator/default.data.generator.service";
+
+
+@Component({
+  selector: 'available-models-tree',
+  templateUrl: './available-models-tree.component.html',
+  styleUrls: ['./available-models-tree.component.scss']
+})
+
+
+export class AvailableModelsTreeComponent{
+
+  serviceModelId: string;
+  serviceHierarchy;
+  parentElementClassName = 'content';
+  _store : NgRedux<AppState>;
+  constructor(private _servicePlanningService: ServicePlanningService,
+              private _iframeService: IframeService,
+              private _aaiService: AaiService,
+              private route: ActivatedRoute,
+              private dialogService: DialogService,
+              private _availableModelsTreeService: AvailableModelsTreeService,
+              private _defaultDataGeneratorService: DefaultDataGeneratorService,
+              private  store: NgRedux<AppState>) {
+    this._store = store;
+    this.route
+      .queryParams
+      .subscribe(params => {
+        this.serviceModelId = params['serviceModelId'];
+        this._aaiService.getServiceModelById(this.serviceModelId).subscribe(
+          value => {
+            this.serviceHierarchy = value;
+            this.nodes = this._servicePlanningService.convertServiceModelToTreeNodes(this.serviceHierarchy);
+          },
+          error => {
+            console.log('error is ', error)
+          }
+        );
+      });
+
+  }
+
+  @Output()
+  highlightInstances: EventEmitter<number> = new EventEmitter<number>();
+  @ViewChild('tree') tree: TreeComponent;
+
+  nodes = [];
+  service = {name: ''};
+  isFilterEnabled: boolean = false;
+
+  options: ITreeOptions = {
+    nodeHeight: 36,
+    dropSlotHeight: 0,
+    nodeClass: (node: ITreeNode) => {
+      if(node.data.type === ServiceNodeTypes.VFmodule && !this.getNodeCount(node.parent))
+      {
+        node.data.disabled = true;
+        return 'tree-node tree-node-disabled';
+      }
+      node.data.disabled = false;
+      return 'tree-node';
+    }
+  };
+
+  expandParentByNodeId(id: IDType): void {
+    this.tree.treeModel.getNodeById(id).parent.expand();
+  }
+
+  searchTree(searchText: string, event: KeyboardEvent): void {
+    if (searchText === '') {
+      return;
+    }
+    this.isFilterEnabled = event.key === 'Delete' || event.key === 'Backspace' || searchText.length > 1;
+    if (this.isFilterEnabled) {
+      let __this = this;
+      let results: ITreeNode[] = [];
+      this.nodes.forEach(function (node) {
+        __this.searchTreeNode(node, searchText, results);
+      });
+      results.forEach(function (result) {
+        __this.expandParentByNodeId(result.id)
+      });
+    }
+  }
+
+  searchTreeNode(node, searchText: string, results): void {
+    if (node.name.toLowerCase().indexOf(searchText.toLowerCase()) != -1) {
+      results.push(node);
+    }
+    if (node.children != null) {
+      for (let i = 0; i < node.children.length; i++) {
+        this.searchTreeNode(node.children[i], searchText, results);
+      }
+    }
+  }
+
+  selectNode(node: ITreeNode): void {
+    node.expand();
+    this.highlightInstances.emit(node.data.id);
+  }
+
+  onClickAdd(e: MouseEvent, node: ITreeNode): void {
+    let data = node.data;
+    let dynamicInputs = data.dynamicInputs;
+    let userProvidedNaming:boolean = data.userProvidedNaming;
+    let type:string = data.type;
+    if(!this.store.getState().global.flags['FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD']|| node.data.type === ServiceNodeTypes.VF || this._availableModelsTreeService.shouldOpenDialog(type, dynamicInputs, userProvidedNaming)) {
+      this._iframeService.addClassOpenModal(this.parentElementClassName);
+      this.dialogService.addDialog(VnfPopupComponent, {
+        serviceModelId: this.serviceModelId,
+        parentModelName: node.parent && node.parent.data.name,
+        modelName: data.name,
+        modelType: type,
+        dynamicInputs: dynamicInputs,
+        userProvidedNaming: userProvidedNaming,
+        isNewVfModule : true
+      });
+     }
+    else {
+      let vfModule = this._defaultDataGeneratorService.generateVFModule(this.serviceHierarchy, node.parent.data.name, node.data.name);
+      this.store.dispatch(createVFModuleInstance(vfModule, node.data.name, this.serviceModelId));
+    }
+    e.preventDefault();
+    e.stopPropagation();
+  }
+
+  getNodeCount(node: ITreeNode): number {
+    let modelName: string = node.data.name;
+    if (ServicePlanningService.isVfModule(node)) {
+      let parentVnfModelName = node.parent.data.name;
+      let vfModuleMap: VfModuleMap = this._servicePlanningService.getVfModuleMap(this.serviceModelId, parentVnfModelName, modelName);
+      return vfModuleMap ? Object.keys(vfModuleMap).length : 0;
+    } else if (ServicePlanningService.isVnf(node)) {
+      let vnfInstance = this._servicePlanningService.getVnfInstance(this.serviceModelId, modelName);
+      return vnfInstance ? 1 : 0;
+    }
+  }
+
+  isShowIconV(node: ITreeNode): boolean {
+    return this.getNodeCount(node) > 0;
+  }
+
+  isShowNodeCount(node: ITreeNode): boolean {
+    return this.getNodeCount(node) > 0;
+  }
+
+  isShowIconAdd(node: ITreeNode): boolean {
+    return this._availableModelsTreeService.shouldShowAddIcon(node, this.store.getState().service.serviceHierarchy, this.serviceModelId, this.getNodeCount(node));
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.spec.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.spec.ts
new file mode 100644 (file)
index 0000000..10cbb0d
--- /dev/null
@@ -0,0 +1,450 @@
+import {TestBed, getTestBed} from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+  HttpTestingController
+} from '@angular/common/http/testing';
+import {AvailableModelsTreeService} from './available-models-tree.service';
+import {ServicePlanningService} from "../../services/service-planning.service";
+import {ServiceNodeTypes} from "../../shared/models/ServiceNodeTypes";
+import {NgRedux} from "@angular-redux/store";
+import {MockAppStore} from "../../services/service-planning.service.spec";
+
+describe('Available Models Tree Service', () => {
+  let injector;
+  let service: AvailableModelsTreeService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [AvailableModelsTreeService,
+        ServicePlanningService,
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+
+    injector = getTestBed();
+    service = injector.get(AvailableModelsTreeService);
+    httpMock = injector.get(HttpTestingController);
+  });
+
+  describe('#shouldShowAddIcon', () => {
+    it('should return true if number of current vnf modules is under the max', (done: DoneFn) => {
+      let treeNode = {
+        data: {
+          children: [],
+          name: 'vf_vmee0..VfVmee..base_vmme..module-0'
+        }
+      };
+
+      let serviceHierarchy = getSericeServiceHierarchy();
+      let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 0);
+      expect(result).toBeTruthy();
+      done();
+    });
+
+    it('should return false if number of current vnf modules are more than max', (done: DoneFn) => {
+      let treeNode = {
+        data: {
+          children: [],
+          name: 'vf_vmee0..VfVmee..base_vmme..module-0'
+        }
+      };
+
+      let serviceHierarchy = getSericeServiceHierarchy();
+      let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 2);
+      expect(result).toBeFalsy();
+      done();
+    });
+
+    it('should return true if number of current vnf modules are more than max and max is null', (done: DoneFn) => {
+      let treeNode = {
+        data: {
+          children: [],
+          name: 'vf_vmee0..VfVmee..base_vmme..module-0'
+        }
+      };
+
+      let serviceHierarchy = getSericeServiceHierarchy();
+      let result = service.shouldShowAddIcon(treeNode, serviceHierarchy, '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 0);
+      expect(result).toBeTruthy();
+      done();
+    });
+  });
+
+  describe('#shouldOpenModalDialogOnAddInstance', () => {
+    let serviceHierarchy = getSericeServiceHierarchy();
+
+    it('should open popup on add instance', (done: DoneFn) => {
+      // add vnf should return true
+      let result = service.shouldOpenDialog(ServiceNodeTypes.VF, [], false);
+      expect(result).toBeTruthy();
+
+      //  add vfModule with user provided naming should return true
+      result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [], true);
+      expect(result).toBeTruthy();
+
+      //  add vfModule with dynamicInputs without defaultValues should return true
+      result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [{
+        id: '2017488_adiodvpe0_vnf_config_template_version',
+        type: 'string',
+        name: '2017488_adiodvpe0_vnf_config_template_version',
+        isRequired: true,
+        description: 'VPE Software Version'
+      }], false);
+      expect(result).toBeTruthy();
+
+      // add vfModule with dynamicInputs with defaultValues should return false
+      result = service.shouldOpenDialog(ServiceNodeTypes.VFmodule, [{
+        id: '2017488_adiodvpe0_vnf_config_template_version',
+        type: 'string',
+        name: '2017488_adiodvpe0_vnf_config_template_version',
+        value: '17.2',
+        isRequired: true,
+        description: 'VPE Software Version'
+      }], false);
+      expect(result).toBeFalsy();
+      done();
+    });
+  });
+
+  function getSericeServiceHierarchy() {
+    return JSON.parse(JSON.stringify(
+      {
+        '6e59c5de-f052-46fa-aa7e-2fca9d674c44': {
+          'service': {
+            'uuid': '6e59c5de-f052-46fa-aa7e-2fca9d674c44',
+            'invariantUuid': 'e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0',
+            'name': 'ComplexService',
+            'version': '1.0',
+            'toscaModelURL': null,
+            'category': 'Mobility',
+            'serviceType': '',
+            'serviceRole': '',
+            'description': 'ComplexService',
+            'serviceEcompNaming': 'true',
+            'instantiationType': 'Macro',
+            'inputs': {}
+          },
+          'vnfs': {
+            'VF_vMee 0': {
+              'uuid': 'd6557200-ecf2-4641-8094-5393ae3aae60',
+              'invariantUuid': '4160458e-f648-4b30-a176-43881ffffe9e',
+              'description': 'VSP_vMee',
+              'name': 'VF_vMee',
+              'version': '2.0',
+              'customizationUuid': '91415b44-753d-494c-926a-456a9172bbb9',
+              'inputs': {},
+              'commands': {},
+              'properties': {
+                'gpb2_Internal2_mac': '00:80:37:0E:02:22',
+                'sctp-b-ipv6-egress_src_start_port': '0',
+                'sctp-a-ipv6-egress_rule_application': 'any',
+                'Internal2_allow_transit': 'true',
+                'sctp-b-IPv6_ethertype': 'IPv6',
+                'sctp-a-egress_rule_application': 'any',
+                'sctp-b-ingress_action': 'pass',
+                'sctp-b-ingress_rule_protocol': 'icmp',
+                'ncb2_Internal1_mac': '00:80:37:0E:0F:12',
+                'sctp-b-ipv6-ingress-src_start_port': '0.0',
+                'ncb1_Internal2_mac': '00:80:37:0E:09:12',
+                'fsb_volume_size_0': '320.0',
+                'sctp-b-egress_src_addresses': 'local',
+                'sctp-a-ipv6-ingress_ethertype': 'IPv4',
+                'sctp-a-ipv6-ingress-dst_start_port': '0',
+                'sctp-b-ipv6-ingress_rule_application': 'any',
+                'domain_name': 'default-domain',
+                'sctp-a-ingress_rule_protocol': 'icmp',
+                'sctp-b-egress-src_start_port': '0.0',
+                'sctp-a-egress_src_addresses': 'local',
+                'sctp-b-display_name': 'epc-sctp-b-ipv4v6-sec-group',
+                'sctp-a-egress-src_start_port': '0.0',
+                'sctp-a-ingress_ethertype': 'IPv4',
+                'sctp-b-ipv6-ingress-dst_end_port': '65535',
+                'sctp-b-dst_subnet_prefix_v6': '::',
+                'nf_naming': '{ecomp_generated_naming=true}',
+                'sctp-a-ipv6-ingress_src_subnet_prefix': '0.0.0.0',
+                'sctp-b-egress-dst_start_port': '0.0',
+                'ncb_flavor_name': 'nv.c20r64d1',
+                'gpb1_Internal1_mac': '00:80:37:0E:01:22',
+                'sctp-b-egress_dst_subnet_prefix_len': '0.0',
+                'Internal2_net_cidr': '169.255.0.0',
+                'sctp-a-ingress-dst_start_port': '0.0',
+                'sctp-a-egress-dst_start_port': '0.0',
+                'fsb1_Internal2_mac': '00:80:37:0E:0B:12',
+                'sctp-a-egress_ethertype': 'IPv4',
+                'vlc_st_service_mode': 'in-network-nat',
+                'sctp-a-ipv6-egress_ethertype': 'IPv4',
+                'sctp-a-egress-src_end_port': '65535.0',
+                'sctp-b-ipv6-egress_rule_application': 'any',
+                'sctp-b-egress_action': 'pass',
+                'sctp-a-ingress-src_subnet_prefix_len': '0.0',
+                'sctp-b-ipv6-ingress-src_end_port': '65535.0',
+                'sctp-b-name': 'epc-sctp-b-ipv4v6-sec-group',
+                'fsb2_Internal1_mac': '00:80:37:0E:0D:12',
+                'sctp-a-ipv6-ingress-src_start_port': '0.0',
+                'sctp-b-ipv6-egress_ethertype': 'IPv4',
+                'Internal1_net_cidr': '169.253.0.0',
+                'sctp-a-egress_dst_subnet_prefix': '0.0.0.0',
+                'fsb_flavor_name': 'nv.c20r64d1',
+                'sctp_rule_protocol': '132',
+                'sctp-b-ipv6-ingress_src_subnet_prefix_len': '0',
+                'sctp-a-ipv6-ingress_rule_application': 'any',
+                'sctp-a-IPv6_ethertype': 'IPv6',
+                'vlc2_Internal1_mac': '00:80:37:0E:02:12',
+                'vlc_st_virtualization_type': 'virtual-machine',
+                'sctp-b-ingress-dst_start_port': '0.0',
+                'sctp-b-ingress-dst_end_port': '65535.0',
+                'sctp-a-ipv6-ingress-src_end_port': '65535.0',
+                'sctp-a-display_name': 'epc-sctp-a-ipv4v6-sec-group',
+                'sctp-b-ingress_rule_application': 'any',
+                'int2_sec_group_name': 'int2-sec-group',
+                'vlc_flavor_name': 'nd.c16r64d1',
+                'sctp-b-ipv6-egress_src_addresses': 'local',
+                'vlc_st_interface_type_int1': 'other1',
+                'sctp-b-egress-src_end_port': '65535.0',
+                'sctp-a-ipv6-egress-dst_start_port': '0',
+                'vlc_st_interface_type_int2': 'other2',
+                'sctp-a-ipv6-egress_rule_protocol': 'any',
+                'Internal2_shared': 'false',
+                'sctp-a-ipv6-egress_dst_subnet_prefix_len': '0',
+                'Internal2_rpf': 'disable',
+                'vlc1_Internal1_mac': '00:80:37:0E:01:12',
+                'sctp-b-ipv6-egress_src_end_port': '65535',
+                'sctp-a-ipv6-egress_src_addresses': 'local',
+                'sctp-a-ingress-dst_end_port': '65535.0',
+                'sctp-a-ipv6-egress_src_end_port': '65535',
+                'Internal1_forwarding_mode': 'l2',
+                'Internal2_dhcp': 'false',
+                'sctp-a-dst_subnet_prefix_v6': '::',
+                'pxe_image_name': 'MME_PXE-Boot_16ACP04_GA.qcow2',
+                'vlc_st_interface_type_gtp': 'other0',
+                'ncb1_Internal1_mac': '00:80:37:0E:09:12',
+                'sctp-b-src_subnet_prefix_v6': '::',
+                'sctp-a-egress_dst_subnet_prefix_len': '0.0',
+                'int1_sec_group_name': 'int1-sec-group',
+                'Internal1_dhcp': 'false',
+                'sctp-a-ipv6-egress_dst_end_port': '65535',
+                'Internal2_forwarding_mode': 'l2',
+                'fsb2_Internal2_mac': '00:80:37:0E:0D:12',
+                'sctp-b-egress_dst_subnet_prefix': '0.0.0.0',
+                'Internal1_net_cidr_len': '17',
+                'gpb2_Internal1_mac': '00:80:37:0E:02:22',
+                'sctp-b-ingress-src_subnet_prefix_len': '0.0',
+                'sctp-a-ingress_dst_addresses': 'local',
+                'sctp-a-egress_action': 'pass',
+                'fsb_volume_type_0': 'SF-Default-SSD',
+                'ncb2_Internal2_mac': '00:80:37:0E:0F:12',
+                'vlc_st_interface_type_sctp_a': 'left',
+                'vlc_st_interface_type_sctp_b': 'right',
+                'sctp-a-src_subnet_prefix_v6': '::',
+                'vlc_st_version': '2',
+                'sctp-b-egress_ethertype': 'IPv4',
+                'sctp-a-ingress_rule_application': 'any',
+                'gpb1_Internal2_mac': '00:80:37:0E:01:22',
+                'instance_ip_family_v6': 'v6',
+                'sctp-a-ipv6-egress_src_start_port': '0',
+                'sctp-b-ingress-src_start_port': '0.0',
+                'sctp-b-ingress_dst_addresses': 'local',
+                'fsb1_Internal1_mac': '00:80:37:0E:0B:12',
+                'vlc_st_interface_type_oam': 'management',
+                'multi_stage_design': 'false',
+                'oam_sec_group_name': 'oam-sec-group',
+                'Internal2_net_gateway': '169.255.0.3',
+                'sctp-a-ipv6-ingress-dst_end_port': '65535',
+                'sctp-b-ipv6-egress-dst_start_port': '0',
+                'Internal1_net_gateway': '169.253.0.3',
+                'sctp-b-ipv6-egress_rule_protocol': 'any',
+                'gtp_sec_group_name': 'gtp-sec-group',
+                'sctp-a-ipv6-egress_dst_subnet_prefix': '0.0.0.0',
+                'sctp-b-ipv6-egress_dst_subnet_prefix_len': '0',
+                'sctp-a-ipv6-ingress_dst_addresses': 'local',
+                'sctp-a-egress_rule_protocol': 'icmp',
+                'sctp-b-ipv6-egress_action': 'pass',
+                'sctp-a-ipv6-egress_action': 'pass',
+                'Internal1_shared': 'false',
+                'sctp-b-ipv6-ingress_rule_protocol': 'any',
+                'Internal2_net_cidr_len': '17',
+                'sctp-a-name': 'epc-sctp-a-ipv4v6-sec-group',
+                'sctp-a-ingress-src_end_port': '65535.0',
+                'sctp-b-ipv6-ingress_src_subnet_prefix': '0.0.0.0',
+                'sctp-a-egress-dst_end_port': '65535.0',
+                'sctp-a-ingress_action': 'pass',
+                'sctp-b-egress_rule_protocol': 'icmp',
+                'sctp-b-ipv6-ingress_action': 'pass',
+                'vlc_st_service_type': 'firewall',
+                'sctp-b-ipv6-egress_dst_end_port': '65535',
+                'sctp-b-ipv6-ingress-dst_start_port': '0',
+                'vlc2_Internal2_mac': '00:80:37:0E:02:12',
+                'vlc_st_availability_zone': 'true',
+                'fsb_volume_image_name_1': 'MME_FSB2_16ACP04_GA.qcow2',
+                'sctp-b-ingress-src_subnet_prefix': '0.0.0.0',
+                'sctp-a-ipv6-ingress_src_subnet_prefix_len': '0',
+                'Internal1_allow_transit': 'true',
+                'gpb_flavor_name': 'nv.c20r64d1',
+                'availability_zone_max_count': '1',
+                'fsb_volume_image_name_0': 'MME_FSB1_16ACP04_GA.qcow2',
+                'sctp-b-ipv6-ingress_dst_addresses': 'local',
+                'sctp-b-ipv6-egress_dst_subnet_prefix': '0.0.0.0',
+                'sctp-b-ipv6-ingress_ethertype': 'IPv4',
+                'vlc1_Internal2_mac': '00:80:37:0E:01:12',
+                'sctp-a-ingress-src_subnet_prefix': '0.0.0.0',
+                'sctp-a-ipv6-ingress_action': 'pass',
+                'Internal1_rpf': 'disable',
+                'sctp-b-ingress_ethertype': 'IPv4',
+                'sctp-b-egress_rule_application': 'any',
+                'sctp-b-ingress-src_end_port': '65535.0',
+                'sctp-a-ipv6-ingress_rule_protocol': 'any',
+                'sctp-a-ingress-src_start_port': '0.0',
+                'sctp-b-egress-dst_end_port': '65535.0'
+              },
+              'type': 'VF',
+              'modelCustomizationName': 'VF_vMee 0',
+              'vfModules': {
+                'vf_vmee0..VfVmee..vmme_vlc..module-1': {
+                  'uuid': '522159d5-d6e0-4c2a-aa44-5a542a12a830',
+                  'invariantUuid': '98a7c88b-b577-476a-90e4-e25a5871e02b',
+                  'customizationUuid': '55b1be94-671a-403e-a26c-667e9c47d091',
+                  'description': null,
+                  'name': 'VfVmee..vmme_vlc..module-1',
+                  'version': '2',
+                  'modelCustomizationName': 'VfVmee..vmme_vlc..module-1',
+                  'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+                  'commands': {},
+                  'volumeGroupAllowed': false
+                },
+                'vf_vmee0..VfVmee..vmme_gpb..module-2': {
+                  'uuid': '41708296-e443-4c71-953f-d9a010f059e1',
+                  'invariantUuid': '1cca90b8-3490-495e-87da-3f3e4c57d5b9',
+                  'customizationUuid': '6add59e0-7fe1-4bc4-af48-f8812422ae7c',
+                  'description': null,
+                  'name': 'VfVmee..vmme_gpb..module-2',
+                  'version': '2',
+                  'modelCustomizationName': 'VfVmee..vmme_gpb..module-2',
+                  'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+                  'commands': {},
+                  'volumeGroupAllowed': false
+                },
+                'vf_vmee0..VfVmee..base_vmme..module-0': {
+                  'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87',
+                  'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d',
+                  'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861',
+                  'description': null,
+                  'name': 'VfVmee..base_vmme..module-0',
+                  'version': '2',
+                  'modelCustomizationName': 'VfVmee..base_vmme..module-0',
+                  'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1},
+                  'commands': {},
+                  'volumeGroupAllowed': true
+                }
+              },
+              'volumeGroups': {
+                'vf_vmee0..VfVmee..base_vmme..module-0': {
+                  'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87',
+                  'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d',
+                  'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861',
+                  'description': null,
+                  'name': 'VfVmee..base_vmme..module-0',
+                  'version': '2',
+                  'modelCustomizationName': 'VfVmee..base_vmme..module-0',
+                  'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1}
+                }
+              }
+            }
+          },
+          'networks': {
+            'ExtVL 0': {
+              'uuid': 'ddc3f20c-08b5-40fd-af72-c6d14636b986',
+              'invariantUuid': '379f816b-a7aa-422f-be30-17114ff50b7c',
+              'description': 'ECOMP generic virtual link (network) base type for all other service-level and global networks',
+              'name': 'ExtVL',
+              'version': '37.0',
+              'customizationUuid': '94fdd893-4a36-4d70-b16a-ec29c54c184f',
+              'inputs': {},
+              'commands': {},
+              'properties': {
+                'network_assignments': '{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}',
+                'exVL_naming': '{ecomp_generated_naming=true}',
+                'network_flows': '{is_network_policy=false, is_bound_to_vpn=false}',
+                'network_homing': '{ecomp_selected_instance_node_target=false}'
+              },
+              'type': 'VL',
+              'modelCustomizationName': 'ExtVL 0'
+            }
+          },
+          'configurations': {
+            'Port Mirroring Configuration By Policy 0': {
+              'uuid': 'b4398538-e89d-4f13-b33d-ca323434ba50',
+              'invariantUuid': '6ef0ca40-f366-4897-951f-abd65d25f6f7',
+              'description': 'A port mirroring configuration by policy object',
+              'name': 'Port Mirroring Configuration By Policy',
+              'version': '27.0',
+              'customizationUuid': '3c3b7b8d-8669-4b3b-8664-61970041fad2',
+              'inputs': {},
+              'commands': {},
+              'properties': {},
+              'type': 'Configuration',
+              'modelCustomizationName': 'Port Mirroring Configuration By Policy 0',
+              'sourceNodes': [],
+              'collectorNodes': null,
+              'configurationByPolicy': false
+            }
+          },
+          'serviceProxies': {},
+          'vfModules': {
+            'vf_vmee0..VfVmee..vmme_vlc..module-1': {
+              'uuid': '522159d5-d6e0-4c2a-aa44-5a542a12a830',
+              'invariantUuid': '98a7c88b-b577-476a-90e4-e25a5871e02b',
+              'customizationUuid': '55b1be94-671a-403e-a26c-667e9c47d091',
+              'description': null,
+              'name': 'VfVmee..vmme_vlc..module-1',
+              'version': '2',
+              'modelCustomizationName': 'VfVmee..vmme_vlc..module-1',
+              'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+              'commands': {},
+              'volumeGroupAllowed': false
+            },
+            'vf_vmee0..VfVmee..vmme_gpb..module-2': {
+              'uuid': '41708296-e443-4c71-953f-d9a010f059e1',
+              'invariantUuid': '1cca90b8-3490-495e-87da-3f3e4c57d5b9',
+              'customizationUuid': '6add59e0-7fe1-4bc4-af48-f8812422ae7c',
+              'description': null,
+              'name': 'VfVmee..vmme_gpb..module-2',
+              'version': '2',
+              'modelCustomizationName': 'VfVmee..vmme_gpb..module-2',
+              'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+              'commands': {},
+              'volumeGroupAllowed': false
+            },
+            'vf_vmee0..VfVmee..base_vmme..module-0': {
+              'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87',
+              'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d',
+              'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861',
+              'description': null,
+              'name': 'VfVmee..base_vmme..module-0',
+              'version': '2',
+              'modelCustomizationName': 'VfVmee..base_vmme..module-0',
+              'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1},
+              'commands': {},
+              'volumeGroupAllowed': true
+            }
+          },
+          'volumeGroups': {
+            'vf_vmee0..VfVmee..base_vmme..module-0': {
+              'uuid': 'a27f5cfc-7f12-4f99-af08-0af9c3885c87',
+              'invariantUuid': 'a6f9e51a-2b35-416a-ae15-15e58d61f36d',
+              'customizationUuid': 'f8c040f1-7e51-4a11-aca8-acf256cfd861',
+              'description': null,
+              'name': 'VfVmee..base_vmme..module-0',
+              'version': '2',
+              'modelCustomizationName': 'VfVmee..base_vmme..module-0',
+              'properties': {'minCountInstances': 1, 'maxCountInstances': 1, 'initialCount': 1}
+            }
+          },
+          'pnfs': {}
+        }
+      }
+    ));
+  }
+
+});
diff --git a/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts b/vid-webpack-master/src/app/drawingBoard/available-models-tree/available-models-tree.service.ts
new file mode 100644 (file)
index 0000000..57dc4b4
--- /dev/null
@@ -0,0 +1,36 @@
+import {Injectable} from '@angular/core';
+import * as _ from "lodash";
+import {ServicePlanningService} from "../../services/service-planning.service";
+
+@Injectable()
+export class AvailableModelsTreeService {
+  constructor(private _servicePlanningService: ServicePlanningService) {
+  }
+
+  shouldShowAddIcon(node: any, serviceHierarchy: any, serviceModelId: string, currentNodeCount: number): boolean {
+    let maxNodes: number = 1;
+    if (node.data.children !== null && node.data.children.length == 0) {
+      let vnfModules = serviceHierarchy[serviceModelId].vfModules;
+      if (vnfModules[node.data.name]) {
+        maxNodes = vnfModules[node.data.name].properties.maxCountInstances || 1;
+      }
+    }
+    return !node.data.disabled && currentNodeCount < maxNodes
+  }
+
+  shouldOpenDialog(type: string, dynamicInputs: any, userProvidedNaming: boolean): boolean {
+    if (userProvidedNaming || this._servicePlanningService.requiredFields[type].length > 0) {
+      return true;
+    }
+
+    if (dynamicInputs) {
+      for(let input of dynamicInputs) {
+        if (input.isRequired && _.isEmpty(input.value)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.html
new file mode 100644 (file)
index 0000000..7d0f7f4
--- /dev/null
@@ -0,0 +1,33 @@
+<div class="drawing-board-header">
+  <div class="left-header">
+    <span [attr.data-tests-id]="'backBtn'" class="icon-back" (click)="closePage()"></span>
+    <span [attr.data-tests-id]="'serviceInstance'" class="service-instance-label">Service instance:</span>
+    <span [attr.data-tests-id]="'serviceName'" class="service-instance-name">{{serviceName}}</span>
+    <span class="quantity-container" style="    padding: 10px;font-size: 13px;" tooltip="Number of services to instantiate including all their objects as defined below">
+      <span [attr.data-tests-id]="'quantityLabel'" class="quantity-label" >Scale Times:</span>
+      <span [attr.data-tests-id]="'servicesQuantity'" class="quantity" style="font-family: OpenSans-Semibold;font-size: 14px;"> {{numServicesToDeploy}} </span>
+    </span>
+    <span  class="service-instance-label">status:</span>
+    <span [attr.data-tests-id]="'serviceStatus'" class="status">{{status}}</span>
+  </div>
+  <div class="right-header">
+    <span class="menu-container">
+      <span [attr.data-tests-id]="'openMenuBtn'" class="icon-browse" (click)="onContextMenu($event)"></span>
+      <context-menu>
+        <ng-template contextMenuItem (execute)="editService()">
+          <div [attr.data-tests-id]="'context-menu-header-edit-item'">
+            <span class="icon-edit"></span>
+            Edit
+          </div>
+        </ng-template>
+        <ng-template contextMenuItem (execute)="closePage()">
+          <div [attr.data-tests-id]="'context-menu-header-delete-item'">
+            <span class="icon-trash"></span>
+            Delete
+          </div>
+        </ng-template>
+      </context-menu>
+    </span>
+    <button [disabled]="false" [attr.data-tests-id]="'deployBtn'" (click)="deployMacroservice()" class="deploy-btn">DEPLOY</button>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.scss
new file mode 100644 (file)
index 0000000..29b7711
--- /dev/null
@@ -0,0 +1,95 @@
+.drawing-board-header {
+  height: 56px;
+  margin-bottom: 4px;
+  position: relative;
+  font-family: OpenSans-Regular;
+  display: flex;
+  justify-content: space-between;
+  font-size: 14px;
+  box-shadow: 2px 2px 6px #D2D2D2;
+  color: #191919;
+  [class^="icon-"] {
+    height: 56px;
+    width: 56px;
+    display: flex;
+    align-items: center;
+    text-align: center;
+    color: #5A5A5A;
+    cursor: pointer;
+    &:before {
+      font-size: 18px;
+      width: 100%;
+    }
+    &:hover:before {
+      color: #009FDB;
+    }
+  }
+  .left-header {
+    display: flex;
+    align-items: center;
+    .icon-back {
+      border-right: 1px solid #EAEAEA;
+      &:before {
+        content: "\e906";
+        font-size: 24px;
+      }
+    }
+    .service-instance-label {
+      padding: 0 5px;
+      font-family: OpenSans-Regular;
+      font-size: 13px;
+      color: #191919;
+    }
+    .service-instance-name {
+      padding-right: 20px;
+      color: #191919;
+      font-family: OpenSans-Semibold;
+      background-color: white;
+      font-size: 16px
+    }
+    .status {
+      font-family: OpenSans-Semibold;
+      line-height: 14px;
+      font-size: 14px;
+    }
+  }
+  .right-header {
+    display: flex;
+    align-items: center;
+    .quantity-container {
+      .quantity-label {
+        padding-left: 10px;
+        font-family: OpenSans-Semibold;
+        font-size: 12px;
+      }
+      .quantity {
+        padding: 5px 10px 5px 0;
+        font-family: OpenSans-Semibold;
+        font-size: 18px;
+      }
+    }
+    [class^="icon-"] {
+      border-left: 1px solid #EAEAEA;
+    }
+    .menu-container {
+      height: 100%;
+      display: flex;
+      background: none;
+      border: none;
+      padding: 0;
+      outline: none;
+    }
+    .icon-browse:before {
+      content: '\e924';
+      display: inline-block;
+      font-size: 24px;
+    }
+    .deploy-btn {
+      color: #FFFFFF ;
+      background: #009fdb;
+      width: 128px;
+      height: 100%;
+      border: none;
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/drawing-board-header.component.ts
new file mode 100644 (file)
index 0000000..38284e2
--- /dev/null
@@ -0,0 +1,119 @@
+import {Component, ViewChild} from '@angular/core';
+import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
+import {DialogService} from 'ng2-bootstrap-modal';
+import {ServicePopupComponent} from '../../components/service-popup/service-popup.component';
+import {MsoService} from '../../services/msoService/mso.service'
+import * as _ from 'lodash';
+import {ActivatedRoute} from '@angular/router';
+import {ServiceInstance} from "../../shared/models/serviceInstance";
+import {OwningEntity} from "../../shared/models/owningEntity";
+import {MessageBoxData, ModalSize, ModalType} from "../../shared/components/messageBox/messageBox.data";
+import {MessageBoxService} from "../../shared/components/messageBox/messageBox.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {IframeService} from "../../shared/utils/iframe.service";
+
+@Component({
+  selector: 'drawing-board-header',
+  providers: [MsoService],
+  templateUrl: './drawing-board-header.component.html',
+  styleUrls: ['./drawing-board-header.component.scss']
+})
+
+export class DrawingBoardHeader {
+  serviceName: string;
+  numServicesToDeploy: number;
+  status: string = 'Designing a new service';
+  serviceModelId: string;
+  parentElementClassName = 'content';
+
+  constructor(private _contextMenuService: ContextMenuService, private dialogService: DialogService,
+              private _iframeService : IframeService,
+              private route: ActivatedRoute, private msoService: MsoService,
+              private store: NgRedux<AppState>) {
+    this.route
+      .queryParams
+      .subscribe(params => {
+        this.serviceModelId = params['serviceModelId'];
+        if (_.has(this.store.getState().service.serviceHierarchy, this.serviceModelId)) {
+          this.setValuesFromStore();
+          this.store.subscribe(() => {
+            this.setValuesFromStore();
+          });
+        }
+      });
+  }
+
+
+  @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
+
+  public onContextMenu($event: MouseEvent, item: any): void {
+    this._contextMenuService.show.next({
+      contextMenu: this.contextMenu,
+      event: $event,
+      item: item,
+    });
+    $event.preventDefault();
+    $event.stopPropagation();
+  }
+
+  private setValuesFromStore() {
+    const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+    this.numServicesToDeploy = serviceInstance.bulkSize;
+    this.serviceName = serviceInstance.instanceName || '<Automatically Assigned>';
+
+  }
+
+  public editService(): void {
+    this._iframeService.addClassOpenModal(this.parentElementClassName);
+    this.dialogService.addDialog(ServicePopupComponent, {})
+
+  }
+
+
+  extractOwningEntityNameAccordingtoId(id:String): string {
+    let owningEntityName;
+    _.forEach(this.store.getState().service.categoryParameters.owningEntityList,function(owningEntity: OwningEntity) {
+      if (owningEntity.id === id) {
+        owningEntityName = owningEntity.name;
+
+      }})
+
+    return owningEntityName;
+  }
+
+  extractServiceFields(): any {
+    let instanceFields : ServiceInstance;
+    instanceFields = this.store.getState().service.serviceInstance[Object.keys(this.store.getState().service.serviceInstance)[0]];
+    instanceFields.subscriberName = this.store.getState().service.subscribers.find(sub => sub.id === instanceFields.globalSubscriberId).name;
+    instanceFields.owningEntityName = this.extractOwningEntityNameAccordingtoId(instanceFields.owningEntityId);
+    return instanceFields;
+  }
+
+  public deployMacroservice(): void {
+    var instanceFields = this.extractServiceFields();
+    instanceFields.rollbackOnFailure = instanceFields.rollbackOnFailure === 'true';
+    this.msoService.submitMsoTask(instanceFields).subscribe((result) => {
+      window.parent.postMessage("navigateToInstantiationStatus", '*');
+      })
+  }
+
+  closePage() {
+    let messageBoxData : MessageBoxData = new MessageBoxData(
+         "Delete Instantiation",  // modal title
+      "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?",
+
+              ModalType.alert,
+              ModalSize.medium,
+             [
+      {text:"Stop Instantiation", size:"large",  callback: this.navigate.bind(this), closeModal:true},
+      {text:"Cancel", size:"medium", closeModal:true}
+    ]);
+
+    MessageBoxService.openModal.next(messageBoxData);
+  }
+
+  navigate(){
+    window.parent.postMessage("navigateTo", "*");
+  }
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-header/tmp_instansiate_request.ts
new file mode 100644 (file)
index 0000000..7accc3a
--- /dev/null
@@ -0,0 +1,52 @@
+export default
+  {
+    "modelInfo": {
+      "modelType": "service",
+      "modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+      "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+      "modelName": "MOW AVPN vMX BV vPE 1 Service",
+      "modelVersion": "10.0"
+    },
+    "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+    "owningEntityName": "PACKET CORE",
+    "projectName": "{some project name}",
+    "globalSubscriberId": "{some subscriber id}",
+    "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+    "instanceName": "vPE_Service",
+    "subscriptionServiceType": "VMX",
+    "lcpCloudRegionId": "mdt1",
+    "tenantId": "88a6ca3ee0394ade9403f075db23167e",
+    "vnfs": [
+      {
+        "modelInfo": {
+          "modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+          "modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+          "modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+          "modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+        },
+        "lcpCloudRegionId": "mdt1",
+        "tenantId": "88a6ca3ee0394ade9403f075db23167e",
+        "platformName": "test",
+        "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+        "instanceName": "vmxnjr001",
+        "instanceParams": [],
+        "vfModules": [
+          {
+            "modelInfo": {
+              "modelType": "vfModule",
+              "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+              "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+              "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+            },
+            "instanceName": "vmxnjr001_AVPN_base_vPE_BV_base_001",
+            "instanceParams": [
+              {
+                "vmx_int_net_len": "24"
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.component.ts
new file mode 100644 (file)
index 0000000..6b717a9
--- /dev/null
@@ -0,0 +1,133 @@
+import {AfterViewInit, Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core';
+import { ContextMenuService } from 'ngx-contextmenu';
+import { Constants } from '../../shared/utils/constants';
+import {ServicePlanningService} from "../../services/service-planning.service";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {ITreeOptions, TreeComponent} from "angular-tree-component";
+import {VnfPopupComponent} from "../../components/vnf-popup/vnf-popup.components";
+import {DialogService} from "ng2-bootstrap-modal";
+import {ActivatedRoute} from "@angular/router";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import { MessageBoxData, ModalSize, ModalType } from '../../shared/components/messageBox/messageBox.data';
+import { MessageBoxService } from '../../shared/components/messageBox/messageBox.service';
+import { deleteVnfInstance, deleteVfModuleInstance } from '../../service.actions';
+import { isNullOrUndefined } from 'util';
+import {IframeService} from "../../shared/utils/iframe.service";
+
+
+@Component({
+  selector: 'drawing-board-tree',
+  templateUrl: './drawing-board-tree.html',
+  styleUrls : ['./drawing-board-tree.scss']
+})
+
+
+export class DrawingBoardTreeComponent implements OnInit, AfterViewInit {
+  constructor(private _contextMenuService: ContextMenuService,
+              private _servicePlanningService: ServicePlanningService,
+              private _iframeService : IframeService,
+              private dialogService: DialogService,
+              private store: NgRedux<AppState>,
+              private route: ActivatedRoute) {
+    this.route
+      .queryParams
+      .subscribe(params => {
+        this.serviceModelId = params['serviceModelId'];
+      });
+  }
+
+  @Output()
+  highlightNode : EventEmitter<number> = new EventEmitter<number>();
+
+  @ViewChild('tree') tree: TreeComponent;
+  missingDataTooltip: string = Constants.Error.MISSING_VNF_DETAILS;
+  currentNode: ITreeNode = null; //
+  nodes = [];
+  serviceModelId: string;
+  options: ITreeOptions = {
+    nodeHeight: 45,
+    dropSlotHeight: 1
+  };
+  parentElementClassName = 'content';
+
+  ngOnInit(): void {
+    this.store.subscribe(() => {this.updateTree()});
+    this.updateTree()
+  }
+
+  updateTree() {
+    const serviceInstance = this.store.getState().service.serviceInstance[this.serviceModelId];
+    this.nodes = this._servicePlanningService.convertServiceInstanceToTreeData(serviceInstance, this.serviceModelId);
+  }
+
+  ngAfterViewInit():void {
+    // Expand drawing tree on init.
+    this.tree.treeModel.expandAll();
+  }
+
+  public onContextMenu($event: MouseEvent, node: ITreeNode): void {
+    this.currentNode = node;
+    node.focus();
+    node.setActiveAndVisible(false);
+    this.selectNode(node);
+    this._contextMenuService.show.next({
+      event: <any>$event,
+      item: node,
+    });
+    $event.preventDefault();
+    $event.stopPropagation();
+  }
+
+  public editItem(node: ITreeNode): void {
+    node = this.currentNode;
+    this._iframeService.addClassOpenModal(this.parentElementClassName);
+    this.dialogService.addDialog(VnfPopupComponent, {
+      serviceModelId: this.serviceModelId,
+      modelName: node.data.modelName,
+      modelType: node.data.type,
+      parentModelName: node.parent.data.modelName,
+      isNewVfModule : false
+    })
+  }
+
+  public deleteItem(node: ITreeNode): void {
+    if(this.currentNode.data.type === 'VF'){
+      if(!isNullOrUndefined(this.currentNode.data.children) && this.currentNode.data.children.length === 0){
+        this.store.dispatch(deleteVnfInstance(this.currentNode.data.modelName, this.serviceModelId));
+      }else {
+        let messageBoxData : MessageBoxData = new MessageBoxData(
+          "Remove VNF",  // modal title
+          "You are about to remove this VNF and all its children from this service. Are you sure you want to remove it?",
+
+          ModalType.alert,
+          ModalSize.medium,
+          [
+            {text:"Remove VNF", size:"large",  callback: this.removeVnf.bind(this), closeModal:true},
+            {text:"Don’t Remove", size:"medium", closeModal:true}
+          ]);
+
+        MessageBoxService.openModal.next(messageBoxData);
+      }
+    }else {
+        this.store.dispatch(deleteVfModuleInstance(this.currentNode.data.modelName, this.serviceModelId, node.parent.data.modelName));
+    }
+  }
+
+  removeVnf() {
+    this.store.dispatch(deleteVnfInstance(this.currentNode.data.modelName,  this.serviceModelId));
+  }
+
+  public selectNode(node: ITreeNode): void {
+    node.expand();
+    this.highlightNode.emit(node.data.modelId);
+  }
+
+  isDataMissing(node: ITreeNode) {
+    //todo: currently not showing the alert icon. will be implemented in upcoming story.
+    return false;
+  }
+
+}
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.html
new file mode 100644 (file)
index 0000000..c4061db
--- /dev/null
@@ -0,0 +1,42 @@
+<div class="drawing-board-tree">
+  <div *ngIf="nodes?.length == 0" style="text-align: center;    margin-top: 50px;">
+    <no-content-message-and-icon class="span-over"
+                                 data-title="Please add objects (VNFs, network, modules etc.) from the left tree to design the service instance"
+                                 subtitle="Once done, click Deploy to start instantiation"
+                                 iconPath="./assets/img/UPLOAD.svg"
+                                 iconClass="upload-icon-service-planing"></no-content-message-and-icon>
+  </div>
+  <tree-root [attr.data-tests-id]="'drawing-board-tree'" #tree [nodes]="nodes" [options]="options"  id="drawing-board-tree">
+    <ng-template #treeNodeTemplate let-node let-index="index">
+      <div [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName" (click)="selectNode(node)">
+        <div class="model-info">
+          <span>
+            <span class="property-name">{{node.data.type}}{{node.data.name ? ': ': ''}}<span class="auto-name">{{node.data.name? node.data.name: ''}}</span></span>
+          </span>
+        </div>
+        <div class="model-actions">
+          <span class="icon-browse" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-menu-btn'" (click)="onContextMenu($event, node)" >
+          <context-menu>
+            <ng-template contextMenuItem (execute)="editItem(node)">
+              <div [attr.data-tests-id]="'context-menu-item'">
+                <span class="icon-edit"></span>
+                Edit
+              </div>
+            </ng-template>
+            <ng-template contextMenuItem (execute)="deleteItem(node)">
+              <div>
+                <span class="icon-trash"></span>
+                Remove
+              </div>
+            </ng-template>
+          </context-menu>
+          </span>
+          <span *ngIf="isDataMissing(node)" class="icon-alert" tooltip="{{ missingDataTooltip }}" tooltipPlacement="left" [attr.data-tests-id]="'node-'+node.data.modelId +'-' +node.data.modelName+'-alert-icon'"></span>
+        </div>
+      </div>
+
+    </ng-template>
+  </tree-root>
+</div>
+
+
diff --git a/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss b/vid-webpack-master/src/app/drawingBoard/drawing-board-tree/drawing-board-tree.scss
new file mode 100644 (file)
index 0000000..fed9ead
--- /dev/null
@@ -0,0 +1,274 @@
+@mixin highlight($background-color, $color) {
+  background: none;
+  padding: 0;
+  background-color: $background-color;
+  border: $color 1px solid;
+  color: $color;
+}
+@mixin highlight-toggle-children {
+  tree-node-expander {
+    .toggle-children-wrapper {
+      span.toggle-children {
+        @include highlight(white, #009FDB);
+        border-right: none;
+      }
+    }
+  }
+}
+
+@mixin highlight-tree-node-content {
+  tree-node-content {
+    > div {
+      .model-actions {
+        .icon-browse:before {
+          display: inline-block;
+        }
+      }
+    }
+  }
+}
+
+drawing-board-tree {
+
+  .toggle-children-wrapper.toggle-children-wrapper-expanded {
+    .toggle-children:before {
+      color: #009FDB;
+    }
+  }
+
+  overflow: auto;
+  flex: 1;
+  color: #5A5A5A;
+  line-height: 14px;
+  .drawing-board-tree {
+    width: 100%;
+  }
+  tree-viewport {
+    padding: 50px 3.5% 1% 6%;
+    tree-node {
+      tree-node-drop-slot {
+        .node-drop-slot {
+          display: none;
+        }
+      }
+      & .tree-node-focused,
+      & .tree-node-active {
+        & > tree-node-wrapper {
+          .node-wrapper {
+            @include highlight-toggle-children;
+            .node-content-wrapper-focused,
+            .node-content-wrapper-active
+            {
+              @include highlight(#E6F6FB, #009FDB);
+              .property-name {
+                color: #009FDB;
+              }
+              .auto-name {
+                font-family: OpenSans-Regular !important;
+              }
+              .icon-browse:before {
+                color: #5A5A5A;
+              }
+              @include highlight-tree-node-content;
+            }
+          }
+        }
+      }
+      & .tree-node-expanded {
+        > tree-node-wrapper .node-wrapper {
+          box-shadow: 0 0px 2px rgba(90,90,90,0.24);
+        }
+      }
+
+      .tree-node-active .tree-children {
+        border: 1px solid #009FDB;
+        padding: 20px;
+      }
+
+
+
+      .tree-node.tree-node-active.tree-node-expanded {
+        border: 1px solid #009FDB;
+      }
+
+      .tree-node-leaf .node-wrapper{
+        margin-left: -45px;
+      }
+
+      tree-node-wrapper {
+        .node-wrapper {
+          height: 45px;
+          &:hover {
+            @include highlight-toggle-children;
+            .node-content-wrapper {
+              @include highlight(#E6F6FB, #009FDB);
+              .property-name {
+                color: #009FDB;
+              }
+              .icon-browse:before {
+                color: #5A5A5A;
+              }
+              @include highlight-tree-node-content;
+            }
+          }
+          tree-node-expander {
+            font-family: 'icomoon' !important;
+            height: 100%;
+            .toggle-children-wrapper {
+              padding: 0;
+              display: block;
+              height: 100%;
+              span.toggle-children {
+                display: flex;
+                width: 45px;
+                padding: 0;
+                top: 0;
+                height: inherit;
+                background-image: none;
+                background-color: white;
+                border: 1px solid #D2D2D2;
+                border-right: none;
+                &:before {
+                  content: "\e900";
+                  font-size: 20px;
+                  font-weight: 600;
+                  text-align: center;
+                  display: inline-block;
+                  flex: auto;
+                  align-self: center;
+                }
+              }
+            }
+            .toggle-children-wrapper-expanded {
+              span.toggle-children {
+                transform: none;
+                &:before {
+                  content: "\e930";
+                }
+              }
+            }
+            .toggle-children-placeholder {
+              width:45px;
+            }
+          }
+          .node-content-wrapper {
+            padding: 0;
+            background: none;
+            box-shadow: none;
+            border-radius: 0;
+            border: 1px solid #D2D2D2;
+            height: 100%;
+            flex: 1;
+            tree-node-content {
+              > div {
+                height: 100%;
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+                .model-info {
+                  flex: 1;
+                  display: flex;
+                  justify-content: space-between;
+                  align-items: center;
+                  padding-left: 8px;
+                  > span {
+                    flex: 1;
+                    padding: 0 8px;
+                    span:nth-child(2) {
+                      display: block;
+                    }
+                  }
+                }
+                .model-actions {
+                  display: flex;
+                  align-items: center;
+                  padding-right: 12px;
+                  .icon-browse {
+                    padding: 0;
+                    width: 30px;
+                    &:before {
+                      content: "\e924";
+                      font-size: 24px;
+                      display: none;
+                    }
+                    &:hover:before {
+                      color: #009FDB;
+                    }
+                    &:focus:before,
+                    &:active:before {
+                      color: #009FDB;
+                    }
+                  }
+
+                  .icon-alert {
+                    padding-left: 10px;
+                    &:before {
+                      content: "\e904";
+                      font-size: 16px;
+                      color: #ffb81c;
+                    }
+                  }
+                }
+              }
+            }
+            .property-name {
+              font-family: OpenSans-Semibold;
+              font-size: 12px;
+              line-height: 12px;
+              color: #191919;
+              text-transform: capitalize;
+            }
+          }
+
+
+        }
+      }
+      tree-node-children {
+        .tree-children {
+          padding: 20px;
+          .model-info span:first-child {
+            flex: 1.1 !important;
+          }
+        }
+      }
+    }
+  }
+}
+.cdk-overlay-pane.ngx-contextmenu {
+  ul.dropdown-menu {
+    width: 200px;
+    box-shadow: none;
+    padding: 0;
+    padding-top: 10px;
+    margin: 0;
+    border: 1px solid #D2D2D2;
+    border-top: 3px solid #009FDB;
+    box-shadow: 0 0px 2px rgba(90,90,90,0.24);
+    border-radius: 2px;
+    li {
+      height: 40px;
+      a {
+        font-family: OpenSans-Regular;
+        display: flex;
+        align-items: center;
+        height: 100%;
+        padding: 12px;
+        color: #5A5A5A;
+        &:hover {
+          background: #E6F6FB;
+          color:  #009FDB;
+        }
+        span {
+          padding-right: 12px;
+          &.icon-edit:before {
+            content: '\e917';
+          }
+          &.icon-trash:before {
+            content: '\e937';
+          }
+        }
+      }
+    }
+  }
+}
+
diff --git a/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts b/vid-webpack-master/src/app/drawingBoard/drawingBoard.module.ts
new file mode 100644 (file)
index 0000000..41efbe0
--- /dev/null
@@ -0,0 +1,41 @@
+import { AvailableModelsTreeService } from './available-models-tree/available-models-tree.service';
+import { NgModule } from '@angular/core';
+import { HighlightPipe } from '../shared/pipes/highlight-filter.pipe';
+import { TreeModule } from 'angular-tree-component';
+import { BrowserModule } from '@angular/platform-browser';
+import { TooltipModule } from 'ngx-tooltip';
+import { AvailableModelsTreeComponent } from './available-models-tree/available-models-tree.component';
+import { ServicePlanningService } from '../services/service-planning.service';
+import { AaiService } from '../services/aaiService/aai.service';
+import { DrawingBoardTreeComponent } from './drawing-board-tree/drawing-board-tree.component';
+import { SharedModule } from '../shared/shared.module';
+import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu';
+import { CommonModule } from '@angular/common';
+import { DrawingBoardHeader } from './drawing-board-header/drawing-board-header.component';
+import { ServicePlanningComponent, ServicePlanningEmptyComponent } from './service-planning/service-planning.component';
+
+@NgModule({
+  imports: [
+    TreeModule,
+    BrowserModule,
+    ContextMenuModule,
+    TooltipModule,
+    CommonModule,
+    SharedModule.forRoot()],
+  providers: [
+    ServicePlanningService,
+    AaiService,
+    AvailableModelsTreeService ,
+    ContextMenuService,
+    ServicePlanningService],
+  declarations: [
+    AvailableModelsTreeComponent,
+    HighlightPipe,
+    DrawingBoardTreeComponent,
+    DrawingBoardHeader,
+    ServicePlanningComponent,
+    ServicePlanningEmptyComponent],
+  exports: [ AvailableModelsTreeComponent, DrawingBoardTreeComponent, DrawingBoardHeader]
+})
+
+export class DrawingBoardModule { }
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.html
new file mode 100644 (file)
index 0000000..5b2f22d
--- /dev/null
@@ -0,0 +1,13 @@
+<div class="service-planning-header">
+  <drawing-board-header></drawing-board-header>
+</div>
+<div class="service-planning-content row">
+  <available-models-tree class="left-side col-md-6" (highlightInstances)="highlightInstancesBySelectingNode($event)"></available-models-tree>
+  <!--<no-content-message-and-icon *ngIf="!isShowTree()" class="span-over"-->
+                               <!--data-title="Please add objects (VNFs, network, modules etc.) from the left tree to design the service instance"-->
+                               <!--subtitle="Once done, click Deploy to start instantiation"-->
+                               <!--iconPath="./img/UPLOAD.svg"-->
+                               <!--iconClass="upload-icon-service-planing"></no-content-message-and-icon>-->
+  <drawing-board-tree *ngIf="isShowTree()" class="span-over col-md-6" (highlightNode)="highlightNodeBySelectingInstance($event)"></drawing-board-tree>
+</div>
+
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.scss
new file mode 100644 (file)
index 0000000..69546a6
--- /dev/null
@@ -0,0 +1,16 @@
+
+.service-planning-content {
+  display: flex;
+  flex: 1;
+}
+
+.span-over {
+  display: flex;
+  flex: 1;
+}
+
+//css for the icon. :host ::ng-deep are needed for applying css to child component
+:host ::ng-deep .upload-icon-service-planing {
+  height: 117px;
+  margin-top: 32px;
+}
diff --git a/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts b/vid-webpack-master/src/app/drawingBoard/service-planning/service-planning.component.ts
new file mode 100644 (file)
index 0000000..1ce0e81
--- /dev/null
@@ -0,0 +1,77 @@
+import {Component, ViewChild} from '@angular/core';
+import {DrawingBoardTreeComponent} from "../drawing-board-tree/drawing-board-tree.component";
+import {AvailableModelsTreeComponent} from "../available-models-tree/available-models-tree.component";
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {TreeComponent} from 'angular-tree-component';
+
+@Component({
+  selector: 'service-planning',
+  templateUrl: './service-planning.component.html',
+  styleUrls: ['./service-planning.component.scss']
+})
+
+export class ServicePlanningComponent {
+
+  @ViewChild(DrawingBoardTreeComponent) drawingModelTree;
+  @ViewChild(AvailableModelsTreeComponent) availableModelTree;
+
+  isShowTree(): boolean {
+    return true;
+  }
+
+  public highlightNodeBySelectingInstance(modelId: number): void {
+    this.availableModelTree.tree.treeModel.getNodeBy((node: ITreeNode) => node.data.id === modelId)
+    .setActiveAndVisible().expand();
+  }
+
+  public highlightInstancesBySelectingNode(id: number): void {
+    if(this.isShowTree()) {
+      let _this = this;
+      let matchInstances = _this.searchTree(id);
+      if (!matchInstances.length)
+        _this.clearSelectionInTree(_this.drawingModelTree.tree);
+      matchInstances.forEach(function (instance, index) {
+        let multi : boolean = !!index;
+        _this.drawingModelTree.tree.treeModel.getNodeById(instance.id)
+          .setActiveAndVisible(multi).expand();
+      });
+
+    }
+  }
+
+  clearSelectionInTree(tree: TreeComponent): void {
+    let activateNode = tree.treeModel.getActiveNode();
+    activateNode ? activateNode.toggleActivated().blur() : null;
+  }
+
+  searchTree(modelId: number) {
+    let _this = this;
+    let results = [];
+    let nodes = _this.drawingModelTree.nodes;
+    nodes.forEach(function (node) {
+      _this.searchTreeNode(node, modelId, results);
+    });
+    return results;
+  }
+
+  searchTreeNode(node, modelId: number, results): void {
+    if(node.modelId === modelId){
+      results.push(node);
+    }
+    if (node.children != null){
+      for(let i = 0; i < node.children.length; i++){
+        this.searchTreeNode(node.children[i], modelId, results);
+      }
+    }
+  }
+
+
+}
+
+export class ServicePlanningEmptyComponent extends ServicePlanningComponent {
+  isShowTree() : boolean {
+    return false;
+  }
+}
+
+
diff --git a/vid-webpack-master/src/app/factories/models/requestDetails.model.ts b/vid-webpack-master/src/app/factories/models/requestDetails.model.ts
new file mode 100644 (file)
index 0000000..4ccc478
--- /dev/null
@@ -0,0 +1,126 @@
+export class RequestInfo {
+  instanceName: string;
+  source: string;
+  suppressRollback: boolean;
+  requestorId: string;
+  productFamilyId: string;
+}
+
+export class ModelInfo {
+  modelType: string;
+  modelInvariantId: string;
+  modelVersionId: string;
+  modelName: string;
+  modelVersion: string;
+  modelCustomizationId: string;
+  modelCustomizationName: string;
+}
+
+export class RequestParameters {
+  userParams: any[];
+  testApi: string;
+}
+
+export class CloudConfiguration {
+  lcpCloudRegionId: string;
+  tenantId: string;
+}
+
+export class LineOfBusiness {
+  lineOfBusinessName: string;
+}
+
+export class Platform {
+  platformName: string;
+}
+
+export class VfcModel {
+  uuid: string;
+  invariantUuid: string;
+  name: string;
+  version: string;
+  vfcInstanceGroupProperties : any;
+}
+
+export class RelatedInstance {
+  instanceId: string;
+  modelInfo: ModelInfo;
+}
+
+export class RelatedInstanceList {
+  relatedInstance: RelatedInstance;
+}
+
+export class RequestDetails {
+  requestInfo: RequestInfo;
+  modelInfo: ModelInfo;
+  requestParameters: RequestParameters;
+  cloudConfiguration: CloudConfiguration;
+  lineOfBusiness: LineOfBusiness;
+  platform: Platform;
+  relatedInstanceList: RelatedInstanceList[];
+}
+
+export class RootObject {
+  requestDetails: RequestDetails;
+}
+// {
+//   "requestDetails": {
+//       "modelInfo": {
+//          “modelType”: “vnf”,
+//          “modelInvariantId”: “ff5256d1-5a33-55df-13ab-12abad84e7ff”,
+//          “modelVersionId”: “fe042c22-ba82-43c6-b2f6-8f1fc4164091”,
+//          “modelName”: “vSAMP12”,
+//          "modelVersion": "1.0",
+//          “modelCustomizationName”: “vSAMP12 1”,
+//          “modelCustomizationId”: “a7f1d08e-b02d-11e6-80f5-76304dec7eb7”
+//       },
+//       “cloudConfiguration”: {
+//           “lcpCloudRegionId”: “mdt1”,
+//           “tenantId”: “88a6ca3ee0394ade9403f075db23167e”
+//       },
+//       "requestInfo": {
+//           “instanceName”: “MSOTEST103a”,
+//           “productFamilyId”: “a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb”,
+//           “source”: “VID”,
+//           “suppressRollback”: false,
+//           “requestorId”: “az2016”
+//       },
+//      "platform": {
+//        "platformName": "{some platformName}"
+//      },
+//      "lineOfBusiness": {
+//        "lineOfBusinessName": "{some string}"
+//      },
+//       "relatedInstanceList": [
+//          {
+//             “relatedInstance”: {
+//                “instanceId”: “{serviceInstanceId}”,
+//                “modelInfo”: {
+//                   “modelType”: “service”,
+//                   “modelInvariantId”: “ff3514e3-5a33-55df-13ab-12abad84e7ff”,
+//                   “modelVersionId”: “fe6985cd-ea33-3346-ac12-ab121484a3fe”,
+//                   “modelName”: “{parent service model name}”,
+//                   "modelVersion": "1.0"
+//                }
+//             }
+//          },
+//          {
+//             “relatedInstance”: {
+//                “instanceId”: “{instanceGroupId}”,
+//                “modelInfo”: {
+//                   “modelType”: “networkCollection”,
+//                   “modelInvariantId”: “9ea660dc-155f-44d3-b45c-cc7648b4f31c”,
+//                   “modelVersionId”: “bb07aad1-ce2d-40c1-85cb-5392f76bb1ef”,
+//                   “modelName”: “{network collection model name}”,
+//                   "modelVersion": "1.0"
+//                }
+//             }
+//          }
+
+//       ],
+//       “requestParameters”: {
+//             “userParams”: []
+//       }
+//   }
+// }
diff --git a/vid-webpack-master/src/app/factories/mso.factory.spec.ts b/vid-webpack-master/src/app/factories/mso.factory.spec.ts
new file mode 100644 (file)
index 0000000..16efd29
--- /dev/null
@@ -0,0 +1,319 @@
+import {createRequest} from './mso.factory';
+
+sessionStorage.setItem("msoRequestParametersTestApiValue","GR_API");
+describe('Vlantagging', () => {
+  it('should create a correct request', (done: DoneFn) => {
+    let userInputs_withEcompGeneratedNaming = {
+      "productFamily": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "lcpRegion": "AAIAIC25",
+      "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+      "aicZone": "YYY1",
+      "platformName": "plat1",
+      "lineOfBusiness": "ecomp"
+    };
+    let userInputs_withoutEcompGeneratedNaming = {
+      "instanceName": "New Name",
+      "productFamily": "e433710f-9217-458d-a79d-1c7aff376d89",
+      "lcpRegion": "AAIAIC25",
+      "tenantId": "092eb9e8e4b7412e8787dd091bc58e86",
+      "aicZone": "YYY1",
+      "platformName": "plat1",
+      "lineOfBusiness": "ecomp"
+    };
+    let service = {
+      "service": {
+        "uuid": "6bce7302-70bd-4057-b48e-8d5b99e686ca",
+        "invariantUuid": "9aa04749-c02c-432d-a90c-18caa361c833",
+        "name": "vDBE_srv",
+        "version": "1.0",
+        "toscaModelURL": null,
+        "category": "Network L4+",
+        "serviceType": "",
+        "serviceRole": "",
+        "description": "vDBE_srv",
+        "serviceEcompNaming": "true",
+        "instantiationType": "A-La-Carte",
+        "inputs": {}
+      },
+      "vnfs": {
+        "vDBE 0": {
+          "uuid": "61535073-2e50-4141-9000-f66fea69b433",
+          "invariantUuid": "fcdf49ce-6f0b-4ca2-b676-a484e650e734",
+          "description": "vDBE",
+          "name": "vDBE",
+          "version": "0.2",
+          "customizationUuid": "1",
+          "inputs": {},
+          "commands": {},
+          "properties": {
+            "nf_naming": "{ecomp_generated_naming=true}",
+            "multi_stage_design": "false",
+            "oam_vfc_instance_group_function": "oambbb",
+            "availability_zone_max_count": "1",
+            "oam_network_collection_function": "oamaaa",
+            "ecomp_generated_naming": "true",
+            "untr_vfc_instance_group_function": "untrbbb",
+            "untr_network_collection_function": "untraaa"
+          },
+          "type": "VF",
+          "modelCustomizationName": "vDBE 0",
+          "vfModules": {
+            "vdbe0..Vdbe..main..module-0": {
+              "uuid": "25a4d009-2f5a-44b4-b02a-62c584c15912",
+              "invariantUuid": "614afb1a-3e7e-44e9-90ab-424d0070c781",
+              "customizationUuid": "3443b341-7b0b-498c-a84a-a7ee736cba7e",
+              "description": null,
+              "name": "Vdbe..main..module-0",
+              "version": "1",
+              "modelCustomizationName": "Vdbe..main..module-0",
+              "properties": {
+                "minCountInstances": 1,
+                "maxCountInstances": 1,
+                "initialCount": 1,
+                "vfModuleLabel": "main"
+              },
+              "inputs": {},
+              "volumeGroupAllowed": false
+            }
+          },
+          "volumeGroups": {},
+          "vfcInstanceGroups": {
+            "untr_group": {
+              "uuid": "5fca04e2-a889-4579-8338-f60f1bf285fa",
+              "invariantUuid": "fb1e384b-117a-46ae-9ad1-bf2f1ee1e49f",
+              "name": "untr_group",
+              "version": "1",
+              "vfcInstanceGroupProperties": {
+                "vfcParentPortRole": "untr",
+                "networkCollectionFunction": "untraaa",
+                "vfcInstanceGroupFunction": null,
+                "subinterfaceRole": "untr"
+              }
+            },
+            "oam_group": {
+              "uuid": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
+              "invariantUuid": "9384abf9-1231-4da4-bd8d-89e4d2f8a749",
+              "name": "oam_group",
+              "version": "1",
+              "vfcInstanceGroupProperties": {
+                "vfcParentPortRole": "untr",
+                "networkCollectionFunction": "untraaa",
+                "vfcInstanceGroupFunction": null,
+                "subinterfaceRole": "untr"
+              }
+            }
+          }
+        }
+      },
+      "networks": {},
+      "collectionResource": {},
+      "configurations": {},
+      "serviceProxies": {},
+      "vfModules": {
+        "vdbe0..Vdbe..main..module-0": {
+          "uuid": "25a4d009-2f5a-44b4-b02a-62c584c15912",
+          "invariantUuid": "614afb1a-3e7e-44e9-90ab-424d0070c781",
+          "customizationUuid": "3443b341-7b0b-498c-a84a-a7ee736cba7e",
+          "description": null,
+          "name": "Vdbe..main..module-0",
+          "version": "1",
+          "modelCustomizationName": "Vdbe..main..module-0",
+          "properties": {
+            "minCountInstances": 1,
+            "maxCountInstances": 1,
+            "initialCount": 1,
+            "vfModuleLabel": "main"
+          },
+          "inputs": {},
+          "volumeGroupAllowed": false
+        }
+      },
+      "volumeGroups": {},
+      "pnfs": {}
+    };
+    let serviceInstanceId: string = "6bce7302-70bd-4057-b48e-8d5b99e686ca";
+    let networkInstanceGroups = {
+      "untr_group": {
+        "instance-group": {
+          "instance-group-role": "JZmha7QSS4tJ",
+          "model-invariant-id": "model-id3",
+          "model-version-id": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
+          "id": "AAI-12002-test3-vm230w",
+          "description": "a9DEa0kpY",
+          "instance-group-type": "type",
+          "resource-version": "1520888659539",
+          "instance-group-name": "wKmBXiO1xm8bK",
+          "instance-group-function": "testfunction2",
+          "relationship-list": {
+            "relationship": [
+              {
+                "relationDataList": [
+                  {
+                    "relationship-key": "cloud-region.cloud-owner",
+                    "relationship-value": "AAI-12002-vm230w"
+                  },
+                  {
+                    "relationship-key": "cloud-region.cloud-region-id",
+                    "relationship-value": "AAI-region-vm230w"
+                  }
+                ],
+                "relatedToPropertyList": [
+                  {
+                    "property-key": "cloud-region.owner-defined-type",
+                    "property-value": null
+                  }
+                ],
+                "related-to": "cloud-region",
+                "related-link": "/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/AAI-12002-vm230w/AAI-region-vm230w",
+                "relationship-label": "org.onap.relationships.inventory.Uses",
+                "relationship-data": [
+                  {
+                    "relationship-key": "cloud-region.cloud-owner",
+                    "relationship-value": "AAI-12002-vm230w"
+                  },
+                  {
+                    "relationship-key": "cloud-region.cloud-region-id",
+                    "relationship-value": "AAI-region-vm230w"
+                  }
+                ],
+                "related-to-property": [
+                  {
+                    "property-key": "cloud-region.owner-defined-type",
+                    "property-value": null
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      },
+      "oam_group": {
+        "instance-group": {
+          "instance-group-role": "JZmha7QSS4tJ",
+          "model-invariant-id": "model-id3",
+          "model-version-id": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
+          "id": "AAI-12002-test3-vm230w",
+          "description": "a9DEa0kpY",
+          "instance-group-type": "type",
+          "resource-version": "1520888659539",
+          "instance-group-name": "wKmBXiO1xm8bK",
+          "instance-group-function": "testfunction2",
+          "relationship-list": {
+            "relationship": [
+              {
+                "relationDataList": [
+                  {
+                    "relationship-key": "cloud-region.cloud-owner",
+                    "relationship-value": "AAI-12002-vm230w"
+                  },
+                  {
+                    "relationship-key": "cloud-region.cloud-region-id",
+                    "relationship-value": "AAI-region-vm230w"
+                  }
+                ],
+                "relatedToPropertyList": [
+                  {
+                    "property-key": "cloud-region.owner-defined-type",
+                    "property-value": null
+                  }
+                ],
+                "related-to": "cloud-region",
+                "related-link": "/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/AAI-12002-vm230w/AAI-region-vm230w",
+                "relationship-label": "org.onap.relationships.inventory.Uses",
+                "relationship-data": [
+                  {
+                    "relationship-key": "cloud-region.cloud-owner",
+                    "relationship-value": "AAI-12002-vm230w"
+                  },
+                  {
+                    "relationship-key": "cloud-region.cloud-region-id",
+                    "relationship-value": "AAI-region-vm230w"
+                  }
+                ],
+                "related-to-property": [
+                  {
+                    "property-key": "cloud-region.owner-defined-type",
+                    "property-value": null
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      }
+    };
+    let expectedResult = {
+      "requestInfo": {
+        "productFamilyId": "e433710f-9217-458d-a79d-1c7aff376d89",
+        "source": "VID",
+        "requestorId": "az2016",
+        "suppressRollback": false
+      },
+      "lineOfBusiness": Object({ lineOfBusinessName: "ecomp" }),
+      "cloudConfiguration": {
+        "lcpCloudRegionId": "AAIAIC25",
+        "tenantId": "092eb9e8e4b7412e8787dd091bc58e86"
+      },
+      "platform": Object({ platformName: "plat1" }),
+      "modelInfo": {
+        modelCustomizationId :'1',
+        "modelVersionId": "61535073-2e50-4141-9000-f66fea69b433",
+        "modelCustomizationName": "vDBE 0",
+        "modelName": "vDBE",
+        "modelInvariantId": "fcdf49ce-6f0b-4ca2-b676-a484e650e734",
+        "modelType": "vnf",
+        "modelVersion": "0.2"
+      },
+      "requestParameters": {
+        "userParams": [],
+        "testApi": "GR_API"
+      },
+      "relatedInstanceList": [
+        {
+          "relatedInstance": {
+            "instanceId": "6bce7302-70bd-4057-b48e-8d5b99e686ca",
+            "modelInfo": {
+              "modelVersionId": "6bce7302-70bd-4057-b48e-8d5b99e686ca",
+              "modelName": "vDBE_srv",
+              "modelInvariantId": "9aa04749-c02c-432d-a90c-18caa361c833",
+              "modelType": "service",
+              "modelVersion": "1.0"
+            }
+          }
+        },
+        {
+          "relatedInstance": {
+            "instanceId": "AAI-12002-test3-vm230w",
+            "modelInfo": {
+              "modelName": "oam_group",
+              "modelType": "networkCollection",
+              "modelVersion": "1",
+              "modelVersionId": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
+              "modelInvariantId": "9384abf9-1231-4da4-bd8d-89e4d2f8a749"
+            }
+          }
+        },
+        {
+          "relatedInstance": {
+            "instanceId": "AAI-12002-test3-vm230w",
+            "modelInfo": {
+              "modelName": "oam_group",
+              "modelType": "networkCollection",
+              "modelVersion": "1",
+              "modelVersionId": "a0efd5fc-f7be-4502-936a-a6c6392b958f",
+              "modelInvariantId": "9384abf9-1231-4da4-bd8d-89e4d2f8a749"
+            }
+          }
+        }
+      ]
+    };
+
+
+    let actualResult_withEcompGeneratedNaming = <any>createRequest("az2016",userInputs_withEcompGeneratedNaming, service, serviceInstanceId, networkInstanceGroups,'vDBE 0','1');
+    expect(actualResult_withEcompGeneratedNaming).toEqual(expectedResult);
+    expectedResult["requestInfo"]["instanceName"] = "New Name";
+    let actualResult_withoutEcompGeneratedNaming = <any>createRequest("az2016",userInputs_withoutEcompGeneratedNaming, service, serviceInstanceId, networkInstanceGroups,'vDBE 0','1');
+    expect(actualResult_withoutEcompGeneratedNaming).toEqual(expectedResult);
+    done();
+  });
+});
diff --git a/vid-webpack-master/src/app/factories/mso.factory.ts b/vid-webpack-master/src/app/factories/mso.factory.ts
new file mode 100644 (file)
index 0000000..c26296e
--- /dev/null
@@ -0,0 +1,92 @@
+import { RequestInfo, RequestDetails, ModelInfo, CloudConfiguration, LineOfBusiness, Platform, RelatedInstanceList, VfcModel } from "./models/requestDetails.model";
+import * as _ from "lodash";
+
+function extractModelInfoFromNodeTemplate(node: any, type: string) {
+  let modelInfo: ModelInfo = <ModelInfo>{};
+  if (node["customizationUuid"] !== undefined) {
+    modelInfo.modelCustomizationId = node["customizationUuid"];
+  }
+  if (node["modelCustomizationName"] !== undefined) {
+    modelInfo.modelCustomizationName = node["modelCustomizationName"];
+  }
+  modelInfo.modelVersionId = node["uuid"];
+  modelInfo.modelName = node["name"];
+  modelInfo.modelInvariantId = node["invariantUuid"];
+  modelInfo.modelType = type;
+  modelInfo.modelVersion = node["version"];
+  return modelInfo;
+}
+
+function extractRequestInfo(userInputs: any, userId: string): RequestInfo {
+  let requestInfo: RequestInfo = <RequestInfo>{};
+  if (userInputs["instanceName"] !== undefined) requestInfo.instanceName = userInputs["instanceName"];
+  requestInfo.productFamilyId = userInputs["productFamily"];
+  requestInfo.source = "VID";
+  requestInfo.suppressRollback = userInputs["rollback"] === "false";
+  requestInfo.requestorId = userId;
+  return requestInfo;
+}
+
+function extractPlatform(userInputs: any): Platform {
+  let platform: Platform = <Platform>{};
+  platform.platformName = userInputs["platformName"];
+  return platform;
+}
+
+function extractVfcGroupModelAccordingToUuid(vnfModel: any, vfcUuid: string) {
+  return _.find(vnfModel.vfcInstanceGroups, { uuid: vfcUuid });
+}
+
+function extractLineOfBusiness(userInputs: any) {
+  let lob: LineOfBusiness = <LineOfBusiness>{};
+  lob.lineOfBusinessName = userInputs["lineOfBusiness"];
+  return lob;
+}
+
+function extractCloudConfiguration(userInputs: any) {
+  let cloudConfig: CloudConfiguration = <CloudConfiguration>{};
+  cloudConfig.lcpCloudRegionId = userInputs["lcpRegion"];
+  cloudConfig.tenantId = userInputs["tenantId"];
+  return cloudConfig;
+}
+
+function extractModelInfoFromVfcNode(vfcModel: VfcModel): ModelInfo {
+  let modelinfo: ModelInfo = <ModelInfo>{};
+  modelinfo.modelName = vfcModel.name;
+  modelinfo.modelType = "networkCollection";
+  modelinfo.modelVersion = vfcModel.version;
+  modelinfo.modelVersionId = vfcModel.uuid;
+  modelinfo.modelInvariantId = vfcModel.invariantUuid;
+  return modelinfo;
+}
+
+export function createRequest(userId: string, userInputs: any, service: any, serviceInstanceId: string, networkInstanceGroups: any, vnfCustomizationName: string, vnfCustomizationId: string) {
+  let request: RequestDetails = <RequestDetails>{};
+  request.requestInfo = extractRequestInfo(userInputs, userId);
+  request.lineOfBusiness = extractLineOfBusiness(userInputs);
+  request.cloudConfiguration = extractCloudConfiguration(userInputs);
+  request.platform = extractPlatform(userInputs);
+  request.modelInfo = extractModelInfoFromNodeTemplate(service.vnfs[vnfCustomizationName], "vnf");
+  request.requestParameters = { userParams: [], testApi: sessionStorage.getItem("msoRequestParametersTestApiValue")};
+  request.relatedInstanceList = [];
+  let serviceRelatedInstance: RelatedInstanceList = {
+    relatedInstance: {
+      instanceId: serviceInstanceId,
+      modelInfo: extractModelInfoFromNodeTemplate(service.service, "service")
+    }
+  };
+  request.relatedInstanceList.push(serviceRelatedInstance);
+  _.forOwn(networkInstanceGroups, function(group) {
+    let modelUuid = group["instance-group"]["model-version-id"];
+    let vfcModel = extractVfcGroupModelAccordingToUuid(service.vnfs[vnfCustomizationName], modelUuid);
+    let networkInstanceGroup: RelatedInstanceList = {
+      relatedInstance: {
+        instanceId: group["instance-group"].id,
+        modelInfo: extractModelInfoFromVfcNode(vfcModel)
+      }
+    };
+    request.relatedInstanceList.push(networkInstanceGroup);
+  });
+
+  return request;
+}
diff --git a/vid-webpack-master/src/app/global.actions.ts b/vid-webpack-master/src/app/global.actions.ts
new file mode 100644 (file)
index 0000000..46575fb
--- /dev/null
@@ -0,0 +1,23 @@
+import {Action, ActionCreator} from "redux";
+export const UPDATE_NAME= '[NAME] Update';
+export const UPDATE_FLAGS= '[FLAGS] Update';
+
+export interface UpdateGlobalAction extends Action {
+  name?: string;
+}
+
+export interface UpdateFlagsAction extends Action {
+  flags?: any;
+}
+
+export const updateName: ActionCreator<UpdateGlobalAction> =
+  (name) => ({
+    type: UPDATE_NAME,
+    name: name
+  });
+
+export const updateFlags: ActionCreator<UpdateFlagsAction> =
+  (flags) => ({
+    type: UPDATE_FLAGS,
+    flags: flags
+  });
diff --git a/vid-webpack-master/src/app/global.reducer.ts b/vid-webpack-master/src/app/global.reducer.ts
new file mode 100644 (file)
index 0000000..cffd346
--- /dev/null
@@ -0,0 +1,29 @@
+/* tslint:disable no-switch-case-fall-through */
+import {Action} from 'redux';
+import {UPDATE_FLAGS, UPDATE_NAME, UpdateFlagsAction, UpdateGlobalAction} from "./global.actions";
+
+
+
+export interface GlobalState {
+  name : string;
+  flags : { [key: string]: boolean };
+}
+
+const initialState: GlobalState = {
+  name : null,
+  flags : null
+};
+
+
+export const GlobalReducer =
+  function (state: GlobalState = initialState, action: Action): GlobalState {
+    switch (action.type) {
+      case UPDATE_NAME:
+        return Object.assign(state, state, (<UpdateGlobalAction>action));
+      case UPDATE_FLAGS:
+        Object.assign(state, (<UpdateFlagsAction>action));
+        return Object.assign({}, state);
+      default:
+        return state;
+    }
+  };
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.component.html b/vid-webpack-master/src/app/healthStatus/health-status.component.html
new file mode 100644 (file)
index 0000000..600c873
--- /dev/null
@@ -0,0 +1,36 @@
+<div class="row">
+  <div class="health-status-header">
+    <div>
+      <div class="row" style="margin-left: 0;">
+        <div>
+          <span class="title">Health Status </span>
+        </div>
+        <div class="lastUpdate">
+          <div style="float: left;margin-top: 3px;"><span>Last update:  {{lastUpdatedDate | date:'MMM. dd, yyyy | HH:mm'}}</span>
+          </div>
+          <div class="refresh-btn" [ngClass]="{'spin' : !dataIsReady}" (click)="refreshData()">
+            <span class="icon-refresh"></span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+<div class="row">
+  <table id="health-status-table" class="table table-bordered">
+    <tbody>
+      <tr class="row spaceUnder" *ngFor="let componentStatus of componentStatuses" [attr.data-tests-id]="'component-'+componentStatus?.component">
+        <td class="col-md-1 col-xs-1 component-name"
+            [attr.data-tests-id]="'component-name-'+componentStatus?.component"
+            [ngClass]="isAvailable(componentStatus) ? 'border-is-ok': 'border-not-ok'">
+          {{componentStatus?.component}}
+        </td>
+        <td class="col-md-11 col-xs-3 component-metadata-cell"
+            [attr.data-tests-id]="'component-metadata-'+componentStatus?.component"
+            [ngClass]="isAvailable(componentStatus) ? 'border-is-ok': 'border-not-ok'">
+          <pre class="component-metadata">{{getMetadata(componentStatus) | json}}</pre>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</div>
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.component.scss b/vid-webpack-master/src/app/healthStatus/health-status.component.scss
new file mode 100644 (file)
index 0000000..0dda6b2
--- /dev/null
@@ -0,0 +1,187 @@
+div.dataTables_wrapper {
+  width: 800px;
+  margin: 0 auto;
+}
+
+.row {
+  margin-left: 15px;
+  margin-right: 15px;
+}
+
+.health-status-header {
+  margin-top: 30px;
+  .title {
+    font-family: OpenSans-Semibold;
+    font-size: 24px;
+    color: #4A4A4A;
+    float: left;
+  }
+
+  .info {
+    width: 18px;
+    height: 18px;
+    border: 0;
+    background-size: auto 100%;
+    cursor: pointer;
+    float: left;
+    margin: 10px;
+  }
+
+  .refresh-btn {
+    float: left;
+    margin-top: 6px;
+    margin-left: 10px;
+    cursor: pointer;
+  }
+
+  .lastUpdate {
+    margin-top: 5px;
+    padding-top: 0px;
+    font-size: 15px;
+    border-left: 1px solid black;
+    float: left;
+    padding-left: 10px;
+    color: gray;
+    height: 26px;
+    margin-left: 10px;
+  }
+
+  .refreshBtn {
+    width: 18px;
+    height: 18px;
+    border: 0;
+    background-size: auto 100%;
+    outline: none;
+    margin-left: 10px;
+    background: transparent;
+  }
+
+  svg-icon use {
+    fill: #0000ff !important;
+  }
+
+  //.sub-title {
+  //  font-family: OpenSans-Semibold;
+  //  font-size: 14px;
+  //  color: #4A4A4A;
+  //  margin-left: 0;
+  //}
+}
+
+.loader {
+  border: 5px solid #f3f3f3;
+  border-radius: 50%;
+  border-top: 5px solid #3498db;
+  width: 170px;
+  height: 170px;
+  -webkit-animation: spin 2s linear infinite;
+  animation: spin 2s linear infinite;
+  position: absolute;
+  left: 50%;
+  right: 50%;
+  top: 50%;
+}
+
+/* Safari */
+@-webkit-keyframes spin {
+  0% { -webkit-transform: rotate(0deg); }
+  100% { -webkit-transform: rotate(360deg); }
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+
+.spin {
+  -webkit-animation: spin .4s infinite linear;
+  -moz-animation: spin .4s infinite linear;
+  -o-animation: spin .4s infinite linear;
+  animation: spin .4s infinite linear;
+  -webkit-transform-origin: 50% 44%;
+  transform-origin:50% 44%;
+  -ms-transform-origin:50% 44% /* IE 9 */
+}
+
+@-moz-keyframes spin {
+  from {
+    -moz-transform: rotate(0deg);
+  }
+  to {
+    -moz-transform: rotate(360deg);
+  }
+}
+
+@-webkit-keyframes spin {
+  from {
+    -webkit-transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+  }
+}
+
+@keyframes spin {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+.icon-refresh:before {
+  font-family: icomoon;
+  content: '\e936';
+}
+
+.row{
+  max-width: 1500px;
+}
+
+.red {
+  color: red;
+}
+
+.border-not-ok {
+  border : 2px solid red;
+}
+
+.border-is-ok {
+  border : 2px solid #2fcc66;
+}
+
+
+.component-name {
+  min-width: 100px;
+  vertical-align: middle;
+  text-align: center;
+  background: #f5f5f5;
+  border-right: unset;
+}
+
+.component-metadata-cell {
+  border-left: unset;
+}
+
+.component-metadata {
+  white-space: pre-wrap;
+  background-color: unset;
+  border: unset;
+  font-family: OpenSans-Semibold;
+  font-size: 12px;
+}
+
+
+.table-bordered {
+  margin-top: 10px;
+  font-family: OpenSans-Semibold;
+  font-size: 12px;
+  overflow-x: auto;
+  display: block;
+  color: #5A5A5A;
+  border: none;
+  border-spacing: 0px 3px;
+  border-collapse: separate;
+}
diff --git a/vid-webpack-master/src/app/healthStatus/health-status.component.ts b/vid-webpack-master/src/app/healthStatus/health-status.component.ts
new file mode 100644 (file)
index 0000000..6a9ddfd
--- /dev/null
@@ -0,0 +1,42 @@
+import { Component, OnInit } from '@angular/core';
+import {ExternalComponentStatus} from "../shared/models/externalComponentStatus";
+import {HealthStatusService} from "../shared/server/healthStatusService/health-status.service";
+
+@Component({
+  selector: 'app-health-status',
+  templateUrl: './health-status.component.html',
+  styleUrls: ['./health-status.component.scss']
+})
+export class HealthStatusComponent implements OnInit {
+  private componentStatuses: Array<ExternalComponentStatus> = [];
+  private dataIsReady: boolean;
+  private lastUpdatedDate: Date;
+
+  constructor(private _healthStatusService: HealthStatusService) {
+  }
+
+
+  ngOnInit() {
+    this.refreshData();
+  }
+
+  refreshData(): void {
+    this.dataIsReady = false;
+    this._healthStatusService.getProbe()
+      .subscribe((res: Array<ExternalComponentStatus>) => {
+        this.componentStatuses = res;
+        this.dataIsReady = true;
+        this.lastUpdatedDate = new Date();
+      })
+  }
+
+  getMetadata(status : ExternalComponentStatus):string {
+    let metadata = status.metadata;
+    delete metadata.rawData;
+    return metadata;
+  }
+
+  isAvailable(componentStatus: ExternalComponentStatus) {
+    return componentStatus.available;
+  }
+}
diff --git a/vid-webpack-master/src/app/home/home.component.e2e-spec.js b/vid-webpack-master/src/app/home/home.component.e2e-spec.js
new file mode 100644 (file)
index 0000000..41203f9
--- /dev/null
@@ -0,0 +1,13 @@
+describe('Home', function () {
+
+  beforeEach(function () {
+    browser.get('/');
+  });
+
+  it('should have <my-home>', function () {
+    var home = element(by.css('vid-app my-home'));
+    expect(home.isPresent()).toEqual(true);
+    expect(home.getText()).toEqual("Home Works!");
+  });
+
+});
diff --git a/vid-webpack-master/src/app/home/home.component.html b/vid-webpack-master/src/app/home/home.component.html
new file mode 100644 (file)
index 0000000..604d9e1
--- /dev/null
@@ -0,0 +1,3 @@
+<p>
+  Home Works!
+</p>
diff --git a/vid-webpack-master/src/app/home/home.component.scss b/vid-webpack-master/src/app/home/home.component.scss
new file mode 100644 (file)
index 0000000..5db1e17
--- /dev/null
@@ -0,0 +1,4 @@
+// component styles are encapsulated and only applied to their components
+* {
+  color: #FFEF00;
+}
diff --git a/vid-webpack-master/src/app/home/home.component.ts b/vid-webpack-master/src/app/home/home.component.ts
new file mode 100644 (file)
index 0000000..1adaf0e
--- /dev/null
@@ -0,0 +1,30 @@
+import { Component, OnInit } from '@angular/core';
+import { SdcService } from '../services/sdc.service';
+import { DataService } from '../services/data.service';
+
+@Component({
+  selector: 'my-home',
+  templateUrl: './home.component.html',
+  styleUrls: ['./home.component.scss'],
+  providers: [SdcService, DataService]
+})
+export class HomeComponent implements OnInit {
+
+  constructor(private _sdcService: SdcService) {
+    // Do stuff
+  }
+
+  ngOnInit() {
+    console.log('Hello Home');
+    console.log('getServicesModels: ');
+    this._sdcService.getServicesModels().subscribe(
+      // onNext() function
+      value => console.log('value is ', value),
+      // onError() function
+      error => console.log('error is ', error),
+      // onComplete() function
+      () => console.log('completed')
+    );
+  }
+
+}
diff --git a/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts b/vid-webpack-master/src/app/instantiationStatus/InstantiationStatus.module.ts
new file mode 100644 (file)
index 0000000..01db0f1
--- /dev/null
@@ -0,0 +1,33 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { InputsModule } from '../modules/inputs.module';
+import { DataTableModule } from 'angular2-datatable';
+import { BootstrapModalModule } from 'ng2-bootstrap-modal';
+import { TooltipModule } from 'ngx-tooltip';
+import { InstantiationStatusComponent } from './instantiationStatus.component';
+import { InstantiationStatusComponentService } from './instantiationStatus.component.service';
+import { SharedModule } from '../shared/shared.module';
+import { AngularSvgIconModule } from 'angular-svg-icon';
+import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu';
+import {ModalModule, PopoverModule} from 'ngx-bootstrap';
+import {AuditInfoModalComponent} from "./auditInfoModal/auditInfoModal.component";
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    ReactiveFormsModule,
+    BootstrapModalModule,
+    DataTableModule,
+    TooltipModule,
+    ModalModule,
+    InputsModule,
+    AngularSvgIconModule,
+    ContextMenuModule,
+    SharedModule.forRoot(),
+    PopoverModule.forRoot()],
+  declarations: [InstantiationStatusComponent, AuditInfoModalComponent],
+  providers: [InstantiationStatusComponentService, ContextMenuService]
+})
+export class InstantiationStatusModule { }
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html b/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.html
new file mode 100644 (file)
index 0000000..9386af3
--- /dev/null
@@ -0,0 +1,84 @@
+<div class="modal fade" bsModal #auditInfoModal="bs-modal" [config]="{backdrop: 'static'}"
+     tabindex="-1" role="dialog" aria-labelledby="dialog-static-name">
+  <div id="audit-info-modal" class="">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" (click)="onCancelClick()">&times;</button>
+        <span [attr.data-tests-id]="'audit-info-title'" class="modal-title">{{title}}</span>
+      </div>
+      <div class="modal-body row">
+        <div class="col-md-4 left-panel">
+          <div id="service-model-name" class="row">SERVICE MODEL: {{serviceModelName}}</div>
+          <div class="row service-model">
+            <model-information [modelInformationItems]="modelInfoItems"></model-information>
+          </div>
+        </div>
+        <div class="col-md-8 right-panel">
+            <div class="row"><span class="table-title">VID status</span></div>
+            <div class="row">
+              <table id="service-instantiation-audit-info-vid"  class="table table-bordered">
+                <thead class="thead-dark">
+                <tr class="row">
+                  <th class="col-md-4" scope="col">Status</th>
+                  <th class="col-md-4" scope="col">Status time</th>
+                  <th class="col-md-4" scope="col">Final</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr class="row" *ngFor="let data of vidInfoData">
+                  <td class="col-md-4" id="vidJobStatus" [attr.data-tests-id]="'vidJobStatus'">
+                    <custom-ellipsis [id]="data?.jobStatus" [value]="data?.jobStatus | capitalizeAndFormat"></custom-ellipsis>
+                  </td>
+                  <td class="col-md-4" id="vidStatusTime">
+                    <custom-ellipsis [id]="data?.vidCreated"
+                                     [value]="data?.createdDate | date:'MMM dd, yyyy HH:mm'"></custom-ellipsis>
+                  </td>
+                  <td class="col-md-4" id="vidFinalStatus">
+                    <custom-ellipsis [id]="data?.final"
+                                     [value]="data?.final ? 'Yes' : 'No'"></custom-ellipsis>
+                  </td>
+                </tr>
+                </tbody>
+              </table>
+              <div class="no-result" *ngIf="!isLoading && vidInfoData?.length == 0">There is no data.</div>
+            </div>
+
+            <div class="row"><span class="table-title">MSO status</span></div>
+            <table id="service-instantiation-audit-info-mso" class="table table-bordered">
+              <thead class="thead-dark row">
+              <tr class="row">
+                <th class="col-md-3" scope="col">Request ID</th>
+                <th class="col-md-3" scope="col">Status</th>
+                <th class="col-md-3" scope="col">Status time</th>
+                <th class="col-md-3" scope="col">Additional info</th>
+              </tr>
+              </thead>
+              <tbody>
+              <tr class="row" *ngFor="let data of msoInfoData">
+                <td class="col-md-3" id="msoRequestId">
+                  <custom-ellipsis [id]="data?.requestId" [value]="data?.requestId"></custom-ellipsis>
+                </td>
+                <td class="col-md-3" id="msoJobStatus">
+                  <custom-ellipsis [id]="data?.jobStatus" [value]="data?.jobStatus | capitalizeAndFormat"></custom-ellipsis>
+                </td>
+                <td class="col-md-3" id="msoStatusTime">
+                  <custom-ellipsis [id]="data?.vidCreated"
+                                   [value]="data?.createdDate  | date:'MMM dd, yyyy HH:mm'"></custom-ellipsis>
+                </td>
+                <td class="col-md-3" id="msoAdditionalInfo">
+                  <custom-ellipsis [id]="data?.additionalInfo" [value]="data?.additionalInfo"></custom-ellipsis>
+                </td>
+              </tr>
+              </tbody>
+            </table>
+          <div class="no-result" *ngIf="!isLoading && msoInfoData?.length == 0">There is no data.</div>
+          </div>
+      </div>
+      <div class="modal-footer row">
+        <button id="cancelButton" type="button" class="btn btn-default cancel" (click)="onCancelClick()">
+          Close
+        </button>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss b/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.scss
new file mode 100644 (file)
index 0000000..27b2714
--- /dev/null
@@ -0,0 +1,159 @@
+.templatebody.modal-open{
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000;
+  opacity: 0.5;
+}
+.modal{
+
+  #audit-info-modal {
+
+    .modal-content{
+      border-radius: 0px;
+      border: none;
+      .modal-header{
+        background: #009FDB;
+        font-size: 24px;
+        color: #ffffff;
+        .close{
+          font-size: 32px;
+          font-weight: 200;
+          color: #ffffff;
+          text-shadow: none;
+          filter: none;
+          opacity: 1;
+          &:hover{
+            color: #d2d2d2;
+          }
+        }
+        .modal-title{
+
+        }
+      }
+      .modal-body{
+        padding: 0px;
+        margin: 0px;
+        display: flex;
+        .left-panel{
+          background: #f2f2f2;
+          border-right: 1px solid #D2D2D2;
+          padding-right: 0px;
+          .row:first-child{
+            border-bottom: 1px solid #D2D2D2;
+            height: 50px;
+            font-size: 12px;
+            line-height: 50px;
+            padding-left: 30px;
+            font-weight: 700;
+            margin-right: 0px;
+          }
+          .service-model{
+            padding-left: 30px;
+            padding-top: 15px;
+          }
+        }
+        .right-panel{
+          padding: 30px 30px 15px 30px;
+          .row{
+            margin: 0px;
+          }
+          .table-title{
+            font-size: 12px;
+            text-transform: uppercase;
+            font-weight: bold;
+          }
+          .no-result{
+            margin-bottom: 20px;
+            text-align: center;
+            border: 1px solid #d2d2d2;
+            padding: 20px;
+            margin-top: -23px;
+          }
+
+          .table-bordered{
+            width: 100%;
+            margin-top: 10px;
+            font-family: OpenSans-Semibold;
+            font-size: 12px;
+            overflow-x: auto;
+            display: block;
+            color: #5A5A5A;
+
+            thead {
+              position: sticky;
+              top: 0;
+              z-index: 100;
+              display: block;
+              background: rgb(242, 242, 242);
+              border-bottom: 1px solid #d2d2d2;
+              tr {
+                display: flex;
+                th {
+                  flex-grow: 1;
+                  border-right: 1px solid #d2d2d2;
+                  &:last-child{
+                    border-right: none;
+                  }
+                }
+              }
+            }
+
+            tbody {
+              border: none !important;
+              max-height: 152px;
+              display: block;
+
+              tr {
+                display: flex;
+                border-bottom: 1px solid #d2d2d2;
+                &:last-child{
+                  border-bottom: none;
+                }
+                td {
+                  border: none;
+                  border-right: 1px solid #d2d2d2;
+                  &:last-child{
+                    border-right: none;
+                  }
+                }
+              }
+            }
+
+            th {
+              background: #f2f2f2;
+              font-family: OpenSans-Semibold;
+              color: #000000;
+              font-weight: bold;
+              border: none;
+            }
+
+            tr.odd {
+              background-color: rgb(242, 242, 242);
+            }
+
+            tr:hover {
+              background: #e1e1e1;
+            }
+          }
+        }
+      }
+      .modal-footer{
+        margin: 0px;
+        .cancel{
+          width: 120px;
+          height: 36px;
+          background: #009fdb;
+          border-radius: 2px;
+          font-family: OpenSans-Regular;
+          font-size: 14px;
+          color: #ffffff;
+          line-height: 16px;
+        }
+      }
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts b/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.service.ts
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts b/vid-webpack-master/src/app/instantiationStatus/auditInfoModal/auditInfoModal.component.ts
new file mode 100644 (file)
index 0000000..1cff97f
--- /dev/null
@@ -0,0 +1,83 @@
+import {Component, ViewChild} from '@angular/core';
+import {Subject} from 'rxjs/Subject';
+import {ModalDirective} from 'ngx-bootstrap'
+import {Constants} from '../../shared/utils/constants';
+import {ModelInformationItem} from '../../shared/components/model-information/model-information.component';
+import {ServiceModel} from '../../shared/models/serviceModel';
+import {ServiceInfoService} from '../../shared/server/serviceInfo/serviceInfo.service';
+import {ServiceInfoModel} from '../../shared/server/serviceInfo/serviceInfo.model';
+import {AuditStatus} from '../../shared/server/serviceInfo/AuditStatus.model';
+import {IframeService} from "../../shared/utils/iframe.service";
+
+@Component({
+  selector: 'audit-info-modal',
+  templateUrl: './auditInfoModal.component.html',
+  styleUrls: ['./auditInfoModal.component.scss']
+})
+export class AuditInfoModalComponent {
+  static openModal: Subject<ServiceInfoModel> = new Subject<ServiceInfoModel>();
+  @ViewChild('auditInfoModal') public auditInfoModal: ModalDirective;
+  title: string = Constants.AuditInfoModal.TITLE;
+  modelInfoItems: Array<ModelInformationItem> = [];
+  serviceModel: ServiceModel;
+  serviceModelName: string;
+  vidInfoData: Array<AuditStatus> = [];
+  msoInfoData: Array<AuditStatus> = [];
+  parentElementClassName = 'content';
+  isLoading = true;
+
+  constructor(private _serviceInfoService: ServiceInfoService, private _iframeService : IframeService) {
+    AuditInfoModalComponent.openModal.subscribe((jobData: ServiceInfoModel) => {
+      this.initializeProperties();
+      if (jobData) {
+        this.openAuditInfoModal(jobData);
+        _iframeService.addClassOpenModal(this.parentElementClassName);
+        this.serviceModelName = jobData.serviceModelName ? jobData.serviceModelName : '';
+        this.auditInfoModal.show();
+      } else {
+        _iframeService.removeClassCloseModal(this.parentElementClassName);
+        this.auditInfoModal.hide();
+      }
+    })
+  }
+
+  initializeProperties() : void {
+    this.modelInfoItems = null;
+    this.vidInfoData = [];
+    this.msoInfoData = [];
+    this.isLoading = true;
+  }
+
+  openAuditInfoModal(jobData: ServiceInfoModel): void {
+    this.modelInfoItems = this.createModelInformationItems(jobData);
+    this.initAuditInfoData(jobData['jobId']);
+    this.auditInfoModal.show();
+  }
+
+  initAuditInfoData(jobId: string) {
+    this._serviceInfoService.getJobAuditStatus(jobId)
+      .subscribe((res: Array<Array<AuditStatus>>) => {
+        this.vidInfoData = res[0];
+        this.msoInfoData = res[1];
+        this.isLoading = false;
+      });
+  }
+
+  createModelInformationItems(serviceModel: ServiceInfoModel): Array<ModelInformationItem> {
+      return [
+        new ModelInformationItem('Subscriber name', 'subscriberName', [serviceModel.subscriberName]),
+        new ModelInformationItem('Service type', 'serviceType', [serviceModel.serviceType]),
+        new ModelInformationItem('Service model version', 'serviceModelVersion', [serviceModel.serviceModelVersion]),
+        new ModelInformationItem('Service instance name', 'serviceInstanceName', [serviceModel.serviceInstanceName], '', true),
+        new ModelInformationItem('Service instance ID', 'serviceInstanceId', [serviceModel.serviceInstanceId]),
+        new ModelInformationItem('Requestor User ID', 'userId', [serviceModel.userId]),
+    ];
+  }
+
+  onCancelClick() {
+    this._iframeService.removeClassCloseModal(this.parentElementClassName);
+    this.initializeProperties();
+    this.auditInfoModal.hide();
+  }
+}
+
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.html
new file mode 100644 (file)
index 0000000..e0641d0
--- /dev/null
@@ -0,0 +1,100 @@
+<div class="row">
+  <div class="instantiation-status-header">
+    <div>
+      <div class="row" style="margin-left: 0;">
+        <div>
+          <span class="title">Instantiation Status</span>
+          <span class="icon-info"
+                triggers="mouseenter:mouseleave"
+                popover="This table presents all the instantiation requests you made that are waiting, during or finished instantiating. You may see others requests by removing the Show only my requests checkmark."
+                placement="bottom"></span>
+
+        </div>
+        <div class="lastUpdate">
+          <div style="float: left;margin-top: 3px;"><span>Last update:  {{lastUpdatedDate | date:'MMM. dd, yyyy | HH:mm'}}</span></div>
+          <div id="refresh-btn" class="refresh-btn" [ngClass]="{'spin' : !dataIsReady}" (click)="deactivateInterval(); refreshData(); activateInterval();">
+            <span class="icon-refresh"></span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="instantiation-status-data table-responsive">
+    <table id="instantiation-status" class="table table-bordered">
+      <thead class="thead-dark">
+      <tr>
+        <th scope="col" class="smallTd">User ID</th>
+        <th scope="col" class="normal">Model Name</th>
+        <th scope="col" class="normal">Instance Name</th>
+        <th scope="col" class="smallTd">Model version</th>
+        <th scope="col" class="normal">Subscriber</th>
+        <th scope="col" class="mediumTd">Service Type</th>
+        <th scope="col" class="normal">Region</th>
+        <th scope="col" class="mediumTd">Tenant</th>
+        <th scope="col" class="mediumTd">AIC Zone</th>
+        <th scope="col" class="mediumTd">Project</th>
+        <th scope="col" class="mediumTd">Owning entity</th>
+        <th scope="col" class="smallTd">Pause</th>
+        <th scope="col" class="mediumTd">Date</th>
+        <th scope="col" class="last">Status</th>
+      </tr>
+      </thead>
+      <tbody >
+        <tr *ngFor="let data of serviceInfoData; let i = index" [ngClass]="{'odd' : data.serviceIndex%2 == 1}" [id]="data.jobId"  (mouseenter)="currentJobId = data?.jobId">
+          <td class="smallTd" id="userId"><custom-ellipsis [id]="data.userId" [value]="data.userId"></custom-ellipsis></td>
+          <td class="normal" id="serviceModelName"><custom-ellipsis [id]="data.serviceModelName" [value]="data.serviceModelName"></custom-ellipsis></td>
+          <td class="normal" id="serviceInstanceName"><custom-ellipsis [id]="data.serviceInstanceName" [value]="data.serviceInstanceName"></custom-ellipsis></td>
+          <td class="smallTd" id="serviceModelVersion"><custom-ellipsis [id]="data.serviceModelVersion" [value]="data.serviceModelVersion"></custom-ellipsis></td>
+          <td class="normal" id="subscriberName"><custom-ellipsis [id]="data.subscriberName" [value]="data.subscriberName"></custom-ellipsis></td>
+          <td class="mediumTd" id="serviceType"><custom-ellipsis [id]="data.serviceType" [value]="data.serviceType"></custom-ellipsis></td>
+          <td class="normal" id="regionId"><custom-ellipsis [id]="data.regionId" [value]="data.regionId"></custom-ellipsis></td>
+          <td class="mediumTd" id="tenantName"><custom-ellipsis [id]="data.tenantName" [value]="data.tenantName"></custom-ellipsis></td>
+          <td class="mediumTd" id="aicZoneName"><custom-ellipsis [id]="data.aicZoneName" [value]="data.aicZoneName"></custom-ellipsis></td>
+          <td class="mediumTd" id="project"><custom-ellipsis [id]="data.project" [value]="data.project"></custom-ellipsis></td>
+          <td class="mediumTd" id="owningEntityName"><custom-ellipsis [id]="data.owningEntityName" [value]="data.owningEntityName"></custom-ellipsis></td>
+          <td class="smallTd" id="pause"><custom-ellipsis [id]="data.pause" [value]="data.pause"></custom-ellipsis></td>
+          <td class="mediumTd" id="created"><custom-ellipsis [id]="data.created" [value]="data.created | date:'MMM. dd, yyyy HH:mm'"></custom-ellipsis></td>
+          <td class="last" id="jobStatus" [ngClass]="data.jobStatus">
+            <custom-popover [value]="data.serviceStatus.tooltip" style="float: left;">
+              <svg-icon  id="jobStatusIcon-{{i}}" (click)="auditInfo(data)" svg-directive [fill]="data.serviceStatus.color" [widthViewBox]="27" [heightViewBox]="27"
+                        src="./assets/img/{{data.serviceStatus.iconClassName}}.svg"></svg-icon>
+            </custom-popover>
+            <div class="menu-div" (click)="onContextMenu($event, data); currentJobId = data.jobId">
+                <span class="icon-menu"></span>
+              <context-menu>
+                <ng-template contextMenuItem (execute)="open($event?.item)" [enabled]="isOpenVisible">
+                  <div [attr.data-tests-id]="'context-menu-open'">
+                    <span class="context-menu-icon"><i class="fa fa-external-link" aria-hidden="true"></i></span>
+                    Open
+                  </div>
+                </ng-template>
+                <ng-template contextMenuItem (execute)="auditInfo($event?.item)">
+                  <div  [attr.data-tests-id]="'context-menu-audit-info'">
+                    <span class="context-menu-icon audit-icon"><i class="fa fa-info-circle" aria-hidden="true"></i></span>
+                    Audit info
+                  </div>
+                </ng-template>
+                <ng-template contextMenuItem let-item (execute)="deleteItem($event?.item)" [enabled]="isDeleteEnabled">
+                  <div [attr.data-tests-id]="'context-menu-delete'">
+                    <span class="context-menu-icon"><i class="fa fa-trash-o" aria-hidden="true"></i></span>
+                    Delete
+                  </div>
+                </ng-template>
+                <ng-template contextMenuItem let-item (execute)="hideItem($event?.item)" [enabled]="isHideEnabled">
+                  <div [attr.data-tests-id]="'context-menu-hide'">
+                    <span class="context-menu-icon"><i class="fa fa-eye-slash" aria-hidden="true"></i></span>
+                    Hide request
+                  </div>
+                </ng-template>
+              </context-menu>
+            </div>
+          </td>
+      </tr>
+      </tbody>
+    </table>
+  </div>
+  <audit-info-modal></audit-info-modal>
+</div>
+
+
+
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.scss b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.scss
new file mode 100644 (file)
index 0000000..65c2400
--- /dev/null
@@ -0,0 +1,277 @@
+
+.last {
+  position: sticky;
+  background: #f8f8f8;
+  right: 0;
+  padding-left: 15px;
+  padding-right: 15px;
+  width: 100px !important;
+  max-width: 100px !important;
+  min-width: 85px;
+}
+
+div.dataTables_wrapper {
+  width: 800px;
+  margin: 0 auto;
+}
+
+.row {
+  margin-left: 15px;
+  margin-right: 15px;
+}
+
+.instantiation-status-header {
+  margin-top: 30px;
+  .title {
+    font-family: OpenSans-Semibold;
+    font-size: 24px;
+    color: #4A4A4A;
+    float: left;
+  }
+
+  .info {
+    width: 18px;
+    height: 18px;
+    border: 0;
+    background-size: auto 100%;
+    cursor: pointer;
+    float: left;
+    margin: 10px;
+  }
+
+  .refresh-btn {
+    float: left;
+    margin-top: 6px;
+    margin-left: 10px;
+    cursor: pointer;
+  }
+
+  .lastUpdate {
+    margin-top: 5px;
+    padding-top: 0px;
+    font-size: 15px;
+    border-left: 1px solid black;
+    float: left;
+    padding-left: 10px;
+    color: gray;
+    height: 26px;
+  }
+
+  .refreshBtn {
+    width: 18px;
+    height: 18px;
+    border: 0;
+    background-size: auto 100%;
+    outline: none;
+    margin-left: 10px;
+    background: transparent;
+  }
+
+  svg-icon use {
+    fill: #0000ff !important;
+  }
+
+  .sub-title {
+    font-family: OpenSans-Semibold;
+    font-size: 14px;
+    color: #4A4A4A;
+    margin-left: 0;
+  }
+}
+
+.instantiation-status-data {
+  table {
+    width: 100%;
+    margin-top: 30px;
+    font-family: OpenSans-Semibold;
+    font-size: 12px;
+    overflow-x: auto;
+    display: block;
+    color: #5A5A5A;
+
+  }
+
+  thead {
+    position: sticky;
+    top: 0;
+    z-index: 100;
+    display: block;
+  }
+
+  thead th.normal, tbody td.normal {
+    min-width: 200px !important;
+    max-width: 200px;
+  }
+
+  thead th.smallTd ,tbody td.smallTd {
+    max-width: 100px !important;
+    min-width: 100px !important;
+  }
+
+  thead th.mediumTd ,tbody td.mediumTd {
+    max-width: 150px !important;
+    min-width: 150px !important;
+  }
+
+  tbody {
+    border: none !important;
+    max-height: 500px;
+    display: block;
+  }
+
+  th {
+    background: #f2f2f2;
+    font-family: OpenSans-Semibold;
+    color: #5A5A5A;
+    font-weight: bold;
+  }
+  .menu-div {
+    float: right;
+    border-left: 1px solid gray;
+    height: 23px;
+  }
+
+  tr.odd {
+    background-color: rgb(242, 242, 242);
+  }
+
+  tr:hover {
+    background: #e1e1e1;
+  }
+
+  thead {
+    background: rgb(242, 242, 242);
+  }
+
+  td#jobStatus {
+    cursor: pointer;
+    box-shadow: -2px 1px 5px -2px #aaa;
+  }
+}
+
+
+.loader {
+  border: 5px solid #f3f3f3;
+  border-radius: 50%;
+  border-top: 5px solid #3498db;
+  width: 170px;
+  height: 170px;
+  -webkit-animation: spin 2s linear infinite;
+  animation: spin 2s linear infinite;
+  position: absolute;
+  left: 50%;
+  right: 50%;
+  top: 50%;
+}
+
+/* Safari */
+@-webkit-keyframes spin {
+  0% { -webkit-transform: rotate(0deg); }
+  100% { -webkit-transform: rotate(360deg); }
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+
+.spin {
+  -webkit-animation: spin .4s infinite linear;
+  -moz-animation: spin .4s infinite linear;
+  -o-animation: spin .4s infinite linear;
+  animation: spin .4s infinite linear;
+  -webkit-transform-origin: 50% 44%;
+  transform-origin:50% 44%;
+  -ms-transform-origin:50% 44% /* IE 9 */
+}
+
+@-moz-keyframes spin {
+  from {
+    -moz-transform: rotate(0deg);
+  }
+  to {
+    -moz-transform: rotate(360deg);
+  }
+}
+
+@-webkit-keyframes spin {
+  from {
+    -webkit-transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+  }
+}
+
+@keyframes spin {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+.icon-refresh:before {
+  font-family: icomoon;
+  content: '\e936';
+}
+
+.icon-info {
+  float: left;
+  margin-top: 10px;
+  margin-left: 10px;
+  font-size: 17px;
+  margin-right: 10px
+}
+
+.icon-info:before {
+  font-family: icomoon;
+  content: '\e91f';
+}
+
+.context-menu-icon{
+  width: 25px;
+  float: left;
+}
+
+.icon-x:before {
+  font-family: icomoon;
+  content: '\e93d';
+}
+
+.icon-inprogress:before {
+  font-family: icomoon;
+  content: '\e899';
+}
+
+.icon-success_o:before {
+  font-family: icomoon;
+  content: '\e934';
+}
+
+.icon-menu:before {
+  font-family: icomoon;
+  content: '\e924';
+  font-size: 22px;
+}
+
+.icon-X_o:before {
+  font-family: icomoon;
+  content: '\e93d';
+  color: #D02B2B;
+}
+
+
+.icon-inprogress:before {
+  font-family: icomoon;
+  content: '\e941';
+  color: #009FDB;
+}
+
+.status-icon {
+  font-size: 20px;
+  margin-top: 0px;
+  height: 0;
+}
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.spec.ts
new file mode 100644 (file)
index 0000000..c9f434e
--- /dev/null
@@ -0,0 +1,278 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {
+  INPROGRESS,
+  InstantiationStatusComponentService,
+  PAUSE,
+  PENDING,
+  ServiceStatus,
+  STOPED,
+  SUCCESS_CIRCLE,
+  X_O
+} from './instantiationStatus.component.service';
+import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model';
+import { Observable } from 'rxjs/Rx';
+
+describe('Instantiation Status Service', () => {
+  let injector;
+  let service: InstantiationStatusComponentService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [],
+      providers: [InstantiationStatusComponentService]
+    });
+
+    injector = getTestBed();
+    service = injector.get(InstantiationStatusComponentService);
+  });
+
+  it('generateServiceInfoDataMapping should return mapping of arrays', (done: DoneFn) => {
+    let data : Array<ServiceInfoModel> = generateServiceInfoData();
+    let result = service.generateServiceInfoDataMapping(data);
+
+    expect(result['1']).toBeDefined();
+    expect(result['2']).toBeDefined();
+    expect(result['3']).toBeDefined();
+
+    expect(result['1'].length).toEqual(2);
+    expect(result['2'].length).toEqual(2);
+    expect(result['3'].length).toEqual(1);
+    done();
+  });
+
+  it('generateServiceInfoDataMapping if array is empty  should return empty object', (done: DoneFn) => {
+    let result = service.generateServiceInfoDataMapping([]);
+
+    expect(result['1']).not.toBeDefined();
+    expect(result['2']).not.toBeDefined();
+    expect(result['3']).not.toBeDefined();
+    done();
+  });
+
+  it('convertObjectToArray', (done: DoneFn) => {
+
+    spyOn(service, 'convertObjectToArray').and.returnValue(
+      Observable.of([])
+    );
+
+    let data : Array<ServiceInfoModel> = generateServiceInfoData();
+    service.convertObjectToArray(data).subscribe((result) => {
+      expect(result).toBeDefined();
+      done();
+    });
+  });
+
+  it('getStatusTooltip should return status popover', (done: DoneFn) => {
+    let result : ServiceStatus  = service.getStatus('pending');
+    expect(result.tooltip).toEqual('Pending: The service will automatically be sent for instantiation as soon as possible.');
+
+    result = service.getStatus('IN_PROGRESS');
+    expect(result.tooltip).toEqual('In-progress: the service is in process of instantiation.');
+
+    result = service.getStatus('PAUSED');
+    expect(result.tooltip).toEqual('Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.');
+
+    result = service.getStatus('FAILED');
+    expect(result.tooltip).toEqual('Failed: Service instantiation has failed, load the service to see the error returned.');
+
+    result = service.getStatus('COMPLETED');
+    expect(result.tooltip).toEqual('Completed successfully: Service is successfully instantiated.');
+
+    result = service.getStatus('STOPPED');
+    expect(result.tooltip).toEqual('Stopped: Due to previous failure, will not be instantiated.');
+    done();
+  });
+
+  it('getStatusTooltip should return correct icon per job status', (done: DoneFn) => {
+    let result : ServiceStatus  = service.getStatus('pending');
+    expect(result.iconClassName).toEqual(PENDING);
+
+    result = service.getStatus('IN_PROGRESS');
+    expect(result.iconClassName).toEqual(INPROGRESS);
+
+    result = service.getStatus('PAUSED');
+    expect(result.iconClassName).toEqual(PAUSE);
+
+    result = service.getStatus('FAILED');
+    expect(result.iconClassName).toEqual(X_O);
+
+    result = service.getStatus('COMPLETED');
+    expect(result.iconClassName).toEqual(SUCCESS_CIRCLE);
+
+    result = service.getStatus('STOPPED');
+    expect(result.iconClassName).toEqual(STOPED);
+    done();
+  });
+
+
+  function generateServiceInfoData(){
+    return JSON.parse(JSON.stringify([
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "1",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "templateId": "1",
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "1",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "templateId": "1",
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "2",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "templateId": "2",
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "2",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "templateId": "2",
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "3",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "templateId": "3",
+        "hidden": false
+      }
+    ]));
+  }
+
+});
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.service.ts
new file mode 100644 (file)
index 0000000..293397c
--- /dev/null
@@ -0,0 +1,75 @@
+import {Injectable} from '@angular/core';
+import {ServiceInfoModel, ServiceInfoUiModel} from '../shared/server/serviceInfo/serviceInfo.model';
+import {isNullOrUndefined} from "util";
+import { Observable } from 'rxjs/Observable';
+import 'rxjs/observable/of';
+
+export let PENDING : string = "pending";
+export let INPROGRESS : string = "inprogress";
+export let PAUSE : string = "pause";
+export let X_O : string = "X_o";
+export let SUCCESS_CIRCLE : string = "success+Circle";
+export let STOPED : string = "stoped";
+
+
+@Injectable()
+export class InstantiationStatusComponentService {
+  generateServiceInfoDataMapping(arr: Array<ServiceInfoModel>) : { [serviceInstanceId: string]: Array<ServiceInfoModel>}{
+    let serviceInfoData: { [serviceInstanceId: string]: Array<ServiceInfoModel>; } = {};
+    for(let item of arr){
+      if(isNullOrUndefined(serviceInfoData[item.templateId])){
+        serviceInfoData[item.templateId] = [item];
+      }else {
+        serviceInfoData[item.templateId].push(item);
+      }
+    }
+    return serviceInfoData;
+  }
+
+  convertObjectToArray(arr: Array<ServiceInfoModel>) : Observable<Array<ServiceInfoUiModel>>{
+    const obj = this.generateServiceInfoDataMapping(arr);
+    let index:number = 0;
+    let result = [];
+    for(let item in obj) {
+      obj[item].map(item => {
+        item['serviceStatus'] = this.getStatus(item.jobStatus);
+        item['serviceIndex'] = index;
+      });
+      index++;
+      result = result.concat(obj[item]);
+    }
+
+    console.log(result);
+    return Observable.of(result);
+  }
+
+  getStatus(status : string) : ServiceStatus {
+    switch(status.toUpperCase()) {
+      case  'PENDING' :
+        return new ServiceStatus(PENDING, '#009FDB', 'Pending: The service will automatically be sent for instantiation as soon as possible.');
+      case  'IN_PROGRESS' :
+        return new ServiceStatus(INPROGRESS, '#009FDB', 'In-progress: the service is in process of instantiation.');
+      case  'PAUSED' :
+        return new ServiceStatus(PAUSE, '#009FDB', 'Paused: Service has paused and waiting for your action.\n Select actions from the menu to the right.');
+      case  'FAILED' :
+        return new ServiceStatus(X_O, '#D02B2B', 'Failed: Service instantiation has failed, load the service to see the error returned.');
+      case  'COMPLETED' :
+        return new ServiceStatus(SUCCESS_CIRCLE, '#53AD15', 'Completed successfully: Service is successfully instantiated.');
+      case  'STOPPED' :
+        return new ServiceStatus(STOPED, '#D02B2B', 'Stopped: Due to previous failure, will not be instantiated.');
+    }
+  }
+}
+
+
+export class ServiceStatus {
+  iconClassName : string;
+  color : string;
+  tooltip : string;
+
+  constructor(_iconClassName : string, _color : string, _tooltip : string){
+    this.iconClassName = _iconClassName;
+    this.color = _color;
+    this.tooltip = _tooltip;
+  }
+}
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.spec.ts
new file mode 100644 (file)
index 0000000..00b6a99
--- /dev/null
@@ -0,0 +1,88 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import {InstantiationStatusComponent} from './instantiationStatus.component';
+import {ServiceInfoService} from '../shared/server/serviceInfo/serviceInfo.service';
+import {InstantiationStatusComponentService} from './instantiationStatus.component.service';
+import { ContextMenuModule, ContextMenuService } from 'ngx-contextmenu';
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to';
+import { ConfigurationService } from '../services/configuration.service';
+import { LogService } from '../shared/utils/log/log.service';
+
+describe('Instantiation Status Component', () => {
+  let component: InstantiationStatusComponent;
+  let fixture: ComponentFixture<InstantiationStatusComponent>;
+  let enableDeleteItems = [
+    { jobStatus:"PENDING" },
+    { jobStatus:"STOPPED" }];
+  let disableDeleteItems = [
+    { jobStatus:"COMPLETED" },
+    { jobStatus:"FAILED" },
+    {jobStatus:"IN_PROGRESS"},
+    {jobStatus:"UnknownOne"}];
+
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule, ContextMenuModule, ScrollToModule.forRoot()],
+      providers: [ServiceInfoService, InstantiationStatusComponentService, ContextMenuService, ConfigurationService, LogService],
+      declarations: [InstantiationStatusComponent],
+      schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
+    }).compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(InstantiationStatusComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('component should initialize basic parameters', (done: DoneFn) => {
+    component.TIMER_TIME_IN_SECONDS = 2;
+    expect(component.TIMER_TIME_IN_SECONDS).toEqual(2);
+    expect(component.dataIsReady).toBeFalsy();
+    expect(component.lastUpdatedDate).toBeNull();
+    done();
+  });
+
+  it('component constructor should call activateInterval and ngOnInit', (done: DoneFn) => {
+    component.refreshData();
+    expect(component.dataIsReady).toBeFalsy();
+    done();
+  });
+
+  it('stopped and pending status isDeleteEnabled button should be enabled, not allowed delete statuses isDeleteEnabled button should be disabled', (done: DoneFn) => {
+    enableDeleteItems.forEach((item) => {
+      let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
+      expect(isDeleteEnabled).toBeTruthy();
+    });
+
+    disableDeleteItems.forEach((item) => {
+      let isDeleteEnabled: boolean = component.isDeleteEnabled(item);
+      expect(isDeleteEnabled).toBeFalsy();
+    });
+    done();
+  });
+
+  it('[COMPLETED, FAILED, STOPPED]  status isHideEnable button should be enabled, [IN_PROGRESS, PAUSE, PENDING]  status isHideEnable button should be disabled', (done: DoneFn) => {
+    const enableHideItems = [
+      { jobStatus:"COMPLETED" },
+      { jobStatus:"FAILED" },
+      { jobStatus:"STOPPED" }];
+    enableHideItems.forEach((item) => {
+      let isDeleteEnabled: boolean = component.isHideEnabled(item);
+      expect(isDeleteEnabled).toBeTruthy();
+    });
+
+    const disableHideItems = [
+      { jobStatus:"IN_PROGRESS" },
+      { jobStatus:"PAUSE" },
+      { jobStatus:"PENDING" },
+      { jobStatus:"NOT_MATTER"}];
+    disableHideItems.forEach((item) => {
+      let isDeleteEnabled: boolean = component.isHideEnabled(item);
+      expect(isDeleteEnabled).toBeFalsy();
+    });
+    done();
+  });
+});
diff --git a/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts b/vid-webpack-master/src/app/instantiationStatus/instantiationStatus.component.ts
new file mode 100644 (file)
index 0000000..ed45ce4
--- /dev/null
@@ -0,0 +1,145 @@
+import {AfterViewChecked, Component, ViewChild} from '@angular/core';
+import {ServiceInfoService} from '../shared/server/serviceInfo/serviceInfo.service';
+import {ServiceInfoModel} from '../shared/server/serviceInfo/serviceInfo.model';
+import {InstantiationStatusComponentService} from './instantiationStatus.component.service';
+import {ContextMenuComponent, ContextMenuService} from 'ngx-contextmenu';
+import {AuditInfoModalComponent} from "./auditInfoModal/auditInfoModal.component";
+import * as _ from 'lodash';
+import {ScrollToConfigOptions, ScrollToService} from '@nicky-lenaers/ngx-scroll-to';
+import {ConfigurationService} from "../services/configuration.service";
+import {LogService} from '../shared/utils/log/log.service';
+
+
+@Component({
+  selector : 'instantiation-status',
+  templateUrl : './instantiationStatus.component.html',
+  styleUrls : ['./instantiationStatus.component.scss']
+})
+export class InstantiationStatusComponent implements AfterViewChecked{
+
+
+  TIMER_TIME_IN_SECONDS : number = 0;
+  timer = null;
+  dataIsReady : boolean = false;
+  scroll : boolean = false;
+  lastUpdatedDate: Date = null;
+  currentJobId: string = null;
+  instantiationStatusComponentService: InstantiationStatusComponentService;
+  configurationService : ConfigurationService;
+  serviceInfoData: Array<ServiceInfoModel> = null;
+  @ViewChild(ContextMenuComponent) public contextMenu: ContextMenuComponent;
+
+  constructor(private _serviceInfoService: ServiceInfoService,
+              private _instantiationStatusComponentService : InstantiationStatusComponentService,
+              private _contextMenuService: ContextMenuService,
+              private _configurationService : ConfigurationService,
+              private _scrollToService: ScrollToService,
+              private _logService : LogService) {
+    this.instantiationStatusComponentService = _instantiationStatusComponentService;
+    this.configurationService = this._configurationService;
+    this.configurationService.getConfiguration("refreshTimeInstantiationDashboard").subscribe(response => {
+      this.TIMER_TIME_IN_SECONDS = _.isNumber(response) ? response : 0;
+      this.activateInterval();
+      this.refreshData();
+    });
+  }
+
+  activateInterval() {
+    if (this.TIMER_TIME_IN_SECONDS > 0) {
+      this.timer = setInterval(() => {
+        this.refreshData();
+      }, this.TIMER_TIME_IN_SECONDS * 1000);
+    }
+  }
+
+  deactivateInterval() {
+    clearInterval(this.timer);
+  }
+
+  refreshData(): void {
+    this.dataIsReady = false;
+    this._serviceInfoService.getServicesJobInfo(true)
+      .subscribe((res: Array<ServiceInfoModel>) => {
+        this._instantiationStatusComponentService.convertObjectToArray(res).subscribe((res) => {
+          this._logService.info('refresh instantiation status table', res);
+          this.dataIsReady = true;
+          this.lastUpdatedDate = new Date();
+          if (!_.isEqual(this.serviceInfoData, res)) {
+            this.serviceInfoData = res;
+            this.scroll = true;
+          }
+        });
+      })
+  }
+
+  ngAfterViewChecked(){
+    if (this.scroll) {
+      this.scrollToElement();
+      this.scroll = false;
+    }
+  }
+
+
+
+  isDeleteEnabled(item):boolean {
+    return _.includes(['PENDING', 'STOPPED'], item.jobStatus);
+  }
+
+  deleteItem(item): void {
+    this._serviceInfoService.deleteJob(item.jobId).subscribe(() => {
+      this.refreshData();
+    });
+  }
+
+  hideItem(item): void {
+    this._serviceInfoService.hideJob(item.jobId).subscribe(() => {
+      this.refreshData();
+    });
+  }
+
+  auditInfo(jobData : ServiceInfoModel): void {
+    AuditInfoModalComponent.openModal.next(jobData);
+
+  }
+
+  isOpenVisible(item):boolean {
+    return _.includes(['COMPLETED', 'PAUSE'], item.jobStatus);
+  }
+
+  open(item): void {
+    let query =
+      `subscriberId=${item['subscriberName']}&` +
+      `serviceType=${item['serviceType']}&` +
+      `serviceInstanceId=${item['serviceInstanceId']}`;
+
+    window.parent.location.assign('../../serviceModels.htm#/instantiate?' + query);
+  }
+
+  public onContextMenu($event: MouseEvent, item: any): void {
+    this._contextMenuService.show.next({
+      contextMenu: this.contextMenu,
+      event: $event,
+      item: item,
+    });
+    $event.preventDefault();
+    $event.stopPropagation();
+  }
+
+  getImagesSrc(imageName : string) : string {
+    return './' + imageName + '.svg';
+  }
+
+  isHideEnabled(item: any):boolean {
+    return _.includes(['COMPLETED', 'FAILED', 'STOPPED'], item.jobStatus);
+  }
+  scrollToElement() {
+    if(this.currentJobId){
+      const config: ScrollToConfigOptions = {
+        target: this.currentJobId,
+        duration: 50,
+        offset: -35 //header height
+      };
+      this._scrollToService.scrollTo(config);
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/modules/inputs.module.ts b/vid-webpack-master/src/app/modules/inputs.module.ts
new file mode 100644 (file)
index 0000000..cb5f914
--- /dev/null
@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { DynamicInputsComponent } from '../components/dynamic-inputs/dynamic-inputs.component';
+import { AngularMultiSelectModule } from "angular2-multiselect-dropdown";
+import { DynamicInputLabelPipe } from '../shared/pipes/dynamicInputLabel/dynamic-input-label.pipe';
+
+
+@NgModule({
+  imports: [
+    CommonModule, FormsModule, ReactiveFormsModule, AngularMultiSelectModule
+  ],
+  providers: [],
+  declarations: [ DynamicInputLabelPipe, DynamicInputsComponent ],
+  entryComponents: [],
+  exports: [ DynamicInputLabelPipe, DynamicInputsComponent ]
+
+})
+
+export class InputsModule { }
diff --git a/vid-webpack-master/src/app/service.actions.ts b/vid-webpack-master/src/app/service.actions.ts
new file mode 100644 (file)
index 0000000..a62fec6
--- /dev/null
@@ -0,0 +1,197 @@
+import { Action, ActionCreator } from "redux";
+import { LcpRegionsAndTenants } from "./shared/models/lcpRegionsAndTenants";
+import { ServiceInstance } from "./shared/models/serviceInstance";
+import { SelectOptionInterface } from "./shared/models/selectOption";
+import { ServiceType } from "./shared/models/serviceType";
+import { VnfInstance } from "./shared/models/vnfInstance";
+
+export const UPDATE_MODEL = "[MODEL] Update";
+export const UPDATE_SERVICE_INSTANCE = "[SERVICE INSTANCE] Update";
+export const UPDATE_VNF_INSTANCE = "[VNF INSTANCE] Update";
+export const UPDATE_VF_MODULE = "[VF MODULE] Update";
+export const CREATE_VF_MODULE = "[VF MODULE] Create";
+
+export const UPDATE_LCP_REGIONS_AND_TENANTS = "[LCP_REGIONS_AND_TENANTS] Update";
+export const UPDATE_SUBSCRIBERS = "[SUBSCRIBERS] Update";
+export const UPDATE_PRODUCT_FAMILIES = "[PRODUCT_FAMILIES] Update";
+export const UPDATE_SERVICE_TYPES = "[SERVICE_TYPE] Update";
+export const UPDATE_AIC_ZONES = "[AIC_ZONES] Update";
+export const DELETE_SERVICE_INSTANCE = "[SERVICE_INSTANCE] Delete";
+export const DELETE_VNF_INSTANCE = "[VNF_INSTANCE] Delete";
+export const DELETE_VNF_MODULE_INSTANCE = "[VNF_MODULE_INSTANCE] Delete";
+export const UPDATE_CATEGORY_PARAMETERS = "[CATEGORY_PARAMETERS] Update";
+export const UPDATE_NETWORK_FUNCTION = "[UPDATE_NETWORK_FUNCTION] Update";
+export const UPDATE_USER_ID = "[UPDATE_USER_ID] Update";
+
+
+export interface UpdateServiceModelAction extends Action {
+  serviceHierarchy?: any;
+}
+
+export interface UpdateNetworkCollectionFunction extends Action {
+  networksAccordingToNetworkCollection: any;
+  network_function: any;
+}
+
+export interface UpdateServiceInstanceAction extends Action {
+  serviceUuid?: string;
+  serviceInstance?: ServiceInstance;
+}
+
+export interface UpdateVFModuleInstanceAction extends Action {
+  vfInstance: any;
+  vfId: string;
+  serviceUuid: string;
+}
+
+export interface CreateVFModuleInstanceAction extends Action {
+  vfInstance: any;
+  vfId: string;
+  serviceUuid: string;
+  index : number
+}
+
+export interface UpdateUserIdAction extends Action {
+  userId: string;
+}
+
+export interface UpdateVnfInstanceAction extends Action {
+  vnfInstance?: VnfInstance;
+  vnfModelName?: string;
+  serviceUuid?: string;
+}
+
+export interface UpdateLcpRegionsAndTenantsAction extends Action {
+  lcpRegionsAndTenants?: LcpRegionsAndTenants;
+}
+
+export interface UpdateSubscribersAction extends Action {
+  subscribers?: SelectOptionInterface[];
+}
+
+export interface UpdateProductFamiliesAction extends Action {
+  productFamilies?: SelectOptionInterface[];
+}
+
+export interface UpdateAicZonesAction extends Action {
+  aicZones?: SelectOptionInterface[];
+}
+
+export interface UpdateServiceTypesAction extends Action {
+  serviceTypes?: ServiceType[];
+  subscriberId: string;
+}
+
+export interface DeleteServiceInstanceAction extends Action {
+  serviceUuid?: string;
+}
+
+export interface DeleteVnfInstanceAction extends Action {
+  modelName?: string;
+  serviceModelId: string;
+}
+
+export interface DeleteVfModuleInstanceAction extends Action {
+  modelName?: string;
+  serviceModelId?: string;
+  vfName?: string;
+}
+
+export interface UpdateCategoryParametersAction extends Action {
+  categoryParameters?: string;
+}
+
+export const updateModel: ActionCreator<UpdateServiceModelAction> = serviceHierarchy => ({
+  type: UPDATE_MODEL,
+  serviceHierarchy: serviceHierarchy
+});
+
+export const updateServiceInstance: ActionCreator<UpdateServiceInstanceAction> = (serviceInstance, serviceUuid) => ({
+  type: UPDATE_SERVICE_INSTANCE,
+  serviceInstance: serviceInstance,
+  serviceUuid: serviceUuid
+});
+
+export const updateVFModuleInstance: ActionCreator<UpdateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid) => ({
+  type: UPDATE_VF_MODULE,
+  vfInstance: vfInstance,
+  vfId: vfId,
+  serviceUuid: serviceUuid
+})
+
+export const createVFModuleInstance: ActionCreator<CreateVFModuleInstanceAction> = (vfInstance, vfId, serviceUuid, index) => ({
+  type: CREATE_VF_MODULE,
+  vfInstance: vfInstance,
+  vfId: vfId,
+  serviceUuid: serviceUuid,
+  index : index
+})
+
+
+
+export const updateVNFInstance: ActionCreator<UpdateVnfInstanceAction> = (vnfInstance, vnfModelName, serviceUuid) => ({
+  type: UPDATE_VNF_INSTANCE,
+  vnfInstance: vnfInstance,
+  vnfModelName: vnfModelName,
+  serviceUuid: serviceUuid
+});
+
+export const updateLcpRegionsAndTenants: ActionCreator<UpdateLcpRegionsAndTenantsAction> = lcpRegionsAndTenants => ({
+  type: UPDATE_LCP_REGIONS_AND_TENANTS,
+  lcpRegionsAndTenants: lcpRegionsAndTenants
+});
+
+export const updateSubscribers: ActionCreator<UpdateSubscribersAction> = subscribers => ({
+  type: UPDATE_SUBSCRIBERS,
+  subscribers: subscribers
+});
+
+export const updateProductFamilies: ActionCreator<UpdateProductFamiliesAction> = productFamilies => ({
+  type: UPDATE_PRODUCT_FAMILIES,
+  productFamilies: productFamilies
+});
+
+export const updateAicZones: ActionCreator<UpdateAicZonesAction> = aicZones => ({
+  type: UPDATE_AIC_ZONES,
+  aicZones: aicZones
+});
+
+export const updateUserId: ActionCreator<UpdateUserIdAction> = userId => ({
+  type: UPDATE_USER_ID,
+  userId: userId
+});
+
+export const updateCategoryParameters: ActionCreator<UpdateCategoryParametersAction> = categoryParameters => ({
+  type: UPDATE_CATEGORY_PARAMETERS,
+  categoryParameters: categoryParameters
+});
+
+export const updateServiceTypes: ActionCreator<UpdateServiceTypesAction> = (serviceTypes, subscriberId) => ({
+  type: UPDATE_SERVICE_TYPES,
+  serviceTypes: serviceTypes,
+  subscriberId: subscriberId
+});
+
+export const updateNetworkCollectionFunction: ActionCreator<UpdateNetworkCollectionFunction> = (ncf, networksAccordingToNetworkCollection) => ({
+  type: UPDATE_NETWORK_FUNCTION,
+  networksAccordingToNetworkCollection: networksAccordingToNetworkCollection["results"],
+  network_function: ncf
+});
+
+export const deleteServiceInstance: ActionCreator<DeleteServiceInstanceAction> = serviceUuid => ({
+  type: DELETE_SERVICE_INSTANCE,
+  serviceUuid: serviceUuid
+});
+
+export const deleteVnfInstance: ActionCreator<DeleteVnfInstanceAction> = (modelName, serviceModelId) => ({
+  type: DELETE_VNF_INSTANCE,
+  modelName: modelName,
+  serviceModelId: serviceModelId
+});
+
+export const deleteVfModuleInstance: ActionCreator<DeleteVfModuleInstanceAction> = (modelName, serviceModelId, vfName) => ({
+  type: DELETE_VNF_MODULE_INSTANCE,
+  modelName: modelName,
+  serviceModelId: serviceModelId,
+  vfName: vfName
+});
diff --git a/vid-webpack-master/src/app/service.reducer.spec.ts b/vid-webpack-master/src/app/service.reducer.spec.ts
new file mode 100644 (file)
index 0000000..f734979
--- /dev/null
@@ -0,0 +1,286 @@
+import { LcpRegionsAndTenants } from './shared/models/lcpRegionsAndTenants';
+import { ServiceReducer, ServiceState } from './service.reducer';
+import { CategoryParams } from './shared/models/categoryParams';
+import {
+  DELETE_VNF_INSTANCE, DELETE_VNF_MODULE_INSTANCE, DeleteVfModuleInstanceAction,
+  DeleteVnfInstanceAction,
+  UPDATE_AIC_ZONES,
+  UPDATE_LCP_REGIONS_AND_TENANTS,
+  UPDATE_PRODUCT_FAMILIES,
+  UPDATE_SERVICE_INSTANCE,
+  UPDATE_SUBSCRIBERS,
+  UPDATE_USER_ID,
+  UPDATE_VNF_INSTANCE,
+  UpdateAicZonesAction,
+  UpdateProductFamiliesAction, UpdateServiceInstanceAction,
+  UpdateSubscribersAction, UpdateUserIdAction,
+  UpdateVnfInstanceAction
+} from './service.actions';
+import { VnfInstance } from './shared/models/vnfInstance';
+import { ServiceInstance } from './shared/models/serviceInstance';
+import { LcpRegion } from './shared/models/lcpRegion';
+import { Tenant } from './shared/models/tenant';
+import { SelectOption } from './shared/models/selectOption';
+
+
+const initialState: ServiceState = {
+  serviceHierarchy: {},
+  serviceInstance: {},
+  lcpRegionsAndTenants: new LcpRegionsAndTenants(),
+  subscribers: null,
+  productFamilies: null,
+  serviceTypes: {},
+  aicZones: null,
+  categoryParameters: new CategoryParams()
+};
+
+
+describe('service reducer', () => {
+  const userId: string = 'userId';
+  it('should handle initial state', () => {
+    expect(ServiceReducer(undefined, <any>{})).toEqual(initialState);
+  });
+
+  it('#UPDATE_USER_ID : should update userId ', (done: DoneFn) => {
+    expect(ServiceReducer(<any>{},
+      <UpdateUserIdAction>{
+        type: UPDATE_USER_ID,
+        userId: userId
+      }
+    )['userId']).toEqual(userId);
+    done();
+  });
+
+  it('#UPDATE_SERVICE_INSTANCE : should update service instance with service id ', (done: DoneFn) => {
+    const serviceUuid:string = 'serviceUuid';
+
+    let serviceInstanceObject : ServiceInstance = {
+      instanceName: 'instanceName',
+      isUserProvidedNaming: false,
+      globalSubscriberId: 'globalSubscriberId',
+      productFamilyId: 'productFamilyId',
+      subscriptionServiceType: 'subscriptionServiceType',
+      lcpCloudRegionId: 'lcpCloudRegionId',
+      tenantId: 'tenantId',
+      tenantName: 'tenantName',
+      aicZoneId: 'aicZoneId',
+      aicZoneName: 'aicZoneName',
+      projectName: 'projectName',
+      owningEntityId: 'owningEntityId',
+      owningEntityName: 'owningEntityName',
+      pause: false,
+      bulkSize: 1,
+      vnfs: {},
+      instanceParams : {},
+      rollbackOnFailure: false,
+      subscriberName: 'subscriberName'
+    };
+
+    let serviceState = ServiceReducer(<any>{serviceInstance : {}},
+      <UpdateServiceInstanceAction>{
+        type: UPDATE_SERVICE_INSTANCE,
+        serviceUuid: serviceUuid,
+        serviceInstance : serviceInstanceObject
+      }).serviceInstance['serviceUuid'];
+
+    expect(serviceState.instanceName).toEqual(serviceInstanceObject.instanceName);
+    expect(serviceState.isUserProvidedNaming).toEqual(serviceInstanceObject.isUserProvidedNaming);
+    expect(serviceState.globalSubscriberId).toEqual(serviceInstanceObject.globalSubscriberId);
+    expect(serviceState.productFamilyId).toEqual(serviceInstanceObject.productFamilyId);
+    expect(serviceState.subscriptionServiceType).toEqual(serviceInstanceObject.subscriptionServiceType);
+    expect(serviceState.lcpCloudRegionId).toEqual(serviceInstanceObject.lcpCloudRegionId);
+    expect(serviceState.tenantId).toEqual(serviceInstanceObject.tenantId);
+    expect(serviceState.tenantName).toEqual(serviceInstanceObject.tenantName);
+    expect(serviceState.aicZoneId).toEqual(serviceInstanceObject.aicZoneId);
+    expect(serviceState.aicZoneName).toEqual(serviceInstanceObject.aicZoneName);
+    expect(serviceState.projectName).toEqual(serviceInstanceObject.projectName);
+    expect(serviceState.owningEntityId).toEqual(serviceInstanceObject.owningEntityId);
+    expect(serviceState.owningEntityName).toEqual(serviceInstanceObject.owningEntityName);
+    expect(serviceState.pause).toEqual(serviceInstanceObject.pause);
+    expect(serviceState.bulkSize).toEqual(serviceInstanceObject.bulkSize);
+    expect(serviceState.vnfs).toEqual(serviceInstanceObject.vnfs);
+    expect(serviceState.instanceParams).toEqual(serviceInstanceObject.instanceParams);
+    expect(serviceState.rollbackOnFailure).toEqual(serviceInstanceObject.rollbackOnFailure);
+    expect(serviceState.subscriberName).toEqual(serviceInstanceObject.subscriberName);
+
+    done();
+  });
+
+  it('#UPDATE_VNF_INSTANCE : should update vnf instance with service id and vnfModelName ', (done: DoneFn) => {
+    let vnfInstanceObj : VnfInstance = {
+      instanceName: 'instanceName',
+      isUserProvidedNaming: false,
+      productFamilyId: 'productFamilyId',
+      lcpCloudRegionId: 'lcpCloudRegionId',
+      legacyRegion: 'legacyRegion',
+      tenantId: 'tenantId',
+      platformName: 'platformName',
+      lineOfBusiness: 'lineOfBusiness',
+      rollbackOnFailure: 'false',
+      vfModules: {}
+    };
+
+    let vnfState = ServiceReducer(<any>{serviceInstance : {
+          'serviceUuid' : {
+            vnfs : {}
+          }
+        }},
+      <UpdateVnfInstanceAction>{
+        type: UPDATE_VNF_INSTANCE,
+        serviceUuid : 'serviceUuid',
+        vnfInstance: vnfInstanceObj,
+        vnfModelName : 'vnfModelName'
+      }).serviceInstance['serviceUuid'].vnfs['vnfModelName'];
+
+    expect(vnfState.instanceName).toEqual(vnfInstanceObj.instanceName);
+    expect(vnfState.isUserProvidedNaming).toEqual(vnfInstanceObj.isUserProvidedNaming);
+    expect(vnfState.productFamilyId).toEqual(vnfInstanceObj.productFamilyId);
+    expect(vnfState.lcpCloudRegionId).toEqual(vnfInstanceObj.lcpCloudRegionId);
+    expect(vnfState.legacyRegion).toEqual(vnfInstanceObj.legacyRegion);
+    expect(vnfState.tenantId).toEqual(vnfInstanceObj.tenantId);
+    expect(vnfState.platformName).toEqual(vnfInstanceObj.platformName);
+    expect(vnfState.lineOfBusiness).toEqual(vnfInstanceObj.lineOfBusiness);
+    expect(vnfState.vfModules).toEqual(vnfInstanceObj.vfModules);
+    expect(vnfState.rollbackOnFailure).toEqual(vnfInstanceObj.rollbackOnFailure);
+
+    done();
+  });
+
+  it('#UPDATE_LCP_REGIONS_AND_TENANTS : should update lcp region and tenants', (done: DoneFn) => {
+    let lcpRegionsAndTenantsObj = [
+      {
+        lcpRegionList : [
+          new LcpRegion({
+            "cloudRegionID" : 'cloudRegionID',
+            "is-permitted" : "is-permitted"
+          })
+        ],
+        lcpRegionsTenantsMap : {
+          "lcpRegion" : [new Tenant({
+            "tenantID" : "tenantID",
+            "tenantName" : "tenantName",
+            "is-permitted" : true
+          })]
+        }
+      }
+    ];
+    let lcpRegionsAndTenantsState = ServiceReducer(<any>{serviceInstance : {}},
+      <any>{
+        type: UPDATE_LCP_REGIONS_AND_TENANTS,
+        lcpRegionsAndTenants : lcpRegionsAndTenantsObj
+      })['lcpRegionsAndTenants'];
+
+    expect(lcpRegionsAndTenantsState).toBeDefined();
+    done();
+  });
+
+  it('#UPDATE_SUBSCRIBERS : should update subscribers', (done: DoneFn) => {
+    let subscribersList = [
+      new SelectOption({
+        id : 'id',
+        name : 'name',
+        isPermitted : false
+      })
+    ];
+    let subscribersState = ServiceReducer(<any>{serviceInstance : {}},
+      <UpdateSubscribersAction>{
+        type: UPDATE_SUBSCRIBERS,
+        subscribers : subscribersList
+      })['subscribers'];
+
+    expect(subscribersState).toBeDefined();
+    expect(subscribersState[0].id).toEqual(subscribersList[0].id);
+    expect(subscribersState[0].isPermitted).toEqual(subscribersList[0].isPermitted);
+    expect(subscribersState[0].name).toEqual(subscribersList[0].name);
+
+    done();
+  });
+
+  it('#UpdateProductFamiliesAction : should update product families', (done: DoneFn) => {
+    let productFamiliesObj = [
+      new SelectOption({
+        id : 'id',
+        name : 'name',
+        isPermitted : false
+      })
+    ];
+    let productFamiliesState = ServiceReducer(<any>{serviceInstance : {}},
+      <UpdateProductFamiliesAction>{
+        type: UPDATE_PRODUCT_FAMILIES,
+        productFamilies : productFamiliesObj
+      })['productFamilies'];
+
+    expect(productFamiliesState).toBeDefined();
+    expect(productFamiliesState[0].id).toEqual(productFamiliesObj[0].id);
+    expect(productFamiliesState[0].isPermitted).toEqual(productFamiliesObj[0].isPermitted);
+    expect(productFamiliesState[0].name).toEqual(productFamiliesObj[0].name);
+
+    done();
+  });
+
+  it('#UPDATE_AIC_ZONES : should update aic zones', (done: DoneFn) => {
+    let aicZonesObj = [
+      new SelectOption({
+        id : 'id',
+        name : 'name',
+        isPermitted : false
+      })
+    ];
+    let aicZonesState = ServiceReducer(<any>{serviceInstance : {}},
+      <UpdateAicZonesAction>{
+        type: UPDATE_AIC_ZONES,
+        aicZones : aicZonesObj
+      })['aicZones'];
+
+    expect(aicZonesState).toBeDefined();
+    expect(aicZonesState[0].id).toEqual(aicZonesObj[0].id);
+    expect(aicZonesState[0].isPermitted).toEqual(aicZonesObj[0].isPermitted);
+    expect(aicZonesState[0].name).toEqual(aicZonesObj[0].name);
+
+    done();
+  });
+
+  it('#DELETE_VNF_INSTANCE : should delete existing vnf', (done: DoneFn) => {
+    let state = ServiceReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'modelName' : {}
+            }
+          }
+        }},
+      <DeleteVnfInstanceAction>{
+        type: DELETE_VNF_INSTANCE,
+        modelName : 'modelName',
+        serviceModelId : 'serviceModelId'
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance[ 'serviceModelId'].vnfs['modelName']).not.toBeDefined();
+    done();
+  });
+
+  it('#DELETE_VNF_MODULE_INSTANCE : should delete existing vnf module', (done: DoneFn) => {
+    let state = ServiceReducer(<any>{serviceInstance : {
+          'serviceModelId' : {
+            vnfs : {
+              'vfName' : {
+                vfModules : {
+                  'modelName' : {}
+                }
+              }
+            }
+          }
+        }},
+      <DeleteVfModuleInstanceAction>{
+        type: DELETE_VNF_MODULE_INSTANCE,
+        modelName : 'modelName',
+        vfName : 'vfName',
+        serviceModelId : 'serviceModelId'
+      });
+
+    expect(state).toBeDefined();
+    expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']).not.toBeDefined();
+    done();
+  });
+
+});
diff --git a/vid-webpack-master/src/app/service.reducer.ts b/vid-webpack-master/src/app/service.reducer.ts
new file mode 100644 (file)
index 0000000..a11f31e
--- /dev/null
@@ -0,0 +1,214 @@
+import { Action } from 'redux';
+import {
+  CREATE_VF_MODULE,
+  CreateVFModuleInstanceAction,
+  DELETE_SERVICE_INSTANCE,
+  DELETE_VNF_INSTANCE,
+  DELETE_VNF_MODULE_INSTANCE,
+  DeleteServiceInstanceAction,
+  DeleteVfModuleInstanceAction,
+  DeleteVnfInstanceAction,
+  UPDATE_AIC_ZONES,
+  UPDATE_CATEGORY_PARAMETERS,
+  UPDATE_LCP_REGIONS_AND_TENANTS,
+  UPDATE_MODEL,
+  UPDATE_NETWORK_FUNCTION,
+  UPDATE_PRODUCT_FAMILIES,
+  UPDATE_SERVICE_INSTANCE,
+  UPDATE_SERVICE_TYPES,
+  UPDATE_SUBSCRIBERS,
+  UPDATE_USER_ID,
+  UPDATE_VF_MODULE,
+  UPDATE_VNF_INSTANCE,
+  UpdateAicZonesAction,
+  UpdateCategoryParametersAction,
+  UpdateLcpRegionsAndTenantsAction,
+  UpdateNetworkCollectionFunction,
+  UpdateProductFamiliesAction,
+  UpdateServiceInstanceAction,
+  UpdateServiceModelAction,
+  UpdateServiceTypesAction,
+  UpdateSubscribersAction,
+  UpdateUserIdAction,
+  UpdateVFModuleInstanceAction,
+  UpdateVnfInstanceAction,
+} from './service.actions';
+import { LcpRegionsAndTenants } from './shared/models/lcpRegionsAndTenants';
+import * as _ from 'lodash';
+import { ServiceInstance } from './shared/models/serviceInstance';
+import { CategoryParams } from './shared/models/categoryParams';
+import { SelectOptionInterface } from './shared/models/selectOption';
+import { ServiceType } from './shared/models/serviceType';
+import { VnfInstance } from './shared/models/vnfInstance';
+import { VfModuleMap } from './shared/models/vfModulesMap';
+
+export interface ServiceState {
+  serviceHierarchy: any;
+  serviceInstance: { [uuid: string]: ServiceInstance; };
+  lcpRegionsAndTenants: LcpRegionsAndTenants;
+  subscribers: SelectOptionInterface[];
+  productFamilies: any;
+  serviceTypes: { [subscriberId: string]: ServiceType[]; };
+  aicZones: SelectOptionInterface[];
+  categoryParameters: CategoryParams;
+}
+
+const initialState: ServiceState = {
+  serviceHierarchy: {},
+  serviceInstance: {},
+  lcpRegionsAndTenants: new LcpRegionsAndTenants(),
+  subscribers: null,
+  productFamilies: null,
+  serviceTypes: {},
+  aicZones: null,
+  categoryParameters: new CategoryParams()
+};
+
+export const ServiceReducer =
+  function (state: ServiceState = initialState, action: Action): ServiceState {
+    switch (action.type) {
+      case UPDATE_MODEL: {
+        let uuid = (<UpdateServiceModelAction>action).serviceHierarchy.service.uuid;
+        state.serviceHierarchy[uuid] = _.cloneDeep((<UpdateServiceModelAction>action).serviceHierarchy);
+        return Object.assign({}, state);
+      }
+      case UPDATE_SERVICE_INSTANCE: {
+        const updateServiceInstanceAction = <UpdateServiceInstanceAction>action;
+        const uuid = updateServiceInstanceAction.serviceUuid;
+        const newState = _.cloneDeep(state);
+
+        const serviceInstance: ServiceInstance = newState.serviceInstance[uuid] || new ServiceInstance();
+
+        newState.serviceInstance[uuid] = Object.assign(serviceInstance, updateServiceInstanceAction.serviceInstance);
+        return newState;
+      }
+      case UPDATE_VNF_INSTANCE: {
+        const updateVnfInstanceAction = <UpdateVnfInstanceAction>action;
+        const serviceUuid = updateVnfInstanceAction.serviceUuid;
+        const vnfModelName = updateVnfInstanceAction.vnfModelName;
+
+        const newState = _.cloneDeep(state);
+        const vnfInstance: VnfInstance = newState.serviceInstance[serviceUuid].vnfs[vnfModelName] || new VnfInstance();
+
+        newState.serviceInstance[serviceUuid].vnfs[vnfModelName] = Object.assign(vnfInstance, updateVnfInstanceAction.vnfInstance);
+        return newState;
+      }
+
+
+      case UPDATE_USER_ID: {
+        const updateUserId : UpdateUserIdAction = <UpdateUserIdAction>action;
+        // var newState2 = {...state,'userId':updateUserId.userId}
+        var newState = _.cloneDeep(state);
+        newState['userId'] = updateUserId.userId;
+        return newState;
+
+        // state = (...  {userId:action["userId"]},state]}
+      }
+
+      case UPDATE_VF_MODULE: {
+        const updateVFModuleInstanceAction = <UpdateVFModuleInstanceAction>action;
+        const vfInstance = updateVFModuleInstanceAction.vfInstance;
+        const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
+        const vfModuleId = updateVFModuleInstanceAction.vfId;
+        const newState = _.cloneDeep(state);
+        const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
+        const vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
+        let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
+        vfModulesMap[vfModuleId] = vfInstance;
+        newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
+        return newState;
+      }
+
+      case CREATE_VF_MODULE: {
+        const updateVFModuleInstanceAction = <CreateVFModuleInstanceAction>action;
+        const vfInstance = updateVFModuleInstanceAction.vfInstance;
+        const serviceUuid = updateVFModuleInstanceAction.serviceUuid;
+        const vfModuleId = updateVFModuleInstanceAction.vfId;
+        const index = updateVFModuleInstanceAction.index;
+        let newState = Object.assign({}, state);
+        const vnfs = newState.serviceHierarchy[serviceUuid].vnfs;
+        const vnfId = getVfModuleParentVnfId(vnfs, vfModuleId);
+        let vfModulesMap = newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] || new VfModuleMap();
+        let randomId  = generateId();
+        vfModulesMap[vfModuleId + randomId] = vfInstance;
+
+        newState.serviceInstance[serviceUuid].vnfs[vnfId].vfModules[vfModuleId] = vfModulesMap;
+        return newState;
+      }
+
+
+      case UPDATE_LCP_REGIONS_AND_TENANTS: {
+        Object.assign(state, (<UpdateLcpRegionsAndTenantsAction>action));
+        return Object.assign({}, state);
+      }
+      case UPDATE_SUBSCRIBERS: {
+        Object.assign(state, (<UpdateSubscribersAction>action));
+        return Object.assign({}, state);
+      }
+      case UPDATE_AIC_ZONES: {
+        Object.assign(state, (<UpdateAicZonesAction>action));
+        return Object.assign({}, state);
+      }
+      case UPDATE_PRODUCT_FAMILIES: {
+        Object.assign(state, (<UpdateProductFamiliesAction>action));
+        return Object.assign({}, state);
+      }
+      case UPDATE_NETWORK_FUNCTION: {
+        let networkFunctionReduxObj = state["networkFunctions"] == undefined ? {} : state["networkFunctions"];
+        networkFunctionReduxObj[(<UpdateNetworkCollectionFunction>action).network_function] = (<UpdateNetworkCollectionFunction>action).networksAccordingToNetworkCollection;
+        Object.assign(state, {"networkFunctions":networkFunctionReduxObj});
+        return Object.assign({}, state);
+      }
+      case UPDATE_SERVICE_TYPES: {
+        let subscriberId = (<UpdateServiceTypesAction>action).subscriberId;
+        let serviceTypes = (<UpdateServiceTypesAction>action).serviceTypes;
+        state.serviceTypes[subscriberId] = serviceTypes;
+        return Object.assign({}, state);
+      }
+      case UPDATE_CATEGORY_PARAMETERS: {
+        Object.assign(state, (<UpdateCategoryParametersAction>action));
+        return Object.assign({}, state);
+      }
+      case DELETE_SERVICE_INSTANCE: {
+        const uuid = (<DeleteServiceInstanceAction>action).serviceUuid;
+        if (state.serviceHierarchy[uuid]) {
+          let newState = _.omit(state, ['serviceInstance[' + uuid + ']']);
+          return Object.assign({}, state, newState);
+        }
+        return Object.assign({}, state);
+      }
+      case DELETE_VNF_INSTANCE: {
+        const actionData =(<DeleteVnfInstanceAction>action);
+        if(state.serviceInstance[actionData.serviceModelId]){
+          delete state.serviceInstance[actionData.serviceModelId].vnfs[actionData.modelName];
+        }
+        return Object.assign({}, state);
+      }
+
+      case DELETE_VNF_MODULE_INSTANCE: {
+        const actionData =(<DeleteVfModuleInstanceAction>action);
+        if(state.serviceInstance[actionData.serviceModelId]){
+          delete state.serviceInstance[actionData.serviceModelId].vnfs[actionData.vfName].vfModules[actionData.modelName];
+        }
+        return Object.assign({}, state);
+      }
+      default:
+        return Object.assign({}, state);
+    }
+  };
+
+const generateId = () => {
+  return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
+};
+
+
+const getVfModuleParentVnfId = (vnfs: object, vfModuleId: string) => {
+  let vnfId = undefined;
+  _.forOwn(vnfs, (value, key) => {
+    if (vnfs[key].vfModules && vnfs[key].vfModules[vfModuleId]) {
+      vnfId = vnfs[key].modelCustomizationName;
+      return false;
+    }
+  });
+  return vnfId;
+};
diff --git a/vid-webpack-master/src/app/services/aaiService/aai.actions.ts b/vid-webpack-master/src/app/services/aaiService/aai.actions.ts
new file mode 100644 (file)
index 0000000..649fb14
--- /dev/null
@@ -0,0 +1,75 @@
+import {Action, ActionCreator} from "redux";
+
+export const LOAD_PRODUCT_FAMILIES = '[PRODUCT_FAMILIES] Load';
+
+export const LOAD_LCP_TENANT = '[LCP_TENANT] Load';
+
+export const LOAD_AIC_ZONES = '[AIC_ZONES] Load';
+
+export const LOAD_CATEGORY_PARAMETERS = '[LOAD_CATEGORY_PARAMETERS] Load';
+
+export const LOAD_SERVICE_MDOEL_BY_UUID = '[LOAD_SERVICE_MDOEL_BY_UUID] Load';
+
+export const LOAD_NETWORK_ACCORDING_TO_NF = '[LOAD_NETWORK_ACCORDING_TO_NF] Load'
+
+export const LOAD_USER_ID = '[LOAD_USER_ID] Load'
+
+
+export interface LoadProductFamiliesAction extends Action {}
+
+interface LoadLcpTenant extends Action {}
+
+interface LoadAicZones extends Action {}
+
+interface LoadCategoryParameters extends Action {}
+
+interface LoadServiceModelByUuid extends Action {}
+
+interface LoadNetworkAccordingToNetworkCF extends Action{}
+
+interface LoadUserId extends Action{}
+
+
+export const loadServiceAccordingToUuid : ActionCreator<LoadServiceModelByUuid> =
+ (uuid : string) =>({
+   type : LOAD_SERVICE_MDOEL_BY_UUID,
+   modelId : uuid
+ })
+
+
+export const loadProductFamiliesAction: ActionCreator<LoadProductFamiliesAction> =
+  () => ({
+    type: LOAD_PRODUCT_FAMILIES,
+  });
+
+
+export const loadUserId: ActionCreator<LoadUserId> =
+() => ({
+  type: LOAD_USER_ID,
+});
+
+
+  export const loadLcpTenant: ActionCreator<LoadLcpTenant> =
+  () => ({
+    type: LOAD_LCP_TENANT,
+  });
+
+
+export const loadAicZones: ActionCreator<LoadAicZones> =
+  () => ({
+    type: LOAD_AIC_ZONES,
+  });
+
+export const loadCategoryParameters: ActionCreator<LoadCategoryParameters> =
+  () => ({
+    type: LOAD_CATEGORY_PARAMETERS,
+  });
+
+
+export const loadAaiNetworkAccordingToNetworkCF: ActionCreator<LoadNetworkAccordingToNetworkCF> =
+  (networkFunction,cloudOwner,cloudRegionId) => ({
+    type: LOAD_NETWORK_ACCORDING_TO_NF,
+    networkFunctions: networkFunction,
+    cloudOwner: cloudOwner,
+    cloudRegionId: cloudRegionId
+  });
diff --git a/vid-webpack-master/src/app/services/aaiService/aai.epics.ts b/vid-webpack-master/src/app/services/aaiService/aai.epics.ts
new file mode 100644 (file)
index 0000000..5249cea
--- /dev/null
@@ -0,0 +1,81 @@
+import {updateServiceInstance} from './../../service.actions';
+import {Injectable} from '@angular/core';
+import {createEpicMiddleware} from 'redux-observable';
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/do';
+import 'rxjs/add/operator/startWith';
+import {
+  LOAD_PRODUCT_FAMILIES,
+  LOAD_LCP_TENANT,
+  LOAD_AIC_ZONES,
+  LOAD_CATEGORY_PARAMETERS,
+  LOAD_SERVICE_MDOEL_BY_UUID,
+  LOAD_NETWORK_ACCORDING_TO_NF,
+  LOAD_USER_ID
+} from "./aai.actions";
+import {AaiService} from "./aai.service";
+import {
+  updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateNetworkCollectionFunction,
+  updateProductFamilies, updateUserId
+} from "../../service.actions";
+import {AppState} from "../../store/reducers";
+
+const notFetchedAlready = (state: AppState): boolean => state.service.productFamilies !== null;
+
+@Injectable()
+export class AAIEpics {
+  constructor(private aaiService: AaiService) {
+  }
+
+  public createEpic() {
+    return [createEpicMiddleware(this.loadProductFamiliesEpic)
+      , createEpicMiddleware(this.loadLcpTenants)
+      , createEpicMiddleware(this.loadAicZones)
+      , createEpicMiddleware(this.loadCategoryParameters)
+      , createEpicMiddleware(this.loadServiceAccordingToUuid)
+      , createEpicMiddleware(this.loadNetworkAccordingToNetworkFunction)
+      , createEpicMiddleware(this.loadUserId)
+    ];
+  }
+
+  private loadLcpTenants = (action$, store) =>
+    action$
+      .ofType(LOAD_LCP_TENANT)
+      .switchMap(() => this
+        .aaiService
+        .getLcpRegionsAndTenants('e433710f-9217-458d-a79d-1c7aff376d89', 'VIRTUAL USP')
+        .map(data => updateLcpRegionsAndTenants(data)));
+
+  private loadProductFamiliesEpic = (action$, store) => action$
+    .ofType(LOAD_PRODUCT_FAMILIES)
+    .switchMap(() => this.aaiService.getProductFamilies().map(data => updateProductFamilies(data)));
+
+  private loadCategoryParameters = (action$, store) => action$
+    .ofType(LOAD_CATEGORY_PARAMETERS)
+    .switchMap(() => this.aaiService.getCategoryParameters(null).map(data => updateCategoryParameters(data)));
+
+
+  private loadNetworkAccordingToNetworkFunction = (action$, store) => action$
+    .ofType(LOAD_NETWORK_ACCORDING_TO_NF)
+    .flatMap((action) => this.aaiService.getCRAccordingToNetworkFunctionId(action.networkFunctions, action.cloudOwner, action.cloudRegionId).map((res) =>
+      updateNetworkCollectionFunction(action.networkFunctions, res)));
+
+  private loadServiceAccordingToUuid = (action$, store) => action$
+    .ofType(LOAD_SERVICE_MDOEL_BY_UUID)
+    .switchMap((action) => this.aaiService.getServiceModelById(action.modelId)
+      .map(data => updateServiceInstance(action.uuid, data)));
+
+  private loadUserId = (action$, store) => action$
+    .ofType(LOAD_USER_ID)
+    .switchMap(() => this.aaiService.getUserId()
+      .map(res => updateUserId(res)));
+
+
+  private loadAicZones = (action$, store) => action$
+    .ofType(LOAD_AIC_ZONES)
+    .switchMap(() => this.aaiService.getAicZones().map(data => updateAicZones(data)));
+  // .catch(response => of(this.actions.loadFailed(status)))
+  // .startWith(this.actions.loadStarted()));
+
+}
diff --git a/vid-webpack-master/src/app/services/aaiService/aai.service.ts b/vid-webpack-master/src/app/services/aaiService/aai.service.ts
new file mode 100644 (file)
index 0000000..dd9d9fb
--- /dev/null
@@ -0,0 +1,189 @@
+import {Injectable} from '@angular/core';
+import {HttpClient, HttpHeaders} from '@angular/common/http';
+import { Constants } from '../../shared/utils/constants';
+import { ServiceType } from "../../shared/models/serviceType";
+import {GetSubDetailsResponse} from "./responseInterfaces/getSubDetailsResponseInterface";
+import {Observable} from "rxjs/Observable";
+import * as _ from 'lodash';
+import {CategoryParams} from "../../shared/models/categoryParams";
+import {GetCategoryParamsResponseInterface} from "./responseInterfaces/getCategoryParamsResponseInterface";
+import {Project} from "../../shared/models/project";
+import {OwningEntity} from "../../shared/models/owningEntity";
+import {GetServicesResponseInterface} from "./responseInterfaces/getServicesResponseInterface";
+import {Subscriber} from "../../shared/models/subscriber";
+import {GetSubscribersResponse} from "./responseInterfaces/getSubscribersResponseInterface";
+import {AicZone} from "../../shared/models/aicZone";
+import {GetAicZonesResponse} from "./responseInterfaces/getAicZonesResponseInterface";
+import {LcpRegionsAndTenants} from "../../shared/models/lcpRegionsAndTenants";
+import {LcpRegion} from "../../shared/models/lcpRegion";
+import {Tenant} from "../../shared/models/tenant";
+import {ProductFamily} from "../../shared/models/productFamily"
+import {
+  updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateModel, updateProductFamilies,
+  updateServiceTypes, updateSubscribers, updateUserId
+} from '../../service.actions';
+import {SelectOption} from '../../shared/models/selectOption';
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {ResponseContentType, ResponseType} from "@angular/http";
+import 'rxjs/add/operator/do';
+import 'rxjs/add/observable/of';
+import 'rxjs/add/operator/catch';
+
+@Injectable()
+export class AaiService {
+
+  constructor (private http: HttpClient, private store: NgRedux<AppState>) {}
+
+  public getServiceModelById(serviceModelId: string): Observable<any> {
+    if (_.has(this.store.getState().service.serviceHierarchy,serviceModelId)){
+      return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceHierarchy[serviceModelId])));
+    }
+    let pathQuery: string = Constants.Path.SERVICES_PATH + serviceModelId;
+    return this.http.get(pathQuery).map(res => res )
+      .do((res) => {
+        this.store.dispatch(updateModel(res));
+      });
+  }
+
+  public getUserId() : Observable<any>{
+    return this.http.get("../../getuserID",{responseType: 'text'}).do((res)=>this.store.dispatch(updateUserId(res)));
+  }
+
+
+  public getCRAccordingToNetworkFunctionId(networkCollectionFunction,cloudOwner,cloudRegionId){
+    return this.http.get('../../aai_get_instance_groups_by_cloudregion/'+cloudOwner+'/'+cloudRegionId+'/' + networkCollectionFunction)
+    .map(res=>res).do((res)=>console.log(res));
+  }
+
+  public getCategoryParameters(familyName): Observable<CategoryParams> {
+    familyName = familyName || Constants.Path.PARAMETER_STANDARDIZATION_FAMILY;
+    let pathQuery: string = Constants.Path.GET_CATEGORY_PARAMETERS +"?familyName=" + familyName+ "&r=" + Math.random();
+
+    return this.http.get<GetCategoryParamsResponseInterface>(pathQuery)
+      .map(this.categoryParametersResponseToProductAndOwningEntity)
+      .do(res => {
+        this.store.dispatch(updateCategoryParameters(res))
+      });
+  }
+
+
+
+    categoryParametersResponseToProductAndOwningEntity(res: GetCategoryParamsResponseInterface): CategoryParams  {
+    if (res && res.categoryParameters) {
+      const owningEntityList = res.categoryParameters.owningEntity.map(owningEntity => new OwningEntity(owningEntity));
+      const projectList = res.categoryParameters.project.map(project => new Project(project));
+      const lineOfBusinessList = res.categoryParameters.lineOfBusiness.map(owningEntity => new SelectOption(owningEntity));
+      const platformList = res.categoryParameters.platform.map(platform => new SelectOption(platform));
+
+      return new CategoryParams(owningEntityList, projectList, lineOfBusinessList, platformList);
+    } else {
+      return new CategoryParams();
+    }
+  }
+
+  public getProductFamilies(): Observable<ProductFamily[]> {
+    return this.getServices().map(res => res.service.map(service => new ProductFamily(service)));
+  }
+
+  public getServices(): Observable<GetServicesResponseInterface> {
+    let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random();
+
+    return this.http.get<GetServicesResponseInterface>(pathQuery);
+  }
+
+  public getSubscribers(): Observable<Subscriber[]> {
+    if (this.store.getState().service.subscribers){
+      return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.subscribers)));
+    }
+
+    let pathQuery: string = Constants.Path.AAI_GET_SUBSCRIBERS + Constants.Path.ASSIGN + Math.random();
+
+    return this.http.get<GetSubscribersResponse>(pathQuery).map(res =>
+       res.customer.map( subscriber => new Subscriber(subscriber))).do((res) => {
+      this.store.dispatch(updateSubscribers(res));
+    });
+  }
+
+  public getAicZones(): Observable<AicZone[]> {
+    if (this.store.getState().service.aicZones){
+      return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.aicZones)));
+    }
+
+    let pathQuery: string = Constants.Path.AAI_GET_AIC_ZONES + Constants.Path.ASSIGN + Math.random();
+
+    return this.http.get<GetAicZonesResponse>(pathQuery).map(res =>
+       res.zone.map(aicZone => new AicZone(aicZone))).do((res) => {
+      this.store.dispatch(updateAicZones(res));
+    });
+  }
+
+  public getLcpRegionsAndTenants(globalCustomerId, serviceType): Observable<LcpRegionsAndTenants> {
+    if (this.store.getState().service.lcpRegionsAndTenants.lcpRegionList.length !== 0){
+      return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.lcpRegionsAndTenants)));
+    }
+    let pathQuery: string = Constants.Path.AAI_GET_TENANTS
+      + globalCustomerId + Constants.Path.FORWARD_SLASH + serviceType + Constants.Path.ASSIGN + Math.random();
+
+    console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: "
+      + globalCustomerId);
+    if (globalCustomerId != null) {
+      return this.http.get(pathQuery)
+        .map(this.tenantResponseToLcpRegionsAndTenants).do((res) => {
+          this.store.dispatch(updateLcpRegionsAndTenants(res));
+        });
+    }
+  }
+
+  tenantResponseToLcpRegionsAndTenants(cloudRegionTenantList): LcpRegionsAndTenants {
+
+    const lcpRegionsTenantsMap = {};
+
+    const lcpRegionList = _.uniqBy(cloudRegionTenantList, 'cloudRegionID').map((cloudRegionTenant) => {
+           return new LcpRegion(cloudRegionTenant)
+         });
+
+    lcpRegionList.forEach(region => {
+      lcpRegionsTenantsMap[region.id] = _.filter(cloudRegionTenantList, {'cloudRegionID' : region.id})
+                                                        .map((cloudRegionTenant) => {
+                                                            return new Tenant(cloudRegionTenant)
+                                                        });
+      const reducer = (accumulator, currentValue) => {
+          accumulator.isPermitted = accumulator.isPermitted || currentValue.isPermitted;
+
+         return accumulator;
+      };
+      region.isPermitted = lcpRegionsTenantsMap[region.id].reduce(reducer).isPermitted;
+    });
+
+    return new LcpRegionsAndTenants(lcpRegionList, lcpRegionsTenantsMap);
+  }
+
+  public getServiceTypes(subscriberId): Observable<ServiceType[]> {
+    console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + subscriberId);
+    if (_.has(this.store.getState().service.serviceTypes, subscriberId)){
+      return Observable.of(<any> JSON.parse(JSON.stringify(this.store.getState().service.serviceTypes[subscriberId])));
+    }
+
+    return this.getSubscriberDetails(subscriberId)
+      .map(this.subDetailsResponseToServiceTypes)
+      .do((res) => {this.store.dispatch(updateServiceTypes(res, subscriberId));});
+  }
+
+  public getSubscriberDetails(subscriberId): Observable<GetSubDetailsResponse> {
+    let pathQuery: string = Constants.Path.AAI_SUB_DETAILS_PATH + subscriberId + Constants.Path.ASSIGN + Math.random();
+
+    if (subscriberId != null) {
+      return this.http.get<GetSubDetailsResponse>(pathQuery);
+    }
+  }
+
+  subDetailsResponseToServiceTypes(res: GetSubDetailsResponse): ServiceType[] {
+    if (res && res['service-subscriptions']) {
+      const serviceSubscriptions = res['service-subscriptions']['service-subscription'];
+      return serviceSubscriptions.map((subscription, index) => new ServiceType(String(index), subscription))
+    } else {
+      return [];
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts b/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getAicZonesResponseInterface.ts
new file mode 100644 (file)
index 0000000..62581c9
--- /dev/null
@@ -0,0 +1,3 @@
+export interface GetAicZonesResponse {
+  zone: any[];
+}
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts b/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getCategoryParamsResponseInterface.ts
new file mode 100644 (file)
index 0000000..0639890
--- /dev/null
@@ -0,0 +1,10 @@
+interface CategoryParametersResponse {
+  owningEntity: any[],
+  project: any[]
+  lineOfBusiness: any[]
+  platform: any[]
+}
+
+export interface GetCategoryParamsResponseInterface {
+  categoryParameters: CategoryParametersResponse;
+}
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts b/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServiceModelResponseInterface.ts
new file mode 100644 (file)
index 0000000..8767115
--- /dev/null
@@ -0,0 +1,5 @@
+import {ServiceModelResponseInterface} from "../../../shared/models/serviceModel";
+
+export interface GetServiceModelResponseInterface {
+  service: ServiceModelResponseInterface
+}
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts b/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getServicesResponseInterface.ts
new file mode 100644 (file)
index 0000000..ae04055
--- /dev/null
@@ -0,0 +1,9 @@
+export interface ServiceResponseInterface {
+  'service-id': string,
+  'service-description': string
+  'is-permitted': boolean
+}
+
+export interface GetServicesResponseInterface {
+  service: ServiceResponseInterface[];
+}
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts b/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubDetailsResponseInterface.ts
new file mode 100644 (file)
index 0000000..dbfb695
--- /dev/null
@@ -0,0 +1,12 @@
+export interface Subscription {
+  'service-type': string;
+  'is-permitted': boolean;
+}
+
+interface ServiceSubscriptions {
+  'service-subscription': Subscription[];
+}
+
+export interface GetSubDetailsResponse {
+  'service-subscriptions': ServiceSubscriptions;
+}
diff --git a/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts b/vid-webpack-master/src/app/services/aaiService/responseInterfaces/getSubscribersResponseInterface.ts
new file mode 100644 (file)
index 0000000..065f66e
--- /dev/null
@@ -0,0 +1,5 @@
+import {Subscriber} from "../../../shared/models/subscriber";
+
+export interface GetSubscribersResponse {
+  customer: Subscriber[];
+}
diff --git a/vid-webpack-master/src/app/services/configuration.service.ts b/vid-webpack-master/src/app/services/configuration.service.ts
new file mode 100644 (file)
index 0000000..4edd8ff
--- /dev/null
@@ -0,0 +1,34 @@
+import {Injectable} from '@angular/core';
+import {HttpClient} from "@angular/common/http";
+import {Constants} from "../shared/utils/constants";
+import {Observable} from 'rxjs/Observable';
+import {updateFlags} from "../global.actions";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../store/reducers";
+
+@Injectable()
+export class ConfigurationService {
+  store : NgRedux<AppState>;
+
+  constructor(private _http: HttpClient, _store : NgRedux<AppState>) {
+    this.store = _store;
+  }
+
+  getConfiguration(key : string): Observable<any> {
+    let pathQuery = Constants.Path.CONFIGURATION_PATH;
+    pathQuery = pathQuery.replace("{name}",key);
+    return this._http.get(pathQuery).map(response => response);
+  }
+
+  getFlags(): Observable<{[key: string] : boolean}> {
+    let flags = this.store.getState().global.flags;
+    if (flags) {
+      return Observable.of(flags);
+    }
+    let pathQuery = Constants.Path.FEATURES_FLAG_PATH;
+    return this._http.get<{[key: string] : boolean}>(pathQuery).map(response => {
+      this.store.dispatch(updateFlags(response));
+      return response;
+    });
+  }
+}
diff --git a/vid-webpack-master/src/app/services/data.service.ts b/vid-webpack-master/src/app/services/data.service.ts
new file mode 100644 (file)
index 0000000..4f8bf36
--- /dev/null
@@ -0,0 +1,528 @@
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class DataService {
+
+  private static _availableVolumeGroupList;
+  private static _cloudRegionTenantList;
+  private static _globalCustomerId;
+  private static _customizationUUID;
+  private static _rescustomizationUUID;
+  private static _inventoryItem;
+  private static _modelId;
+  private static _modelInstanceName;
+  private static _modelInfo;
+  private static _networkInstanceId;
+  private static _serviceIdList;
+  private static _aicZones;
+  private static _aicZone;
+  private static _serviceInstanceId;
+  private static _serviceInstanceName;
+  private static _serviceName;
+  private static _serviceType;
+  private static _serviceUuid;
+  private static _serviceTypeName;
+  private static _createSubscriberName;
+  private static _uploadSupplementoryDataFile;
+  private static _supplementoryDataFile;
+  private static _subscriberId;
+  private static _loggedInUserId;
+  private static _subscriberName;
+  private static _subscribers;
+  private static _subscriptionServiceTypeList;
+  private static _userParams;
+  private static _userServiceInstanceName;
+  private static _vfModuleInstanceId;
+  private static _vnfInstanceId;
+  private static _vfModuleInstanceName;
+  private static _volumeGroupInstanceId;
+  private static _lcpRegion;
+  private static _tenant;
+  private static _treeHandle;
+  private static _serviceInstanceToCustomer;
+  private static _aLaCarte: boolean;
+  private static _macro: boolean;
+  private static _resources;
+  private static _syspropProvStatusList;
+  private static _updatedvnfProvStatus;
+  private static _arbitraryParameters;
+  private static _hideServiceFields;
+  private static _serviceProxies;
+  private static _sourceServiceProxies;
+  private static _collectorServiceProxies;
+  private static _configurationByPolicy;
+  private static _suppressRollback;
+  private static _portMirroningConfigFields;
+  private static _configurationInstanceId: string;
+  private static _configurationStatus: string;
+  private static _portStatus: string;
+  private static _portId: string;
+  private static _pnf;
+  private static _owningEntityProperties;
+
+  static get availableVolumeGroupList() {
+    return this._availableVolumeGroupList;
+  }
+
+  static set availableVolumeGroupList(value) {
+    this._availableVolumeGroupList = value;
+  }
+
+  static get cloudRegionTenantList() {
+    return this._cloudRegionTenantList;
+  }
+
+  static set cloudRegionTenantList(value) {
+    this._cloudRegionTenantList = value;
+  }
+
+  static get globalCustomerId() {
+    return this._globalCustomerId;
+  }
+
+  static set globalCustomerId(value) {
+    this._globalCustomerId = value;
+  }
+
+  static get customizationUUID() {
+    return this._customizationUUID;
+  }
+
+  static set customizationUUID(value) {
+    this._customizationUUID = value;
+  }
+
+  static get rescustomizationUUID() {
+    return this._rescustomizationUUID;
+  }
+
+  static set rescustomizationUUID(value) {
+    this._rescustomizationUUID = value;
+  }
+
+  static get inventoryItem() {
+    return this._inventoryItem;
+  }
+
+  static set inventoryItem(value) {
+    this._inventoryItem = value;
+  }
+
+  static get modelId() {
+    return this._modelId;
+  }
+
+  static set modelId(value) {
+    this._modelId = value;
+  }
+
+  static get modelInstanceName() {
+    return this._modelInstanceName;
+  }
+
+  static set modelInstanceName(value) {
+    this._modelInstanceName = value;
+  }
+
+  static get modelInfo() {
+    return this._modelInfo;
+  }
+
+  static set modelInfo(value) {
+    this._modelInfo = value;
+  }
+
+  static getModelInfo(componentId) {
+    return this._modelInfo[componentId];
+  }
+
+  static setModelInfo(componentId, modelInfo) {
+    if (!this._modelInfo) {
+      this._modelInfo = {};
+    }
+    this._modelInfo[componentId] = modelInfo;
+  }
+
+  static get networkInstanceId() {
+    return this._networkInstanceId;
+  }
+
+  static set networkInstanceId(value) {
+    this._networkInstanceId = value;
+  }
+
+  static get serviceIdList() {
+    return this._serviceIdList;
+  }
+
+  static set serviceIdList(value) {
+    this._serviceIdList = value;
+  }
+
+  static get aicZones() {
+    return this._aicZones;
+  }
+
+  static set aicZones(value) {
+    this._aicZones = value;
+  }
+
+  static get aicZone() {
+    return this._aicZone;
+  }
+
+  static set aicZone(value) {
+    this._aicZone = value;
+  }
+
+  static get serviceInstanceId() {
+    return this._serviceInstanceId;
+  }
+
+  static set serviceInstanceId(value) {
+    this._serviceInstanceId = value;
+  }
+
+  static get serviceInstanceName() {
+    return this._serviceInstanceName;
+  }
+
+  static set serviceInstanceName(value) {
+    this._serviceInstanceName = value;
+  }
+
+  static get serviceName() {
+    return this._serviceName;
+  }
+
+  static set serviceName(value) {
+    this._serviceName = value;
+  }
+
+  static get serviceType() {
+    return this._serviceType;
+  }
+
+  static set serviceType(value) {
+    this._serviceType = value;
+  }
+
+  static get serviceUuid() {
+    return this._serviceUuid;
+  }
+
+  static set serviceUuid(value) {
+    this._serviceUuid = value;
+  }
+
+  static get serviceTypeName() {
+    return this._serviceTypeName;
+  }
+
+  static set serviceTypeName(value) {
+    this._serviceTypeName = value;
+  }
+
+  static get createSubscriberName() {
+    return this._createSubscriberName;
+  }
+
+  static set createSubscriberName(value) {
+    this._createSubscriberName = value;
+  }
+
+  static get uploadSupplementoryDataFile() {
+    return this._uploadSupplementoryDataFile;
+  }
+
+  static set uploadSupplementoryDataFile(value) {
+    this._uploadSupplementoryDataFile = value;
+  }
+
+  static get supplementoryDataFile() {
+    return this._supplementoryDataFile;
+  }
+
+  static set supplementoryDataFile(value) {
+    this._supplementoryDataFile = value;
+  }
+
+  static get subscriberId() {
+    return this._subscriberId;
+  }
+
+  static set subscriberId(value) {
+    this._subscriberId = value;
+  }
+
+  static get loggedInUserId() {
+    return this._loggedInUserId;
+  }
+
+  static set loggedInUserId(value) {
+    this._loggedInUserId = value;
+  }
+
+  static get subscriberName() {
+    return this._subscriberName;
+  }
+
+  static set subscriberName(value) {
+    this._subscriberName = value;
+  }
+
+  static get subscribers() {
+    return this._subscribers;
+  }
+
+  static set subscribers(value) {
+    this._subscribers = value;
+  }
+
+  static get subscriptionServiceTypeList() {
+    return this._subscriptionServiceTypeList;
+  }
+
+  static set subscriptionServiceTypeList(value) {
+    this._subscriptionServiceTypeList = value;
+  }
+
+  static get userParams() {
+    return this._userParams;
+  }
+
+  static set userParams(value) {
+    this._userParams = value;
+  }
+
+  static get userServiceInstanceName() {
+    return this._userServiceInstanceName;
+  }
+
+  static set userServiceInstanceName(value) {
+    this._userServiceInstanceName = value;
+  }
+
+  static get vfModuleInstanceId() {
+    return this._vfModuleInstanceId;
+  }
+
+  static set vfModuleInstanceId(value) {
+    this._vfModuleInstanceId = value;
+  }
+
+  static get vnfInstanceId() {
+    return this._vnfInstanceId;
+  }
+
+  static set vnfInstanceId(value) {
+    this._vnfInstanceId = value;
+  }
+
+  static get vfModuleInstanceName() {
+    return this._vfModuleInstanceName;
+  }
+
+  static set vfModuleInstanceName(value) {
+    this._vfModuleInstanceName = value;
+  }
+
+  static get volumeGroupInstanceId() {
+    return this._volumeGroupInstanceId;
+  }
+
+  static set volumeGroupInstanceId(value) {
+    this._volumeGroupInstanceId = value;
+  }
+
+  static get lcpRegion() {
+    return this._lcpRegion;
+  }
+
+  static set lcpRegion(value) {
+    this._lcpRegion = value;
+  }
+
+  static get tenant() {
+    return this._tenant;
+  }
+
+  static set tenant(value) {
+    this._tenant = value;
+  }
+
+  static get treeHandle() {
+    return this._treeHandle;
+  }
+
+  static set treeHandle(value) {
+    this._treeHandle = value;
+  }
+
+  static get serviceInstanceToCustomer() {
+    return this._serviceInstanceToCustomer;
+  }
+
+  static set serviceInstanceToCustomer(value) {
+    this._serviceInstanceToCustomer = value;
+  }
+
+  static get aLaCarte() {
+    if (!this._aLaCarte) {
+      return true;
+    }
+    return this._aLaCarte;
+  }
+
+  static set aLaCarte(value: boolean) {
+    this._aLaCarte = value;
+  }
+
+  static get macro() {
+    if (!this._macro) {
+      return false;
+    }
+    return this._macro;
+  }
+
+  static set macro(value: boolean) {
+    this._macro = value;
+  }
+
+  static get resources() {
+    return this._resources;
+  }
+
+  static set resources(value) {
+    this._resources = value;
+  }
+
+  static get syspropProvStatusList() {
+    return this._syspropProvStatusList;
+  }
+
+  static set syspropProvStatusList(value) {
+    this._syspropProvStatusList = value;
+  }
+
+  static get updatedvnfProvStatus() {
+    return this._updatedvnfProvStatus;
+  }
+
+  static set updatedvnfProvStatus(value) {
+    this._updatedvnfProvStatus = value;
+  }
+
+  static get arbitraryParameters() {
+    return this._arbitraryParameters;
+  }
+
+  static set arbitraryParameters(value) {
+    this._arbitraryParameters = value;
+  }
+
+  static get hideServiceFields() {
+    return this._hideServiceFields;
+  }
+
+  static set hideServiceFields(value) {
+    this._hideServiceFields = value;
+  }
+
+  static get serviceProxies() {
+    return this._serviceProxies;
+  }
+
+  static set serviceProxies(value) {
+    this._serviceProxies = value;
+  }
+
+  static get sourceServiceProxies() {
+    return this._sourceServiceProxies;
+  }
+
+  static set sourceServiceProxies(value) {
+    this._sourceServiceProxies = value;
+  }
+
+  static get collectorServiceProxies() {
+    return this._collectorServiceProxies;
+  }
+
+  static set collectorServiceProxies(value) {
+    this._collectorServiceProxies = value;
+  }
+
+  static get configurationByPolicy() {
+    return this._configurationByPolicy;
+  }
+
+  static set configurationByPolicy(value) {
+    this._configurationByPolicy = value;
+  }
+
+  static get suppressRollback() {
+    return this._suppressRollback;
+  }
+
+  static set suppressRollback(value) {
+    this._suppressRollback = value;
+  }
+
+  static get portMirroningConfigFields() {
+    return this._portMirroningConfigFields;
+  }
+
+  static set portMirroningConfigFields(value) {
+    this._portMirroningConfigFields = value;
+  }
+
+  static get configurationInstanceId(): string {
+    return this._configurationInstanceId;
+  }
+
+  static set configurationInstanceId(value: string) {
+    this._configurationInstanceId = value;
+  }
+
+  static get configurationStatus(): string {
+    return this._configurationStatus;
+  }
+
+  static set configurationStatus(value: string) {
+    this._configurationStatus = value;
+  }
+
+  static get portStatus(): string {
+    return this._portStatus;
+  }
+
+  static set portStatus(value: string) {
+    this._portStatus = value;
+  }
+
+  static get portId(): string {
+    return this._portId;
+  }
+
+  static set portId(value: string) {
+    this._portId = value;
+  }
+
+  static get pnf() {
+    return this._pnf;
+  }
+
+  static set pnf(value) {
+    this._pnf = value;
+  }
+
+  static get owningEntityProperties() {
+    return this._owningEntityProperties;
+  }
+
+  static set owningEntityProperties(value) {
+    this._owningEntityProperties = value;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/services/flags.resolve.ts b/vid-webpack-master/src/app/services/flags.resolve.ts
new file mode 100644 (file)
index 0000000..7044937
--- /dev/null
@@ -0,0 +1,14 @@
+import {ActivatedRouteSnapshot, Resolve} from "@angular/router";
+import {Injectable} from "@angular/core";
+import {ConfigurationService} from "./configuration.service";
+import {Observable} from "rxjs/Observable";
+
+@Injectable()
+export class FlagsResolve implements Resolve<Observable< { [key: string]: boolean }>> {
+
+  constructor(private _configurationService: ConfigurationService) {}
+
+  resolve(route: ActivatedRouteSnapshot) {
+    return this._configurationService.getFlags();
+  }
+}
diff --git a/vid-webpack-master/src/app/services/msoService/mso.service.ts b/vid-webpack-master/src/app/services/msoService/mso.service.ts
new file mode 100644 (file)
index 0000000..1402b50
--- /dev/null
@@ -0,0 +1,26 @@
+import {Injectable} from "@angular/core";
+import {HttpClient} from "@angular/common/http";
+import {Observable} from "rxjs/Observable";
+import {Constants} from "../../shared/utils/constants";
+
+@Injectable()
+export class MsoService {
+  httpClient: HttpClient;
+
+  constructor(http: HttpClient) {
+    this.httpClient = http;
+  }
+
+
+  public submitMsoTask(instanceFields): Observable<any> {
+    let path = '../../asyncInstantiation/bulk';
+    return this.httpClient.post(path, instanceFields);
+  }
+  public createVnf(requestDetails, serviceInstanceId): Observable<any> {
+    let pathQuery: string = Constants.Path.MSO_CREATE_VNF_INSTANCE + serviceInstanceId;
+
+    return this.httpClient.post( pathQuery, {
+      requestDetails : requestDetails
+    });
+  }
+}
diff --git a/vid-webpack-master/src/app/services/sdc.service.ts b/vid-webpack-master/src/app/services/sdc.service.ts
new file mode 100644 (file)
index 0000000..d4eba26
--- /dev/null
@@ -0,0 +1,28 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import 'rxjs/add/operator/map';
+import { Constants } from '../shared/utils/constants';
+import { VidConfiguration } from '../configuration/vid.configuration';
+
+@Injectable()
+export class SdcService {
+
+
+  constructor (private http: HttpClient) {
+  }
+
+  public getServicesModels(): any {
+    let pathQuery: string = Constants.Path.SERVICES_DIST_STATUS_PATH + VidConfiguration.ASDC_MODEL_STATUS;
+
+    if ( VidConfiguration.ASDC_MODEL_STATUS === Constants.Status.ALL) {
+      pathQuery = Constants.Path.SERVICES_PATH;
+    }
+
+    return this.http.get(pathQuery);
+  }
+
+  getService(uuid: string) {
+    return this.http.get(Constants.Path.SERVICES_PATH + uuid);
+  }
+
+}
diff --git a/vid-webpack-master/src/app/services/service-planning.service.spec.ts b/vid-webpack-master/src/app/services/service-planning.service.spec.ts
new file mode 100644 (file)
index 0000000..5d60e29
--- /dev/null
@@ -0,0 +1,467 @@
+import {ServicePlanningService} from "./service-planning.service";
+import {ReflectiveInjector} from "@angular/core";
+import {NgRedux} from "@angular-redux/store";
+import {ServiceNodeTypes} from "../shared/models/ServiceNodeTypes";
+
+export class MockAppStore<T> {
+}
+
+describe('Service planning service', () => {
+  let injector;
+  let service: ServicePlanningService;
+
+  beforeEach(() => {
+
+    let injector = ReflectiveInjector.resolveAndCreate([
+      ServicePlanningService,
+      {provide: NgRedux, useClass: MockAppStore}
+    ]);
+
+    service = injector.get(ServicePlanningService);
+  });
+
+  describe('#updateDynamicInputsVnfDataFromModel', () => {
+    it('get vfModule instance params', (done: DoneFn) => {
+      //get vfModule instance params
+      let dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule());
+      expect(dynamicInputs).toEqual([{
+        id: '2017488_adiodvpe0_vnf_config_template_version',
+        type: 'string',
+        name: '2017488_adiodvpe0_vnf_config_template_version',
+        value: '17.2',
+        isRequired: true,
+        description: 'VPE Software Version'
+      }, {
+        id: '2017488_adiodvpe0_AIC_CLLI',
+        type: 'string',
+        name: '2017488_adiodvpe0_AIC_CLLI',
+        value: 'ATLMY8GA',
+        isRequired: true,
+        description: 'AIC Site CLLI'
+      }]);
+
+      //get vfModule with no instance params should return empty array
+      dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VFmodule, generateVFModule2);
+      expect(dynamicInputs).toEqual([]);
+
+      //get vf instance params should be undefined
+      dynamicInputs = service.updateDynamicInputsVnfDataFromModel(ServiceNodeTypes.VF, generateVNF());
+      expect(dynamicInputs).toEqual([]);
+      done();
+    });
+  });
+
+  describe('#isUserProvidedNaming', () => {
+    it('get vfModule with generate ecompNaming should return userProvided false', (done: DoneFn) => {
+      //get vfModule with generate ecompNaming should return userProvided false
+      let isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VFmodule, generateVFModule(), generateVNF());
+      expect(isUserProvidedNaming).toBeFalsy();
+
+      //get vfModule without generate ecompNaming should return userProvided true
+      isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VFmodule, generateVFModule(), generateVNF_ecompNamingFalse());
+      expect(isUserProvidedNaming).toBeTruthy();
+
+      //get vnf with generate ecompNaming should return userProvided false
+      isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VF, generateVNF(), null);
+      expect(isUserProvidedNaming).toBeFalsy();
+
+      //get vnf without generate ecompNaming should return userProvided true
+      isUserProvidedNaming = service.isUserProvidedNaming(ServiceNodeTypes.VF, generateVNF_ecompNamingFalse(), null);
+      expect(isUserProvidedNaming).toBeTruthy();
+      done();
+    });
+  });
+
+  function generateVFModule() {
+    return {
+      'uuid': '25284168-24bb-4698-8cb4-3f509146eca5',
+      'invariantUuid': '7253ff5c-97f0-4b8b-937c-77aeb4d79aa1',
+      'customizationUuid': 'f7e7c365-60cf-49a9-9ebf-a1aa11b9d401',
+      'description': null,
+      'name': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+      'version': '6',
+      'modelCustomizationName': '2017488AdiodVpe..ADIOD_vRE_BV..module-1',
+      'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+      'commands': {},
+      'volumeGroupAllowed': true,
+      'inputs': {
+        '2017488_adiodvpe0_vnf_config_template_version': {
+          'type': 'string',
+          'description': 'VPE Software Version',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': '17.2'
+        },
+        '2017488_adiodvpe0_AIC_CLLI': {
+          'type': 'string',
+          'description': 'AIC Site CLLI',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'ATLMY8GA'
+        }
+      }
+    };
+  }
+
+  function generateVFModule2() {
+    return {
+      'uuid': '0a0dd9d4-31d3-4c3a-ae89-a02f383e6a9a',
+      'invariantUuid': 'eff8cc59-53a1-4101-aed7-8cf24ecf8339',
+      'customizationUuid': '3cd946bb-50e0-40d8-96d3-c9023520b557',
+      'description': null,
+      'name': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+      'version': '6',
+      'modelCustomizationName': '2017488AdiodVpe..ADIOD_vPFE_BV..module-2',
+      'properties': {'minCountInstances': 0, 'maxCountInstances': null, 'initialCount': 0},
+      'commands': {},
+      'volumeGroupAllowed': true,
+      'inputs': {}
+    };
+  }
+
+  function generateVNF() {
+    return {
+      'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413',
+      'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d',
+      'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
+      'name': '2017-388_ADIOD-vPE',
+      'version': '1.0',
+      'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a',
+      'inputs': {
+        'vnf_config_template_version': {
+          'type': 'string',
+          'description': 'VPE Software Version',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': '17.2'
+        },
+        'bandwidth_units': {
+          'type': 'string',
+          'description': 'Units of bandwidth',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'Gbps'
+        },
+        'bandwidth': {
+          'type': 'string',
+          'description': 'Requested VPE bandwidth',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': '10'
+        },
+        'AIC_CLLI': {
+          'type': 'string',
+          'description': 'AIC Site CLLI',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'ATLMY8GA'
+        },
+        'ASN': {
+          'type': 'string',
+          'description': 'AV/PE',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'AV_vPE'
+        },
+        'vnf_instance_name': {
+          'type': 'string',
+          'description': 'The hostname assigned to the vpe.',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'mtnj309me6'
+        }
+      },
+      'commands': {
+        'vnf_config_template_version': {
+          'displayName': 'vnf_config_template_version',
+          'command': 'get_input',
+          'inputName': '2017488_adiodvpe0_vnf_config_template_version'
+        },
+        'bandwidth_units': {
+          'displayName': 'bandwidth_units',
+          'command': 'get_input',
+          'inputName': 'adiodvpe0_bandwidth_units'
+        },
+        'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
+        'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
+        'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
+        'vnf_instance_name': {
+          'displayName': 'vnf_instance_name',
+          'command': 'get_input',
+          'inputName': '2017488_adiodvpe0_vnf_instance_name'
+        }
+      },
+      'properties': {
+        'vmxvre_retype': 'RE-VMX',
+        'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
+        'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
+        'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
+        'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
+        'int_ctl_net_name': 'VMX-INTXI',
+        'vmx_int_ctl_prefix': '128.0.0.0',
+        'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
+        'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
+        'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
+        'nf_type': 'vPE',
+        'vmxvpfe_int_ctl_ip_1': '128.0.0.16',
+        'is_AVPN_service': 'false',
+        'vmx_RSG_name': 'vREXI-affinity',
+        'vmx_int_ctl_forwarding': 'l2',
+        'vmxvre_oam_ip_0': '10.40.123.5',
+        'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
+        'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
+        'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
+        'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
+        'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
+        'vmxvre_instance': '0',
+        'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
+        'vmxvre_flavor_name': 'ns.c1r16d32.v5',
+        'vmxvpfe_volume_size_0': '40.0',
+        'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
+        'nf_naming': '{ecomp_generated_naming=true}',
+        'nf_naming_code': 'Navneet',
+        'vmxvre_name_0': 'vREXI',
+        'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
+        'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
+        'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
+        'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
+        'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
+        'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
+        'vmxvre_console': 'vidconsole',
+        'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
+        'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
+        'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
+        'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
+        'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
+        'vf_module_id': '123',
+        'nf_function': 'JAI',
+        'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
+        'vmxvre_int_ctl_ip_0': '128.0.0.1',
+        'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
+        'vnf_name': 'mtnj309me6vre',
+        'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
+        'vmxvre_volume_type_1': 'HITACHI',
+        'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
+        'vmxvre_volume_type_0': 'HITACHI',
+        'vmxvpfe_volume_type_0': 'HITACHI',
+        'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
+        'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
+        'vnf_id': '123',
+        'vmxvre_oam_prefix': '24',
+        'availability_zone_0': 'mtpocfo-kvm-az01',
+        'ASN': 'get_input:2017488_adiodvpe0_ASN',
+        'vmxvre_chassis_i2cid': '161',
+        'vmxvpfe_name_0': 'vPFEXI',
+        'bandwidth': 'get_input:adiodvpe0_bandwidth',
+        'availability_zone_max_count': '1',
+        'vmxvre_volume_size_0': '45.0',
+        'vmxvre_volume_size_1': '50.0',
+        'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
+        'vmxvre_oam_gateway': '10.40.123.1',
+        'vmxvre_volume_name_1': 'vREXI_FAVolume',
+        'vmxvre_ore_present': '0',
+        'vmxvre_volume_name_0': 'vREXI_FBVolume',
+        'vmxvre_type': '0',
+        'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
+        'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
+        'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
+        'vmx_int_ctl_len': '24',
+        'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
+        'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
+        'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
+        'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
+        'nf_role': 'Testing',
+        'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
+        'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
+        'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
+      },
+      'type': 'VF',
+      'modelCustomizationName': '2017-388_ADIOD-vPE 1',
+      'vfModules': {},
+      'volumeGroups': {}
+    };
+  }
+
+  function generateVNF_ecompNamingFalse() {
+    return {
+      'uuid': '0903e1c0-8e03-4936-b5c2-260653b96413',
+      'invariantUuid': '00beb8f9-6d39-452f-816d-c709b9cbb87d',
+      'description': 'Name ADIOD vPE Description The provider edge function for the ADIOD service supported by the Junipers VMX product Category Router Vendor Juniper Vendor Release Code 17.2 Owners Mary Fragale. Updated 9-25 to use v8.0 of the Juniper Valid 2 VLM',
+      'name': '2017-388_ADIOD-vPE',
+      'version': '1.0',
+      'customizationUuid': '280dec31-f16d-488b-9668-4aae55d6648a',
+      'inputs': {
+        'vnf_config_template_version': {
+          'type': 'string',
+          'description': 'VPE Software Version',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': '17.2'
+        },
+        'bandwidth_units': {
+          'type': 'string',
+          'description': 'Units of bandwidth',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'Gbps'
+        },
+        'bandwidth': {
+          'type': 'string',
+          'description': 'Requested VPE bandwidth',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': '10'
+        },
+        'AIC_CLLI': {
+          'type': 'string',
+          'description': 'AIC Site CLLI',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'ATLMY8GA'
+        },
+        'ASN': {
+          'type': 'string',
+          'description': 'AV/PE',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'AV_vPE'
+        },
+        'vnf_instance_name': {
+          'type': 'string',
+          'description': 'The hostname assigned to the vpe.',
+          'entry_schema': null,
+          'constraints': [],
+          'required': true,
+          'default': 'mtnj309me6'
+        }
+      },
+      'commands': {
+        'vnf_config_template_version': {
+          'displayName': 'vnf_config_template_version',
+          'command': 'get_input',
+          'inputName': '2017488_adiodvpe0_vnf_config_template_version'
+        },
+        'bandwidth_units': {
+          'displayName': 'bandwidth_units',
+          'command': 'get_input',
+          'inputName': 'adiodvpe0_bandwidth_units'
+        },
+        'bandwidth': {'displayName': 'bandwidth', 'command': 'get_input', 'inputName': 'adiodvpe0_bandwidth'},
+        'AIC_CLLI': {'displayName': 'AIC_CLLI', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_AIC_CLLI'},
+        'ASN': {'displayName': 'ASN', 'command': 'get_input', 'inputName': '2017488_adiodvpe0_ASN'},
+        'vnf_instance_name': {
+          'displayName': 'vnf_instance_name',
+          'command': 'get_input',
+          'inputName': '2017488_adiodvpe0_vnf_instance_name'
+        }
+      },
+      'properties': {
+        'ecomp_generated_naming': "false",
+        'vmxvre_retype': 'RE-VMX',
+        'vnf_config_template_version': 'get_input:2017488_adiodvpe0_vnf_config_template_version',
+        'sriov44_net_id': '48d399b3-11ee-48a8-94d2-f0ea94d6be8d',
+        'int_ctl_net_id': '2f323477-6936-4d01-ac53-d849430281d9',
+        'vmxvpfe_sriov41_0_port_mac': '00:11:22:EF:AC:DF',
+        'int_ctl_net_name': 'VMX-INTXI',
+        'vmx_int_ctl_prefix': '128.0.0.0',
+        'sriov43_net_id': 'da349ca1-6de9-4548-be88-2d88e99bfef5',
+        'sriov42_net_id': '760669ba-013d-4d9b-b0e7-4151fe2e6279',
+        'sriov41_net_id': '25ad52d5-c165-40f8-b3b0-ddfc2373280a',
+        'nf_type': 'vPE',
+        'vmxvpfe_int_ctl_ip_1': '128.0.0.16',
+        'is_AVPN_service': 'false',
+        'vmx_RSG_name': 'vREXI-affinity',
+        'vmx_int_ctl_forwarding': 'l2',
+        'vmxvre_oam_ip_0': '10.40.123.5',
+        'vmxvpfe_sriov44_0_port_mac': '00:11:22:EF:AC:DF',
+        'vmxvpfe_sriov41_0_port_vlanstrip': 'false',
+        'vmxvpfe_sriov42_0_port_vlanfilter': '4001',
+        'vmxvpfe_sriov44_0_port_unknownunicastallow': 'true',
+        'vmxvre_image_name_0': 'VRE-ENGINE_17.2-S2.1.qcow2',
+        'vmxvre_instance': '0',
+        'vmxvpfe_sriov43_0_port_mac': '00:11:22:EF:AC:DF',
+        'vmxvre_flavor_name': 'ns.c1r16d32.v5',
+        'vmxvpfe_volume_size_0': '40.0',
+        'vmxvpfe_sriov43_0_port_vlanfilter': '4001',
+        'nf_naming': '{ecomp_generated_naming=false}',
+        'nf_naming_code': 'Navneet',
+        'vmxvre_name_0': 'vREXI',
+        'vmxvpfe_sriov42_0_port_vlanstrip': 'false',
+        'vmxvpfe_volume_name_0': 'vPFEXI_FBVolume',
+        'vmx_RSG_id': 'bd89a33c-13c3-4a04-8fde-1a57eb123141',
+        'vmxvpfe_image_name_0': 'VPE_ROUTING-ENGINE_17.2R1-S2.1.qcow2',
+        'vmxvpfe_sriov43_0_port_unknownunicastallow': 'true',
+        'vmxvpfe_sriov44_0_port_unknownmulticastallow': 'true',
+        'vmxvre_console': 'vidconsole',
+        'vmxvpfe_sriov44_0_port_vlanfilter': '4001',
+        'vmxvpfe_sriov42_0_port_mac': '00:11:22:EF:AC:DF',
+        'vmxvpfe_volume_id_0': '47cede15-da2f-4397-a101-aa683220aff3',
+        'vmxvpfe_sriov42_0_port_unknownmulticastallow': 'true',
+        'vmxvpfe_sriov44_0_port_vlanstrip': 'false',
+        'vf_module_id': '123',
+        'nf_function': 'JAI',
+        'vmxvpfe_sriov43_0_port_unknownmulticastallow': 'true',
+        'vmxvre_int_ctl_ip_0': '128.0.0.1',
+        'AIC_CLLI': 'get_input:2017488_adiodvpe0_AIC_CLLI',
+        'vnf_name': 'mtnj309me6vre',
+        'vmxvpfe_sriov41_0_port_unknownunicastallow': 'true',
+        'vmxvre_volume_type_1': 'HITACHI',
+        'vmxvpfe_sriov44_0_port_broadcastallow': 'true',
+        'vmxvre_volume_type_0': 'HITACHI',
+        'vmxvpfe_volume_type_0': 'HITACHI',
+        'vmxvpfe_sriov43_0_port_broadcastallow': 'true',
+        'bandwidth_units': 'get_input:adiodvpe0_bandwidth_units',
+        'vnf_id': '123',
+        'vmxvre_oam_prefix': '24',
+        'availability_zone_0': 'mtpocfo-kvm-az01',
+        'ASN': 'get_input:2017488_adiodvpe0_ASN',
+        'vmxvre_chassis_i2cid': '161',
+        'vmxvpfe_name_0': 'vPFEXI',
+        'bandwidth': 'get_input:adiodvpe0_bandwidth',
+        'availability_zone_max_count': '1',
+        'vmxvre_volume_size_0': '45.0',
+        'vmxvre_volume_size_1': '50.0',
+        'vmxvpfe_sriov42_0_port_broadcastallow': 'true',
+        'vmxvre_oam_gateway': '10.40.123.1',
+        'vmxvre_volume_name_1': 'vREXI_FAVolume',
+        'vmxvre_ore_present': '0',
+        'vmxvre_volume_name_0': 'vREXI_FBVolume',
+        'vmxvre_type': '0',
+        'vnf_instance_name': 'get_input:2017488_adiodvpe0_vnf_instance_name',
+        'vmxvpfe_sriov41_0_port_unknownmulticastallow': 'true',
+        'oam_net_id': 'b95eeb1d-d55d-4827-abb4-8ebb94941429',
+        'vmx_int_ctl_len': '24',
+        'vmxvpfe_sriov43_0_port_vlanstrip': 'false',
+        'vmxvpfe_sriov41_0_port_broadcastallow': 'true',
+        'vmxvre_volume_id_1': '6e86797e-03cd-4fdc-ba72-2957119c746d',
+        'vmxvpfe_sriov41_0_port_vlanfilter': '4001',
+        'nf_role': 'Testing',
+        'vmxvre_volume_id_0': 'f4eacb79-f687-4e9d-b760-21847c8bb15a',
+        'vmxvpfe_sriov42_0_port_unknownunicastallow': 'true',
+        'vmxvpfe_flavor_name': 'ns.c20r16d25.v5'
+      },
+      'type': 'VF',
+      'modelCustomizationName': '2017-388_ADIOD-vPE 1',
+      'vfModules': {},
+      'volumeGroups': {}
+    };
+  }
+
+});
+
+
+
+
diff --git a/vid-webpack-master/src/app/services/service-planning.service.ts b/vid-webpack-master/src/app/services/service-planning.service.ts
new file mode 100644 (file)
index 0000000..75720c8
--- /dev/null
@@ -0,0 +1,282 @@
+import {Injectable} from '@angular/core';
+import {Constants} from "../shared/utils/constants";
+import {Utils} from "../utils/utils";
+import * as _ from 'lodash';
+import Parameter = Constants.Parameter;
+import {ITreeNode} from "angular-tree-component/dist/defs/api";
+import {ServiceInstance} from "../shared/models/serviceInstance";
+import {VNFModel} from "../shared/models/vnfModel";
+import {ServiceNodeTypes} from "../shared/models/ServiceNodeTypes";
+import {VfModuleMap} from "../shared/models/vfModulesMap";
+import {VnfInstance} from "../shared/models/vnfInstance";
+import {VfModuleTreeNode} from "../shared/models/vfModuleTreeNode";
+import {VfModule} from "../shared/models/vfModule";
+import {VnfTreeNode} from "../shared/models/vnfTreeNode";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../store/reducers";
+import {InputType} from "../shared/models/inputTypes";
+
+
+@Injectable()
+export class ServicePlanningService {
+
+  modelDataTree: any[] = [];
+  drawingDataTree: any[] = [];
+  service: any = {name:'My Service'} ;
+  public requiredFields = {
+    VF: [InputType.LCP_REGION, InputType.TENANT, InputType.PLATFORM],
+    VFmodule: []
+  };
+
+  constructor(private store: NgRedux<AppState>) {}
+
+
+  public getServiceName() :string{
+    return this.service.name;
+  }
+
+  public getServiceInstance(serviceModelId): ServiceInstance {
+    return this.store.getState().service.serviceInstance[serviceModelId];
+  }
+
+  public getVnfInstance(serviceModelId, vnfModelName): VnfInstance {
+    return this.getServiceInstance(serviceModelId).vnfs[vnfModelName];
+  }
+
+  public getVfModuleMap(serviceModelId, vnfModelName, vfModuleModelName): VfModuleMap {
+    let vnfInstance =  this.getVnfInstance(serviceModelId, vnfModelName);
+    return _.get(vnfInstance, ['vfModules', vfModuleModelName]);
+  }
+
+  public convertServiceModelToTreeNodes(serviceModel) {
+    let _this = this;
+
+    _.forOwn(serviceModel.vnfs, function(item, key) {
+      _this.addFirstLevelModel(key, item, item.type, serviceModel);
+    });
+
+    _.forOwn(serviceModel.configurations, function(item, key) {
+      _this.addFirstLevelModel(key, item, ServiceNodeTypes.Configuration, serviceModel);
+    });
+
+    _.forOwn(serviceModel.networks, function(network, key) {
+      _this.addFirstLevelModel(key, network, ServiceNodeTypes.Network, serviceModel);
+    });
+
+    return this.modelDataTree;
+  }
+
+  private addFirstLevelModel(key, value, valueType, serviceModel) {
+
+    let node = this.convertItemToTreeNode(key, value, valueType, null, false);
+    let vnfInstance = this.getVnfInstance(serviceModel.service.uuid, key);
+    if(value.vfModules) {
+      node.children = Object.keys(value.vfModules).map((vmKey) =>
+        this.convertItemToTreeNode(vmKey, value.vfModules[vmKey], ServiceNodeTypes.VFmodule, value, !vnfInstance));
+    }
+    this.modelDataTree.push(node);
+  }
+
+  private convertItemToTreeNode(key, value, valueType, parentModel , disabled) {
+
+    return {
+      id: value.uuid,
+      name: key,
+      tooltip: valueType,
+      type: valueType,
+      count: value.count || 0,
+      max: value.max || 1,
+      children: [],
+      disabled: disabled,
+      dynamicInputs: this.updateDynamicInputsVnfDataFromModel(valueType, value),
+      userProvidedNaming: this.isUserProvidedNaming(valueType, value, parentModel)
+    }
+  }
+
+  public convertServiceInstanceToTreeData(serviceInstance: ServiceInstance, modelId: string): any {
+    let drawingBoardData = [];
+    let _this = this;
+    _.forOwn(serviceInstance.vnfs, (vnfInstance, vnfModelName) => {
+      let vnfModel: VNFModel = _this.store.getState().service.serviceHierarchy[modelId].vnfs[vnfModelName];
+      let vnfNode = new VnfTreeNode(vnfInstance, vnfModel);
+
+      let vfModuleNodes = [];
+      _.forOwn(vnfInstance.vfModules, (vfModuleMap, vfModuleModelName) => {
+        _.forOwn(vfModuleMap, (vfModuleInstance, vfModuleInstsanceName) => {
+          let vfModule: VfModule = _this.store.getState().service.serviceHierarchy[modelId].vnfs[vnfModelName].vfModules[vfModuleModelName];
+          let vfModuleNode: VfModuleTreeNode = new VfModuleTreeNode(vfModuleInstance, vfModule, vfModuleModelName);
+          vfModuleNodes.push(vfModuleNode);
+        });
+      });
+      vnfNode.children = vfModuleNodes;
+      drawingBoardData.push(vnfNode);
+    });
+
+    return drawingBoardData;
+  }
+
+  public getArbitraryInputs(inputs) {
+    let parameter;
+    let parameterList = [];
+    for (let key in inputs) {
+      parameter = {
+        id : key,
+        type : Parameter.STRING,
+        name : key,
+        value : inputs[key][Parameter.DEFAULT],
+        isRequired : inputs[key][Parameter.REQUIRED],
+        description : inputs[key][Parameter.DESCRIPTION]
+      };
+      switch (inputs[key][Parameter.TYPE]) {
+        case Parameter.INTEGER:
+          parameter.type = Parameter.NUMBER;
+          break;
+        case Parameter.BOOLEAN:
+          parameter.type = Parameter.BOOLEAN;
+          break;
+        case Parameter.RANGE:
+          break;
+        case Parameter.LIST:
+          parameter.type = Parameter.LIST;
+          break;
+        case Parameter.MAP:
+          parameter.type = Parameter.MAP;
+          break;
+      }
+      if ( Utils.hasContents(inputs[key][Parameter.CONSTRAINTS])
+        && ( inputs[key][Parameter.CONSTRAINTS].length > 0 ) ) {
+        let constraintsArray = inputs[key][Parameter.CONSTRAINTS];
+        this.addConstraintParameters (parameterList, constraintsArray, key, inputs, parameter);
+      }
+      else {
+
+        parameterList.push(parameter);
+      }
+    }
+    return parameterList;
+  }
+
+  private addConstraintParameters(parameterList, constraintsArray, key, inputs, parameter) {
+    // If there are constraints and the operator is "valid_values",
+    // use a select parameter type.
+    let i:number = constraintsArray.length;
+    let parameterPushed: boolean = false;
+    if ( i > 0 ) {
+      while ( (i--) && (!parameterPushed) ) {
+        let keys = Object.keys(constraintsArray[i]);
+        for ( let operator in keys ) {
+          switch (keys[operator]) {
+            case Parameter.VALID_VALUES:
+              let j: number = constraintsArray[i][Parameter.VALID_VALUES].length;
+              if ( j > 0 ) {
+                let oList = [];
+                let option;
+                while (j--) {
+                  option = {
+                    name: constraintsArray[i][Parameter.VALID_VALUES][j],
+                    isDefault: false
+                  };
+                  if ( (Utils.hasContents (inputs[key][Parameter.DEFAULT]) )
+                    && (inputs[key][Parameter.DEFAULT] === constraintsArray[i][Parameter.VALID_VALUES][j] ) ) {
+                    option = {
+                      name: constraintsArray[i][Parameter.VALID_VALUES][j],
+                      isDefault: true
+                    }
+                  }
+                  oList.push(option);
+                }
+                parameter.type = Parameter.SELECT;
+                parameter.optionList = oList;
+                parameterList.push(parameter);
+                parameterPushed = true;
+              }
+              break;
+
+            case Parameter.EQUAL:
+              if ( constraintsArray[i][Parameter.EQUAL] != null ) {
+                //override parameter type
+                parameter.type = Parameter.STRING;
+                parameter.isReadOnly = true;
+                parameter.value = constraintsArray[i][Parameter.EQUAL];
+                parameterList.push(parameter);
+                parameterPushed = true;
+              }
+              break;
+
+            case Parameter.LENGTH:
+              if ( constraintsArray[i][Parameter.LENGTH] != null ) {
+                parameter.minLength = constraintsArray[i][Parameter.LENGTH];
+                parameter.maxLength = constraintsArray[i][Parameter.LENGTH];
+                parameterList.push(parameter);
+                parameterPushed = true;
+              }
+              break;
+            case Parameter.MAX_LENGTH:
+              if ( constraintsArray[i][Parameter.MAX_LENGTH] != null ) {
+                parameter.maxLength = constraintsArray[i][Parameter.MAX_LENGTH];
+                parameterList.push(parameter);
+                parameterPushed = true;
+              }
+              break;
+            case Parameter.MIN_LENGTH:
+              if ( constraintsArray[i][Parameter.MIN_LENGTH] != null ) {
+                parameter.minLength = constraintsArray[i][Parameter.MIN_LENGTH];
+                parameterList.push(parameter);
+                parameterPushed = true;
+              }
+              break;
+            case Parameter.IN_RANGE:
+              if ( constraintsArray[i][Parameter.IN_RANGE] != null ) {
+                if (constraintsArray[i][Parameter.IN_RANGE].length > 1 ) {
+                  parameter.min = constraintsArray[i][Parameter.IN_RANGE][0];
+                  parameter.max = constraintsArray[i][Parameter.IN_RANGE][1];
+                  parameter.type = Parameter.NUMBER;
+                  parameter.value = inputs[key][Parameter.DEFAULT];
+                  parameterList.push(parameter);
+                  parameterPushed = true;
+                }
+              }
+              break;
+            case Parameter.GREATER_THAN:
+              if ( constraintsArray[i][Parameter.GREATER_THAN] != null ) {
+                parameter.type = Parameter.NUMBER;
+                parameter.min = constraintsArray[i][Parameter.GREATER_THAN];
+                parameter.value = inputs[key][Parameter.DEFAULT];
+                parameterList.push(parameter);
+                parameterPushed = true;
+              }
+              break;
+          }//switch
+        }//for
+      }//while
+    }//if
+  };
+
+  public static isVfModule(node:ITreeNode): boolean {
+    return node.data.type=='VFmodule';
+  }
+
+  public static isVnf(node:ITreeNode): boolean {
+    return node.data.type == ServiceNodeTypes.VF;
+  }
+
+  updateDynamicInputsVnfDataFromModel(modelType: string, model: any): Array<any> {
+    let displayInputs;
+    if (modelType === ServiceNodeTypes.VFmodule) {
+      displayInputs = model.inputs;
+    }
+    return _.isEmpty(displayInputs) ? [] : this.getArbitraryInputs(displayInputs);
+  }
+
+  isUserProvidedNaming(type: string, nodeModel: any, parentModel: any) : boolean {
+    let model;
+    if (type === ServiceNodeTypes.VFmodule) {
+      model = parentModel;
+    }
+    else {
+      model = nodeModel;
+    }
+    const ecompGeneratedNaming = model.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false";
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/api.service.ts b/vid-webpack-master/src/app/shared/api.service.ts
new file mode 100644 (file)
index 0000000..a69d91e
--- /dev/null
@@ -0,0 +1,6 @@
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class ApiService {
+  title = 'Angular 2';
+}
diff --git a/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts b/vid-webpack-master/src/app/shared/components/ellipsis/ellipsis.component.ts
new file mode 100644 (file)
index 0000000..fd58b65
--- /dev/null
@@ -0,0 +1,27 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector : 'custom-ellipsis',
+  template: `
+    <span 
+          class="ellipsis"
+          id="{{id}}"
+          tooltip="{{value}}">{{value}}</span>`,
+  styles : [
+    `
+      .ellipsis {
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        display: inline-block;
+        width: 99%;
+        text-align: left;
+      }
+    `
+  ]
+})
+export class EllipsisComponent {
+  @Input() value : string;
+  @Input() id : string;
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/error/error.component.service.ts b/vid-webpack-master/src/app/shared/components/error/error.component.service.ts
new file mode 100644 (file)
index 0000000..35b83f0
--- /dev/null
@@ -0,0 +1,35 @@
+import {Injectable} from "@angular/core";
+import {Subject} from "rxjs/Subject";
+import { MessageBoxService } from '../messageBox/messageBox.service';
+import { MessageBoxData, ModalSize, ModalType } from '../messageBox/messageBox.data';
+
+@Injectable()
+export class ErrorService {
+  static showErrorWithMessage(error : ErrorMessage) : void {
+    setTimeout(()=>{
+        let messageBoxData : MessageBoxData = new MessageBoxData(
+          error.title,  // modal title
+          error.text,
+
+          ModalType.error,
+          ModalSize.medium,
+          [
+            {text:"Close", size:"large", closeModal:true}
+          ]);
+        MessageBoxService.openModal.next(messageBoxData);
+      }
+      ,500);
+  }
+}
+
+export class ErrorMessage {
+  title : string;
+  text : string;
+  errorNumber : number;
+
+  constructor( title : string, text : string,errorNumber : number){
+    this.title = title;
+    this.text = text;
+    this.errorNumber = errorNumber;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.html b/vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.html
new file mode 100644 (file)
index 0000000..daa35e6
--- /dev/null
@@ -0,0 +1,4 @@
+<div  *ngIf="message">
+    <span class="icon-alert"></span>
+    <span class="message">{{message}}</span>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.scss b/vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.scss
new file mode 100644 (file)
index 0000000..d174f51
--- /dev/null
@@ -0,0 +1,14 @@
+.icon-alert {
+  margin-top: 10px;
+  &:before {
+    content: "\e904";
+    font-size: 16px;
+    color: #cf2a2a;
+  }
+}
+
+.message {
+  font-size: 12px;
+  line-height: 14px;
+  color: #cf2a2a;
+}
diff --git a/vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.ts b/vid-webpack-master/src/app/shared/components/formControlError/formControlError.component.ts
new file mode 100644 (file)
index 0000000..a20b260
--- /dev/null
@@ -0,0 +1,10 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector : 'form-control-error',
+  templateUrl : 'formControlError.component.html',
+  styleUrls : ['formControlError.component.scss']
+})
+export class FormControlErrorComponent {
+  @Input() message = null;
+}
diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.html b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.html
new file mode 100644 (file)
index 0000000..4c794e6
--- /dev/null
@@ -0,0 +1,10 @@
+<div *ngIf="message" class="row row-padding">
+  <div class="col-md-2 icon-div"><span class="icon-alert"></span></div>
+  <div class="col-md-10 left-align parentbox">
+    <div class="childbox">
+      <span>{{message}}</span>
+    </div>
+  </div>
+</div>
+
+
diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.scss
new file mode 100644 (file)
index 0000000..5271cad
--- /dev/null
@@ -0,0 +1,48 @@
+.icon-alert {
+  margin-top: 10px;
+  &:before {
+    content: "\e904";
+    font-size: 30px;
+    color: #ffffff;
+  }
+}
+
+.icon-div {
+  background: rgb(207,41,41);
+  text-align: center;
+  padding-top: 18px;
+  width: 77px;
+  height: 110px;
+  float: left;
+}
+
+
+.error-title {
+  color: #cf2a2a;
+}
+
+.row-padding {
+  margin-left: 0 !important;
+  margin-right: 0 !important;
+}
+
+.left-align {
+  text-align: left;
+}
+
+.parentbox {
+  padding-right: 0;
+}
+
+.parentbox:before {
+  content: ' ';
+  display: inline-block;
+  vertical-align: middle;
+  height: 100%;
+}
+
+.childbox {
+  color: #cf2a2a;
+  display: inline-block;
+  vertical-align: middle;
+}
diff --git a/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.ts b/vid-webpack-master/src/app/shared/components/formGeneralErrors/formGeneralErrors.component.ts
new file mode 100644 (file)
index 0000000..0c0516a
--- /dev/null
@@ -0,0 +1,11 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector : 'form-general-error',
+  templateUrl : 'formGeneralErrors.component.html',
+  styleUrls : ['formGeneralErrors.component.scss']
+})
+
+export class FormGeneralErrorsComponent {
+  @Input() message : string = null;
+}
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.component.ts
new file mode 100644 (file)
index 0000000..08e199c
--- /dev/null
@@ -0,0 +1,50 @@
+/************************************************************************************************
+ * @Component: Message box component
+ * In order to use component you need to do a number of things:
+ *  1) Inside your component constructor you need to add listener to the button trigger.
+ *  2) Inside the listener you should write your callback logic.
+ *
+ *  Example:
+ *   @Component({
+ *    selector : 'some-component'
+ *    ...
+ *   })
+ *
+ *   export class SomeComponent {
+ *      openModal() : void {
+ *        let messageBoxData : MessageBoxData = new MessageBoxData(
+ *            "title",  // modal title
+ *            "message", ModalType.alert, // modal type
+  *           [
+                {text:"Save", size:"'x-small'",  callback: this.someFunction.bind(this), closeModal:true},
+                {text:"Cancel", size:"'x-small'", closeModal:true}
+          ]);
+ *
+ *        MessageBoxService.openModal.next(messageBoxData); // open modal
+ *      }
+ *   }
+
+ ************************************************************************************************/
+
+
+import { Component } from '@angular/core';
+import { MessageBoxData} from './messageBox.data';
+import { MessageBoxService } from './messageBox.service';
+import { SdcUiComponents } from 'sdc-ui/lib/angular';
+
+@Component({
+  selector: 'message-box',
+  template: '<div id="message-box"></div>'
+})
+
+export class MessageBoxComponent {
+  modalService: SdcUiComponents.ModalService;
+
+  constructor(modalService: SdcUiComponents.ModalService, private _messageBoxService : MessageBoxService) {
+    this.modalService = modalService;
+    MessageBoxService.openModal.subscribe((messageBoxData: MessageBoxData) => {
+      modalService.openModal(this._messageBoxService.setConfig(messageBoxData))
+    });
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.data.ts
new file mode 100644 (file)
index 0000000..165140b
--- /dev/null
@@ -0,0 +1,51 @@
+import { Subject } from 'rxjs/Subject';
+
+export class  MessageBoxData {
+  title?: string;
+  message?: string;
+  size : ModalSize;
+  type: ModalType;
+  buttons: Array<IModalButtonComponent>;
+
+  constructor(title: string, message: string, type: ModalType, size : ModalSize, buttons: Array<IModalButtonComponent>) {
+    this.title = title;
+    this.message = message;
+    this.size = size;
+    this.type = type;
+    this.buttons = buttons;
+  }
+}
+
+export interface IModalConfig {
+  size?: string;
+  title?: string;
+  message?: string;
+  buttons?: Array<IModalButtonComponent>;
+  type?: string;
+}
+export interface IButtonComponent {
+  text: string;
+  disabled?: boolean;
+  type?: string;
+  size?: string;
+}
+export interface IModalButtonComponent extends IButtonComponent {
+  callback?: Function;
+  closeModal?: boolean;
+}
+export  enum ModalType {
+  alert = "alert",
+  error = "error",
+  standard = "info",
+  custom = "custom",
+}
+export enum ModalSize {
+  xlarge = "xl",
+  large = "l",
+  medium = "md",
+  small = "sm",
+  xsmall = "xsm",
+}
+
+
+
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.spec.ts
new file mode 100644 (file)
index 0000000..89562ac
--- /dev/null
@@ -0,0 +1,49 @@
+import { TestBed, getTestBed } from '@angular/core/testing';
+import {
+  HttpClientTestingModule,
+  HttpTestingController
+} from '@angular/common/http/testing';
+
+import { MessageBoxService } from './messageBox.service';
+import {MessageBoxData, ModalSize, ModalType } from './messageBox.data';
+
+describe('MessageBoxService', () => {
+  let injector;
+  let service: MessageBoxService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [MessageBoxService]
+    });
+
+    injector = getTestBed();
+    service = injector.get(MessageBoxService);
+    httpMock = injector.get(HttpTestingController);
+  });
+
+  describe('#setConfig', () => {
+    it('should return <IModalConfig>', (done: DoneFn) => {
+      let title = "Delete Instantiation";
+      let message = "You are about to stop the instantiation process of this service. \nAll data will be lost. Are you sure you want to stop?";
+      let messageBoxData : MessageBoxData = new MessageBoxData(
+        title,
+        message,
+        ModalType.alert,
+        ModalSize.medium,
+        [
+          {text:"Stop Instantiation", size:"large", closeModal:true},
+          {text:"Cancel", size:"medium", closeModal:true}
+        ]);
+
+      let result = service.setConfig(messageBoxData);
+      expect(result.title).toEqual(title);
+      expect(result.message).toEqual(message);
+      expect(result.buttons.length).toEqual(2);
+      expect(result.type).toEqual(ModalType.alert);
+      expect(result.size).toEqual(ModalSize.medium);
+      done();
+    });
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts b/vid-webpack-master/src/app/shared/components/messageBox/messageBox.service.ts
new file mode 100644 (file)
index 0000000..eaa012d
--- /dev/null
@@ -0,0 +1,18 @@
+import { Injectable } from '@angular/core';
+import { Subject } from 'rxjs/Subject';
+import { IModalConfig, MessageBoxData, ModalSize, ModalType } from './messageBox.data';
+
+@Injectable()
+export class MessageBoxService {
+  static openModal: Subject<MessageBoxData> = new Subject<MessageBoxData>();
+  setConfig(messageBoxData: MessageBoxData) : IModalConfig{
+    return {
+      size : ModalSize.medium,
+      title : messageBoxData.title,
+      type : messageBoxData.type,
+      message : messageBoxData.message,
+      buttons: messageBoxData.buttons
+    };
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts b/vid-webpack-master/src/app/shared/components/model-information/model-information.component.ts
new file mode 100644 (file)
index 0000000..fea4c44
--- /dev/null
@@ -0,0 +1,42 @@
+import {Component, Input} from '@angular/core';
+import * as _ from 'lodash';
+
+@Component({
+  selector: 'model-information',
+  templateUrl: 'model-information.html',
+  styleUrls: ['model-information.scss']
+})
+
+export class ModelInformationComponent {
+  private _modelInformationItems: Array<ModelInformationItem>;
+
+
+  get modelInformationItems(): Array<ModelInformationItem> {
+    return this._modelInformationItems;
+  }
+
+  @Input()
+  set modelInformationItems(_modelInformationItems: Array<ModelInformationItem>) {
+    if (_modelInformationItems) {
+      this._modelInformationItems = _modelInformationItems.filter(x => x.mandatory || (!_.isEmpty(x.values) && !_.isEmpty(x.values[0])));
+    }
+  }
+}
+
+
+export class ModelInformationItem {
+  label: string;
+  testsId: string;
+  values: Array<string>;
+  toolTipText: string;
+  mandatory: boolean;
+
+  constructor(label: string, testsId: string, values: Array<any>, toolTipText: string = "", mandatory: boolean = false,nested:boolean=false) {
+    this.label = label;
+    this.testsId = testsId;
+    this.values = values;
+    this.toolTipText = toolTipText;
+    this.mandatory = mandatory;
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.html b/vid-webpack-master/src/app/shared/components/model-information/model-information.html
new file mode 100644 (file)
index 0000000..456dfde
--- /dev/null
@@ -0,0 +1,12 @@
+<div id="model-information">
+  <div *ngFor="let item of modelInformationItems" class="item" attr.data-tests-id="model-item-{{item.label}}">
+    <tooltip-content #a>
+      <span> {{item.toolTipText}}</span>
+    </tooltip-content>
+
+    <div class="wrapper" [tooltip]="a" [tooltipDisabled]="!item.toolTipText" tooltipPlacement="top" [tooltipAnimation]="false">
+      <label attr.data-tests-id="model-item-label-{{item.testsId}}">{{item.label}}</label>
+      <div *ngFor="let value of item.values" attr.data-tests-id="model-item-value-{{item.testsId}}">{{value}}</div>
+    </div>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/model-information/model-information.scss b/vid-webpack-master/src/app/shared/components/model-information/model-information.scss
new file mode 100644 (file)
index 0000000..cd42136
--- /dev/null
@@ -0,0 +1,34 @@
+#model-information {
+  overflow: auto;
+
+}
+
+tooltip-content span {
+  font-family: OpenSans-Regular;
+  font-size: 12px;
+  color: #FFFFFF;
+  letter-spacing: 0;
+  line-height: 16px;
+}
+
+.item {
+  display: block;
+
+  .wrapper {
+
+    display: inline-block;
+    margin-bottom: 25px;
+
+    label {
+      font-family: OpenSans-Semibold;
+      font-size: 12px;
+    }
+
+    div {
+      font-family: OpenSans-Regular;
+      font-size: 14px;
+    }
+  }
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.html
new file mode 100644 (file)
index 0000000..bbe7bc7
--- /dev/null
@@ -0,0 +1,5 @@
+<div class="width-100">
+  <div class="text-title" [ngClass]="titleClass">{{title}}</div>
+  <div class="text-subtitle" [ngClass]="subtitleClass">{{subtitle}}</div>
+  <img  id="not-node-img-id" src="{{iconPath}}" alt="" class="no-content-icon" [ngClass]="iconClass" data-tests-id="no-content-icon">
+</div>
diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.scss
new file mode 100644 (file)
index 0000000..1320ef7
--- /dev/null
@@ -0,0 +1,26 @@
+.width-100 {
+  width: 100%;
+  margin-top: 126px;
+
+}
+
+.text-title {
+  font-family: OpenSans-Semibold;
+  font-size: 16px;
+  color: #4A4A4A;
+  text-align: center;
+}
+
+.text-subtitle {
+  font-family: OpenSans-Regular;
+  font-size: 16px;
+  color: #959595;
+  text-align: center;
+  margin-top: 7px;
+}
+
+.no-content-icon {
+  display: block;
+  vertical-align: middle;
+  margin: 30px auto;
+}
diff --git a/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts b/vid-webpack-master/src/app/shared/components/no-content-message-and-icon/no-content-message-and-icon.component.ts
new file mode 100644 (file)
index 0000000..7f4e982
--- /dev/null
@@ -0,0 +1,23 @@
+import {Component, Input} from '@angular/core';
+
+@Component({
+  selector: 'no-content-message-and-icon',
+  templateUrl: './no-content-message-and-icon.component.html',
+  styleUrls: ['./no-content-message-and-icon.component.scss']
+})
+
+
+export class NoContentMessageAndIconComponent {
+  constructor() {}
+
+  @Input() title: string;
+  @Input() subtitle: string;
+  @Input() iconPath: string;
+
+  @Input() titleClass: string="";
+  @Input() subtitleClass: string="";
+  @Input() iconClass: string="";
+
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.html b/vid-webpack-master/src/app/shared/components/popover/popover.component.html
new file mode 100644 (file)
index 0000000..c551559
--- /dev/null
@@ -0,0 +1,8 @@
+<div
+  triggers="mouseenter:mouseleave"
+  popover="{{value}}"
+  [hidden]="value == null"
+  container="body">
+  <ng-content ></ng-content>
+</div>
+
diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.scss b/vid-webpack-master/src/app/shared/components/popover/popover.component.scss
new file mode 100644 (file)
index 0000000..ca2800a
--- /dev/null
@@ -0,0 +1,4 @@
+.popover.popover-top.top {
+  color : green !important;
+  font-size: 10px;
+}
diff --git a/vid-webpack-master/src/app/shared/components/popover/popover.component.ts b/vid-webpack-master/src/app/shared/components/popover/popover.component.ts
new file mode 100644 (file)
index 0000000..d6a4c3a
--- /dev/null
@@ -0,0 +1,17 @@
+import {Component, Input} from "@angular/core";
+
+@Component({
+  selector: 'custom-popover',
+  templateUrl: 'popover.component.html',
+  styles: [`
+        :host >>> .popover {
+          font-size: 13px;
+          text-align: left;
+          z-index: 10000;
+        }
+    `]
+})
+
+export class PopoverComponent {
+  @Input() value: String;
+}
diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.html
new file mode 100644 (file)
index 0000000..cb11fee
--- /dev/null
@@ -0,0 +1,2 @@
+<div *ngIf="show"
+     class="spinner"></div>
diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.scss b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.scss
new file mode 100644 (file)
index 0000000..d31dfed
--- /dev/null
@@ -0,0 +1,87 @@
+.spinner {
+  height: 150px;
+  width: 150px;
+  margin: 0 auto;
+  -webkit-animation: rotation .6s infinite linear;
+  animation: rotation .6s infinite linear;
+  border: 6px solid rgba(0, 174, 239, 0.01);
+  border-radius: 100%;
+  position: absolute;
+  z-index: 1000;
+  left: 50%;
+  right: 50%;
+  top: 50%;
+  bottom: 50%;
+}
+
+
+
+.spinner:before {
+  content: "";
+  display: block;
+  position: absolute;
+  top: -6px;
+  height: 100%;
+  width: 100%;
+  border-top: 6px solid #009fdb;
+  border-left: 6px solid transparent;
+  border-bottom: 6px solid #c3161600;
+  border-right: 6px solid transparent;
+  border-radius: 100%;
+}
+
+@-webkit-keyframes rotation {
+  from {-webkit-transform: rotate(0deg);}
+  to {-webkit-transform: rotate(359deg);}
+}
+@-moz-keyframes rotation {
+  from {-moz-transform: rotate(0deg);}
+  to {-moz-transform: rotate(359deg);}
+}
+@-o-keyframes rotation {
+  from {-o-transform: rotate(0deg);}
+  to {-o-transform: rotate(359deg);}
+}
+@keyframes rotation {
+  from {transform: rotate(0deg);}
+  to {transform: rotate(359deg);}
+}
+
+.spinner-sm {
+  height:16px;
+  width:16px;
+}
+
+.spinner-md {
+  height:40px;
+  width:40px;
+}
+
+.spinner-lr {
+  height:150px;
+  width:150px;
+}
+
+.spinner-red {
+  border:6px solid rgba(216, 27, 34, .15);
+}
+
+.spinner-red:before {
+  border-top:6px solid rgba(216, 27, 34, 1);
+}
+
+.spinner-green {
+  border:6px solid rgba(40, 183, 121, .15);
+}
+
+.spinner-green:before {
+  border-top:6px solid rgba(40, 183, 121, 1);
+}
+
+.spinner-grey {
+  border:6px solid rgba(139, 146, 154, .15);
+}
+
+.spinner-grey:before {
+  border-top:6px solid rgba(139, 146, 154, 1);
+}
diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.spec.ts
new file mode 100644 (file)
index 0000000..531ee8c
--- /dev/null
@@ -0,0 +1,42 @@
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule} from '@angular/common/http/testing';
+import { SpinnerComponent } from './spinner.component';
+
+describe('Spinner component', () => {
+  let component: SpinnerComponent;
+  let fixture: ComponentFixture<SpinnerComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [],
+      declarations: [SpinnerComponent ]
+    })
+      .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(SpinnerComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('component should be defined', () => {
+    expect(component).toBeDefined();
+  });
+
+
+  it('component constructor should subscribe of showSpinner event with true', ()=> {
+    SpinnerComponent.showSpinner.next(true);
+    expect(component.show).toBeTruthy();
+  });
+
+  it('component constructor should subscribe of showSpinner event with false', ()=> {
+    SpinnerComponent.showSpinner.next(false);
+    expect(component.show).toBeFalsy();
+  });
+
+
+
+
+});
diff --git a/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts b/vid-webpack-master/src/app/shared/components/spinner/spinner.component.ts
new file mode 100644 (file)
index 0000000..0ce5d20
--- /dev/null
@@ -0,0 +1,18 @@
+import { Component, Input } from '@angular/core';
+import { Subject } from 'rxjs/Subject';
+
+@Component({
+  selector : 'spinner-component',
+  templateUrl : './spinner.component.html',
+  styleUrls : ['./spinner.component.scss']
+})
+export class SpinnerComponent {
+  show : boolean = false;
+  static showSpinner: Subject<boolean> = new Subject<boolean>();
+
+  constructor(){
+    SpinnerComponent.showSpinner.subscribe((status) => {
+      this.show = status;
+    })
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts b/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.spec.ts
new file mode 100644 (file)
index 0000000..ec9f3f7
--- /dev/null
@@ -0,0 +1,39 @@
+import { ReflectiveInjector } from '@angular/core';
+import { NumbersLettersUnderscoreValidator } from './numbersLettersUnderscore.validator';
+
+describe('Numbers letters underscore validator', () => {
+  let injector;
+  let service: NumbersLettersUnderscoreValidator;
+
+  beforeEach(() => {
+
+    let injector = ReflectiveInjector.resolveAndCreate([
+      NumbersLettersUnderscoreValidator
+    ]);
+
+    service = injector.get(NumbersLettersUnderscoreValidator);
+  });
+
+
+  describe('#valid', () => {
+    it("'legal' should return null", ()=> {
+      let legalVal: string = "legal";
+      let result = NumbersLettersUnderscoreValidator.valid(legalVal);
+      expect(result).toBeNull();
+    });
+
+    it("'illegal' should return object with invalidNumberLettersUnderscore true", ()=> {
+      let illegalVal: string = "illegal-Val";
+      let result = NumbersLettersUnderscoreValidator.valid(illegalVal);
+      expect(result.invalidNumberLettersUnderscore).toBeTruthy();
+    });
+
+    it("'null' should return null", ()=> {
+      let nullVal: string = null
+      let result = NumbersLettersUnderscoreValidator.valid(nullVal);
+      expect(result).toBeNull();
+    });
+
+
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts b/vid-webpack-master/src/app/shared/components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator.ts
new file mode 100644 (file)
index 0000000..418bdfc
--- /dev/null
@@ -0,0 +1,20 @@
+import { Injectable } from '@angular/core';
+import { isNullOrUndefined, isString } from 'util';
+
+@Injectable()
+export class NumbersLettersUnderscoreValidator {
+  static valid(control: any) {
+    let reg =  /^[a-zA-Z0-9_]*$/;
+
+    if(isNullOrUndefined(control)) return null;
+    let val = isString(control) ? control : control.value;
+    if (val === null) {
+      return {'invalidNumberLettersUnderscore': true};
+    }
+    if (reg.test(val)) {
+      return null;
+    } else {
+      return {'invalidNumberLettersUnderscore': true};
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.spec.ts
new file mode 100644 (file)
index 0000000..846ff70
--- /dev/null
@@ -0,0 +1,66 @@
+import {TestBed, ComponentFixture} from '@angular/core/testing';
+import {Component, DebugElement} from "@angular/core";
+import {By} from "@angular/platform-browser";
+import { InputPreventionPatternDirective } from './inputPreventionPattern.directive';
+
+@Component({
+  template: `<input 
+    patternInput
+    pattern="^[a-zA-Z0-9_]*$">`
+})
+class TestHoverFocusComponent {
+}
+
+
+describe('InputPrevention Pattern Directive', () => {
+
+  let component: TestHoverFocusComponent;
+  let fixture: ComponentFixture<TestHoverFocusComponent>;
+  let directiveInstance : InputPreventionPatternDirective;
+  let inputEl: DebugElement;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      declarations: [TestHoverFocusComponent, InputPreventionPatternDirective]
+    });
+    fixture = TestBed.createComponent(TestHoverFocusComponent);
+    component = fixture.componentInstance;
+    inputEl = fixture.debugElement.query(By.css('input'));
+    directiveInstance = inputEl.injector.get(InputPreventionPatternDirective);
+  });
+
+  it('directive should be defined', () => {
+    expect(directiveInstance).toBeDefined();
+  });
+
+  it('pattern exists', () => {
+    expect(inputEl.nativeElement.pattern).toEqual('^[a-zA-Z0-9_]*$');
+  });
+
+  it('kepress legal input', () => {
+    fixture.detectChanges();
+    inputEl.nativeElement.value = "legalInput";
+    expect(new RegExp(inputEl.nativeElement.pattern).test(inputEl.nativeElement.value)).toBeTruthy();
+  });
+
+  it('kepress illegal input', () => {
+    inputEl.triggerEventHandler('kepress', " ");
+    fixture.detectChanges();
+    expect(inputEl.nativeElement.value).toBe('');
+  });
+
+  it('kepress event legal input should return event', () => {
+    const event = <any>{ key: 'A' };
+    inputEl.nativeElement.value = "legalInput";
+    let result = directiveInstance.onKeypress(event);
+    expect(result).toBe(event);
+  });
+
+  it('kepress event illegal input should prevent default', () => {
+    const event = <any>{key: '-', preventDefault : function () {} };
+    spyOn(event, 'preventDefault');
+    inputEl.nativeElement.value = "-";
+    let result = directiveInstance.onKeypress(event);
+    expect(event.preventDefault).toHaveBeenCalled();
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts b/vid-webpack-master/src/app/shared/directives/inputPrevention/inputPreventionPattern.directive.ts
new file mode 100644 (file)
index 0000000..dada09b
--- /dev/null
@@ -0,0 +1,24 @@
+import {Directive, ElementRef} from '@angular/core';
+
+@Directive({
+  selector: '[patternInput]',
+  host: {
+    '(keypress)': 'onKeypress($event)'
+  }
+})
+export class InputPreventionPatternDirective{
+  inputElement : ElementRef;
+  constructor(el: ElementRef) {
+    this.inputElement = el;
+  }
+
+  onKeypress(event: KeyboardEvent) {
+    const pattern = new RegExp(this.inputElement.nativeElement.pattern);
+    if(pattern){
+      if(!pattern.test(event['key'])){
+        event.preventDefault();
+      }
+    }
+    return event;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html b/vid-webpack-master/src/app/shared/directives/svg/svg.directive.html
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts b/vid-webpack-master/src/app/shared/directives/svg/svg.directive.ts
new file mode 100644 (file)
index 0000000..e4dc55a
--- /dev/null
@@ -0,0 +1,34 @@
+import { AfterContentChecked, AfterViewInit, Directive, ElementRef, Input } from '@angular/core';
+import { isNullOrUndefined } from 'util';
+
+
+/*
+          Temporary
+  Changing svg color and size.
+  color changing according to fill attribute
+  size according to viewBox
+*/
+@Directive({
+  selector: '[svg-directive]'
+})
+export class SvgDirective implements AfterContentChecked {
+  @Input('fill') fill: string = "black";
+  @Input('widthViewBox') widthViewBox: string = null;
+  @Input('heightViewBox') heightViewBox: string = null;
+
+  constructor(private elRef: ElementRef) {}
+  ngAfterContentChecked(): void {
+    if(this.elRef !== undefined && this.elRef.nativeElement.children !== undefined && this.elRef.nativeElement.children[0] !== undefined){
+      this.elRef.nativeElement.children[0].children[1].children[0].style.fill = this.fill;
+      if(this.elRef.nativeElement.children[0].children[1].children.length > 1){
+        this.elRef.nativeElement.children[0].children[1].children[1].style.fill = this.fill;
+        this.elRef.nativeElement.children[0].children[1].children[2].children[0].style.fill = this.fill;
+      }
+
+      if(this.widthViewBox && this.heightViewBox){
+        this.elRef.nativeElement.firstChild.setAttribute('viewBox', "1 1 " + this.widthViewBox + " " + this.heightViewBox)
+      }
+
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/index.ts b/vid-webpack-master/src/app/shared/index.ts
new file mode 100644 (file)
index 0000000..68fada6
--- /dev/null
@@ -0,0 +1 @@
+export * from './api.service';
diff --git a/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts b/vid-webpack-master/src/app/shared/models/ServiceNodeTypes.ts
new file mode 100644 (file)
index 0000000..f72b32d
--- /dev/null
@@ -0,0 +1,8 @@
+export enum ServiceNodeTypes {
+  VF = "VF",
+  VFmodule = "VFmodule",
+  Network = "Network",
+  Configuration = "Configuration"
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/models/aicZone.ts b/vid-webpack-master/src/app/shared/models/aicZone.ts
new file mode 100644 (file)
index 0000000..7b9e1ed
--- /dev/null
@@ -0,0 +1,9 @@
+export class AicZone {
+  id: string;
+  name: string;
+
+  constructor(serviceJson){
+    this.id = serviceJson["zone-id"];
+    this.name = serviceJson["zone-name"];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/categoryParams.ts b/vid-webpack-master/src/app/shared/models/categoryParams.ts
new file mode 100644 (file)
index 0000000..9e00529
--- /dev/null
@@ -0,0 +1,15 @@
+import {SelectOptionInterface} from "./selectOption";
+
+export class CategoryParams {
+  owningEntityList: SelectOptionInterface[];
+  projectList: SelectOptionInterface[];
+  lineOfBusinessList: SelectOptionInterface[];
+  platformList: SelectOptionInterface[];
+
+  constructor(owningEntityList=[], projectList=[], lob=[], platform=[]){
+    this.owningEntityList = owningEntityList;
+    this.projectList = projectList;
+    this.lineOfBusinessList = lob;
+    this.platformList = platform;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/dynamicInput.ts b/vid-webpack-master/src/app/shared/models/dynamicInput.ts
new file mode 100644 (file)
index 0000000..a08cdfc
--- /dev/null
@@ -0,0 +1,123 @@
+export class DynamicInput<T>{
+
+  id: string;
+  name: string;
+  type: string;
+  description: string;
+  value: T;
+  prompt: any;
+  maxLength: number;
+  minLength: number;
+  isVisible: boolean;
+  isRequired: boolean;
+  isEnabled: boolean;
+  isReadOnly: boolean;
+
+
+  constructor(options: {
+    id?: string,
+    name?: string,
+    type: string,
+    description?: string,
+    value?: T,
+    prompt?: any,
+    maxLength?: number,
+    minLength?: number,
+    isVisible?: boolean,
+    isRequired?: boolean,
+    isEnabled?: boolean,
+    isReadOnly?: boolean,
+  }) {
+    this.id = options.id;
+    this.name = options.name || '';
+    this.type = options.type;
+    this.description = options.description || '';
+    this.value = options.value;
+    this.prompt = options.prompt;
+    this.maxLength = options.maxLength;
+    this.minLength = options.minLength;
+    this.isVisible = options.isVisible == false? options.isVisible: true;
+    this.isEnabled = options.isEnabled == false? options.isEnabled: true;
+    this.isRequired = options.isRequired == null? false: options.isRequired;
+    this.isReadOnly = options.isReadOnly == null? false: options.isReadOnly;
+  }
+}
+
+export class DynamicNumber extends DynamicInput<number> {
+
+  max: number;
+  min: number;
+
+  constructor(options: {
+    id?: string,
+    name?: string,
+    type: string,
+    description?: string,
+    value?: number,
+    prompt?: any,
+    maxLength?: number,
+    minLength?: number,
+    isVisible?: boolean,
+    isRequired?: boolean,
+    isEnabled?: boolean,
+    isReadOnly?: boolean,
+    max?: number,
+    min?: number
+  }){
+    super(options);
+    this.max = options.max;
+    this.min = options.min;
+  }
+
+}
+
+export class DynamicSelect extends DynamicInput<any> {
+  optionList: any[];
+
+  constructor(options: {
+    id?: string,
+    name?: string,
+    type: string,
+    description?: string,
+    value?: any,
+    prompt?: any,
+    maxLength?: number,
+    minLength?: number,
+    isVisible?: boolean,
+    isRequired?: boolean,
+    isEnabled?: boolean,
+    isReadOnly?: boolean,
+    optionList?: any[]
+  }) {
+    super(options);
+    this.optionList = options.optionList || [];
+  }
+}
+
+export class DynamicMultiSelect extends DynamicSelect {
+  selectedItems: any[];
+  settings: any;
+
+  constructor(options: {
+    id?: string,
+    name?: string,
+    type: string,
+    description?: string,
+    value?: any,
+    prompt?: any,
+    maxLength?: number,
+    minLength?: number,
+    isVisible?: boolean,
+    isRequired?: boolean,
+    isEnabled?: boolean,
+    isReadOnly?: boolean,
+    settings?: any,
+    optionList?: any[],
+    selectedItems?: any[]
+  }) {
+    super(options);
+    this.settings = options.settings || {};
+    this.selectedItems = options.selectedItems || [];
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/externalComponentStatus.ts b/vid-webpack-master/src/app/shared/models/externalComponentStatus.ts
new file mode 100644 (file)
index 0000000..21ef61a
--- /dev/null
@@ -0,0 +1,11 @@
+export class ExternalComponentStatus {
+  component: string;
+  available: boolean;
+  metadata: any;
+
+  constructor(component: string, available: boolean, metadata: any) {
+    this.component = component;
+    this.available = available;
+    this.metadata = metadata;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/inputTypes.ts b/vid-webpack-master/src/app/shared/models/inputTypes.ts
new file mode 100644 (file)
index 0000000..1f7222f
--- /dev/null
@@ -0,0 +1,12 @@
+export enum  InputType {
+  LCP_REGION = "LCP_REGION",
+  TENANT = "TENANT",
+  LOB  = "LOB",
+  PLATFORM = "PLATFORM",
+  ROLLBACK = "ROLLBACK",
+  PRODUCT_FAMILY = "PRODUCT_FAMILY",
+  VG = "VG"
+
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/models/lcpRegion.ts b/vid-webpack-master/src/app/shared/models/lcpRegion.ts
new file mode 100644 (file)
index 0000000..e39321d
--- /dev/null
@@ -0,0 +1,11 @@
+export class LcpRegion {
+  id: string;
+  name: string;
+  isPermitted: boolean;
+
+  constructor(serviceJson){
+    this.id = serviceJson["cloudRegionID"];
+    this.name = serviceJson["cloudRegionID"];
+    this.isPermitted = serviceJson["is-permitted"];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/lcpRegionTenants.ts b/vid-webpack-master/src/app/shared/models/lcpRegionTenants.ts
new file mode 100644 (file)
index 0000000..d215546
--- /dev/null
@@ -0,0 +1,13 @@
+export class LcpRegionTenants {
+  id: string;
+  tenantId: string;
+  tenantName: string;
+  isPermitted: boolean;
+
+  constructor(serviceJson){
+    this.id = serviceJson["cloudRegionID"];
+    this.tenantId = serviceJson["tenantID"];
+    this.tenantName = serviceJson["tenantName"];
+    this.isPermitted = serviceJson["is-permitted"];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/lcpRegionsAndTenants.ts b/vid-webpack-master/src/app/shared/models/lcpRegionsAndTenants.ts
new file mode 100644 (file)
index 0000000..79f6e07
--- /dev/null
@@ -0,0 +1,12 @@
+import {LcpRegion} from "./lcpRegion";
+import {Tenant} from "./tenant";
+
+export class LcpRegionsAndTenants {
+  lcpRegionList: LcpRegion[];
+  lcpRegionsTenantsMap: { [lcpRegion: string] : Tenant[]; };
+
+  constructor(lcpRegionList: LcpRegion[] = [], lcpRegionsTenantsMap: any = {}) {
+    this.lcpRegionList = lcpRegionList;
+    this.lcpRegionsTenantsMap = lcpRegionsTenantsMap;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/modelInfo.ts b/vid-webpack-master/src/app/shared/models/modelInfo.ts
new file mode 100644 (file)
index 0000000..091c02e
--- /dev/null
@@ -0,0 +1,21 @@
+
+export class ModelInfo {
+  modelInvariantId: string;
+  modelVersionId: string;
+  modelName: string;
+  modelVersion: string;
+  modelCustomizationId: string;
+  modelCustomizationName: string;
+
+
+
+  constructor(instanceModel) {
+    this.modelInvariantId = instanceModel.invariantUuid;
+    this.modelVersionId = instanceModel.uuid;
+    this.modelName = instanceModel.name;
+    this.modelVersion = instanceModel.version;
+    this.modelCustomizationId = instanceModel.customizationUuid;
+    this.modelCustomizationName = instanceModel.modelCustomizationName;
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/models/nodeModel.ts b/vid-webpack-master/src/app/shared/models/nodeModel.ts
new file mode 100644 (file)
index 0000000..4b22b8d
--- /dev/null
@@ -0,0 +1,29 @@
+export interface NodeModelResponseInterface {
+  name: string;
+  version: string;
+  description: string;
+  category: string;
+  uuid: string;
+  invariantUuid: string;
+}
+
+export class NodeModel {
+  name: string;
+  version: string;
+  description: string;
+  category: string;
+  uuid: string;
+  invariantUuid: string;
+
+  constructor(serviceJson?: NodeModelResponseInterface) {
+    if (serviceJson) {
+      this.name = serviceJson.name;
+      this.version = serviceJson.version;
+      this.description = serviceJson.description;
+      this.category = serviceJson.category;
+      this.uuid = serviceJson.uuid;
+      this.invariantUuid = serviceJson.invariantUuid;
+    }
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/owningEntity.ts b/vid-webpack-master/src/app/shared/models/owningEntity.ts
new file mode 100644 (file)
index 0000000..f06b24f
--- /dev/null
@@ -0,0 +1,14 @@
+interface OwningEntityResponse {
+  id: string,
+  name: string
+}
+
+export class OwningEntity {
+  id: string;
+  name: string;
+
+  constructor(serviceJson: OwningEntityResponse){
+    this.id = serviceJson.id;
+    this.name = serviceJson.name;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/productFamily.ts b/vid-webpack-master/src/app/shared/models/productFamily.ts
new file mode 100644 (file)
index 0000000..3c55ac0
--- /dev/null
@@ -0,0 +1,13 @@
+import {ServiceResponseInterface} from "../../services/aaiService/responseInterfaces/getServicesResponseInterface";
+
+export class ProductFamily {
+  id: string;
+  name: string;
+  isPermitted: boolean;
+
+  constructor(serviceResponse: ServiceResponseInterface){
+    this.id = serviceResponse['service-id'];
+    this.name = serviceResponse["service-description"];
+    this.isPermitted = serviceResponse["is-permitted"];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/project.ts b/vid-webpack-master/src/app/shared/models/project.ts
new file mode 100644 (file)
index 0000000..db8929e
--- /dev/null
@@ -0,0 +1,14 @@
+interface ProjectResponseInterface {
+  id: string,
+  name: string
+}
+
+export class Project {
+  id: string;
+  name: string;
+
+  constructor(projectResponse: ProjectResponseInterface){
+    this.id = projectResponse.id;
+    this.name = projectResponse.name;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/selectOption.ts b/vid-webpack-master/src/app/shared/models/selectOption.ts
new file mode 100644 (file)
index 0000000..c12c1a8
--- /dev/null
@@ -0,0 +1,17 @@
+export interface SelectOptionInterface {
+  id: string,
+  name: string
+  isPermitted?: boolean
+}
+
+export class SelectOption {
+  id: string;
+  name: string;
+  isPermitted?: boolean;
+
+  constructor(option: SelectOptionInterface){
+    this.id = option.id;
+    this.name = option.name;
+    this.isPermitted = option.isPermitted;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/serviceInstance.ts b/vid-webpack-master/src/app/shared/models/serviceInstance.ts
new file mode 100644 (file)
index 0000000..a952430
--- /dev/null
@@ -0,0 +1,28 @@
+import {VnfInstance} from "./vnfInstance";
+
+export class ServiceInstance {
+  instanceName: string;
+  isUserProvidedNaming: boolean;
+  globalSubscriberId: string;
+  productFamilyId: string;
+  subscriptionServiceType: string;
+  lcpCloudRegionId: string;
+  tenantId: string;
+  tenantName: string;
+  aicZoneId: string;
+  aicZoneName: string;
+  projectName: string;
+  owningEntityId: string;
+  owningEntityName: string;
+  pause: boolean;
+  bulkSize: number;
+  vnfs: { [vnf_module_model_name: string] : VnfInstance; };
+  instanceParams: { [key: string] : string; };
+  rollbackOnFailure : boolean;
+  subscriberName : string;
+
+  constructor() {
+    this.vnfs = {};
+    this.instanceParams = {};
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/serviceModel.ts b/vid-webpack-master/src/app/shared/models/serviceModel.ts
new file mode 100644 (file)
index 0000000..18d8582
--- /dev/null
@@ -0,0 +1,44 @@
+import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
+import * as _ from "lodash";
+
+
+export interface ServiceModelResponseInterface extends NodeModelResponseInterface{
+
+  serviceType: string;
+  serviceRole: string;
+  serviceEcompNaming: boolean;
+}
+
+export class ServiceModel extends NodeModel{
+
+  serviceType: string;
+  serviceRole: string;
+  servicesQty: number;
+  isUserProvidedNaming: boolean;
+  isMultiStepDesign: boolean;
+
+  constructor(serviceModelJson?: any){
+    super(serviceModelJson.service);
+    if (serviceModelJson) {
+      const service: ServiceModelResponseInterface = serviceModelJson.service;
+      this.serviceType = service.serviceType;
+      this.serviceRole = service.serviceRole;
+      this.isUserProvidedNaming = this.getIsUserProvidedName(service);
+      this.isMultiStepDesign = this.getIsMultiStepDesign(serviceModelJson);
+    }
+  }
+
+  private getIsUserProvidedName(serviceJson): boolean {
+    return serviceJson.serviceEcompNaming !== undefined && serviceJson.serviceEcompNaming === "false";
+  };
+
+  private getIsMultiStepDesign(serviceModel): boolean {
+    for (let key in serviceModel.vnfs) {
+      const vnf = serviceModel.vnfs[key];
+      if (vnf.properties.multi_stage_design === "true") {
+        return true
+      }
+    }
+    return false;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/serviceNodeTypeToModelKeyMapper.ts b/vid-webpack-master/src/app/shared/models/serviceNodeTypeToModelKeyMapper.ts
new file mode 100644 (file)
index 0000000..1134bbb
--- /dev/null
@@ -0,0 +1,8 @@
+export enum ServiceNodeTypeToModelKeyMapper {
+  VF = "vnfs",
+  VFmodule="vfModules",
+  Network = "networks",
+  Configuration = "configurations"
+}
+
+
diff --git a/vid-webpack-master/src/app/shared/models/serviceType.ts b/vid-webpack-master/src/app/shared/models/serviceType.ts
new file mode 100644 (file)
index 0000000..67aacdc
--- /dev/null
@@ -0,0 +1,17 @@
+export interface SubscriptionResponseInterface {
+  'service-type': string
+  'is-permitted': boolean
+}
+
+export class ServiceType {
+  id: string;
+  name: string;
+  isPermitted: boolean;
+
+
+  constructor(id: string, subscription: SubscriptionResponseInterface){
+    this.id = id;
+    this.name = subscription['service-type'];
+    this.isPermitted = subscription['is-permitted'];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/subscriber.ts b/vid-webpack-master/src/app/shared/models/subscriber.ts
new file mode 100644 (file)
index 0000000..55fc837
--- /dev/null
@@ -0,0 +1,11 @@
+export class Subscriber {
+  id: string;
+  name: string;
+  isPermitted: boolean;
+
+  constructor(subscriberResponse){
+    this.id = subscriberResponse['global-customer-id'];
+    this.name = subscriberResponse['subscriber-name'];
+    this.isPermitted = subscriberResponse['is-permitted'];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/tenant.ts b/vid-webpack-master/src/app/shared/models/tenant.ts
new file mode 100644 (file)
index 0000000..234f1db
--- /dev/null
@@ -0,0 +1,11 @@
+export class Tenant {
+  id: string;
+  name: string;
+  isPermitted: boolean;
+
+  constructor(serviceJson){
+    this.id = serviceJson["tenantID"];
+    this.name = serviceJson["tenantName"];
+    this.isPermitted = serviceJson["is-permitted"];
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vfModule.ts b/vid-webpack-master/src/app/shared/models/vfModule.ts
new file mode 100644 (file)
index 0000000..21f43ed
--- /dev/null
@@ -0,0 +1,39 @@
+import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
+
+
+export interface properties{
+  initialCount: number;
+  maxCountInstances: number;
+  minCountInstances: number;
+}
+
+export interface VFModuleResponseInterface extends NodeModelResponseInterface {
+  customizationUuid: string;
+  modelCustomizationName: string;
+  properties: properties
+}
+
+export class VfModule extends NodeModel {
+
+  min:number;
+  max:number;
+  vgName:string;
+  rollbackOnFailure:boolean;
+  initial:number;
+  customizationUuid: string;
+  modelCustomizationName: string;
+
+  constructor(vf?: VFModuleResponseInterface) {
+    super(vf);
+    if(vf){
+      this.customizationUuid = vf.customizationUuid;
+      this.modelCustomizationName = vf.modelCustomizationName;
+    }
+    if (vf && vf.properties) {
+      this.min = vf.properties.minCountInstances;
+      this.max = vf.properties.maxCountInstances;
+      this.initial = vf.properties.initialCount;
+      this.rollbackOnFailure = true
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts b/vid-webpack-master/src/app/shared/models/vfModuleInstance.ts
new file mode 100644 (file)
index 0000000..c6db000
--- /dev/null
@@ -0,0 +1,5 @@
+export class VfModuleInstance {
+  instanceName: string;
+  volumeGroupName: string;
+  instanceParams: { [key: string] : string; };
+}
diff --git a/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts b/vid-webpack-master/src/app/shared/models/vfModuleTreeNode.ts
new file mode 100644 (file)
index 0000000..d4cc7e9
--- /dev/null
@@ -0,0 +1,17 @@
+import {VfModule} from "./vfModule";
+import {VfModuleInstance} from "./vfModuleInstance";
+import {ServiceNodeTypes} from "./ServiceNodeTypes";
+
+export class VfModuleTreeNode {
+  modelId: string;
+  name: string;
+  modelName: string;
+  type: string;
+
+  constructor(vfModuleInstance: VfModuleInstance, vfModuleModel: VfModule, vfModuleModelName: string){
+    this.name = vfModuleInstance.instanceName || vfModuleInstance.volumeGroupName || '<Automatically Assigned>';
+    this.modelId = vfModuleModel.uuid;
+    this.modelName = vfModuleModelName;
+    this.type = ServiceNodeTypes.VFmodule;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vfModulesMap.ts b/vid-webpack-master/src/app/shared/models/vfModulesMap.ts
new file mode 100644 (file)
index 0000000..95396fd
--- /dev/null
@@ -0,0 +1,5 @@
+import {VfModuleInstance} from "./vfModuleInstance";
+
+export class VfModuleMap {
+   [id: string] : VfModuleInstance;
+}
diff --git a/vid-webpack-master/src/app/shared/models/vfcInstanceGroup.ts b/vid-webpack-master/src/app/shared/models/vfcInstanceGroup.ts
new file mode 100644 (file)
index 0000000..64354b0
--- /dev/null
@@ -0,0 +1,14 @@
+import {VfcInstanceGroupProperties} from "./vfcInstanceGroupProperties";
+
+export class VfcInstanceGroup {
+  name: string;
+  version: string;
+  uuid: string;
+  invariantUuid: string;
+  vfcInstanceGroupProperties: VfcInstanceGroupProperties;
+
+
+}
+
+
+
diff --git a/vid-webpack-master/src/app/shared/models/vfcInstanceGroupMap.ts b/vid-webpack-master/src/app/shared/models/vfcInstanceGroupMap.ts
new file mode 100644 (file)
index 0000000..7ee3888
--- /dev/null
@@ -0,0 +1,5 @@
+import {VfcInstanceGroup} from "./vfcInstanceGroup";
+
+export class VfcInstanceGroupMap {
+  [id: string] : VfcInstanceGroup;
+}
diff --git a/vid-webpack-master/src/app/shared/models/vfcInstanceGroupProperties.ts b/vid-webpack-master/src/app/shared/models/vfcInstanceGroupProperties.ts
new file mode 100644 (file)
index 0000000..1a7bf71
--- /dev/null
@@ -0,0 +1,7 @@
+export class VfcInstanceGroupProperties {
+  networkCollectionFunction: string;
+  subinterfaceRole: string;
+  vfcInstanceGroupFunction: string;
+  vfcParentPortRole: string;
+
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfInstance.ts b/vid-webpack-master/src/app/shared/models/vnfInstance.ts
new file mode 100644 (file)
index 0000000..7f41e48
--- /dev/null
@@ -0,0 +1,19 @@
+import {VfModuleMap} from "./vfModulesMap";
+
+export class VnfInstance {
+  instanceName: string;
+  isUserProvidedNaming: boolean;
+  productFamilyId: string;
+  lcpCloudRegionId: string;
+  legacyRegion: string;
+  tenantId: string;
+  platformName: string;
+  lineOfBusiness: string;
+  rollbackOnFailure: string;
+  vfModules: { [vf_module_model_name: string] : VfModuleMap; };
+
+  constructor() {
+    this.rollbackOnFailure = 'true';
+    this.vfModules = {};
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfModel.ts b/vid-webpack-master/src/app/shared/models/vnfModel.ts
new file mode 100644 (file)
index 0000000..e1302f1
--- /dev/null
@@ -0,0 +1,52 @@
+import {NodeModel, NodeModelResponseInterface} from "./nodeModel";
+import {VfcInstanceGroupMap} from "./vfcInstanceGroupMap";
+
+
+export interface VnfProperties {
+  ecomp_generated_naming: string
+}
+
+export interface VNFModelResponseInterface extends NodeModelResponseInterface{
+
+  serviceType: string;
+  serviceRole: string;
+  subCategory: string;
+  customizationUuid: string;
+  serviceEcompNaming: boolean;
+  type: string;
+  modelCustomizationName: string;
+  properties: VnfProperties;
+  vfcInstanceGroups: VfcInstanceGroupMap;
+}
+
+export class VNFModel extends NodeModel{
+
+  serviceType: string;
+  serviceRole: string;
+  subCategory: string;
+  customizationUuid: string;
+  isUserProvidedNaming: boolean;
+  type: string;
+  modelCustomizationName: string;
+  vfcInstanceGroups: VfcInstanceGroupMap;
+
+  constructor(vnfJson?: VNFModelResponseInterface){
+    super(vnfJson);
+    if (vnfJson) {
+      this.serviceType = vnfJson.serviceType;
+      this.serviceRole = vnfJson.serviceRole;
+      this.subCategory = vnfJson.subCategory;
+      this.customizationUuid = vnfJson.customizationUuid;
+      this.isUserProvidedNaming = this.getIsUserProvidedName(vnfJson);
+      this.type = vnfJson.type;
+      this.modelCustomizationName = vnfJson.modelCustomizationName;
+      this.vfcInstanceGroups = vnfJson.vfcInstanceGroups;
+
+    }
+  }
+
+  private getIsUserProvidedName(vnfJson) {
+    const ecompGeneratedNaming = vnfJson.properties.ecomp_generated_naming;
+    return ecompGeneratedNaming !== undefined && ecompGeneratedNaming === "false";
+  };
+}
diff --git a/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts b/vid-webpack-master/src/app/shared/models/vnfTreeNode.ts
new file mode 100644 (file)
index 0000000..316bf3e
--- /dev/null
@@ -0,0 +1,18 @@
+import {VNFModel} from "./vnfModel";
+import {VnfInstance} from "./vnfInstance";
+import {VfModuleTreeNode} from "./vfModuleTreeNode";
+
+export class VnfTreeNode {
+  modelId: string;
+  name: string;
+  modelName: string;
+  type: string;
+  children: VfModuleTreeNode[];
+
+  constructor(instance: VnfInstance, vnfModel: VNFModel){
+    this.name = instance.instanceName || vnfModel['properties'].ecomp_generated_naming == 'false' ? vnfModel.modelCustomizationName : '<Automatically Assigned>';
+    this.modelId = vnfModel.uuid;
+    this.modelName = vnfModel.modelCustomizationName;
+    this.type = vnfModel.type;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.spec.ts
new file mode 100644 (file)
index 0000000..84d2ff4
--- /dev/null
@@ -0,0 +1,25 @@
+
+import {CapitalizeAndFormatPipe} from "./capitalize-and-format.pipe";
+
+describe('Capitalize And Format Pipe', () => {
+  let capitalizeAndFormatPipe: CapitalizeAndFormatPipe;
+
+  beforeEach(() => {
+    capitalizeAndFormatPipe = new CapitalizeAndFormatPipe();
+  });
+
+  it('Capitalize And Format Pipe should be defined', () => {
+    expect(capitalizeAndFormatPipe).toBeDefined();
+  });
+
+  it('Capitalize And Format Pipe :  (UPPERCASE)', ()=> {
+    let result: string = capitalizeAndFormatPipe.transform('PENDING');
+    expect(result).toEqual('Pending');
+  });
+
+  it('Capitalize And Format Pipe (UPPERCASE) and Underscore should replace by -', ()=> {
+    let result: string = capitalizeAndFormatPipe.transform('IN_PROGRESS');
+    expect(result).toEqual('In-progress');
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts b/vid-webpack-master/src/app/shared/pipes/capitalize/capitalize-and-format.pipe.ts
new file mode 100644 (file)
index 0000000..e3ec9ae
--- /dev/null
@@ -0,0 +1,12 @@
+import {PipeTransform, Pipe} from '@angular/core';
+
+@Pipe({ name: 'capitalizeAndFormat' })
+export class CapitalizeAndFormatPipe implements PipeTransform {
+  transform(text: string): string {
+    if (text) {
+      text = text.toLowerCase().replace('_', '-');
+      return text.charAt(0).toUpperCase() + text.slice(1);
+    }
+    return text;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/data-filter.pipe.ts
new file mode 100644 (file)
index 0000000..1ff8367
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * Created by cp2122 on 1/4/2018.
+ */
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({
+  name: 'dataFilter'
+})
+export class DataFilterPipe implements PipeTransform {
+  keys = [];
+  transform(items: any, args: string): any {
+    if (items != null && items.length > 0) {
+      let ans = [];
+
+      if (this.keys.length === 0) {
+        this.keys = Object.keys(items[0]);
+      }
+      for (let i of items) {
+        for (let k of this.keys) {
+          if (i[k] !== null && i[k].toString().match('^.*' + args + '.*$')) {
+            ans.push(i);
+            break;
+          }
+        }
+      }
+      return ans;
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.spec.ts
new file mode 100644 (file)
index 0000000..22b6192
--- /dev/null
@@ -0,0 +1,43 @@
+import { DynamicInputLabelPipe } from './dynamic-input-label.pipe';
+
+describe('Dynamic input label Pipe', () => {
+  let dynamicInputLabelPipe: DynamicInputLabelPipe;
+
+  beforeEach(() => {
+    dynamicInputLabelPipe = new DynamicInputLabelPipe();
+  });
+
+  it('Dynamic input label Pipe should be defined', () => {
+    expect(dynamicInputLabelPipe).toBeDefined();
+  });
+
+  it('Dynamic input label Pipe : Empty string should return empty string', ()=> {
+      let result: string = dynamicInputLabelPipe.transform('');
+      expect(result).toEqual(':*');
+  });
+
+  it('Dynamic input label Pipe: vnf should be VNF (UPPERCASE)', ()=> {
+    let result: string = dynamicInputLabelPipe.transform('vnf');
+    expect(result).toEqual('VNF:*');
+  });
+
+  it('Dynamic input label Pipe : nf should be NF (UPPERCASE)\'', ()=> {
+    let result: string = dynamicInputLabelPipe.transform('nf');
+    expect(result).toEqual('NF:*');
+  });
+
+  it('Dynamic input label Pipe : Underscore should replace by empty character', ()=> {
+    let result: string = dynamicInputLabelPipe.transform('nf_Test');
+    expect(result).toEqual('NF test:*');
+  });
+
+  it('Dynamic input label Pipe : Complex string', ()=> {
+    let result: string = dynamicInputLabelPipe.transform('nf_Test_vnf_nf');
+    expect(result).toEqual('NF test VNF NF:*');
+  });
+
+  it('Dynamic input label Pipe : First letter should be uppercase', ()=> {
+    let result: string = dynamicInputLabelPipe.transform('nfr');
+    expect(result).toEqual('Nfr:*');
+  });
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts b/vid-webpack-master/src/app/shared/pipes/dynamicInputLabel/dynamic-input-label.pipe.ts
new file mode 100644 (file)
index 0000000..bec87b4
--- /dev/null
@@ -0,0 +1,12 @@
+import {PipeTransform, Pipe} from '@angular/core';
+
+@Pipe({ name: 'dynamicInputLabel' })
+export class DynamicInputLabelPipe implements PipeTransform {
+  transform(text: string): string {
+    let split_label = text.toLowerCase().replace(/_/g,' ');
+    let uppercase_vnf = split_label.replace(/\bvnf\b/ig, 'VNF');
+    let uppercase_nf = uppercase_vnf.replace(/\bnf\b/ig, 'NF');
+    let capitalize_sentence = uppercase_nf.charAt(0).toUpperCase() + uppercase_nf.slice(1);
+    return capitalize_sentence + ':*';
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts b/vid-webpack-master/src/app/shared/pipes/highlight-filter.pipe.ts
new file mode 100644 (file)
index 0000000..93aecbf
--- /dev/null
@@ -0,0 +1,10 @@
+import {PipeTransform, Pipe} from '@angular/core';
+
+@Pipe({ name: 'highlight' })
+export class HighlightPipe implements PipeTransform {
+  transform(text: string, search: string): string {
+    let pattern = search.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
+    let regex = new RegExp(pattern, 'gi');
+    return search ? text.replace(regex, (match) => `<span class="highlight">${match}</span>`) : text;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.spec.ts
new file mode 100644 (file)
index 0000000..984e337
--- /dev/null
@@ -0,0 +1,58 @@
+import {ServiceInfoPipe} from "./serviceInfo.pipe";
+
+
+describe('Service info Pipe', () => {
+  let pipe: ServiceInfoPipe;
+
+  beforeEach(() => {
+    pipe = new ServiceInfoPipe();
+  });
+
+  it('Service info Pipe should return model name', () => {
+    let store = {
+      getState : function() {
+        return {
+          service: {
+            serviceHierarchy : generateserviceHierarchy()
+          }
+        }
+      }
+    };
+    let result : string = pipe.transform(null, store , '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 'name');
+    expect(result).toEqual('ComplexService')
+  });
+
+
+
+  it('Service info Pipe should return null if  field name not exist', () => {
+    let store = {
+      getState : function() {
+        return {
+          service: {
+            serviceHierarchy : generateserviceHierarchy()
+          }
+        }
+      }
+    };
+    let result : string = pipe.transform(null, store , '6e59c5de-f052-46fa-aa7e-2fca9d674c44', 'notExist');
+    expect(result).toBeNull();
+  });
+
+  it('Service info Pipe should return null if  model not exist', () => {
+    let store = {
+      getState : function() {
+        return {
+          service: {
+            serviceHierarchy : generateserviceHierarchy()
+          }
+        }
+      }
+    };
+    let result : string = pipe.transform(null, store , 'modelNotExist', 'name');
+    expect(result).toBeNull();
+  });
+
+  function generateserviceHierarchy(){
+    return JSON.parse('{"6e59c5de-f052-46fa-aa7e-2fca9d674c44":{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Mobility","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:80:37:0E:02:22","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:80:37:0E:0F:12","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:80:37:0E:09:12","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:80:37:0E:01:22","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"169.255.0.0","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:80:37:0E:0B:12","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:80:37:0E:0D:12","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"169.253.0.0","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:80:37:0E:02:12","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:80:37:0E:01:12","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:80:37:0E:09:12","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:80:37:0E:0D:12","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:80:37:0E:02:22","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:80:37:0E:0F:12","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:80:37:0E:01:22","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:80:37:0E:0B:12","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"169.255.0.3","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"169.253.0.3","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:80:37:0E:02:12","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:80:37:0E:01:12","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}}');
+  }
+});
diff --git a/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts b/vid-webpack-master/src/app/shared/pipes/serviceInfo/serviceInfo.pipe.ts
new file mode 100644 (file)
index 0000000..8cb2e1d
--- /dev/null
@@ -0,0 +1,13 @@
+import {PipeTransform, Pipe} from '@angular/core';
+import {isNullOrUndefined} from "util";
+
+@Pipe({ name: 'serviceInfo'})
+export class ServiceInfoPipe implements PipeTransform {
+  transform(service: string, store : any , modelId : string, fieldName : string): string {
+    const serviceHierarchy = store.getState().service.serviceHierarchy;
+    if(!isNullOrUndefined(serviceHierarchy) && !isNullOrUndefined(serviceHierarchy[modelId])){
+      return serviceHierarchy[modelId].service[fieldName] || null;
+    }
+    return null;
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.spec.ts
new file mode 100644 (file)
index 0000000..36f6349
--- /dev/null
@@ -0,0 +1,60 @@
+import {TestBed, inject, getTestBed} from '@angular/core/testing';
+
+import { HealthStatusService } from './health-status.service';
+import {Constants} from "../../utils/constants";
+import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing";
+import {ExternalComponentStatus} from "../../models/externalComponentStatus";
+
+describe('HealthStatusService', () => {
+
+  let injector;
+  let service: HealthStatusService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [HealthStatusService]
+    });
+
+    injector = getTestBed();
+    service = injector.get(HealthStatusService);
+    httpMock = injector.get(HttpTestingController);
+  });
+
+  describe('#getProbe', () =>{
+    it('when call probe, there is http GET with right url', () => {
+
+      service.getProbe().subscribe((result: Array<ExternalComponentStatus>)=>{
+        expect(result[0].component).toEqual("AAI");
+        expect(result[0].available).toBeTruthy();
+        expect(result[0].metadata).toEqual({ myKey: 'myValue' });
+
+        expect(result[1].component).toEqual("MSO");
+        expect(result[1].available).toBeFalsy();
+        expect(result[1].metadata).toEqual({otherKey: 123});
+      });
+
+      const req = httpMock.expectOne(Constants.Path.SERVICES_PROBE_PATH);
+      expect(req.request.method).toEqual('GET');
+      req.flush([
+        {
+          "component": "AAI",
+          "available": true,
+          "metadata": {
+            "myKey": "myValue"
+          }
+        },
+        {
+          "component": "MSO",
+          "available": false,
+          "metadata": {
+            "otherKey": 123
+          }
+        },
+      ]);
+    });
+
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts b/vid-webpack-master/src/app/shared/server/healthStatusService/health-status.service.ts
new file mode 100644 (file)
index 0000000..4305ab9
--- /dev/null
@@ -0,0 +1,17 @@
+import { Injectable } from '@angular/core';
+import {HttpClient} from "@angular/common/http";
+import {Observable} from "rxjs/Observable";
+import {Constants} from "../../utils/constants";
+import {ExternalComponentStatus} from "../../models/externalComponentStatus";
+
+@Injectable()
+export class HealthStatusService {
+
+  constructor(private _http: HttpClient) {
+  }
+
+  getProbe(): Observable<Array<ExternalComponentStatus>> {
+    let pathQuery = Constants.Path.SERVICES_PROBE_PATH;
+    return this._http.get<Array<ExternalComponentStatus>>(pathQuery).map(res => res);
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/AuditStatus.model.ts
new file mode 100644 (file)
index 0000000..0b4c70f
--- /dev/null
@@ -0,0 +1,10 @@
+export class AuditStatus{
+  id: number;
+  createdDate: number;
+  final: boolean;
+  jobId :string;
+  jobStatus :string;
+  source: string;
+  requestId: string;
+  additionalInfo :any
+}
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.model.ts
new file mode 100644 (file)
index 0000000..0b46959
--- /dev/null
@@ -0,0 +1,38 @@
+import {ServiceStatus} from '../../../instantiationStatus/instantiationStatus.component.service';
+
+export class ServiceInfoModel {
+  id: number;
+  created: Date;
+  modified: Date;
+  createdId: number;
+  modifiedId: number;
+  numRow: number;
+  uuid: string;
+  userId: string;
+  jobStatus: string;
+  pause: boolean;
+  owningEntityId: string;
+  owningEntityName: string;
+  project: string;
+  aicZoneId: string;
+  aicZoneName: string;
+  tenantId: string;
+  tenantName: string;
+  regionId: string;
+  regionName: string;
+  serviceType: string;
+  subscriberName: string;
+  serviceInstanceId: string;
+  serviceInstanceName: string;
+  serviceModelId: string;
+  serviceModelName: string;
+  serviceModelVersion: string;
+  templateId: string;
+  auditUserId: string;
+  jobId: string;
+}
+
+export class ServiceInfoUiModel extends ServiceInfoModel{
+  serviceStatus : ServiceStatus;
+  serviceIndex : number;
+}
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.spec.ts
new file mode 100644 (file)
index 0000000..78c1b5a
--- /dev/null
@@ -0,0 +1,235 @@
+import {getTestBed, TestBed} from '@angular/core/testing';
+import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
+import {ServiceInfoService} from './serviceInfo.service';
+import {ServiceInfoModel} from './serviceInfo.model';
+import {Constants} from "../../utils/constants";
+
+describe('Service Info Service', () => {
+  let injector;
+  let service: ServiceInfoService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [ServiceInfoService]
+    });
+
+    injector = getTestBed();
+    service = injector.get(ServiceInfoService);
+    httpMock = injector.get(HttpTestingController);
+  });
+
+  describe('#getServicesJobInfo', () => {
+    it('should return an Observable<ServiceInfoModel[]>', () => {
+      const dummyServiceInfo: ServiceInfoModel[] = generateServiceInfoData();
+
+      service.getServicesJobInfo(true).subscribe((serviceInfo:Array<ServiceInfoModel>) => {
+        expect(serviceInfo).toEqual(dummyServiceInfo);
+      });
+    });
+
+
+  });
+
+  describe('#deleteJob', () =>{
+    it('delete job', () => {
+      const jobId : string = "1111";
+
+      service.deleteJob(jobId).subscribe();
+
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/job/' + jobId);
+      expect(req.request.method).toEqual('DELETE');
+
+    });
+  });
+
+  describe('#hideJob', () =>{
+    it('when call hide job, there is http POST with right url', () => {
+      const jobId : string = "3";
+
+      service.hideJob(jobId).subscribe();
+
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + '/hide/' + jobId);
+      expect(req.request.method).toEqual('POST');
+    });
+  });
+
+  describe('#getJobAuditStatus', ()=> {
+    it('should return Observable<Object[]>', ()=>{
+      const jobId : string = '111';
+
+      service.getJobAuditStatus(jobId).subscribe();
+      const req = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=VID');
+      const req2 = httpMock.expectOne(Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=MSO');
+
+      expect(req.request.method).toEqual('GET');
+      expect(req2.request.method).toEqual('GET');
+    });
+  });
+
+  function generateServiceInfoData(){
+    return <ServiceInfoModel[]>JSON.parse(JSON.stringify(
+      [{
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "1",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "1",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "2",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "2",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "hidden": false
+      },
+      {
+        "created": 1519956533000,
+        "modified": 1521727738000,
+        "createdId": null,
+        "modifiedId": null,
+        "rowNum": null,
+        "auditUserId": null,
+        "auditTrail": null,
+        "jobId": "6748648484",
+        "userId": "2222",
+        "jobStatus": "FAILED",
+        "pause": false,
+        "owningEntityId": "1234",
+        "owningEntityName": null,
+        "project": null,
+        "aicZoneId": null,
+        "aicZoneName": null,
+        "tenantId": null,
+        "tenantName": null,
+        "regionId": null,
+        "regionName": null,
+        "serviceType": null,
+        "subscriberName": null,
+        "serviceInstanceId": "3",
+        "serviceInstanceName": null,
+        "serviceModelId": null,
+        "serviceModelName": null,
+        "serviceModelVersion": null,
+        "createdBulkDate": 1519956533000,
+        "statusModifiedDate": 1520042933000,
+        "hidden": false
+      }]
+    ));
+  }
+});
diff --git a/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts b/vid-webpack-master/src/app/shared/server/serviceInfo/serviceInfo.service.ts
new file mode 100644 (file)
index 0000000..e0057bb
--- /dev/null
@@ -0,0 +1,38 @@
+import {Injectable} from '@angular/core';
+import {Observable} from 'rxjs/Observable';
+import {ServiceInfoModel} from './serviceInfo.model';
+import {HttpClient} from '@angular/common/http';
+import 'rxjs/add/operator/map'
+import {Constants} from '../../utils/constants';
+import {forkJoin} from "rxjs/observable/forkJoin";
+
+@Injectable()
+export class ServiceInfoService {
+  constructor(private _http: HttpClient) {
+  }
+
+  getServicesJobInfo(filterByUser : boolean): Observable<ServiceInfoModel[]> {
+    let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH;
+    return this._http.get<ServiceInfoModel[]>(pathQuery).map(res => res );
+  }
+
+  deleteJob(jobId: string): Observable<any> {
+    let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/job/' + jobId;
+    return this._http.delete<any>(pathQuery).map(res => res);
+  }
+
+  hideJob(jobId: string): Observable<any> {
+    let pathQuery = Constants.Path.SERVICES_JOB_INFO_PATH + '/hide/' + jobId;
+    return this._http.post<any>(pathQuery, null).map(res => res);
+  }
+
+  getJobAuditStatus(jobId : string) : Observable<Object[]>{
+    let pathQueryVID = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=VID';
+    let pathQueryMSO = Constants.Path.SERVICES_JOB_INFO_PATH + Constants.Path.SERVICES_JOB_AUDIT_PATH + '/' + jobId + '?source=MSO';
+
+    let vidObs = this._http.get(pathQueryVID);
+    let msoObs = this._http.get(pathQueryMSO);
+    return forkJoin([vidObs, msoObs]);
+  }
+
+}
diff --git a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.spec.ts
new file mode 100644 (file)
index 0000000..617dbd3
--- /dev/null
@@ -0,0 +1,73 @@
+import { getTestBed, TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { NgRedux } from '@angular-redux/store';
+import { DefaultDataGeneratorService } from './default.data.generator.service';
+
+export class MockAppStore<T> {}
+
+describe('Default Data Generator Service', () => {
+  let injector;
+  let service: DefaultDataGeneratorService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [HttpClientTestingModule],
+      providers: [DefaultDataGeneratorService,
+        {provide: NgRedux, useClass: MockAppStore}]
+    });
+
+    injector = getTestBed();
+    service = injector.get(DefaultDataGeneratorService);
+    httpMock = injector.get(HttpTestingController);
+  });
+
+  it('generateVFModule should create vf module object', () => {
+    const serviceHierarchy = generateServiceHierarchy();
+    const vnfUUID: string = 'VF_vMee 0';
+    const vnfModuleUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+
+    let result = service.generateVFModule(serviceHierarchy, vnfUUID, vnfModuleUUID);
+
+    expect(result.modelInfo.modelType).toEqual('VFmodule');
+    expect(result.modelInfo.modelInvariantId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].invariantUuid);
+    expect(result.modelInfo.modelVersionId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].uuid);
+    expect(result.modelInfo.modelName).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].name);
+    expect(result.modelInfo.modelVersion).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].version);
+    expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].customizationUuid);
+    expect(result.modelInfo.modelCustomizationName).toEqual(serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].modelCustomizationName);
+    expect(result.sdncPreReload).toBeNull();
+  });
+
+  it('generateVNFData should create vnf object', () => {
+    const serviceHierarchy = generateServiceHierarchy();
+    const vnfName: string = 'VF_vMee 0';
+    const formValues = generateVNFFormValues();
+    const vfUUID: string = 'vf_vmee0..VfVmee..base_vmme..module-0';
+
+    let result = service.generateVNFData(serviceHierarchy, vnfName, vfUUID, formValues);
+
+    expect(result.productFamilyId).toEqual(formValues.productFamilyId);
+    expect(result.lcpCloudRegionId).toBeNull();
+    expect(result.tenantId).toBeNull();
+    expect(result.lineOfBusiness).toBeNull();
+    expect(result.platformName).toBeNull();
+    expect(result.modelInfo.modelType).toEqual('VF');
+    expect(result.modelInfo.modelInvariantId).toEqual(serviceHierarchy.vnfs[vnfName].invariantUuid);
+    expect(result.modelInfo.modelVersionId).toEqual(formValues.modelInfo.modelVersionId);
+    expect(result.modelInfo.modelName).toEqual(serviceHierarchy.vnfs[vnfName].name);
+    expect(result.modelInfo.modelVersion).toEqual(serviceHierarchy.vnfs[vnfName].version);
+    expect(result.modelInfo.modelCustomizationId).toEqual(serviceHierarchy.vnfs[vnfName].modelCustomizationId);
+    expect(result.modelInfo.modelCustomizationName).toEqual(serviceHierarchy.vnfs[vnfName].modelCustomizationName);
+  });
+});
+
+
+function generateServiceHierarchy() {
+  return JSON.parse('{"service":{"uuid":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","invariantUuid":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","name":"ComplexService","version":"1.0","toscaModelURL":null,"category":"Mobility","serviceType":"","serviceRole":"","description":"ComplexService","serviceEcompNaming":"true","instantiationType":"Macro","inputs":{}},"vnfs":{"VF_vMee 0":{"uuid":"d6557200-ecf2-4641-8094-5393ae3aae60","invariantUuid":"4160458e-f648-4b30-a176-43881ffffe9e","description":"VSP_vMee","name":"VF_vMee","version":"2.0","customizationUuid":"91415b44-753d-494c-926a-456a9172bbb9","inputs":{},"commands":{},"properties":{"gpb2_Internal2_mac":"00:80:37:0E:02:22","sctp-b-ipv6-egress_src_start_port":"0","sctp-a-ipv6-egress_rule_application":"any","Internal2_allow_transit":"true","sctp-b-IPv6_ethertype":"IPv6","sctp-a-egress_rule_application":"any","sctp-b-ingress_action":"pass","sctp-b-ingress_rule_protocol":"icmp","ncb2_Internal1_mac":"00:80:37:0E:0F:12","sctp-b-ipv6-ingress-src_start_port":"0.0","ncb1_Internal2_mac":"00:80:37:0E:09:12","fsb_volume_size_0":"320.0","sctp-b-egress_src_addresses":"local","sctp-a-ipv6-ingress_ethertype":"IPv4","sctp-a-ipv6-ingress-dst_start_port":"0","sctp-b-ipv6-ingress_rule_application":"any","domain_name":"default-domain","sctp-a-ingress_rule_protocol":"icmp","sctp-b-egress-src_start_port":"0.0","sctp-a-egress_src_addresses":"local","sctp-b-display_name":"epc-sctp-b-ipv4v6-sec-group","sctp-a-egress-src_start_port":"0.0","sctp-a-ingress_ethertype":"IPv4","sctp-b-ipv6-ingress-dst_end_port":"65535","sctp-b-dst_subnet_prefix_v6":"::","nf_naming":"{ecomp_generated_naming=true}","sctp-a-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-b-egress-dst_start_port":"0.0","ncb_flavor_name":"nv.c20r64d1","gpb1_Internal1_mac":"00:80:37:0E:01:22","sctp-b-egress_dst_subnet_prefix_len":"0.0","Internal2_net_cidr":"169.255.0.0","sctp-a-ingress-dst_start_port":"0.0","sctp-a-egress-dst_start_port":"0.0","fsb1_Internal2_mac":"00:80:37:0E:0B:12","sctp-a-egress_ethertype":"IPv4","vlc_st_service_mode":"in-network-nat","sctp-a-ipv6-egress_ethertype":"IPv4","sctp-a-egress-src_end_port":"65535.0","sctp-b-ipv6-egress_rule_application":"any","sctp-b-egress_action":"pass","sctp-a-ingress-src_subnet_prefix_len":"0.0","sctp-b-ipv6-ingress-src_end_port":"65535.0","sctp-b-name":"epc-sctp-b-ipv4v6-sec-group","fsb2_Internal1_mac":"00:80:37:0E:0D:12","sctp-a-ipv6-ingress-src_start_port":"0.0","sctp-b-ipv6-egress_ethertype":"IPv4","Internal1_net_cidr":"169.253.0.0","sctp-a-egress_dst_subnet_prefix":"0.0.0.0","fsb_flavor_name":"nv.c20r64d1","sctp_rule_protocol":"132","sctp-b-ipv6-ingress_src_subnet_prefix_len":"0","sctp-a-ipv6-ingress_rule_application":"any","ecomp_generated_naming":"true","sctp-a-IPv6_ethertype":"IPv6","vlc2_Internal1_mac":"00:80:37:0E:02:12","vlc_st_virtualization_type":"virtual-machine","sctp-b-ingress-dst_start_port":"0.0","sctp-b-ingress-dst_end_port":"65535.0","sctp-a-ipv6-ingress-src_end_port":"65535.0","sctp-a-display_name":"epc-sctp-a-ipv4v6-sec-group","sctp-b-ingress_rule_application":"any","int2_sec_group_name":"int2-sec-group","vlc_flavor_name":"nd.c16r64d1","sctp-b-ipv6-egress_src_addresses":"local","vlc_st_interface_type_int1":"other1","sctp-b-egress-src_end_port":"65535.0","sctp-a-ipv6-egress-dst_start_port":"0","vlc_st_interface_type_int2":"other2","sctp-a-ipv6-egress_rule_protocol":"any","Internal2_shared":"false","sctp-a-ipv6-egress_dst_subnet_prefix_len":"0","Internal2_rpf":"disable","vlc1_Internal1_mac":"00:80:37:0E:01:12","sctp-b-ipv6-egress_src_end_port":"65535","sctp-a-ipv6-egress_src_addresses":"local","sctp-a-ingress-dst_end_port":"65535.0","sctp-a-ipv6-egress_src_end_port":"65535","Internal1_forwarding_mode":"l2","Internal2_dhcp":"false","sctp-a-dst_subnet_prefix_v6":"::","pxe_image_name":"MME_PXE-Boot_16ACP04_GA.qcow2","vlc_st_interface_type_gtp":"other0","ncb1_Internal1_mac":"00:80:37:0E:09:12","sctp-b-src_subnet_prefix_v6":"::","sctp-a-egress_dst_subnet_prefix_len":"0.0","int1_sec_group_name":"int1-sec-group","Internal1_dhcp":"false","sctp-a-ipv6-egress_dst_end_port":"65535","Internal2_forwarding_mode":"l2","fsb2_Internal2_mac":"00:80:37:0E:0D:12","sctp-b-egress_dst_subnet_prefix":"0.0.0.0","Internal1_net_cidr_len":"17","gpb2_Internal1_mac":"00:80:37:0E:02:22","sctp-b-ingress-src_subnet_prefix_len":"0.0","sctp-a-ingress_dst_addresses":"local","sctp-a-egress_action":"pass","fsb_volume_type_0":"SF-Default-SSD","ncb2_Internal2_mac":"00:80:37:0E:0F:12","vlc_st_interface_type_sctp_a":"left","vlc_st_interface_type_sctp_b":"right","sctp-a-src_subnet_prefix_v6":"::","vlc_st_version":"2","sctp-b-egress_ethertype":"IPv4","sctp-a-ingress_rule_application":"any","gpb1_Internal2_mac":"00:80:37:0E:01:22","instance_ip_family_v6":"v6","sctp-a-ipv6-egress_src_start_port":"0","sctp-b-ingress-src_start_port":"0.0","sctp-b-ingress_dst_addresses":"local","fsb1_Internal1_mac":"00:80:37:0E:0B:12","vlc_st_interface_type_oam":"management","multi_stage_design":"false","oam_sec_group_name":"oam-sec-group","Internal2_net_gateway":"169.255.0.3","sctp-a-ipv6-ingress-dst_end_port":"65535","sctp-b-ipv6-egress-dst_start_port":"0","Internal1_net_gateway":"169.253.0.3","sctp-b-ipv6-egress_rule_protocol":"any","gtp_sec_group_name":"gtp-sec-group","sctp-a-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-egress_dst_subnet_prefix_len":"0","sctp-a-ipv6-ingress_dst_addresses":"local","sctp-a-egress_rule_protocol":"icmp","sctp-b-ipv6-egress_action":"pass","sctp-a-ipv6-egress_action":"pass","Internal1_shared":"false","sctp-b-ipv6-ingress_rule_protocol":"any","Internal2_net_cidr_len":"17","sctp-a-name":"epc-sctp-a-ipv4v6-sec-group","sctp-a-ingress-src_end_port":"65535.0","sctp-b-ipv6-ingress_src_subnet_prefix":"0.0.0.0","sctp-a-egress-dst_end_port":"65535.0","sctp-a-ingress_action":"pass","sctp-b-egress_rule_protocol":"icmp","sctp-b-ipv6-ingress_action":"pass","vlc_st_service_type":"firewall","sctp-b-ipv6-egress_dst_end_port":"65535","sctp-b-ipv6-ingress-dst_start_port":"0","vlc2_Internal2_mac":"00:80:37:0E:02:12","vlc_st_availability_zone":"true","fsb_volume_image_name_1":"MME_FSB2_16ACP04_GA.qcow2","sctp-b-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_src_subnet_prefix_len":"0","Internal1_allow_transit":"true","gpb_flavor_name":"nv.c20r64d1","availability_zone_max_count":"1","fsb_volume_image_name_0":"MME_FSB1_16ACP04_GA.qcow2","sctp-b-ipv6-ingress_dst_addresses":"local","sctp-b-ipv6-egress_dst_subnet_prefix":"0.0.0.0","sctp-b-ipv6-ingress_ethertype":"IPv4","vlc1_Internal2_mac":"00:80:37:0E:01:12","sctp-a-ingress-src_subnet_prefix":"0.0.0.0","sctp-a-ipv6-ingress_action":"pass","Internal1_rpf":"disable","sctp-b-ingress_ethertype":"IPv4","sctp-b-egress_rule_application":"any","sctp-b-ingress-src_end_port":"65535.0","sctp-a-ipv6-ingress_rule_protocol":"any","sctp-a-ingress-src_start_port":"0.0","sctp-b-egress-dst_end_port":"65535.0"},"type":"VF","modelCustomizationName":"VF_vMee 0","vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"vfcInstanceGroups":{}}},"networks":{"ExtVL 0":{"uuid":"ddc3f20c-08b5-40fd-af72-c6d14636b986","invariantUuid":"379f816b-a7aa-422f-be30-17114ff50b7c","description":"ECOMP generic virtual link (network) base type for all other service-level and global networks","name":"ExtVL","version":"37.0","customizationUuid":"94fdd893-4a36-4d70-b16a-ec29c54c184f","inputs":{},"commands":{},"properties":{"network_assignments":"{is_external_network=false, ipv4_subnet_default_assignment={min_subnets_count=1}, ecomp_generated_network_assignment=false, ipv6_subnet_default_assignment={min_subnets_count=1}}","exVL_naming":"{ecomp_generated_naming=true}","network_flows":"{is_network_policy=false, is_bound_to_vpn=false}","network_homing":"{ecomp_selected_instance_node_target=false}"},"type":"VL","modelCustomizationName":"ExtVL 0"}},"collectionResource":{},"configurations":{"Port Mirroring Configuration By Policy 0":{"uuid":"b4398538-e89d-4f13-b33d-ca323434ba50","invariantUuid":"6ef0ca40-f366-4897-951f-abd65d25f6f7","description":"A port mirroring configuration by policy object","name":"Port Mirroring Configuration By Policy","version":"27.0","customizationUuid":"3c3b7b8d-8669-4b3b-8664-61970041fad2","inputs":{},"commands":{},"properties":{},"type":"Configuration","modelCustomizationName":"Port Mirroring Configuration By Policy 0","sourceNodes":[],"collectorNodes":null,"configurationByPolicy":false}},"serviceProxies":{},"vfModules":{"vf_vmee0..VfVmee..vmme_vlc..module-1":{"uuid":"522159d5-d6e0-4c2a-aa44-5a542a12a830","invariantUuid":"98a7c88b-b577-476a-90e4-e25a5871e02b","customizationUuid":"55b1be94-671a-403e-a26c-667e9c47d091","description":null,"name":"VfVmee..vmme_vlc..module-1","version":"2","modelCustomizationName":"VfVmee..vmme_vlc..module-1","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_vlc"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..vmme_gpb..module-2":{"uuid":"41708296-e443-4c71-953f-d9a010f059e1","invariantUuid":"1cca90b8-3490-495e-87da-3f3e4c57d5b9","customizationUuid":"6add59e0-7fe1-4bc4-af48-f8812422ae7c","description":null,"name":"VfVmee..vmme_gpb..module-2","version":"2","modelCustomizationName":"VfVmee..vmme_gpb..module-2","properties":{"minCountInstances":0,"maxCountInstances":null,"initialCount":0,"vfModuleLabel":"vmme_gpb"},"inputs":{},"volumeGroupAllowed":false},"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{},"volumeGroupAllowed":true}},"volumeGroups":{"vf_vmee0..VfVmee..base_vmme..module-0":{"uuid":"a27f5cfc-7f12-4f99-af08-0af9c3885c87","invariantUuid":"a6f9e51a-2b35-416a-ae15-15e58d61f36d","customizationUuid":"f8c040f1-7e51-4a11-aca8-acf256cfd861","description":null,"name":"VfVmee..base_vmme..module-0","version":"2","modelCustomizationName":"VfVmee..base_vmme..module-0","properties":{"minCountInstances":1,"maxCountInstances":1,"initialCount":1,"vfModuleLabel":"base_vmme"},"inputs":{}}},"pnfs":{}}');
+}
+
+
+function generateVNFFormValues() {
+  return JSON.parse('{"globalSubscriberId":"e433710f-9217-458d-a79d-1c7aff376d89","productFamilyId":"vRRaaS","subscriptionServiceType":"VIRTUAL USP","lcpCloudRegionId":"mtn6","tenantId":"1178612d2b394be4834ad77f567c0af2","aicZoneId":"JAG1","projectName":"DFW","owningEntityId":"d61e6f2d-12fa-4cc2-91df-7c244011d6fc","rollbackOnFailure":"true","bulkSize":1,"instanceParams":[{}],"modelInfo":{"modelInvariantId":"e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0","modelVersionId":"6e59c5de-f052-46fa-aa7e-2fca9d674c44","modelName":"ComplexService","modelVersion":"1.0"},"isUserProvidedNaming":false,"tenantName":"AIN Web Tool-15-D-SSPtestcustome","aicZoneName":"YUDFJULP-JAG1"}');
+}
diff --git a/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts b/vid-webpack-master/src/app/shared/services/defaultDataServiceGenerator/default.data.generator.service.ts
new file mode 100644 (file)
index 0000000..b1e676f
--- /dev/null
@@ -0,0 +1,82 @@
+import { Injectable } from '@angular/core';
+import * as _ from 'lodash';
+import { createVFModuleInstance, updateVNFInstance } from '../../../service.actions';
+import { NgRedux } from '@angular-redux/store';
+import { AppState } from '../../../store/reducers';
+
+@Injectable()
+export class DefaultDataGeneratorService {
+  static controlsFieldsStatus = {};
+
+  constructor(private store: NgRedux<AppState>) { }
+
+  updateReduxOnFirstSet(serviceId: string, formServiceValues: any): void {
+    const serviceHierarchy = this.store.getState().service.serviceHierarchy[serviceId];
+    if (serviceHierarchy && !_.isEmpty(serviceHierarchy.vnfs)) {
+      for (let vnfUUID in serviceHierarchy.vnfs) {
+        for (let vnfModuleUUID in serviceHierarchy.vnfs[vnfUUID].vfModules) {
+          if (serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].properties.minCountInstances > 0) {
+
+            let vfModule = this.generateVFModule(serviceHierarchy, vnfUUID, vnfModuleUUID);
+            this.updateVNFInstanceRedux(
+              serviceHierarchy.vnfs[vnfUUID].modelName,
+              serviceId,
+              serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].properties.initialCount,
+              vfModule,
+              this.generateVNFData(serviceHierarchy, vnfUUID, vnfModuleUUID, formServiceValues),
+              vnfModuleUUID
+            );
+          }
+        }
+      }
+    }
+  }
+
+  updateVNFInstanceRedux(vnfModelName: string, serviceId: string, numberOfVfModules: number, vfModuleData: any, vnfData: any, vfModuleName : string): void {
+    if (numberOfVfModules > 0) {
+      this.store.dispatch(updateVNFInstance(vnfData, vnfData.modelInfo.modelCustomizationName, serviceId));
+      for (let i = 0; i < numberOfVfModules; i++) {
+        this.store.dispatch(createVFModuleInstance(vfModuleData, vfModuleName, serviceId));
+      }
+    }
+  }
+
+
+  generateVFModule(serviceHierarchy: any, vnfUUID: string, vnfModuleUUID: string) {
+    return {
+      'sdncPreReload': null,
+      'modelInfo': {
+        'modelType': 'VFmodule',
+        'modelInvariantId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].invariantUuid,
+        'modelVersionId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].uuid,
+        'modelName': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].name,
+        'modelVersion': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].version,
+        'modelCustomizationId': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].customizationUuid,
+        'modelCustomizationName': serviceHierarchy.vnfs[vnfUUID].vfModules[vnfModuleUUID].modelCustomizationName
+      },
+      'instanceParams': [
+        {}
+      ]
+    };
+  }
+
+  generateVNFData(serviceHierarchy: any, vnfName: string, vnfUUID: string, formValues: any) {
+    return {
+      'productFamilyId': formValues.productFamilyId,
+      'lcpCloudRegionId': null,
+      'tenantId': null,
+      'lineOfBusiness': null,
+      'platformName': null,
+      'modelInfo': {
+        'modelType': 'VF',
+        'modelInvariantId': serviceHierarchy.vnfs[vnfName].invariantUuid,
+        'modelVersionId': formValues.modelInfo.modelVersionId,
+        'modelName': serviceHierarchy.vnfs[vnfName].name,
+        'modelVersion': serviceHierarchy.vnfs[vnfName].version,
+        'modelCustomizationId': serviceHierarchy.vnfs[vnfName].modelCustomizationId,
+        'modelCustomizationName': serviceHierarchy.vnfs[vnfName].modelCustomizationName
+      },
+      'isUserProvidedNaming': null
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/shared.module.ts b/vid-webpack-master/src/app/shared/shared.module.ts
new file mode 100644 (file)
index 0000000..ab6ecaa
--- /dev/null
@@ -0,0 +1,92 @@
+import {NgModule, ModuleWithProviders} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {RouterModule} from '@angular/router';
+import { BrowserModule } from '@angular/platform-browser';
+import { HttpClientModule } from '@angular/common/http';
+import { ServiceInfoService } from './server/serviceInfo/serviceInfo.service';
+import { PopoverModule } from 'ngx-bootstrap';
+import { AngularSvgIconModule } from 'angular-svg-icon';
+import { SvgDirective } from './directives/svg/svg.directive';
+import { PopoverComponent } from './components/popover/popover.component';
+import { EllipsisComponent } from './components/ellipsis/ellipsis.component';
+import { MessageBoxComponent } from './components/messageBox/messageBox.component';
+import { MessageBoxService } from './components/messageBox/messageBox.service';
+import { SdcUiComponentsModule , SdcUiComponents} from 'sdc-ui/lib/angular';
+import { HttpInterceptorService } from './utils/httpInterceptor/httpInterceptor.service';
+import { FormControlErrorComponent } from './components/formControlError/formControlError.component';
+import { InputPreventionPatternDirective } from './directives/inputPrevention/inputPreventionPattern.directive';
+import { FormGeneralErrorsComponent } from './components/formGeneralErrors/formGeneralErrors.component';
+import { NumbersLettersUnderscoreValidator } from './components/validators/numbersLettersUnderscore/numbersLettersUnderscore.validator';
+import { SpinnerComponent } from './components/spinner/spinner.component';
+import { NoContentMessageAndIconComponent } from './components/no-content-message-and-icon/no-content-message-and-icon.component';
+import { ModelInformationComponent } from './components/model-information/model-information.component';
+import { TooltipModule } from 'ngx-tooltip';
+import {IframeService} from "./utils/iframe.service";
+import {CapitalizeAndFormatPipe} from "./pipes/capitalize/capitalize-and-format.pipe";
+import { DefaultDataGeneratorService } from './services/defaultDataServiceGenerator/default.data.generator.service';
+import {ServiceInfoPipe} from "./pipes/serviceInfo/serviceInfo.pipe";
+import {HealthStatusService} from "./server/healthStatusService/health-status.service";
+import {ConfigurationService} from "../services/configuration.service";
+import {FlagsResolve} from "../services/flags.resolve";
+
+
+@NgModule({
+  imports: [
+    BrowserModule,
+    HttpClientModule,
+    CommonModule,
+    RouterModule,
+    PopoverModule.forRoot(),
+    AngularSvgIconModule,
+    TooltipModule,
+    SdcUiComponentsModule,
+  ],
+  declarations: [
+    PopoverComponent,
+    SvgDirective,
+    EllipsisComponent,
+    MessageBoxComponent,
+    FormControlErrorComponent,
+    InputPreventionPatternDirective,
+    FormGeneralErrorsComponent,
+    SpinnerComponent,
+    NoContentMessageAndIconComponent,
+    ModelInformationComponent,
+    CapitalizeAndFormatPipe,
+    ServiceInfoPipe,
+  ],
+  exports: [
+    PopoverComponent,
+    SvgDirective,
+    EllipsisComponent,
+    MessageBoxComponent,
+    FormControlErrorComponent,
+    InputPreventionPatternDirective,
+    FormGeneralErrorsComponent,
+    SpinnerComponent,
+    NoContentMessageAndIconComponent,
+    ModelInformationComponent,
+    CapitalizeAndFormatPipe,
+    ServiceInfoPipe,
+  ],
+  providers: [
+    ServiceInfoService,
+    MessageBoxService,
+    SdcUiComponents.ModalService,
+    HttpInterceptorService,
+    IframeService,
+    NumbersLettersUnderscoreValidator,
+    DefaultDataGeneratorService,
+    HealthStatusService,
+    ConfigurationService,
+    FlagsResolve
+  ]
+})
+export class SharedModule {
+  static forRoot(): ModuleWithProviders {
+    return {
+      ngModule: SharedModule,
+      providers: [MessageBoxService]
+    };
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/utils/constants.ts b/vid-webpack-master/src/app/shared/utils/constants.ts
new file mode 100644 (file)
index 0000000..c78e12e
--- /dev/null
@@ -0,0 +1,287 @@
+export module Constants {
+
+  export class Component {
+    public static NAME = 'name';
+    public static SERVICE = 'service';
+    public static A_LA_CARTE = 'a la carte';
+    public static MACRO = 'Macro';
+    public static SUBSCRIBER_NAME = 'subscriberName';
+    public static OLDVERSION = 'oldversion';
+    public static SERVICE_TYPE = 'serviceType';
+  }
+
+  export class Path {
+    public static FORWARD_SLASH = '/';
+
+    public static AAI_GET_FULL_SUBSCRIBERS = '../../aai_get_full_subscribers';
+    public static AAI_REFRESH_FULL_SUBSCRIBERS = 'aai_refresh_full_subscribers';
+    public static AAI_GET_SUBSCRIBERS = '../../aai_get_subscribers';
+
+    public static AAI_GET_TENTANTS = '../../aai_get_tenants';
+    public static AAI_REFRESH_SUBSCRIBERS = 'aai_refresh_subscribers';
+    public static AAI_SUB_DETAILS = 'aai_sub_details';
+    public static AAI_SUB_VIEWEDIT = '../../aai_sub_viewedit';
+
+    public static GET_WORKFLOW = 'change-management/get_vnf_workflow_relation';
+    public static GET_MSO_WORKFLOWS = 'change-management/mso';
+    public static GET_SCHEDULER_CHANGE_MANAGEMENTS = 'change-management/scheduler';
+    public static CANCEL_SCHEDULE_REQUEST = 'change-management/scheduler/schedules';
+    public static ASSIGN = '?r=';
+    public static AAI_GET_SERVICE_INSTANCE_PATH = 'aai_get_service_instance/';
+    public static AAI_GET_SERVICES = '../../aai_get_services';
+    public static AAI_GET_AIC_ZONES = '../../aai_get_aic_zones';
+    public static AAI_GET_AIC_ZONE_FOR_PNF = 'aai_get_aic_zone_for_pnf/@globalCustomerId/@serviceType/@serviceInstanceId';
+    public static AAI_GET_SERVICES_BY_TYPE = 'aai_get_models_by_service_type';
+    public static AAI_GET_TENANTS = '../../aai_get_tenants/';
+    public static AAI_SUB_DETAILS_PATH = '../../aai_sub_details/';
+    public static AAI_GET_VERSION_BY_INVARIANT_ID = 'aai_get_version_by_invariant_id/';
+    public static SEARCH_SERVICE_INSTANCES = 'search_service_instances';
+    public static AAI_GET_VNF_DATA_PATH = 'aai_get_vnf_data/';
+    public static AAI_GET_VNF_BY_CUSTOMERID_AND_SERVICETYPE = 'get_vnf_data_by_globalid_and_service_type/';
+    public static AAI_GET_SERVICES_BY_OWNING_ENTITY_ID = 'aai_get_services_by_owning_entity_id';
+    public static AAI_GET_VNF_INFO = 'aai_get_vnf_information';
+    public static AAI_GET_PNF_INSTANCE = 'aai_get_service_instance_pnfs';
+    public static AAI_GET_VNF_INSTANCES_LIST = 'aai_get_vnf_instances';
+    public static AAI_GET_PNF_INSTANCES_LIST = 'aai_get_pnf_instances';
+    public static AAI_GET_BY_URI = 'aai_get_by_uri/';
+    public static AAI_GET_CONFIGURATION = 'aai_get_configuration/';
+    public static AAI_GET_TEST_ENVIRONMENTS = 'get_operational_environments?operationalEnvironmentType=';
+    public static GET_CATEGORY_PARAMETERS = '../../category_parameter';
+    public static PARAMETER_STANDARDIZATION_FAMILY = 'PARAMETER_STANDARDIZATION';
+    public static TENANT_ISOLATION_FAMILY = 'TENANT_ISOLATION';
+    public static ASDC_GETMODEL_PATH = 'asdc/getModel/';
+    public static CREATE_INSTANCE_PATH = '/models/services/createInstance';
+    public static AAI_GET_PNF_BY_NAME = 'aai_get_pnfs/pnf/';
+
+    public static GET_SYSTEM_PROP_VNF_PROV_STATUS_PATH = 'get_system_prop_vnf_prov_status';
+    public static GET_USER_ID = 'getuserID';
+    public static INSTANTIATE_ROOT_PATH = '#/instantiate?subscriberId=';
+    public static INSTANTIATE_PATH = '/instantiate';
+    public static INVALID_STRING = '/INVALID_STRING/';
+    public static INVALID_STRING_MSO_CREATE_SVC_INSTANCE = 'INVALID_STRING_mso_create_svc_instance';
+    public static MSO = 'mso';
+    public static MSO_CREATE_NW_INSTANCE = 'mso_create_nw_instance';
+    public static MSO_CREATE_NW_INSTANCE_PATH = 'mso_create_nw_instance/';
+    public static MSO_CREATE_SVC_INSTANCE = 'mso_create_svc_instance';
+    public static MSO_CREATE_VNF_INSTANCE = '../../mso/mso_create_vnf_instance/';
+    public static MSO_DELETE_SVC_INSTANCE_PATH = 'mso_delete_svc_instance/';
+    public static MSO_ACTIVATE_INSTANCE = 'mso/mso_activate_service_instance/@serviceInstanceId';
+    public static MSO_DEACTIVATE_INSTANCE = 'mso/mso_deactivate_service_instance/@serviceInstanceId';
+    public static MSO_CREATE_REALATIONSHIP = 'mso_add_relationship';
+    public static MSO_REMOVE_RELATIONSHIP = 'mso_remove_relationship';
+    public static SELECTED_SERVICE_SUB_PATH = '#/instances/subdetails?';
+    public static SELECTED_SERVICE_INSTANCE_SUB_PATH = 'serviceInstanceIdentifier=';
+    public static SELECTED_SUBSCRIBER_SUB_PATH = 'subscriberId=';
+    public static OWNING_ENTITY_SUB_PATH = 'owningEntity=';
+    public static PROJECT_SUB_PATH = 'project=';
+    public static SERVICE_TYPE_LIST_PATH = '#/instances/serviceTypes?serviceTypeList=';
+    public static SERVICE_MODLES_INSTANCES_SUBSCRIBERS_PATH = 'serviceModels.htm#/instances/subscribers';
+    public static SERVICES_DIST_STATUS_PATH = '../../rest/models/services?distributionStatus=';
+    public static SERVICES_PATH = '../../rest/models/services/';
+    public static SERVICETYPE_SUB_PATH = '&serviceType=';
+    public static SERVICEINSTANCEID_SUB_PATH = '&serviceInstanceId=';
+    public static SERVICEMODELS_INSTANCES_SERVICES_PATH = 'serviceModels.htm#/instances/services';
+    public static SERVICEMODELS_MODELS_SERVICES_PATH = 'serviceModels.htm#/models/services';
+    public static SUBDETAILS_SELECTEDSUBSCRIBER = '#subdetails?selectedSubscriber=';
+    public static SUBSCRIBERNAME_SUB_PATH = '&subscriberName=';
+    public static WELCOME_PATH = 'welcome.htm';
+    public static IS_PERMITTED_SUB_PATH = '&isPermitted=';
+    public static SERVICES_JOB_INFO_PATH = '../../asyncInstantiation';
+    public static CONFIGURATION_PATH = '../../get_property/{name}/defaultvalue';
+    public static SERVICES_JOB_AUDIT_PATH = '/auditStatus';
+    public static SERVICES_PROBE_PATH = "../../probe";
+    public static FEATURES_FLAG_PATH ="../../flags";
+
+    // Test Environment Urls =
+    public static OPERATIONAL_ENVIRONMENT_CREATE = 'operationalEnvironment/create';
+    public static OPERATIONAL_ENVIRONMENT_DEACTIVATE = 'operationalEnvironment/deactivate?operationalEnvironment=';
+    public static OPERATIONAL_ENVIRONMENT_ACTIVATE = 'operationalEnvironment/activate?operationalEnvironment=';
+    public static OPERATIONAL_ENVIRONMENT_STATUS = 'operationalEnvironment/requestStatus?requestId=';
+
+  }
+
+  export class Key {
+
+    public static DESCRIPTION = 'description';
+    public static GENERIC_VNF = 'generic-vnf';
+    public static GLOBAL_CUSTOMER_ID = 'global-customer-id';
+    public static GLOBAL_CUST_ID = 'globalCustomerId';
+    public static IN_MAINT = 'in-maint';
+    public static INVENTORY_RESPONSE_ITEMS = 'inventory-response-items';
+    public static INVENTORY_RESPONSE_ITEM = 'inventory-response-item';
+    public static L3_NETWORK = 'l3-network';
+    public static SUB_NET = 'subnet';
+    public static SUBNET_NAME = 'subnet-name';
+    public static SUBNET_ID = 'subnet-id';
+    public static GATEWAY_ADDRESS = 'gateway-address';
+    public static NETWORK_START_ADDRESS = 'network-start-address';
+    public static CIDR_MASK = 'cidr-mask';
+    public static MODEL_CUSTOMIZATION_ID = 'model-customization-id';
+    public static MODEL_INVAR_ID = 'model-invariant-id';
+    public static MODEL_VERSION_ID = 'model-version-id';
+    public static NETWORK_NAME = 'network-name';
+    public static NETWORK_ID = 'network-id';
+    public static NETWORK_TYPE = 'network-type';
+    public static NETWORKS = 'networks';
+    public static OPERATIONAL_STATUS = 'operational-status';
+    public static ORCHESTRATION_STATUS = 'orchestration-status';
+    public static PERCENT_PROGRESS = 'percent-progress';
+    public static PERSONA_MODEL_ID = 'persona-model-id';
+    public static PERSONA_MODEL_VERSION = 'persona-model-version';
+    public static PERSONA_MODEL_CUSTOMIZATION_ID = 'persona-model-customization-id';
+    public static PROV_STATUS = 'prov-status';
+
+    public static RESOURCE_LINK = 'resource-link';
+    public static RESULT_DATA = 'result-data';
+    public static SERVICE_DESCRIPTION = 'service-description';
+    public static SERVICE_ID = 'service-id';
+    public static SERVICE_INSTANCE = 'service-instance';
+    public static SERVICE_INSTANCES = 'service-instances';
+    public static SERVICE_INSTANCE_ID = 'service-instance-id';
+    public static SERVICE_INSTANCE_NAME = 'service-instance-name';
+    public static SERVICE_SUBSCRIPTION = 'service-subscription';
+    public static SERVICE_SUBSCRIPTIONS = 'service-subscriptions';
+    public static SERVICETYPE = 'service-type';
+    public static STATUS_MESSAGE = 'statusMessage';
+    public static SUBNAME = 'subscriber-name';
+    public static IS_PERMITTED = 'is-permitted';
+    public static TIMESTAMP = 'timestamp';
+    public static VF_MODULE = 'vf-module';
+    public static VF_MODULES = 'vfModules';
+    public static VF_MODULE_ID = 'vf-module-id';
+    public static VF_MODULE_NAME = 'vf-module-name';
+    public static VID = 'VID';
+    public static VNF_ID = 'vnf-id';
+    public static VNF_NAME = 'vnf-name';
+    public static VNF_TYPE = 'vnf-type';
+    public static VNFS = 'vnfs';
+    public static AVAILABLEVOLUMEGROUPS = 'availableVolumeGroups';
+    public static VOLUMEGROUPS = 'volumeGroups';
+    public static VOLUME_GROUP = 'volume-group';
+    public static VOLUME_GROUP_ID = 'volume-group-id';
+    public static VOLUME_GROUP_NAME = 'volume-group-name';
+    public static UPLOAD_SUPPLEMENTORY_DATA_FILE = 'uploadSupplementoryDataFile';
+    public static SUPPLEMENTORY_DATA_FILE = 'supplementoryDataFile';
+    public static ZONE_ID = 'zone-id';
+    public static ZONE_NAME = 'zone-name';
+    public static GENERIC_CONFIGURATION = 'configuration';
+    public static CONFIGURATIONS = 'configurations';
+    public static CONFIGURATION = 'configuration';
+    public static CONFIGURATION_NAME = 'configuration-name';
+    public static CONFIGURATION_TYPE = 'configuration-type';
+    public static CONFIGURATION_ID = 'configuration-id';
+    public static PORT = 'l-interface';
+    public static PORT_ID = 'interface-id';
+    public static PORT_NAME = 'interface-name';
+    public static PORT_MIRRORED = 'is-port-mirrored';
+  }
+
+  export class Status {
+    public static ALL = 'ALL';
+    public static COMPLETE = 'Complete';
+    public static DONE = 'Done';
+    public static ERROR = 'Error';
+    public static FAILED = 'Failed';
+    public static FAILED_SERVICE_MODELS_ASDC = 'Failed to get service models from SDC.';
+    public static FETCHING_SERVICE_TYPES = 'Fetching service types list from A&AI';
+    public static FETCHING_SERVICE_CATALOG = 'Fetching service catalog from AAI.  Please wait.';
+    public static FETCHING_SERVICE_CATALOG_ASDC = 'Fetching service catalog from SDC.  Please wait.';
+    public static FETCHING_SUB_DETAILS = 'Fetching subscriber details from A&AI for ';
+    public static FETCHING_SERVICE_INST_DATA = 'Fetching service instance data from A&AI for service-instance-id=';
+    public static FETCHING_SUBSCRIBER_LIST_AAI = 'Fetching subscriber list from A&AI...';
+    public static IN_PROGRESS = 'In Progress';
+    public static IS_SUCCESSFUL = ' isSuccessful = ';
+    public static MSO_FAILURE = 'msoFailure';
+    public static NONE = 'None';
+    public static NOT_FOUND = 'Not Found';
+    public static NO_SERVICE_SUBSCRIPTION_FOUND = 'No Service Subscription Found';
+    public static SUBMITTING_REQUEST = 'Submitting Request';
+    public static SUCCESS_VNF_PROV_STATUS = 'Successfully set the VNF\'s Prov_Status to ';
+    public static UNLOCKED = 'Unlocked';
+    public static AAI_ACTIVE = 'Active';
+    public static AAI_INACTIVE = 'Inactive';
+    public static AAI_CREATED = 'Created';
+    public static AAI_ENABLED = 'Enabled';
+    public static AAI_DISABLED = 'Disabled';
+  }
+
+  export class Error {
+    public static AAI = 'A&AI failure - see log below for details';
+    public static AAI_ERROR = 'A&AI Error';
+    public static AAI_FETCHING_CUST_DATA = 'Failed to fetch customer data from A&AI= Response Code= ';
+    public static FETCHING_SERVICE_TYPES = 'Failed to fetch service types from A&AI= Response Code= ';
+    public static FETCHING_SERVICES = 'Failed to fetch services from A&AI= Response Code= ';
+    public static FETCHING_SERVICE_INSTANCE_DATA = 'Failed to fetch service instance data from A&AI= Response Code= ';
+    public static INVALID_INSTANCE_NAME = 'Invalid instance name= ';
+    // tslint:disable-next-line:max-line-length
+    public static INSTANCE_NAME_VALIDATE = 'The instance name must contain only alphanumeric or \'_-.\' characters; and must start with an alphabetic character';
+    public static INVALID_LIST = 'Invalid list parameter= ';
+    public static INVALID_MAP = 'Invalid map parameter= ';
+    public static LIST_VALIDATE = 'A list parameter value must have the following syntax= \'[<value1>;\.\.\.;<valueN>]\'';
+    // tslint:disable-next-line:max-line-length
+    public static MAP_VALIDATE = 'A map parameter value must have the following syntax= \'{ <entry_key_1>= <entry_value_1>; \.\.\.; <entry_key_n>= <entry_value_n> }\'';
+    public static MAX_POLLS_EXCEEDED = 'Maximum number of poll attempts exceeded';
+    public static MISSING_DATA = 'Missing data';
+    public static MODEL_VERSION_ID_MISSING = 'Error= model-version-id is not populated in A&AI';
+    public static MSO = 'MSO failure - see log below for details';
+    public static NO_MATCHING_MODEL = 'No matching model found matching the persona Model Id = ';
+    public static NO_MATCHING_MODEL_AAI = 'No matching model found matching the A&AI model version ID = ';
+    public static SELECT = 'Please select a subscriber or enter a service instance';
+    public static SERVICE_INST_DNE = 'That service instance does not exist.  Please try again.';
+    public static SYSTEM_FAILURE = 'System failure';
+    public static INVALID_DATA_FORMAT = 'Invalid data format.Please check your file content whether it is not in json or not.';
+    public static MISSING_FILE = 'Please Select JSON File.';
+
+    public static MISSING_VNF_DETAILS = 'Missing required information.\n' +
+      'Please open and fill in the details.\n';
+  }
+
+  export class EventType {
+    public static COMPONENT_STATUS = 'ComponentStatus';
+    public static CREATE_COMPONENT = 'createComponent';
+    public static DELETE_RESUME_COMPONENT = 'deleteResumeComponent';
+  }
+
+  export class ServicePopup {
+    public static TITLE = 'Create a new service instance';
+    public static TOOLTIP_UUID = 'Unique identifier for this service in this version.';
+    public static TOOLTIP_INVARIANT_UUID = 'Unique identifier for this service cross versions.';
+
+  }
+
+  export class Parameter {
+    public static BOOLEAN = "boolean";
+    public static SELECT = "select";
+    public static MULTI_SELECT = "multi_select";
+    public static STRING = "string";
+    public static NUMBER = "number";
+    public static VALID_VALUES = "valid_values";
+    public static EQUAL = "equal";
+    public static LENGTH = "length";
+    public static MAX_LENGTH = "max_length";
+    public static MIN_LENGTH = "min_length";
+    public static IN_RANGE = "in_range";
+    public static CONSTRAINTS = "constraints";
+    public static OPERATOR = "operator";
+    public static CONSTRAINT_VALUES = "constraintValues";
+    public static DEFAULT = "default";
+    public static DESCRIPTION = "description";
+    public static TYPE = "type";
+    public static INTEGER = "integer";
+    public static RANGE = "range";
+    public static LIST = "list";
+    public static MAP = "map";
+    public static REQUIRED = "required";
+    public static GREATER_THAN = "greater_than";
+    public static LESS_THAN = "less_than";
+    public static GREATER_OR_EQUAL = "greater_or_equal";
+    public static LESS_OR_EQUAL = "less_or_equal";
+    public static DISPLAY_NAME = "displayName";
+    public static CHECKBOX ='checkbox';
+    public static FILE ='file';
+  }
+
+  export class AuditInfoModal{
+    public static TITLE = 'Service Instantiation Information';
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts b/vid-webpack-master/src/app/shared/utils/httpInterceptor/httpInterceptor.service.ts
new file mode 100644 (file)
index 0000000..be9ade0
--- /dev/null
@@ -0,0 +1,32 @@
+import { Injectable } from '@angular/core';
+import {
+  HttpInterceptor,
+  HttpRequest,
+  HttpHandler,
+  HttpEvent, HttpErrorResponse
+} from '@angular/common/http';
+
+import { Observable } from 'rxjs/Observable';
+import { ErrorMessage, ErrorService } from '../../components/error/error.component.service';
+import { SpinnerComponent } from '../../components/spinner/spinner.component';
+
+@Injectable()
+export class HttpInterceptorService implements HttpInterceptor {
+  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
+    SpinnerComponent.showSpinner.next(true);
+    return next.handle(request)
+      .catch((err: HttpErrorResponse) => {
+        if (err.status === 500) {
+          const errorMessage: ErrorMessage = new ErrorMessage('Server not available',
+            'It appears that one of the backend servers is not responding.\n Please try later.',
+            500);
+          ErrorService.showErrorWithMessage(errorMessage);
+          return Observable.of(null);
+        }
+        return Observable.throw(err);
+      }).finally(() => {
+        SpinnerComponent.showSpinner.next(false);
+      });
+  }
+}
+
diff --git a/vid-webpack-master/src/app/shared/utils/iframe.service.ts b/vid-webpack-master/src/app/shared/utils/iframe.service.ts
new file mode 100644 (file)
index 0000000..9a6636f
--- /dev/null
@@ -0,0 +1,19 @@
+import {Injectable} from "@angular/core";
+
+@Injectable()
+export class IframeService {
+
+  addClassOpenModal(elementClassName: string) {
+    var parentBodyElement = parent.document.getElementsByClassName(elementClassName)[0];
+    if (parentBodyElement)  {
+      parentBodyElement.classList.add("modal-open");
+    }
+  }
+
+  removeClassCloseModal(elementClassName: string) {
+    var parentBodyElement = parent.document.getElementsByClassName(elementClassName)[0];
+    if (parentBodyElement)  {
+      parentBodyElement.classList.remove("modal-open");
+    }
+  }
+}
diff --git a/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts b/vid-webpack-master/src/app/shared/utils/log/log.service.spec.ts
new file mode 100644 (file)
index 0000000..ea0eb04
--- /dev/null
@@ -0,0 +1,29 @@
+
+
+import {LogService} from "./log.service";
+
+describe('log service service', () => {
+  let logService : LogService;
+
+  beforeEach(() => {
+    logService = new LogService();
+  });
+
+
+  it('check all ILogger function are defined', ()=>{
+    expect(logService.log).toBeDefined();
+    expect(logService.assert).toBeDefined();
+    expect(logService.error).toBeDefined();
+    expect(logService.group).toBeDefined();
+    expect(logService.groupEnd).toBeDefined();
+    expect(logService.info).toBeDefined();
+    expect(logService.warn).toBeDefined();
+  });
+
+  it('test getPrefixLog function', ()=> {
+    let args = ['message', [1,2,3,4,5]];
+    let result  = LogService.getPrefixLog(args);
+    expect(result).toBeDefined();
+  });
+
+});
diff --git a/vid-webpack-master/src/app/shared/utils/log/log.service.ts b/vid-webpack-master/src/app/shared/utils/log/log.service.ts
new file mode 100644 (file)
index 0000000..422fe01
--- /dev/null
@@ -0,0 +1,58 @@
+import {isDevMode} from "@angular/core";
+declare var console: any;
+
+export interface ILogger {
+  assert(...args: any[]): void;
+  error(...args: any[]): void;
+  group(...args: any[]): void;
+  groupEnd(...args: any[]): void;
+  info(...args: any[]): void;
+  log(...args: any[]): void;
+  warn(...args: any[]): void;
+}
+
+export class LogService implements ILogger {
+
+  isProduction : boolean = !isDevMode();
+  public assert(...args: any[]): void {
+    console.assert(LogService.getPrefixLog(...args));
+  }
+
+  public error(...args: any[]): void {
+    console.error(LogService.getPrefixLog(...args));
+  }
+
+  public group(...args: any[]): void {
+    console.group(LogService.getPrefixLog(...args));
+  }
+
+  public groupEnd(...args: any[]): void {
+    console.groupEnd(LogService.getPrefixLog(...args));
+  }
+
+  public info(...args: any[]): void {
+    console.info(LogService.getPrefixLog(...args));
+  }
+
+  public log(...args: any[]): void {
+    if(!this.isProduction){
+      console.log(LogService.getPrefixLog(...args));
+    }
+  }
+
+  public warn(...args: any[]): void {
+    console.warn(LogService.getPrefixLog(...args));
+  }
+
+  static getPrefixLog(...args :any[]){
+    return {
+      time : new Date(),
+      message : args[0],
+      data : args.length > 0 ? args[1] : ''
+    };
+  }
+}
+
+
+
+
diff --git a/vid-webpack-master/src/app/store/epics.ts b/vid-webpack-master/src/app/store/epics.ts
new file mode 100644 (file)
index 0000000..f424e73
--- /dev/null
@@ -0,0 +1,13 @@
+import { Injectable } from '@angular/core';
+
+import {AAIEpics} from "../services/aaiService/aai.epics";
+
+@Injectable()
+export class RootEpics {
+  constructor(private aaiEpics: AAIEpics) {}
+
+  public createEpics() {
+    return this.aaiEpics.createEpic();
+    
+  }
+}
diff --git a/vid-webpack-master/src/app/store/module.ts b/vid-webpack-master/src/app/store/module.ts
new file mode 100644 (file)
index 0000000..c0909c1
--- /dev/null
@@ -0,0 +1,29 @@
+import { NgModule } from '@angular/core';
+import { NgReduxModule, NgRedux, DevToolsExtension } from '@angular-redux/store';
+import { RootEpics } from './epics';
+
+import rootReducer, {AppState} from "./reducers";
+import {AAIEpics} from "../services/aaiService/aai.epics";
+
+@NgModule({
+  imports: [NgReduxModule],
+  providers: [RootEpics, AAIEpics],
+})
+
+export class StoreModule {
+  constructor(
+    public store: NgRedux<AppState>,
+    devTools: DevToolsExtension,
+    rootEpics: RootEpics,
+  ) {
+
+    const persistedState = sessionStorage.getItem('reduxState') ?
+      JSON.parse(sessionStorage.getItem('reduxState')) : {};
+
+    store.configureStore(
+      rootReducer,
+      persistedState,
+      rootEpics.createEpics(),
+      devTools.isEnabled() ? [ devTools.enhancer() ] : []);
+    }
+}
diff --git a/vid-webpack-master/src/app/store/reducers.ts b/vid-webpack-master/src/app/store/reducers.ts
new file mode 100644 (file)
index 0000000..b3e4f47
--- /dev/null
@@ -0,0 +1,17 @@
+import {Reducer, combineReducers} from 'redux';
+import {GlobalReducer, GlobalState} from "../global.reducer";
+import {ServiceReducer, ServiceState} from "../service.reducer";
+
+
+export interface AppState {
+  global: GlobalState;
+  service: ServiceState;
+
+}
+
+const rootReducer: Reducer<AppState> = combineReducers<AppState>({
+  global: GlobalReducer,
+  service: ServiceReducer
+});
+
+export default rootReducer;
diff --git a/vid-webpack-master/src/app/utils/utils.ts b/vid-webpack-master/src/app/utils/utils.ts
new file mode 100644 (file)
index 0000000..dc4db3e
--- /dev/null
@@ -0,0 +1,271 @@
+import { Constants } from '../shared/utils/constants';
+import Parameter = Constants.Parameter;
+import * as _ from 'lodash'
+
+export class Utils {
+
+  public static clampNumber = (number, min, max) => {
+    return Math.max(min, Math.min(number, max));
+  };
+
+  public static hasContents(object: Object): boolean {
+    if (object === undefined || object === null || object === "") {
+      return false;
+    }
+    return true;
+  };
+
+  public static convertModel(serviceModel) {
+
+    let isNewFlow:boolean = false;
+
+    for (let networkCustomizationName in serviceModel.networks) {
+      let networkModel = serviceModel.networks[networkCustomizationName];
+      if ( networkModel.customizationUuid != null ) {
+        isNewFlow = true;
+        break;
+      }
+    }
+    if ( !isNewFlow ) {
+      for (let vnfCustomizationName in serviceModel.vnfs) {
+        let vnfModel = serviceModel.vnfs[vnfCustomizationName];
+        if ( vnfModel.customizationUuid != null ) {
+          isNewFlow = true;
+          break;
+        }
+      }
+    }
+    if ( isNewFlow ) {
+      return (Utils.convertNewModel (serviceModel) );
+    }
+    else {
+      return (Utils.convertOldModel (serviceModel) );
+    }
+  };
+
+  private static convertNewModel (serviceModel ) {
+    let completeResources = new Array();
+    let resource = {};
+    let convertedAsdcModel = {
+      "service": serviceModel.service,
+      "networks": {},
+      "vnfs": {},
+      "pnfs": serviceModel.pnfs,
+      "serviceProxies": serviceModel.serviceProxies,
+      "completeDisplayInputs": {},
+      "isNewFlow": true
+    };
+
+    for(let key in serviceModel.service.inputs) {
+      if(_.includes(["instance_node_target", "naming_policy", "vf_instance_name"], key)) {
+        delete convertedAsdcModel.service.inputs[key];
+      }
+    }
+
+    for (let networkCustomizationName in serviceModel.networks) {
+      let networkModel = serviceModel.networks[networkCustomizationName];
+
+      convertedAsdcModel.networks[networkModel.customizationUuid] = {
+        "uuid": networkModel.uuid,
+        "invariantUuid": networkModel.invariantUuid,
+        "version": networkModel.version,
+        "name": networkModel.name,
+        "modelCustomizationName": networkModel.modelCustomizationName,
+        "customizationUuid": networkModel.customizationUuid,
+        "inputs": "",
+        "description": networkModel.description,
+        "commands": {},
+        "displayInputs": {}
+      };
+
+      resource = {
+        "name": networkModel.modelCustomizationName,
+        "description": networkModel.description
+      };
+
+      completeResources.push (resource);
+
+    }
+
+    _.forEach(serviceModel.configurations, function(element) {
+      element.isConfig = true;
+    });
+    _.forEach(serviceModel.pnfs, function(element, key) {
+      element.isPnf= true;
+      element.modelCustomizationName= key;
+    });
+    let mergedVnfs = Object.assign(serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
+
+    for (let vnfCustomizationName in mergedVnfs) {
+      let vnfModel = mergedVnfs[vnfCustomizationName];
+      let vnfCustomizationUuid = vnfModel.customizationUuid;
+      convertedAsdcModel.vnfs[vnfModel.customizationUuid] = {
+        "uuid": vnfModel.uuid,
+        "invariantUuid": vnfModel.invariantUuid,
+        "version": vnfModel.version,
+        "name": vnfModel.name,
+        "modelCustomizationName": vnfModel.modelCustomizationName,
+        "customizationUuid": vnfModel.customizationUuid,
+        "inputs": "",
+        "description": vnfModel.description,
+        "vfModules": {},
+        "volumeGroups": {},
+        "commands": {},
+        "displayInputs": {},
+        "properties": {},
+        "nfRole": "",
+        "nfType": "",
+        "sourceNodes": vnfModel.sourceNodes,
+        "collectorNodes": vnfModel.collectorNodes,
+        "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,
+        "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,
+        "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false
+      };
+
+      resource = {
+        "name": vnfModel.modelCustomizationName,
+        "description": vnfModel.description
+      };
+      completeResources.push (resource);
+
+      if (vnfModel.commands != null) {
+        /*
+                 * commands: {
+                 *  internal_net_param_ntu: {
+                 *             command: get_input,
+                 *             displaName: internal_net_param_ntu,
+                 *             inputName: vccfd1_internal_net_param_ntu // pointer to input key
+                 * }
+                 * If the input name (ptr) is one of instance_node_target,  naming_policy or vf_instance_name
+                 * then ignore it
+                 *
+                 */
+
+        convertedAsdcModel.vnfs[vnfCustomizationUuid].properties=vnfModel.properties;
+        //
+        let vnf_type = "";
+        let vnf_role = "";
+        let vnf_function = "";
+        let vnf_code = "";
+        if ( !( _.isEmpty(vnfModel.properties) ) ) {
+          if (this.hasContents (vnfModel.properties.nf_type) ) {
+            vnf_type = vnfModel.properties.nf_type;
+          }
+          if (this.hasContents (vnfModel.properties.nf_role) ) {
+            vnf_role = vnfModel.properties.nf_role;
+          }
+          if (this.hasContents (vnfModel.properties.nf_function) ) {
+            vnf_function = vnfModel.properties.nf_function;
+          }
+          if (this.hasContents (vnfModel.properties.nf_naming_code) ) {
+            vnf_code = vnfModel.properties.nf_naming_code;
+          }
+        }
+        convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfType"] = vnf_type;
+        convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfRole"] = vnf_role;
+        convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfFunction"] = vnf_function;
+        convertedAsdcModel.vnfs[vnfCustomizationUuid]["nfCode"] = vnf_code;
+        //
+        for (let vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
+          let vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
+          convertedAsdcModel.vnfs[vnfCustomizationUuid].vfModules[vfModuleModel.customizationUuid] = vfModuleModel;
+        }
+
+        for (let volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
+          let volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
+          convertedAsdcModel.vnfs[vnfCustomizationUuid].volumeGroups[volumeGroupModel.customizationUuid] = volumeGroupModel;
+        }
+      }
+    }
+
+    return (convertedAsdcModel);
+  };
+
+  private static convertOldModel(serviceModel ) {
+    let resource = {};
+    let convertedAsdcModel = {
+      "service": serviceModel.service,
+      "networks": {},
+      "vnfs": {},
+      "pnfs": serviceModel.pnfs,
+      "serviceProxies": serviceModel.serviceProxies,
+      "completeDisplayInputs": {},
+      "isNewFlow": false
+    };
+    let completeResources = new Array();
+    for (let networkCustomizationName in serviceModel.networks) {
+      let networkModel = serviceModel.networks[networkCustomizationName];
+      convertedAsdcModel.networks[networkModel.invariantUuid] = {};
+      //convertedAsdcModel.networks[networkModel.invariantUuid][networkModel.version] = networkModel;
+      // need a network model to test this
+      convertedAsdcModel.networks[networkModel.uuid] = {
+        "uuid": networkModel.uuid,
+        "invariantUuid": networkModel.invariantUuid,
+        "version": networkModel.version,
+        "name": networkModel.name,
+        "modelCustomizationName": networkModel.modelCustomizationName,
+        "customizationUuid": networkModel.customizationUuid,
+        "inputs": "",
+        "description": networkModel.description,
+        "commands": {},
+        "displayInputs": {}
+      };
+      resource = {
+        "name": networkModel.modelCustomizationName,
+        "description": networkModel.description
+      };
+      completeResources.push (resource);
+    }
+
+    _.forEach(serviceModel.configurations, function(element) {
+      element.isConfig = true;
+    });
+    _.forEach(serviceModel.pnfs, function(element, key) {
+      element.isPnf= true;
+      element.modelCustomizationName= key;
+    });
+    let mergedVnfs = Object.assign(serviceModel.vnfs, serviceModel.configurations, serviceModel.pnfs);
+
+    for (let vnfCustomizationName in mergedVnfs) {
+      let vnfModel = mergedVnfs[vnfCustomizationName];
+      convertedAsdcModel.vnfs[vnfModel.uuid] = {
+        "uuid": vnfModel.uuid,
+        "invariantUuid": vnfModel.invariantUuid,
+        "version": vnfModel.version,
+        "name": vnfModel.name,
+        "modelCustomizationName": vnfModel.modelCustomizationName,
+        "customizationUuid": vnfModel.customizationUuid,
+        "inputs": "",
+        "description": vnfModel.description,
+        "vfModules": {},
+        "volumeGroups": {},
+        "commands": {},
+        "displayInputs": {},
+        "sourceNodes": vnfModel.sourceNodes,
+        "collectorNodes": vnfModel.collectorNodes,
+        "isConfigurationByPolicy": vnfModel.configurationByPolicy ? vnfModel.configurationByPolicy : false,
+        "isConfig": vnfModel.isConfig ? vnfModel.isConfig : false,
+        "isPnf": vnfModel.isPnf ? vnfModel.isPnf : false
+      };
+      resource = {
+        "name": vnfModel.modelCustomizationName,
+        "description": vnfModel.description
+      };
+      completeResources.push (resource);
+
+      for (let vfModuleCustomizationName in serviceModel.vnfs[vnfCustomizationName].vfModules) {
+        let vfModuleModel = serviceModel.vnfs[vnfCustomizationName].vfModules[vfModuleCustomizationName];
+        convertedAsdcModel.vnfs[vnfModel.uuid].vfModules[vfModuleModel.uuid] = vfModuleModel;
+      }
+
+      for (let volumeGroupCustomizationName in serviceModel.vnfs[vnfCustomizationName].volumeGroups) {
+        let volumeGroupModel = serviceModel.vnfs[vnfCustomizationName].volumeGroups[volumeGroupCustomizationName];
+        convertedAsdcModel.vnfs[vnfModel.uuid].volumeGroups[volumeGroupModel.uuid] = volumeGroupModel;
+      }
+    }
+
+    let completeDisplayInputs = {};
+
+    return (convertedAsdcModel);
+  };
+}
diff --git a/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.html b/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.html
new file mode 100644 (file)
index 0000000..fbb1694
--- /dev/null
@@ -0,0 +1,14 @@
+<div class="form-wrapper">
+  <form #form="ngForm">
+    <div class="network" *ngFor="let group of groups">
+      <label class="placeholder" [attr.data-tests-id]="'groupLabel'">{{getValueOfLabelInGroup(group,'Group Name')}}</label>
+      <select [(ngModel)]="groupSelection[getValueOfLabelInGroup(group,'Group Name')]" class="form-control input-text"
+              [attr.data-tests-id]="'groupTestId'"
+              id="{{getGroupName(group)}}" name="{{getGroupName(group)}}" required>
+        <option class="placeholder" [value]="undefined" disabled>Select Network</option>
+        <option *ngFor="let singleGroup of getNetworksByNetworkFunctionRole(group) | async"
+        [ngValue]="singleGroup">{{singleGroup["instance-group"]["instance-group-name"]}}</option>
+      </select>
+    </div>
+  </form>
+</div>
diff --git a/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.scss b/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.scss
new file mode 100644 (file)
index 0000000..aa45b34
--- /dev/null
@@ -0,0 +1,17 @@
+.form-wrapper{
+  width:640px;
+  padding-left: 50px;
+  padding-top: 50px;
+  .network{
+    padding-bottom: 30px;
+  }
+  .network {
+    select {
+      font-family: OpenSans-Italic;
+      font-size: 14px;
+      color: #959595 !important;
+    }
+  }
+}
+
+
diff --git a/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts b/vid-webpack-master/src/app/vlanTagging/network-selector/network-selector.component.ts
new file mode 100644 (file)
index 0000000..46a1769
--- /dev/null
@@ -0,0 +1,66 @@
+import {Component, Input, OnInit, ViewChild} from "@angular/core";
+import {NgRedux, select} from "@angular-redux/store";
+import {AppState} from "../../store/reducers";
+import {ModelInformationItem} from "../../shared/components/model-information/model-information.component";
+import {Observable} from "rxjs/Observable";
+import {NgForm} from "@angular/forms";
+import * as _ from 'lodash';
+
+@Component({
+  selector: "app-network-selector",
+  templateUrl: "./network-selector.component.html",
+  styleUrls: ["./network-selector.component.scss"]
+})
+export class NetworkSelectorComponent implements OnInit {
+  private localStore: NgRedux<AppState>;
+  networkSelection: any;
+  groupSelection :any;
+  @Input() groups: Array<string>;
+  @Input() cloudOwner : string;
+  @Input() cloudRegionId : string;
+  @select(['service', 'networkFunctions'])
+  readonly networkFunctions: Observable<any>;
+
+  @ViewChild('form') form: NgForm;
+
+  constructor(store: NgRedux<AppState>) {
+    this.localStore = store;
+    this.groupSelection = {};
+    console.log(store);
+  }
+
+  getValueOfLabelInGroup(group: any, label: string){
+    let item = _.find(group, {"label": label});
+    if (item) {
+      return item["values"][0];
+    }
+  }
+
+  getNetworksByNetworkFunctionRole(group: any): Observable<string[]> {
+    let filteredItem = this.getValueOfLabelInGroup(group,"Network Collection Function");
+    return this.networkFunctions.map(data => {
+      return (data && data[filteredItem]) || [];
+    });
+  }
+
+  getGroupName(group: ModelInformationItem[]) {
+    return this.getValueOfLabelInGroup(group,"Group Name");
+  }
+
+  /**
+   * [ncf=>aaiResonse]
+   * groups => groupsModel
+   */
+
+  ngOnInit() {
+    let store = this.localStore;
+    this.networkSelection = {};
+
+  }
+}
+
+
+//
+/*
+Info inside redux = {ncfNetworkMap }
+*/
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.html
new file mode 100644 (file)
index 0000000..f474f4b
--- /dev/null
@@ -0,0 +1,27 @@
+<div class="vlan-wrapper-config">
+  <div class="head">
+    <div class="title">Collection Resource Consumer VNF</div>
+    <div class="btn-wrapper">
+      <button class="cancel-btn grey" data-tests-id="cancelButton" (click)="cancel()">{{cancelButtonText}}</button>
+      <button class="next-btn blue" data-tests-id="nextButton" [disabled]="isNextButtonDisabled()" (click)="nextStep()">{{nextButtonText}}</button>
+    </div>
+  </div>
+  <span (serviceInstamce)="onServiceInstanceChange($event)"></span>
+  <div class="content-wrapper">
+    <div class="left-side">
+      <formasync [hidden]="currentStep === wizardSteps.two" [model]="model" class="form"></formasync>
+      <app-network-selector [hidden]="currentStep === wizardSteps.one" class="form-wrapper" [groups]="groups"></app-network-selector>
+    </div>
+
+    <div style="padding-left: 30px;padding-right: 30px" class="sidebar-right">
+      <div class="headline">META DATA</div>
+      <div class="seperator"></div>
+      <model-information [modelInformationItems]="modelInfoItems"></model-information>
+      <div class="headline">Collection Resource Consumer VNF</div>
+      <div *ngFor="let group of groups">
+        <div class="seperator"></div>
+        <model-information [modelInformationItems]="group"></model-information>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.scss b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.scss
new file mode 100644 (file)
index 0000000..af4a7e2
--- /dev/null
@@ -0,0 +1,168 @@
+$popupHeaderHeight: 59px;
+
+.vlan-wrapper-config * {
+  font-family: OpenSans-Regular, sans-serif;
+}
+
+.body-content-jsp {
+  margin-top: 35px;
+  margin-left: 201px;
+  margin-right: 0px;
+  background-color: white;
+}
+
+:host {
+  height: 100%;
+}
+.form-wrapper{
+  min-width: 75%;
+  overflow: auto;
+}
+button {
+  border-radius: 2px;
+  font-size: 14px;
+  line-height: 28px;
+  height: 30px;
+  &.blue {
+    border: #0091c8 1px solid;
+    background-color: #009fdb;
+    color: white;
+    &:hover {
+      background-color: #1ec2ff;
+      border-color: #0091c8;
+    }
+    &:active {
+      background-color: #0091c7;
+      border-color: #006186;
+    }
+    &[disabled] {
+      background-color: rgba(5, 104, 174, 0.3);
+      border-color: rgba(4, 113, 168, 0.3);
+    }
+  }
+  &.grey {
+    color: #009FDB;
+    background-color: #ffffff;
+    border: 1px solid #009FDB;
+    &:hover {
+      background-color: #f8f8f8;
+      border-color: #009fdb;
+    }
+    &:active {
+      background-color: #d8d8d8;
+      border-color: #5a5a5a;
+    }
+    &[disabled] {
+      background-color: #f8f8f8;
+      border-color: #d8d8d8;
+      color: #cdcdcd;
+    }
+  }
+  &.white {
+    border: #009fdb 1px solid;
+    background-color: white;
+    color: #009fdb;
+  }
+}
+
+.vlan-wrapper-config {
+  /*todo: remove. this a temporary fix for the sub-interface popup not showing as a page beside the sidebar. currently showing it in full screen.*/
+  /*it is necessary inside the iframe (and not just in the angularjs - old app) angular app because in Firefox the iframe content isn't effected by the iframe size */
+  width: 100vw;
+  height: 100vh;
+  position: fixed;
+  /********************/
+  .head {
+    line-height: $popupHeaderHeight;
+    height: $popupHeaderHeight;
+    display: flex;
+    background-color: #F8F8F8;
+    border-bottom: 1px solid #D8D8D8;
+    .title {
+      font-size: 18px;
+      margin-left: 56px;
+      color: #5A5A5A;
+    }
+    .btn-wrapper {
+      flex: 1;
+      text-align: right;
+      margin-right: 15px;
+      button {
+        width: 120px;
+        &.delete-btn {
+          margin-left: 13px;
+        }
+      }
+    }
+  }
+  .content-wrapper {
+    display: flex;
+    .form {
+      overflow-y: auto;
+    }
+    height: calc(100% - #{$popupHeaderHeight});
+    .form {
+      margin-top: 48px;
+
+    }
+    .content {
+      .form-wrapper {
+
+        margin: 0 auto;
+      }
+    }
+
+  }
+
+  span.error {
+    color: #cf2a2a;
+  }
+  .content-wrapper .content .form-wrapper .instance-field {
+    .ng-invalid-pattern {
+      border-color: #cf2a2a;
+      color: #cf2a2a;
+    }
+    margin-bottom: 25px;
+    label {
+      color: #191919;
+      font-size: 13px;
+    }
+    input,
+    select {
+      border-color: #D2D2D2;
+    }
+    &.lcpRegionText,
+    &.productFamily {
+      display: none;
+    }
+  }
+
+}
+
+.sidebar-right {
+  min-width: 25%;
+  background-color: #F8F8F8;
+  overflow-y: auto;
+  .headline {
+    font-family: OpenSans-Semibold;
+    font-size: 12px;
+     color: #009FDB;
+     padding-bottom: 6px;
+     padding-top: 20px
+  }
+  .seperator{
+    background: #D2D2D2;
+    height: 1px;
+    margin-bottom: 10px;
+  }
+}
+
+.left-side{
+  min-width: 75%;
+  overflow:auto;
+
+}
+
+.sidebar-right service-metadata .metadata-content {
+  padding-bottom: 20px;
+}
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.component.ts
new file mode 100644 (file)
index 0000000..f3f63e1
--- /dev/null
@@ -0,0 +1,203 @@
+import {formasync} from './../components/form-async/form-async.component';
+import {Component, OnInit, ViewChild} from "@angular/core";
+import {NetworkSelectorComponent} from "./network-selector/network-selector.component";
+import {NgRedux, select} from "@angular-redux/store";
+import {AppState} from "../store/reducers";
+import {ActivatedRoute} from "@angular/router";
+import {
+  loadServiceAccordingToUuid, loadAaiNetworkAccordingToNetworkCF,
+  loadUserId
+} from "../services/aaiService/aai.actions";
+import {createRequest} from "../factories/mso.factory";
+import {Observable} from "rxjs/Observable";
+import {VNFModel} from "../shared/models/vnfModel";
+import {VfcInstanceGroupProperties} from "../shared/models/vfcInstanceGroupProperties";
+import * as _ from "lodash";
+import {ModelInformationItem} from "../shared/components/model-information/model-information.component";
+
+enum WizardSteps {
+  one,
+  two
+}
+
+const buttonTextNext = "Next";
+const buttonTextBack = "Back";
+const buttonTextConfirm = "Confirm";
+const buttonTextCancel = "Cancel";
+
+@Component({
+  selector: "vlan-tagging",
+  templateUrl: "./vlan-tagging.component.html",
+  styleUrls: ["./vlan-tagging.component.scss"]
+})
+
+export class VlanTaggingComponent implements OnInit {
+  constructor(private store: NgRedux<AppState>,
+              private route: ActivatedRoute) {
+    this.nextButtonText = buttonTextNext;
+    this.cancelButtonText = buttonTextCancel;
+    this.currentStep = WizardSteps.one;
+  }
+
+  subscriberName: string;
+  serviceKey: string;
+  serviceType: string;
+  vnfKey: string;
+  serviceInstanceName: string;
+  serviceModelId: string;
+  modelInfoItems: Array<ModelInformationItem>;
+  groups: Array<Array<ModelInformationItem>>;
+  currentStep: WizardSteps;
+  nextButtonText: string;
+  cancelButtonText: string;
+  wizardSteps = WizardSteps;
+  cloudOwner: string;
+  cloudRegionId: string;
+  serviceInstanceId : string;
+  model: VNFModel;
+  userId: string;
+  modelCustomizationId : string;
+  onServiceInstanceChange(event) {
+    console.log(event);
+  }
+
+  private serviceHirarchy: any;
+
+  @select(['service', 'serviceHierarchy'])
+  readonly serviceHierarchyObserable: Observable<any>;
+
+  @select(['service', 'userId'])
+  readonly userIdObs: Observable<any>;
+
+
+  @ViewChild(NetworkSelectorComponent)
+  public networkSelectorComponent: NetworkSelectorComponent;
+  @ViewChild(formasync)
+  public formAsync: formasync;
+
+
+  deploySubInterface() {
+
+    const requestDetails = createRequest(
+      this.userId,
+      this.formAsync.serviceInstance,
+      this.serviceHirarchy[this.serviceModelId],
+      this.serviceKey,
+      this.networkSelectorComponent.groupSelection,
+      this.vnfKey,
+      this.modelCustomizationId
+    );
+
+    // this.msoService.createVnf(requestDetails, this.serviceKey).subscribe();
+
+    window.parent.postMessage({
+      eventId: 'submitIframe',
+      data: requestDetails
+    }, "*");
+  }
+
+  ngOnInit() {
+    this.cloudRegionId = "";
+    this.store.dispatch(loadUserId());
+    this.userIdObs.subscribe(res => this.userId = res);
+    this.route.queryParams.subscribe(params => {
+      this.serviceModelId = params["serviceModelId"];
+      this.subscriberName = params["subscriberName"];
+      this.serviceType = params["serviceType"];
+      this.serviceKey = params["serviceInstanceID"];
+      this.vnfKey = params["modelCustomizationName"];
+      this.serviceInstanceId = params["serviceInstanceID"];
+      this.serviceInstanceName = params["serviceInstanceName"];
+      this.modelCustomizationId = params["modelCustomizationId"];
+      this.cloudOwner = params["globalCustomerId"];
+      this.store.dispatch(loadServiceAccordingToUuid(this.serviceModelId));
+      this.serviceHierarchyObserable.subscribe(data => {
+        this.serviceHirarchy = data;
+        if (data && data[this.serviceModelId]) {
+          this.model = new VNFModel(data[this.serviceModelId].vnfs[this.vnfKey]);
+          this.updateModelInfo(this.model);
+        }
+      });
+    });
+  }
+
+  private updateModelInfo(vnfModel: VNFModel) {
+    this.modelInfoItems = [
+      new ModelInformationItem("Service Instance Name", "serviceInstanceName", [this.serviceInstanceName], "", true),
+      new ModelInformationItem("Model Invariant UUID", "modelInvariantUUID", [vnfModel.invariantUuid], "", true),
+      new ModelInformationItem("Model Version", "modelVersion", [vnfModel.version], "", true),
+      new ModelInformationItem("Model UUID", "modelUuid", [vnfModel.uuid], "", true),
+      new ModelInformationItem("Model Customization UUID", "modelCustomizationUuid", [vnfModel.customizationUuid], "", true),
+    ];
+
+    this.groups = [];
+    _.forOwn(vnfModel.vfcInstanceGroups, (vfcInstanceGroup, key) => {
+      const properties: VfcInstanceGroupProperties = vfcInstanceGroup.vfcInstanceGroupProperties;
+      this.groups.push(this.createGroupsInformation(vfcInstanceGroup.name, properties));
+    });
+  }
+
+  nextStep() {
+    switch (this.currentStep) {
+      case WizardSteps.one:
+        this.groups.map(group => {
+          let networkName = _.find(group, (groupElements: ModelInformationItem) => groupElements.testsId === "networkCollectionFunction");
+          this.store.dispatch(
+            loadAaiNetworkAccordingToNetworkCF(networkName["values"][0], this.cloudOwner, this.formAsync.serviceInstance.lcpRegion)
+          );
+        });
+        this.currentStep = WizardSteps.two;
+        this.updateNavigationButtonText(this.currentStep);
+        break;
+      case WizardSteps.two:
+        this.deploySubInterface();
+        break;
+    }
+  }
+
+  cancel() {
+    switch (this.currentStep) {
+      case WizardSteps.one:
+        window.parent.postMessage({
+          eventId: 'closeIframe'
+        }, "*");
+        break;
+      case WizardSteps.two:
+        this.currentStep = WizardSteps.one;
+        this.updateNavigationButtonText(this.currentStep);
+        break;
+    }
+  }
+
+  updateNavigationButtonText(step: WizardSteps) {
+    switch (step) {
+      case WizardSteps.one:
+        this.nextButtonText = buttonTextNext;
+        this.cancelButtonText = buttonTextCancel;
+        break;
+      case WizardSteps.two:
+        this.nextButtonText = buttonTextConfirm;
+        this.cancelButtonText = buttonTextBack;
+        break;
+    }
+  }
+
+  isNextButtonDisabled() {
+    switch (this.currentStep) {
+      case WizardSteps.one:
+        return !this.formAsync.form.valid;
+      case WizardSteps.two:
+        return !this.networkSelectorComponent.form.valid;
+    }
+  }
+
+  createGroupsInformation(name: string, properties: VfcInstanceGroupProperties): Array<ModelInformationItem> {
+    let modelInfoItems = [];
+    modelInfoItems.push(new ModelInformationItem("Group Name", "groupName", [name], "", true));
+    modelInfoItems.push(new ModelInformationItem("Network Collection Function", "networkCollectionFunction", [properties.networkCollectionFunction], "", true));
+    modelInfoItems.push(new ModelInformationItem("VFC Instance Group Function", "instanceGroupFunction", [properties.vfcInstanceGroupFunction], "", true));
+    modelInfoItems.push(new ModelInformationItem("Parent Port Role", "parentPortRole", [properties.vfcParentPortRole], "", true));
+    modelInfoItems.push(new ModelInformationItem("Sub Interface Role", "subInterfaceRole", [properties.subinterfaceRole], "", true));
+    return modelInfoItems;
+  }
+}
diff --git a/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts b/vid-webpack-master/src/app/vlanTagging/vlan-tagging.module.ts
new file mode 100644 (file)
index 0000000..3227542
--- /dev/null
@@ -0,0 +1,33 @@
+
+import { formasync } from './../components/form-async/form-async.component';
+import {NgModule,} from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { VlanTaggingComponent } from './vlan-tagging.component';
+import {CommonModule} from '@angular/common';
+import { BrowserModule } from '@angular/platform-browser';
+import { NgReduxModule } from '@angular-redux/store';
+import { SharedModule } from '../shared/shared.module';
+import { NetworkSelectorComponent } from './network-selector/network-selector.component';
+import { TooltipModule } from 'ngx-tooltip';
+
+
+
+@NgModule({
+
+imports: [
+    CommonModule,
+    NgReduxModule,
+    FormsModule,
+    BrowserModule,
+    TooltipModule,
+    SharedModule.forRoot()
+
+  ],
+  providers: [  ],
+  declarations: [VlanTaggingComponent,formasync,NetworkSelectorComponent],
+  entryComponents: [],
+  exports: [formasync]
+
+})
+
+export class VlanTaggingModule { }
diff --git a/vid-webpack-master/src/assets/.gitkeep b/vid-webpack-master/src/assets/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/Apache License.txt b/vid-webpack-master/src/assets/fonts/OpenSans/Apache License.txt
new file mode 100644 (file)
index 0000000..989e2c5
--- /dev/null
@@ -0,0 +1,201 @@
+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 [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this 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/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Bold.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Bold.ttf
new file mode 100644 (file)
index 0000000..fd79d43
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Bold.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-BoldItalic.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-BoldItalic.ttf
new file mode 100644 (file)
index 0000000..9bc8009
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-BoldItalic.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBold.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBold.ttf
new file mode 100644 (file)
index 0000000..21f6f84
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBold.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf
new file mode 100644 (file)
index 0000000..31cb688
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Italic.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Italic.ttf
new file mode 100644 (file)
index 0000000..c90da48
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Italic.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Light.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Light.ttf
new file mode 100644 (file)
index 0000000..0d38189
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Light.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-LightItalic.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-LightItalic.ttf
new file mode 100644 (file)
index 0000000..68299c4
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-LightItalic.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Regular.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Regular.ttf
new file mode 100644 (file)
index 0000000..db43334
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Regular.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Semibold.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Semibold.ttf
new file mode 100644 (file)
index 0000000..1a7679e
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-Semibold.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-SemiboldItalic.ttf b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-SemiboldItalic.ttf
new file mode 100644 (file)
index 0000000..59b6d16
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/OpenSans/OpenSans-SemiboldItalic.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/icomoon.eot b/vid-webpack-master/src/assets/fonts/icomoon.eot
new file mode 100644 (file)
index 0000000..a568b91
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/icomoon.eot differ
diff --git a/vid-webpack-master/src/assets/fonts/icomoon.svg b/vid-webpack-master/src/assets/fonts/icomoon.svg
new file mode 100644 (file)
index 0000000..44c81d7
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe900;" glyph-name="add" d="M810.667 490.667h-256v256c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-256h-256c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h256v-256c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v256h256c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe901;" glyph-name="add_f" d="M512 917.333c260.267 0 469.333-209.067 469.333-469.333s-209.067-469.333-469.333-469.333c-260.267 0-469.333 209.067-469.333 469.333s209.067 469.333 469.333 469.333zM682.667 490.667h-128v128c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-128h-128c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h128v-128c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v128h128c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe902;" glyph-name="add_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM682.667 490.667h-128v128c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-128h-128c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h128v-128c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v128h128c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe903;" glyph-name="alert_f" d="M997.611 209.079c12.843-17.067 17.067-42.667 21.333-64 0-34.176-12.8-64-38.4-89.6-21.333-25.6-55.424-38.4-89.6-38.4h-725.333c-21.333 0-42.667 4.267-59.733 17.067-59.733 34.091-81.067 115.2-46.933 174.933l358.4 610.133c8.533 17.024 25.6 34.133 42.667 42.667 29.867 17.024 64 21.333 98.133 12.8s64-29.867 81.067-59.776l358.4-605.824zM512 618.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.133 264.533c-8.533-8.491-12.8-17.024-12.8-29.824 0-12.843 4.267-21.333 12.8-29.867 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.533 8.533 12.8 21.333 12.8 29.867 0 8.491-4.267 21.333-12.8 29.824-17.067 17.067-42.667 17.067-59.733 0z" />
+<glyph unicode="&#xe904;" glyph-name="alert_o" d="M920.811 115.213c-8.533-8.533-21.333-12.8-29.867-12.8h-725.333c-8.533 0-12.8 0-21.333 4.267-21.333 12.8-25.6 38.4-17.067 59.733l362.667 601.6c4.267 4.224 8.533 12.8 12.8 12.8 21.333 12.757 46.933 4.267 59.733-12.8l362.709-601.6c4.224-4.267 4.224-12.843 4.224-21.333 4.267-12.843-4.224-21.333-8.533-29.867zM997.611 209.079l-358.4 605.824c-17.067 29.909-46.933 51.243-81.067 59.776s-68.267 4.224-98.133-12.8c-17.067-8.533-34.133-25.643-42.667-42.667l-358.4-610.133c-34.133-59.733-12.8-140.843 46.933-174.933 17.067-12.8 38.4-17.067 59.733-17.067h725.333c34.176 0 68.267 12.8 89.6 38.4 25.6 25.6 38.4 55.424 38.4 89.6-4.267 21.333-8.491 46.933-21.333 64zM512 618.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.133 264.533c-8.533-8.491-12.8-17.024-12.8-29.824 0-12.843 4.267-21.333 12.8-29.867 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.533 8.533 12.8 21.333 12.8 29.867 0 8.491-4.267 21.333-12.8 29.824-17.067 17.067-42.667 17.067-59.733 0z" />
+<glyph unicode="&#xe905;" glyph-name="API" d="M853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128zM798.165 478.165l-170.667 170.667c-16.683 16.683-43.648 16.683-60.331 0s-16.683-43.648 0-60.331l140.501-140.501-140.501-140.501c-16.683-16.683-16.683-43.648 0-60.331 8.32-8.32 19.243-12.501 30.165-12.501s21.845 4.181 30.165 12.501l170.667 170.667c16.683 16.683 16.683 43.648 0 60.331zM225.835 478.165l170.667 170.667c16.683 16.683 43.648 16.683 60.331 0s16.683-43.648 0-60.331l-140.501-140.501 140.501-140.501c16.683-16.683 16.683-43.648 0-60.331-8.32-8.32-19.243-12.501-30.165-12.501s-21.845 4.181-30.165 12.501l-170.667 170.667c-16.683 16.683-16.683 43.648 0 60.331z" />
+<glyph unicode="&#xe906;" glyph-name="arrow-left" d="M183.467 477.899c-4.267-4.309-8.533-8.533-8.533-12.8-4.267-4.267-4.267-12.843-4.267-17.067 0-4.267 0-12.8 4.267-17.109 4.267-4.224 4.267-8.491 8.533-12.757l170.667-170.667c17.067-17.067 42.667-17.067 59.733 0s17.067 42.667 0 59.733l-98.091 98.133h494.891c25.6 0 42.667 17.067 42.667 42.667 0 25.557-17.067 42.667-42.667 42.667h-494.891l98.091 98.133c17.067 17.067 17.067 42.667 0 59.733-17.067 17.024-42.667 17.024-59.733 0l-170.667-170.667z" />
+<glyph unicode="&#xe907;" glyph-name="arrow-right" d="M840.533 418.101c4.267 4.309 8.533 8.533 8.533 12.8 4.267 4.267 4.267 12.843 4.267 17.067 0 4.267 0 12.8-4.267 17.109-4.267 4.224-4.267 8.491-8.533 12.757l-170.667 170.667c-17.067 17.067-42.667 17.067-59.733 0s-17.067-42.667 0-59.733l98.091-98.133h-494.891c-25.6 0-42.667-17.067-42.667-42.667 0-25.557 17.067-42.667 42.667-42.667h494.891l-98.091-98.133c-17.067-17.067-17.067-42.667 0-59.733 17.067-17.024 42.667-17.024 59.733 0l170.667 170.667z" />
+<glyph unicode="&#xe908;" glyph-name="arrow_f" d="M938.667 448c0-235.641-191.025-426.667-426.667-426.667s-426.667 191.025-426.667 426.667c0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667zM458.762 311.637c-10.286-10.637-10.286-27.88 0-38.516s26.962-10.637 37.248 0l150.497 155.621c10.286 10.637 10.286 27.88 0 38.516l-150.497 155.621c-10.286 10.637-26.962 10.637-37.248 0s-10.286-27.88 0-38.516l131.948-136.441-131.948-136.285z" />
+<glyph unicode="&#xe909;" glyph-name="arrow_o" d="M458.762 311.637c-10.286-10.637-10.286-27.88 0-38.516s26.962-10.637 37.248 0l150.497 155.621c10.286 10.637 10.286 27.88 0 38.516l-150.497 155.621c-10.286 10.637-26.962 10.637-37.248 0s-10.286-27.88 0-38.516l131.948-136.441-131.948-136.285zM512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM42.667 448c0-260.267 209.067-469.333 469.333-469.333s469.333 209.067 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333s-469.333-209.067-469.333-469.333z" />
+<glyph unicode="&#xe90a;" glyph-name="attach" d="M924.768 478.208c-16.768 15.872-41.941 15.872-58.709 0l-386.005-364.757c-83.925-79.275-213.973-79.275-297.856 0-83.925 79.317-83.925 202.197 0 281.515l386.005 364.757c46.123 43.563 130.005 43.563 176.171 0 50.347-47.616 50.347-122.923 0-166.571l-385.963-364.715c-16.811-15.872-41.984-15.872-58.752 0-4.181 3.968-8.405 11.904-8.405 23.765 0 11.904 4.224 19.84 12.587 27.776l356.651 336.981c16.768 15.872 16.768 39.68 0 55.509-16.811 15.872-41.984 15.872-58.752 0l-356.651-336.981c-25.173-19.84-37.717-51.541-37.717-83.285 0-31.701 12.544-63.403 37.717-83.243 50.389-47.573 130.091-47.573 176.213 0l386.005 364.757c83.925 79.275 83.925 202.197 0 281.472-37.76 35.669-92.288 59.477-146.816 59.477-54.571 0-109.099-19.84-146.859-59.477l-386.005-364.715c-113.28-107.051-113.28-285.483 0-392.533 58.752-55.467 134.272-79.275 209.792-79.275s150.997 27.733 209.749 79.275l386.005 364.757c8.405 11.904 8.405 39.637-8.405 55.509z" />
+<glyph unicode="&#xe90b;" glyph-name="beadcrumbs" d="M731.429 448l-365.714-365.714v731.429z" />
+<glyph unicode="&#xe90c;" glyph-name="bedge" d="M273.067 789.333h477.867c150.811 0 273.067-122.256 273.067-273.067v-136.533c0-150.811-122.256-273.067-273.067-273.067h-477.867c-150.811 0-273.067 122.256-273.067 273.067v136.533c0 150.811 122.256 273.067 273.067 273.067z" />
+<glyph unicode="&#xe90d;" glyph-name="browse" d="M279.704 400.593c-36.655 0-66.37 29.715-66.37 66.37s29.715 66.37 66.37 66.37c36.655 0 66.37-29.715 66.37-66.37s-29.715-66.37-66.37-66.37zM744.296 400.593c-36.655 0-66.37 29.715-66.37 66.37s29.715 66.37 66.37 66.37c36.655 0 66.37-29.715 66.37-66.37s-29.715-66.37-66.37-66.37zM512 400.593c-36.655 0-66.37 29.715-66.37 66.37s29.715 66.37 66.37 66.37c36.655 0 66.37-29.715 66.37-66.37s-29.715-66.37-66.37-66.37z" />
+<glyph unicode="&#xe90e;" glyph-name="calendar" d="M810.667 64h-597.333c-25.6 0-42.667 17.067-42.667 42.667v384h682.667v-384c0-25.6-17.067-42.667-42.667-42.667zM213.333 746.667h85.333v-42.667c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v42.667h256v-42.667c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v42.667h85.333c25.6 0 42.667-17.067 42.667-42.667v-128h-682.667v128c0 25.6 17.067 42.667 42.667 42.667zM810.667 832h-85.333v42.667c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-42.667h-256v42.667c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-42.667h-85.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe90f;" glyph-name="camera" d="M938.667 149.333c0-25.6-17.067-42.667-42.667-42.667h-768c-25.6 0-42.667 17.067-42.667 42.667v469.333c0 25.6 17.067 42.667 42.667 42.667h170.667c12.8 0 25.6 8.533 34.133 17.067l72.533 110.933h209.067l72.533-110.933c12.8-8.533 25.6-17.067 38.4-17.067h170.667c25.6 0 42.667-17.067 42.667-42.667v-469.333zM896 746.667h-149.333l-72.533 110.933c-8.533 8.533-21.333 17.067-34.133 17.067h-256c-12.8 0-25.6-8.533-34.133-17.067l-72.533-110.933h-149.333c-72.533 0-128-55.467-128-128v-469.333c0-72.533 55.467-128 128-128h768c72.533 0 128 55.467 128 128v469.333c0 72.533-55.467 128-128 128zM512 234.667c-72.533 0-128 55.467-128 128s55.467 128 128 128c72.533 0 128-55.467 128-128s-55.467-128-128-128zM512 576c-119.467 0-213.333-93.867-213.333-213.333s93.867-213.333 213.333-213.333c119.467 0 213.333 93.867 213.333 213.333s-93.867 213.333-213.333 213.333z" />
+<glyph unicode="&#xe910;" glyph-name="chevron" d="M482.125 290.125c8.533-8.533 21.333-12.8 29.867-12.8s21.333 4.267 29.867 12.8l213.333 213.333c17.067 17.067 17.067 42.667 0 59.733s-42.667 17.067-59.733 0l-183.467-183.467-183.467 183.467c-17.067 17.067-42.667 17.067-59.733 0s-17.067-42.667 0-59.733l213.333-213.333z" />
+<glyph unicode="&#xe911;" glyph-name="close" d="M580.25 448l258.475 258.475c19.499 19.499 19.499 48.725 0 68.224s-48.768 19.499-68.267 0l-258.475-258.432-258.432 258.432c-19.499 19.499-48.768 19.499-68.267 0s-19.499-48.725 0-68.224l258.475-258.475-258.475-258.475c-19.499-19.499-19.499-48.725 0-68.224 9.771-9.771 19.499-14.635 34.133-14.635s24.363 4.864 34.133 14.635l258.432 258.432 258.475-258.432c9.771-9.771 24.363-14.635 34.133-14.635 9.728 0 24.363 4.864 34.133 14.635 19.499 19.499 19.499 48.725 0 68.224l-258.475 258.475z" />
+<glyph unicode="&#xe912;" glyph-name="commit" d="M896.086 106.965c-338.304 1.152-340.693 454.101-340.651 473.557v106.88l99.157-97.323c8.32-8.192 19.072-12.245 29.867-12.245 11.136 0 22.187 4.309 30.592 12.843 16.469 16.896 16.213 44.032-0.683 60.544l-171.819 168.576c-0.341 0.299-0.811 0.384-1.152 0.725-3.541 3.285-7.509 6.187-12.203 8.149-0.213 0.085-0.341 0.085-0.512 0.128-0.725 0.299-1.451 0.299-2.133 0.555-4.139 1.408-8.277 2.176-12.501 2.304-0.768 0-1.451 0.256-2.219 0.256-0.171 0-0.341 0.085-0.512 0.085-1.067 0-1.963-0.555-3.029-0.597-2.603-0.299-5.12-0.811-7.68-1.579-8.96-2.347-16.512-7.253-22.144-14.293l-165.803-163.456c-16.811-16.597-17.067-43.691-0.512-60.587 16.555-16.811 43.605-17.024 60.416-0.469l96 94.677v-105.387c0.043-19.243-2.347-472.192-340.651-473.344-23.595-0.085-42.667-19.328-42.581-42.965 0.085-23.595 19.2-42.667 42.752-42.667h0.171c107.051 0.384 196.949 36.608 267.307 107.648 56.832 57.429 93.056 130.347 116.437 200.789 23.424-70.443 59.648-143.36 116.48-200.789 70.315-71.040 160.213-107.264 267.264-107.648h0.171c23.552 0 42.667 19.072 42.752 42.667 0.085 23.637-18.987 42.88-42.581 42.965z" />
+<glyph unicode="&#xe913;" glyph-name="composition" d="M810.667 104.533c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667zM213.333 104.533c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667zM213.333 787.2c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667zM512 488.533c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667zM810.667 275.2c-55.68 0-102.528-35.755-120.149-85.333h-357.035c-12.843 36.224-41.259 64.64-77.483 77.483v135.851h135.851c17.621-49.579 64.469-85.333 120.149-85.333 70.699 0 128 57.301 128 128s-57.301 128-128 128c-55.68 0-102.528-35.755-120.149-85.333h-135.851v135.851c49.579 17.621 85.333 64.469 85.333 120.149 0 70.699-57.301 128-128 128s-128-57.301-128-128c0-55.68 35.755-102.528 85.333-120.149v-357.035c-49.579-17.621-85.333-64.469-85.333-120.149 0-70.699 57.301-128 128-128 55.68 0 102.528 35.755 120.149 85.333h357.035c17.621-49.579 64.469-85.333 120.149-85.333 70.699 0 128 57.301 128 128s-57.301 128-128 128z" />
+<glyph unicode="&#xe914;" glyph-name="deployment_Artifacts" d="M853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128zM298.667 277.333c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667zM512 661.333c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667zM725.333 277.333c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667zM405.888 387.285l66.176 110.379c12.629-4.224 25.899-6.997 39.936-6.997 6.784 0 13.312 0.981 19.84 2.005l81.152-108.16c-23.339-15.232-41.003-37.845-50.475-64.512h-101.035c-10.112 28.544-29.909 52.181-55.595 67.285zM461.483 234.667h101.035c17.621-49.579 64.469-85.333 120.149-85.333 70.699 0 128 57.301 128 128 0 62.805-45.312 114.773-104.96 125.653l-98.304 131.115c20.053 22.571 32.597 51.968 32.597 84.565 0 70.699-57.301 128-128 128s-128-57.301-128-128c0-25.216 7.552-48.597 20.139-68.395l-88.533-147.541c-58.368-11.904-102.272-63.531-102.272-125.397 0-70.699 57.301-128 128-128 55.68 0 102.528 35.755 120.149 85.333z" />
+<glyph unicode="&#xe915;" glyph-name="download" d="M896 277.333c25.6 0 42.667-17.067 42.667-42.667v-128c0-72.533-55.467-128-128-128h-597.333c-72.533 0-128 55.467-128 128v128c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-128c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v128c0 25.6 17.067 42.667 42.667 42.667zM482.101 247.467l-170.667 170.667c-17.024 17.067-17.024 42.667 0 59.733 17.067 17.067 42.667 17.067 59.733 0l98.133-98.091v494.891c0 25.6 17.109 42.667 42.667 42.667 25.6 0 42.667-17.067 42.667-42.667v-494.891l98.133 98.091c17.067 17.067 42.667 17.067 59.733 0s17.067-42.667 0-59.733l-170.667-170.667c-4.267-4.267-8.533-4.267-12.757-8.533-4.309-4.267-12.843-4.267-17.109-4.267-4.224 0-12.8 0-17.067 4.267-4.267 0-8.491 4.267-12.8 8.533z" />
+<glyph unicode="&#xe916;" glyph-name="duplicate" d="M128 106.667c0-25.6 17.067-42.667 42.667-42.667h384c25.6 0 42.667 17.067 42.667 42.667v384c0 25.6-17.067 42.667-42.667 42.667h-384c-25.6 0-42.667-17.067-42.667-42.667v-384zM170.667 618.667h384c72.533 0 128-55.467 128-128v-384c0-72.533-55.467-128-128-128h-384c-72.533 0-128 55.467-128 128v384c0 72.533 55.467 128 128 128zM810.667 362.667h42.667c25.6 0 42.667 17.067 42.667 42.667v384c0 25.6-17.067 42.667-42.667 42.667h-384c-25.6 0-42.667-17.067-42.667-42.667v-42.667c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667v42.667c0 72.533 55.467 128 128 128h384c72.533 0 128-55.467 128-128v-384c0-72.533-55.467-128-128-128h-42.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667z" />
+<glyph unicode="&#xe917;" glyph-name="edit" d="M170.667 388.271v-110.933h110.933l426.667 426.667-110.933 110.933-426.667-426.667zM128 192.004c-25.6 0-42.667 17.067-42.667 42.667v170.667c0 12.8 4.267 21.333 12.8 29.867l469.333 469.333c17.067 17.067 42.667 17.067 59.733 0l170.667-170.667c17.067-17.067 17.067-42.667 0-59.733l-469.333-469.333c-8.533-8.533-17.067-12.8-29.867-12.8h-170.667zM896 64c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-768c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h768z" />
+<glyph unicode="&#xe918;" glyph-name="expand" d="M934.426 849.067c4.267-4.309 4.267-12.843 4.267-17.067v-256c0-25.6-17.109-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v153.557l-226.133-226.133c-8.533-8.533-21.333-12.757-29.867-12.757-8.576 0-21.333 4.224-29.909 12.757-17.024 17.109-17.024 42.667 0 59.776l226.133 226.133h-153.557c-25.6 0-42.667 17.067-42.667 42.667 0 25.557 17.067 42.667 42.667 42.667h256c4.224 0 12.757 0 17.067-4.267 8.491-4.309 17.024-12.843 21.333-21.333zM396.8 392.525c17.067 17.024 42.667 17.024 59.733 0 17.067-17.067 17.067-42.667 0-59.733l-226.091-226.133h153.557c25.6 0 42.667-17.109 42.667-42.667 0-25.6-17.067-42.667-42.667-42.667h-256c-4.224 0-12.8 0-17.067 4.224-8.491 4.309-17.067 12.843-21.333 21.333-4.267 4.309-4.267 12.843-4.267 17.109v256c0 25.557 17.109 42.667 42.667 42.667 25.6 0 42.667-17.109 42.667-42.667v-153.6l226.133 226.133zM913.092 25.566c-4.309-4.267-12.843-4.267-17.067-4.267h-256c-25.6 0-42.667 17.109-42.667 42.667 0 25.6 17.067 42.667 42.667 42.667h153.557l-226.133 226.133c-8.533 8.533-12.757 21.333-12.757 29.867 0 8.576 4.224 21.333 12.757 29.909 17.109 17.024 42.667 17.024 59.776 0l226.133-226.133v153.557c0 25.6 17.067 42.667 42.667 42.667 25.557 0 42.667-17.067 42.667-42.667v-256c0-4.224 0-12.757-4.267-17.067-4.309-8.491-12.843-17.024-21.333-21.333zM456.55 563.191c17.024-17.067 17.024-42.667 0-59.733-17.067-17.067-42.667-17.067-59.733 0l-226.133 226.091v-153.557c0-25.6-17.109-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v256c0 4.224 0 12.8 4.224 17.067 4.309 8.491 12.843 17.067 21.333 21.333 4.309 4.267 12.843 4.267 17.109 4.267h256c25.557 0 42.667-17.109 42.667-42.667 0-25.6-17.109-42.667-42.667-42.667h-153.6l226.133-226.133z" />
+<glyph unicode="&#xe919;" glyph-name="fail" d="M580.25 448l258.475 258.475c19.499 19.499 19.499 48.725 0 68.224s-48.768 19.499-68.267 0l-258.475-258.432-258.432 258.432c-19.499 19.499-48.768 19.499-68.267 0s-19.499-48.725 0-68.224l258.475-258.475-258.475-258.475c-19.499-19.499-19.499-48.725 0-68.224 9.771-9.771 19.499-14.635 34.133-14.635s24.363 4.864 34.133 14.635l258.432 258.432 258.475-258.432c9.771-9.771 24.363-14.635 34.133-14.635 9.728 0 24.363 4.864 34.133 14.635 19.499 19.499 19.499 48.725 0 68.224l-258.475 258.475z" />
+<glyph unicode="&#xe91a;" glyph-name="file_managment" d="M853.333 375.462c25.6 0 42.667-17.024 42.667-42.667v-226.133c0-72.533-55.467-128-128-128h-597.333c-72.533 0-128 55.467-128 128v597.333c0 72.533 55.467 128 128 128h226.133c25.6 0 42.667-17.067 42.667-42.667 0-25.557-17.067-42.667-42.667-42.667h-226.133c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.557 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.109 42.667 42.667v226.133c0 25.643 17.067 42.667 42.667 42.667zM494.916 320.004h-110.933v110.933l384 384 110.933-110.933-384-384zM968.559 733.871l-170.667 170.667c-17.109 17.067-42.667 17.067-59.776 0l-426.667-426.667c-8.533-8.533-12.8-17.067-12.8-29.867v-170.667c0-25.6 17.109-42.667 42.667-42.667h170.667c12.8 0 21.333 4.267 29.909 12.8l426.667 426.667c17.024 17.067 17.024 42.667 0 59.733z" />
+<glyph unicode="&#xe91b;" glyph-name="filter" d="M563.595 456.533c-4.309-8.533-8.533-17.067-8.533-29.867v-294.443l-85.333 42.667v251.776c0 8.533-4.267 21.333-8.533 25.557l-281.6 337.109h669.867l-285.867-332.8zM977.461 849.067c-8.533 17.067-21.333 25.6-38.4 25.6h-853.333c-17.109 0-29.867-8.533-38.443-25.6-8.491-12.843-4.224-29.867 4.309-42.667l332.8-392.533v-264.533c0-17.109 8.533-29.867 25.557-38.443l170.667-85.333c4.309-4.224 8.576-4.224 17.109-4.224s17.067 0 21.333 4.224c12.8 8.576 21.333 21.333 21.333 38.443v349.867l332.8 392.533c8.533 12.8 12.757 29.824 4.267 42.667z" />
+<glyph unicode="&#xe91c;" glyph-name="filterDown" d="M482.101 162.133c4.309-4.267 8.533-8.533 12.8-8.533 4.267-4.267 12.843-4.267 17.067-4.267 4.267 0 12.8 0 17.109 4.267 4.224 4.267 8.491 4.267 12.757 8.533l170.667 170.667c17.067 17.067 17.067 42.667 0 59.733s-42.667 17.067-59.733 0l-98.133-98.091v494.891c0 25.6-17.067 42.667-42.667 42.667-25.557 0-42.667-17.067-42.667-42.667v-494.891l-98.133 98.091c-17.067 17.067-42.667 17.067-59.733 0-17.024-17.067-17.024-42.667 0-59.733l170.667-170.667z" />
+<glyph unicode="&#xe91d;" glyph-name="filterUp" d="M482.101 819.2c4.309 4.267 8.533 8.533 12.8 8.533 4.267 4.267 12.843 4.267 17.067 4.267 4.267 0 12.8 0 17.109-4.267 4.224-4.267 8.491-4.267 12.757-8.533l170.667-170.667c17.067-17.067 17.067-42.667 0-59.733s-42.667-17.067-59.733 0l-98.133 98.091v-494.891c0-25.6-17.067-42.667-42.667-42.667-25.557 0-42.667 17.067-42.667 42.667v494.891l-98.133-98.091c-17.067-17.067-42.667-17.067-59.733 0-17.024 17.067-17.024 42.667 0 59.733l170.667 170.667z" />
+<glyph unicode="&#xe91e;" glyph-name="info_f" d="M512 917.333c260.267 0 469.333-209.067 469.333-469.333 0-260.309-209.067-469.333-469.333-469.333s-469.333 209.024-469.333 469.333c0 260.267 209.067 469.333 469.333 469.333zM512 490.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.125 648.542c-8.533-8.533-12.8-17.067-12.8-29.867s4.267-21.333 12.8-29.867c8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.576 8.533 12.8 17.067 12.8 29.867s-4.224 21.333-12.8 29.867c-17.067 17.024-42.667 17.024-59.733 0z" />
+<glyph unicode="&#xe91f;" glyph-name="info_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333 0-260.309 209.067-469.333 469.333-469.333s469.333 209.024 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333zM512 490.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.125 648.542c-8.533-8.533-12.8-17.067-12.8-29.867s4.267-21.333 12.8-29.867c8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.576 8.533 12.8 17.067 12.8 29.867s-4.224 21.333-12.8 29.867c-17.067 17.024-42.667 17.024-59.733 0z" />
+<glyph unicode="&#xe920;" glyph-name="info_tabs" d="M512 490.667c25.6 0 42.667-17.067 42.667-42.667v-170.667c0-25.643-17.067-42.667-42.667-42.667s-42.667 17.024-42.667 42.667v170.667c0 25.6 17.067 42.667 42.667 42.667zM482.133 648.565c17.067 17.024 42.667 17.024 59.733 0 8.576-8.533 12.8-17.067 12.8-29.867s-4.224-21.333-12.8-29.867c-8.533-8.576-17.067-12.8-29.867-12.8s-21.333 4.224-29.867 12.8c-8.533 8.533-12.8 17.067-12.8 29.867s4.267 21.333 12.8 29.867zM853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe921;" glyph-name="information_artifacts" d="M512 490.667c25.6 0 42.667-17.067 42.667-42.667v-170.667c0-25.643-17.067-42.667-42.667-42.667s-42.667 17.024-42.667 42.667v170.667c0 25.6 17.067 42.667 42.667 42.667zM482.133 648.565c17.067 17.024 42.667 17.024 59.733 0 8.576-8.533 12.8-17.067 12.8-29.867s-4.224-21.333-12.8-29.867c-8.533-8.576-17.067-12.8-29.867-12.8s-21.333 4.224-29.867 12.8c-8.533 8.533-12.8 17.067-12.8 29.867s4.267 21.333 12.8 29.867zM853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe922;" glyph-name="inputs" d="M853.333 147.2c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 872.533h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128zM725.333 659.2h-426.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667h426.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667zM725.333 488.533h-426.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667h426.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667z" />
+<glyph unicode="&#xe923;" glyph-name="locked" d="M341.333 661.333c0 93.867 76.8 170.667 170.667 170.667s170.667-76.8 170.667-170.667v-128h-341.333v128zM810.667 533.333h-42.667v128c0 140.8-115.2 256-256 256s-256-115.2-256-256v-128h-42.667c-72.533 0-128-55.467-128-128v-298.667c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v298.667c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe924;" glyph-name="Menu" d="M445.649 699.24c0 36.655 29.715 66.37 66.37 66.37s66.37-29.715 66.37-66.37c0-36.655-29.715-66.37-66.37-66.37s-66.37 29.715-66.37 66.37zM445.649 234.648c0 36.655 29.715 66.37 66.37 66.37s66.37-29.715 66.37-66.37c0-36.655-29.715-66.37-66.37-66.37s-66.37 29.715-66.37 66.37zM445.649 466.944c0 36.655 29.715 66.37 66.37 66.37s66.37-29.715 66.37-66.37c0-36.655-29.715-66.37-66.37-66.37s-66.37 29.715-66.37 66.37z" />
+<glyph unicode="&#xe925;" glyph-name="notifications" d="M234.667 277.333h554.667c-12.8 25.6-21.333 55.467-21.333 85.333v213.333c0 140.8-115.2 256-256 256s-256-115.2-256-256v-213.333c0-29.867-8.533-59.733-21.333-85.333zM938.667 277.333c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-853.333c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667c46.933 0 85.333 38.4 85.333 85.333v213.333c0 187.733 153.6 341.333 341.333 341.333s341.333-153.6 341.333-341.333v-213.333c0-46.933 38.4-85.333 85.333-85.333zM644.131 100.648c21.333-12.8 29.867-38.4 8.533-59.733-25.6-42.667-68.267-64-110.933-64-21.333 0-42.667 4.267-64 17.067s-34.133 25.6-46.933 46.933c-8.533 21.333-4.309 46.933 17.024 59.733 21.333 8.533 46.976 4.267 59.776-17.067 4.224-8.533 8.533-12.8 17.067-17.067 21.333-8.533 46.933-4.267 59.733 17.067 12.757 21.333 38.4 29.867 59.733 17.067z" />
+<glyph unicode="&#xe926;" glyph-name="permissions" d="M554.667 362.667h-341.333c-119.467 0-213.333-93.867-213.333-213.333v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 72.533 55.467 128 128 128h341.333c72.533 0 128-55.467 128-128v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 119.467-93.867 213.333-213.333 213.333zM384 789.333c72.533 0 128-55.467 128-128s-55.467-128-128-128c-72.533 0-128 55.467-128 128s55.467 128 128 128zM384 448c119.467 0 213.333 93.867 213.333 213.333s-93.867 213.333-213.333 213.333c-119.467 0-213.333-93.867-213.333-213.333s93.867-213.333 213.333-213.333zM862.684 361.849c-21.333 4.267-46.976-8.533-51.2-29.867-4.267-21.333 8.533-46.933 29.867-51.2 55.467-12.8 93.867-64 93.867-123.733v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c4.267 98.133-59.733 183.467-157.867 204.8zM693.444 872.034c-21.333 8.533-42.667-4.267-51.2-29.867-4.267-21.333 8.533-46.933 29.867-51.2 68.267-17.067 110.933-85.333 93.867-157.867-12.843-46.933-46.933-81.067-93.867-93.867-21.333-4.267-38.4-29.867-29.867-51.2 4.224-21.333 21.333-34.133 42.667-34.133h8.533c76.8 21.333 136.533 76.8 153.6 153.6 29.867 119.467-38.4 238.933-153.6 264.533z" />
+<glyph unicode="&#xe927;" glyph-name="profile" d="M682.667 362.667h-341.333c-119.467 0-213.333-93.867-213.333-213.333v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 72.533 55.467 128 128 128h341.333c72.533 0 128-55.467 128-128v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 119.467-93.867 213.333-213.333 213.333zM512 789.333c72.533 0 128-55.467 128-128s-55.467-128-128-128c-72.533 0-128 55.467-128 128s55.467 128 128 128zM512 448c119.467 0 213.333 93.867 213.333 213.333s-93.867 213.333-213.333 213.333c-119.467 0-213.333-93.867-213.333-213.333s93.867-213.333 213.333-213.333z" />
+<glyph unicode="&#xe928;" glyph-name="properties" d="M512 362.658c-46.933 0-85.333 38.4-85.333 85.333 0 46.976 38.4 85.333 85.333 85.333s85.333-38.357 85.333-85.333c0-46.933-38.4-85.333-85.333-85.333zM512 618.658c-93.867 0-170.667-76.8-170.667-170.667s76.8-170.667 170.667-170.667c93.867 0 170.667 76.8 170.667 170.667s-76.8 170.667-170.667 170.667zM814.916 209.075c8.533-8.533 12.843-17.067 12.843-29.867s-4.309-21.333-12.843-29.867c-8.491-8.576-17.024-12.8-29.824-12.8-12.843 0-21.333 4.224-34.176 17.067-34.133 34.133-81.024 42.667-123.691 21.333-42.667-17.067-68.309-59.733-68.309-102.4v-8.533c0-25.6-17.024-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v4.267c0 46.933-29.824 85.333-72.491 102.4-12.843 8.533-29.867 8.533-46.976 8.533-29.867 0-59.691-12.8-81.024-34.133-17.109-17.067-38.443-17.067-55.509-4.309l-8.491 17.109h-4.309c-4.224 4.224-4.224 12.8-4.224 17.067 0 12.8 4.224 21.333 17.024 34.133 34.176 34.133 42.667 81.024 21.333 123.691-17.024 42.667-59.691 68.309-102.357 68.309h-8.576c-25.557 0-42.667 17.024-42.667 42.667 0 25.6 17.109 42.667 42.667 42.667h4.267c46.976 0 85.333 29.867 102.4 72.533 17.109 42.667 8.576 89.6-25.557 128-17.109 17.067-17.109 42.667 0 59.733 17.024 17.067 42.667 17.067 64-4.267 29.824-29.867 76.8-38.4 115.157-25.643l12.843 4.309c42.667 17.024 68.224 59.691 68.224 102.357v8.576c0 25.6 17.109 42.667 42.667 42.667 25.6 0 42.667-17.067 42.667-46.933 0-46.976 25.6-85.333 68.267-102.4s89.643-8.576 128 25.6c8.533 8.491 17.067 12.8 29.867 12.8s21.333-4.309 29.867-12.8c17.109-17.067 17.109-42.667-4.224-64-29.867-29.867-38.443-76.843-25.643-115.2l4.309-12.8c17.024-42.667 59.691-68.267 102.357-68.267h8.533c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-46.891-42.667c-46.976 0-85.333-25.6-102.443-68.267-21.333-42.667-8.533-89.643 25.6-128zM866.116 302.942c4.309 8.491 12.8 17.067 29.867 17.067 72.576 0 128 55.424 128 128 0 72.533-55.424 128-128 128h-8.533c-8.533 0-17.024 4.267-21.333 12.757l-4.224 8.576c-4.309 8.533-4.309 21.333 8.533 34.091 46.891 46.976 51.157 115.243 12.8 166.443v12.8l-17.109 8.533c-21.333 21.333-51.2 34.133-85.333 34.133s-68.224-12.8-93.867-38.4c-8.491-8.533-21.333-8.533-29.824-4.267-8.533-4.267-17.109 8.533-17.109 21.333 0 72.533-55.424 128-128 128-72.533 0-128-55.467-128-128v-8.576c0-8.491-4.224-17.024-12.757-21.333l-8.576-4.224c-8.533-4.267-21.333 0-34.091 8.533-51.243 51.2-132.309 51.2-179.243 0-51.2-51.2-51.2-132.309 4.267-183.467 8.533-8.533 8.533-21.333 4.309-34.176-4.309-8.491-17.109-17.024-29.909-17.024-72.533 0-128-55.467-128-128s55.467-128 128-128h8.576c12.757 0 21.333-8.533 25.557-17.067 4.309-8.576 4.309-21.333-8.533-34.133-25.6-25.6-38.357-55.467-38.357-89.6 0-29.867 12.757-59.733 34.091-85.333l4.267-4.267 12.843-12.8c51.157-38.443 119.467-34.133 170.667 12.8 8.491 8.533 21.333 8.533 34.133 4.267 12.757-4.267 17.024-12.843 17.024-29.867 0-72.533 55.509-128 128-128 72.533 0 128 55.467 128 128v8.533c0 12.8 8.533 21.333 17.067 25.6 8.576 4.224 21.333 4.224 34.133-8.533 51.2-51.243 132.309-51.243 179.2 0 51.243 51.2 51.243 132.267-4.224 183.424-4.309 12.843-8.533 25.643-4.309 34.176z" />
+<glyph unicode="&#xe929;" glyph-name="Q_f" d="M560.006 694.979c68.267-25.6 115.2-89.6 119.467-166.4 0-110.933-140.8-162.133-157.867-166.4-4.267-4.267-8.576-4.267-12.8-4.267-17.109 0-34.133 12.8-38.443 29.867-8.491 25.6 4.309 46.933 25.643 55.467 25.6 12.8 98.133 46.933 98.133 89.6 0 38.4-21.333 68.267-55.467 81.067-46.976 17.067-93.867-8.533-110.976-51.2-8.491-21.333-34.091-34.133-55.424-25.6-25.6 4.267-34.133 29.867-29.909 55.467 29.909 85.376 128 132.267 217.643 102.4zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333 0-260.309 209.067-469.333 469.333-469.333s469.333 209.024 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333zM482.133 264.565c17.067 17.024 42.667 17.024 59.733 0 8.576-8.533 12.8-21.333 12.8-29.867s-4.224-21.333-12.8-29.867c-8.533-8.576-17.067-12.8-29.867-12.8s-21.333 4.224-29.867 12.8c-8.533 8.533-12.8 17.067-12.8 29.867s4.267 21.333 12.8 29.867z" />
+<glyph unicode="&#xe92a;" glyph-name="Q_o" d="M560.006 694.979c-89.643 29.867-187.733-17.024-217.643-102.4-4.224-25.6 4.309-51.2 29.909-55.467 21.333-8.533 46.933 4.267 55.424 25.6 17.109 42.667 64 68.267 110.976 51.2 34.133-12.8 55.467-42.667 55.467-81.067 0-42.667-72.533-76.8-98.133-89.6-21.333-8.533-34.133-29.867-25.643-55.467 4.309-17.067 21.333-29.867 38.443-29.867 4.224 0 8.533 0 12.8 4.267 17.067 4.267 157.867 55.467 157.867 166.4-4.267 76.8-51.2 140.8-119.467 166.4zM512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333 0-260.309 209.067-469.333 469.333-469.333s469.333 209.024 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333zM482.133 264.565c-8.533-8.533-12.8-17.067-12.8-29.867s4.267-21.333 12.8-29.867c8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.576 8.533 12.8 21.333 12.8 29.867s-4.224 21.333-12.8 29.867c-17.067 17.024-42.667 17.024-59.733 0z" />
+<glyph unicode="&#xe92c;" glyph-name="revert" d="M597.333 422.4l115.2-115.2c17.067-17.067 17.067-42.667 0-59.733-8.533-8.533-21.333-12.8-29.867-12.8s-21.333 4.267-29.867 12.8l-128 128c-8.533 8.533-12.8 17.067-12.8 29.867v256c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-238.933zM955.895 588.856c81.024-221.867-38.4-465.067-260.309-541.867-46.891-17.067-93.867-25.6-140.757-25.6-174.933 0-341.333 110.933-405.333 285.867-8.576 21.333 4.224 46.933 25.557 55.467s46.976-4.267 55.509-25.6c64-179.2 256-273.067 435.157-209.067 89.643 29.867 157.867 93.867 196.309 174.933 38.357 81.067 42.667 174.933 12.8 260.267-29.909 89.6-93.909 157.867-174.933 196.267-81.067 38.4-174.976 42.667-260.309 12.8-46.891-17.067-93.867-46.933-128-81.067l-119.424-115.2h149.333c25.557 0 34.091-8.533 34.091-34.133s-17.024-42.667-42.667-42.667h-268.757l-4.267 4.267c-4.309 0-4.309 0-8.533 4.267-4.309 0-4.309 4.267-4.309 4.267 0 4.267-4.224 4.267-4.224 8.533v268.8c0 25.6 17.067 42.667 42.667 42.667 25.557 0 42.667-17.067 42.667-42.667v-157.867l128 119.467c42.667 42.667 98.091 76.8 157.867 98.133 106.667 38.4 221.867 34.133 324.224-17.067 102.443-51.2 179.243-136.533 217.643-243.2z" />
+<glyph unicode="&#xe92d;" glyph-name="save" d="M853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-42.667v298.667c0 25.6-17.067 42.667-42.667 42.667h-426.667c-25.6 0-42.667-17.067-42.667-42.667v-298.667h-42.667c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h42.667v-170.667c0-25.6 17.067-42.667 42.667-42.667h341.333c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667h-298.667v128h324.267l187.733-187.733v-452.267zM341.333 106.667v256h341.333v-256h-341.333zM925.867 648.533l-213.333 213.333c-8.533 8.533-17.067 12.8-29.867 12.8h-469.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v469.333c0 12.8-4.267 21.333-12.8 29.867z" />
+<glyph unicode="&#xe92e;" glyph-name="search" d="M170.667 512c0 153.6 123.733 277.333 277.333 277.333s277.333-123.733 277.333-277.333c0-76.8-29.867-145.067-81.067-196.267s-119.467-81.067-196.267-81.067c-153.6 0-277.333 123.733-277.333 277.333zM925.867 93.867l-192 192c46.933 59.733 76.8 140.8 76.8 226.133 0 200.533-162.133 362.667-362.667 362.667s-362.667-162.133-362.667-362.667c0-200.533 162.133-362.667 362.667-362.667 85.333 0 162.133 29.867 226.133 76.8l192-192c8.533-8.533 21.333-12.8 29.867-12.8s21.333 4.267 29.867 12.8c17.067 17.067 17.067 42.667 0 59.733z" />
+<glyph unicode="&#xe92f;" glyph-name="setting" d="M512 362.658c-46.933 0-85.333 38.4-85.333 85.333 0 46.976 38.4 85.333 85.333 85.333s85.333-38.357 85.333-85.333c0-46.933-38.4-85.333-85.333-85.333zM512 618.658c-93.867 0-170.667-76.8-170.667-170.667s76.8-170.667 170.667-170.667c93.867 0 170.667 76.8 170.667 170.667s-76.8 170.667-170.667 170.667zM814.916 209.075c8.533-8.533 12.843-17.067 12.843-29.867s-4.309-21.333-12.843-29.867c-8.491-8.576-17.024-12.8-29.824-12.8-12.843 0-21.333 4.224-34.176 17.067-34.133 34.133-81.024 42.667-123.691 21.333-42.667-17.067-68.309-59.733-68.309-102.4v-8.533c0-25.6-17.024-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v4.267c0 46.933-29.824 85.333-72.491 102.4-12.843 8.533-29.867 8.533-46.976 8.533-29.867 0-59.691-12.8-81.024-34.133-17.109-17.067-38.443-17.067-55.509-4.309l-8.491 17.109h-4.309c-4.224 4.224-4.224 12.8-4.224 17.067 0 12.8 4.224 21.333 17.024 34.133 34.176 34.133 42.667 81.024 21.333 123.691-17.024 42.667-59.691 68.309-102.357 68.309h-8.576c-25.557 0-42.667 17.024-42.667 42.667 0 25.6 17.109 42.667 42.667 42.667h4.267c46.976 0 85.333 29.867 102.4 72.533 17.109 42.667 8.576 89.6-25.557 128-17.109 17.067-17.109 42.667 0 59.733 17.024 17.067 42.667 17.067 64-4.267 29.824-29.867 76.8-38.4 115.157-25.643l12.843 4.309c42.667 17.024 68.224 59.691 68.224 102.357v8.576c0 25.6 17.109 42.667 42.667 42.667 25.6 0 42.667-17.067 42.667-46.933 0-46.976 25.6-85.333 68.267-102.4s89.643-8.576 128 25.6c8.533 8.491 17.067 12.8 29.867 12.8s21.333-4.309 29.867-12.8c17.109-17.067 17.109-42.667-4.224-64-29.867-29.867-38.443-76.843-25.643-115.2l4.309-12.8c17.024-42.667 59.691-68.267 102.357-68.267h8.533c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-46.891-42.667c-46.976 0-85.333-25.6-102.443-68.267-21.333-42.667-8.533-89.643 25.6-128zM866.116 302.942c4.309 8.491 12.8 17.067 29.867 17.067 72.576 0 128 55.424 128 128 0 72.533-55.424 128-128 128h-8.533c-8.533 0-17.024 4.267-21.333 12.757l-4.224 8.576c-4.309 8.533-4.309 21.333 8.533 34.091 46.891 46.976 51.157 115.243 12.8 166.443v12.8l-17.109 8.533c-21.333 21.333-51.2 34.133-85.333 34.133s-68.224-12.8-93.867-38.4c-8.491-8.533-21.333-8.533-29.824-4.267-8.533-4.267-17.109 8.533-17.109 21.333 0 72.533-55.424 128-128 128-72.533 0-128-55.467-128-128v-8.576c0-8.491-4.224-17.024-12.757-21.333l-8.576-4.224c-8.533-4.267-21.333 0-34.091 8.533-51.243 51.2-132.309 51.2-179.243 0-51.2-51.2-51.2-132.309 4.267-183.467 8.533-8.533 8.533-21.333 4.309-34.176-4.309-8.491-17.109-17.024-29.909-17.024-72.533 0-128-55.467-128-128s55.467-128 128-128h8.576c12.757 0 21.333-8.533 25.557-17.067 4.309-8.576 4.309-21.333-8.533-34.133-25.6-25.6-38.357-55.467-38.357-89.6 0-29.867 12.757-59.733 34.091-85.333l4.267-4.267 12.843-12.8c51.157-38.443 119.467-34.133 170.667 12.8 8.491 8.533 21.333 8.533 34.133 4.267 12.757-4.267 17.024-12.843 17.024-29.867 0-72.533 55.509-128 128-128 72.533 0 128 55.467 128 128v8.533c0 12.8 8.533 21.333 17.067 25.6 8.576 4.224 21.333 4.224 34.133-8.533 51.2-51.243 132.309-51.243 179.2 0 51.243 51.2 51.243 132.267-4.224 183.424-4.309 12.843-8.533 25.643-4.309 34.176z" />
+<glyph unicode="&#xe930;" glyph-name="sub" d="M213.333 490.667h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667z" />
+<glyph unicode="&#xe931;" glyph-name="sub_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM682.667 490.667h-341.333c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h341.333c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe932;" glyph-name="success" d="M815.403 732.877l-360.277-515.925-203.861 197.589c-18.987 18.347-47.445 18.347-66.389 0-18.944-18.389-18.944-45.952 0-64.341l237.056-229.76c9.472-9.173 18.944-13.781 33.195-13.781 14.208 0 23.723 4.608 33.152 13.781l393.515 548.139c18.944 18.347 18.944 45.909 0 64.299s-47.403 18.389-66.389 0z" />
+<glyph unicode="&#xe933;" glyph-name="success_f" d="M757.461 590.549l-298.667-341.333c-7.808-8.875-18.901-14.165-30.72-14.549-0.427 0-0.939 0-1.408 0-11.307 0-22.144 4.48-30.165 12.501l-170.667 170.667c-16.683 16.64-16.683 43.648 0 60.331 16.683 16.64 43.648 16.64 60.331 0l138.411-138.411 268.629 306.987c15.531 17.792 42.539 19.541 60.203 4.011 17.749-15.531 19.541-42.453 4.053-60.203zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333z" />
+<glyph unicode="&#xe934;" glyph-name="success_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM693.21 646.771l-268.629-307.029-138.411 138.411c-16.683 16.683-43.648 16.683-60.331 0-16.683-16.64-16.683-43.648 0-60.331l170.667-170.667c7.979-8.021 18.859-12.501 30.165-12.501 0.469 0 0.939 0 1.408 0.043 11.819 0.384 22.912 5.675 30.72 14.549l298.667 341.333c15.488 17.749 13.696 44.672-4.053 60.203-17.664 15.531-44.672 13.781-60.203-4.011z" />
+<glyph unicode="&#xe936;" glyph-name="sync" d="M878.933 358.4c21.333-4.267 34.176-29.867 29.867-55.467-21.333-59.733-59.691-115.2-102.357-157.867-81.109-81.067-187.776-123.733-302.976-123.733s-221.867 42.667-294.357 123.733l-123.776 119.467v-157.867c0-25.6-17.067-42.667-42.667-42.667-25.557 0-42.667 17.067-42.667 42.667v268.8c0 4.267 4.267 4.267 4.267 8.533 4.309 0 4.309 4.267 4.309 4.267 0 4.267 4.224 8.533 8.533 8.533 0 4.267 4.224 4.267 4.224 4.267h4.267c0 4.267 4.309 4.267 8.533 4.267h256c25.643 0 42.667-17.067 42.667-42.667s-17.024-42.667-42.667-42.667h-149.333l119.467-110.933c68.309-68.267 153.643-102.4 243.2-102.4 89.643 0 179.2 34.133 238.976 98.133 38.357 34.133 64 81.067 81.024 128 8.533 21.333 34.133 34.133 55.467 25.6zM958.406 831.276c25.6 0 42.667-17.067 42.667-42.667v-260.267c0-4.267 0-8.533-4.267-12.8 0-4.267-4.267-4.267-4.267-8.533-4.267 0-4.267-4.267-4.267-4.267-4.267-4.267-8.533-4.267-12.8-8.533s-12.8-4.267-17.067-4.267h-256c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h149.333l-119.467 115.2c-34.133 38.4-81.067 64-128 81.067-85.333 29.867-179.2 25.6-260.267-12.8-81.067-42.667-145.067-110.933-174.933-196.267-8.533-21.333-34.133-34.133-55.467-25.6-21.333 4.267-34.133 29.867-25.6 51.2 38.4 110.933 115.2 196.267 217.6 243.2 102.4 51.2 217.6 55.467 328.533 21.333 59.733-21.333 115.2-59.733 157.867-102.4l123.733-119.467v157.867c0 25.6 17.067 42.667 42.667 42.667z" />
+<glyph unicode="&#xe937;" glyph-name="trash" d="M768 106.667c0-25.6-17.067-42.667-42.667-42.667h-426.667c-25.6 0-42.667 17.067-42.667 42.667v554.667h512v-554.667zM384 789.333c0 25.6 17.067 42.667 42.667 42.667h170.667c25.6 0 42.667-17.067 42.667-42.667v-42.667h-256v42.667zM896 746.667h-170.667v42.667c0 72.533-55.467 128-128 128h-170.667c-72.533 0-128-55.467-128-128v-42.667h-170.667c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h42.667v-554.667c0-72.533 55.467-128 128-128h426.667c72.533 0 128 55.467 128 128v554.667h42.667c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667zM426.667 191.996c25.6 0 42.667 17.067 42.667 42.667v256c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-256c0-25.6 17.067-42.667 42.667-42.667zM597.333 191.996c25.6 0 42.667 17.067 42.667 42.667v256c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-256c0-25.6 17.067-42.667 42.667-42.667z" />
+<glyph unicode="&#xe938;" glyph-name="undo" d="M955.733 588.856c-38.4 106.667-115.2 192-217.643 243.2-102.357 51.2-217.557 55.467-324.224 17.067-59.776-21.333-115.2-55.467-157.867-98.133l-128-119.467v157.867c0 25.6-17.109 42.667-42.667 42.667-25.6 0-42.667-17.067-42.667-42.667v-268.8c0-4.267 4.224-4.267 4.224-8.533 0 0 0-4.267 4.309-4.267 4.224-4.267 4.224-4.267 8.533-4.267l4.267-4.267h268.757c25.643 0 42.667 17.067 42.667 42.667s-8.533 34.133-34.091 34.133h-149.333l119.424 115.2c34.133 34.133 81.109 64 128 81.067 85.333 29.867 179.243 25.6 260.309-12.8 81.024-38.4 145.024-106.667 174.933-196.267 29.867-85.333 25.557-179.2-12.8-260.267-38.443-81.067-106.667-145.067-196.309-174.933-179.157-64-371.157 29.867-435.157 209.067-8.533 21.333-34.176 34.133-55.509 25.6s-34.133-34.133-25.557-55.467c64-174.933 230.4-285.867 405.333-285.867 46.891 0 93.867 8.533 140.757 25.6 221.909 76.8 341.333 320 260.309 541.867z" />
+<glyph unicode="&#xe939;" glyph-name="unlocked" d="M853.333 106.671c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v298.667c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-298.667zM810.667 533.338h-469.333v128c0 46.933 17.067 89.6 51.2 119.467 29.867 34.133 72.533 51.2 119.467 51.2 81.067 0 149.333-55.467 166.4-136.533 4.267-21.333 29.867-38.4 51.2-34.133s38.4 25.6 34.133 51.2c-25.6 119.467-132.267 204.8-251.733 204.8-68.267 0-132.267-25.6-179.2-76.8-51.2-46.933-76.8-110.933-76.8-179.2v-128h-42.667c-72.533 0-128-55.467-128-128v-298.667c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v298.667c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe93a;" glyph-name="upload" d="M896 277.333c25.6 0 42.667-17.067 42.667-42.667v-128c0-72.533-55.467-128-128-128h-597.333c-72.533 0-128 55.467-128 128v128c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-128c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v128c0 25.6 17.067 42.667 42.667 42.667zM371.2 675.189c-17.067-17.024-42.667-17.024-59.733 0-17.067 17.067-17.067 42.667 0 59.733l170.667 170.667c4.267 4.267 8.533 4.267 12.757 8.576 12.843 4.224 25.643 4.224 34.176 0 4.267 0 8.491-4.309 12.8-8.576l170.667-170.667c17.024-17.067 17.024-42.667 0-59.733-8.533-8.533-17.067-12.8-29.867-12.8s-21.333 4.267-29.867 12.8l-98.133 98.133v-494.933c0-25.557-17.109-42.667-42.667-42.667-25.6 0-42.667 17.109-42.667 42.667v494.933l-98.133-98.133z" />
+<glyph unicode="&#xe93b;" glyph-name="view" d="M510.933 149.333c-230.4 0-379.733 230.4-422.4 298.667 38.4 68.267 192 298.667 422.4 298.667s379.733-230.4 422.4-298.667c-42.667-68.267-192-298.667-422.4-298.667zM1018.667 465.067c-8.533 17.067-187.733 366.933-507.733 366.933s-499.2-349.867-507.733-366.933c-4.267-12.8-4.267-25.6 0-38.4 8.533-12.8 187.733-362.667 507.733-362.667s499.2 349.867 507.733 366.933c4.267 8.533 4.267 25.6 0 34.133zM512 362.667c-46.933 0-85.333 38.4-85.333 85.333s38.4 85.333 85.333 85.333c46.933 0 85.333-38.4 85.333-85.333s-38.4-85.333-85.333-85.333zM512 618.667c-93.867 0-170.667-76.8-170.667-170.667s76.8-170.667 170.667-170.667c93.867 0 170.667 76.8 170.667 170.667s-76.8 170.667-170.667 170.667z" />
+<glyph unicode="&#xe93c;" glyph-name="X_f" d="M512 917.333c260.267 0 469.333-209.067 469.333-469.333s-209.067-469.333-469.333-469.333c-260.267 0-469.333 209.067-469.333 469.333s209.067 469.333 469.333 469.333zM651.055 605.894c-17.067 17.024-42.667 17.024-59.733 0l-98.133-98.133-98.133 98.133c-17.067 17.024-42.667 17.024-59.733 0-17.067-17.067-17.067-42.667 0-59.733l98.091-98.133-98.091-98.133c-17.067-17.067-17.067-42.667 0-59.733 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8l98.133 98.091 98.133-98.091c8.533-8.576 21.333-12.8 29.867-12.8s21.333 4.224 29.867 12.8c17.024 17.067 17.024 42.667 0 59.733l-98.133 98.133 98.133 98.133c17.024 17.067 17.024 42.667 0 59.733z" />
+<glyph unicode="&#xe93d;" glyph-name="X_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM651.055 605.894c-17.067 17.024-42.667 17.024-59.733 0l-98.133-98.133-98.133 98.133c-17.067 17.024-42.667 17.024-59.733 0-17.067-17.067-17.067-42.667 0-59.733l98.091-98.133-98.091-98.133c-17.067-17.067-17.067-42.667 0-59.733 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8l98.133 98.091 98.133-98.091c8.533-8.576 21.333-12.8 29.867-12.8s21.333 4.224 29.867 12.8c17.024 17.067 17.024 42.667 0 59.733l-98.133 98.133 98.133 98.133c17.024 17.067 17.024 42.667 0 59.733z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/vid-webpack-master/src/assets/fonts/icomoon.ttf b/vid-webpack-master/src/assets/fonts/icomoon.ttf
new file mode 100644 (file)
index 0000000..4d82ec0
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/icomoon.ttf differ
diff --git a/vid-webpack-master/src/assets/fonts/icomoon.woff b/vid-webpack-master/src/assets/fonts/icomoon.woff
new file mode 100644 (file)
index 0000000..451aaa8
Binary files /dev/null and b/vid-webpack-master/src/assets/fonts/icomoon.woff differ
diff --git a/vid-webpack-master/src/assets/img/Menu.svg b/vid-webpack-master/src/assets/img/Menu.svg
new file mode 100644 (file)
index 0000000..5b037bb
--- /dev/null
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="menu-a" d="M6.55555556,13.1111111 C5.69644594,13.1111111 5,12.4146652 5,11.5555556 C5,10.6964459 5.69644594,10 6.55555556,10 C7.41466517,10 8.11111111,10.6964459 8.11111111,11.5555556 C8.11111111,12.4146652 7.41466517,13.1111111 6.55555556,13.1111111 Z M17.4444444,13.1111111 C16.5853348,13.1111111 15.8888889,12.4146652 15.8888889,11.5555556 C15.8888889,10.6964459 16.5853348,10 17.4444444,10 C18.3035541,10 19,10.6964459 19,11.5555556 C19,12.4146652 18.3035541,13.1111111 17.4444444,13.1111111 Z M12,13.1111111 C11.1408904,13.1111111 10.4444444,12.4146652 10.4444444,11.5555556 C10.4444444,10.6964459 11.1408904,10 12,10 C12.8591096,10 13.5555556,10.6964459 13.5555556,11.5555556 C13.5555556,12.4146652 12.8591096,13.1111111 12,13.1111111 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd">
+    <use fill="#000" transform="rotate(90 12 11.556)" xlink:href="#menu-a"/>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/UPLOAD.svg b/vid-webpack-master/src/assets/img/UPLOAD.svg
new file mode 100644 (file)
index 0000000..85ff7e3
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="121px" height="121px" viewBox="0 0 121 121" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
+    <title>Combined Shape</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <linearGradient x1="78.7695312%" y1="73.9666898%" x2="20.3450521%" y2="7.42778616%" id="linearGradient-1">
+            <stop stop-color="#8C1DF3" offset="0%"></stop>
+            <stop stop-color="#E77DE8" offset="100%"></stop>
+        </linearGradient>
+    </defs>
+    <g id="VID_Deployment_5" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-1065.000000, -322.000000)">
+        <path d="M1125.5,443 C1092.08677,443 1065,415.913227 1065,382.5 C1065,349.086773 1092.08677,322 1125.5,322 C1158.91323,322 1186,349.086773 1186,382.5 C1186,415.913227 1158.91323,443 1125.5,443 Z M1125.5,439 C1156.70409,439 1182,413.704088 1182,382.5 C1182,351.295912 1156.70409,326 1125.5,326 C1094.29591,326 1069,351.295912 1069,382.5 C1069,413.704088 1094.29591,439 1125.5,439 Z M1131.83333,355 C1142.33333,355 1150.88889,363.576271 1150.88889,374.101695 C1156.72222,375.738983 1161,381.040678 1161,387.355932 C1161,394.918644 1154.93333,401 1147.38889,401 L1147,401 L1138.75556,401 L1131.75556,401 C1127.71111,401 1124.36667,397.647458 1124.36667,393.59322 L1124.36667,391.644068 L1124.36667,387.433898 L1124.36667,381.274576 L1119.62222,386.732203 C1118.92222,387.511864 1117.67778,387.589831 1116.9,386.888136 C1116.12222,386.186441 1116.04444,384.938983 1116.74444,384.159322 L1124.44444,375.271186 L1124.91111,374.725424 C1125.68889,373.867797 1127.08889,373.867797 1127.86667,374.725424 L1128.33333,375.349153 L1135.95556,384.081356 C1136.65556,384.861017 1136.57778,386.108475 1135.8,386.810169 C1135.02222,387.511864 1133.77778,387.433898 1133.07778,386.654237 L1128.33333,381.19661 L1128.33333,387.355932 L1128.33333,391.644068 L1128.33333,393.59322 C1128.33333,395.542373 1129.88889,397.101695 1131.83333,397.101695 L1133.77778,397.101695 L1147,397.101695 L1147.38889,397.101695 C1152.75556,397.101695 1157.11111,392.735593 1157.11111,387.355932 C1157.11111,382.911864 1154.15556,379.013559 1149.87778,377.844068 C1148.16667,377.376271 1147,375.816949 1147,374.101695 C1147,365.681356 1140.23333,358.898305 1131.83333,358.976271 C1126.93333,358.976271 1122.34444,361.315254 1119.54444,365.213559 C1118.45556,366.694915 1116.51111,367.240678 1114.8,366.461017 C1114.02222,366.071186 1113.24444,365.915254 1112.38889,365.915254 C1109.2,365.915254 1106.55556,368.566102 1106.55556,371.762712 C1106.55556,372.152542 1106.63333,372.620339 1106.71111,373.010169 C1107.17778,375.271186 1105.62222,377.376271 1103.36667,377.688136 C1098.54444,378.311864 1094.88889,382.444068 1094.88889,387.355932 C1094.88889,392.735593 1099.24444,397.101695 1104.61111,397.101695 L1105,397.101695 L1117.05556,397.101695 C1118.14444,397.101695 1119,397.959322 1119,399.050847 C1119,400.142373 1118.14444,401 1117.05556,401 L1104.61111,401 C1097.06667,401 1091,394.918644 1091,387.355932 C1091,381.19661 1095.04444,376.050847 1100.64444,374.257627 L1102.9,373.789831 L1102.66667,372.152542 L1102.66667,371.762712 C1102.66667,366.383051 1107.02222,362.016949 1112.38889,362.016949 C1113.86667,362.016949 1115.18889,362.328814 1116.43333,362.874576 C1119.85556,358.118644 1125.45556,355 1131.83333,355 Z" id="Combined-Shape" fill="url(#linearGradient-1)" fill-rule="nonzero"></path>
+    </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/X_o.svg b/vid-webpack-master/src/assets/img/X_o.svg
new file mode 100644 (file)
index 0000000..a323c19
--- /dev/null
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="x_o-a" d="M12,21 C7,21 3,17 3,12 C3,7 7,3 12,3 C17,3 21,7 21,12 C21,17 17,21 12,21 M12,1 C5.9,1 1,5.9 1,12 C1,18.1 5.9,23 12,23 C18.1,23 23,18.1 23,12 C23,5.9 18.1,1 12,1 M15.2591,8.29935 C14.8591,7.90035 14.2591,7.90035 13.8591,8.29935 L11.5591,10.59935 L9.2591,8.29935 C8.8591,7.90035 8.2591,7.90035 7.8591,8.29935 C7.4591,8.69935 7.4591,9.29935 7.8591,9.69935 L10.1581,11.99935 L7.8591,14.29935 C7.4591,14.69935 7.4591,15.29935 7.8591,15.69935 C8.0591,15.90035 8.2591,15.99935 8.5591,15.99935 C8.8591,15.99935 9.0591,15.90035 9.2591,15.69935 L11.5591,13.40035 L13.8591,15.69935 C14.0591,15.90035 14.3591,15.99935 14.5591,15.99935 C14.7591,15.99935 15.0591,15.90035 15.2591,15.69935 C15.6581,15.29935 15.6581,14.69935 15.2591,14.29935 L12.9591,11.99935 L15.2591,9.69935 C15.6581,9.29935 15.6581,8.69935 15.2591,8.29935"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd">
+    <use fill="#000" xlink:href="#x_o-a"/>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/angular.png b/vid-webpack-master/src/assets/img/angular.png
new file mode 100644 (file)
index 0000000..a1d9790
Binary files /dev/null and b/vid-webpack-master/src/assets/img/angular.png differ
diff --git a/vid-webpack-master/src/assets/img/chevron.svg b/vid-webpack-master/src/assets/img/chevron.svg
new file mode 100644 (file)
index 0000000..5718cb0
--- /dev/null
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="chevron-a" d="M11.2998,15.7002 C11.4998,15.9002 11.7998,16.0002 11.9998,16.0002 C12.1998,16.0002 12.4998,15.9002 12.6998,15.7002 L17.6998,10.7002 C18.0998,10.3002 18.0998,9.7002 17.6998,9.3002 C17.2998,8.9002 16.6998,8.9002 16.2998,9.3002 L11.9998,13.6002 L7.6998,9.3002 C7.2998,8.9002 6.6998,8.9002 6.2998,9.3002 C5.8998,9.7002 5.8998,10.3002 6.2998,10.7002 L11.2998,15.7002 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd">
+    <use fill="#000" xlink:href="#chevron-a"/>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/fail.svg b/vid-webpack-master/src/assets/img/fail.svg
new file mode 100644 (file)
index 0000000..87c1baa
--- /dev/null
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="fail-a" d="M13.5996,12 L19.6576,5.942 C20.1146,5.485 20.1146,4.8 19.6576,4.343 C19.2006,3.886 18.5146,3.886 18.0576,4.343 L11.9996,10.4 L5.9426,4.343 C5.4856,3.886 4.7996,3.886 4.3426,4.343 C3.8856,4.8 3.8856,5.485 4.3426,5.942 L10.4006,12 L4.3426,18.058 C3.8856,18.515 3.8856,19.2 4.3426,19.657 C4.5716,19.886 4.7996,20 5.1426,20 C5.4856,20 5.7136,19.886 5.9426,19.657 L11.9996,13.6 L18.0576,19.657 C18.2866,19.886 18.6286,20 18.8576,20 C19.0856,20 19.4286,19.886 19.6576,19.657 C20.1146,19.2 20.1146,18.515 19.6576,18.058 L13.5996,12 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd">
+    <use fill="#000" xlink:href="#fail-a"/>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/favicon.ico b/vid-webpack-master/src/assets/img/favicon.ico
new file mode 100644 (file)
index 0000000..8081c7c
Binary files /dev/null and b/vid-webpack-master/src/assets/img/favicon.ico differ
diff --git a/vid-webpack-master/src/assets/img/inprogress.svg b/vid-webpack-master/src/assets/img/inprogress.svg
new file mode 100644 (file)
index 0000000..b893c62
--- /dev/null
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="inprogress-a" d="M14.8892528,0.000671665369 C14.6521255,0.0231479869 14.4508328,0.188370906 14.3774086,0.420798226 L13.9586266,1.71936929 C13.8342077,1.78596816 13.7105976,1.8521637 13.5956824,1.92943257 L12.2834996,1.66207763 C12.0324878,1.61103505 11.7777494,1.73018631 11.6506739,1.95807534 L10.7572728,3.54309549 C10.6298181,3.76875487 10.6559818,4.05253533 10.8224168,4.24967115 L11.6785927,5.25224451 C11.6738947,5.33490337 11.6692867,5.41630641 11.6692867,5.50050222 C11.6692867,5.58469803 11.6738947,5.66610107 11.6785927,5.74875688 L10.8224168,6.75133024 C10.6559818,6.94846606 10.6298181,7.23224652 10.7572728,7.45790589 L11.6506739,9.04292605 C11.7777485,9.27081625 12.0324871,9.38996883 12.2834996,9.33892681 L13.5956824,9.07157188 C13.7105976,9.14883769 13.8342077,9.21503628 13.9586266,9.28163516 L14.3774086,10.5802001 C14.4580219,10.831579 14.687164,11.0011661 14.9450903,11.0003389 L16.7318925,11.0003389 C16.9898188,11.0011662 17.2189611,10.8315791 17.2995745,10.5802001 L17.7183562,9.28163516 C17.8427751,9.21503628 17.9663852,9.14883769 18.0813004,9.07157188 L19.3934831,9.33892681 C19.6444956,9.38996883 19.8992343,9.27081625 20.0263089,9.04292605 L20.91971,7.45790589 C21.0471647,7.23224659 21.0210012,6.94846612 20.8545662,6.75133024 L19.9983903,5.74875688 C20.0030883,5.66610107 20.0076963,5.58469803 20.0076963,5.50050222 C20.0076963,5.41630641 20.0030883,5.33490337 19.9983903,5.25224451 L20.8545662,4.24967115 C21.0210012,4.05253526 21.0471647,3.7687548 20.91971,3.54309549 L20.0263089,1.95807534 C19.8992334,1.73018631 19.644495,1.61103505 19.3934831,1.66207763 L18.0813004,1.92943257 C17.9663852,1.8521637 17.8427751,1.78596816 17.7183562,1.71936929 L17.2995745,0.420798226 C17.2189569,0.16942403 16.9898156,-0.000157392525 16.7318925,0.000671665369 L14.9450903,0.000671665369 C14.926488,-0.000223888456 14.9078551,-0.000223888456 14.8892528,0.000671665369 Z M15.3731785,1.22285691 L16.3038045,1.22285691 L16.6574424,2.31136469 C16.7113318,2.47938794 16.8335313,2.61521378 16.9924677,2.68374821 C17.2120208,2.77902652 17.42616,2.91137176 17.6252935,3.06568034 C17.7626503,3.1743391 17.939345,3.21617551 18.1092192,3.18026058 L19.2166641,2.95110009 L19.6819773,3.77225599 L18.9374763,4.64115188 C18.8235917,4.77112577 18.7693918,4.9449068 18.7885762,5.1185701 C18.8040892,5.24530229 18.8164942,5.36935475 18.8164942,5.50050222 C18.8164942,5.63164969 18.8040862,5.7556991 18.7885762,5.88243435 C18.7693927,6.05609662 18.8235925,6.22987636 18.9374763,6.3598495 L19.6819773,7.22874845 L19.2166641,8.0499013 L18.1092192,7.82074386 C17.939345,7.78482893 17.7626503,7.82666535 17.6252935,7.93532411 C17.42616,8.08963268 17.2120208,8.22197792 16.9924677,8.31725623 C16.8335313,8.38579066 16.7113318,8.52161651 16.6574424,8.68963975 L16.3038045,9.77814753 L15.3731785,9.77814753 L15.0195403,8.68963975 C14.965651,8.52161651 14.8434514,8.38579066 14.684515,8.31725623 C14.464962,8.22197792 14.2508231,8.08963268 14.0516892,7.93532411 C13.9143325,7.82666543 13.737638,7.78482902 13.5677638,7.82074386 L12.4603186,8.0499013 L11.9950055,7.22874845 L12.7395065,6.3598495 C12.8533903,6.22987636 12.9075901,6.05609662 12.8884066,5.88243435 C12.8728936,5.7556991 12.8604886,5.63164969 12.8604886,5.50050222 C12.8604886,5.36935475 12.8728936,5.24530229 12.8884066,5.1185701 C12.907591,4.9449068 12.8533911,4.77112577 12.7395065,4.64115188 L11.9950055,3.77225599 L12.4603186,2.95110009 L13.5677638,3.18026058 C13.737638,3.21617542 13.9143325,3.17433901 14.0516892,3.06568034 C14.2508231,2.91137176 14.464962,2.77902652 14.684515,2.68374821 C14.8434514,2.61521378 14.965651,2.47938794 15.0195403,2.31136469 L15.3731785,1.22285691 Z M15.8384914,3.66722435 C14.8516677,3.66722435 14.0516892,4.48801053 14.0516892,5.50050222 C14.0516892,6.51299391 14.8516677,7.33378009 15.8384914,7.33378009 C16.8253151,7.33378009 17.6252935,6.51299391 17.6252935,5.50050222 C17.6252935,4.48801053 16.8253151,3.66722435 15.8384914,3.66722435 Z M15.8384914,4.8894096 C16.167433,4.8894096 16.4340923,5.16300397 16.4340923,5.50050222 C16.4340923,5.83800047 16.167433,6.11159484 15.8384914,6.11159484 C15.5095497,6.11159484 15.2428908,5.83800047 15.2428908,5.50050222 C15.2428908,5.16300397 15.5095497,4.8894096 15.8384914,4.8894096 Z M5.35964143,7.94486966 C5.11761178,7.97028968 4.91497592,8.14417554 4.84779714,8.38409344 L4.39179031,10.007308 C4.08554756,10.1523124 3.79769239,10.3245113 3.52630811,10.5229085 L1.93493719,10.1123397 C1.67706155,10.0458059 1.40743723,10.1626959 1.27419282,10.3987918 L0.0829912853,12.5185218 C-0.0533731038,12.7550456 -0.0191039055,13.0558665 0.166747618,13.2537494 L1.29280541,14.4377158 C1.27376142,14.6131658 1.24627395,14.7832685 1.24627395,14.9724379 C1.24627395,15.1616073 1.27375992,15.3316489 1.29280541,15.5071294 L0.166747618,16.6911263 C-0.0191039055,16.8890093 -0.0533731038,17.1898302 0.0829912853,17.4263539 L1.27419282,19.546084 C1.40744436,19.7821705 1.67706707,19.8990499 1.93493719,19.8325117 L3.52630811,19.4219368 C3.79769239,19.6203339 4.08554756,19.792545 4.39179031,19.9375616 L4.84779714,21.560764 C4.92177045,21.8197002 5.15249473,21.99822 5.41547888,22 L7.79788196,22 C8.06086612,21.99822 8.2915904,21.8197002 8.3655637,21.560764 L8.82157054,19.9375616 C9.12781329,19.792545 9.41566816,19.6203339 9.68705274,19.4219368 L11.2784234,19.8325117 C11.5362936,19.8990501 11.8059165,19.7821706 11.939168,19.546084 L13.1303696,17.4263539 C13.2667339,17.1898302 13.2324648,16.8890093 13.0466132,16.6911263 L11.9205554,15.5071294 C11.9395994,15.3316489 11.9670869,15.1616073 11.9670869,14.9724379 C11.9670869,14.7832685 11.9396009,14.6131658 11.9205554,14.4377158 L13.0466132,13.2537494 C13.2324648,13.0558665 13.2667339,12.7550456 13.1303696,12.5185218 L11.939168,10.3987918 C11.8059236,10.1626958 11.5362991,10.0458057 11.2784234,10.1123397 L9.68705274,10.5229085 C9.41566816,10.3245113 9.12781329,10.1523124 8.82157054,10.007308 L8.3655637,8.38409344 C8.29158606,8.12516208 8.06086282,7.94664809 7.79788196,7.94486966 L5.41547888,7.94486966 C5.39687663,7.94397411 5.37824368,7.94397411 5.35964143,7.94486966 Z M5.86217942,9.16705491 L7.35118142,9.16705491 L7.7513505,10.5802001 C7.80203034,10.7630316 7.93273801,10.9112601 8.10498841,10.9812417 C8.51151269,11.1422694 8.89628488,11.3716194 9.23104591,11.6496137 C9.37749002,11.7698658 9.5705857,11.812321 9.75219678,11.764197 L11.1388296,11.4109138 L11.8740243,12.7190273 L10.8782543,13.7789076 C10.7474487,13.9183714 10.6887629,14.1131648 10.7200479,14.3040353 C10.7555607,14.5348213 10.7758854,14.7535074 10.7758854,14.9724379 C10.7758854,15.1913378 10.7555604,15.4100239 10.7200479,15.6408099 C10.688753,15.8316904 10.7474395,16.0264975 10.8782543,16.1659681 L11.8740243,17.2258484 L11.1388296,18.533962 L9.75219678,18.1806787 C9.5705857,18.1325548 9.37749002,18.17501 9.23104591,18.295262 C8.89628488,18.5732259 8.51151269,18.8026064 8.10498841,18.9636341 C7.93274488,19.0336094 7.80203841,19.1818252 7.7513505,19.3646451 L7.35118142,20.7778086 L5.86217942,20.7778086 L5.46201035,19.3646451 C5.41132243,19.1818252 5.28061596,19.0336094 5.10837243,18.9636341 C4.70184816,18.8026064 4.31707597,18.5732259 3.98231464,18.295262 C3.83587059,18.1750101 3.64277505,18.1325549 3.46116406,18.1806787 L2.07453128,18.533962 L1.33933657,17.2258484 L2.33510657,16.1659681 C2.46592132,16.0264975 2.52460786,15.8316904 2.49331294,15.6408099 C2.45779987,15.4100239 2.43747549,15.1913378 2.43747549,14.9724379 C2.43747549,14.7535074 2.45780047,14.5348213 2.49331294,14.3040353 C2.52459797,14.1131648 2.46591214,13.9183714 2.33510657,13.7789076 L1.33933657,12.7190273 L2.07453128,11.4109138 L3.46116406,11.764197 C3.64277505,11.8123209 3.83587059,11.7698657 3.98231464,11.6496137 C4.31707597,11.3716194 4.70184816,11.1422694 5.10837243,10.9812417 C5.28062283,10.9112601 5.4113305,10.7630316 5.46201035,10.5802001 L5.86217942,9.16705491 Z M6.60668042,12.2225302 C5.13349981,12.2225302 3.92647718,13.460916 3.92647718,14.9724379 C3.92647718,16.4839292 5.13349981,17.7223455 6.60668042,17.7223455 C8.07986133,17.7223455 9.28688366,16.4839292 9.28688366,14.9724379 C9.28688366,13.460916 8.07986133,12.2225302 6.60668042,12.2225302 Z M6.60668042,13.444691 C7.43608795,13.444691 8.09568212,14.1214659 8.09568212,14.9724379 C8.09568212,15.8234099 7.43608795,16.5001542 6.60668042,16.5001542 C5.77727289,16.5001542 5.11767872,15.8234099 5.11767872,14.9724379 C5.11767872,14.1214659 5.77727289,13.444691 6.60668042,13.444691 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd" transform="translate(1 1)">
+    <mask id="inprogress-b" fill="#fff">
+      <use xlink:href="#inprogress-a"/>
+    </mask>
+    <use fill="#959595" fill-rule="nonzero" xlink:href="#inprogress-a"/>
+    <g fill="#5A5A5A" mask="url(#inprogress-b)">
+      <rect width="35" height="35" transform="translate(-4 -2)"/>
+    </g>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/pause.svg b/vid-webpack-master/src/assets/img/pause.svg
new file mode 100644 (file)
index 0000000..f1f9b79
--- /dev/null
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="pause-a" d="M12,21 C7,21 3,17 3,12 C3,7 7,3 12,3 C17,3 21,7 21,12 C21,17 17,21 12,21 M12,1 C18.1,1 23,5.9 23,12 C23,18.101 18.1,23 12,23 C5.9,23 1,18.101 1,12 C1,5.9 5.9,1 12,1 Z M13.9580566,7.47058824 C13.4173947,7.47058824 12.9791016,7.90888135 12.9791016,8.44954331 L12.9791016,15.5504567 C12.9791016,16.0911186 13.4173947,16.5294118 13.9580566,16.5294118 C14.4987186,16.5294118 14.9370117,16.0911186 14.9370117,15.5504567 L14.9370117,8.44954331 C14.9370117,7.90888135 14.4987186,7.47058824 13.9580566,7.47058824 Z M10.0211914,7.47058824 C9.48052945,7.47058824 9.04223633,7.90888135 9.04223633,8.44954331 L9.04223633,15.5504567 C9.04223633,16.0911186 9.48052945,16.5294118 10.0211914,16.5294118 C10.5618534,16.5294118 11.0001465,16.0911186 11.0001465,15.5504567 L11.0001465,8.44954331 C11.0001465,7.90888135 10.5618534,7.47058824 10.0211914,7.47058824 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd">
+    <mask id="pause-b" fill="#fff">
+      <use xlink:href="#pause-a"/>
+    </mask>
+    <use fill="#191919" xlink:href="#pause-a"/>
+    <g mask="url(#pause-b)">
+      <rect width="35" height="35" fill="#5A5A5A" transform="translate(-5 -5)"/>
+    </g>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/pending.svg b/vid-webpack-master/src/assets/img/pending.svg
new file mode 100644 (file)
index 0000000..78c9960
--- /dev/null
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="pending-a" d="M11,20 C6,20 2,16 2,11 C2,6 6,2 11,2 C16,2 20,6 20,11 C20,16 16,20 11,20 M11,0 C17.1,0 22,4.9 22,11 C22,17.1 17.1,22 11,22 C4.9,22 0,17.1 0,11 C0,4.9 4.9,0 11,0 Z M11.0488812,10.5380604 L7.75288116,6.34206037 C7.38888116,5.92506037 6.75588116,5.88406037 6.34188116,6.24806037 C5.92588116,6.61206037 5.88388116,7.24306037 6.24688116,7.65906037 L10.2468812,12.6590604 C10.4298812,12.8670604 10.6898812,12.9910604 10.9668812,13.0000604 C10.9778812,13.0010604 10.9888812,13.0010604 10.9998812,13.0010604 C11.2648812,13.0010604 11.5198812,12.8960604 11.7068812,12.7080604 L14.7068812,10.7080604 C15.0978812,10.3170604 15.0978812,9.68406037 14.7068812,9.29406037 C14.3158812,8.90306037 13.6838812,8.90306037 13.2928812,9.29406037 L11.0488812,10.5380604 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd" transform="translate(1 1)">
+    <mask id="pending-b" fill="#fff">
+      <use xlink:href="#pending-a"/>
+    </mask>
+    <use fill="#000" xlink:href="#pending-a"/>
+    <g fill="#5A5A5A" mask="url(#pending-b)">
+      <rect width="30" height="30" transform="translate(-2 -1)"/>
+    </g>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/stoped.svg b/vid-webpack-master/src/assets/img/stoped.svg
new file mode 100644 (file)
index 0000000..0198f15
--- /dev/null
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="stoped-a" d="M14,7 L8,7 C7.4,7 7,7.4 7,8 L7,14 C7,14.6 7.4,15 8,15 L14,15 C14.6,15 15,14.6 15,14 L15,8 C15,7.4 14.6,7 14,7 Z M11,0 C4.9,0 0,4.9 0,11 C0,17.1 4.9,22 11,22 C17.1,22 22,17.1 22,11 C22,4.9 17.1,0 11,0 Z M11,20 C6,20 2,16 2,11 C2,6 6,2 11,2 C16,2 20,6 20,11 C20,16 16,20 11,20 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd" transform="translate(1 1)">
+    <mask id="stoped-b" fill="#fff">
+      <use xlink:href="#stoped-a"/>
+    </mask>
+    <use fill="#191919" fill-rule="nonzero" xlink:href="#stoped-a"/>
+    <g fill="#5A5A5A" mask="url(#stoped-b)">
+      <rect width="30" height="30" transform="translate(-4 -4)"/>
+    </g>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/assets/img/success+Circle.svg b/vid-webpack-master/src/assets/img/success+Circle.svg
new file mode 100644 (file)
index 0000000..72d75ae
--- /dev/null
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24">
+  <defs>
+    <path id="success+circle-a" d="M20.0874369,8.68675849 C20.6613636,8.68675849 21.0439815,9.06859403 21.0439815,9.64134733 L21.0439815,10.5004773 C21.0439815,16.3234692 16.3569129,21 10.5219907,21 C4.6870686,21 0,16.3234692 0,10.5004773 C0,4.67748534 4.6870686,0 10.5219907,0 C12.0524621,0 13.487279,0.381835538 14.8264415,0.954588845 C15.3047138,1.14550661 15.4960227,1.71825992 15.3047138,2.19555434 C15.1134049,2.67284877 14.5394781,2.86376653 14.0612058,2.67284877 C12.9133523,2.19555434 11.7654987,1.90917769 10.5219907,1.90917769 C5.73926768,1.90917769 1.91308923,5.72753307 1.91308923,10.5004773 C1.91308923,15.2724669 5.73926768,19.0908223 10.5219907,19.0908223 C15.3047138,19.0908223 19.1308923,15.2724669 19.1308923,10.5004773 L19.1308923,9.64134733 C19.1308923,9.06859403 19.5135101,8.68675849 20.0874369,8.68675849 Z M21.713754,1.24067912 C22.0954153,1.62251466 22.0954153,2.19526797 21.713754,2.5771035 L11.1917633,13.0775808 C11.0004544,13.2684986 10.713491,13.3639575 10.5221821,13.3639575 C10.3308731,13.3639575 10.0439097,13.2684986 9.85260082,13.0775808 L6.98296698,10.2138143 C6.60034914,9.83197873 6.60034914,9.25922542 6.98296698,8.87738988 C7.36558483,8.49555434 7.9395116,8.49555434 8.32212944,8.87738988 L10.5221821,11.0729442 L20.3745916,1.24067912 C20.7572094,0.858843584 21.3311362,0.858843584 21.713754,1.24067912 Z"/>
+  </defs>
+  <g fill="none" fill-rule="evenodd" transform="translate(1 1)">
+    <mask id="success+circle-b" fill="#fff">
+      <use xlink:href="#success+circle-a"/>
+    </mask>
+    <use fill="#000" xlink:href="#success+circle-a"/>
+    <g fill="#5A5A5A" mask="url(#success+circle-b)">
+      <rect width="29" height="29"/>
+    </g>
+  </g>
+</svg>
diff --git a/vid-webpack-master/src/environments/environment.prod.ts b/vid-webpack-master/src/environments/environment.prod.ts
new file mode 100644 (file)
index 0000000..3612073
--- /dev/null
@@ -0,0 +1,3 @@
+export const environment = {
+  production: true
+};
diff --git a/vid-webpack-master/src/environments/environment.ts b/vid-webpack-master/src/environments/environment.ts
new file mode 100644 (file)
index 0000000..b7f639a
--- /dev/null
@@ -0,0 +1,8 @@
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `.angular-cli.json`.
+
+export const environment = {
+  production: false
+};
diff --git a/vid-webpack-master/src/index.html b/vid-webpack-master/src/index.html
new file mode 100644 (file)
index 0000000..f3c3a91
--- /dev/null
@@ -0,0 +1,12 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Angular 2 App | ng2-webpack</title>
+  <link rel="icon" type="image/x-icon" href="./assets/img/favicon.ico">
+  <base href="./">
+</head>
+<body>
+<vid-app>Loading..</vid-app>
+</body>
+</html>
diff --git a/vid-webpack-master/src/main.ts b/vid-webpack-master/src/main.ts
new file mode 100644 (file)
index 0000000..a9ca1ca
--- /dev/null
@@ -0,0 +1,11 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/vid-webpack-master/src/polyfills.ts b/vid-webpack-master/src/polyfills.ts
new file mode 100644 (file)
index 0000000..6fb2c40
--- /dev/null
@@ -0,0 +1,66 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+import 'core-js/es6/symbol';
+import 'core-js/es6/object';
+import 'core-js/es6/function';
+import 'core-js/es6/parse-int';
+import 'core-js/es6/parse-float';
+import 'core-js/es6/number';
+import 'core-js/es6/math';
+import 'core-js/es6/string';
+import 'core-js/es6/date';
+import 'core-js/es6/array';
+import 'core-js/es6/regexp';
+import 'core-js/es6/map';
+import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js';
+
+/** IE10 and IE11 requires the following to support `@angular/animation`. */
+//import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+/** Evergreen browsers require these. **/
+import 'core-js/es6/reflect';
+import 'core-js/es7/reflect';
+
+
+/** ALL Firefox browsers require the following to support `@angular/animation`. **/
+//import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone';  // Included with Angular CLI.
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+//import 'intl';  // Run `npm install --save intl`.
diff --git a/vid-webpack-master/src/public/img/UPLOAD.svg b/vid-webpack-master/src/public/img/UPLOAD.svg
new file mode 100644 (file)
index 0000000..85ff7e3
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="121px" height="121px" viewBox="0 0 121 121" version="1.1" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
+    <title>Combined Shape</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <linearGradient x1="78.7695312%" y1="73.9666898%" x2="20.3450521%" y2="7.42778616%" id="linearGradient-1">
+            <stop stop-color="#8C1DF3" offset="0%"></stop>
+            <stop stop-color="#E77DE8" offset="100%"></stop>
+        </linearGradient>
+    </defs>
+    <g id="VID_Deployment_5" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-1065.000000, -322.000000)">
+        <path d="M1125.5,443 C1092.08677,443 1065,415.913227 1065,382.5 C1065,349.086773 1092.08677,322 1125.5,322 C1158.91323,322 1186,349.086773 1186,382.5 C1186,415.913227 1158.91323,443 1125.5,443 Z M1125.5,439 C1156.70409,439 1182,413.704088 1182,382.5 C1182,351.295912 1156.70409,326 1125.5,326 C1094.29591,326 1069,351.295912 1069,382.5 C1069,413.704088 1094.29591,439 1125.5,439 Z M1131.83333,355 C1142.33333,355 1150.88889,363.576271 1150.88889,374.101695 C1156.72222,375.738983 1161,381.040678 1161,387.355932 C1161,394.918644 1154.93333,401 1147.38889,401 L1147,401 L1138.75556,401 L1131.75556,401 C1127.71111,401 1124.36667,397.647458 1124.36667,393.59322 L1124.36667,391.644068 L1124.36667,387.433898 L1124.36667,381.274576 L1119.62222,386.732203 C1118.92222,387.511864 1117.67778,387.589831 1116.9,386.888136 C1116.12222,386.186441 1116.04444,384.938983 1116.74444,384.159322 L1124.44444,375.271186 L1124.91111,374.725424 C1125.68889,373.867797 1127.08889,373.867797 1127.86667,374.725424 L1128.33333,375.349153 L1135.95556,384.081356 C1136.65556,384.861017 1136.57778,386.108475 1135.8,386.810169 C1135.02222,387.511864 1133.77778,387.433898 1133.07778,386.654237 L1128.33333,381.19661 L1128.33333,387.355932 L1128.33333,391.644068 L1128.33333,393.59322 C1128.33333,395.542373 1129.88889,397.101695 1131.83333,397.101695 L1133.77778,397.101695 L1147,397.101695 L1147.38889,397.101695 C1152.75556,397.101695 1157.11111,392.735593 1157.11111,387.355932 C1157.11111,382.911864 1154.15556,379.013559 1149.87778,377.844068 C1148.16667,377.376271 1147,375.816949 1147,374.101695 C1147,365.681356 1140.23333,358.898305 1131.83333,358.976271 C1126.93333,358.976271 1122.34444,361.315254 1119.54444,365.213559 C1118.45556,366.694915 1116.51111,367.240678 1114.8,366.461017 C1114.02222,366.071186 1113.24444,365.915254 1112.38889,365.915254 C1109.2,365.915254 1106.55556,368.566102 1106.55556,371.762712 C1106.55556,372.152542 1106.63333,372.620339 1106.71111,373.010169 C1107.17778,375.271186 1105.62222,377.376271 1103.36667,377.688136 C1098.54444,378.311864 1094.88889,382.444068 1094.88889,387.355932 C1094.88889,392.735593 1099.24444,397.101695 1104.61111,397.101695 L1105,397.101695 L1117.05556,397.101695 C1118.14444,397.101695 1119,397.959322 1119,399.050847 C1119,400.142373 1118.14444,401 1117.05556,401 L1104.61111,401 C1097.06667,401 1091,394.918644 1091,387.355932 C1091,381.19661 1095.04444,376.050847 1100.64444,374.257627 L1102.9,373.789831 L1102.66667,372.152542 L1102.66667,371.762712 C1102.66667,366.383051 1107.02222,362.016949 1112.38889,362.016949 C1113.86667,362.016949 1115.18889,362.328814 1116.43333,362.874576 C1119.85556,358.118644 1125.45556,355 1131.83333,355 Z" id="Combined-Shape" fill="url(#linearGradient-1)" fill-rule="nonzero"></path>
+    </g>
+</svg>
diff --git a/vid-webpack-master/src/public/img/angular.png b/vid-webpack-master/src/public/img/angular.png
new file mode 100644 (file)
index 0000000..a1d9790
Binary files /dev/null and b/vid-webpack-master/src/public/img/angular.png differ
diff --git a/vid-webpack-master/src/public/img/favicon.ico b/vid-webpack-master/src/public/img/favicon.ico
new file mode 100644 (file)
index 0000000..8081c7c
Binary files /dev/null and b/vid-webpack-master/src/public/img/favicon.ico differ
diff --git a/vid-webpack-master/src/public/img/spinner.gif b/vid-webpack-master/src/public/img/spinner.gif
new file mode 100644 (file)
index 0000000..8ed30cb
Binary files /dev/null and b/vid-webpack-master/src/public/img/spinner.gif differ
diff --git a/vid-webpack-master/src/public/index.html b/vid-webpack-master/src/public/index.html
new file mode 100644 (file)
index 0000000..5a639ca
--- /dev/null
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Angular 2 App | ng2-webpack</title>
+  <link rel="icon" type="image/x-icon" href="./img/favicon.ico">
+  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
+  <link data-require="font-awesome@4.6.1" data-semver="4.6.1" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css" />
+  <base href="./">
+</head>
+<body>
+<vid-app>Loading..</vid-app>
+</body>
+</html>
diff --git a/vid-webpack-master/src/public/service-worker.js b/vid-webpack-master/src/public/service-worker.js
new file mode 100644 (file)
index 0000000..630bdbd
--- /dev/null
@@ -0,0 +1 @@
+// This file is intentionally without code.
\ No newline at end of file
diff --git a/vid-webpack-master/src/style/app.scss b/vid-webpack-master/src/style/app.scss
new file mode 100644 (file)
index 0000000..dbcf7b6
--- /dev/null
@@ -0,0 +1,125 @@
+// styles in src/style directory are applied to the whole page
+@import "../app/drawingBoard/drawing-board-tree/drawing-board-tree";
+@import "../app/drawingBoard/available-models-tree/available-models-tree.component";
+
+@font-face {
+  font-family: OpenSans-Bold;
+  src: url("fonts/OpenSans/OpenSans-Bold.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-BoldItlaic;
+  src: url("fonts/OpenSans/OpenSans-BoldItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-ExtraBold;
+  src: url("fonts/OpenSans/OpenSans-ExtraBold.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-ExtraBoldItalic;
+  src: url("fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Italic;
+  src: url("fonts/OpenSans/OpenSans-Italic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Light;
+  src: url("fonts/OpenSans/OpenSans-Light.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-LightItalic;
+  src: url("fonts/OpenSans/OpenSans-LightItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Regular;
+  src: url("fonts/OpenSans/OpenSans-Regular.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Semibold;
+  src: url("fonts/OpenSans/OpenSans-Semibold.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-SemiboldItalic;
+  src: url("fonts/OpenSans/OpenSans-SemiboldItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: 'icomoon';
+  src:  url('fonts/icomoon.eot?4cilop');
+  src:  url('fonts/icomoon.eot?4cilop#iefix') format('embedded-opentype'),
+  url('fonts/icomoon.ttf?4cilop') format('truetype'),
+  url('fonts/icomoon.woff?4cilop') format('woff'),
+  url('fonts/icomoon.svg?4cilop#icomoon') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'icomoon' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+html {
+  min-height: 100%;
+  height: 100%;
+  body {
+    height: 100%;
+    vid-app {
+      height: 100%;
+      display: flex !important;
+      flex-direction: column;
+      main {
+        &[_ngcontent-c0] {
+          font-family: OpenSans-Regular;
+        }
+
+        display: flex !important;
+        flex-direction: column;
+        flex: 1;
+
+      }
+    }
+  }
+}
+a {
+  color: #03A9F4;
+}
+
+tooltip-content {
+  .tooltip.left .tooltip-arrow {
+      border-left-color: #171f2a;
+  }
+  .tooltip.bottom .tooltip-arrow {
+    border-bottom-color: #171f2a;
+  }
+  .tooltip-inner {
+    background-color: #171f2a;
+    text-align: left;
+  }
+}
+
+service-planning {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+  border: 1px solid #d2d2d2;
+}
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/Apache License.txt b/vid-webpack-master/src/style/fonts/OpenSans/Apache License.txt
new file mode 100644 (file)
index 0000000..989e2c5
--- /dev/null
@@ -0,0 +1,201 @@
+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 [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this 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/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Bold.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Bold.ttf
new file mode 100644 (file)
index 0000000..fd79d43
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Bold.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-BoldItalic.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-BoldItalic.ttf
new file mode 100644 (file)
index 0000000..9bc8009
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-BoldItalic.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBold.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBold.ttf
new file mode 100644 (file)
index 0000000..21f6f84
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBold.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf
new file mode 100644 (file)
index 0000000..31cb688
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Italic.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Italic.ttf
new file mode 100644 (file)
index 0000000..c90da48
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Italic.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Light.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Light.ttf
new file mode 100644 (file)
index 0000000..0d38189
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Light.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-LightItalic.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-LightItalic.ttf
new file mode 100644 (file)
index 0000000..68299c4
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-LightItalic.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Regular.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Regular.ttf
new file mode 100644 (file)
index 0000000..db43334
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Regular.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Semibold.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Semibold.ttf
new file mode 100644 (file)
index 0000000..1a7679e
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-Semibold.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-SemiboldItalic.ttf b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-SemiboldItalic.ttf
new file mode 100644 (file)
index 0000000..59b6d16
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/OpenSans/OpenSans-SemiboldItalic.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/icomoon.eot b/vid-webpack-master/src/style/fonts/icomoon.eot
new file mode 100644 (file)
index 0000000..a568b91
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/icomoon.eot differ
diff --git a/vid-webpack-master/src/style/fonts/icomoon.svg b/vid-webpack-master/src/style/fonts/icomoon.svg
new file mode 100644 (file)
index 0000000..44c81d7
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe900;" glyph-name="add" d="M810.667 490.667h-256v256c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-256h-256c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h256v-256c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v256h256c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe901;" glyph-name="add_f" d="M512 917.333c260.267 0 469.333-209.067 469.333-469.333s-209.067-469.333-469.333-469.333c-260.267 0-469.333 209.067-469.333 469.333s209.067 469.333 469.333 469.333zM682.667 490.667h-128v128c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-128h-128c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h128v-128c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v128h128c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe902;" glyph-name="add_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM682.667 490.667h-128v128c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-128h-128c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h128v-128c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v128h128c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe903;" glyph-name="alert_f" d="M997.611 209.079c12.843-17.067 17.067-42.667 21.333-64 0-34.176-12.8-64-38.4-89.6-21.333-25.6-55.424-38.4-89.6-38.4h-725.333c-21.333 0-42.667 4.267-59.733 17.067-59.733 34.091-81.067 115.2-46.933 174.933l358.4 610.133c8.533 17.024 25.6 34.133 42.667 42.667 29.867 17.024 64 21.333 98.133 12.8s64-29.867 81.067-59.776l358.4-605.824zM512 618.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.133 264.533c-8.533-8.491-12.8-17.024-12.8-29.824 0-12.843 4.267-21.333 12.8-29.867 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.533 8.533 12.8 21.333 12.8 29.867 0 8.491-4.267 21.333-12.8 29.824-17.067 17.067-42.667 17.067-59.733 0z" />
+<glyph unicode="&#xe904;" glyph-name="alert_o" d="M920.811 115.213c-8.533-8.533-21.333-12.8-29.867-12.8h-725.333c-8.533 0-12.8 0-21.333 4.267-21.333 12.8-25.6 38.4-17.067 59.733l362.667 601.6c4.267 4.224 8.533 12.8 12.8 12.8 21.333 12.757 46.933 4.267 59.733-12.8l362.709-601.6c4.224-4.267 4.224-12.843 4.224-21.333 4.267-12.843-4.224-21.333-8.533-29.867zM997.611 209.079l-358.4 605.824c-17.067 29.909-46.933 51.243-81.067 59.776s-68.267 4.224-98.133-12.8c-17.067-8.533-34.133-25.643-42.667-42.667l-358.4-610.133c-34.133-59.733-12.8-140.843 46.933-174.933 17.067-12.8 38.4-17.067 59.733-17.067h725.333c34.176 0 68.267 12.8 89.6 38.4 25.6 25.6 38.4 55.424 38.4 89.6-4.267 21.333-8.491 46.933-21.333 64zM512 618.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.133 264.533c-8.533-8.491-12.8-17.024-12.8-29.824 0-12.843 4.267-21.333 12.8-29.867 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.533 8.533 12.8 21.333 12.8 29.867 0 8.491-4.267 21.333-12.8 29.824-17.067 17.067-42.667 17.067-59.733 0z" />
+<glyph unicode="&#xe905;" glyph-name="API" d="M853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128zM798.165 478.165l-170.667 170.667c-16.683 16.683-43.648 16.683-60.331 0s-16.683-43.648 0-60.331l140.501-140.501-140.501-140.501c-16.683-16.683-16.683-43.648 0-60.331 8.32-8.32 19.243-12.501 30.165-12.501s21.845 4.181 30.165 12.501l170.667 170.667c16.683 16.683 16.683 43.648 0 60.331zM225.835 478.165l170.667 170.667c16.683 16.683 43.648 16.683 60.331 0s16.683-43.648 0-60.331l-140.501-140.501 140.501-140.501c16.683-16.683 16.683-43.648 0-60.331-8.32-8.32-19.243-12.501-30.165-12.501s-21.845 4.181-30.165 12.501l-170.667 170.667c-16.683 16.683-16.683 43.648 0 60.331z" />
+<glyph unicode="&#xe906;" glyph-name="arrow-left" d="M183.467 477.899c-4.267-4.309-8.533-8.533-8.533-12.8-4.267-4.267-4.267-12.843-4.267-17.067 0-4.267 0-12.8 4.267-17.109 4.267-4.224 4.267-8.491 8.533-12.757l170.667-170.667c17.067-17.067 42.667-17.067 59.733 0s17.067 42.667 0 59.733l-98.091 98.133h494.891c25.6 0 42.667 17.067 42.667 42.667 0 25.557-17.067 42.667-42.667 42.667h-494.891l98.091 98.133c17.067 17.067 17.067 42.667 0 59.733-17.067 17.024-42.667 17.024-59.733 0l-170.667-170.667z" />
+<glyph unicode="&#xe907;" glyph-name="arrow-right" d="M840.533 418.101c4.267 4.309 8.533 8.533 8.533 12.8 4.267 4.267 4.267 12.843 4.267 17.067 0 4.267 0 12.8-4.267 17.109-4.267 4.224-4.267 8.491-8.533 12.757l-170.667 170.667c-17.067 17.067-42.667 17.067-59.733 0s-17.067-42.667 0-59.733l98.091-98.133h-494.891c-25.6 0-42.667-17.067-42.667-42.667 0-25.557 17.067-42.667 42.667-42.667h494.891l-98.091-98.133c-17.067-17.067-17.067-42.667 0-59.733 17.067-17.024 42.667-17.024 59.733 0l170.667 170.667z" />
+<glyph unicode="&#xe908;" glyph-name="arrow_f" d="M938.667 448c0-235.641-191.025-426.667-426.667-426.667s-426.667 191.025-426.667 426.667c0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667zM458.762 311.637c-10.286-10.637-10.286-27.88 0-38.516s26.962-10.637 37.248 0l150.497 155.621c10.286 10.637 10.286 27.88 0 38.516l-150.497 155.621c-10.286 10.637-26.962 10.637-37.248 0s-10.286-27.88 0-38.516l131.948-136.441-131.948-136.285z" />
+<glyph unicode="&#xe909;" glyph-name="arrow_o" d="M458.762 311.637c-10.286-10.637-10.286-27.88 0-38.516s26.962-10.637 37.248 0l150.497 155.621c10.286 10.637 10.286 27.88 0 38.516l-150.497 155.621c-10.286 10.637-26.962 10.637-37.248 0s-10.286-27.88 0-38.516l131.948-136.441-131.948-136.285zM512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM42.667 448c0-260.267 209.067-469.333 469.333-469.333s469.333 209.067 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333s-469.333-209.067-469.333-469.333z" />
+<glyph unicode="&#xe90a;" glyph-name="attach" d="M924.768 478.208c-16.768 15.872-41.941 15.872-58.709 0l-386.005-364.757c-83.925-79.275-213.973-79.275-297.856 0-83.925 79.317-83.925 202.197 0 281.515l386.005 364.757c46.123 43.563 130.005 43.563 176.171 0 50.347-47.616 50.347-122.923 0-166.571l-385.963-364.715c-16.811-15.872-41.984-15.872-58.752 0-4.181 3.968-8.405 11.904-8.405 23.765 0 11.904 4.224 19.84 12.587 27.776l356.651 336.981c16.768 15.872 16.768 39.68 0 55.509-16.811 15.872-41.984 15.872-58.752 0l-356.651-336.981c-25.173-19.84-37.717-51.541-37.717-83.285 0-31.701 12.544-63.403 37.717-83.243 50.389-47.573 130.091-47.573 176.213 0l386.005 364.757c83.925 79.275 83.925 202.197 0 281.472-37.76 35.669-92.288 59.477-146.816 59.477-54.571 0-109.099-19.84-146.859-59.477l-386.005-364.715c-113.28-107.051-113.28-285.483 0-392.533 58.752-55.467 134.272-79.275 209.792-79.275s150.997 27.733 209.749 79.275l386.005 364.757c8.405 11.904 8.405 39.637-8.405 55.509z" />
+<glyph unicode="&#xe90b;" glyph-name="beadcrumbs" d="M731.429 448l-365.714-365.714v731.429z" />
+<glyph unicode="&#xe90c;" glyph-name="bedge" d="M273.067 789.333h477.867c150.811 0 273.067-122.256 273.067-273.067v-136.533c0-150.811-122.256-273.067-273.067-273.067h-477.867c-150.811 0-273.067 122.256-273.067 273.067v136.533c0 150.811 122.256 273.067 273.067 273.067z" />
+<glyph unicode="&#xe90d;" glyph-name="browse" d="M279.704 400.593c-36.655 0-66.37 29.715-66.37 66.37s29.715 66.37 66.37 66.37c36.655 0 66.37-29.715 66.37-66.37s-29.715-66.37-66.37-66.37zM744.296 400.593c-36.655 0-66.37 29.715-66.37 66.37s29.715 66.37 66.37 66.37c36.655 0 66.37-29.715 66.37-66.37s-29.715-66.37-66.37-66.37zM512 400.593c-36.655 0-66.37 29.715-66.37 66.37s29.715 66.37 66.37 66.37c36.655 0 66.37-29.715 66.37-66.37s-29.715-66.37-66.37-66.37z" />
+<glyph unicode="&#xe90e;" glyph-name="calendar" d="M810.667 64h-597.333c-25.6 0-42.667 17.067-42.667 42.667v384h682.667v-384c0-25.6-17.067-42.667-42.667-42.667zM213.333 746.667h85.333v-42.667c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v42.667h256v-42.667c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v42.667h85.333c25.6 0 42.667-17.067 42.667-42.667v-128h-682.667v128c0 25.6 17.067 42.667 42.667 42.667zM810.667 832h-85.333v42.667c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-42.667h-256v42.667c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-42.667h-85.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe90f;" glyph-name="camera" d="M938.667 149.333c0-25.6-17.067-42.667-42.667-42.667h-768c-25.6 0-42.667 17.067-42.667 42.667v469.333c0 25.6 17.067 42.667 42.667 42.667h170.667c12.8 0 25.6 8.533 34.133 17.067l72.533 110.933h209.067l72.533-110.933c12.8-8.533 25.6-17.067 38.4-17.067h170.667c25.6 0 42.667-17.067 42.667-42.667v-469.333zM896 746.667h-149.333l-72.533 110.933c-8.533 8.533-21.333 17.067-34.133 17.067h-256c-12.8 0-25.6-8.533-34.133-17.067l-72.533-110.933h-149.333c-72.533 0-128-55.467-128-128v-469.333c0-72.533 55.467-128 128-128h768c72.533 0 128 55.467 128 128v469.333c0 72.533-55.467 128-128 128zM512 234.667c-72.533 0-128 55.467-128 128s55.467 128 128 128c72.533 0 128-55.467 128-128s-55.467-128-128-128zM512 576c-119.467 0-213.333-93.867-213.333-213.333s93.867-213.333 213.333-213.333c119.467 0 213.333 93.867 213.333 213.333s-93.867 213.333-213.333 213.333z" />
+<glyph unicode="&#xe910;" glyph-name="chevron" d="M482.125 290.125c8.533-8.533 21.333-12.8 29.867-12.8s21.333 4.267 29.867 12.8l213.333 213.333c17.067 17.067 17.067 42.667 0 59.733s-42.667 17.067-59.733 0l-183.467-183.467-183.467 183.467c-17.067 17.067-42.667 17.067-59.733 0s-17.067-42.667 0-59.733l213.333-213.333z" />
+<glyph unicode="&#xe911;" glyph-name="close" d="M580.25 448l258.475 258.475c19.499 19.499 19.499 48.725 0 68.224s-48.768 19.499-68.267 0l-258.475-258.432-258.432 258.432c-19.499 19.499-48.768 19.499-68.267 0s-19.499-48.725 0-68.224l258.475-258.475-258.475-258.475c-19.499-19.499-19.499-48.725 0-68.224 9.771-9.771 19.499-14.635 34.133-14.635s24.363 4.864 34.133 14.635l258.432 258.432 258.475-258.432c9.771-9.771 24.363-14.635 34.133-14.635 9.728 0 24.363 4.864 34.133 14.635 19.499 19.499 19.499 48.725 0 68.224l-258.475 258.475z" />
+<glyph unicode="&#xe912;" glyph-name="commit" d="M896.086 106.965c-338.304 1.152-340.693 454.101-340.651 473.557v106.88l99.157-97.323c8.32-8.192 19.072-12.245 29.867-12.245 11.136 0 22.187 4.309 30.592 12.843 16.469 16.896 16.213 44.032-0.683 60.544l-171.819 168.576c-0.341 0.299-0.811 0.384-1.152 0.725-3.541 3.285-7.509 6.187-12.203 8.149-0.213 0.085-0.341 0.085-0.512 0.128-0.725 0.299-1.451 0.299-2.133 0.555-4.139 1.408-8.277 2.176-12.501 2.304-0.768 0-1.451 0.256-2.219 0.256-0.171 0-0.341 0.085-0.512 0.085-1.067 0-1.963-0.555-3.029-0.597-2.603-0.299-5.12-0.811-7.68-1.579-8.96-2.347-16.512-7.253-22.144-14.293l-165.803-163.456c-16.811-16.597-17.067-43.691-0.512-60.587 16.555-16.811 43.605-17.024 60.416-0.469l96 94.677v-105.387c0.043-19.243-2.347-472.192-340.651-473.344-23.595-0.085-42.667-19.328-42.581-42.965 0.085-23.595 19.2-42.667 42.752-42.667h0.171c107.051 0.384 196.949 36.608 267.307 107.648 56.832 57.429 93.056 130.347 116.437 200.789 23.424-70.443 59.648-143.36 116.48-200.789 70.315-71.040 160.213-107.264 267.264-107.648h0.171c23.552 0 42.667 19.072 42.752 42.667 0.085 23.637-18.987 42.88-42.581 42.965z" />
+<glyph unicode="&#xe913;" glyph-name="composition" d="M810.667 104.533c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667zM213.333 104.533c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667zM213.333 787.2c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667zM512 488.533c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667zM810.667 275.2c-55.68 0-102.528-35.755-120.149-85.333h-357.035c-12.843 36.224-41.259 64.64-77.483 77.483v135.851h135.851c17.621-49.579 64.469-85.333 120.149-85.333 70.699 0 128 57.301 128 128s-57.301 128-128 128c-55.68 0-102.528-35.755-120.149-85.333h-135.851v135.851c49.579 17.621 85.333 64.469 85.333 120.149 0 70.699-57.301 128-128 128s-128-57.301-128-128c0-55.68 35.755-102.528 85.333-120.149v-357.035c-49.579-17.621-85.333-64.469-85.333-120.149 0-70.699 57.301-128 128-128 55.68 0 102.528 35.755 120.149 85.333h357.035c17.621-49.579 64.469-85.333 120.149-85.333 70.699 0 128 57.301 128 128s-57.301 128-128 128z" />
+<glyph unicode="&#xe914;" glyph-name="deployment_Artifacts" d="M853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128zM298.667 277.333c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667zM512 661.333c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667c-23.552 0-42.667 19.115-42.667 42.667s19.115 42.667 42.667 42.667zM725.333 277.333c0-23.552-19.115-42.667-42.667-42.667s-42.667 19.115-42.667 42.667c0 23.552 19.115 42.667 42.667 42.667s42.667-19.115 42.667-42.667zM405.888 387.285l66.176 110.379c12.629-4.224 25.899-6.997 39.936-6.997 6.784 0 13.312 0.981 19.84 2.005l81.152-108.16c-23.339-15.232-41.003-37.845-50.475-64.512h-101.035c-10.112 28.544-29.909 52.181-55.595 67.285zM461.483 234.667h101.035c17.621-49.579 64.469-85.333 120.149-85.333 70.699 0 128 57.301 128 128 0 62.805-45.312 114.773-104.96 125.653l-98.304 131.115c20.053 22.571 32.597 51.968 32.597 84.565 0 70.699-57.301 128-128 128s-128-57.301-128-128c0-25.216 7.552-48.597 20.139-68.395l-88.533-147.541c-58.368-11.904-102.272-63.531-102.272-125.397 0-70.699 57.301-128 128-128 55.68 0 102.528 35.755 120.149 85.333z" />
+<glyph unicode="&#xe915;" glyph-name="download" d="M896 277.333c25.6 0 42.667-17.067 42.667-42.667v-128c0-72.533-55.467-128-128-128h-597.333c-72.533 0-128 55.467-128 128v128c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-128c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v128c0 25.6 17.067 42.667 42.667 42.667zM482.101 247.467l-170.667 170.667c-17.024 17.067-17.024 42.667 0 59.733 17.067 17.067 42.667 17.067 59.733 0l98.133-98.091v494.891c0 25.6 17.109 42.667 42.667 42.667 25.6 0 42.667-17.067 42.667-42.667v-494.891l98.133 98.091c17.067 17.067 42.667 17.067 59.733 0s17.067-42.667 0-59.733l-170.667-170.667c-4.267-4.267-8.533-4.267-12.757-8.533-4.309-4.267-12.843-4.267-17.109-4.267-4.224 0-12.8 0-17.067 4.267-4.267 0-8.491 4.267-12.8 8.533z" />
+<glyph unicode="&#xe916;" glyph-name="duplicate" d="M128 106.667c0-25.6 17.067-42.667 42.667-42.667h384c25.6 0 42.667 17.067 42.667 42.667v384c0 25.6-17.067 42.667-42.667 42.667h-384c-25.6 0-42.667-17.067-42.667-42.667v-384zM170.667 618.667h384c72.533 0 128-55.467 128-128v-384c0-72.533-55.467-128-128-128h-384c-72.533 0-128 55.467-128 128v384c0 72.533 55.467 128 128 128zM810.667 362.667h42.667c25.6 0 42.667 17.067 42.667 42.667v384c0 25.6-17.067 42.667-42.667 42.667h-384c-25.6 0-42.667-17.067-42.667-42.667v-42.667c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667v42.667c0 72.533 55.467 128 128 128h384c72.533 0 128-55.467 128-128v-384c0-72.533-55.467-128-128-128h-42.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667z" />
+<glyph unicode="&#xe917;" glyph-name="edit" d="M170.667 388.271v-110.933h110.933l426.667 426.667-110.933 110.933-426.667-426.667zM128 192.004c-25.6 0-42.667 17.067-42.667 42.667v170.667c0 12.8 4.267 21.333 12.8 29.867l469.333 469.333c17.067 17.067 42.667 17.067 59.733 0l170.667-170.667c17.067-17.067 17.067-42.667 0-59.733l-469.333-469.333c-8.533-8.533-17.067-12.8-29.867-12.8h-170.667zM896 64c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-768c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h768z" />
+<glyph unicode="&#xe918;" glyph-name="expand" d="M934.426 849.067c4.267-4.309 4.267-12.843 4.267-17.067v-256c0-25.6-17.109-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v153.557l-226.133-226.133c-8.533-8.533-21.333-12.757-29.867-12.757-8.576 0-21.333 4.224-29.909 12.757-17.024 17.109-17.024 42.667 0 59.776l226.133 226.133h-153.557c-25.6 0-42.667 17.067-42.667 42.667 0 25.557 17.067 42.667 42.667 42.667h256c4.224 0 12.757 0 17.067-4.267 8.491-4.309 17.024-12.843 21.333-21.333zM396.8 392.525c17.067 17.024 42.667 17.024 59.733 0 17.067-17.067 17.067-42.667 0-59.733l-226.091-226.133h153.557c25.6 0 42.667-17.109 42.667-42.667 0-25.6-17.067-42.667-42.667-42.667h-256c-4.224 0-12.8 0-17.067 4.224-8.491 4.309-17.067 12.843-21.333 21.333-4.267 4.309-4.267 12.843-4.267 17.109v256c0 25.557 17.109 42.667 42.667 42.667 25.6 0 42.667-17.109 42.667-42.667v-153.6l226.133 226.133zM913.092 25.566c-4.309-4.267-12.843-4.267-17.067-4.267h-256c-25.6 0-42.667 17.109-42.667 42.667 0 25.6 17.067 42.667 42.667 42.667h153.557l-226.133 226.133c-8.533 8.533-12.757 21.333-12.757 29.867 0 8.576 4.224 21.333 12.757 29.909 17.109 17.024 42.667 17.024 59.776 0l226.133-226.133v153.557c0 25.6 17.067 42.667 42.667 42.667 25.557 0 42.667-17.067 42.667-42.667v-256c0-4.224 0-12.757-4.267-17.067-4.309-8.491-12.843-17.024-21.333-21.333zM456.55 563.191c17.024-17.067 17.024-42.667 0-59.733-17.067-17.067-42.667-17.067-59.733 0l-226.133 226.091v-153.557c0-25.6-17.109-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v256c0 4.224 0 12.8 4.224 17.067 4.309 8.491 12.843 17.067 21.333 21.333 4.309 4.267 12.843 4.267 17.109 4.267h256c25.557 0 42.667-17.109 42.667-42.667 0-25.6-17.109-42.667-42.667-42.667h-153.6l226.133-226.133z" />
+<glyph unicode="&#xe919;" glyph-name="fail" d="M580.25 448l258.475 258.475c19.499 19.499 19.499 48.725 0 68.224s-48.768 19.499-68.267 0l-258.475-258.432-258.432 258.432c-19.499 19.499-48.768 19.499-68.267 0s-19.499-48.725 0-68.224l258.475-258.475-258.475-258.475c-19.499-19.499-19.499-48.725 0-68.224 9.771-9.771 19.499-14.635 34.133-14.635s24.363 4.864 34.133 14.635l258.432 258.432 258.475-258.432c9.771-9.771 24.363-14.635 34.133-14.635 9.728 0 24.363 4.864 34.133 14.635 19.499 19.499 19.499 48.725 0 68.224l-258.475 258.475z" />
+<glyph unicode="&#xe91a;" glyph-name="file_managment" d="M853.333 375.462c25.6 0 42.667-17.024 42.667-42.667v-226.133c0-72.533-55.467-128-128-128h-597.333c-72.533 0-128 55.467-128 128v597.333c0 72.533 55.467 128 128 128h226.133c25.6 0 42.667-17.067 42.667-42.667 0-25.557-17.067-42.667-42.667-42.667h-226.133c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.557 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.109 42.667 42.667v226.133c0 25.643 17.067 42.667 42.667 42.667zM494.916 320.004h-110.933v110.933l384 384 110.933-110.933-384-384zM968.559 733.871l-170.667 170.667c-17.109 17.067-42.667 17.067-59.776 0l-426.667-426.667c-8.533-8.533-12.8-17.067-12.8-29.867v-170.667c0-25.6 17.109-42.667 42.667-42.667h170.667c12.8 0 21.333 4.267 29.909 12.8l426.667 426.667c17.024 17.067 17.024 42.667 0 59.733z" />
+<glyph unicode="&#xe91b;" glyph-name="filter" d="M563.595 456.533c-4.309-8.533-8.533-17.067-8.533-29.867v-294.443l-85.333 42.667v251.776c0 8.533-4.267 21.333-8.533 25.557l-281.6 337.109h669.867l-285.867-332.8zM977.461 849.067c-8.533 17.067-21.333 25.6-38.4 25.6h-853.333c-17.109 0-29.867-8.533-38.443-25.6-8.491-12.843-4.224-29.867 4.309-42.667l332.8-392.533v-264.533c0-17.109 8.533-29.867 25.557-38.443l170.667-85.333c4.309-4.224 8.576-4.224 17.109-4.224s17.067 0 21.333 4.224c12.8 8.576 21.333 21.333 21.333 38.443v349.867l332.8 392.533c8.533 12.8 12.757 29.824 4.267 42.667z" />
+<glyph unicode="&#xe91c;" glyph-name="filterDown" d="M482.101 162.133c4.309-4.267 8.533-8.533 12.8-8.533 4.267-4.267 12.843-4.267 17.067-4.267 4.267 0 12.8 0 17.109 4.267 4.224 4.267 8.491 4.267 12.757 8.533l170.667 170.667c17.067 17.067 17.067 42.667 0 59.733s-42.667 17.067-59.733 0l-98.133-98.091v494.891c0 25.6-17.067 42.667-42.667 42.667-25.557 0-42.667-17.067-42.667-42.667v-494.891l-98.133 98.091c-17.067 17.067-42.667 17.067-59.733 0-17.024-17.067-17.024-42.667 0-59.733l170.667-170.667z" />
+<glyph unicode="&#xe91d;" glyph-name="filterUp" d="M482.101 819.2c4.309 4.267 8.533 8.533 12.8 8.533 4.267 4.267 12.843 4.267 17.067 4.267 4.267 0 12.8 0 17.109-4.267 4.224-4.267 8.491-4.267 12.757-8.533l170.667-170.667c17.067-17.067 17.067-42.667 0-59.733s-42.667-17.067-59.733 0l-98.133 98.091v-494.891c0-25.6-17.067-42.667-42.667-42.667-25.557 0-42.667 17.067-42.667 42.667v494.891l-98.133-98.091c-17.067-17.067-42.667-17.067-59.733 0-17.024 17.067-17.024 42.667 0 59.733l170.667 170.667z" />
+<glyph unicode="&#xe91e;" glyph-name="info_f" d="M512 917.333c260.267 0 469.333-209.067 469.333-469.333 0-260.309-209.067-469.333-469.333-469.333s-469.333 209.024-469.333 469.333c0 260.267 209.067 469.333 469.333 469.333zM512 490.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.125 648.542c-8.533-8.533-12.8-17.067-12.8-29.867s4.267-21.333 12.8-29.867c8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.576 8.533 12.8 17.067 12.8 29.867s-4.224 21.333-12.8 29.867c-17.067 17.024-42.667 17.024-59.733 0z" />
+<glyph unicode="&#xe91f;" glyph-name="info_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333 0-260.309 209.067-469.333 469.333-469.333s469.333 209.024 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333zM512 490.667c-25.6 0-42.667-17.067-42.667-42.667v-170.667c0-25.643 17.067-42.667 42.667-42.667s42.667 17.024 42.667 42.667v170.667c0 25.6-17.067 42.667-42.667 42.667zM482.125 648.542c-8.533-8.533-12.8-17.067-12.8-29.867s4.267-21.333 12.8-29.867c8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.576 8.533 12.8 17.067 12.8 29.867s-4.224 21.333-12.8 29.867c-17.067 17.024-42.667 17.024-59.733 0z" />
+<glyph unicode="&#xe920;" glyph-name="info_tabs" d="M512 490.667c25.6 0 42.667-17.067 42.667-42.667v-170.667c0-25.643-17.067-42.667-42.667-42.667s-42.667 17.024-42.667 42.667v170.667c0 25.6 17.067 42.667 42.667 42.667zM482.133 648.565c17.067 17.024 42.667 17.024 59.733 0 8.576-8.533 12.8-17.067 12.8-29.867s-4.224-21.333-12.8-29.867c-8.533-8.576-17.067-12.8-29.867-12.8s-21.333 4.224-29.867 12.8c-8.533 8.533-12.8 17.067-12.8 29.867s4.267 21.333 12.8 29.867zM853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe921;" glyph-name="information_artifacts" d="M512 490.667c25.6 0 42.667-17.067 42.667-42.667v-170.667c0-25.643-17.067-42.667-42.667-42.667s-42.667 17.024-42.667 42.667v170.667c0 25.6 17.067 42.667 42.667 42.667zM482.133 648.565c17.067 17.024 42.667 17.024 59.733 0 8.576-8.533 12.8-17.067 12.8-29.867s-4.224-21.333-12.8-29.867c-8.533-8.576-17.067-12.8-29.867-12.8s-21.333 4.224-29.867 12.8c-8.533 8.533-12.8 17.067-12.8 29.867s4.267 21.333 12.8 29.867zM853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 874.667h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe922;" glyph-name="inputs" d="M853.333 147.2c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-597.333zM810.667 872.533h-597.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v597.333c0 72.533-55.467 128-128 128zM725.333 659.2h-426.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667h426.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667zM725.333 488.533h-426.667c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667h426.667c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667z" />
+<glyph unicode="&#xe923;" glyph-name="locked" d="M341.333 661.333c0 93.867 76.8 170.667 170.667 170.667s170.667-76.8 170.667-170.667v-128h-341.333v128zM810.667 533.333h-42.667v128c0 140.8-115.2 256-256 256s-256-115.2-256-256v-128h-42.667c-72.533 0-128-55.467-128-128v-298.667c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v298.667c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe924;" glyph-name="Menu" d="M445.649 699.24c0 36.655 29.715 66.37 66.37 66.37s66.37-29.715 66.37-66.37c0-36.655-29.715-66.37-66.37-66.37s-66.37 29.715-66.37 66.37zM445.649 234.648c0 36.655 29.715 66.37 66.37 66.37s66.37-29.715 66.37-66.37c0-36.655-29.715-66.37-66.37-66.37s-66.37 29.715-66.37 66.37zM445.649 466.944c0 36.655 29.715 66.37 66.37 66.37s66.37-29.715 66.37-66.37c0-36.655-29.715-66.37-66.37-66.37s-66.37 29.715-66.37 66.37z" />
+<glyph unicode="&#xe925;" glyph-name="notifications" d="M234.667 277.333h554.667c-12.8 25.6-21.333 55.467-21.333 85.333v213.333c0 140.8-115.2 256-256 256s-256-115.2-256-256v-213.333c0-29.867-8.533-59.733-21.333-85.333zM938.667 277.333c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-853.333c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667c46.933 0 85.333 38.4 85.333 85.333v213.333c0 187.733 153.6 341.333 341.333 341.333s341.333-153.6 341.333-341.333v-213.333c0-46.933 38.4-85.333 85.333-85.333zM644.131 100.648c21.333-12.8 29.867-38.4 8.533-59.733-25.6-42.667-68.267-64-110.933-64-21.333 0-42.667 4.267-64 17.067s-34.133 25.6-46.933 46.933c-8.533 21.333-4.309 46.933 17.024 59.733 21.333 8.533 46.976 4.267 59.776-17.067 4.224-8.533 8.533-12.8 17.067-17.067 21.333-8.533 46.933-4.267 59.733 17.067 12.757 21.333 38.4 29.867 59.733 17.067z" />
+<glyph unicode="&#xe926;" glyph-name="permissions" d="M554.667 362.667h-341.333c-119.467 0-213.333-93.867-213.333-213.333v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 72.533 55.467 128 128 128h341.333c72.533 0 128-55.467 128-128v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 119.467-93.867 213.333-213.333 213.333zM384 789.333c72.533 0 128-55.467 128-128s-55.467-128-128-128c-72.533 0-128 55.467-128 128s55.467 128 128 128zM384 448c119.467 0 213.333 93.867 213.333 213.333s-93.867 213.333-213.333 213.333c-119.467 0-213.333-93.867-213.333-213.333s93.867-213.333 213.333-213.333zM862.684 361.849c-21.333 4.267-46.976-8.533-51.2-29.867-4.267-21.333 8.533-46.933 29.867-51.2 55.467-12.8 93.867-64 93.867-123.733v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c4.267 98.133-59.733 183.467-157.867 204.8zM693.444 872.034c-21.333 8.533-42.667-4.267-51.2-29.867-4.267-21.333 8.533-46.933 29.867-51.2 68.267-17.067 110.933-85.333 93.867-157.867-12.843-46.933-46.933-81.067-93.867-93.867-21.333-4.267-38.4-29.867-29.867-51.2 4.224-21.333 21.333-34.133 42.667-34.133h8.533c76.8 21.333 136.533 76.8 153.6 153.6 29.867 119.467-38.4 238.933-153.6 264.533z" />
+<glyph unicode="&#xe927;" glyph-name="profile" d="M682.667 362.667h-341.333c-119.467 0-213.333-93.867-213.333-213.333v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 72.533 55.467 128 128 128h341.333c72.533 0 128-55.467 128-128v-85.333c0-25.6 17.067-42.667 42.667-42.667s42.667 17.067 42.667 42.667v85.333c0 119.467-93.867 213.333-213.333 213.333zM512 789.333c72.533 0 128-55.467 128-128s-55.467-128-128-128c-72.533 0-128 55.467-128 128s55.467 128 128 128zM512 448c119.467 0 213.333 93.867 213.333 213.333s-93.867 213.333-213.333 213.333c-119.467 0-213.333-93.867-213.333-213.333s93.867-213.333 213.333-213.333z" />
+<glyph unicode="&#xe928;" glyph-name="properties" d="M512 362.658c-46.933 0-85.333 38.4-85.333 85.333 0 46.976 38.4 85.333 85.333 85.333s85.333-38.357 85.333-85.333c0-46.933-38.4-85.333-85.333-85.333zM512 618.658c-93.867 0-170.667-76.8-170.667-170.667s76.8-170.667 170.667-170.667c93.867 0 170.667 76.8 170.667 170.667s-76.8 170.667-170.667 170.667zM814.916 209.075c8.533-8.533 12.843-17.067 12.843-29.867s-4.309-21.333-12.843-29.867c-8.491-8.576-17.024-12.8-29.824-12.8-12.843 0-21.333 4.224-34.176 17.067-34.133 34.133-81.024 42.667-123.691 21.333-42.667-17.067-68.309-59.733-68.309-102.4v-8.533c0-25.6-17.024-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v4.267c0 46.933-29.824 85.333-72.491 102.4-12.843 8.533-29.867 8.533-46.976 8.533-29.867 0-59.691-12.8-81.024-34.133-17.109-17.067-38.443-17.067-55.509-4.309l-8.491 17.109h-4.309c-4.224 4.224-4.224 12.8-4.224 17.067 0 12.8 4.224 21.333 17.024 34.133 34.176 34.133 42.667 81.024 21.333 123.691-17.024 42.667-59.691 68.309-102.357 68.309h-8.576c-25.557 0-42.667 17.024-42.667 42.667 0 25.6 17.109 42.667 42.667 42.667h4.267c46.976 0 85.333 29.867 102.4 72.533 17.109 42.667 8.576 89.6-25.557 128-17.109 17.067-17.109 42.667 0 59.733 17.024 17.067 42.667 17.067 64-4.267 29.824-29.867 76.8-38.4 115.157-25.643l12.843 4.309c42.667 17.024 68.224 59.691 68.224 102.357v8.576c0 25.6 17.109 42.667 42.667 42.667 25.6 0 42.667-17.067 42.667-46.933 0-46.976 25.6-85.333 68.267-102.4s89.643-8.576 128 25.6c8.533 8.491 17.067 12.8 29.867 12.8s21.333-4.309 29.867-12.8c17.109-17.067 17.109-42.667-4.224-64-29.867-29.867-38.443-76.843-25.643-115.2l4.309-12.8c17.024-42.667 59.691-68.267 102.357-68.267h8.533c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-46.891-42.667c-46.976 0-85.333-25.6-102.443-68.267-21.333-42.667-8.533-89.643 25.6-128zM866.116 302.942c4.309 8.491 12.8 17.067 29.867 17.067 72.576 0 128 55.424 128 128 0 72.533-55.424 128-128 128h-8.533c-8.533 0-17.024 4.267-21.333 12.757l-4.224 8.576c-4.309 8.533-4.309 21.333 8.533 34.091 46.891 46.976 51.157 115.243 12.8 166.443v12.8l-17.109 8.533c-21.333 21.333-51.2 34.133-85.333 34.133s-68.224-12.8-93.867-38.4c-8.491-8.533-21.333-8.533-29.824-4.267-8.533-4.267-17.109 8.533-17.109 21.333 0 72.533-55.424 128-128 128-72.533 0-128-55.467-128-128v-8.576c0-8.491-4.224-17.024-12.757-21.333l-8.576-4.224c-8.533-4.267-21.333 0-34.091 8.533-51.243 51.2-132.309 51.2-179.243 0-51.2-51.2-51.2-132.309 4.267-183.467 8.533-8.533 8.533-21.333 4.309-34.176-4.309-8.491-17.109-17.024-29.909-17.024-72.533 0-128-55.467-128-128s55.467-128 128-128h8.576c12.757 0 21.333-8.533 25.557-17.067 4.309-8.576 4.309-21.333-8.533-34.133-25.6-25.6-38.357-55.467-38.357-89.6 0-29.867 12.757-59.733 34.091-85.333l4.267-4.267 12.843-12.8c51.157-38.443 119.467-34.133 170.667 12.8 8.491 8.533 21.333 8.533 34.133 4.267 12.757-4.267 17.024-12.843 17.024-29.867 0-72.533 55.509-128 128-128 72.533 0 128 55.467 128 128v8.533c0 12.8 8.533 21.333 17.067 25.6 8.576 4.224 21.333 4.224 34.133-8.533 51.2-51.243 132.309-51.243 179.2 0 51.243 51.2 51.243 132.267-4.224 183.424-4.309 12.843-8.533 25.643-4.309 34.176z" />
+<glyph unicode="&#xe929;" glyph-name="Q_f" d="M560.006 694.979c68.267-25.6 115.2-89.6 119.467-166.4 0-110.933-140.8-162.133-157.867-166.4-4.267-4.267-8.576-4.267-12.8-4.267-17.109 0-34.133 12.8-38.443 29.867-8.491 25.6 4.309 46.933 25.643 55.467 25.6 12.8 98.133 46.933 98.133 89.6 0 38.4-21.333 68.267-55.467 81.067-46.976 17.067-93.867-8.533-110.976-51.2-8.491-21.333-34.091-34.133-55.424-25.6-25.6 4.267-34.133 29.867-29.909 55.467 29.909 85.376 128 132.267 217.643 102.4zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333 0-260.309 209.067-469.333 469.333-469.333s469.333 209.024 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333zM482.133 264.565c17.067 17.024 42.667 17.024 59.733 0 8.576-8.533 12.8-21.333 12.8-29.867s-4.224-21.333-12.8-29.867c-8.533-8.576-17.067-12.8-29.867-12.8s-21.333 4.224-29.867 12.8c-8.533 8.533-12.8 17.067-12.8 29.867s4.267 21.333 12.8 29.867z" />
+<glyph unicode="&#xe92a;" glyph-name="Q_o" d="M560.006 694.979c-89.643 29.867-187.733-17.024-217.643-102.4-4.224-25.6 4.309-51.2 29.909-55.467 21.333-8.533 46.933 4.267 55.424 25.6 17.109 42.667 64 68.267 110.976 51.2 34.133-12.8 55.467-42.667 55.467-81.067 0-42.667-72.533-76.8-98.133-89.6-21.333-8.533-34.133-29.867-25.643-55.467 4.309-17.067 21.333-29.867 38.443-29.867 4.224 0 8.533 0 12.8 4.267 17.067 4.267 157.867 55.467 157.867 166.4-4.267 76.8-51.2 140.8-119.467 166.4zM512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333 0-260.309 209.067-469.333 469.333-469.333s469.333 209.024 469.333 469.333c0 260.267-209.067 469.333-469.333 469.333zM482.133 264.565c-8.533-8.533-12.8-17.067-12.8-29.867s4.267-21.333 12.8-29.867c8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8c8.576 8.533 12.8 21.333 12.8 29.867s-4.224 21.333-12.8 29.867c-17.067 17.024-42.667 17.024-59.733 0z" />
+<glyph unicode="&#xe92c;" glyph-name="revert" d="M597.333 422.4l115.2-115.2c17.067-17.067 17.067-42.667 0-59.733-8.533-8.533-21.333-12.8-29.867-12.8s-21.333 4.267-29.867 12.8l-128 128c-8.533 8.533-12.8 17.067-12.8 29.867v256c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-238.933zM955.895 588.856c81.024-221.867-38.4-465.067-260.309-541.867-46.891-17.067-93.867-25.6-140.757-25.6-174.933 0-341.333 110.933-405.333 285.867-8.576 21.333 4.224 46.933 25.557 55.467s46.976-4.267 55.509-25.6c64-179.2 256-273.067 435.157-209.067 89.643 29.867 157.867 93.867 196.309 174.933 38.357 81.067 42.667 174.933 12.8 260.267-29.909 89.6-93.909 157.867-174.933 196.267-81.067 38.4-174.976 42.667-260.309 12.8-46.891-17.067-93.867-46.933-128-81.067l-119.424-115.2h149.333c25.557 0 34.091-8.533 34.091-34.133s-17.024-42.667-42.667-42.667h-268.757l-4.267 4.267c-4.309 0-4.309 0-8.533 4.267-4.309 0-4.309 4.267-4.309 4.267 0 4.267-4.224 4.267-4.224 8.533v268.8c0 25.6 17.067 42.667 42.667 42.667 25.557 0 42.667-17.067 42.667-42.667v-157.867l128 119.467c42.667 42.667 98.091 76.8 157.867 98.133 106.667 38.4 221.867 34.133 324.224-17.067 102.443-51.2 179.243-136.533 217.643-243.2z" />
+<glyph unicode="&#xe92d;" glyph-name="save" d="M853.333 149.333c0-25.6-17.067-42.667-42.667-42.667h-42.667v298.667c0 25.6-17.067 42.667-42.667 42.667h-426.667c-25.6 0-42.667-17.067-42.667-42.667v-298.667h-42.667c-25.6 0-42.667 17.067-42.667 42.667v597.333c0 25.6 17.067 42.667 42.667 42.667h42.667v-170.667c0-25.6 17.067-42.667 42.667-42.667h341.333c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667h-298.667v128h324.267l187.733-187.733v-452.267zM341.333 106.667v256h341.333v-256h-341.333zM925.867 648.533l-213.333 213.333c-8.533 8.533-17.067 12.8-29.867 12.8h-469.333c-72.533 0-128-55.467-128-128v-597.333c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v469.333c0 12.8-4.267 21.333-12.8 29.867z" />
+<glyph unicode="&#xe92e;" glyph-name="search" d="M170.667 512c0 153.6 123.733 277.333 277.333 277.333s277.333-123.733 277.333-277.333c0-76.8-29.867-145.067-81.067-196.267s-119.467-81.067-196.267-81.067c-153.6 0-277.333 123.733-277.333 277.333zM925.867 93.867l-192 192c46.933 59.733 76.8 140.8 76.8 226.133 0 200.533-162.133 362.667-362.667 362.667s-362.667-162.133-362.667-362.667c0-200.533 162.133-362.667 362.667-362.667 85.333 0 162.133 29.867 226.133 76.8l192-192c8.533-8.533 21.333-12.8 29.867-12.8s21.333 4.267 29.867 12.8c17.067 17.067 17.067 42.667 0 59.733z" />
+<glyph unicode="&#xe92f;" glyph-name="setting" d="M512 362.658c-46.933 0-85.333 38.4-85.333 85.333 0 46.976 38.4 85.333 85.333 85.333s85.333-38.357 85.333-85.333c0-46.933-38.4-85.333-85.333-85.333zM512 618.658c-93.867 0-170.667-76.8-170.667-170.667s76.8-170.667 170.667-170.667c93.867 0 170.667 76.8 170.667 170.667s-76.8 170.667-170.667 170.667zM814.916 209.075c8.533-8.533 12.843-17.067 12.843-29.867s-4.309-21.333-12.843-29.867c-8.491-8.576-17.024-12.8-29.824-12.8-12.843 0-21.333 4.224-34.176 17.067-34.133 34.133-81.024 42.667-123.691 21.333-42.667-17.067-68.309-59.733-68.309-102.4v-8.533c0-25.6-17.024-42.667-42.667-42.667-25.6 0-42.667 17.067-42.667 42.667v4.267c0 46.933-29.824 85.333-72.491 102.4-12.843 8.533-29.867 8.533-46.976 8.533-29.867 0-59.691-12.8-81.024-34.133-17.109-17.067-38.443-17.067-55.509-4.309l-8.491 17.109h-4.309c-4.224 4.224-4.224 12.8-4.224 17.067 0 12.8 4.224 21.333 17.024 34.133 34.176 34.133 42.667 81.024 21.333 123.691-17.024 42.667-59.691 68.309-102.357 68.309h-8.576c-25.557 0-42.667 17.024-42.667 42.667 0 25.6 17.109 42.667 42.667 42.667h4.267c46.976 0 85.333 29.867 102.4 72.533 17.109 42.667 8.576 89.6-25.557 128-17.109 17.067-17.109 42.667 0 59.733 17.024 17.067 42.667 17.067 64-4.267 29.824-29.867 76.8-38.4 115.157-25.643l12.843 4.309c42.667 17.024 68.224 59.691 68.224 102.357v8.576c0 25.6 17.109 42.667 42.667 42.667 25.6 0 42.667-17.067 42.667-46.933 0-46.976 25.6-85.333 68.267-102.4s89.643-8.576 128 25.6c8.533 8.491 17.067 12.8 29.867 12.8s21.333-4.309 29.867-12.8c17.109-17.067 17.109-42.667-4.224-64-29.867-29.867-38.443-76.843-25.643-115.2l4.309-12.8c17.024-42.667 59.691-68.267 102.357-68.267h8.533c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-46.891-42.667c-46.976 0-85.333-25.6-102.443-68.267-21.333-42.667-8.533-89.643 25.6-128zM866.116 302.942c4.309 8.491 12.8 17.067 29.867 17.067 72.576 0 128 55.424 128 128 0 72.533-55.424 128-128 128h-8.533c-8.533 0-17.024 4.267-21.333 12.757l-4.224 8.576c-4.309 8.533-4.309 21.333 8.533 34.091 46.891 46.976 51.157 115.243 12.8 166.443v12.8l-17.109 8.533c-21.333 21.333-51.2 34.133-85.333 34.133s-68.224-12.8-93.867-38.4c-8.491-8.533-21.333-8.533-29.824-4.267-8.533-4.267-17.109 8.533-17.109 21.333 0 72.533-55.424 128-128 128-72.533 0-128-55.467-128-128v-8.576c0-8.491-4.224-17.024-12.757-21.333l-8.576-4.224c-8.533-4.267-21.333 0-34.091 8.533-51.243 51.2-132.309 51.2-179.243 0-51.2-51.2-51.2-132.309 4.267-183.467 8.533-8.533 8.533-21.333 4.309-34.176-4.309-8.491-17.109-17.024-29.909-17.024-72.533 0-128-55.467-128-128s55.467-128 128-128h8.576c12.757 0 21.333-8.533 25.557-17.067 4.309-8.576 4.309-21.333-8.533-34.133-25.6-25.6-38.357-55.467-38.357-89.6 0-29.867 12.757-59.733 34.091-85.333l4.267-4.267 12.843-12.8c51.157-38.443 119.467-34.133 170.667 12.8 8.491 8.533 21.333 8.533 34.133 4.267 12.757-4.267 17.024-12.843 17.024-29.867 0-72.533 55.509-128 128-128 72.533 0 128 55.467 128 128v8.533c0 12.8 8.533 21.333 17.067 25.6 8.576 4.224 21.333 4.224 34.133-8.533 51.2-51.243 132.309-51.243 179.2 0 51.243 51.2 51.243 132.267-4.224 183.424-4.309 12.843-8.533 25.643-4.309 34.176z" />
+<glyph unicode="&#xe930;" glyph-name="sub" d="M213.333 490.667h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667z" />
+<glyph unicode="&#xe931;" glyph-name="sub_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM682.667 490.667h-341.333c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h341.333c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667z" />
+<glyph unicode="&#xe932;" glyph-name="success" d="M815.403 732.877l-360.277-515.925-203.861 197.589c-18.987 18.347-47.445 18.347-66.389 0-18.944-18.389-18.944-45.952 0-64.341l237.056-229.76c9.472-9.173 18.944-13.781 33.195-13.781 14.208 0 23.723 4.608 33.152 13.781l393.515 548.139c18.944 18.347 18.944 45.909 0 64.299s-47.403 18.389-66.389 0z" />
+<glyph unicode="&#xe933;" glyph-name="success_f" d="M757.461 590.549l-298.667-341.333c-7.808-8.875-18.901-14.165-30.72-14.549-0.427 0-0.939 0-1.408 0-11.307 0-22.144 4.48-30.165 12.501l-170.667 170.667c-16.683 16.64-16.683 43.648 0 60.331 16.683 16.64 43.648 16.64 60.331 0l138.411-138.411 268.629 306.987c15.531 17.792 42.539 19.541 60.203 4.011 17.749-15.531 19.541-42.453 4.053-60.203zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333z" />
+<glyph unicode="&#xe934;" glyph-name="success_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM693.21 646.771l-268.629-307.029-138.411 138.411c-16.683 16.683-43.648 16.683-60.331 0-16.683-16.64-16.683-43.648 0-60.331l170.667-170.667c7.979-8.021 18.859-12.501 30.165-12.501 0.469 0 0.939 0 1.408 0.043 11.819 0.384 22.912 5.675 30.72 14.549l298.667 341.333c15.488 17.749 13.696 44.672-4.053 60.203-17.664 15.531-44.672 13.781-60.203-4.011z" />
+<glyph unicode="&#xe936;" glyph-name="sync" d="M878.933 358.4c21.333-4.267 34.176-29.867 29.867-55.467-21.333-59.733-59.691-115.2-102.357-157.867-81.109-81.067-187.776-123.733-302.976-123.733s-221.867 42.667-294.357 123.733l-123.776 119.467v-157.867c0-25.6-17.067-42.667-42.667-42.667-25.557 0-42.667 17.067-42.667 42.667v268.8c0 4.267 4.267 4.267 4.267 8.533 4.309 0 4.309 4.267 4.309 4.267 0 4.267 4.224 8.533 8.533 8.533 0 4.267 4.224 4.267 4.224 4.267h4.267c0 4.267 4.309 4.267 8.533 4.267h256c25.643 0 42.667-17.067 42.667-42.667s-17.024-42.667-42.667-42.667h-149.333l119.467-110.933c68.309-68.267 153.643-102.4 243.2-102.4 89.643 0 179.2 34.133 238.976 98.133 38.357 34.133 64 81.067 81.024 128 8.533 21.333 34.133 34.133 55.467 25.6zM958.406 831.276c25.6 0 42.667-17.067 42.667-42.667v-260.267c0-4.267 0-8.533-4.267-12.8 0-4.267-4.267-4.267-4.267-8.533-4.267 0-4.267-4.267-4.267-4.267-4.267-4.267-8.533-4.267-12.8-8.533s-12.8-4.267-17.067-4.267h-256c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h149.333l-119.467 115.2c-34.133 38.4-81.067 64-128 81.067-85.333 29.867-179.2 25.6-260.267-12.8-81.067-42.667-145.067-110.933-174.933-196.267-8.533-21.333-34.133-34.133-55.467-25.6-21.333 4.267-34.133 29.867-25.6 51.2 38.4 110.933 115.2 196.267 217.6 243.2 102.4 51.2 217.6 55.467 328.533 21.333 59.733-21.333 115.2-59.733 157.867-102.4l123.733-119.467v157.867c0 25.6 17.067 42.667 42.667 42.667z" />
+<glyph unicode="&#xe937;" glyph-name="trash" d="M768 106.667c0-25.6-17.067-42.667-42.667-42.667h-426.667c-25.6 0-42.667 17.067-42.667 42.667v554.667h512v-554.667zM384 789.333c0 25.6 17.067 42.667 42.667 42.667h170.667c25.6 0 42.667-17.067 42.667-42.667v-42.667h-256v42.667zM896 746.667h-170.667v42.667c0 72.533-55.467 128-128 128h-170.667c-72.533 0-128-55.467-128-128v-42.667h-170.667c-25.6 0-42.667-17.067-42.667-42.667s17.067-42.667 42.667-42.667h42.667v-554.667c0-72.533 55.467-128 128-128h426.667c72.533 0 128 55.467 128 128v554.667h42.667c25.6 0 42.667 17.067 42.667 42.667s-17.067 42.667-42.667 42.667zM426.667 191.996c25.6 0 42.667 17.067 42.667 42.667v256c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-256c0-25.6 17.067-42.667 42.667-42.667zM597.333 191.996c25.6 0 42.667 17.067 42.667 42.667v256c0 25.6-17.067 42.667-42.667 42.667s-42.667-17.067-42.667-42.667v-256c0-25.6 17.067-42.667 42.667-42.667z" />
+<glyph unicode="&#xe938;" glyph-name="undo" d="M955.733 588.856c-38.4 106.667-115.2 192-217.643 243.2-102.357 51.2-217.557 55.467-324.224 17.067-59.776-21.333-115.2-55.467-157.867-98.133l-128-119.467v157.867c0 25.6-17.109 42.667-42.667 42.667-25.6 0-42.667-17.067-42.667-42.667v-268.8c0-4.267 4.224-4.267 4.224-8.533 0 0 0-4.267 4.309-4.267 4.224-4.267 4.224-4.267 8.533-4.267l4.267-4.267h268.757c25.643 0 42.667 17.067 42.667 42.667s-8.533 34.133-34.091 34.133h-149.333l119.424 115.2c34.133 34.133 81.109 64 128 81.067 85.333 29.867 179.243 25.6 260.309-12.8 81.024-38.4 145.024-106.667 174.933-196.267 29.867-85.333 25.557-179.2-12.8-260.267-38.443-81.067-106.667-145.067-196.309-174.933-179.157-64-371.157 29.867-435.157 209.067-8.533 21.333-34.176 34.133-55.509 25.6s-34.133-34.133-25.557-55.467c64-174.933 230.4-285.867 405.333-285.867 46.891 0 93.867 8.533 140.757 25.6 221.909 76.8 341.333 320 260.309 541.867z" />
+<glyph unicode="&#xe939;" glyph-name="unlocked" d="M853.333 106.671c0-25.6-17.067-42.667-42.667-42.667h-597.333c-25.6 0-42.667 17.067-42.667 42.667v298.667c0 25.6 17.067 42.667 42.667 42.667h597.333c25.6 0 42.667-17.067 42.667-42.667v-298.667zM810.667 533.338h-469.333v128c0 46.933 17.067 89.6 51.2 119.467 29.867 34.133 72.533 51.2 119.467 51.2 81.067 0 149.333-55.467 166.4-136.533 4.267-21.333 29.867-38.4 51.2-34.133s38.4 25.6 34.133 51.2c-25.6 119.467-132.267 204.8-251.733 204.8-68.267 0-132.267-25.6-179.2-76.8-51.2-46.933-76.8-110.933-76.8-179.2v-128h-42.667c-72.533 0-128-55.467-128-128v-298.667c0-72.533 55.467-128 128-128h597.333c72.533 0 128 55.467 128 128v298.667c0 72.533-55.467 128-128 128z" />
+<glyph unicode="&#xe93a;" glyph-name="upload" d="M896 277.333c25.6 0 42.667-17.067 42.667-42.667v-128c0-72.533-55.467-128-128-128h-597.333c-72.533 0-128 55.467-128 128v128c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-128c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v128c0 25.6 17.067 42.667 42.667 42.667zM371.2 675.189c-17.067-17.024-42.667-17.024-59.733 0-17.067 17.067-17.067 42.667 0 59.733l170.667 170.667c4.267 4.267 8.533 4.267 12.757 8.576 12.843 4.224 25.643 4.224 34.176 0 4.267 0 8.491-4.309 12.8-8.576l170.667-170.667c17.024-17.067 17.024-42.667 0-59.733-8.533-8.533-17.067-12.8-29.867-12.8s-21.333 4.267-29.867 12.8l-98.133 98.133v-494.933c0-25.557-17.109-42.667-42.667-42.667-25.6 0-42.667 17.109-42.667 42.667v494.933l-98.133-98.133z" />
+<glyph unicode="&#xe93b;" glyph-name="view" d="M510.933 149.333c-230.4 0-379.733 230.4-422.4 298.667 38.4 68.267 192 298.667 422.4 298.667s379.733-230.4 422.4-298.667c-42.667-68.267-192-298.667-422.4-298.667zM1018.667 465.067c-8.533 17.067-187.733 366.933-507.733 366.933s-499.2-349.867-507.733-366.933c-4.267-12.8-4.267-25.6 0-38.4 8.533-12.8 187.733-362.667 507.733-362.667s499.2 349.867 507.733 366.933c4.267 8.533 4.267 25.6 0 34.133zM512 362.667c-46.933 0-85.333 38.4-85.333 85.333s38.4 85.333 85.333 85.333c46.933 0 85.333-38.4 85.333-85.333s-38.4-85.333-85.333-85.333zM512 618.667c-93.867 0-170.667-76.8-170.667-170.667s76.8-170.667 170.667-170.667c93.867 0 170.667 76.8 170.667 170.667s-76.8 170.667-170.667 170.667z" />
+<glyph unicode="&#xe93c;" glyph-name="X_f" d="M512 917.333c260.267 0 469.333-209.067 469.333-469.333s-209.067-469.333-469.333-469.333c-260.267 0-469.333 209.067-469.333 469.333s209.067 469.333 469.333 469.333zM651.055 605.894c-17.067 17.024-42.667 17.024-59.733 0l-98.133-98.133-98.133 98.133c-17.067 17.024-42.667 17.024-59.733 0-17.067-17.067-17.067-42.667 0-59.733l98.091-98.133-98.091-98.133c-17.067-17.067-17.067-42.667 0-59.733 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8l98.133 98.091 98.133-98.091c8.533-8.576 21.333-12.8 29.867-12.8s21.333 4.224 29.867 12.8c17.024 17.067 17.024 42.667 0 59.733l-98.133 98.133 98.133 98.133c17.024 17.067 17.024 42.667 0 59.733z" />
+<glyph unicode="&#xe93d;" glyph-name="X_o" d="M512 64c-213.333 0-384 170.667-384 384s170.667 384 384 384c213.333 0 384-170.667 384-384s-170.667-384-384-384zM512 917.333c-260.267 0-469.333-209.067-469.333-469.333s209.067-469.333 469.333-469.333c260.267 0 469.333 209.067 469.333 469.333s-209.067 469.333-469.333 469.333zM651.055 605.894c-17.067 17.024-42.667 17.024-59.733 0l-98.133-98.133-98.133 98.133c-17.067 17.024-42.667 17.024-59.733 0-17.067-17.067-17.067-42.667 0-59.733l98.091-98.133-98.091-98.133c-17.067-17.067-17.067-42.667 0-59.733 8.533-8.576 17.067-12.8 29.867-12.8s21.333 4.224 29.867 12.8l98.133 98.091 98.133-98.091c8.533-8.576 21.333-12.8 29.867-12.8s21.333 4.224 29.867 12.8c17.024 17.067 17.024 42.667 0 59.733l-98.133 98.133 98.133 98.133c17.024 17.067 17.024 42.667 0 59.733z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/vid-webpack-master/src/style/fonts/icomoon.ttf b/vid-webpack-master/src/style/fonts/icomoon.ttf
new file mode 100644 (file)
index 0000000..4d82ec0
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/icomoon.ttf differ
diff --git a/vid-webpack-master/src/style/fonts/icomoon.woff b/vid-webpack-master/src/style/fonts/icomoon.woff
new file mode 100644 (file)
index 0000000..451aaa8
Binary files /dev/null and b/vid-webpack-master/src/style/fonts/icomoon.woff differ
diff --git a/vid-webpack-master/src/styles.scss b/vid-webpack-master/src/styles.scss
new file mode 100644 (file)
index 0000000..905c795
--- /dev/null
@@ -0,0 +1,171 @@
+/* You can add global styles to this file, and also import other style files */
+// styles in src/style directory are applied to the whole page
+
+@import "app/drawingBoard/drawing-board-tree/drawing-board-tree";
+@import "app/drawingBoard/available-models-tree/available-models-tree.component";
+@import "../node_modules/sdc-ui/css/style.css";
+//body {
+//  [ui-view="content"] {
+//    height: 100%;
+//  }
+//}
+
+@font-face {
+  font-family: OpenSans-Bold;
+  src: url("../src/assets/fonts/OpenSans/OpenSans-Bold.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-BoldItlaic;
+  src: url("./assets/fonts/OpenSans/OpenSans-BoldItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-ExtraBold;
+  src: url("./assets/fonts/OpenSans/OpenSans-ExtraBold.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-ExtraBoldItalic;
+  src: url("./assets/fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Italic;
+  src: url("./assets/fonts/OpenSans/OpenSans-Italic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Light;
+  src: url("./assets/fonts/OpenSans/OpenSans-Light.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-LightItalic;
+  src: url("./assets/fonts/OpenSans/OpenSans-LightItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Regular;
+  src: url("./assets/fonts/OpenSans/OpenSans-Regular.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-Semibold;
+  src: url("./assets/fonts/OpenSans/OpenSans-Semibold.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: OpenSans-SemiboldItalic;
+  src: url("./assets/fonts/OpenSans/OpenSans-SemiboldItalic.ttf") format('truetype');
+}
+
+@font-face {
+  font-family: 'icomoon';
+  src:  url('./assets/fonts/icomoon.eot?4cilop');
+  src:  url('./assets/fonts/icomoon.eot?4cilop#iefix') format('embedded-opentype'),
+  url('./assets/fonts/icomoon.ttf?4cilop') format('truetype'),
+  url('./assets/fonts/icomoon.woff?4cilop') format('woff'),
+  url('./assets/fonts/icomoon.svg?4cilop#icomoon') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'icomoon', serif !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+html {
+  min-height: 100%;
+  height: 100%;
+  body {
+    height: 100%;
+    vid-app {
+      height: 100%;
+      display: flex !important;
+      flex-direction: column;
+      main {
+        &[_ngcontent-c0] {
+          font-family: OpenSans-Regular, serif;
+        }
+
+        display: flex !important;
+        flex-direction: column;
+        flex: 1;
+
+      }
+    }
+  }
+}
+a {
+  color: #03A9F4;
+}
+
+tooltip-content {
+  .tooltip.left .tooltip-arrow {
+    border-left-color: #171f2a;
+  }
+  .tooltip.bottom .tooltip-arrow {
+    border-bottom-color: #171f2a;
+  }
+  .tooltip-inner {
+    background-color: #171f2a;
+    text-align: left;
+  }
+}
+
+service-planning {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+  border: 1px solid #d2d2d2;
+}
+
+.required:after {
+  content: " * ";
+  color: #cf2a2a;
+  margin-left: 3px;
+}
+
+
+.error-style {
+  border: solid 1px #cf2a2a !important;
+  color: #cf2a2a !important;
+  outline: none !important;
+}
+
+select option:disabled {
+  color: #959595;
+  cursor: default;
+}
+
+select option:disabled {
+  color: #959595 !important;
+  cursor: default;
+}
+
+select option {
+  color: black;
+}
+
+tooltip-content div {
+  word-wrap: break-word !important;
+}
+
+body {
+  -webkit-touch-callout: default !important;
+  -webkit-user-select: auto !important;
+  -moz-user-select: element !important;
+  -ms-user-select: element !important;
+  user-select: element !important;}
diff --git a/vid-webpack-master/src/test.ts b/vid-webpack-master/src/test.ts
new file mode 100644 (file)
index 0000000..1631789
--- /dev/null
@@ -0,0 +1,20 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/zone-testing';
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+declare const require: any;
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
diff --git a/vid-webpack-master/src/tsconfig.app.json b/vid-webpack-master/src/tsconfig.app.json
new file mode 100644 (file)
index 0000000..5e2507d
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/app",
+    "module": "es2015",
+    "baseUrl": "",
+    "types": []
+  },
+  "exclude": [
+    "test.ts",
+    "**/*.spec.ts"
+  ]
+}
diff --git a/vid-webpack-master/src/tsconfig.spec.json b/vid-webpack-master/src/tsconfig.spec.json
new file mode 100644 (file)
index 0000000..ac22a29
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/spec",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "types": [
+      "jasmine",
+      "node"
+    ]
+  },
+  "files": [
+    "test.ts"
+  ],
+  "include": [
+    "**/*.spec.ts",
+    "**/*.d.ts"
+  ]
+}
diff --git a/vid-webpack-master/src/vendor.ts b/vid-webpack-master/src/vendor.ts
new file mode 100644 (file)
index 0000000..5abcda4
--- /dev/null
@@ -0,0 +1,16 @@
+// Angular 2
+import '@angular/platform-browser';
+import '@angular/platform-browser-dynamic';
+import '@angular/core';
+import '@angular/common';
+import '@angular/http';
+import '@angular/router';
+import  'angular2-datatable';
+import 'rxjs';
+import '@angularclass/hmr';
+import 'ng2-bootstrap-modal';
+import 'redux';
+import 'ng2-redux';
+
+// Other vendors for example jQuery, Lodash or Bootstrap
+// You can import js, ts, css, sass, ...
diff --git a/vid-webpack-master/tsconfig.json b/vid-webpack-master/tsconfig.json
new file mode 100644 (file)
index 0000000..a6c016b
--- /dev/null
@@ -0,0 +1,19 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "outDir": "./dist/out-tsc",
+    "sourceMap": true,
+    "declaration": false,
+    "moduleResolution": "node",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "target": "es5",
+    "typeRoots": [
+      "node_modules/@types"
+    ],
+    "lib": [
+      "es2017",
+      "dom"
+    ]
+  }
+}
diff --git a/vid-webpack-master/tslint.json b/vid-webpack-master/tslint.json
new file mode 100644 (file)
index 0000000..858759a
--- /dev/null
@@ -0,0 +1,117 @@
+{
+  "rulesDirectory": [
+    "node_modules/codelyzer"
+  ],
+  "rules": {
+//    "class-name": true,
+//    "comment-format": [
+//      true,
+//      "check-space"
+//    ],
+//    "curly": true,
+//    "eofline": true,
+//    "forin": true,
+//    "indent": [
+//      true,
+//      "spaces"
+//    ],
+//    "label-position": true,
+//    "max-line-length": [
+//      true,
+//      140
+//    ],
+//    "member-access": false,
+//    "member-ordering": [
+//      true,
+//      "static-before-instance",
+//      "variables-before-functions"
+//    ],
+//    "no-arg": true,
+//    "no-bitwise": true,
+//    "no-console": [
+//      true,
+//      "debug",
+//      "info",
+//      "time",
+//      "timeEnd",
+//      "trace"
+//    ],
+//    "no-construct": true,
+//    "no-debugger": true,
+//    "no-duplicate-variable": true,
+//    "no-empty": false,
+//    "no-eval": true,
+//    "no-inferrable-types": true,
+//    "no-shadowed-variable": true,
+//    "no-string-literal": false,
+//    "no-switch-case-fall-through": true,
+//    "no-trailing-whitespace": true,
+//    "no-unused-expression": true,
+//    "no-use-before-declare": true,
+//    "no-var-keyword": true,
+//    "object-literal-sort-keys": false,
+//    "one-line": [
+//      true,
+//      "check-open-brace",
+//      "check-catch",
+//      "check-else",
+//      "check-whitespace"
+//    ],
+//    "quotemark": [
+//      true,
+//      "single"
+//    ],
+//    "radix": true,
+//    "semicolon": [
+//      "always"
+//    ],
+//    "triple-equals": [
+//      true,
+//      "allow-null-check"
+//    ],
+//    "typedef-whitespace": [
+//      true,
+//      {
+//        "call-signature": "nospace",
+//        "index-signature": "nospace",
+//        "parameter": "nospace",
+//        "property-declaration": "nospace",
+//        "variable-declaration": "nospace"
+//      }
+//    ],
+//    "variable-name": false,
+//
+//    "directive-selector": [
+//      true,
+//      "attribute",
+//      "",
+//      "camelCase"
+//    ],
+//    "component-selector": [
+//      true,
+//      "element",
+//      "",
+//      "kebab-case"
+//    ],
+//    "use-input-property-decorator": true,
+//    "use-output-property-decorator": true,
+//    "use-host-property-decorator": true,
+//    "no-input-rename": true,
+//    "no-output-rename": true,
+//    "use-life-cycle-interface": true,
+//    "use-pipe-transform-interface": true,
+//    "component-class-suffix": true,
+//    "directive-class-suffix": true,
+//    "pipe-naming": [
+//      true,
+//      "camelCase",
+//      ""
+//    ],
+//    "no-attribute-parameter-decorator": true,
+//    "no-forward-ref": true,
+//    "import-destructuring-spacing": true,
+//    "no-access-missing-member": true,
+//    "templates-use-public": true,
+//    "invoke-injectable": true
+  }
+}
diff --git a/vid-webpack-master/typedoc.json b/vid-webpack-master/typedoc.json
new file mode 100644 (file)
index 0000000..1a9f282
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "mode": "modules",
+  "out": "doc",
+  "theme": "default",
+  "ignoreCompilerErrors": "true",
+  "experimentalDecorators": "true",
+  "emitDecoratorMetadata": "true",
+  "target": "ES5",
+  "moduleResolution": "node",
+  "preserveConstEnums": "true",
+  "stripInternal": "true",
+  "suppressExcessPropertyErrors": "true",
+  "suppressImplicitAnyIndexErrors": "true",
+  "module": "commonjs"
+}
\ No newline at end of file